diff --git a/eslint.config.ts b/eslint.config.ts index 0bc70372f1..c7019b8624 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -131,8 +131,12 @@ export default defineConfig([ 'no-console': ['error', { allow: ['warn', 'error'] }], 'tailwindcss/no-custom-classname': 'off', // TODO: fix 'vue/no-v-html': 'off', - // Enforce dark-theme: instead of dark: prefix - 'vue/no-restricted-class': ['error', '/^dark:/'], + // Enforce semantic CSS tokens: + 'vue/no-restricted-class': [ + 'error', + '/^dark:/', + '/^(bg|text|border|fill|stroke)-\\[#/' + ], 'vue/multi-word-component-names': 'off', // TODO: fix 'vue/no-template-shadow': 'off', // TODO: fix 'vue/match-component-import-name': 'error', diff --git a/packages/design-system/src/css/style.css b/packages/design-system/src/css/style.css index c1cb42ce55..4b95f2a895 100644 --- a/packages/design-system/src/css/style.css +++ b/packages/design-system/src/css/style.css @@ -200,6 +200,81 @@ --text-secondary: var(--color-stone-100); --text-primary: var(--color-charcoal-700); --input-surface: rgba(0, 0, 0, 0.15); + + /* Semantic tokens from tokens.csv - Light Mode */ + --text-contrast: var(--color-pure-white); + --text-danger-error: var(--color-danger-200); + --text-warning: var(--color-warning-200); + --text-success: var(--color-success-200); + --text-blue: var(--color-blue-100); + --text-highlight: var(--color-blue-selection); + --accent-secondary: var(--color-stone-100); + --accent-contrast: var(--color-pure-white); + --accent-danger-error: var(--color-danger-200); + --accent-warning: var(--color-warning-200); + --accent-success: var(--color-success-200); + --accent-blue: var(--color-blue-100); + --accent-white: var(--color-pure-white); + --button-surface: var(--color-gray-100); + --button-surface-hovered: var(--color-gray-300); + --button-surface-danger: var(--color-danger-200); + --button-surface-blue: var(--color-blue-200); + --button-surface-contrast: var(--color-pure-black); + --button-bkg-secondary: var(--color-gray-400); + --button-bkg-info: var(--color-slate-100); + --button-icon: var(--color-stone-200); + --button-icon-disabled: var(--color-alpha-gray-500-50); + --interface-canvas-background: var(--color-gray-400); + --interface-icon: var(--color-slate-100); + --interface-panel-component-surface-hovered: var(--color-gray-200); + --interface-panel-component-surface-selected: var(--color-gray-400); + --interface-panel-card-surface: var(--color-gray-100); + --interface-panel-card-surface-hover: var(--color-gray-200); + --interface-panel-job-progress-primary: var(--color-blue-400); + --interface-panel-job-progress-secondary: var(--color-blue-selection); + --interface-menu-surface: var(--color-pure-white); + --interface-menu-stroke: var(--color-gray-400); + --interface-menu-keybind-surface-blue: var(--color-blue-400); + --interface-workflow-tab-surface: var(--color-gray-300); + --interface-workflow-tab-surface-active: var(--color-interface-panel-surface); + --interface-workflow-tab-surface-hovered: var(--color-gray-100); + --interface-workflow-tab-stroke: var(--color-gray-500); + --interface-workflow-tab-button-highlight: var(--color-gray-400); + --node-surface: var(--color-pure-white); + --node-component-hovered: var(--color-gray-300); + --node-component-selected: var(--color-gray-500); + --node-component-highlighted: var(--color-stone-100); + --node-ring-hover: var(--color-alpha-gray-500-50); + --node-bypass-surface: color-mix(in srgb, #ceaac9 60%, transparent); + --node-seed-control-surface: var(--color-alpha-gray-500-50); + --node-seed-control-icon: var(--color-blue-100); + --node-button-filled-primary-border: var(--color-sand-100); + --node-button-filled-primary-bkg-hover: var(--color-pure-white); + --node-button-filled-primary-bkg-selected: var(--color-pure-white); + --node-button-filled-primary-border-hover: var(--color-sand-100); + --node-button-filled-info-border-hover: var(--color-slate-300); + --node-button-outline-primary-border: var(--color-sand-300); + --node-button-outline-secondary-border: var(--color-sand-100); + --node-button-outline-secondary-border-hover: var(--color-sand-300); + --node-note-default-surface: var(--color-sand-100); + --node-note-scrollbar-track: var(--color-alpha-gray-500-50); + --node-note-text-primary: var(--color-charcoal-700); + --modal-background: var(--color-gray-200); + --modal-button-surface: var(--color-ivory-100); + --modal-button-surface-hovered: var(--color-gray-400); + --modal-contrast-surface: var(--color-charcoal-500); + --modal-panel-surface: var(--color-ivory-100); + --modal-panel-component-surface-hovered: var(--color-gray-200); + --modal-panel-component-surface-selected: var(--color-gray-300); + --modal-card-surface: var(--color-ivory-100); + --modal-card-surface-hovered: var(--color-gray-400); + --modal-card-button-surface: var(--color-gray-300); + --modal-card-button-surface-hovered: var(--color-gray-500); + --modal-card-tag-surface: color-mix(in srgb, var(--color-gray-400) 40%, transparent); + --modal-card-stroke-highlight: var(--accent-primary); + --modal-menu-surface: var(--color-pure-white); + --tooltip-background: var(--color-pure-white); + --tooltip-border: var(--color-sand-100); } .dark-theme { @@ -246,6 +321,81 @@ --text-secondary: var(--color-slate-100); --text-primary: var(--color-pure-white); --input-surface: rgba(130, 130, 130, 0.1); + + /* Semantic tokens from tokens.csv - Dark Mode */ + --text-contrast: var(--color-pure-black); + --text-danger-error: var(--color-danger-100); + --text-warning: var(--color-warning-100); + --text-success: var(--color-success-100); + --text-blue: var(--color-blue-100); + --text-highlight: var(--color-blue-selection); + --accent-secondary: var(--color-slate-100); + --accent-contrast: var(--color-charcoal-700); + --accent-danger-error: var(--color-danger-100); + --accent-warning: var(--color-warning-100); + --accent-success: var(--color-success-100); + --accent-blue: var(--color-blue-100); + --accent-white: var(--color-pure-white); + --button-surface: var(--color-charcoal-500); + --button-surface-hovered: var(--color-charcoal-300); + --button-surface-danger: var(--color-danger-100); + --button-surface-blue: var(--color-blue-100); + --button-surface-contrast: var(--color-pure-white); + --button-bkg-secondary: var(--color-pure-black); + --button-bkg-info: var(--color-slate-300); + --button-icon: var(--color-gray-800); + --button-icon-disabled: var(--color-alpha-stone-100-20); + --interface-canvas-background: var(--color-pure-black); + --interface-icon: var(--color-slate-100); + --interface-panel-component-surface-hovered: var(--color-charcoal-600); + --interface-panel-component-surface-selected: var(--color-charcoal-400); + --interface-panel-card-surface: var(--color-charcoal-600); + --interface-panel-card-surface-hover: var(--color-charcoal-400); + --interface-panel-job-progress-primary: var(--color-blue-300); + --interface-panel-job-progress-secondary: var(--color-blue-selection); + --interface-menu-surface: var(--color-charcoal-800); + --interface-menu-stroke: var(--color-stone-200); + --interface-menu-keybind-surface-blue: var(--color-blue-300); + --interface-workflow-tab-surface: var(--color-charcoal-800); + --interface-workflow-tab-surface-active: var(--color-charcoal-400); + --interface-workflow-tab-surface-hovered: var(--color-charcoal-600); + --interface-workflow-tab-stroke: var(--color-charcoal-400); + --interface-workflow-tab-button-highlight: var(--color-charcoal-200); + --node-surface: var(--color-charcoal-800); + --node-component-hovered: var(--color-charcoal-400); + --node-component-selected: var(--color-charcoal-200); + --node-component-highlighted: var(--color-slate-100); + --node-ring-hover: color-mix(in srgb, var(--color-gray-500) 20%, transparent); + --node-bypass-surface: color-mix(in srgb, #6a246a 60%, transparent); + --node-seed-control-surface: var(--color-blue-selection); + --node-seed-control-icon: var(--color-blue-100); + --node-button-filled-primary-border: var(--color-charcoal-600); + --node-button-filled-primary-bkg-hover: var(--color-charcoal-600); + --node-button-filled-primary-bkg-selected: var(--color-charcoal-600); + --node-button-filled-primary-border-hover: var(--color-slate-300); + --node-button-filled-info-border-hover: var(--color-slate-100); + --node-button-outline-primary-border: var(--color-slate-100); + --node-button-outline-secondary-border: var(--color-stone-100); + --node-button-outline-secondary-border-hover: var(--color-pure-white); + --node-note-default-surface: var(--color-sand-200); + --node-note-scrollbar-track: var(--color-alpha-stone-100-20); + --node-note-text-primary: var(--color-charcoal-700); + --modal-background: var(--color-charcoal-800); + --modal-button-surface: var(--color-charcoal-400); + --modal-button-surface-hovered: var(--color-charcoal-300); + --modal-contrast-surface: var(--color-ivory-100); + --modal-panel-surface: var(--color-charcoal-600); + --modal-panel-component-surface-hovered: var(--color-charcoal-400); + --modal-panel-component-surface-selected: var(--color-charcoal-300); + --modal-card-surface: var(--color-charcoal-600); + --modal-card-surface-hovered: var(--color-charcoal-400); + --modal-card-button-surface: var(--color-charcoal-300); + --modal-card-button-surface-hovered: var(--color-charcoal-200); + --modal-card-tag-surface: color-mix(in srgb, var(--color-gray-400) 40%, transparent); + --modal-card-stroke-highlight: var(--accent-primary); + --modal-menu-surface: var(--color-charcoal-400); + --tooltip-background: var(--color-charcoal-800); + --tooltip-border: var(--color-slate-300); } @theme inline { @@ -303,6 +453,81 @@ --color-text-secondary: var(--text-secondary); --color-text-primary: var(--text-primary); --color-input-surface: var(--input-surface); + + /* Tailwind mappings for new semantic tokens */ + --color-text-contrast: var(--text-contrast); + --color-text-danger-error: var(--text-danger-error); + --color-text-warning: var(--text-warning); + --color-text-success: var(--text-success); + --color-text-blue: var(--text-blue); + --color-text-highlight: var(--text-highlight); + --color-accent-secondary: var(--accent-secondary); + --color-accent-contrast: var(--accent-contrast); + --color-accent-danger-error: var(--accent-danger-error); + --color-accent-warning: var(--accent-warning); + --color-accent-success: var(--accent-success); + --color-accent-blue: var(--accent-blue); + --color-accent-white: var(--accent-white); + --color-button-surface: var(--button-surface); + --color-button-surface-hovered: var(--button-surface-hovered); + --color-button-surface-danger: var(--button-surface-danger); + --color-button-surface-blue: var(--button-surface-blue); + --color-button-surface-contrast: var(--button-surface-contrast); + --color-button-bkg-secondary: var(--button-bkg-secondary); + --color-button-bkg-info: var(--button-bkg-info); + --color-button-icon: var(--button-icon); + --color-button-icon-disabled: var(--button-icon-disabled); + --color-interface-canvas-background: var(--interface-canvas-background); + --color-interface-icon: var(--interface-icon); + --color-interface-panel-component-surface-hovered: var(--interface-panel-component-surface-hovered); + --color-interface-panel-component-surface-selected: var(--interface-panel-component-surface-selected); + --color-interface-panel-card-surface: var(--interface-panel-card-surface); + --color-interface-panel-card-surface-hover: var(--interface-panel-card-surface-hover); + --color-interface-panel-job-progress-primary: var(--interface-panel-job-progress-primary); + --color-interface-panel-job-progress-secondary: var(--interface-panel-job-progress-secondary); + --color-interface-menu-surface: var(--interface-menu-surface); + --color-interface-menu-stroke: var(--interface-menu-stroke); + --color-interface-menu-keybind-surface-blue: var(--interface-menu-keybind-surface-blue); + --color-interface-workflow-tab-surface: var(--interface-workflow-tab-surface); + --color-interface-workflow-tab-surface-active: var(--interface-workflow-tab-surface-active); + --color-interface-workflow-tab-surface-hovered: var(--interface-workflow-tab-surface-hovered); + --color-interface-workflow-tab-stroke: var(--interface-workflow-tab-stroke); + --color-interface-workflow-tab-button-highlight: var(--interface-workflow-tab-button-highlight); + --color-node-surface: var(--node-surface); + --color-node-component-hovered: var(--node-component-hovered); + --color-node-component-selected: var(--node-component-selected); + --color-node-component-highlighted: var(--node-component-highlighted); + --color-node-ring-hover: var(--node-ring-hover); + --color-node-bypass-surface: var(--node-bypass-surface); + --color-node-seed-control-surface: var(--node-seed-control-surface); + --color-node-seed-control-icon: var(--node-seed-control-icon); + --color-node-button-filled-primary-border: var(--node-button-filled-primary-border); + --color-node-button-filled-primary-bkg-hover: var(--node-button-filled-primary-bkg-hover); + --color-node-button-filled-primary-bkg-selected: var(--node-button-filled-primary-bkg-selected); + --color-node-button-filled-primary-border-hover: var(--node-button-filled-primary-border-hover); + --color-node-button-filled-info-border-hover: var(--node-button-filled-info-border-hover); + --color-node-button-outline-primary-border: var(--node-button-outline-primary-border); + --color-node-button-outline-secondary-border: var(--node-button-outline-secondary-border); + --color-node-button-outline-secondary-border-hover: var(--node-button-outline-secondary-border-hover); + --color-node-note-default-surface: var(--node-note-default-surface); + --color-node-note-scrollbar-track: var(--node-note-scrollbar-track); + --color-node-note-text-primary: var(--node-note-text-primary); + --color-modal-background: var(--modal-background); + --color-modal-button-surface: var(--modal-button-surface); + --color-modal-button-surface-hovered: var(--modal-button-surface-hovered); + --color-modal-contrast-surface: var(--modal-contrast-surface); + --color-modal-panel-surface: var(--modal-panel-surface); + --color-modal-panel-component-surface-hovered: var(--modal-panel-component-surface-hovered); + --color-modal-panel-component-surface-selected: var(--modal-panel-component-surface-selected); + --color-modal-card-surface: var(--modal-card-surface); + --color-modal-card-surface-hovered: var(--modal-card-surface-hovered); + --color-modal-card-button-surface: var(--modal-card-button-surface); + --color-modal-card-button-surface-hovered: var(--modal-card-button-surface-hovered); + --color-modal-card-tag-surface: var(--modal-card-tag-surface); + --color-modal-card-stroke-highlight: var(--modal-card-stroke-highlight); + --color-modal-menu-surface: var(--modal-menu-surface); + --color-tooltip-background: var(--tooltip-background); + --color-tooltip-border: var(--tooltip-border); } @custom-variant dark-theme { diff --git a/src/components/bottomPanel/tabs/shortcuts/ShortcutsList.vue b/src/components/bottomPanel/tabs/shortcuts/ShortcutsList.vue index 1481b012f7..1954ad18a6 100644 --- a/src/components/bottomPanel/tabs/shortcuts/ShortcutsList.vue +++ b/src/components/bottomPanel/tabs/shortcuts/ShortcutsList.vue @@ -7,7 +7,7 @@ class="flex flex-col" >

{{ getSubcategoryTitle(subcategory) }}

@@ -16,7 +16,7 @@
@@ -32,7 +32,7 @@ {{ formatKey(key) }} diff --git a/src/components/button/IconGroup.vue b/src/components/button/IconGroup.vue index 9e73edfab4..b10fd57b56 100644 --- a/src/components/button/IconGroup.vue +++ b/src/components/button/IconGroup.vue @@ -10,8 +10,8 @@ import { cn } from '@/utils/tailwindUtil' const iconGroupClasses = cn( 'flex justify-center items-center shrink-0', 'outline-hidden border-none p-0 rounded-lg', - 'bg-white dark-theme:bg-zinc-700', - 'text-neutral-950 dark-theme:text-white', + 'bg-button-surface', + 'text-text-primary', 'transition-all duration-200', 'cursor-pointer' ) diff --git a/src/components/button/MoreButton.vue b/src/components/button/MoreButton.vue index 2cdf394fef..257d43441d 100644 --- a/src/components/button/MoreButton.vue +++ b/src/components/button/MoreButton.vue @@ -65,10 +65,10 @@ const pt = computed(() => ({ content: { class: cn( 'mt-1 rounded-lg', - 'bg-white dark-theme:bg-zinc-800', - 'text-neutral dark-theme:text-white', + 'bg-interface-menu-surface', + 'text-text-primary', 'shadow-lg', - 'border border-zinc-200 dark-theme:border-zinc-700' + 'border border-interface-menu-stroke' ) } })) diff --git a/src/components/card/CardContainer.vue b/src/components/card/CardContainer.vue index 7b0822aec7..6639a89507 100644 --- a/src/components/card/CardContainer.vue +++ b/src/components/card/CardContainer.vue @@ -47,8 +47,8 @@ const containerClasses = computed(() => { // Variant styles const variantClasses = { default: cn( - hasBackground && 'bg-white dark-theme:bg-zinc-800', - hasBorder && 'border border-zinc-200 dark-theme:border-zinc-700', + hasBackground && 'bg-interface-panel-card-surface', + hasBorder && 'border border-interface-stroke', hasShadow && 'shadow-sm', hasCursor && 'cursor-pointer' ), @@ -57,9 +57,9 @@ const containerClasses = computed(() => { 'p-2 transition-colors duration-200' ), outline: cn( - hasBorder && 'border-2 border-zinc-300 dark-theme:border-zinc-600', + hasBorder && 'border-2 border-interface-stroke', hasCursor && 'cursor-pointer', - 'hover:border-zinc-400 dark-theme:hover:border-zinc-500 transition-colors' + 'hover:border-interface-panel-component-surface-hovered transition-colors' ) } diff --git a/src/components/card/CardDescription.vue b/src/components/card/CardDescription.vue index 0b5e2de5c2..12af3b1f21 100644 --- a/src/components/card/CardDescription.vue +++ b/src/components/card/CardDescription.vue @@ -1,5 +1,5 @@ diff --git a/src/components/chip/SquareChip.vue b/src/components/chip/SquareChip.vue index 6a47bb643a..f12340f5f7 100644 --- a/src/components/chip/SquareChip.vue +++ b/src/components/chip/SquareChip.vue @@ -19,7 +19,7 @@ const baseClasses = const variantStyles = { dark: 'bg-zinc-500/40 text-white/90', - light: 'backdrop-blur-[2px] bg-white/50 text-zinc-900 dark-theme:text-white' + light: 'backdrop-blur-[2px] bg-white/50 text-text-primary' } const chipClasses = computed(() => { diff --git a/src/components/common/FormImageUpload.vue b/src/components/common/FormImageUpload.vue index 0e7703f13a..a348db8333 100644 --- a/src/components/common/FormImageUpload.vue +++ b/src/components/common/FormImageUpload.vue @@ -3,7 +3,7 @@