diff --git a/html/src/app.js b/html/src/app.js
index 05241b40..c0ba08ac 100644
--- a/html/src/app.js
+++ b/html/src/app.js
@@ -3847,7 +3847,7 @@ speechSynthesis.getVoices();
var locationBias = Date.now() - 30000; //30 seconds
if ((this.isGameRunning) && (this.lastLocation.date < locationBias) &&
((this.sharedFeedFilters.wrist.OnPlayerJoining === 'Friends') || (this.sharedFeedFilters.wrist.OnPlayerJoining === 'VIP') ||
- (this.sharedFeedFilters.noty.OnPlayerJoining === 'Friends') || (this.sharedFeedFilters.noty.OnPlayerJoining === 'VIP'))) {
+ (this.sharedFeedFilters.noty.OnPlayerJoining === 'Friends') || (this.sharedFeedFilters.noty.OnPlayerJoining === 'VIP'))) {
var joiningMap = [];
var bias = new Date(Date.now() - 120000).toJSON(); //2 minutes
var feedTable = this.feedTable.data;
@@ -4066,8 +4066,8 @@ speechSynthesis.getVoices();
var created_at = ctx.created_at;
if ((wristFilter[type]) &&
((wristFilter[type] === 'Everyone') ||
- ((wristFilter[type] === 'Friends') && (isFriend)) ||
- ((wristFilter[type] === 'VIP') && (isFavorite)))) {
+ ((wristFilter[type] === 'Friends') && (isFriend)) ||
+ ((wristFilter[type] === 'VIP') && (isFavorite)))) {
wristArr.unshift({
created_at,
type,
@@ -4079,8 +4079,8 @@ speechSynthesis.getVoices();
}
if ((notyFilter[type]) &&
((notyFilter[type] === 'Everyone') ||
- ((notyFilter[type] === 'Friends') && (isFriend)) ||
- ((notyFilter[type] === 'VIP') && (isFavorite)))) {
+ ((notyFilter[type] === 'Friends') && (isFriend)) ||
+ ((notyFilter[type] === 'VIP') && (isFavorite)))) {
notyArr.unshift({
created_at,
type,
@@ -4095,9 +4095,9 @@ speechSynthesis.getVoices();
}
if ((w < 20) && (wristFilter[ctx.type]) &&
((wristFilter[ctx.type] === 'On') ||
- (wristFilter[ctx.type] === 'Everyone') ||
- ((wristFilter[ctx.type] === 'Friends') && (isFriend)) ||
- ((wristFilter[ctx.type] === 'VIP') && (isFavorite)))) {
+ (wristFilter[ctx.type] === 'Everyone') ||
+ ((wristFilter[ctx.type] === 'Friends') && (isFriend)) ||
+ ((wristFilter[ctx.type] === 'VIP') && (isFavorite)))) {
wristArr.push({
...ctx,
isFriend,
@@ -4107,9 +4107,9 @@ speechSynthesis.getVoices();
}
if ((n < 1) && (notyFilter[ctx.type]) &&
((notyFilter[ctx.type] === 'On') ||
- (notyFilter[ctx.type] === 'Everyone') ||
- ((notyFilter[ctx.type] === 'Friends') && (isFriend)) ||
- ((notyFilter[ctx.type] === 'VIP') && (isFavorite)))) {
+ (notyFilter[ctx.type] === 'Everyone') ||
+ ((notyFilter[ctx.type] === 'Friends') && (isFriend)) ||
+ ((notyFilter[ctx.type] === 'VIP') && (isFavorite)))) {
notyArr.push({
...ctx,
isFriend,
@@ -4192,7 +4192,7 @@ speechSynthesis.getVoices();
var isFavorite = API.cachedFavoritesByObjectId.has(ctx.userId);
if ((w < 20) && (wristFilter[ctx.type]) &&
((wristFilter[ctx.type] === 'Friends') ||
- ((wristFilter[ctx.type] === 'VIP') && (isFavorite)))) {
+ ((wristFilter[ctx.type] === 'VIP') && (isFavorite)))) {
wristArr.push({
...ctx,
isFriend,
@@ -4202,7 +4202,7 @@ speechSynthesis.getVoices();
}
if ((n < 1) && (notyFilter[ctx.type]) &&
((notyFilter[ctx.type] === 'Friends') ||
- ((notyFilter[ctx.type] === 'VIP') && (isFavorite)))) {
+ ((notyFilter[ctx.type] === 'VIP') && (isFavorite)))) {
notyArr.push({
...ctx,
isFriend,
@@ -4248,8 +4248,8 @@ speechSynthesis.getVoices();
var isFavorite = API.cachedFavoritesByObjectId.has(ctx.senderUserId);
if ((w < 20) && (wristFilter[ctx.type]) &&
((wristFilter[ctx.type] === 'On') ||
- (wristFilter[ctx.type] === 'Friends') ||
- ((wristFilter[ctx.type] === 'VIP') && (isFavorite)))) {
+ (wristFilter[ctx.type] === 'Friends') ||
+ ((wristFilter[ctx.type] === 'VIP') && (isFavorite)))) {
wristArr.push({
...ctx,
isFriend,
@@ -4259,8 +4259,8 @@ speechSynthesis.getVoices();
}
if ((n < 1) && (notyFilter[ctx.type]) &&
((notyFilter[ctx.type] === 'On') ||
- (notyFilter[ctx.type] === 'Friends') ||
- ((notyFilter[ctx.type] === 'VIP') && (isFavorite)))) {
+ (notyFilter[ctx.type] === 'Friends') ||
+ ((notyFilter[ctx.type] === 'VIP') && (isFavorite)))) {
notyArr.push({
...ctx,
isFriend,
@@ -4306,8 +4306,8 @@ speechSynthesis.getVoices();
var isFavorite = API.cachedFavoritesByObjectId.has(ctx.userId);
if ((w < 20) && (wristFilter[ctx.type]) &&
((wristFilter[ctx.type] === 'On') ||
- (wristFilter[ctx.type] === 'Friends') ||
- ((wristFilter[ctx.type] === 'VIP') && (isFavorite)))) {
+ (wristFilter[ctx.type] === 'Friends') ||
+ ((wristFilter[ctx.type] === 'VIP') && (isFavorite)))) {
wristArr.push({
...ctx,
isFriend,
@@ -4317,8 +4317,8 @@ speechSynthesis.getVoices();
}
if ((n < 1) && (notyFilter[ctx.type]) &&
((notyFilter[ctx.type] === 'On') ||
- (notyFilter[ctx.type] === 'Friends') ||
- ((notyFilter[ctx.type] === 'VIP') && (isFavorite)))) {
+ (notyFilter[ctx.type] === 'Friends') ||
+ ((notyFilter[ctx.type] === 'VIP') && (isFavorite)))) {
notyArr.push({
...ctx,
isFriend,
@@ -5842,7 +5842,7 @@ speechSynthesis.getVoices();
$app.addFeed('GPS', ref, {
location: [
props.location[0],
- props.location[1]
+ props.location[1]
],
time: props.location[2]
});
@@ -7301,13 +7301,24 @@ speechSynthesis.getVoices();
$app.watch.worldAutoCacheGPSFilter = saveOpenVROption;
$app.watch.autoSweepVRChatCache = saveOpenVROption;
$app.watch.notificationTTS = saveNotificationTTS;
- $app.data.isDarkMode = configRepository.getBool('isDarkMode');
+ $app.data.themeMode = configRepository.getString('VRCX_ThemeMode');
+ if (!$app.data.themeMode) $app.data.themeMode = 'system';
+ var systemIsDarkMode = _ => window.matchMedia('(prefers-color-scheme: dark)').matches;
+ $app.data.isDarkMode = $app.data.themeMode === 'system' ? systemIsDarkMode() : configRepository.getBool('isDarkMode');
$appDarkStyle.disabled = $app.data.isDarkMode === false;
$app.watch.isDarkMode = function () {
configRepository.setBool('isDarkMode', this.isDarkMode);
$appDarkStyle.disabled = this.isDarkMode === false;
this.updateVRConfigVars();
};
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
+ $app._data.isDarkMode = e && e.matches;
+ })
+ $app.watch.themeMode = function () {
+ configRepository.setString('VRCX_ThemeMode', this.themeMode)
+ if (this.themeMode === 'system') this.isDarkMode = systemIsDarkMode();
+ else this.isDarkMode = this.themeMode === 'dark';
+ }
$app.data.isStartAtWindowsStartup = configRepository.getBool('VRCX_StartAtWindowsStartup');
$app.data.isStartAsMinimizedState = (VRCXStorage.Get('VRCX_StartAsMinimizedState') === 'true');
$app.data.isCloseToTray = configRepository.getBool('VRCX_CloseToTray');
@@ -7416,7 +7427,7 @@ speechSynthesis.getVoices();
backgroundColor: 'white',
selectedBackgroundColor: '#409eff',
selectedColor: 'white',
- color: '#409eff',
+ color: '#409eff',
borderColor: '#409eff',
fontWeight: 'bold',
fontFamily: '"Noto Sans JP", "Noto Sans KR", "Meiryo UI", "Malgun Gothic", "Segoe UI", "sans-serif"'
@@ -8270,8 +8281,8 @@ speechSynthesis.getVoices();
for (var ref of API.cachedUsers.values()) {
if (ref.displayName === player) {
users.push(ref);
- break;
- }
+ break;
+ }
}
}
}
@@ -8848,21 +8859,21 @@ speechSynthesis.getVoices();
if (playersInInstance.includes(ref.displayName)) {
instance.users.push(ref);
}
- var friendsInInstance = this.lastLocation.friendList;
- for (var i = 0; i < friendsInInstance.length; i++) {
- var addUser = true;
- var player = friendsInInstance[i];
- for (var k = 0; k < instance.users.length; k++) {
- var user = instance.users[k];
- if (user.displayName === player) {
- addUser = false;
- break;
- }
+ var friendsInInstance = this.lastLocation.friendList;
+ for (var i = 0; i < friendsInInstance.length; i++) {
+ var addUser = true;
+ var player = friendsInInstance[i];
+ for (var k = 0; k < instance.users.length; k++) {
+ var user = instance.users[k];
+ if (user.displayName === player) {
+ addUser = false;
+ break;
}
- if (addUser) {
- for (var ref of API.cachedUsers.values()) {
- if (ref.displayName === player) {
- instance.users.push(ref);
+ }
+ if (addUser) {
+ for (var ref of API.cachedUsers.values()) {
+ if (ref.displayName === player) {
+ instance.users.push(ref);
break;
}
}
@@ -8877,14 +8888,14 @@ speechSynthesis.getVoices();
continue;
}
var { instanceId } = ref.$location;
- var instance = instances[instanceId];
- if (typeof instance === 'undefined') {
- instance = {
- id: instanceId,
- occupants: 0,
- users: []
- };
- instances[instanceId] = instance;
+ var instance = instances[instanceId];
+ if (typeof instance === 'undefined') {
+ instance = {
+ id: instanceId,
+ occupants: 0,
+ users: []
+ };
+ instances[instanceId] = instance;
}
instance.users.push(ref);
}
@@ -8940,12 +8951,12 @@ speechSynthesis.getVoices();
D.loading = true;
API.getWorld({
worldId: D.id
- }).catch((err) => {
- D.loading = false;
- D.visible = false;
- throw err;
- }).then((args) => {
- if (D.id === args.ref.id) {
+ }).catch((err) => {
+ D.loading = false;
+ D.visible = false;
+ throw err;
+ }).then((args) => {
+ if (D.id === args.ref.id) {
D.loading = false;
D.ref = args.ref;
D.isFavorite = API.cachedFavoritesByObjectId.has(D.id);
@@ -8979,36 +8990,36 @@ speechSynthesis.getVoices();
this.$confirm(`Continue? ${command}`, 'Confirm', {
confirmButtonText: 'Confirm',
cancelButtonText: 'Cancel',
- type: 'info',
- callback: (action) => {
- if (action !== 'confirm') {
- return;
- }
- switch (command) {
- case 'Delete Favorite':
- API.deleteFavorite({
- objectId: D.id
- });
- break;
- case 'Make Home':
- API.saveCurrentUser({
- homeLocation: D.id
- }).then((args) => {
- this.$message({
- message: 'Home world updated',
- type: 'success'
+ type: 'info',
+ callback: (action) => {
+ if (action !== 'confirm') {
+ return;
+ }
+ switch (command) {
+ case 'Delete Favorite':
+ API.deleteFavorite({
+ objectId: D.id
});
- return args;
- });
- break;
- case 'Reset Home':
- API.saveCurrentUser({
- homeLocation: ''
- }).then((args) => {
- this.$message({
- message: 'Home world has been reset',
- type: 'success'
+ break;
+ case 'Make Home':
+ API.saveCurrentUser({
+ homeLocation: D.id
+ }).then((args) => {
+ this.$message({
+ message: 'Home world updated',
+ type: 'success'
+ });
+ return args;
});
+ break;
+ case 'Reset Home':
+ API.saveCurrentUser({
+ homeLocation: ''
+ }).then((args) => {
+ this.$message({
+ message: 'Home world has been reset',
+ type: 'success'
+ });
return args;
});
break;
@@ -9232,25 +9243,25 @@ speechSynthesis.getVoices();
this.$confirm(`Continue? ${command}`, 'Confirm', {
confirmButtonText: 'Confirm',
cancelButtonText: 'Cancel',
- type: 'info',
- callback: (action) => {
- if (action !== 'confirm') {
- return;
- }
- switch (command) {
- case 'Delete Favorite':
- API.deleteFavorite({
- objectId: D.id
- });
- break;
- case 'Select Avatar':
- API.selectAvatar({
- avatarId: D.id
- }).then((args) => {
- this.$message({
- message: 'Avatar changed',
- type: 'success'
+ type: 'info',
+ callback: (action) => {
+ if (action !== 'confirm') {
+ return;
+ }
+ switch (command) {
+ case 'Delete Favorite':
+ API.deleteFavorite({
+ objectId: D.id
});
+ break;
+ case 'Select Avatar':
+ API.selectAvatar({
+ avatarId: D.id
+ }).then((args) => {
+ this.$message({
+ message: 'Avatar changed',
+ type: 'success'
+ });
return args;
});
break;
@@ -9268,24 +9279,24 @@ speechSynthesis.getVoices();
case 'Make Public':
API.saveAvatar({
id: D.id,
- releaseStatus: 'public'
- }).then((args) => {
- this.$message({
- message: 'Avatar updated to public',
- type: 'success'
- });
- return args;
- });
- break;
- case 'Make Private':
- API.saveAvatar({
- id: D.id,
- releaseStatus: 'private'
- }).then((args) => {
- this.$message({
- message: 'Avatar updated to private',
- type: 'success'
+ releaseStatus: 'public'
+ }).then((args) => {
+ this.$message({
+ message: 'Avatar updated to public',
+ type: 'success'
+ });
+ return args;
});
+ break;
+ case 'Make Private':
+ API.saveAvatar({
+ id: D.id,
+ releaseStatus: 'private'
+ }).then((args) => {
+ this.$message({
+ message: 'Avatar updated to private',
+ type: 'success'
+ });
return args;
});
break;
@@ -9338,22 +9349,22 @@ speechSynthesis.getVoices();
if (ownerId === refUserId) {
this.$message({
message: 'It\'s personal (own) avatar',
+ type: 'warning'
+ });
+ return;
+ }
+ this.showUserDialog(ownerId);
+ } else {
+ API.getAvatarImages({fileId}).then((args) => {
+ var ownerId = args.json.ownerId;
+ if (ownerId === refUserId) {
+ this.$message({
+ message: 'It\'s personal (own) avatar',
type: 'warning'
});
return;
}
this.showUserDialog(ownerId);
- } else {
- API.getAvatarImages({fileId}).then((args) => {
- var ownerId = args.json.ownerId;
- if (ownerId === refUserId) {
- this.$message({
- message: 'It\'s personal (own) avatar',
- type: 'warning'
- });
- return;
- }
- this.showUserDialog(ownerId);
});
}
};
@@ -12157,7 +12168,7 @@ speechSynthesis.getVoices();
(feed.location === 'offline') ||
(feed.location === 'private') ||
((!this.worldAutoCacheGPSFilter) &&
- (!API.cachedFavoritesByObjectId.has(feed.id)))) {
+ (!API.cachedFavoritesByObjectId.has(feed.id)))) {
return;
}
this.autoDownloadWorldCache(feed.location, 'GPS', feed.id);
diff --git a/html/src/index.pug b/html/src/index.pug
index f9ffaf31..b5081d05 100644
--- a/html/src/index.pug
+++ b/html/src/index.pug
@@ -725,8 +725,11 @@ html
div.options-container
span.header Appearance
div.options-container-item
- span.name Dark Mode
- el-switch(v-model="isDarkMode")
+ span.name Theme mode
+ el-radio-group(v-model="themeMode" size="mini")
+ el-radio-button(label="system") System
+ el-radio-button(label="light") Light
+ el-radio-button(label="dark") Dark
div.options-container-item
span.name Profile Picture Override
el-switch(v-model="displayProfilePicOverrideAsAvatar")