diff --git a/html/src/index.pug b/html/src/index.pug index 8170ab3f..9364afb9 100644 --- a/html/src/index.pug +++ b/html/src/index.pug @@ -17,10 +17,10 @@ html link(rel="stylesheet" href="https://fonts.googleapis.com/css?family=Noto+Sans+JP|Noto+Sans+KR&display=swap") link(rel="stylesheet" href="app.css") body - div.x-app#x-app(style="display:none") + .x-app#x-app(style="display:none") //- login - div.x-login-container(v-show="!API.isLoggedIn") + .x-login-container(v-show="!API.isLoggedIn") div(style="width:300px;margin:auto") el-form(ref="loginForm" :model="loginForm" :rules="loginForm.rules" v-loading="loginForm.loading" @submit.native.prevent="login()") el-form-item(label="Username or Email" prop="username" required) @@ -38,7 +38,7 @@ html p pypy is not responsible for any problems caused by VRCX. Use at your own risk! //- menu - div.x-menu-container + .x-menu-container el-menu(ref="menu" collapse @select="selectMenu") mixin menuitem(index, name, icon) el-menu-item(index=index) @@ -55,7 +55,7 @@ html +menuitem('more', 'More', 'el-icon-s-tools') //- feed - div.x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'feed'") + .x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'feed'") data-tables(v-bind="feedTable") template(#tool) div(style="margin:0 0 10px;display:flex;align-items:center") @@ -83,12 +83,12 @@ html template(v-else-if="scope.row.type === 'Avatar'") el-popover(placement="right" width="500px" trigger="click") img(v-lazy="scope.row.avatar[1]" style="width:500px;height:375px") - img(slot="reference" v-lazy="scope.row.avatar[1]" class="x-link" style="flex:none;width:160px;height:120px;border-radius:4px") + img.x-link(slot="reference" v-lazy="scope.row.avatar[1]" style="flex:none;width:160px;height:120px;border-radius:4px") span(style="position:relative;top:-50px;margin:0 5px") - i(class="el-icon-right") + i.el-icon-right el-popover(placement="right" width="500px" trigger="click") img(v-lazy="scope.row.avatar[0]" style="width:500px;height:375px") - img(slot="reference" v-lazy="scope.row.avatar[0]" class="x-link" style="flex:none;width:160px;height:120px;border-radius:4px") + img.x-link(slot="reference" v-lazy="scope.row.avatar[0]" style="flex:none;width:160px;height:120px;border-radius:4px") template(v-else-if="scope.row.type === 'Status'") el-tooltip(placement="top") template(#content) @@ -97,11 +97,11 @@ html span(v-else-if="scope.row.status[1].status === 'ask me'") Ask Me span(v-else-if="scope.row.status[1].status === 'busy'") Do Not Disturb span(v-else) Offline - i(class="x-user-status" :class="userStatusClass(scope.row.status[1])") + i.x-user-status(:class="userStatusClass(scope.row.status[1])") span(v-text="scope.row.status[1].statusDescription") br span - i(class="el-icon-right") + i.el-icon-right el-tooltip(placement="top") template(#content) span(v-if="scope.row.status[0].status === 'active'") Online @@ -109,7 +109,7 @@ html span(v-else-if="scope.row.status[0].status === 'ask me'") Ask Me span(v-else-if="scope.row.status[0].status === 'busy'") Do Not Disturb span(v-else) Offline - i(class="x-user-status" :class="userStatusClass(scope.row.status[0])") + i.x-user-status(:class="userStatusClass(scope.row.status[0])") span(v-text="scope.row.status[0].statusDescription") el-table-column(label="Time" prop="created_at" sortable="custom" width="80") template(v-once #default="scope") @@ -120,7 +120,7 @@ html el-table-column(label="Type" prop="type" width="100") el-table-column(label="User" prop="displayName") template(v-once #default="scope") - span(v-text="scope.row.displayName" @click="showUserDialog(scope.row.userId)" class="x-link") + span.x-link(v-text="scope.row.displayName" @click="showUserDialog(scope.row.userId)") el-table-column(label="Detail") template(v-once #default="scope") template(v-if="scope.row.type === 'GPS'") @@ -135,11 +135,11 @@ html span(v-else-if="scope.row.status[0].status === 'ask me'") Ask Me span(v-else-if="scope.row.status[0].status === 'busy'") Do Not Disturb span(v-else) Offline - i(class="x-user-status" :class="userStatusClass(scope.row.status[0])") + i.x-user-status(:class="userStatusClass(scope.row.status[0])") span(v-text="scope.row.status[0].statusDescription") //- gameLog - div(v-show="$refs.menu && $refs.menu.activeIndex === 'gameLog'" class="x-container") + .x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'gameLog'") data-tables(v-bind="gameLogTable") template(#tool) div(style="margin:0 0 10px;display:flex;align-items:center") @@ -157,65 +157,65 @@ html el-table-column(label="Detail") template(v-once #default="scope") location(v-if="scope.row.type === 'Location'" :location="scope.row.data") - span(v-else v-text="scope.row.data" @click="lookupUser(scope.row.data)" class="x-link") + span.x-link(v-else v-text="scope.row.data" @click="lookupUser(scope.row.data)") //- search - div(v-show="$refs.menu && $refs.menu.activeIndex === 'search'" class="x-container") + .x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'search'") div(style="margin:0 0 10px;display:flex;align-items:center") el-input(v-model="searchText" clearable placeholder="Search" @keyup.native.13="search()" style="flex:1") el-button(type="default" @click="clearSearch()" icon="el-icon-delete" circle style="flex:none;margin-left:10px") el-tabs(ref="searchTab" type="card" style="margin-top:15px") el-tab-pane(label="User" v-loading="isSearchUserLoading" style="min-height:60px") - div(class="x-friend-list") - div(v-for="user in searchUserResults" :key="user.id" @click="showUserDialog(user.id)" class="x-friend-item") + .x-friend-list + .x-friend-item(v-for="user in searchUserResults" :key="user.id" @click="showUserDialog(user.id)") template(v-once) - div(class="avatar") + .avatar img(v-lazy="user.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-text="user.displayName" class="name" :class="user.$trustClass") - span(v-text="user.username" class="extra" style="font-family:monospace") + .detail + span.name(v-text="user.displayName" :class="user.trustClass") + span.extra(v-text="user.username" style="font-family:monospace") el-button-group(style="margin-top:15px") el-button(v-if="searchUserParams.offset" @click="moreSearchUser(-1)" icon="el-icon-back" size="small") Prev el-button(v-if="searchUserResults.length" @click="moreSearchUser(1)" icon="el-icon-right" size="small") Next el-tab-pane(label="World" v-loading="isSearchWorldLoading" style="min-height:60px") el-dropdown(@command="(row) => searchWorld(row)" size="small" trigger="click" style="margin-bottom:15px") - el-button(size="small") Search by Category #[i(class="el-icon-arrow-down el-icon--right")] + el-button(size="small") Search by Category #[i.el-icon-arrow-down.el-icon--right] el-dropdown-menu(#default="dropdown") el-dropdown-item(v-for="row in API.cachedConfig.dynamicWorldRows" :key="row.index" v-text="row.name" :command="row") - div(class="x-friend-list") - div(v-for="world in searchWorldResults" :key="world.id" @click="showWorldDialog(world.id)" class="x-friend-item") + .x-friend-list + .x-friend-item(v-for="world in searchWorldResults" :key="world.id" @click="showWorldDialog(world.id)") template(v-once) - div(class="avatar") + .avatar img(v-lazy="world.thumbnailImageUrl") - div(class="detail") - span(v-text="world.name" class="name") - span(v-if="world.occupants" class="extra") {{ world.authorName }} ({{ world.occupants }}) - span(v-else v-text="world.authorName" class="extra") + .detail + span.name(v-text="world.name") + span.extra(v-if="world.occupants") {{ world.authorName }} ({{ world.occupants }}) + span.extra(v-else v-text="world.authorName") el-button-group(style="margin-top:15px") el-button(v-if="searchWorldParams.offset" @click="moreSearchWorld(-1)" icon="el-icon-back" size="small") Prev el-button(v-if="searchWorldResults.length" @click="moreSearchWorld(1)" icon="el-icon-right" size="small") Next el-tab-pane(label="Avatar" v-loading="isSearchAvatarLoading" style="min-height:60px") el-dropdown(@command="(command) => searchAvatar(command)" size="small" trigger="click" style="margin-bottom:15px") - el-button(size="small") Search by Category #[i(class="el-icon-arrow-down el-icon--right")] + el-button(size="small") Search by Category #[i.el-icon-arrow-down.el-icon--right] el-dropdown-menu(#default="dropdown") el-dropdown-item(command="updated") Updated Recently el-dropdown-item(command="created") New el-dropdown-item(command="mine") Mine span(style="margin-left:10px;font-size:12px;color:#909399") Avatar search is not possible. - div(class="x-friend-list") - div(v-for="avatar in searchAvatarResults" :key="avatar.id" @click="showAvatarDialog(avatar.id)" class="x-friend-item") + .x-friend-list + .x-friend-item(v-for="avatar in searchAvatarResults" :key="avatar.id" @click="showAvatarDialog(avatar.id)") template(v-once) - div(class="avatar") + .avatar img(v-lazy="avatar.thumbnailImageUrl") - div(class="detail") - span(v-text="avatar.name" class="name") - span(v-text="avatar.authorName" class="extra") + .detail + span.name(v-text="avatar.name") + span.extra(v-text="avatar.authorName") el-button-group(style="margin-top:15px") el-button(v-if="searchAvatarParams.offset" @click="moreSearchAvatar(-1)" icon="el-icon-back" size="small") Prev el-button(v-if="searchAvatarResults.length" @click="moreSearchAvatar(1)" icon="el-icon-right" size="small") Next //- favorite - div(v-show="$refs.menu && $refs.menu.activeIndex === 'favorite'" class="x-container") + .x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'favorite'") el-button(type="default" :loading="API.isFavoriteLoading" @click="API.refreshFavorites()" size="small" icon="el-icon-refresh" circle style="position:relative;float:right;z-index:1") el-tabs(type="card" v-loading="API.isFavoriteLoading") el-tab-pane(label="Friend") @@ -226,14 +226,14 @@ html span(style="color:#909399;font-size:12px;margin-left:10px") {{ group.count }}/{{ group.capacity }} el-button(@click.stop="changeFavoriteGroupName(group)" size="mini" icon="el-icon-edit" circle style="margin-left:10px") el-button(@click.stop="clearFavoriteGroup(group)" size="mini" icon="el-icon-delete" circle style="margin-left:5px") - div(v-if="group.count" class="x-friend-list" style="margin-top:10px") - div(v-for="favorite in favoriteFriends" v-if="favorite.groupKey === group.key" :key="favorite.id" @click="showUserDialog(favorite.id)" class="x-friend-item") + .x-friend-list(v-if="group.count" style="margin-top:10px") + .x-friend-item(v-for="favorite in favoriteFriends" v-if="favorite.groupKey === group.key" :key="favorite.id" @click="showUserDialog(favorite.id)") template(v-if="favorite.ref") - div(class="avatar" :class="userStatusClass(favorite.ref)") + .avatar(:class="userStatusClass(favorite.ref)") img(v-lazy="favorite.ref.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-text="favorite.ref.displayName" class="name" :class="favorite.ref.$trustClass") - location(v-if="favorite.ref.location !== 'offline'" :location="favorite.ref.location" :link="false" class="extra") + .detail + span.name(v-text="favorite.ref.displayName" :class="favorite.ref.$trustClass") + location.extra(v-if="favorite.ref.location !== 'offline'" :location="favorite.ref.location" :link="false") span(v-else v-text="favorite.ref.statusDescription") template(v-else) span(v-text="favorite.name || favorite.id") @@ -246,15 +246,15 @@ html span(style="color:#909399;font-size:12px;margin-left:10px") {{ group.count }}/{{ group.capacity }} el-button(@click.stop="changeFavoriteGroupName(group)" size="mini" icon="el-icon-edit" circle style="margin-left:10px") el-button(@click.stop="clearFavoriteGroup(group)" size="mini" icon="el-icon-delete" circle style="margin-left:5px") - div(v-if="group.count" class="x-friend-list" style="margin-top:10px") - div(v-for="favorite in favoriteWorlds" v-if="favorite.groupKey === group.key" :key="favorite.id" @click="showWorldDialog(favorite.id)" class="x-friend-item") + .x-friend-list(v-if="group.count" style="margin-top:10px") + .x-friend-item(v-for="favorite in favoriteWorlds" v-if="favorite.groupKey === group.key" :key="favorite.id" @click="showWorldDialog(favorite.id)") template(v-if="favorite.ref") - div(class="avatar") + .avatar img(v-lazy="favorite.ref.thumbnailImageUrl") - div(class="detail") - span(v-text="favorite.ref.name" class="name") - span(v-if="favorite.ref.occupants" class="extra") {{ favorite.ref.authorName }} ({{ favorite.ref.occupants }}) - span(v-else v-text="favorite.ref.authorName" class="extra") + .detail + span.name(v-text="favorite.ref.name") + span.extra(v-if="favorite.ref.occupants") {{ favorite.ref.authorName }} ({{ favorite.ref.occupants }}) + span.extra(v-else v-text="favorite.ref.authorName") template(v-else) span(v-text="favorite.name || favorite.id") el-button(type="text" icon="el-icon-close" size="mini" @click.stop="deleteFavorite(favorite.id)" style="margin-left:5px") @@ -266,20 +266,20 @@ html span(style="color:#909399;font-size:12px;margin-left:10px") {{ group.count }}/{{ group.capacity }} el-button(@click.stop="changeFavoriteGroupName(group)" size="mini" icon="el-icon-edit" circle style="margin-left:10px") el-button(@click.stop="clearFavoriteGroup(group)" size="mini" icon="el-icon-delete" circle style="margin-left:5px") - div(v-if="group.count" class="x-friend-list" style="margin-top:10px") - div(v-for="favorite in favoriteAvatars" v-if="favorite.groupKey === group.key" :key="favorite.id" @click="showAvatarDialog(favorite.id)" class="x-friend-item") + .x-friend-list(v-if="group.count" style="margin-top:10px") + .x-friend-item(v-for="favorite in favoriteAvatars" v-if="favorite.groupKey === group.key" :key="favorite.id" @click="showAvatarDialog(favorite.id)") template(v-if="favorite.ref") - div(class="avatar") + .avatar img(v-lazy="favorite.ref.thumbnailImageUrl") - div(class="detail") - span(v-text="favorite.ref.name" class="name") - span(class="extra" v-text="favorite.ref.authorName") + .detail + span.name(v-text="favorite.ref.name") + span.extra(v-text="favorite.ref.authorName") template(v-else) span(v-text="favorite.name || favorite.id") el-button(type="text" icon="el-icon-close" size="mini" @click.stop="deleteFavorite(favorite.id)" style="margin-left:5px") //- friendLog - div(v-show="$refs.menu && $refs.menu.activeIndex === 'friendLog'" class="x-container") + .x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'friendLog'") data-tables(v-bind="friendLogTable") template(#tool) div(style="margin:0 0 10px;display:flex;align-items:center") @@ -295,18 +295,18 @@ html el-table-column(label="Type" prop="type" width="150") el-table-column(label="User" prop="displayName") template(v-once #default="scope") - span(v-if="scope.row.type === 'DisplayName'") {{ scope.row.previousDisplayName }} #[i(class="el-icon-right")] + span(v-if="scope.row.type === 'DisplayName'") {{ scope.row.previousDisplayName }} #[i.el-icon-right] |   - span(v-text="scope.row.displayName || scope.row.userId" @click="showUserDialog(scope.row.userId)" class="x-link") + span.x-link(v-text="scope.row.displayName || scope.row.userId" @click="showUserDialog(scope.row.userId)") template(v-if="scope.row.type === 'TrustLevel'") br - span ({{ scope.row.previousTrustLevel }} #[i(class="el-icon-right")] {{ scope.row.trustLevel }}) + span ({{ scope.row.previousTrustLevel }} #[i.el-icon-right] {{ scope.row.trustLevel }}) el-table-column(label="Action" width="80" align="right") template(v-once #default="scope") el-button(type="text" icon="el-icon-close" size="mini" @click="deleteFriendLog(scope.row)") //- moderation - div(v-show="$refs.menu && $refs.menu.activeIndex === 'moderation'" class="x-container") + .x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'moderation'") data-tables(v-bind="playerModerationTable" v-loading="API.isPlayerModerationsLoading") template(#tool) div(style="margin:0 0 10px;display:flex;align-items:center") @@ -323,16 +323,16 @@ html el-table-column(label="Type" prop="type" width="120") el-table-column(label="Source" prop="sourceDisplayName") template(v-once #default="scope") - span(v-text="scope.row.sourceDisplayName" @click="showUserDialog(scope.row.sourceUserId)" class="x-link") + span.x-link(v-text="scope.row.sourceDisplayName" @click="showUserDialog(scope.row.sourceUserId)") el-table-column(label="Target" prop="targetDisplayName") template(v-once #default="scope") - span(v-text="scope.row.targetDisplayName" @click="showUserDialog(scope.row.targetUserId)" class="x-link") + span.x-link(v-text="scope.row.targetDisplayName" @click="showUserDialog(scope.row.targetUserId)") el-table-column(label="Action" width="80" align="right") template(v-once #default="scope") el-button(v-if="scope.row.sourceUserId === API.currentUser.id" type="text" icon="el-icon-close" size="mini" @click="deletePlayerModeration(scope.row)") //- notification - div(v-show="$refs.menu && $refs.menu.activeIndex === 'notification'" v-loading="API.isNotificationsLoading" class="x-container") + .x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'notification'" v-loading="API.isNotificationsLoading") data-tables(v-bind="notificationTable") template(#tool) div(style="margin:0 0 10px;display:flex;align-items:center") @@ -351,34 +351,34 @@ html el-tooltip(placement="top" v-if="scope.row.type === 'invite'") template(#content) span(v-text="API.parseInviteLocation(scope.row)") - span(v-text="scope.row.type" @click="showWorldDialog(scope.row.details.worldId)" class="x-link") + span.x-link(v-text="scope.row.type" @click="showWorldDialog(scope.row.details.worldId)") span(v-else v-text="scope.row.type") el-table-column(label="User" prop="senderUsername") template(v-once #default="scope") - span(v-text="scope.row.senderUsername" @click="showUserDialog(scope.row.senderUserId)" class="x-link") + span.x-link(v-text="scope.row.senderUsername" @click="showUserDialog(scope.row.senderUserId)") el-table-column(label="Action" width="80" align="right") template(v-once #default="scope") el-button(v-if="scope.row.type === 'friendRequest'" type="text" icon="el-icon-check" size="mini" @click="acceptNotification(scope.row)") el-button(type="text" icon="el-icon-close" size="mini" @click="hideNotification(scope.row)") //- more - div(v-show="$refs.menu && $refs.menu.activeIndex === 'more'" class="x-container") + .x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'more'") div span(style="font-weight:bold") VRCX - div(class="x-friend-list" style="margin-top:10px") - div(class="x-friend-item") - div(class="detail") - span(class="name") Version - span(class="extra" v-text="appVersion") - div(class="x-friend-item" @click="checkAppVersion()") - div(class="detail") - span(class="name") Latest Version - span(class="extra" v-if="latestAppVersion" v-text="latestAppVersion") - span(v-else class="extra") Click to refresh - div(class="x-friend-item" @click="openExternalLink('https://github.com/pypy-vrc/VRCX')") - div(class="detail") - span(class="name") Repository URL - span(class="extra") https://github.com/pypy-vrc/VRCX + .x-friend-list(style="margin-top:10px") + .x-friend-item + .detail + span.name Version + span.extra(v-text="appVersion") + .x-friend-item(@click="checkAppVersion()") + .detail + span.name Latest Version + span.extra(v-if="latestAppVersion" v-text="latestAppVersion") + span.extra(v-else) Click to refresh + .x-friend-item(@click="openExternalLink('https://github.com/pypy-vrc/VRCX')") + .detail + span.name Repository URL + span.extra https://github.com/pypy-vrc/VRCX div(style="margin-top:30px") span(style="font-weight:bold") Direct Access div(style="margin-top:5px") @@ -388,17 +388,17 @@ html el-button(size="small" @click="promptAvatarDialog()") Avatar div(style="margin-top:30px") span(style="font-weight:bold") My Profile - div(class="x-friend-list" style="margin-top:10px") - div(class="x-friend-item" @click="showUserDialog(API.currentUser.id)") - div(class="avatar") + .x-friend-list(style="margin-top:10px") + .x-friend-item(@click="showUserDialog(API.currentUser.id)") + .avatar img(v-lazy="API.currentUser.currentAvatarThumbnailImageUrl") - div(class="detail") - span(class="name" v-text="API.currentUser.displayName") - span(class="extra" v-text="API.currentUser.username") - div(class="x-friend-item" @click="showSocialStatusDialog()") - div(class="detail") - span(class="name") #[i(class="el-icon-edit")] Social Status - span(class="extra") + .detail + span.name(v-text="API.currentUser.displayName") + span.extra(v-text="API.currentUser.username") + .x-friend-item(@click="showSocialStatusDialog()") + .detail + span.name #[i.el-icon-edit] Social Status + span.extra el-tooltip(placement="top") template(#content) span(v-if="API.currentUser.status === 'active'") Online @@ -406,54 +406,54 @@ html span(v-else-if="API.currentUser.status === 'ask me'") Ask Me span(v-else-if="API.currentUser.status === 'busy'") Do Not Disturb span(v-else) Offline - i(class="x-user-status" :class="userStatusClass(API.currentUser)") + i.x-user-status(:class="userStatusClass(API.currentUser)") span(v-text="API.currentUser.statusDescription") - div(class="x-friend-item" @click="showBioDialog()") - div(class="detail") - span(class="name") #[i(class="el-icon-edit")] Bio - pre(class="extra" style="font-family:inherit;font-size:12px;white-space:pre-wrap;margin:0 0.5em 0 0") {{ API.currentUser.bio || '-' }} + .x-friend-item(@click="showBioDialog()") + .detail + span.name #[i.el-icon-edit] Bio + pre.extra(style="font-family:inherit;font-size:12px;white-space:pre-wrap;margin:0 0.5em 0 0") {{ API.currentUser.bio || '-' }} div(style="margin-top:5px") el-tooltip(v-for="(link, index) in API.currentUser.bioLinks" :key="index") template(#content) span(v-text="link") img(:src="getFaviconUrl(link)" style="width:16px;height:16px;vertical-align:middle;margin-right:5px" @click.stop="openExternalLink(link)") - div(class="x-friend-item") - div(class="detail") - span(class="name") Languages - span(class="extra") + .x-friend-item + .detail + span.name Languages + span.extra div(style="margin:5px 0") el-tag(v-for="item in API.currentUser.$languages" :key="item.key" size="small" type="info" effect="plain" closable @close="removeUserLanguage(item.key)" style="margin-right:5px") - span(class="famfamfam-flags" :class="languageClass(item.key)" style="display:inline-block;margin-right:5px") + span.famfamfam-flags(:class="languageClass(item.key)" style="display:inline-block;margin-right:5px") | {{ item.value }} ({{ item.key }}) div(v-if="userLanguageVisible") el-select(v-model="userLanguageSelected" size="mini") el-option(v-for="item in userLanguages" :key="item.key" :value="item.key" :label="item.value") - span(class="famfamfam-flags" :class="languageClass(item.key)" style="display:inline-block;margin-right:5px") + span.famfamfam-flags(:class="languageClass(item.key)" style="display:inline-block;margin-right:5px") | {{ item.value }} ({{ item.key }}) el-button(@click="userLanguageVisible=0; addUserLanguage(userLanguageSelected)" size="mini") Ok el-button(@click="userLanguageVisible=0" size="mini" style="margin-left:0") Cancel div(v-else) el-button(@click="userLanguageSelected='';userLanguageVisible=1" size="mini") Add Language - div(class="x-friend-item") - div(class="detail") - span(class="name") Last Login - span(class="extra") {{ API.currentUser.last_login | formatDate('YYYY-MM-DD HH24:MI:SS') }} - div(class="x-friend-item") - div(class="detail") - span(class="name") Two-Factor Auth (2FA) - span(class="extra") {{ API.currentUser.twoFactorAuthEnabled ? 'Enabled' : 'Disabled' }} - div(class="x-friend-item" @click="showUserDialog(API.currentUser.id)") - div(class="detail") - span(class="name") User ID - span(class="extra" v-text="API.currentUser.id") - div(class="x-friend-item" @click="showAvatarDialog(API.currentUser.currentAvatar)") - div(class="detail") - span(class="name") Avatar ID - span(class="extra" v-text="API.currentUser.currentAvatar") - div(class="x-friend-item" v-if="API.currentUser.homeLocation" @click="showWorldDialog(API.currentUser.homeLocation)") - div(class="detail") - span(class="name") Home Location - span(class="extra") + .x-friend-item + .detail + span.name Last Login + span.extra {{ API.currentUser.last_login | formatDate('YYYY-MM-DD HH24:MI:SS') }} + .x-friend-item + .detail + span.name Two-Factor Auth (2FA) + span.extra {{ API.currentUser.twoFactorAuthEnabled ? 'Enabled' : 'Disabled' }} + .x-friend-item(@click="showUserDialog(API.currentUser.id)") + .detail + span.name User ID + span.extra(v-text="API.currentUser.id") + .x-friend-item(@click="showAvatarDialog(API.currentUser.currentAvatar)") + .detail + span.name Avatar ID + span.extra(v-text="API.currentUser.currentAvatar") + .x-friend-item(v-if="API.currentUser.homeLocation" @click="showWorldDialog(API.currentUser.homeLocation)") + .detail + span.name Home Location + span.extra location(:location="API.currentUser.homeLocation" :link="false") el-button(@click.stop="resetHome()" size="mini" icon="el-icon-delete" circle style="margin-left:5px") div(style="margin-top:10px") @@ -477,24 +477,24 @@ html span(v-if="!scope.data.children" v-text="scope.data.value") div(style="margin-top:30px") span(style="font-weight:bold") Game Info - div(class="x-friend-list" style="margin-top:10px") - div(class="x-friend-item") - div(class="detail" @click="API.getVisits()") - span(class="name") Online Users - span(v-if="visits" class="extra") {{visits}} users online. - span(v-else class="extra") Click to refresh - div(class="x-friend-item") - div(class="detail") - span(class="name") SDK Unity Version - span(class="extra" v-text="API.cachedConfig.sdkUnityVersion") - div(class="x-friend-item") - div(class="detail") - span(class="name") SDK Version - span(class="extra" v-text="API.cachedConfig.releaseSdkVersion") - div(class="x-friend-item") - div(class="detail") - span(class="name") SDK URL - span(class="extra" v-text="API.cachedConfig.releaseSdkUrl") + .x-friend-list(style="margin-top:10px") + .x-friend-item + .detail(@click="API.getVisits()") + span.name Online Users + span.extra(v-if="visits") {{visits}} users online. + span.extra(v-else) Click to refresh + .x-friend-item + .detail + span.name SDK Unity Version + span.extra(v-text="API.cachedConfig.sdkUnityVersion") + .x-friend-item + .detail + span.name SDK Version + span.extra(v-text="API.cachedConfig.releaseSdkVersion") + .x-friend-item + .detail + span.name SDK URL + span.extra(v-text="API.cachedConfig.releaseSdkUrl") div(style="margin-top:30px") span(style="font-weight:bold") Friends Sort Option div(style="font-size:12px;margin-top:5px") @@ -561,85 +561,85 @@ html el-button(@click="ossDialog = true" size="small") Open Source Software Notice //- friends - div(class="x-aside-container") + .x-aside-container el-select(v-model="quickSearch" clearable placeholder="Search" filterable remote :remote-method="quickSearchRemoteMethod" popper-class="x-quick-search" @change="quickSearchChange" @visible-change="quickSearchVisibleChange" style="flex:none;padding:10px") el-option(v-for="item in quickSearchItems" :key="item.value" :value="item.value" :label="item.label") - div(class="x-friend-item") + .x-friend-item template(v-if="item.ref") - div(class="detail") - span(v-text="item.ref.displayName" class="name" :class="item.ref.$trustClass") - location(:location="item.ref.location" :link="false" class="extra") - img(v-lazy="item.ref.currentAvatarThumbnailImageUrl" class="avatar") + .detail + span.name(v-text="item.ref.displayName" :class="item.ref.$trustClass") + location.extra(:location="item.ref.location" :link="false") + img.avatar(v-lazy="item.ref.currentAvatarThumbnailImageUrl") span(v-else) Search More: #[span(v-text="item.label" style="font-weight:bold")] - div(class="x-friend-list" style="padding-bottom:10px") - div(v-show="friendsGroup0.length" class="x-friend-group") - i(class="el-icon-arrow-right" :class="{ rotate: isFriendsGroup0 }") - span(@click="isFriendsGroup0 = !isFriendsGroup0" class="x-link" style="margin-left:5px") VIP―{{ friendsGroup0.length }} + .x-friend-list(style="padding-bottom:10px") + .x-friend-group(v-show="friendsGroup0.length") + i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup0 }") + span.x-link(@click="isFriendsGroup0 = !isFriendsGroup0" style="margin-left:5px") VIP―{{ friendsGroup0.length }} div(v-show="isFriendsGroup0") - div(v-for="friend in friendsGroup0" :key="friend.id" @click="showUserDialog(friend.id)" class="x-friend-item") + .x-friend-item(v-for="friend in friendsGroup0" :key="friend.id" @click="showUserDialog(friend.id)") template(v-if="friend.ref") - div(class="avatar" :class="userStatusClass(friend.ref)") + .avatar(:class="userStatusClass(friend.ref)") img(v-lazy="friend.ref.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-if="friend.memo" class="name" :class="friend.ref.$trustClass") {{ friend.ref.displayName }} ({{ friend.memo }}) - span(v-else v-text="friend.ref.displayName" class="name" :class="friend.ref.$trustClass") - location(:location="friend.ref.location" :link="false" class="extra") + .detail + span.name(v-if="friend.memo" :class="friend.ref.$trustClass") {{ friend.ref.displayName }} ({{ friend.memo }}) + span.name(v-else v-text="friend.ref.displayName" :class="friend.ref.$trustClass") + location.extra(:location="friend.ref.location" :link="false") template(v-else) span(v-text="friend.name || friend.id") el-button(type="text" icon="el-icon-close" size="mini" @click.stop="confirmDeleteFriend(friend.id)" style="margin-left:5px") - div(v-show="friendsGroup1.length" class="x-friend-group") - i(class="el-icon-arrow-right" :class="{ rotate: isFriendsGroup1 }") - span(@click="isFriendsGroup1 = !isFriendsGroup1" class="x-link" style="margin-left:5px") ONLINE―{{ friendsGroup1.length }} + .x-friend-group(v-show="friendsGroup1.length") + i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup1 }") + span.x-link(@click="isFriendsGroup1 = !isFriendsGroup1" style="margin-left:5px") ONLINE―{{ friendsGroup1.length }} div(v-show="isFriendsGroup1") - div(v-for="friend in friendsGroup1" :key="friend.id" @click="showUserDialog(friend.id)" class="x-friend-item") + .x-friend-item(v-for="friend in friendsGroup1" :key="friend.id" @click="showUserDialog(friend.id)") template(v-if="friend.ref") - div(class="avatar" :class="userStatusClass(friend.ref)") + .avatar(:class="userStatusClass(friend.ref)") img(v-lazy="friend.ref.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-if="friend.memo" class="name" :class="friend.ref.$trustClass") {{ friend.ref.displayName }} ({{ friend.memo }}) - span(v-else v-text="friend.ref.displayName" class="name" :class="friend.ref.$trustClass") - location(:location="friend.ref.location" :link="false" class="extra") + .detail + span.name(v-if="friend.memo" :class="friend.ref.$trustClass") {{ friend.ref.displayName }} ({{ friend.memo }}) + span.name(v-else v-text="friend.ref.displayName" :class="friend.ref.$trustClass") + location.extra(:location="friend.ref.location" :link="false") template(v-else) span(v-text="friend.name || friend.id") el-button(type="text" icon="el-icon-close" size="mini" @click.stop="confirmDeleteFriend(friend.id)" style="margin-left:5px") - div(v-show="friendsGroup2.length" class="x-friend-group") - i(class="el-icon-arrow-right" :class="{ rotate: isFriendsGroup2 }") - span(@click="isFriendsGroup2 = !isFriendsGroup2" class="x-link" style="margin-left:5px") ACTIVE―{{ friendsGroup2.length }} + .x-friend-group(v-show="friendsGroup2.length") + i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup2 }") + span.x-link(@click="isFriendsGroup2 = !isFriendsGroup2" style="margin-left:5px") ACTIVE―{{ friendsGroup2.length }} div(v-show="isFriendsGroup2") - div(v-for="friend in friendsGroup2" :key="friend.id" @click="showUserDialog(friend.id)" class="x-friend-item") + .x-friend-item(v-for="friend in friendsGroup2" :key="friend.id" @click="showUserDialog(friend.id)") template(v-if="friend.ref") - div(class="avatar") + .avatar img(v-lazy="friend.ref.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-if="friend.memo" class="name" :class="friend.ref.$trustClass") {{ friend.ref.displayName }} ({{ friend.memo }}) - span(v-else v-text="friend.ref.displayName" class="name" :class="friend.ref.$trustClass") - span(v-text="friend.ref.statusDescription" :link="false" class="extra") + .detail + span.name(v-if="friend.memo" :class="friend.ref.$trustClass") {{ friend.ref.displayName }} ({{ friend.memo }}) + span.name(v-else v-text="friend.ref.displayName" :class="friend.ref.$trustClass") + span.extra(v-text="friend.ref.statusDescription" :link="false") template(v-else) span(v-text="friend.name || friend.id") el-button(type="text" icon="el-icon-close" size="mini" @click.stop="confirmDeleteFriend(friend.id)" style="margin-left:5px") - div(v-show="friendsGroup3.length" class="x-friend-group") - i(class="el-icon-arrow-right" :class="{ rotate: isFriendsGroup3 }") - span(@click="isFriendsGroup3 = !isFriendsGroup3" class="x-link" style="margin-left:5px") OFFLINE―{{ friendsGroup3.length }} + .x-friend-group(v-show="friendsGroup3.length") + i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup3 }") + span.x-link(@click="isFriendsGroup3 = !isFriendsGroup3" style="margin-left:5px") OFFLINE―{{ friendsGroup3.length }} div(v-show="isFriendsGroup3") - div(v-for="friend in friendsGroup3" :key="friend.id" @click="showUserDialog(friend.id)" class="x-friend-item") + .x-friend-item(v-for="friend in friendsGroup3" :key="friend.id" @click="showUserDialog(friend.id)") template(v-if="friend.ref") - div(class="avatar") + .avatar img(v-lazy="friend.ref.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-if="friend.memo" class="name" :class="friend.ref.$trustClass") {{ friend.ref.displayName }} ({{ friend.memo }}) - span(v-else v-text="friend.ref.displayName" class="name" :class="friend.ref.$trustClass") - span(v-text="friend.ref.statusDescription" class="extra") + .detail + span.name(v-if="friend.memo" :class="friend.ref.$trustClass") {{ friend.ref.displayName }} ({{ friend.memo }}) + span.name(v-else v-text="friend.ref.displayName" :class="friend.ref.$trustClass") + span.extra(v-text="friend.ref.statusDescription") template(v-else) span(v-text="friend.name || friend.id") el-button(type="text" icon="el-icon-close" size="mini" @click.stop="confirmDeleteFriend(friend.id)" style="margin-left:5px") //- dialog: user - el-dialog(ref="userDialog" :visible.sync="userDialog.visible" :show-close="false" width="600px" class="x-dialog x-user-dialog") + el-dialog.x-dialog.x-user-dialog(ref="userDialog" :visible.sync="userDialog.visible" :show-close="false" width="600px") div(v-loading="userDialog.loading") div(style="display:flex") el-popover(placement="right" width="500px" trigger="click") img(v-lazy="userDialog.ref.currentAvatarThumbnailImageUrl" style="width:500px;height:375px") - img(slot="reference" v-lazy="userDialog.ref.currentAvatarThumbnailImageUrl" class="x-link" style="flex:none;width:160px;height:120px;border-radius:4px") + img.x-link(slot="reference" v-lazy="userDialog.ref.currentAvatarThumbnailImageUrl" style="flex:none;width:160px;height:120px;border-radius:4px") div(style="flex:1;display:flex;align-items:center;margin-left:15px") div(style="flex:1") div @@ -651,7 +651,7 @@ html span(v-else-if="userDialog.ref.status === 'ask me'") Ask Me span(v-else-if="userDialog.ref.status === 'busy'") Do Not Disturb span(v-else) Offline - i(class="x-user-status" :class="userStatusClass(userDialog.ref)") + i.x-user-status(:class="userStatusClass(userDialog.ref)") span(v-text="userDialog.ref.displayName" style="margin-left:5px;font-weight:bold") el-popover(placement="top" trigger="click") span(style="display:block;text-align:center;font-family:monospace") {{ userDialog.ref.username | textToHex }} @@ -659,10 +659,10 @@ html el-tooltip(v-for="item in userDialog.ref.$languages" :key="item.key" placement="top") template(#content) span {{ item.value }} ({{ item.key }}) - span(class="famfamfam-flags" :class="languageClass(item.key)" style="display:inline-block;margin-left:5px") + span.famfamfam-flags(:class="languageClass(item.key)" style="display:inline-block;margin-left:5px") div(style="margin-top:5px") - el-tag(type="info" effect="plain" size="mini" class="name" :class="userDialog.ref.$trustClass" v-text="userDialog.ref.$trustLevel") - el-tag(v-if="userDialog.isFriend && userDialog.friend" type="info" effect="plain" size="mini" class="x-tag-friend") Friend No.{{userDialog.friend.no}} + el-tag.name(type="info" effect="plain" size="mini" :class="userDialog.ref.$trustClass" v-text="userDialog.ref.$trustLevel") + el-tag.x-tag-friend(v-if="userDialog.isFriend && userDialog.friend" type="info" effect="plain" size="mini") Friend No.{{userDialog.friend.no}} div(style="margin-top:5px") span(v-text="userDialog.ref.statusDescription" style="font-size:12px") div(style="flex:none;margin-left:10px") @@ -691,78 +691,78 @@ html el-tab-pane(label="Info") div(v-if="userDialog.ref.location" style="display:flex;flex-direction:column;margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid #eee") div(style="flex:none") - i(class="el-icon-position") + i.el-icon-position location(:location="userDialog.ref.location") template(#default v-if="userDialog.instance.occupants") ({{ userDialog.instance.occupants }}) launch(:location="userDialog.ref.location" style="margin-left:5px") - div(class="x-friend-list" style="flex:1;margin-top:10px") - div(v-if="userDialog.$location.userId" @click="showUserDialog(userDialog.$location.userId)" class="x-friend-item") + .x-friend-list(style="flex:1;margin-top:10px") + .x-friend-item(v-if="userDialog.$location.userId" @click="showUserDialog(userDialog.$location.userId)") template(v-if="userDialog.$location.user") - div(class="avatar") + .avatar img(v-lazy="userDialog.$location.user.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-text="userDialog.$location.user.displayName" class="name" :class="userDialog.$location.user.$trustClass") - span(class="extra") Instance Creator + .detail + span.name(v-text="userDialog.$location.user.displayName" :class="userDialog.$location.user.$trustClass") + span.extra Instance Creator span(v-else v-text="userDialog.$location.userId") - div(v-for="user in userDialog.users" :key="user.id" @click="showUserDialog(user.id)" class="x-friend-item") - div(class="avatar") + .x-friend-item(v-for="user in userDialog.users" :key="user.id" @click="showUserDialog(user.id)") + .avatar img(v-lazy="user.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-text="user.displayName" class="name" :class="user.$trustClass") - span(class="extra") + .detail + span.name(v-text="user.displayName" :class="user.$trustClass") + span.extra timer(:epoch="user.$location_at") - div(class="x-friend-list" style="max-height:none") - div(class="x-friend-item" style="width:100%") - div(class="detail") - span(class="name") Note - el-input(v-model="userDialog.memo" type="textarea" :rows="2" placeholder="Click to add a note" size="mini" resize="none" class="extra") - div(class="x-friend-item" style="width:100%") - div(class="detail") - span(class="name") Bio - pre(class="extra" style="font-family:inherit;font-size:12px;white-space:pre-wrap;margin:0 0.5em 0 0") {{ userDialog.ref.bio || '-' }} + .x-friend-list(style="max-height:none") + .x-friend-item(style="width:100%") + .detail + span.name Note + el-input.extra(v-model="userDialog.memo" type="textarea" :rows="2" placeholder="Click to add a note" size="mini" resize="none") + .x-friend-item(style="width:100%") + .detail + span.name Bio + pre.extra(style="font-family:inherit;font-size:12px;white-space:pre-wrap;margin:0 0.5em 0 0") {{ userDialog.ref.bio || '-' }} div(style="margin-top:5px") el-tooltip(v-for="(link, index) in userDialog.ref.bioLinks" :key="index") template(#content) span(v-text="link") img(:src="getFaviconUrl(link)" style="width:16px;height:16px;vertical-align:middle;margin-right:5px" @click.stop="openExternalLink(link)") - div(class="x-friend-item") - div(class="detail") - span(class="name") Avatar Copying - span(class="extra" v-if="userDialog.ref.allowAvatarCopying" style="color:#67C23A") Allow - span(class="extra" v-else style="color:#F56C6C") Deny - div(class="x-friend-item") - div(class="detail") - span(class="name") Last Login - span(class="extra") {{ userDialog.ref.last_login | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} - div(class="x-friend-item") - div(class="detail") - span(class="name") Last Platform - span(class="extra" v-text="userDialog.ref.last_platform") + .x-friend-item + .detail + span.name Avatar Copying + span.extra(v-if="userDialog.ref.allowAvatarCopying" style="color:#67C23A") Allow + span.extra(v-else style="color:#F56C6C") Deny + .x-friend-item + .detail + span.name Last Login + span.extra {{ userDialog.ref.last_login | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + .x-friend-item + .detail + span.name Last Platform + span.extra(v-text="userDialog.ref.last_platform") el-tab-pane(label="Worlds") el-button(type="default" :loading="userDialog.isWorldsLoading" @click="refreshUserDialogWorlds()" size="mini" icon="el-icon-refresh" circle) span(style="margin-left:5px") Total {{ userDialog.worlds.length }} el-radio-group(v-model="userDialog.worldSorting" size="mini" style="margin-left:30px" @change="changeUserDialogWorldSorting") el-radio(label="name") by name el-radio(label="update") by update - div(v-loading="userDialog.isWorldsLoading" class="x-friend-list" style="margin-top:10px;min-height:60px") - div(v-for="world in userDialog.worlds" :key="world.id" @click="showWorldDialog(world.id)" class="x-friend-item") - div(class="avatar") + .x-friend-list(v-loading="userDialog.isWorldsLoading" style="margin-top:10px;min-height:60px") + .x-friend-item(v-for="world in userDialog.worlds" :key="world.id" @click="showWorldDialog(world.id)") + .avatar img(v-lazy="world.thumbnailImageUrl") - div(class="detail") - span(v-text="world.name" class="name") - span(v-if="world.occupants" class="extra") ({{ world.occupants }}) + .detail + span.name(v-text="world.name") + span.extra(v-if="world.occupants") ({{ world.occupants }}) el-tab-pane(label="Avatars") el-button(type="default" :loading="userDialog.isAvatarsLoading" @click="refreshUserDialogAvatars()" size="mini" icon="el-icon-refresh" circle) span(style="margin-left:5px") Total {{ userDialog.avatars.length }} el-radio-group(v-model="userDialog.avatarSorting" size="mini" style="margin-left:30px" @change="changeUserDialogAvatarSorting") el-radio(label="name") by name el-radio(label="update") by update - div(v-loading="userDialog.isAvatarsLoading" class="x-friend-list" style="margin-top:10px;min-height:60px") - div(v-for="avatar in userDialog.avatars" :key="avatar.id" @click="showAvatarDialog(avatar.id)" class="x-friend-item") - div(class="avatar") + .x-friend-list(v-loading="userDialog.isAvatarsLoading" style="margin-top:10px;min-height:60px") + .x-friend-item(v-for="avatar in userDialog.avatars" :key="avatar.id" @click="showAvatarDialog(avatar.id)") + .avatar img(v-lazy="avatar.thumbnailImageUrl") - div(class="detail") - span(v-text="avatar.name" class="name") + .detail + span.name(v-text="avatar.name") el-tab-pane(label="JSON") el-button(type="default" @click="refreshUserDialogTreeData()" size="mini" icon="el-icon-refresh" circle) el-tree(:data="userDialog.treeData" style="margin-top:5px;font-size:12px") @@ -772,19 +772,19 @@ html span(v-if="!scope.data.children" v-text="scope.data.value") //- dialog: world - el-dialog(ref="worldDialog" :visible.sync="worldDialog.visible" :show-close="false" width="600px" class="x-dialog x-world-dialog") + el-dialog.x-dialog.x-world-dialog(ref="worldDialog" :visible.sync="worldDialog.visible" :show-close="false" width="600px") div(v-loading="worldDialog.loading") div(style="display:flex") el-popover(placement="right" width="500px" trigger="click") img(v-lazy="worldDialog.ref.thumbnailImageUrl" style="width:500px;height:375px") - img(slot="reference" v-lazy="worldDialog.ref.thumbnailImageUrl" class="x-link" style="flex:none;width:160px;height:120px;border-radius:4px") + img.x-link(slot="reference" v-lazy="worldDialog.ref.thumbnailImageUrl" style="flex:none;width:160px;height:120px;border-radius:4px") div(style="flex:1;display:flex;align-items:center;margin-left:15px") div(style="flex:1") div - i(class="el-icon-s-home" v-show="API.currentUser.$homeLocation && API.currentUser.$homeLocation.worldId === worldDialog.id") + i.el-icon-s-home(v-show="API.currentUser.$homeLocation && API.currentUser.$homeLocation.worldId === worldDialog.id") span(v-text="worldDialog.ref.name" style="font-weight:bold") div(style="margin-top:5px") - span(v-text="worldDialog.ref.authorName" @click="showUserDialog(worldDialog.ref.authorId)" class="x-link" style="color:#909399;font-family:monospace") + span.x-link(v-text="worldDialog.ref.authorName" @click="showUserDialog(worldDialog.ref.authorId)" style="color:#909399;font-family:monospace") div(style="margin-top:5px") el-tag(v-if="worldDialog.ref.$isLabs" type="primary" effect="plain" size="mini") Labs el-tag(v-else-if="worldDialog.ref.releaseStatus === 'public'" type="success" effect="plain" size="mini") Public @@ -804,71 +804,72 @@ html el-tabs el-tab-pane(label="Instances") div(style="margin-bottom:10px"). - #[i(class="el-icon-user")] Public {{ worldDialog.ref.publicOccupants | commaNumber }} - #[i(class="el-icon-user-solid" style="margin-left:10px")] Private {{ worldDialog.ref.privateOccupants | commaNumber }} - #[i(class="el-icon-check" style="margin-left:10px")] Capacity {{ worldDialog.ref.capacity | commaNumber }} + #[i.el-icon-user] Public {{ worldDialog.ref.publicOccupants | commaNumber }} + #[i.el-icon-user-solid(style="margin-left:10px")] Private {{ worldDialog.ref.privateOccupants | commaNumber }} + #[i.el-icon-check(style="margin-left:10px")] Capacity {{ worldDialog.ref.capacity | commaNumber }} div(v-for="room in worldDialog.rooms" :key="room.id") div - i(class="el-icon-position") - span(@click="showLaunchDialog(room.$location.tag)" class="x-link") \#{{ room.$location.instanceName }} {{ room.$location.accessType }} #[template(v-if="room.occupants") ({{ room.occupants }})] - div(class="x-friend-list" style="margin:10px 0") - div(v-if="room.$location.userId" @click="showUserDialog(room.$location.userId)" class="x-friend-item") + i.el-icon-position + span.x-link(@click="showLaunchDialog(room.$location.tag)"). + \#{{ room.$location.instanceName }} {{ room.$location.accessType }} #[template(v-if="room.occupants") ({{ room.occupants }})] + .x-friend-list(style="margin:10px 0") + .x-friend-item(v-if="room.$location.userId" @click="showUserDialog(room.$location.userId)") template(v-if="room.$location.user") - div(class="avatar") + .avatar img(v-lazy="room.$location.user.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-text="room.$location.user.displayName" class="name" :class="room.$location.user.$trustClass") - span(class="extra") Instance Creator + .detail + span.name(v-text="room.$location.user.displayName" :class="room.$location.user.$trustClass") + span.extra Instance Creator span(v-else v-text="room.$location.userId") - div(v-for="user in room.users" :key="user.id" @click="showUserDialog(user.id)" class="x-friend-item") - div(class="avatar") + .x-friend-item(v-for="user in room.users" :key="user.id" @click="showUserDialog(user.id)") + .avatar img(v-lazy="user.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-text="user.displayName" class="name" :class="user.$trustClass") - span(class="extra") + .detail + span.name(v-text="user.displayName" :class="user.$trustClass") + span.extra timer(:epoch="user.$location_at") el-tab-pane(label="Info") - div(class="x-friend-list" style="max-height:none") - div(class="x-friend-item") - div(class="detail") - span(class="name") Players - span(class="extra") {{ worldDialog.ref.occupants | commaNumber }} - div(class="x-friend-item") - div(class="detail") - span(class="name") Favorites - span(class="extra") {{ worldDialog.ref.favorites | commaNumber }} - div(class="x-friend-item") - div(class="detail") - span(class="name") Visits - span(class="extra") {{ worldDialog.ref.visits | commaNumber }} - div(class="x-friend-item") - div(class="detail") - span(class="name") Capacity - span(class="extra" v-text="worldDialog.ref.capacity") - div(class="x-friend-item") - div(class="detail") - span(class="name") Heat - span(class="extra") {{ worldDialog.ref.heat | commaNumber }} {{ '🔥'.repeat(worldDialog.ref.heat) }} - div(class="x-friend-item") - div(class="detail") - span(class="name") Popularity - span(class="extra") {{ worldDialog.ref.popularity | commaNumber }} {{ '💖'.repeat(worldDialog.ref.popularity) }} - div(class="x-friend-item") - div(class="detail") - span(class="name") Created - span(class="extra") {{ worldDialog.ref.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} - div(class="x-friend-item") - div(class="detail") - span(class="name") Last Updated - span(class="extra") {{ worldDialog.fileCreatedAt | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} - div(class="x-friend-item") - div(class="detail") - span(class="name") Version - span(class="extra" v-text="worldDialog.ref.version") - div(class="x-friend-item" style="width:100%") - div(class="detail") - span(class="name") Platform - span(class="extra" v-text="worldDialogPlatform") + .x-friend-list(style="max-height:none") + .x-friend-item + .detail + span.name Players + span.extra {{ worldDialog.ref.occupants | commaNumber }} + .x-friend-item + .detail + span.name Favorites + span.extra {{ worldDialog.ref.favorites | commaNumber }} + .x-friend-item + .detail + span.name Visits + span.extra {{ worldDialog.ref.visits | commaNumber }} + .x-friend-item + .detail + span.name Capacity + span.extra(v-text="worldDialog.ref.capacity") + .x-friend-item + .detail + span.name Heat + span.extra {{ worldDialog.ref.heat | commaNumber }} {{ '🔥'.repeat(worldDialog.ref.heat) }} + .x-friend-item + .detail + span.name Popularity + span.extra {{ worldDialog.ref.popularity | commaNumber }} {{ '💖'.repeat(worldDialog.ref.popularity) }} + .x-friend-item + .detail + span.name Created + span.extra {{ worldDialog.ref.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + .x-friend-item + .detail + span.name Last Updated + span.extra {{ worldDialog.fileCreatedAt | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + .x-friend-item + .detail + span.name Version + span.extra(v-text="worldDialog.ref.version") + .x-friend-item(style="width:100%") + .detail + span.name Platform + span.extra(v-text="worldDialogPlatform") el-tab-pane(label="JSON") el-button(type="default" @click="refreshWorldDialogTreeData()" size="mini" icon="el-icon-refresh" circle) el-tree(:data="worldDialog.treeData" style="margin-top:5px;font-size:12px") @@ -878,18 +879,18 @@ html span(v-if="!scope.data.children" v-text="scope.data.value") //- dialog: avatar - el-dialog(ref="avatarDialog" :visible.sync="avatarDialog.visible" :show-close="false" width="600px" class="x-dialog x-avatar-dialog") + el-dialog.x-dialog.x-avatar-dialog(ref="avatarDialog" :visible.sync="avatarDialog.visible" :show-close="false" width="600px") div(v-loading="avatarDialog.loading") div(style="display:flex") el-popover(placement="right" width="500px" trigger="click") img(v-lazy="avatarDialog.ref.thumbnailImageUrl" style="width:500px;height:375px") - img(slot="reference" v-lazy="avatarDialog.ref.thumbnailImageUrl" class="x-link" style="flex:none;width:160px;height:120px;border-radius:4px") + img.x-link(slot="reference" v-lazy="avatarDialog.ref.thumbnailImageUrl" style="flex:none;width:160px;height:120px;border-radius:4px") div(style="flex:1;display:flex;align-items:center;margin-left:15px") div(style="flex:1") div span(v-text="avatarDialog.ref.name" style="font-weight:bold") div(style="margin-top:5px") - span(v-text="avatarDialog.ref.authorName" @click="showUserDialog(avatarDialog.ref.authorId)" class="x-link" style="color:#909399;font-family:monospace") + span.x-link(v-text="avatarDialog.ref.authorName" @click="showUserDialog(avatarDialog.ref.authorId)" style="color:#909399;font-family:monospace") div(style="margin-top:5px") el-tag(v-if="avatarDialog.ref.releaseStatus === 'public'" type="success" effect="plain" size="mini") Public el-tag(v-else type="danger" effect="plain" size="mini") Private @@ -905,23 +906,23 @@ html el-dropdown-item(icon="el-icon-check" command="Select Avatar") Select Avatar el-tabs el-tab-pane(label="Info") - div(class="x-friend-list") - div(class="x-friend-item") - div(class="detail") - span(class="name") Created - span(class="extra") {{ avatarDialog.ref.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} - div(class="x-friend-item") - div(class="detail") - span(class="name") Last Updated - span(class="extra") {{ avatarDialog.fileCreatedAt | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} - div(class="x-friend-item") - div(class="detail") - span(class="name") Version - span(class="extra" v-text="avatarDialog.ref.version") - div(class="x-friend-item" style="width:100%") - div(class="detail") - span(class="name") Platform - span(class="extra" v-text="avatarDialogPlatform") + .x-friend-list + .x-friend-item + .detail + span.name Created + span.extra {{ avatarDialog.ref.created_at | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + .x-friend-item + .detail + span.name Last Updated + span.extra {{ avatarDialog.fileCreatedAt | formatDate('YYYY-MM-DD HH24:MI:SS') || '-' }} + .x-friend-item + .detail + span.name Version + span.extra(v-text="avatarDialog.ref.version") + .x-friend-item(style="width:100%") + .detail + span.name Platform + span.extra(v-text="avatarDialogPlatform") el-tab-pane(label="JSON") el-button(type="default" @click="refreshAvatarDialogTreeData()" size="mini" icon="el-icon-refresh" circle) el-tree(:data="avatarDialog.treeData" style="margin-top:5px;font-size:12px") @@ -931,63 +932,63 @@ html span(v-if="!scope.data.children" v-text="scope.data.value") //- dialog: favorite - el-dialog(ref="favoriteDialog" :visible.sync="favoriteDialog.visible" title="Choose Group" width="250px" class="x-dialog") + el-dialog.x-dialog(ref="favoriteDialog" :visible.sync="favoriteDialog.visible" title="Choose Group" width="250px") div(v-loading="favoriteDialog.loading") el-button(v-for="group in favoriteDialog.groups" :key="group.name" style="display:block;width:100%;margin:10px 0" @click="addFavorite(group)" :disabled="group.count >= group.capacity") {{ group.displayName }} ({{ group.count }} / {{ group.capacity }}) //- dialog: invite - el-dialog(ref="inviteDialog" :visible.sync="inviteDialog.visible" title="Invite" width="450px" class="x-dialog") + el-dialog.x-dialog(ref="inviteDialog" :visible.sync="inviteDialog.visible" title="Invite" width="450px") div(v-loading="inviteDialog.loading") location(:location="inviteDialog.worldId" :link="false") el-select(v-model="inviteDialog.userIds" multiple clearable placeholder="Choose Friends" filterable :disabled="inviteDialog.loading" style="width:100%;margin-top:15px") el-option-group(v-if="API.currentUser" label="ME") - el-option(:label="API.currentUser.displayName" :value="API.currentUser.id" class="x-friend-item" style="height:auto") - div(class="avatar" :class="userStatusClass(API.currentUser)") + el-option.x-friend-item(:label="API.currentUser.displayName" :value="API.currentUser.id" style="height:auto") + .avatar(:class="userStatusClass(API.currentUser)") img(v-lazy="API.currentUser.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-text="API.currentUser.displayName" class="name") + .detail + span.name(v-text="API.currentUser.displayName") el-option-group(v-if="friendsGroup0.length" label="VIP") - el-option(v-for="friend in friendsGroup0" :key="friend.id" :label="friend.name" :value="friend.id" class="x-friend-item" style="height:auto") + el-option.x-friend-item(v-for="friend in friendsGroup0" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") template(v-if="friend.ref") - div(class="avatar" :class="userStatusClass(friend.ref)") + .avatar(:class="userStatusClass(friend.ref)") img(v-lazy="friend.ref.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-text="friend.ref.displayName" class="name" :class="friend.ref.$trustClass") + .detail + span.name(v-text="friend.ref.displayName" :class="friend.ref.$trustClass") span(v-else v-text="friend.id") el-option-group(v-if="friendsGroup1.length" label="ONLINE") - el-option(v-for="friend in friendsGroup1" :key="friend.id" :label="friend.name" :value="friend.id" class="x-friend-item" style="height:auto") + el-option.x-friend-item(v-for="friend in friendsGroup1" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") template(v-if="friend.ref") - div(class="avatar" :class="userStatusClass(friend.ref)") + .avatar(:class="userStatusClass(friend.ref)") img(v-lazy="friend.ref.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-text="friend.ref.displayName" class="name" :class="friend.ref.$trustClass") + .detail + span.name(v-text="friend.ref.displayName" :class="friend.ref.$trustClass") span(v-else v-text="friend.id") el-option-group(v-if="friendsGroup2.length" label="ACTIVE") - el-option(v-for="friend in friendsGroup2" :key="friend.id" :label="friend.name" :value="friend.id" class="x-friend-item" style="height:auto") + el-option.x-friend-item(v-for="friend in friendsGroup2" :key="friend.id" :label="friend.name" :value="friend.id" style="height:auto") template(v-if="friend.ref") - div(class="avatar") + .avatar img(v-lazy="friend.ref.currentAvatarThumbnailImageUrl") - div(class="detail") - span(v-text="friend.ref.displayName" class="name" :class="friend.ref.$trustClass") + .detail + span.name(v-text="friend.ref.displayName" :class="friend.ref.$trustClass") span(v-else v-text="friend.id") template(#footer) el-button(type="primary" size="small" :disabled="inviteDialog.loading || !inviteDialog.userIds.length" @click="sendInvite()") Invite //- dialog: social status - el-dialog(ref="socialStatusDialog" :visible.sync="socialStatusDialog.visible" title="Social Status" width="400px" class="x-dialog") + el-dialog.x-dialog(ref="socialStatusDialog" :visible.sync="socialStatusDialog.visible" title="Social Status" width="400px") el-row(v-loading="socialStatusDialog.loading") el-col(:span="9") el-select(v-model="socialStatusDialog.status") el-option(label="Online" value="active"). - #[i(class="x-user-status active")] Online + #[i.x-user-status active] Online el-option(label="Join Me" value="join me"). - #[i(class="x-user-status joinme")] Join Me + #[i.x-user-status joinme] Join Me el-option(label="Ask Me" value="ask me"). - #[i(class="x-user-status askme")] Ask Me + #[i.x-user-status askme] Ask Me el-option(label="Do Not Disturb" value="busy"). - #[i(class="x-user-status busy")] Do Not Disturb + #[i.x-user-status busy] Do Not Disturb el-option(label="Offline" value="offline"). - #[i(class="x-user-status offline")] Offline + #[i.x-user-status offline] Offline el-col(:span="1")   el-col(:span="14") el-input(v-model="socialStatusDialog.statusDescription" placeholder="Status") @@ -995,7 +996,7 @@ html el-button(type="primary" size="small" :disabled="socialStatusDialog.loading" @click="saveSocialStatus") Update //- dialog: bio - el-dialog(ref="bioDialog" :visible.sync="bioDialog.visible" title="Bio" width="400px" class="x-dialog") + el-dialog.x-dialog(ref="bioDialog" :visible.sync="bioDialog.visible" title="Bio" width="400px") el-input(type="textarea" v-model="bioDialog.bio" size="mini" maxlength="512" show-word-limit :autosize="{ minRows:2, maxRows:5 }" placeholder="Please input a bio") el-input(v-for="(link, index) in bioDialog.bioLinks" :key="index" :value="link" v-model="bioDialog.bioLinks[index]" size="small" style="margin-top:5px") img(slot="prepend" :src="getFaviconUrl(link)" style="width:16px;height:16px") @@ -1005,7 +1006,7 @@ html el-button(type="primary" size="small" :disabled="bioDialog.loading" @click="saveBio") Update //- dialog: new instance - el-dialog(ref="newInstanceDialog" :visible.sync="newInstanceDialog.visible" title="New Instance" width="600px" class="x-dialog") + el-dialog.x-dialog(ref="newInstanceDialog" :visible.sync="newInstanceDialog.visible" title="New Instance" width="600px") el-form(:model="newInstanceDialog" label-width="100px") el-form-item(label="Access Type") el-radio-group(v-model="newInstanceDialog.accessType" size="mini" @change="buildInstance") @@ -1028,7 +1029,7 @@ html el-button(type="primary" size="small" @click="showLaunchDialog(newInstanceDialog.location)") Launch //- dialog: launch - el-dialog(ref="launchDialog" :visible.sync="launchDialog.visible" title="Launch" width="400px" class="x-dialog") + el-dialog.x-dialog(ref="launchDialog" :visible.sync="launchDialog.visible" title="Launch" width="400px") div #[span(v-text="launchDialog.url" style="word-break:break-all;font-size:12px")] template(#footer) el-checkbox(v-model="launchDialog.desktop" style="float:left;margin-top:5px") Start as Desktop (No VR) @@ -1036,286 +1037,286 @@ html el-button(type="primary" size="small" @click="launchGame()") Launch //- dialog: open source software notice - el-dialog(:visible.sync="ossDialog" title="Open Source Software Notice" width="650px" class="x-dialog") + el-dialog.x-dialog(:visible.sync="ossDialog" title="Open Source Software Notice" width="650px") div(style="height:350px;overflow:hidden scroll;word-break:break-all") div span VRCX is based on open source software. It was possible because of their contribution. div(style="margin-top:15px") p(style="font-weight:bold") animate.css - pre(style="font-size:12px;white-space:pre-line") - | The MIT License (MIT) - | - | Copyright (c) 2019 Daniel Eden - | - | Permission is hereby granted, free of charge, to any person obtaining a copy - | of this software and associated documentation files (the "Software"), to deal - | in the Software without restriction, including without limitation the rights - | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - | copies of the Software, and to permit persons to whom the Software is - | furnished to do so, subject to the following conditions: - | - | The above copyright notice and this permission notice shall be included in all - | copies or substantial portions of the Software. - | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - | SOFTWARE. + pre(style="font-size:12px;white-space:pre-line"). + The MIT License (MIT) + + Copyright (c) 2019 Daniel Eden + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. div(style="margin-top:15px") p(style="font-weight:bold") CefSharp - pre(style="font-size:12px;white-space:pre-line") - | // Copyright © The CefSharp Authors. All rights reserved. - | // - | // Redistribution and use in source and binary forms, with or without - | // modification, are permitted provided that the following conditions are - | // met: - | // - | // * Redistributions of source code must retain the above copyright - | // notice, this list of conditions and the following disclaimer. - | // - | // * Redistributions in binary form must reproduce the above - | // copyright notice, this list of conditions and the following disclaimer - | // in the documentation and/or other materials provided with the - | // distribution. - | // - | // * Neither the name of Google Inc. nor the name Chromium Embedded - | // Framework nor the name CefSharp nor the names of its contributors - | // may be used to endorse or promote products derived from this software - | // without specific prior written permission. - | // - | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + pre(style="font-size:12px;white-space:pre-line"). + // Copyright © The CefSharp Authors. All rights reserved. + // + // Redistribution and use in source and binary forms, with or without + // modification, are permitted provided that the following conditions are + // met: + // + // * Redistributions of source code must retain the above copyright + // notice, this list of conditions and the following disclaimer. + // + // * Redistributions in binary form must reproduce the above + // copyright notice, this list of conditions and the following disclaimer + // in the documentation and/or other materials provided with the + // distribution. + // + // * Neither the name of Google Inc. nor the name Chromium Embedded + // Framework nor the name CefSharp nor the names of its contributors + // may be used to endorse or promote products derived from this software + // without specific prior written permission. + // + // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. div(style="margin-top:15px") p(style="font-weight:bold") DiscordRichPresence - pre(style="font-size:12px;white-space:pre-line") - | MIT License - | - | Copyright (c) 2018 Lachee - | - | Permission is hereby granted, free of charge, to any person obtaining a copy - | of this software and associated documentation files (the "Software"), to deal - | in the Software without restriction, including without limitation the rights - | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - | copies of the Software, and to permit persons to whom the Software is - | furnished to do so, subject to the following conditions: - | - | The above copyright notice and this permission notice shall be included in all - | copies or substantial portions of the Software. - | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - | SOFTWARE. + pre(style="font-size:12px;white-space:pre-line"). + MIT License + + Copyright (c) 2018 Lachee + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. div(style="margin-top:15px") p(style="font-weight:bold") element - pre(style="font-size:12px;white-space:pre-line") - | The MIT License (MIT) - | - | Copyright (c) 2016-present ElemeFE - | - | Permission is hereby granted, free of charge, to any person obtaining a copy - | of this software and associated documentation files (the "Software"), to deal - | in the Software without restriction, including without limitation the rights - | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - | copies of the Software, and to permit persons to whom the Software is - | furnished to do so, subject to the following conditions: - | - | The above copyright notice and this permission notice shall be included in all - | copies or substantial portions of the Software. - | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - | SOFTWARE. + pre(style="font-size:12px;white-space:pre-line"). + The MIT License (MIT) + + Copyright (c) 2016-present ElemeFE + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. div(style="margin-top:15px") p(style="font-weight:bold") Newtonsoft.Json - pre(style="font-size:12px;white-space:pre-line") - | The MIT License (MIT) - | - | Copyright (c) 2007 James Newton-King - | - | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - | - | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + pre(style="font-size:12px;white-space:pre-line"). + The MIT License (MIT) + + Copyright (c) 2007 James Newton-King + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. div(style="margin-top:15px") p(style="font-weight:bold") normalize - pre(style="font-size:12px;white-space:pre-line") - | The MIT License (MIT) - | - | Copyright © Nicolas Gallagher and Jonathan Neal - | - | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - | - | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + pre(style="font-size:12px;white-space:pre-line"). + The MIT License (MIT) + + Copyright © Nicolas Gallagher and Jonathan Neal + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. div(style="margin-top:15px") p(style="font-weight:bold") noty - pre(style="font-size:12px;white-space:pre-line") - | Copyright (c) 2012 Nedim Arabacı - | - | Permission is hereby granted, free of charge, to any person obtaining - | a copy of this software and associated documentation files (the - | "Software"), to deal in the Software without restriction, including - | without limitation the rights to use, copy, modify, merge, publish, - | distribute, sublicense, and/or sell copies of the Software, and to - | permit persons to whom the Software is furnished to do so, subject to - | the following conditions: - | - | The above copyright notice and this permission notice shall be - | included in all copies or substantial portions of the Software. - | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + pre(style="font-size:12px;white-space:pre-line"). + Copyright (c) 2012 Nedim Arabacı + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. div(style="margin-top:15px") p(style="font-weight:bold") OpenVR SDK - pre(style="font-size:12px;white-space:pre-line") - | Copyright (c) 2015, Valve Corporation - | All rights reserved. - | - | Redistribution and use in source and binary forms, with or without modification, - | are permitted provided that the following conditions are met: - | - | 1. Redistributions of source code must retain the above copyright notice, this - | list of conditions and the following disclaimer. - | - | 2. Redistributions in binary form must reproduce the above copyright notice, - | this list of conditions and the following disclaimer in the documentation and/or - | other materials provided with the distribution. - | - | 3. Neither the name of the copyright holder nor the names of its contributors - | may be used to endorse or promote products derived from this software without - | specific prior written permission. - | - | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR - | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + pre(style="font-size:12px;white-space:pre-line"). + Copyright (c) 2015, Valve Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. div(style="margin-top:15px") p(style="font-weight:bold") SharpDX - pre(style="font-size:12px;white-space:pre-line") - | Copyright (c) 2010-2014 SharpDX - Alexandre Mutel - | - | Permission is hereby granted, free of charge, to any person obtaining a copy - | of this software and associated documentation files (the "Software"), to deal - | in the Software without restriction, including without limitation the rights - | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - | copies of the Software, and to permit persons to whom the Software is - | furnished to do so, subject to the following conditions: - | - | The above copyright notice and this permission notice shall be included in - | all copies or substantial portions of the Software. - | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - | THE SOFTWARE. + pre(style="font-size:12px;white-space:pre-line"). + Copyright (c) 2010-2014 SharpDX - Alexandre Mutel + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. div(style="margin-top:15px") p(style="font-weight:bold") vue - pre(style="font-size:12px;white-space:pre-line") - | The MIT License (MIT) - | - | Copyright (c) 2013-present, Yuxi (Evan) You - | - | Permission is hereby granted, free of charge, to any person obtaining a copy - | of this software and associated documentation files (the "Software"), to deal - | in the Software without restriction, including without limitation the rights - | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - | copies of the Software, and to permit persons to whom the Software is - | furnished to do so, subject to the following conditions: - | - | The above copyright notice and this permission notice shall be included in - | all copies or substantial portions of the Software. - | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - | THE SOFTWARE. + pre(style="font-size:12px;white-space:pre-line"). + The MIT License (MIT) + + Copyright (c) 2013-present, Yuxi (Evan) You + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. div(style="margin-top:15px") p(style="font-weight:bold") vue-data-tables - pre(style="font-size:12px;white-space:pre-line") - | The MIT License (MIT) - | - | Copyright (c) 2018 Leon Zhang - | - | Permission is hereby granted, free of charge, to any person obtaining a copy - | of this software and associated documentation files (the "Software"), to deal - | in the Software without restriction, including without limitation the rights - | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - | copies of the Software, and to permit persons to whom the Software is - | furnished to do so, subject to the following conditions: - | - | The above copyright notice and this permission notice shall be included in all - | copies or substantial portions of the Software. - | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - | SOFTWARE. + pre(style="font-size:12px;white-space:pre-line"). + The MIT License (MIT) + + Copyright (c) 2018 Leon Zhang + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. div(style="margin-top:15px") p(style="font-weight:bold") vue-lazyload - pre(style="font-size:12px;white-space:pre-line") - | The MIT License (MIT) - | - | Copyright (c) 2016 Awe - | - | Permission is hereby granted, free of charge, to any person obtaining a copy - | of this software and associated documentation files (the "Software"), to deal - | in the Software without restriction, including without limitation the rights - | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - | copies of the Software, and to permit persons to whom the Software is - | furnished to do so, subject to the following conditions: - | - | The above copyright notice and this permission notice shall be included in all - | copies or substantial portions of the Software. - | - | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - | SOFTWARE. + pre(style="font-size:12px;white-space:pre-line"). + The MIT License (MIT) + + Copyright (c) 2016 Awe + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. script(src="https://cdnjs.cloudflare.com/ajax/libs/noty/3.2.0-beta/noty.min.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.js") script(src="https://cdnjs.cloudflare.com/ajax/libs/vue-lazyload/1.3.3/vue-lazyload.js")