diff --git a/package-lock.json b/package-lock.json
index acdcbd1b..ebe1efcd 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13278,8 +13278,7 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
@@ -18488,4 +18487,4 @@
}
}
}
-}
+}
\ No newline at end of file
diff --git a/src/components/NavMenu.vue b/src/components/NavMenu.vue
index fe67d4a2..d1dd25d0 100644
--- a/src/components/NavMenu.vue
+++ b/src/components/NavMenu.vue
@@ -186,12 +186,37 @@
-
- {{ t('view.settings.appearance.appearance.compact_table_mode') }}
-
+
+
+ {{ t('view.settings.appearance.appearance.table_density') }}
+
+
+
+ {{
+ t('view.settings.appearance.appearance.table_density_standard')
+ }}
+
+
+ {{
+ t('view.settings.appearance.appearance.table_density_comfortable')
+ }}
+
+
+ {{
+ t('view.settings.appearance.appearance.table_density_compact')
+ }}
+
+
+
{{ t('nav_menu.custom_nav.header') }}
@@ -329,12 +354,7 @@
const { directAccessPaste } = useSearchStore();
const { logout } = useAuthStore();
const appearanceSettingsStore = useAppearanceSettingsStore();
- const {
- themeMode,
- compactTableMode,
- isDarkMode,
- isNavCollapsed: isCollapsed
- } = storeToRefs(appearanceSettingsStore);
+ const { themeMode, tableDensity, isDarkMode, isNavCollapsed: isCollapsed } = storeToRefs(appearanceSettingsStore);
const navLayout = ref([]);
const navLayoutReady = ref(false);
@@ -517,8 +537,8 @@
appearanceSettingsStore.setThemeMode(isDarkMode.value ? 'light' : 'dark');
};
- const handleCompactModeToggle = () => {
- appearanceSettingsStore.setCompactTableMode();
+ const handleTableDensitySelect = (density) => {
+ appearanceSettingsStore.setTableDensity(density);
};
const handleThemeColorSelect = async (theme) => {
diff --git a/src/components/ui/data-table/DataTableLayout.vue b/src/components/ui/data-table/DataTableLayout.vue
index dc4f9fec..bae06017 100644
--- a/src/components/ui/data-table/DataTableLayout.vue
+++ b/src/components/ui/data-table/DataTableLayout.vue
@@ -5,7 +5,7 @@
@@ -124,6 +124,7 @@
PaginationPrevious
} from '../pagination';
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../table';
+ import { ScrollArea } from '../scroll-area';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../select';
const props = defineProps({
@@ -271,7 +272,6 @@
const meta = columnDef?.meta ?? {};
const pinned = getPinnedState(cell?.column);
return joinClasses(
- 'py-1.5',
pinned && 'sticky bg-background z-20',
isSpacer(cell.column) && 'p-0',
resolveClassValue(meta.class, cell?.getContext?.()),
diff --git a/src/components/ui/table/TableCell.vue b/src/components/ui/table/TableCell.vue
index 329b8635..4d8d121b 100644
--- a/src/components/ui/table/TableCell.vue
+++ b/src/components/ui/table/TableCell.vue
@@ -11,7 +11,7 @@
data-slot="table-cell"
:class="
cn(
- 'p-2 align-middle whitespace-nowrap in-[.is-compact-table]:py-1! [&:has([role=checkbox])]:pr-0 *:[[role=checkbox]]:translate-y-0.5',
+ 'p-2 align-middle whitespace-nowrap in-[.is-compact-table]:py-1! in-[.is-comfortable-table]:py-1.5! [&:has([role=checkbox])]:pr-0 *:[[role=checkbox]]:translate-y-0.5',
props.class
)
">
diff --git a/src/localization/en.json b/src/localization/en.json
index d0392f6c..ab503fd5 100644
--- a/src/localization/en.json
+++ b/src/localization/en.json
@@ -579,7 +579,10 @@
"table_page_sizes": "Table Page Sizes",
"table_page_sizes_error": "Page size must be a number between 1 and 1000",
"show_notification_icon_dot": "Show Tray Notification Dot",
- "compact_table_mode": "Compact Mode"
+ "table_density": "Table Density",
+ "table_density_standard": "Standard",
+ "table_density_comfortable": "Comfortable",
+ "table_density_compact": "Compact"
},
"timedate": {
"header": "Time/Date",
diff --git a/src/localization/zh-CN.json b/src/localization/zh-CN.json
index 3a5167e4..731caf65 100644
--- a/src/localization/zh-CN.json
+++ b/src/localization/zh-CN.json
@@ -572,8 +572,7 @@
"table_max_size": "最大显示记录",
"table_page_sizes": "显示记录大小",
"table_page_sizes_error": "记录大小必须是 1 到 1000 之间的数字",
- "show_notification_icon_dot": "显示托盘通知",
- "compact_table_mode": "紧凑模式"
+ "show_notification_icon_dot": "显示托盘通知"
},
"timedate": {
"header": "时间 / 日期",
diff --git a/src/localization/zh-TW.json b/src/localization/zh-TW.json
index db609c02..7048f157 100644
--- a/src/localization/zh-TW.json
+++ b/src/localization/zh-TW.json
@@ -573,8 +573,7 @@
"table_max_size": "表格大小",
"table_page_sizes": "表格每頁筆數",
"table_page_sizes_error": "每頁筆數必須是 1 到 1000 之間的數字",
- "show_notification_icon_dot": "顯示通知圖示提示點",
- "compact_table_mode": "精簡模式"
+ "show_notification_icon_dot": "顯示通知圖示提示點"
},
"timedate": {
"header": "時間 / 日期",
diff --git a/src/stores/settings/appearance.js b/src/stores/settings/appearance.js
index 6e95c539..3fc185d6 100644
--- a/src/stores/settings/appearance.js
+++ b/src/stores/settings/appearance.js
@@ -73,7 +73,7 @@ export const useAppearanceSettingsStore = defineStore(
const hideUserMemos = ref(false);
const hideUnfriends = ref(false);
const randomUserColours = ref(false);
- const compactTableMode = ref(false);
+ const tableDensity = ref('standard');
const TRUST_COLOR_DEFAULTS = Object.freeze({
untrusted: '#CCCCCC',
basic: '#1778FF',
@@ -126,6 +126,7 @@ export const useAppearanceSettingsStore = defineStore(
hideUserMemosConfig,
hideUnfriendsConfig,
randomUserColoursConfig,
+ tableDensityConfig,
compactTableModeConfig,
trustColorConfig,
notificationIconDotConfig,
@@ -177,6 +178,7 @@ export const useAppearanceSettingsStore = defineStore(
configRepository.getBool('VRCX_hideUserMemos', false),
configRepository.getBool('VRCX_hideUnfriends', false),
configRepository.getBool('VRCX_randomUserColours', false),
+ configRepository.getString('VRCX_tableDensity'),
configRepository.getBool('VRCX_compactTableMode', false),
configRepository.getString(
'VRCX_trustColor',
@@ -250,8 +252,18 @@ export const useAppearanceSettingsStore = defineStore(
hideUnfriends.value = hideUnfriendsConfig;
randomUserColours.value = randomUserColoursConfig;
notificationIconDot.value = notificationIconDotConfig;
- compactTableMode.value = compactTableModeConfig;
- applyCompactTableMode(compactTableMode.value);
+ const resolvedTableDensity = normalizeTableDensity(
+ tableDensityConfig ||
+ (compactTableModeConfig ? 'compact' : 'standard')
+ );
+ tableDensity.value = resolvedTableDensity;
+ applyTableDensity(tableDensity.value);
+ if (!tableDensityConfig) {
+ configRepository.setString(
+ 'VRCX_tableDensity',
+ tableDensity.value
+ );
+ }
isNavCollapsed.value = navIsCollapsedConfig;
await configRepository.remove('VRCX_navWidth');
@@ -649,13 +661,22 @@ export const useAppearanceSettingsStore = defineStore(
randomUserColours.value
);
}
- function setCompactTableMode() {
- compactTableMode.value = !compactTableMode.value;
- applyCompactTableMode(compactTableMode.value);
- configRepository.setBool(
- 'VRCX_compactTableMode',
- compactTableMode.value
- );
+ function normalizeTableDensity(value) {
+ if (
+ value === 'compact' ||
+ value === 'comfortable' ||
+ value === 'standard'
+ ) {
+ return value;
+ }
+ return 'standard';
+ }
+
+ function setTableDensity(density) {
+ const normalized = normalizeTableDensity(density);
+ tableDensity.value = normalized;
+ applyTableDensity(tableDensity.value);
+ configRepository.setString('VRCX_tableDensity', tableDensity.value);
}
/**
* @param {object} color
@@ -784,12 +805,14 @@ export const useAppearanceSettingsStore = defineStore(
await userColourInit();
}
- function applyCompactTableMode(isCompact) {
- const className = 'is-compact-table';
- if (isCompact) {
- document.documentElement.classList.add(className);
- } else {
- document.documentElement.classList.remove(className);
+ function applyTableDensity(density) {
+ const classList = document.documentElement.classList;
+ classList.remove('is-compact-table', 'is-comfortable-table');
+ if (density === 'compact') {
+ classList.add('is-compact-table');
+ }
+ if (density === 'comfortable') {
+ classList.add('is-comfortable-table');
}
}
@@ -820,7 +843,7 @@ export const useAppearanceSettingsStore = defineStore(
hideUserMemos,
hideUnfriends,
randomUserColours,
- compactTableMode,
+ tableDensity,
trustColor,
currentCulture,
isSideBarTabShow,
@@ -851,7 +874,7 @@ export const useAppearanceSettingsStore = defineStore(
setHideUserMemos,
setHideUnfriends,
setRandomUserColours,
- setCompactTableMode,
+ setTableDensity,
setTrustColor,
tryInitUserColours,
updateTrustColor,
@@ -860,7 +883,7 @@ export const useAppearanceSettingsStore = defineStore(
changeAppLanguage,
promptMaxTableSizeDialog,
setNotificationIconDot,
- applyCompactTableMode,
+ applyTableDensity,
setNavCollapsed,
toggleNavCollapsed,
setThemeMode
diff --git a/src/views/Layout/AuthenticatedLayout.vue b/src/views/Layout/AuthenticatedLayout.vue
index 5fe982e7..f53bfad2 100644
--- a/src/views/Layout/AuthenticatedLayout.vue
+++ b/src/views/Layout/AuthenticatedLayout.vue
@@ -3,7 +3,7 @@