diff --git a/apps/desktop/index.html b/apps/desktop/index.html index 7a8f9addb..18f30f8c0 100644 --- a/apps/desktop/index.html +++ b/apps/desktop/index.html @@ -22,10 +22,12 @@ (() => { const root = document.documentElement; let mode = null; + let cornerStyle = null; // localStorage can throw when WebView storage is unavailable; keep the existing light fallback. try { mode = localStorage.getItem("dbx-theme"); + cornerStyle = localStorage.getItem("dbx-corner-style"); } catch {} const followsSystem = mode === "system" || mode === "soft-system"; @@ -40,6 +42,7 @@ } root.classList.toggle("dark", dark); + root.dataset.cornerStyle = cornerStyle === "none" || cornerStyle === "large" ? cornerStyle : "small"; root.style.colorScheme = dark ? "dark" : "light"; })(); diff --git a/apps/desktop/src/components/common/JsonTree.vue b/apps/desktop/src/components/common/JsonTree.vue index 718a49057..0fefff14f 100644 --- a/apps/desktop/src/components/common/JsonTree.vue +++ b/apps/desktop/src/components/common/JsonTree.vue @@ -241,7 +241,7 @@ defineExpose({ expandAll, collapseAll, resetExpansion, refresh }); min-height: 24px; align-items: flex-start; gap: 4px; - border-radius: 4px; + border-radius: var(--dbx-radius-fixed-4); } .json-tree-row:hover { diff --git a/apps/desktop/src/components/config/DriverStoreDialog.vue b/apps/desktop/src/components/config/DriverStoreDialog.vue index 146d9b156..ab86e40e8 100644 --- a/apps/desktop/src/components/config/DriverStoreDialog.vue +++ b/apps/desktop/src/components/config/DriverStoreDialog.vue @@ -1196,7 +1196,7 @@ watch(driverStoreTab, (tab) => {
{{ t("settings.updateDownloadSource") }}
- - @@ -1219,7 +1219,7 @@ watch(driverStoreTab, (tab) => { -
+
- - @@ -1499,7 +1499,7 @@ watch(driverStoreTab, (tab) => { -
-
+
{{ t("common.loading") }}
@@ -1530,7 +1530,7 @@ watch(driverStoreTab, (tab) => {
{{ item.subtitle }}
{{ formatBytes(item.size) }}
-
@@ -1541,14 +1541,14 @@ watch(driverStoreTab, (tab) => { -
+
{{ t("driverStore.usageTitle") }}
{{ usageSummary.length ? t("driverStore.usageTotal", { size: formatBytes(usageSummary[0].bytes) }) : t("driverStore.calculating") }}
-
-
+
{{ t("driverStore.driverStoreDir") }}

{{ t("driverStore.driverStoreDirDescription") }}

@@ -1604,7 +1604,7 @@ watch(driverStoreTab, (tab) => {
-
+
{{ t("driverStore.offlineDownloadHint") }} @@ -1617,7 +1617,7 @@ watch(driverStoreTab, (tab) => {
-
+
@@ -1633,7 +1633,7 @@ watch(driverStoreTab, (tab) => {
-
@@ -1705,10 +1705,10 @@ watch(driverStoreTab, (tab) => { {{ formatRuntimeUptime(runtime.uptime_seconds) }}
- - @@ -1734,7 +1734,7 @@ watch(driverStoreTab, (tab) => { .driver-store-focus-highlight { background-color: hsl(var(--primary) / 0.08); box-shadow: inset 0 0 0 1.5px hsl(var(--primary) / 0.45); - border-radius: 8px; + border-radius: var(--dbx-radius-fixed-6); } .driver-store-view, diff --git a/apps/desktop/src/components/document/DocumentBrowser.vue b/apps/desktop/src/components/document/DocumentBrowser.vue index c67a9f05d..6c21a0b4f 100644 --- a/apps/desktop/src/components/document/DocumentBrowser.vue +++ b/apps/desktop/src/components/document/DocumentBrowser.vue @@ -1491,7 +1491,7 @@ defineExpose({ focusSearch }); {{ dataGridRef?.visibleColumnCount }}/{{ dataGridRef?.displayableColumnCount }} - +
{{ t("grid.columnVisibility") }}
@@ -1536,7 +1536,7 @@ defineExpose({ focusSearch }); - +
{{ t("grid.viewOptions") }}
@@ -1984,7 +1984,7 @@ defineExpose({ focusSearch }); min-height: 0; resize: none; border: 1px solid var(--border); - border-radius: 8px; + border-radius: var(--dbx-radius-fixed-4); background: var(--background); color: var(--foreground); padding: 14px 16px; diff --git a/apps/desktop/src/components/document/JsonEditNode.vue b/apps/desktop/src/components/document/JsonEditNode.vue index 4fc714ff6..aa61e87ff 100644 --- a/apps/desktop/src/components/document/JsonEditNode.vue +++ b/apps/desktop/src/components/document/JsonEditNode.vue @@ -200,7 +200,7 @@ function confirmRemoveChild() { border: 1px solid var(--border); border: 1px solid color-mix(in oklab, var(--border) 82%, transparent); border-left-width: 3px; - border-radius: 8px; + border-radius: var(--dbx-radius-fixed-6); background: var(--muted); background: color-mix(in oklab, var(--background) 76%, var(--muted)); } @@ -227,7 +227,7 @@ function confirmRemoveChild() { width: 100%; min-width: 0; border: 0; - border-radius: 4px; + border-radius: var(--dbx-radius-fixed-4); background: transparent; color: inherit; font: inherit; @@ -264,7 +264,7 @@ function confirmRemoveChild() { min-height: 42px; resize: vertical; border: 1px solid var(--border); - border-radius: 6px; + border-radius: var(--dbx-radius-fixed-6); background: var(--background); padding: 5px 8px; font: inherit; diff --git a/apps/desktop/src/components/document/MongoBucketBrowser.vue b/apps/desktop/src/components/document/MongoBucketBrowser.vue index 4b23cdcf4..aac92140d 100644 --- a/apps/desktop/src/components/document/MongoBucketBrowser.vue +++ b/apps/desktop/src/components/document/MongoBucketBrowser.vue @@ -431,7 +431,7 @@ watch(
-
+
diff --git a/apps/desktop/src/components/document/MongoGridFsBrowser.vue b/apps/desktop/src/components/document/MongoGridFsBrowser.vue index ec5f917ce..6e92d0e35 100644 --- a/apps/desktop/src/components/document/MongoGridFsBrowser.vue +++ b/apps/desktop/src/components/document/MongoGridFsBrowser.vue @@ -178,7 +178,7 @@ onMounted(() => {
-
+
diff --git a/apps/desktop/src/components/editor/EditorSearchPanel.vue b/apps/desktop/src/components/editor/EditorSearchPanel.vue index 0a037f1ba..f855d5d46 100644 --- a/apps/desktop/src/components/editor/EditorSearchPanel.vue +++ b/apps/desktop/src/components/editor/EditorSearchPanel.vue @@ -493,7 +493,7 @@ defineExpose({ .editor-search-panel--editor { background: #f6f7f9; border-color: #d8dce3; - border-radius: 6px; + border-radius: var(--dbx-radius-fixed-6); box-shadow: 0 8px 22px rgb(15 23 42 / 0.14), 0 1px 0 rgb(255 255 255 / 0.78) inset; @@ -537,7 +537,7 @@ defineExpose({ .editor-search-panel--editor :deep(.border-input) { background: #ffffff; border-color: #c7ccd5; - border-radius: 5px; + border-radius: var(--dbx-radius-fixed-5); box-shadow: 0 1px 0 rgb(15 23 42 / 0.03) inset; } diff --git a/apps/desktop/src/components/editor/EditorSettingsDialog.vue b/apps/desktop/src/components/editor/EditorSettingsDialog.vue index 56b1966e7..d04a49276 100644 --- a/apps/desktop/src/components/editor/EditorSettingsDialog.vue +++ b/apps/desktop/src/components/editor/EditorSettingsDialog.vue @@ -112,7 +112,7 @@ import ChangelogPanel from "@/components/settings/ChangelogPanel.vue"; import McpConnectionScopePicker from "@/components/settings/McpConnectionScopePicker.vue"; import ScheduledDatabaseBackupSettings from "@/components/backup/ScheduledDatabaseBackupSettings.vue"; import SqlFormatterSettingsPanel from "./SqlFormatterSettingsPanel.vue"; -import { APP_THEME_PALETTES, type AppThemeAppearance, type AppThemeMode, type AppThemePalette } from "@/lib/app/appTheme"; +import { APP_THEME_PALETTES, type AppCornerStyle, type AppThemeAppearance, type AppThemeMode, type AppThemePalette } from "@/lib/app/appTheme"; import { editorSettingsDraftChanged, editorSettingsDraftFromSettings, editorSettingsPatchFromDraft, normalizeTableOpenPageSizeDraft, type EditorSettingsDraft } from "@/lib/settings/editorSettingsDraft"; import { useConnectionStore } from "@/stores/connectionStore"; import { useSavedSqlStore } from "@/stores/savedSqlStore"; @@ -137,7 +137,7 @@ const connectionStore = useConnectionStore(); const savedSqlStore = useSavedSqlStore(); const promptTemplateStore = usePromptTemplateStore(); const tunnelProfileStore = useTunnelProfileStore(); -const { isDark, themeMode, themePalette, setThemeMode, setThemePalette } = useTheme(); +const { isDark, themeMode, themePalette, cornerStyle, setThemeMode, setThemePalette, setCornerStyle } = useTheme(); const appThemePaletteOptions = computed( (): Array<{ value: AppThemePalette; label: string; previewColor: string }> => @@ -154,6 +154,11 @@ const appThemeModeOptions = computed(() => [ { value: "dark" as AppThemeMode, label: t("toolbar.themeDark"), icon: Moon }, { value: "system" as AppThemeMode, label: t("toolbar.themeSystem"), icon: SunMoon }, ]); +const appCornerStyleOptions = computed(() => [ + { value: "none" as AppCornerStyle, label: t("settings.cornerStyleNone"), previewRadius: "0px" }, + { value: "small" as AppCornerStyle, label: t("settings.cornerStyleSmall"), previewRadius: "4px" }, + { value: "large" as AppCornerStyle, label: t("settings.cornerStyleLarge"), previewRadius: "10px" }, +]); const props = defineProps<{ open?: boolean; @@ -3630,22 +3635,43 @@ onUnmounted(cleanupPreviewEditor);
-
- -
- +
+
+ +
+ +
+
+ +
+ +
+ +
@@ -5855,12 +5881,19 @@ onUnmounted(cleanupPreviewEditor); gap: 0.625rem; } +.settings-appearance-theme-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.75rem; +} + .settings-option-stack > * + * { margin-top: 0.625rem; } @media (max-width: 760px) { .settings-appearance-top-grid, + .settings-appearance-theme-grid, .settings-appearance-choice-grid { grid-template-columns: 1fr; } diff --git a/apps/desktop/src/components/editor/QueryEditor.vue b/apps/desktop/src/components/editor/QueryEditor.vue index 5687195b6..0364af57f 100644 --- a/apps/desktop/src/components/editor/QueryEditor.vue +++ b/apps/desktop/src/components/editor/QueryEditor.vue @@ -4370,7 +4370,7 @@ defineExpose({ margin: 0; padding: 0; border: 1px solid transparent; - border-radius: 6px; + border-radius: var(--dbx-radius-fixed-6); vertical-align: middle; white-space: nowrap; transition: @@ -4417,7 +4417,7 @@ defineExpose({ margin: 0; padding: 0; border: 1px solid transparent; - border-radius: 6px; + border-radius: var(--dbx-radius-fixed-6); background: transparent; color: transparent; vertical-align: middle; diff --git a/apps/desktop/src/components/editor/__tests__/EditorSearchPanel.spec.ts b/apps/desktop/src/components/editor/__tests__/EditorSearchPanel.spec.ts new file mode 100644 index 000000000..881437181 --- /dev/null +++ b/apps/desktop/src/components/editor/__tests__/EditorSearchPanel.spec.ts @@ -0,0 +1,10 @@ +import { readFileSync } from "node:fs"; +import { describe, expect, it } from "vitest"; + +const editorSearchPanelSource = readFileSync(new URL("../EditorSearchPanel.vue", import.meta.url), "utf8"); + +describe("EditorSearchPanel corner style", () => { + it("uses the configurable five-pixel radius token for editor inputs", () => { + expect(editorSearchPanelSource).toContain("border-radius: var(--dbx-radius-fixed-5);"); + }); +}); diff --git a/apps/desktop/src/components/grid/DataGrid.vue b/apps/desktop/src/components/grid/DataGrid.vue index 8bb21a851..e364b9830 100644 --- a/apps/desktop/src/components/grid/DataGrid.vue +++ b/apps/desktop/src/components/grid/DataGrid.vue @@ -4870,7 +4870,7 @@ const canvasDetailButtonStyle = computed(() => { const edgeGap = 6; return { left: `${Math.max(DATA_GRID_ROW_NUM_WIDTH, cell.rect.left + cell.rect.width - actionWidth - edgeGap)}px`, - top: `${cell.rect.top + 2}px`, + top: `${cell.rect.top + cell.rect.height / 2}px`, }; }); @@ -7851,7 +7851,7 @@ const gridContextMenuItems = computed(() => { {{ draftCellPlaceholder(displayItems[cell.recordIndex], cell.valueIndex) }} -
+
(() => { - +
{{ t("grid.columnFormatterFor", { column: col.name }) }} @@ -8181,7 +8181,7 @@ const gridContextMenuItems = computed(() => { - +
{{ columnFilterPanelTitle(col.name) }}
@@ -8347,7 +8347,7 @@ const gridContextMenuItems = computed(() => { @paste.stop="onCellEditTextareaPaste" />
-
+
(() => { {{ draftCellPlaceholder(item, col.actualColIdx) }} -
+
(() => {
-
+
{{ formatElapsedSeconds(loadingElapsed) }}s
@@ -9508,7 +9508,7 @@ const gridContextMenuItems = computed(() => { background-color: var(--background); background-color: color-mix(in oklab, var(--background) 96%, var(--primary) 4%); border: 1px solid color-mix(in oklab, var(--primary) 62%, var(--border)); - border-radius: 6px; + border-radius: var(--dbx-radius-fixed-6); z-index: 90; box-shadow: 0 28px 72px rgb(0 0 0 / 34%), diff --git a/apps/desktop/src/components/grid/ImagePreviewDialog.vue b/apps/desktop/src/components/grid/ImagePreviewDialog.vue index 973535c5f..8fb807fdf 100644 --- a/apps/desktop/src/components/grid/ImagePreviewDialog.vue +++ b/apps/desktop/src/components/grid/ImagePreviewDialog.vue @@ -184,7 +184,7 @@ onUnmounted(() => { :show-close-button="false" overlay-class="!z-[80]" portal-class="!z-[81]" - class="image-preview-dialog !flex !max-w-[92vw] flex-col gap-0 overflow-hidden rounded-xl border-white/10 bg-[#090b0f] p-0 text-white shadow-2xl sm:!max-w-[92vw]" + class="image-preview-dialog !flex !max-w-[92vw] flex-col gap-0 overflow-hidden rounded-lg border-white/10 bg-[#090b0f] p-0 text-white shadow-2xl sm:!max-w-[92vw]" :style="dialogStyle" @escape-key-down="close" > diff --git a/apps/desktop/src/components/grid/LayerPreviewDialog.vue b/apps/desktop/src/components/grid/LayerPreviewDialog.vue index 0e665ee36..f5790132e 100644 --- a/apps/desktop/src/components/grid/LayerPreviewDialog.vue +++ b/apps/desktop/src/components/grid/LayerPreviewDialog.vue @@ -436,7 +436,7 @@ onBeforeUnmount(() => cleanupMap());