diff --git a/html/src/app.js b/html/src/app.js
index 1139380d..ec81b612 100644
--- a/html/src/app.js
+++ b/html/src/app.js
@@ -13655,6 +13655,10 @@ speechSynthesis.getVoices();
false
);
$app.data.asideWidth = configRepository.getInt('VRCX_asidewidth', 350);
+ if ($app.data.asideWidth === 236) {
+ $app.data.asideWidth = 350;
+ configRepository.setInt('VRCX_asidewidth', $app.data.asideWidth);
+ }
$app.data.autoUpdateVRCX = configRepository.getString(
'VRCX_autoUpdateVRCX',
'Auto Download'
diff --git a/html/src/app.scss b/html/src/app.scss
index b18e0981..cc84b770 100644
--- a/html/src/app.scss
+++ b/html/src/app.scss
@@ -705,3 +705,19 @@ i.x-user-status.busy {
padding: 3px;
top: 0 !important;
}
+
+.el-tab-pane {
+ height: 100%;
+}
+
+.el-tabs {
+ // height: calc(100vh - 60px);
+ display: flex;
+ flex-direction: column;
+}
+
+.el-tabs__content {
+ flex: 1;
+ max-height: 100%;
+ overflow: auto;
+}
diff --git a/html/src/index.pug b/html/src/index.pug
index bd942623..e60b4c01 100644
--- a/html/src/index.pug
+++ b/html/src/index.pug
@@ -106,95 +106,99 @@ html
el-button(type="default" @click="directAccessPaste" size="mini" icon="el-icon-discover" circle)
el-tooltip(placement="bottom" :content="$t('side_panel.refresh_tooltip')" :disabled="hideTooltips")
el-button(type="default" @click="refreshFriendsList" :loading="API.isRefreshFriendsLoading" size="mini" icon="el-icon-refresh" circle style="margin-right:10px")
- .x-friend-list(style="padding-bottom:10px")
- .x-friend-group(style="padding:5px 0 0")
- span {{ $t('side_panel.friends') }} ― {{ onlineFriendCount }}/{{ friends.size }}
- .x-friend-group.x-link(@click="isFriendsGroupMe = !isFriendsGroupMe" style="padding:10px 0 5px")
- i.el-icon-arrow-right(:class="{ rotate: isFriendsGroupMe }")
- span(style="margin-left:5px") {{ $t('side_panel.me') }}
- div(v-show="isFriendsGroupMe")
- .x-friend-item(:key="API.currentUser.id" @click="showUserDialog(API.currentUser.id)")
- .avatar(:class="userStatusClass(API.currentUser)")
- img(v-lazy="userImage(API.currentUser)")
- .detail
- span.name(v-text="API.currentUser.displayName" :style="{'color':API.currentUser.$userColour}")
- location.extra(v-if="isGameRunning" :location="lastLocation.location" :traveling="lastLocationDestination" :link="false")
- location.extra(v-else-if="isRealInstance(API.currentUser.$locationTag) || isRealInstance(API.currentUser.$travelingToLocation)" :location="API.currentUser.$locationTag" :traveling="API.currentUser.$travelingToLocation" :link="false")
- span.extra(v-else v-text="API.currentUser.statusDescription")
- .x-friend-group.x-link(@click="isGroupInstances = !isGroupInstances")
- i.el-icon-arrow-right(:class="{ rotate: isGroupInstances }")
- span(style="margin-left:5px") {{ $t('side_panel.groups') }} ― {{ groupInstances.length }}
- div(v-show="isGroupInstances")
- .x-friend-item(v-for="instance in groupInstances" :key="instance.id" @click="showGroupDialog(instance.ownerId)")
- .avatar
- img(v-lazy="instance.$group.iconUrl")
- .detail
- span.name
- span(v-text="instance.$group.name")
- span(style="font-weight:normal;margin-left:5px") ({{ instance.userCount }}/{{ instance.capacity }})
- location.extra(:location="instance.location" :link="false")
- .x-friend-group.x-link(@click="isFriendsGroup0 = !isFriendsGroup0" v-show="friendsGroup0.length")
- i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup0 }")
- span(style="margin-left:5px") {{ $t('side_panel.favorite') }} ― {{ friendsGroup0.length }}
- div(v-show="isFriendsGroup0")
- .x-friend-item(v-for="friend in friendsGroup0" :key="friend.id" @click="showUserDialog(friend.id)")
- template(v-if="friend.ref")
- .avatar(:class="userStatusClass(friend.ref, friend.pendingOffline)")
- img(v-lazy="userImage(friend.ref)")
- .detail
- span.name(v-if="!hideUserMemos && friend.$nickName" :style="{'color':friend.ref.$userColour}") {{ friend.ref.displayName }} ({{ friend.$nickName }})
- span.name(v-else v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}")
- span.extra(v-if="friend.pendingOffline") #[i.el-icon-warning-outline] {{ $t('side_panel.pending_offline') }}
- location.extra(v-else :location="friend.ref.location" :traveling="friend.ref.travelingToLocation" :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")
- .x-friend-group.x-link(@click="isFriendsGroup1 = !isFriendsGroup1" v-show="friendsGroup1.length")
- i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup1 }")
- span(style="margin-left:5px") {{ $t('side_panel.online') }} ― {{ friendsGroup1.length }}
- div(v-show="isFriendsGroup1")
- .x-friend-item(v-for="friend in friendsGroup1" :key="friend.id" @click="showUserDialog(friend.id)")
- template(v-if="friend.ref")
- .avatar(:class="userStatusClass(friend.ref, friend.pendingOffline)")
- img(v-lazy="userImage(friend.ref)")
- .detail
- span.name(v-if="!hideUserMemos && friend.$nickName" :style="{'color':friend.ref.$userColour}") {{ friend.ref.displayName }} ({{ friend.$nickName }})
- span.name(v-else v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}")
- span.extra(v-if="friend.pendingOffline") #[i.el-icon-warning-outline] {{ $t('side_panel.pending_offline') }}
- location.extra(v-else :location="friend.ref.location" :traveling="friend.ref.travelingToLocation" :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")
- .x-friend-group.x-link(@click="isFriendsGroup2 = !isFriendsGroup2" v-show="friendsGroup2.length")
- i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup2 }")
- span(style="margin-left:5px") {{ $t('side_panel.active') }} ― {{ friendsGroup2.length }}
- div(v-show="isFriendsGroup2")
- .x-friend-item(v-for="friend in friendsGroup2" :key="friend.id" @click="showUserDialog(friend.id)")
- template(v-if="friend.ref")
+ el-tabs(type="card" stretch="true" style="height: calc(100vh - 60px")
+ el-tab-pane
+ template(#label)
+ span {{ $t('side_panel.friends') }}: {{ onlineFriendCount }}/{{ friends.size }}
+ .x-friend-list(style="padding-bottom:10px")
+ .x-friend-group.x-link(@click="isFriendsGroupMe = !isFriendsGroupMe" style="padding:0px 0px 5px")
+ i.el-icon-arrow-right(:class="{ rotate: isFriendsGroupMe }")
+ span(style="margin-left:5px") {{ $t('side_panel.me') }}
+ div(v-show="isFriendsGroupMe")
+ .x-friend-item(:key="API.currentUser.id" @click="showUserDialog(API.currentUser.id)")
+ .avatar(:class="userStatusClass(API.currentUser)")
+ img(v-lazy="userImage(API.currentUser)")
+ .detail
+ span.name(v-text="API.currentUser.displayName" :style="{'color':API.currentUser.$userColour}")
+ location.extra(v-if="isGameRunning" :location="lastLocation.location" :traveling="lastLocationDestination" :link="false")
+ location.extra(v-else-if="isRealInstance(API.currentUser.$locationTag) || isRealInstance(API.currentUser.$travelingToLocation)" :location="API.currentUser.$locationTag" :traveling="API.currentUser.$travelingToLocation" :link="false")
+ span.extra(v-else v-text="API.currentUser.statusDescription")
+ .x-friend-group.x-link(@click="isFriendsGroup0 = !isFriendsGroup0" v-show="friendsGroup0.length")
+ i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup0 }")
+ span(style="margin-left:5px") {{ $t('side_panel.favorite') }} ― {{ friendsGroup0.length }}
+ div(v-show="isFriendsGroup0")
+ .x-friend-item(v-for="friend in friendsGroup0" :key="friend.id" @click="showUserDialog(friend.id)")
+ template(v-if="friend.ref")
+ .avatar(:class="userStatusClass(friend.ref, friend.pendingOffline)")
+ img(v-lazy="userImage(friend.ref)")
+ .detail
+ span.name(v-if="!hideUserMemos && friend.$nickName" :style="{'color':friend.ref.$userColour}") {{ friend.ref.displayName }} ({{ friend.$nickName }})
+ span.name(v-else v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}")
+ span.extra(v-if="friend.pendingOffline") #[i.el-icon-warning-outline] {{ $t('side_panel.pending_offline') }}
+ location.extra(v-else :location="friend.ref.location" :traveling="friend.ref.travelingToLocation" :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")
+ .x-friend-group.x-link(@click="isFriendsGroup1 = !isFriendsGroup1" v-show="friendsGroup1.length")
+ i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup1 }")
+ span(style="margin-left:5px") {{ $t('side_panel.online') }} ― {{ friendsGroup1.length }}
+ div(v-show="isFriendsGroup1")
+ .x-friend-item(v-for="friend in friendsGroup1" :key="friend.id" @click="showUserDialog(friend.id)")
+ template(v-if="friend.ref")
+ .avatar(:class="userStatusClass(friend.ref, friend.pendingOffline)")
+ img(v-lazy="userImage(friend.ref)")
+ .detail
+ span.name(v-if="!hideUserMemos && friend.$nickName" :style="{'color':friend.ref.$userColour}") {{ friend.ref.displayName }} ({{ friend.$nickName }})
+ span.name(v-else v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}")
+ span.extra(v-if="friend.pendingOffline") #[i.el-icon-warning-outline] {{ $t('side_panel.pending_offline') }}
+ location.extra(v-else :location="friend.ref.location" :traveling="friend.ref.travelingToLocation" :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")
+ .x-friend-group.x-link(@click="isFriendsGroup2 = !isFriendsGroup2" v-show="friendsGroup2.length")
+ i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup2 }")
+ span(style="margin-left:5px") {{ $t('side_panel.active') }} ― {{ friendsGroup2.length }}
+ div(v-show="isFriendsGroup2")
+ .x-friend-item(v-for="friend in friendsGroup2" :key="friend.id" @click="showUserDialog(friend.id)")
+ template(v-if="friend.ref")
+ .avatar
+ img(v-lazy="userImage(friend.ref)")
+ .detail
+ span.name(v-if="!hideUserMemos && friend.$nickName" :style="{'color':friend.ref.$userColour}") {{ friend.ref.displayName }} ({{ friend.$nickName }})
+ span.name(v-else v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}")
+ 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")
+ .x-friend-group.x-link(@click="isFriendsGroup3 = !isFriendsGroup3" v-show="friendsGroup3.length")
+ i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup3 }")
+ span(style="margin-left:5px") {{ $t('side_panel.offline') }} ― {{ friendsGroup3.length }}
+ div(v-show="isFriendsGroup3")
+ .x-friend-item(v-for="friend in friendsGroup3" :key="friend.id" @click="showUserDialog(friend.id)")
+ template(v-if="friend.ref")
+ .avatar
+ img(v-lazy="userImage(friend.ref)")
+ .detail
+ span.name(v-if="!hideUserMemos && friend.$nickName" :style="{'color':friend.ref.$userColour}") {{ friend.ref.displayName }} ({{ friend.$nickName }})
+ span.name(v-else v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}")
+ 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")
+
+ el-tab-pane
+ template(#label)
+ span {{ $t('side_panel.groups') }}: {{ groupInstances.length }}
+ .x-friend-list(style="padding-bottom:10px")
+ .x-friend-item(v-for="instance in groupInstances" :key="instance.id" @click="showGroupDialog(instance.ownerId)")
.avatar
- img(v-lazy="userImage(friend.ref)")
+ img(v-lazy="instance.$group.iconUrl")
.detail
- span.name(v-if="!hideUserMemos && friend.$nickName" :style="{'color':friend.ref.$userColour}") {{ friend.ref.displayName }} ({{ friend.$nickName }})
- span.name(v-else v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}")
- 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")
- .x-friend-group.x-link(@click="isFriendsGroup3 = !isFriendsGroup3" v-show="friendsGroup3.length")
- i.el-icon-arrow-right(:class="{ rotate: isFriendsGroup3 }")
- span(style="margin-left:5px") {{ $t('side_panel.offline') }} ― {{ friendsGroup3.length }}
- div(v-show="isFriendsGroup3")
- .x-friend-item(v-for="friend in friendsGroup3" :key="friend.id" @click="showUserDialog(friend.id)")
- template(v-if="friend.ref")
- .avatar
- img(v-lazy="userImage(friend.ref)")
- .detail
- span.name(v-if="!hideUserMemos && friend.$nickName" :style="{'color':friend.ref.$userColour}") {{ friend.ref.displayName }} ({{ friend.$nickName }})
- span.name(v-else v-text="friend.ref.displayName" :style="{'color':friend.ref.$userColour}")
- 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")
+ span.name
+ span(v-text="instance.$group.name")
+ span(style="font-weight:normal;margin-left:5px") ({{ instance.userCount }}/{{ instance.capacity }})
+ location.extra(:location="instance.location" :link="false")
+
//- ## Dialogs ## -\\
diff --git a/html/src/localization/strings/en.json b/html/src/localization/strings/en.json
index 25905c1a..fa84ec7c 100644
--- a/html/src/localization/strings/en.json
+++ b/html/src/localization/strings/en.json
@@ -477,8 +477,8 @@
"search_result_more": "Search More:",
"direct_access_tooltip": "Direct access ID/URL from clipboard",
"refresh_tooltip": "Refresh friends",
- "friends": "FRIENDS",
- "groups": "GROUPS",
+ "groups": "Group Instances",
+ "friends": "Friends",
"me": "ME",
"favorite": "FAVORITES",
"online": "ONLINE",
diff --git a/html/src/mixins/tabs/settings.pug b/html/src/mixins/tabs/settings.pug
index 8773a74f..c282714a 100644
--- a/html/src/mixins/tabs/settings.pug
+++ b/html/src/mixins/tabs/settings.pug
@@ -31,7 +31,7 @@ mixin settingsTab()
.x-container(v-show="$refs.menu && $refs.menu.activeIndex === 'settings'")
div.options-container(style="margin-top:0")
span.header {{ $t("view.settings.header") }}
- el-tabs(type="card" style="margin-top:10px")
+ el-tabs(type="card" style="height: calc(100vh - 51px")
el-tab-pane(:label="$t('view.settings.category.general')")
//- General | General
div.options-container(style="margin-top:0")