diff --git a/frontend/src/assets/editor-shared.css b/frontend/src/assets/editor-shared.css index 42123fe..b3cdc85 100644 --- a/frontend/src/assets/editor-shared.css +++ b/frontend/src/assets/editor-shared.css @@ -52,18 +52,18 @@ } .btn-save { padding: 0.45rem 1.1rem; - background: linear-gradient(135deg, #6366f1, #4f46e5); + background: linear-gradient(135deg, #5B4A8A, #3F3560); color: #fff; border: none; border-radius: var(--radius-sm); cursor: pointer; font-weight: 600; font-size: 0.875rem; - box-shadow: 0 2px 8px rgba(99, 102, 241, 0.28); + box-shadow: 0 2px 8px rgba(91, 74, 138, 0.28); transition: box-shadow 0.15s, opacity 0.15s; } .btn-save:hover:not(:disabled) { - box-shadow: 0 4px 14px rgba(99, 102, 241, 0.42); + box-shadow: 0 4px 14px rgba(91, 74, 138, 0.42); opacity: 0.95; } .btn-save:disabled { diff --git a/frontend/src/assets/theme.css b/frontend/src/assets/theme.css index dd65cb9..c96aed0 100644 --- a/frontend/src/assets/theme.css +++ b/frontend/src/assets/theme.css @@ -1,131 +1,147 @@ -@import url('https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300..900;1,9..144,300..900&family=Inter:ital,wght@0,400;0,500;1,400&family=JetBrains+Mono:ital,wght@0,400;1,400&display=swap'); :root { - --color-bg: #f5f5fb; - --color-bg-secondary: #ededf5; - --color-bg-card: #ffffff; - --color-surface: #f0f0f8; - --color-text: #1a1a1a; - --color-text-secondary: #666666; - --color-text-muted: #999999; - --color-border: #dddde8; - --color-input-border: #c8c8d8; - --color-primary: #7c3aed; - --color-danger: #d93025; - --color-tag-bg: #ede5ff; - --color-tag-text: #6d28d9; + /* Light mode — warm parchment palette */ + --color-bg: #F5F1E8; + --color-bg-secondary: #FBF8F0; + --color-bg-card: #FBF8F0; + --color-surface: #EFEAE0; + --color-text: #14171A; + --color-text-secondary: #5A5852; + --color-text-muted: #9A9890; + --color-border: #D9D6CE; + --color-input-border: #D9D6CE; + --color-primary: #5B4A8A; + --color-danger: #C04A1F; + --color-tag-bg: rgba(91, 74, 138, 0.12); + --color-tag-text: #5B4A8A; --color-shadow: rgba(0, 0, 0, 0.08); - --color-toast-success: #34a853; - --color-toast-error: #d93025; - --color-status-todo: #5f6368; - --color-status-todo-bg: #e8eaed; - --color-status-in-progress: #7c3aed; - --color-status-in-progress-bg: #ede5ff; - --color-status-done: #34a853; - --color-status-done-bg: #e6f4ea; - --color-priority-low: #5f9ea0; - --color-priority-low-bg: #e0f2f1; - --color-priority-medium: #f9a825; - --color-priority-medium-bg: #fff8e1; - --color-priority-high: #d93025; - --color-priority-high-bg: #fce8e6; - --color-wikilink: #7b1fa2; - --color-wikilink-bg: #f3e5f5; - --color-overdue: #d93025; - --color-code-bg: #f0f0f8; - --color-code-inline-bg: #eaeaf4; - --color-table-stripe: #f4f4fb; - --color-success: #22c55e; - --color-warning: #eab308; - --color-input-bar-bg: #eaeaf3; - --color-input-bar-text: #1a1a1a; - --color-input-bar-placeholder: rgba(0, 0, 0, 0.4); + --color-toast-success: #4A5D3F; + --color-toast-error: #C04A1F; + --color-status-todo: #3F4651; + --color-status-todo-bg: rgba(63, 70, 81, 0.10); + --color-status-in-progress: #5B4A8A; + --color-status-in-progress-bg: rgba(91, 74, 138, 0.12); + --color-status-done: #4A5D3F; + --color-status-done-bg: rgba(74, 93, 63, 0.12); + --color-priority-low: #3D5A6E; + --color-priority-low-bg: rgba(61, 90, 110, 0.12); + --color-priority-medium: #8B6F1E; + --color-priority-medium-bg: rgba(139, 111, 30, 0.12); + --color-priority-high: #C04A1F; + --color-priority-high-bg: rgba(192, 74, 31, 0.12); + --color-wikilink: #5B4A8A; + --color-wikilink-bg: rgba(91, 74, 138, 0.12); + --color-overdue: #C04A1F; + --color-code-bg: #EBEDF0; + --color-code-inline-bg: #EBEDF0; + --color-table-stripe: rgba(20, 23, 26, 0.025); + --color-success: #4A5D3F; + --color-warning: #8B6F1E; + --color-input-bar-bg: #EFEAE0; + --color-input-bar-text: #14171A; + --color-input-bar-placeholder: rgba(20, 23, 26, 0.4); --color-overlay: rgba(0, 0, 0, 0.45); - --color-bubble-user-bg: rgba(0, 0, 0, 0.04); - --color-bubble-user-border: rgba(0, 0, 0, 0.10); - --color-bubble-user-text: #3a3a4a; - --color-bubble-asst-shadow: 0 2px 16px rgba(124, 58, 237, 0.10), 0 1px 4px rgba(0, 0, 0, 0.06); + --color-bubble-user-bg: transparent; + --color-bubble-user-border: #D9D6CE; + --color-bubble-user-text: #5A5852; + --color-bubble-asst-shadow: 0 2px 14px rgba(91, 74, 138, 0.06), 0 1px 4px rgba(0, 0, 0, 0.05); + --color-primary-solid: #5B4A8A; + --color-primary-deep: #3F3560; + --gradient-cta: linear-gradient(135deg, var(--color-primary-solid), var(--color-primary-deep)); + --glow-cta: 0 2px 10px rgba(91, 74, 138, 0.35); + --glow-cta-hover: 0 4px 20px rgba(91, 74, 138, 0.55); + --glow-soft: 0 0 16px rgba(91, 74, 138, 0.35); + --color-primary-faint: rgba(91, 74, 138, 0.08); + --color-primary-tint: rgba(91, 74, 138, 0.12); + --color-primary-wash: rgba(91, 74, 138, 0.20); + + /* Action color set — Hybrid rule: action buttons use these, accent reserved for brand moments */ + --color-action-primary: #4A5D3F; + --color-action-primary-hover: #5A6F4D; + --color-action-secondary: #8B7355; + --color-action-secondary-hover: #A0876A; + --color-action-destructive: #6B2118; + --color-action-destructive-hover: #7E2A1F; + --color-action-ghost-border: #3F4651; + --radius-sm: 6px; --radius-md: 12px; --radius-lg: 18px; --radius-pill: 9999px; - --focus-ring: 0 0 0 2px rgba(124, 58, 237, 0.4); + --focus-ring: 0 0 0 2px rgba(91, 74, 138, 0.5); /* Layout */ --page-max-width: 1200px; --page-padding-x: 1rem; --sidebar-width: 260px; --chat-reading-width: min(1200px, 100%); --chat-context-sidebar-width: 220px; - --color-accent-warm: #b8860b; - --color-accent-warm-light: #d4a017; - --color-primary-solid: #7c3aed; - --color-primary-deep: #5b21b6; - /* Reusable brand patterns */ - --gradient-cta: linear-gradient(135deg, var(--color-primary-solid), var(--color-primary-deep)); - --glow-cta: 0 2px 10px rgba(124, 58, 237, 0.35); - --glow-cta-hover: 0 4px 20px rgba(124, 58, 237, 0.55); - --glow-soft: 0 0 16px rgba(124, 58, 237, 0.35); - --color-primary-faint: rgba(124, 58, 237, 0.08); - --color-primary-tint: rgba(124, 58, 237, 0.12); - --color-primary-wash: rgba(124, 58, 237, 0.20); } [data-theme="dark"] { - --color-bg: #0f0f14; - --color-bg-secondary: #16161f; - --color-bg-card: #1a1a24; - --color-surface: #16161f; - --color-text: #e4e4f0; - --color-text-secondary: #8888a8; - --color-text-muted: #52526a; - --color-border: rgba(124, 58, 237, 0.22); - --color-input-border: rgba(124, 58, 237, 0.35); - --color-primary: #a78bfa; - --color-danger: #f44336; - --color-tag-bg: #2a2a45; - --color-tag-text: #c4b5fd; + /* Dark mode — Obsidian / Iron / Pewter */ + --color-bg: #14171A; + --color-bg-secondary: #1E2228; + --color-bg-card: #1E2228; + --color-surface: #2C313A; + --color-text: #E8E4D8; + --color-text-secondary: #C2BFB4; + --color-text-muted: #9C9A92; + --color-border: #3F4651; + --color-input-border: #3F4651; + --color-primary: #5B4A8A; + --color-danger: #C04A1F; + --color-tag-bg: rgba(91, 74, 138, 0.15); + --color-tag-text: #5B4A8A; --color-shadow: rgba(0, 0, 0, 0.4); - --color-toast-success: #4caf50; - --color-toast-error: #f44336; - --color-status-todo: #9aa0a6; - --color-status-todo-bg: #2a2a35; - --color-status-in-progress: #a78bfa; - --color-status-in-progress-bg: #2a2a45; - --color-status-done: #4caf50; - --color-status-done-bg: #1b3a20; - --color-priority-low: #80cbc4; - --color-priority-low-bg: #1a3a38; - --color-priority-medium: #fdd835; - --color-priority-medium-bg: #3a3520; - --color-priority-high: #f44336; - --color-priority-high-bg: #3a1a1a; - --color-wikilink: #c4b5fd; - --color-wikilink-bg: #2a1a45; - --color-overdue: #f44336; - --color-code-bg: #12121a; - --color-code-inline-bg: #1a1a2a; - --color-table-stripe: #14141e; - --color-success: #4ade80; - --color-warning: #facc15; - --color-input-bar-bg: #1a1a24; - --color-input-bar-text: #e4e4f0; - --color-input-bar-placeholder: rgba(228, 228, 240, 0.35); + --color-toast-success: #4A5D3F; + --color-toast-error: #C04A1F; + --color-status-todo: #3F4651; + --color-status-todo-bg: rgba(63, 70, 81, 0.18); + --color-status-in-progress: #5B4A8A; + --color-status-in-progress-bg: rgba(91, 74, 138, 0.18); + --color-status-done: #4A5D3F; + --color-status-done-bg: rgba(74, 93, 63, 0.18); + --color-priority-low: #3D5A6E; + --color-priority-low-bg: rgba(61, 90, 110, 0.18); + --color-priority-medium: #8B6F1E; + --color-priority-medium-bg: rgba(139, 111, 30, 0.18); + --color-priority-high: #C04A1F; + --color-priority-high-bg: rgba(192, 74, 31, 0.18); + --color-wikilink: #5B4A8A; + --color-wikilink-bg: rgba(91, 74, 138, 0.18); + --color-overdue: #C04A1F; + --color-code-bg: #14171A; + --color-code-inline-bg: #1E2228; + --color-table-stripe: rgba(255, 255, 255, 0.025); + --color-success: #4A5D3F; + --color-warning: #8B6F1E; + --color-input-bar-bg: #1E2228; + --color-input-bar-text: #E8E4D8; + --color-input-bar-placeholder: rgba(232, 228, 216, 0.35); --color-overlay: rgba(0, 0, 0, 0.65); - --color-bubble-user-bg: rgba(255, 255, 255, 0.04); - --color-bubble-user-border: rgba(255, 255, 255, 0.10); - --color-bubble-user-text: #b0b0c8; - --color-bubble-asst-shadow: 0 4px 28px rgba(124, 58, 237, 0.14), 0 2px 8px rgba(0, 0, 0, 0.4); - --color-accent-warm: #d4a017; - --color-accent-warm-light: #e8c45a; - --color-primary-solid: #7c3aed; - --color-primary-deep: #5b21b6; + --color-bubble-user-bg: transparent; + --color-bubble-user-border: #3F4651; + --color-bubble-user-text: #C2BFB4; + --color-bubble-asst-shadow: 0 4px 28px rgba(91, 74, 138, 0.14), 0 2px 8px rgba(0, 0, 0, 0.4); + --color-primary-solid: #5B4A8A; + --color-primary-deep: #3F3560; --gradient-cta: linear-gradient(135deg, var(--color-primary-solid), var(--color-primary-deep)); - --glow-cta: 0 2px 12px rgba(124, 58, 237, 0.45); - --glow-cta-hover: 0 4px 24px rgba(124, 58, 237, 0.65); - --glow-soft: 0 0 18px rgba(124, 58, 237, 0.4); - --color-primary-faint: rgba(124, 58, 237, 0.10); - --color-primary-tint: rgba(124, 58, 237, 0.14); - --color-primary-wash: rgba(124, 58, 237, 0.22); + --glow-cta: 0 2px 12px rgba(91, 74, 138, 0.45); + --glow-cta-hover: 0 4px 24px rgba(91, 74, 138, 0.65); + --glow-soft: 0 0 18px rgba(91, 74, 138, 0.4); + --color-primary-faint: rgba(91, 74, 138, 0.10); + --color-primary-tint: rgba(91, 74, 138, 0.14); + --color-primary-wash: rgba(91, 74, 138, 0.22); + + /* Action color set — identical across themes */ + --color-action-primary: #4A5D3F; + --color-action-primary-hover: #5A6F4D; + --color-action-secondary: #8B7355; + --color-action-secondary-hover: #A0876A; + --color-action-destructive: #6B2118; + --color-action-destructive-hover: #7E2A1F; + --color-action-ghost-border: #3F4651; } *, @@ -138,15 +154,34 @@ body { margin: 0; background: var(--color-bg); color: var(--color-text); - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, - Oxygen, Ubuntu, Cantarell, "Helvetica Neue", Arial, sans-serif; + font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, + "Segoe UI", Roboto, sans-serif; + font-feature-settings: "cv11"; line-height: 1.5; transition: background-color 0.2s, color 0.2s; } -h1, h2, h3 { +h1, h2 { font-family: 'Fraunces', Georgia, serif; font-optical-sizing: auto; + font-weight: 500; + line-height: 1.3; +} + +h3 { + font-family: 'Inter', system-ui, sans-serif; + font-weight: 500; + line-height: 1.3; +} + +code, pre, kbd, samp { + font-family: 'JetBrains Mono', ui-monospace, "SF Mono", Menlo, Consolas, monospace; + font-feature-settings: "liga", "calt"; +} + +::selection { + background: rgba(91, 74, 138, 0.3); + color: var(--color-text); } input:focus-visible, @@ -184,7 +219,7 @@ button:not(:disabled):active, } } -/* Thin indigo-tinted scrollbars */ +/* Neutral hairline scrollbars — chrome is structural, not branded */ ::-webkit-scrollbar { width: 4px; height: 4px; @@ -193,11 +228,11 @@ button:not(:disabled):active, background: transparent; } ::-webkit-scrollbar-thumb { - background: rgba(124, 58, 237, 0.25); + background: var(--color-border); border-radius: 9999px; } ::-webkit-scrollbar-thumb:hover { - background: rgba(124, 58, 237, 0.45); + background: var(--color-text-muted); } /* Floating inline assist button (teleported to body, cannot be scoped) */ diff --git a/frontend/src/components/AppHeader.vue b/frontend/src/components/AppHeader.vue index 7bf8791..d824f25 100644 --- a/frontend/src/components/AppHeader.vue +++ b/frontend/src/components/AppHeader.vue @@ -151,7 +151,7 @@ router.afterEach(() => {