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 @@
-
+ @@ -65,7 +65,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 @@