diff --git a/src/app.css b/src/app.css index da781610b..76f1544dc 100644 --- a/src/app.css +++ b/src/app.css @@ -29,26 +29,18 @@ } @theme { - --spacing-control: 26px; - --spacing-panel-x: 12px; - --spacing-panel-y: 8px; - --spacing-panel: 6px; - --spacing-panel-rail: 26px; - --spacing-panel-icon: 14px; - --radius-panel: 4px; - --color-panel: #2a2a2a; --color-panel-secondary: #242424; - --color-panel-field: #333333; - --color-panel-field-hover: #3b3b3b; - --color-panel-focus: #4c8dff; - --color-panel-selected: #0d64d8; - --color-panel-selected-muted: #344054; + --color-panel-field: transparent; + --color-panel-field-hover: #383838; + --color-panel-focus: #3b82f6; + --color-panel-selected: #2f6fdd; + --color-panel-selected-muted: #3d4450; --color-canvas: #1e1e1e; --color-border: #3a3a3a; --color-hover: #353535; --color-accent: #3b82f6; - --color-surface: #e0e0e0; + --color-surface: #f0f0f0; --color-muted: #888888; --color-input: #1e1e1e; --color-component: #9747ff; @@ -76,16 +68,16 @@ html[data-theme='light'] { --color-panel: #ffffff; --color-panel-secondary: #f7f8fa; - --color-panel-field: #f0f1f3; - --color-panel-field-hover: #e7e9ed; + --color-panel-field: transparent; + --color-panel-field-hover: #eceef1; --color-panel-focus: #2563eb; - --color-panel-selected: #dbeafe; + --color-panel-selected: #2563eb; --color-panel-selected-muted: #e5e7eb; --color-canvas: #f3f4f6; --color-border: #d8dce3; --color-hover: #eef1f5; --color-accent: #2563eb; - --color-surface: #202124; + --color-surface: #1f2328; --color-muted: #6b7280; --color-input: #ffffff; --color-component: #7c3aed; @@ -104,9 +96,9 @@ html[data-theme='light'] { --color-code-punctuation: #64748b; --color-checkerboard: #d1d5db; --color-checkerboard-muted: #e5e7eb; - --color-ruler-bg: rgb(229, 231, 235); - --color-ruler-tick: rgb(148, 163, 184); - --color-ruler-text: rgb(100, 116, 139); + --color-ruler-bg: rgb(250, 250, 251); + --color-ruler-tick: rgb(163, 171, 182); + --color-ruler-text: rgb(90, 99, 112); --color-ruler-label: rgb(255, 255, 255); } diff --git a/src/app/editor/active-store/index.ts b/src/app/editor/active-store/index.ts index 1b0681103..e69989199 100644 --- a/src/app/editor/active-store/index.ts +++ b/src/app/editor/active-store/index.ts @@ -6,6 +6,10 @@ export type { EditorStore } const storeRef = shallowRef() +export function useActiveEditorStoreRef() { + return storeRef +} + export function setActiveEditorStore(store: EditorStore) { storeRef.value = store triggerRef(storeRef) diff --git a/src/app/shell/theme.ts b/src/app/shell/theme.ts index dc7659b2a..a5f3e61b1 100644 --- a/src/app/shell/theme.ts +++ b/src/app/shell/theme.ts @@ -5,7 +5,7 @@ import type { RulerTheme } from '@open-pencil/core/canvas' import { parseColor } from '@open-pencil/core/color' import { IS_BROWSER } from '@open-pencil/core/constants' -import { getActiveEditorStoreOrNull } from '@/app/editor/active-store' +import { getActiveEditorStoreOrNull, useActiveEditorStoreRef } from '@/app/editor/active-store' export type AppTheme = 'dark' | 'light' | 'auto' @@ -51,6 +51,11 @@ export function useAppTheme() { immediate: true }) + // Editors may mount after the theme was applied; push the canvas (ruler) + // theme whenever the active editor changes so rulers always match. + const activeStoreRef = useActiveEditorStoreRef() + watch([activeStoreRef, resolvedTheme], () => updateCanvasTheme(), { flush: 'post' }) + const isLight = computed(() => resolvedTheme.value === 'light') function setTheme(value: AppTheme): void { diff --git a/src/components/AssetsPanel.vue b/src/components/AssetsPanel.vue index 22a417733..7a62fff1f 100644 --- a/src/components/AssetsPanel.vue +++ b/src/components/AssetsPanel.vue @@ -171,7 +171,7 @@ function insertSelectedAsset() {