From 6f3bf2f6b66f8437854a20c14847ff1a114f633c Mon Sep 17 00:00:00 2001 From: Cody Seibert Date: Tue, 9 Dec 2025 18:51:06 -0500 Subject: [PATCH] feat: add new themes and improve UI components - Introduced multiple new themes: retro, dracula, nord, monokai, tokyonight, solarized, gruvbox, catppuccin, onedark, and synthwave. - Updated global CSS to support new themes and added custom variants for theme-specific styles. - Enhanced layout and sidebar components with improved styling and responsiveness. - Refactored button and slider components for better visual consistency and added an animated outline variant. - Improved various views (e.g., settings, welcome, context) with updated styles and better user experience. This update enhances the overall aesthetic and usability of the application, providing users with more customization options. --- .automaker/context/gemini.md | 70 + app/src/app/globals.css | 1129 ++++++++++++++++- app/src/app/layout.tsx | 2 +- app/src/app/page.tsx | 41 +- app/src/components/layout/sidebar.tsx | 58 +- app/src/components/ui/button.tsx | 55 +- app/src/components/ui/slider.tsx | 6 +- app/src/components/views/agent-tools-view.tsx | 2 +- app/src/components/views/agent-view.tsx | 7 +- app/src/components/views/auto-mode-log.tsx | 31 +- app/src/components/views/board-view.tsx | 589 +++++---- app/src/components/views/context-view.tsx | 62 +- app/src/components/views/interview-view.tsx | 4 +- app/src/components/views/kanban-card.tsx | 10 +- app/src/components/views/kanban-column.tsx | 6 +- app/src/components/views/settings-view.tsx | 309 ++++- app/src/components/views/spec-view.tsx | 11 +- app/src/components/views/welcome-view.tsx | 225 ++-- app/src/store/app-store.ts | 95 +- 19 files changed, 2212 insertions(+), 500 deletions(-) create mode 100644 .automaker/context/gemini.md diff --git a/.automaker/context/gemini.md b/.automaker/context/gemini.md new file mode 100644 index 00000000..4ef2912a --- /dev/null +++ b/.automaker/context/gemini.md @@ -0,0 +1,70 @@ +You are a very strong reasoner and planner. Use these critical instructions to structure your plans, thoughts, and responses. + +Before taking any action (either tool calls or responses to the user), you must proactively, methodically, and independently plan and reason about: + +1. Logical dependencies and constraints: + +Analyze the intended action against the following factors. Resolve conflicts in order of importance: + +1.1) Policy-based rules, mandatory prerequisites, and constraints. +1.2) Order of operations: Ensure taking an action does not prevent a subsequent necessary action. + 1.2.1) The user may request actions in a random order, but you may need to reorder operations to maximize successful completion of the task. +1.3) Other prerequisites (information and/or actions needed). +1.4) Explicit user constraints or preferences. + +2. Risk assessment: + +What are the consequences of taking the action? Will the new state cause any future issues? + +2.1) For exploratory tasks (like searches), missing optional parameters is a LOW risk. +Prefer calling the tool with the available information over asking the user, unless your Rule 1 (Logical Dependencies) reasoning determines that optional information is required for a later step in your plan. + +3. Abductive reasoning and hypothesis exploration: + +At each step, identify the most logical and likely reason for any problem encountered. + +3.1) Look beyond immediate or obvious causes. The most likely reason may not be the simplest and may require deeper inference. +3.2) Hypotheses may require additional research. Each hypothesis may take multiple steps to test. +3.3) Prioritize hypotheses based on likelihood, but do not discard less likely ones prematurely. A low-probability event may still be the root cause. + +4. Outcome evaluation and adaptability: + +Does the previous observation require any changes to your plan? + +4.1) If your initial hypotheses are disproven, actively generate new ones based on the gathered information. + +5. Information availability: + +Incorporate all applicable and alternative sources of information, including: + +5.1) Using available tools and their capabilities +5.2) All policies, rules, checklists, and constraints +5.3) Previous observations and conversation history +5.4) Information only available by asking the user + +6. Precision and Grounding: + +Ensure your reasoning is extremely precise and relevant to each exact ongoing situation. + +6.1) Verify your claims by quoting the exact applicable information (including policies) when referring to them. + +7. Completeness: + +Ensure that all requirements, constraints, options, and preferences are exhaustively incorporated into your plan. + +7.1) Resolve conflicts using the order of importance in #1. +7.2) Avoid premature conclusions: There may be multiple relevant options for a given situation. + 7.2.1) To check for whether an option is relevant, reason about all information sources from #5. + 7.2.2) You may need to consult the user to even know whether something is applicable. Do not assume it is not applicable without checking. +7.3) Review applicable sources of information from #5 to confirm which are relevant to the current state. + +8. Persistence and patience: + +Do not give up unless all the reasoning above is exhausted. + +8.1) Don't be dissuaded by time taken or user frustration. +8.2) This persistence must be intelligent: On transient errors (e.g. please try again), you must retry unless an explicit retry limit (e.g., max x tries) has been reached. If such a limit is hit, you must stop. On other errors, you must change your strategy or arguments, not repeat the same failed call. + +9. Inhibit your response: + +Only take an action after all the above reasoning is completed. Once you've taken an action, you cannot take it back. diff --git a/app/src/app/globals.css b/app/src/app/globals.css index 83a7a25a..af2f97c0 100644 --- a/app/src/app/globals.css +++ b/app/src/app/globals.css @@ -2,6 +2,16 @@ @import "tw-animate-css"; @custom-variant dark (&:is(.dark *)); +@custom-variant retro (&:is(.retro *)); +@custom-variant dracula (&:is(.dracula *)); +@custom-variant nord (&:is(.nord *)); +@custom-variant monokai (&:is(.monokai *)); +@custom-variant tokyonight (&:is(.tokyonight *)); +@custom-variant solarized (&:is(.solarized *)); +@custom-variant gruvbox (&:is(.gruvbox *)); +@custom-variant catppuccin (&:is(.catppuccin *)); +@custom-variant onedark (&:is(.onedark *)); +@custom-variant synthwave (&:is(.synthwave *)); @theme inline { --color-background: var(--background); @@ -62,6 +72,7 @@ } :root { + /* Default to light mode */ --radius: 0.625rem; --background: oklch(1 0 0); --foreground: oklch(0.145 0 0); @@ -94,6 +105,57 @@ --sidebar-accent-foreground: oklch(0.205 0 0); --sidebar-border: oklch(0.922 0 0); --sidebar-ring: oklch(0.708 0 0); + --background-50: oklch(1 0 0 / 0.5); + --background-80: oklch(1 0 0 / 0.8); + --foreground-secondary: oklch(0.4 0 0); + --foreground-muted: oklch(0.556 0 0); + --border-glass: oklch(0.145 0 0 / 0.1); + --brand-400: oklch(0.6 0.22 265); + --brand-500: oklch(0.55 0.25 265); + --brand-600: oklch(0.5 0.28 270); +} + +.light { + /* Explicit light mode - same as root but ensures it overrides any dark defaults */ + --background: oklch(1 0 0); /* White */ + --background-50: oklch(1 0 0 / 0.5); + --background-80: oklch(1 0 0 / 0.8); + --foreground: oklch(0.145 0 0); /* Dark text */ + --foreground-secondary: oklch(0.4 0 0); + --foreground-muted: oklch(0.556 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.55 0.25 265); + --primary-foreground: oklch(1 0 0); + --brand-400: oklch(0.6 0.22 265); + --brand-500: oklch(0.55 0.25 265); + --brand-600: oklch(0.5 0.28 270); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.95 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --border-glass: oklch(0.145 0 0 / 0.1); + --input: oklch(1 0 0); + --ring: oklch(0.55 0.25 265); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.98 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.55 0.25 265); + --sidebar-primary-foreground: oklch(1 0 0); + --sidebar-accent: oklch(0.95 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.9 0 0); + --sidebar-ring: oklch(0.55 0.25 265); } .dark { @@ -153,34 +215,634 @@ --sidebar-ring: oklch(0.55 0.25 265); } +.retro { + /* Retro / Cyberpunk Theme */ + --background: oklch(0 0 0); /* Pure Black */ + --background-50: oklch(0 0 0 / 0.5); + --background-80: oklch(0 0 0 / 0.8); + + /* Neon Green Text */ + --foreground: oklch(0.85 0.25 145); /* Neon Green */ + --foreground-secondary: oklch(0.7 0.2 145); + --foreground-muted: oklch(0.5 0.15 145); + + /* Hard Edges */ + --radius: 0px; + + /* UI Elements */ + --card: oklch(0 0 0); /* Black card */ + --card-foreground: oklch(0.85 0.25 145); + --popover: oklch(0.05 0.05 145); + --popover-foreground: oklch(0.85 0.25 145); + + --primary: oklch(0.85 0.25 145); /* Neon Green */ + --primary-foreground: oklch(0 0 0); /* Black text on green */ + + --brand-400: oklch(0.85 0.25 145); + --brand-500: oklch(0.85 0.25 145); + --brand-600: oklch(0.75 0.25 145); + + --secondary: oklch(0.1 0.1 145); /* Dark Green bg */ + --secondary-foreground: oklch(0.85 0.25 145); + + --muted: oklch(0.1 0.05 145); + --muted-foreground: oklch(0.5 0.15 145); + + --accent: oklch(0.2 0.2 145); /* Brighter green accent */ + --accent-foreground: oklch(0.85 0.25 145); + + --destructive: oklch(0.6 0.25 25); /* Keep red for destructive */ + + --border: oklch(0.3 0.15 145); /* Visible Green Border */ + --border-glass: oklch(0.85 0.25 145 / 0.3); + + --input: oklch(0.1 0.1 145); + --ring: oklch(0.85 0.25 145); + + /* Charts - various neons */ + --chart-1: oklch(0.85 0.25 145); /* Green */ + --chart-2: oklch(0.8 0.25 300); /* Purple Neon */ + --chart-3: oklch(0.8 0.25 200); /* Cyan Neon */ + --chart-4: oklch(0.8 0.25 60); /* Yellow Neon */ + --chart-5: oklch(0.8 0.25 20); /* Red Neon */ + + /* Sidebar */ + --sidebar: oklch(0 0 0); + --sidebar-foreground: oklch(0.85 0.25 145); + --sidebar-primary: oklch(0.85 0.25 145); + --sidebar-primary-foreground: oklch(0 0 0); + --sidebar-accent: oklch(0.1 0.1 145); + --sidebar-accent-foreground: oklch(0.85 0.25 145); + --sidebar-border: oklch(0.3 0.15 145); + --sidebar-ring: oklch(0.85 0.25 145); + + /* Fonts */ + --font-sans: var(--font-geist-mono); /* Force Mono everywhere */ +} + +/* ======================================== + DRACULA THEME + Inspired by the popular Dracula VS Code theme + ======================================== */ +.dracula { + --background: oklch(0.18 0.02 280); /* #282a36 */ + --background-50: oklch(0.18 0.02 280 / 0.5); + --background-80: oklch(0.18 0.02 280 / 0.8); + + --foreground: oklch(0.95 0.01 280); /* #f8f8f2 */ + --foreground-secondary: oklch(0.7 0.05 280); + --foreground-muted: oklch(0.55 0.08 280); /* #6272a4 */ + + --card: oklch(0.22 0.02 280); /* #44475a */ + --card-foreground: oklch(0.95 0.01 280); + --popover: oklch(0.2 0.02 280); + --popover-foreground: oklch(0.95 0.01 280); + + --primary: oklch(0.7 0.2 320); /* #bd93f9 purple */ + --primary-foreground: oklch(0.18 0.02 280); + + --brand-400: oklch(0.75 0.2 320); + --brand-500: oklch(0.7 0.2 320); /* #bd93f9 */ + --brand-600: oklch(0.65 0.22 320); + + --secondary: oklch(0.28 0.03 280); /* #44475a */ + --secondary-foreground: oklch(0.95 0.01 280); + + --muted: oklch(0.28 0.03 280); + --muted-foreground: oklch(0.55 0.08 280); /* #6272a4 */ + + --accent: oklch(0.32 0.04 280); + --accent-foreground: oklch(0.95 0.01 280); + + --destructive: oklch(0.65 0.25 15); /* #ff5555 */ + + --border: oklch(0.35 0.05 280); + --border-glass: oklch(0.7 0.2 320 / 0.3); + + --input: oklch(0.22 0.02 280); + --ring: oklch(0.7 0.2 320); + + --chart-1: oklch(0.7 0.2 320); /* Purple */ + --chart-2: oklch(0.75 0.2 180); /* Cyan #8be9fd */ + --chart-3: oklch(0.8 0.2 130); /* Green #50fa7b */ + --chart-4: oklch(0.7 0.25 350); /* Pink #ff79c6 */ + --chart-5: oklch(0.85 0.2 90); /* Yellow #f1fa8c */ + + --sidebar: oklch(0.16 0.02 280); + --sidebar-foreground: oklch(0.95 0.01 280); + --sidebar-primary: oklch(0.7 0.2 320); + --sidebar-primary-foreground: oklch(0.18 0.02 280); + --sidebar-accent: oklch(0.28 0.03 280); + --sidebar-accent-foreground: oklch(0.95 0.01 280); + --sidebar-border: oklch(0.35 0.05 280); + --sidebar-ring: oklch(0.7 0.2 320); +} + +/* ======================================== + NORD THEME + Inspired by the Arctic, north-bluish color palette + ======================================== */ +.nord { + --background: oklch(0.23 0.02 240); /* #2e3440 */ + --background-50: oklch(0.23 0.02 240 / 0.5); + --background-80: oklch(0.23 0.02 240 / 0.8); + + --foreground: oklch(0.9 0.01 230); /* #eceff4 */ + --foreground-secondary: oklch(0.75 0.02 230); /* #d8dee9 */ + --foreground-muted: oklch(0.6 0.03 230); /* #4c566a */ + + --card: oklch(0.27 0.02 240); /* #3b4252 */ + --card-foreground: oklch(0.9 0.01 230); + --popover: oklch(0.25 0.02 240); + --popover-foreground: oklch(0.9 0.01 230); + + --primary: oklch(0.7 0.12 220); /* #88c0d0 frost */ + --primary-foreground: oklch(0.23 0.02 240); + + --brand-400: oklch(0.75 0.12 220); + --brand-500: oklch(0.7 0.12 220); /* #88c0d0 */ + --brand-600: oklch(0.65 0.14 220); /* #81a1c1 */ + + --secondary: oklch(0.31 0.02 240); /* #434c5e */ + --secondary-foreground: oklch(0.9 0.01 230); + + --muted: oklch(0.31 0.02 240); + --muted-foreground: oklch(0.55 0.03 230); + + --accent: oklch(0.35 0.03 240); /* #4c566a */ + --accent-foreground: oklch(0.9 0.01 230); + + --destructive: oklch(0.65 0.2 15); /* #bf616a */ + + --border: oklch(0.35 0.03 240); + --border-glass: oklch(0.7 0.12 220 / 0.3); + + --input: oklch(0.27 0.02 240); + --ring: oklch(0.7 0.12 220); + + --chart-1: oklch(0.7 0.12 220); /* Frost blue */ + --chart-2: oklch(0.65 0.14 220); /* #81a1c1 */ + --chart-3: oklch(0.7 0.15 140); /* #a3be8c green */ + --chart-4: oklch(0.7 0.2 320); /* #b48ead purple */ + --chart-5: oklch(0.75 0.15 70); /* #ebcb8b yellow */ + + --sidebar: oklch(0.21 0.02 240); + --sidebar-foreground: oklch(0.9 0.01 230); + --sidebar-primary: oklch(0.7 0.12 220); + --sidebar-primary-foreground: oklch(0.23 0.02 240); + --sidebar-accent: oklch(0.31 0.02 240); + --sidebar-accent-foreground: oklch(0.9 0.01 230); + --sidebar-border: oklch(0.35 0.03 240); + --sidebar-ring: oklch(0.7 0.12 220); +} + +/* ======================================== + MONOKAI THEME + The classic Monokai color scheme + ======================================== */ +.monokai { + --background: oklch(0.17 0.01 90); /* #272822 */ + --background-50: oklch(0.17 0.01 90 / 0.5); + --background-80: oklch(0.17 0.01 90 / 0.8); + + --foreground: oklch(0.95 0.02 100); /* #f8f8f2 */ + --foreground-secondary: oklch(0.8 0.02 100); + --foreground-muted: oklch(0.55 0.04 100); /* #75715e */ + + --card: oklch(0.22 0.01 90); /* #3e3d32 */ + --card-foreground: oklch(0.95 0.02 100); + --popover: oklch(0.2 0.01 90); + --popover-foreground: oklch(0.95 0.02 100); + + --primary: oklch(0.8 0.2 350); /* #f92672 pink */ + --primary-foreground: oklch(0.17 0.01 90); + + --brand-400: oklch(0.85 0.2 350); + --brand-500: oklch(0.8 0.2 350); /* #f92672 */ + --brand-600: oklch(0.75 0.22 350); + + --secondary: oklch(0.25 0.02 90); + --secondary-foreground: oklch(0.95 0.02 100); + + --muted: oklch(0.25 0.02 90); + --muted-foreground: oklch(0.55 0.04 100); + + --accent: oklch(0.3 0.02 90); + --accent-foreground: oklch(0.95 0.02 100); + + --destructive: oklch(0.65 0.25 15); /* red */ + + --border: oklch(0.35 0.03 90); + --border-glass: oklch(0.8 0.2 350 / 0.3); + + --input: oklch(0.22 0.01 90); + --ring: oklch(0.8 0.2 350); + + --chart-1: oklch(0.8 0.2 350); /* Pink #f92672 */ + --chart-2: oklch(0.85 0.2 90); /* Yellow #e6db74 */ + --chart-3: oklch(0.8 0.2 140); /* Green #a6e22e */ + --chart-4: oklch(0.75 0.2 200); /* Cyan #66d9ef */ + --chart-5: oklch(0.75 0.2 30); /* Orange #fd971f */ + + --sidebar: oklch(0.15 0.01 90); + --sidebar-foreground: oklch(0.95 0.02 100); + --sidebar-primary: oklch(0.8 0.2 350); + --sidebar-primary-foreground: oklch(0.17 0.01 90); + --sidebar-accent: oklch(0.25 0.02 90); + --sidebar-accent-foreground: oklch(0.95 0.02 100); + --sidebar-border: oklch(0.35 0.03 90); + --sidebar-ring: oklch(0.8 0.2 350); +} + +/* ======================================== + TOKYO NIGHT THEME + A clean dark theme celebrating Tokyo at night + ======================================== */ +.tokyonight { + --background: oklch(0.16 0.03 260); /* #1a1b26 */ + --background-50: oklch(0.16 0.03 260 / 0.5); + --background-80: oklch(0.16 0.03 260 / 0.8); + + --foreground: oklch(0.85 0.02 250); /* #a9b1d6 */ + --foreground-secondary: oklch(0.7 0.03 250); + --foreground-muted: oklch(0.5 0.04 250); /* #565f89 */ + + --card: oklch(0.2 0.03 260); /* #24283b */ + --card-foreground: oklch(0.85 0.02 250); + --popover: oklch(0.18 0.03 260); + --popover-foreground: oklch(0.85 0.02 250); + + --primary: oklch(0.7 0.18 280); /* #7aa2f7 blue */ + --primary-foreground: oklch(0.16 0.03 260); + + --brand-400: oklch(0.75 0.18 280); + --brand-500: oklch(0.7 0.18 280); /* #7aa2f7 */ + --brand-600: oklch(0.65 0.2 280); /* #7dcfff */ + + --secondary: oklch(0.24 0.03 260); /* #292e42 */ + --secondary-foreground: oklch(0.85 0.02 250); + + --muted: oklch(0.24 0.03 260); + --muted-foreground: oklch(0.5 0.04 250); + + --accent: oklch(0.28 0.04 260); + --accent-foreground: oklch(0.85 0.02 250); + + --destructive: oklch(0.65 0.2 15); /* #f7768e */ + + --border: oklch(0.32 0.04 260); + --border-glass: oklch(0.7 0.18 280 / 0.3); + + --input: oklch(0.2 0.03 260); + --ring: oklch(0.7 0.18 280); + + --chart-1: oklch(0.7 0.18 280); /* Blue #7aa2f7 */ + --chart-2: oklch(0.75 0.18 200); /* Cyan #7dcfff */ + --chart-3: oklch(0.75 0.18 140); /* Green #9ece6a */ + --chart-4: oklch(0.7 0.2 320); /* Magenta #bb9af7 */ + --chart-5: oklch(0.8 0.18 70); /* Yellow #e0af68 */ + + --sidebar: oklch(0.14 0.03 260); + --sidebar-foreground: oklch(0.85 0.02 250); + --sidebar-primary: oklch(0.7 0.18 280); + --sidebar-primary-foreground: oklch(0.16 0.03 260); + --sidebar-accent: oklch(0.24 0.03 260); + --sidebar-accent-foreground: oklch(0.85 0.02 250); + --sidebar-border: oklch(0.32 0.04 260); + --sidebar-ring: oklch(0.7 0.18 280); +} + +/* ======================================== + SOLARIZED DARK THEME + The classic color scheme by Ethan Schoonover + ======================================== */ +.solarized { + --background: oklch(0.2 0.02 230); /* #002b36 base03 */ + --background-50: oklch(0.2 0.02 230 / 0.5); + --background-80: oklch(0.2 0.02 230 / 0.8); + + --foreground: oklch(0.75 0.02 90); /* #839496 base0 */ + --foreground-secondary: oklch(0.6 0.03 200); /* #657b83 base00 */ + --foreground-muted: oklch(0.5 0.04 200); /* #586e75 base01 */ + + --card: oklch(0.23 0.02 230); /* #073642 base02 */ + --card-foreground: oklch(0.75 0.02 90); + --popover: oklch(0.22 0.02 230); + --popover-foreground: oklch(0.75 0.02 90); + + --primary: oklch(0.65 0.15 220); /* #268bd2 blue */ + --primary-foreground: oklch(0.2 0.02 230); + + --brand-400: oklch(0.7 0.15 220); + --brand-500: oklch(0.65 0.15 220); /* #268bd2 */ + --brand-600: oklch(0.6 0.17 220); + + --secondary: oklch(0.25 0.02 230); + --secondary-foreground: oklch(0.75 0.02 90); + + --muted: oklch(0.25 0.02 230); + --muted-foreground: oklch(0.5 0.04 200); + + --accent: oklch(0.28 0.03 230); + --accent-foreground: oklch(0.75 0.02 90); + + --destructive: oklch(0.55 0.2 25); /* #dc322f red */ + + --border: oklch(0.35 0.03 230); + --border-glass: oklch(0.65 0.15 220 / 0.3); + + --input: oklch(0.23 0.02 230); + --ring: oklch(0.65 0.15 220); + + --chart-1: oklch(0.65 0.15 220); /* Blue */ + --chart-2: oklch(0.6 0.18 180); /* Cyan #2aa198 */ + --chart-3: oklch(0.65 0.2 140); /* Green #859900 */ + --chart-4: oklch(0.7 0.18 55); /* Yellow #b58900 */ + --chart-5: oklch(0.6 0.2 30); /* Orange #cb4b16 */ + + --sidebar: oklch(0.18 0.02 230); + --sidebar-foreground: oklch(0.75 0.02 90); + --sidebar-primary: oklch(0.65 0.15 220); + --sidebar-primary-foreground: oklch(0.2 0.02 230); + --sidebar-accent: oklch(0.25 0.02 230); + --sidebar-accent-foreground: oklch(0.75 0.02 90); + --sidebar-border: oklch(0.35 0.03 230); + --sidebar-ring: oklch(0.65 0.15 220); +} + +/* ======================================== + GRUVBOX THEME + Retro groove color scheme + ======================================== */ +.gruvbox { + --background: oklch(0.18 0.02 60); /* #282828 bg */ + --background-50: oklch(0.18 0.02 60 / 0.5); + --background-80: oklch(0.18 0.02 60 / 0.8); + + --foreground: oklch(0.85 0.05 85); /* #ebdbb2 fg */ + --foreground-secondary: oklch(0.7 0.04 85); /* #d5c4a1 */ + --foreground-muted: oklch(0.55 0.04 85); /* #928374 */ + + --card: oklch(0.22 0.02 60); /* #3c3836 bg1 */ + --card-foreground: oklch(0.85 0.05 85); + --popover: oklch(0.2 0.02 60); + --popover-foreground: oklch(0.85 0.05 85); + + --primary: oklch(0.7 0.18 55); /* #fabd2f yellow */ + --primary-foreground: oklch(0.18 0.02 60); + + --brand-400: oklch(0.75 0.18 55); + --brand-500: oklch(0.7 0.18 55); /* Yellow */ + --brand-600: oklch(0.65 0.2 55); + + --secondary: oklch(0.26 0.02 60); /* #504945 bg2 */ + --secondary-foreground: oklch(0.85 0.05 85); + + --muted: oklch(0.26 0.02 60); + --muted-foreground: oklch(0.55 0.04 85); + + --accent: oklch(0.3 0.03 60); + --accent-foreground: oklch(0.85 0.05 85); + + --destructive: oklch(0.55 0.22 25); /* #fb4934 red */ + + --border: oklch(0.35 0.03 60); + --border-glass: oklch(0.7 0.18 55 / 0.3); + + --input: oklch(0.22 0.02 60); + --ring: oklch(0.7 0.18 55); + + --chart-1: oklch(0.7 0.18 55); /* Yellow */ + --chart-2: oklch(0.65 0.2 140); /* Green #b8bb26 */ + --chart-3: oklch(0.7 0.15 200); /* Aqua #8ec07c */ + --chart-4: oklch(0.6 0.2 30); /* Orange #fe8019 */ + --chart-5: oklch(0.6 0.2 320); /* Purple #d3869b */ + + --sidebar: oklch(0.16 0.02 60); + --sidebar-foreground: oklch(0.85 0.05 85); + --sidebar-primary: oklch(0.7 0.18 55); + --sidebar-primary-foreground: oklch(0.18 0.02 60); + --sidebar-accent: oklch(0.26 0.02 60); + --sidebar-accent-foreground: oklch(0.85 0.05 85); + --sidebar-border: oklch(0.35 0.03 60); + --sidebar-ring: oklch(0.7 0.18 55); +} + +/* ======================================== + CATPPUCCIN MOCHA THEME + Soothing pastel theme for the high-spirited + ======================================== */ +.catppuccin { + --background: oklch(0.18 0.02 260); /* #1e1e2e base */ + --background-50: oklch(0.18 0.02 260 / 0.5); + --background-80: oklch(0.18 0.02 260 / 0.8); + + --foreground: oklch(0.9 0.01 280); /* #cdd6f4 text */ + --foreground-secondary: oklch(0.75 0.02 280); /* #bac2de subtext1 */ + --foreground-muted: oklch(0.6 0.03 280); /* #a6adc8 subtext0 */ + + --card: oklch(0.22 0.02 260); /* #313244 surface0 */ + --card-foreground: oklch(0.9 0.01 280); + --popover: oklch(0.2 0.02 260); + --popover-foreground: oklch(0.9 0.01 280); + + --primary: oklch(0.75 0.15 280); /* #cba6f7 mauve */ + --primary-foreground: oklch(0.18 0.02 260); + + --brand-400: oklch(0.8 0.15 280); + --brand-500: oklch(0.75 0.15 280); /* Mauve */ + --brand-600: oklch(0.7 0.17 280); + + --secondary: oklch(0.26 0.02 260); /* #45475a surface1 */ + --secondary-foreground: oklch(0.9 0.01 280); + + --muted: oklch(0.26 0.02 260); + --muted-foreground: oklch(0.6 0.03 280); + + --accent: oklch(0.3 0.03 260); /* #585b70 surface2 */ + --accent-foreground: oklch(0.9 0.01 280); + + --destructive: oklch(0.65 0.2 15); /* #f38ba8 red */ + + --border: oklch(0.35 0.03 260); + --border-glass: oklch(0.75 0.15 280 / 0.3); + + --input: oklch(0.22 0.02 260); + --ring: oklch(0.75 0.15 280); + + --chart-1: oklch(0.75 0.15 280); /* Mauve */ + --chart-2: oklch(0.75 0.15 220); /* Blue #89b4fa */ + --chart-3: oklch(0.8 0.15 160); /* Green #a6e3a1 */ + --chart-4: oklch(0.8 0.15 350); /* Pink #f5c2e7 */ + --chart-5: oklch(0.85 0.12 90); /* Yellow #f9e2af */ + + --sidebar: oklch(0.16 0.02 260); /* #181825 mantle */ + --sidebar-foreground: oklch(0.9 0.01 280); + --sidebar-primary: oklch(0.75 0.15 280); + --sidebar-primary-foreground: oklch(0.18 0.02 260); + --sidebar-accent: oklch(0.26 0.02 260); + --sidebar-accent-foreground: oklch(0.9 0.01 280); + --sidebar-border: oklch(0.35 0.03 260); + --sidebar-ring: oklch(0.75 0.15 280); +} + +/* ======================================== + ONE DARK THEME + Atom's iconic One Dark theme + ======================================== */ +.onedark { + --background: oklch(0.19 0.01 250); /* #282c34 */ + --background-50: oklch(0.19 0.01 250 / 0.5); + --background-80: oklch(0.19 0.01 250 / 0.8); + + --foreground: oklch(0.85 0.02 240); /* #abb2bf */ + --foreground-secondary: oklch(0.7 0.02 240); + --foreground-muted: oklch(0.5 0.03 240); /* #5c6370 */ + + --card: oklch(0.23 0.01 250); /* #21252b */ + --card-foreground: oklch(0.85 0.02 240); + --popover: oklch(0.21 0.01 250); + --popover-foreground: oklch(0.85 0.02 240); + + --primary: oklch(0.7 0.18 230); /* #61afef blue */ + --primary-foreground: oklch(0.19 0.01 250); + + --brand-400: oklch(0.75 0.18 230); + --brand-500: oklch(0.7 0.18 230); /* Blue */ + --brand-600: oklch(0.65 0.2 230); + + --secondary: oklch(0.25 0.01 250); + --secondary-foreground: oklch(0.85 0.02 240); + + --muted: oklch(0.25 0.01 250); + --muted-foreground: oklch(0.5 0.03 240); + + --accent: oklch(0.28 0.02 250); + --accent-foreground: oklch(0.85 0.02 240); + + --destructive: oklch(0.6 0.2 20); /* #e06c75 red */ + + --border: oklch(0.35 0.02 250); + --border-glass: oklch(0.7 0.18 230 / 0.3); + + --input: oklch(0.23 0.01 250); + --ring: oklch(0.7 0.18 230); + + --chart-1: oklch(0.7 0.18 230); /* Blue */ + --chart-2: oklch(0.75 0.15 320); /* Magenta #c678dd */ + --chart-3: oklch(0.75 0.18 150); /* Green #98c379 */ + --chart-4: oklch(0.8 0.15 80); /* Yellow #e5c07b */ + --chart-5: oklch(0.7 0.15 180); /* Cyan #56b6c2 */ + + --sidebar: oklch(0.17 0.01 250); + --sidebar-foreground: oklch(0.85 0.02 240); + --sidebar-primary: oklch(0.7 0.18 230); + --sidebar-primary-foreground: oklch(0.19 0.01 250); + --sidebar-accent: oklch(0.25 0.01 250); + --sidebar-accent-foreground: oklch(0.85 0.02 240); + --sidebar-border: oklch(0.35 0.02 250); + --sidebar-ring: oklch(0.7 0.18 230); +} + +/* ======================================== + SYNTHWAVE '84 THEME + Neon dreams of the 80s + ======================================== */ +.synthwave { + --background: oklch(0.15 0.05 290); /* #262335 */ + --background-50: oklch(0.15 0.05 290 / 0.5); + --background-80: oklch(0.15 0.05 290 / 0.8); + + --foreground: oklch(0.95 0.02 320); /* #ffffff with warm tint */ + --foreground-secondary: oklch(0.75 0.05 320); + --foreground-muted: oklch(0.55 0.08 290); + + --card: oklch(0.2 0.06 290); /* #34294f */ + --card-foreground: oklch(0.95 0.02 320); + --popover: oklch(0.18 0.05 290); + --popover-foreground: oklch(0.95 0.02 320); + + --primary: oklch(0.7 0.28 350); /* #f97e72 hot pink */ + --primary-foreground: oklch(0.15 0.05 290); + + --brand-400: oklch(0.75 0.28 350); + --brand-500: oklch(0.7 0.28 350); /* Hot pink */ + --brand-600: oklch(0.65 0.3 350); + + --secondary: oklch(0.25 0.07 290); + --secondary-foreground: oklch(0.95 0.02 320); + + --muted: oklch(0.25 0.07 290); + --muted-foreground: oklch(0.55 0.08 290); + + --accent: oklch(0.3 0.08 290); + --accent-foreground: oklch(0.95 0.02 320); + + --destructive: oklch(0.6 0.25 15); + + --border: oklch(0.4 0.1 290); + --border-glass: oklch(0.7 0.28 350 / 0.3); + + --input: oklch(0.2 0.06 290); + --ring: oklch(0.7 0.28 350); + + --chart-1: oklch(0.7 0.28 350); /* Hot pink */ + --chart-2: oklch(0.8 0.25 200); /* Cyan #72f1b8 */ + --chart-3: oklch(0.85 0.2 60); /* Yellow #fede5d */ + --chart-4: oklch(0.7 0.25 280); /* Purple #ff7edb */ + --chart-5: oklch(0.7 0.2 30); /* Orange #f97e72 */ + + --sidebar: oklch(0.13 0.05 290); + --sidebar-foreground: oklch(0.95 0.02 320); + --sidebar-primary: oklch(0.7 0.28 350); + --sidebar-primary-foreground: oklch(0.15 0.05 290); + --sidebar-accent: oklch(0.25 0.07 290); + --sidebar-accent-foreground: oklch(0.95 0.02 320); + --sidebar-border: oklch(0.4 0.1 290); + --sidebar-ring: oklch(0.7 0.28 350); +} + @layer base { * { @apply border-border outline-ring/50; } + html { + @apply bg-background; + } body { @apply bg-background text-foreground; + background-color: var(--background); } } -/* Custom scrollbar for dark mode */ -.dark ::-webkit-scrollbar { +/* Custom scrollbar for dark themes */ +:is(.dark, .retro, .dracula, .nord, .monokai, .tokyonight, .solarized, .gruvbox, .catppuccin, .onedark, .synthwave) ::-webkit-scrollbar { width: 8px; height: 8px; } -.dark ::-webkit-scrollbar-track { - background: oklch(0.15 0 0); +:is(.dark, .retro, .dracula, .nord, .monokai, .tokyonight, .solarized, .gruvbox, .catppuccin, .onedark, .synthwave) ::-webkit-scrollbar-track { + background: var(--muted); } -.dark ::-webkit-scrollbar-thumb { +:is(.dark, .retro) ::-webkit-scrollbar-thumb { background: oklch(0.3 0 0); border-radius: 4px; } -.dark ::-webkit-scrollbar-thumb:hover { +:is(.dark, .retro) ::-webkit-scrollbar-thumb:hover { background: oklch(0.4 0 0); } +/* Retro Scrollbar override */ +.retro ::-webkit-scrollbar-thumb { + background: var(--primary); + border-radius: 0; +} +.retro ::-webkit-scrollbar-track { + background: var(--background); +} + /* Glass morphism utilities */ @layer utilities { .glass { @@ -219,11 +881,23 @@ /* Glass morphism background utilities */ .bg-glass { - background: oklch(0.04 0 0 / 0.5); + background: var(--card); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); } .bg-glass-80 { - background: oklch(0.04 0 0 / 0.8); + background: var(--popover); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + } + + .light .bg-glass { + background: oklch(1 0 0 / 0.8); + } + + .light .bg-glass-80 { + background: oklch(1 0 0 / 0.95); } /* Hover state utilities */ @@ -245,10 +919,449 @@ /* Content area background */ .content-bg { + background: var(--background); + } + + .light .content-bg { + background: linear-gradient(135deg, oklch(0.99 0 0), oklch(0.98 0 0), oklch(0.99 0 0)); + } + + .dark .content-bg { background: linear-gradient(135deg, oklch(0.04 0 0), oklch(0.08 0 0), oklch(0.04 0 0)); } } +/* Retro Overrides for Utilities */ +.retro .glass, +.retro .glass-subtle, +.retro .glass-strong, +.retro .bg-glass, +.retro .bg-glass-80 { + backdrop-filter: none; + background: var(--background); + border: 1px solid var(--border); +} + +.retro .gradient-brand { + background: var(--primary); + color: var(--primary-foreground); +} + +.retro .content-bg { + background: + linear-gradient(rgba(0, 255, 65, 0.03) 1px, transparent 1px), + linear-gradient(90deg, rgba(0, 255, 65, 0.03) 1px, transparent 1px), + var(--background); + background-size: 20px 20px; +} + +.retro * { + border-radius: 0 !important; +} + +/* Animated Outline Button Styles */ +.animated-outline-gradient { + /* Default gradient - purple to blue */ + background: conic-gradient(from 90deg at 50% 50%, #a855f7 0%, #3b82f6 50%, #a855f7 100%); +} + +/* Light mode - deeper purple to blue gradient for better visibility */ +.light .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #7c3aed 0%, #2563eb 50%, #7c3aed 100%); +} + +.light .animated-outline-inner { + background: oklch(100% 0 0) !important; + color: #7c3aed !important; + border: 1px solid oklch(92% 0 0); +} + +.light [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(97% 0.02 270) !important; + color: #5b21b6 !important; +} + +/* Dark mode - purple to blue gradient */ +.dark .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #a855f7 0%, #3b82f6 50%, #a855f7 100%); +} + +.dark .animated-outline-inner { + background: oklch(0.15 0 0) !important; + color: #c084fc !important; +} + +.dark [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(0.2 0.02 270) !important; + color: #e9d5ff !important; +} + +/* Retro mode - unique scanline + neon effect */ +.retro .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #00ff41 0%, #00ffff 25%, #ff00ff 50%, #00ffff 75%, #00ff41 100%); + animation: spin 2s linear infinite, retro-glow 1s ease-in-out infinite alternate; +} + +@keyframes retro-glow { + from { + filter: brightness(1) drop-shadow(0 0 2px #00ff41); + } + to { + filter: brightness(1.2) drop-shadow(0 0 8px #00ff41); + } +} + +.retro [data-slot="button"][class*="animated-outline"] { + border-radius: 0 !important; +} + +.retro .animated-outline-inner { + background: oklch(0 0 0) !important; + color: #00ff41 !important; + border-radius: 0 !important; + text-shadow: 0 0 5px #00ff41; + font-family: var(--font-geist-mono), monospace; + text-transform: uppercase; + letter-spacing: 0.1em; +} + +.retro [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(0.1 0.1 145) !important; + color: #00ff41 !important; + box-shadow: + 0 0 10px #00ff41, + 0 0 20px #00ff41, + inset 0 0 10px rgba(0, 255, 65, 0.1); + text-shadow: 0 0 10px #00ff41, 0 0 20px #00ff41; +} + +/* Dracula animated-outline - purple/pink */ +.dracula .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #bd93f9 0%, #ff79c6 50%, #bd93f9 100%); +} + +.dracula .animated-outline-inner { + background: oklch(0.18 0.02 280) !important; + color: #bd93f9 !important; +} + +.dracula [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(0.24 0.03 280) !important; + color: #ff79c6 !important; +} + +/* Nord animated-outline - frost blue */ +.nord .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #88c0d0 0%, #81a1c1 50%, #88c0d0 100%); +} + +.nord .animated-outline-inner { + background: oklch(0.23 0.02 240) !important; + color: #88c0d0 !important; +} + +.nord [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(0.28 0.03 240) !important; + color: #8fbcbb !important; +} + +/* Monokai animated-outline - pink/yellow */ +.monokai .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #f92672 0%, #e6db74 50%, #f92672 100%); +} + +.monokai .animated-outline-inner { + background: oklch(0.17 0.01 90) !important; + color: #f92672 !important; +} + +.monokai [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(0.22 0.02 90) !important; + color: #e6db74 !important; +} + +/* Tokyo Night animated-outline - blue/magenta */ +.tokyonight .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #7aa2f7 0%, #bb9af7 50%, #7aa2f7 100%); +} + +.tokyonight .animated-outline-inner { + background: oklch(0.16 0.03 260) !important; + color: #7aa2f7 !important; +} + +.tokyonight [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(0.22 0.04 260) !important; + color: #bb9af7 !important; +} + +/* Solarized animated-outline - blue/cyan */ +.solarized .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #268bd2 0%, #2aa198 50%, #268bd2 100%); +} + +.solarized .animated-outline-inner { + background: oklch(0.2 0.02 230) !important; + color: #268bd2 !important; +} + +.solarized [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(0.25 0.03 230) !important; + color: #2aa198 !important; +} + +/* Gruvbox animated-outline - yellow/orange */ +.gruvbox .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #fabd2f 0%, #fe8019 50%, #fabd2f 100%); +} + +.gruvbox .animated-outline-inner { + background: oklch(0.18 0.02 60) !important; + color: #fabd2f !important; +} + +.gruvbox [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(0.24 0.03 60) !important; + color: #fe8019 !important; +} + +/* Catppuccin animated-outline - mauve/pink */ +.catppuccin .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #cba6f7 0%, #f5c2e7 50%, #cba6f7 100%); +} + +.catppuccin .animated-outline-inner { + background: oklch(0.18 0.02 260) !important; + color: #cba6f7 !important; +} + +.catppuccin [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(0.24 0.03 260) !important; + color: #f5c2e7 !important; +} + +/* One Dark animated-outline - blue/magenta */ +.onedark .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #61afef 0%, #c678dd 50%, #61afef 100%); +} + +.onedark .animated-outline-inner { + background: oklch(0.19 0.01 250) !important; + color: #61afef !important; +} + +.onedark [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(0.25 0.02 250) !important; + color: #c678dd !important; +} + +/* Synthwave animated-outline - hot pink/cyan with glow */ +.synthwave .animated-outline-gradient { + background: conic-gradient(from 90deg at 50% 50%, #f97e72 0%, #72f1b8 25%, #ff7edb 50%, #72f1b8 75%, #f97e72 100%); + animation: spin 2s linear infinite, synthwave-glow 1.5s ease-in-out infinite alternate; +} + +@keyframes synthwave-glow { + from { + filter: brightness(1) drop-shadow(0 0 3px #f97e72); + } + to { + filter: brightness(1.3) drop-shadow(0 0 10px #ff7edb); + } +} + +.synthwave .animated-outline-inner { + background: oklch(0.15 0.05 290) !important; + color: #f97e72 !important; + text-shadow: 0 0 8px #f97e72; +} + +.synthwave [data-slot="button"][class*="animated-outline"]:hover .animated-outline-inner { + background: oklch(0.22 0.07 290) !important; + color: #72f1b8 !important; + text-shadow: 0 0 12px #72f1b8; + box-shadow: 0 0 15px rgba(114, 241, 184, 0.3); +} + +/* Slider Theme Styles */ +.light .slider-track { + background: oklch(90% 0 0); +} + +.light .slider-range { + background: linear-gradient(to right, #7c3aed, #2563eb); +} + +.light .slider-thumb { + background: oklch(100% 0 0); + border-color: oklch(80% 0 0); +} + +.dark .slider-track { + background: oklch(0.2 0 0); +} + +.dark .slider-range { + background: linear-gradient(to right, #a855f7, #3b82f6); +} + +.dark .slider-thumb { + background: oklch(0.25 0 0); + border-color: oklch(0.4 0 0); +} + +.retro .slider-track { + background: oklch(0.15 0.05 145); + border: 1px solid #00ff41; + border-radius: 0 !important; +} + +.retro .slider-range { + background: #00ff41; + box-shadow: 0 0 10px #00ff41, 0 0 5px #00ff41; + border-radius: 0 !important; +} + +.retro .slider-thumb { + background: oklch(0 0 0); + border: 2px solid #00ff41; + border-radius: 0 !important; + box-shadow: 0 0 8px #00ff41; +} + +.retro .slider-thumb:hover { + background: oklch(0.1 0.1 145); + box-shadow: 0 0 12px #00ff41, 0 0 20px #00ff41; +} + +/* Dracula slider */ +.dracula .slider-track { + background: oklch(0.28 0.03 280); +} + +.dracula .slider-range { + background: linear-gradient(to right, #bd93f9, #ff79c6); +} + +.dracula .slider-thumb { + background: oklch(0.22 0.02 280); + border-color: #bd93f9; +} + +/* Nord slider */ +.nord .slider-track { + background: oklch(0.31 0.02 240); +} + +.nord .slider-range { + background: linear-gradient(to right, #88c0d0, #81a1c1); +} + +.nord .slider-thumb { + background: oklch(0.27 0.02 240); + border-color: #88c0d0; +} + +/* Monokai slider */ +.monokai .slider-track { + background: oklch(0.25 0.02 90); +} + +.monokai .slider-range { + background: linear-gradient(to right, #f92672, #fd971f); +} + +.monokai .slider-thumb { + background: oklch(0.22 0.01 90); + border-color: #f92672; +} + +/* Tokyo Night slider */ +.tokyonight .slider-track { + background: oklch(0.24 0.03 260); +} + +.tokyonight .slider-range { + background: linear-gradient(to right, #7aa2f7, #bb9af7); +} + +.tokyonight .slider-thumb { + background: oklch(0.2 0.03 260); + border-color: #7aa2f7; +} + +/* Solarized slider */ +.solarized .slider-track { + background: oklch(0.25 0.02 230); +} + +.solarized .slider-range { + background: linear-gradient(to right, #268bd2, #2aa198); +} + +.solarized .slider-thumb { + background: oklch(0.23 0.02 230); + border-color: #268bd2; +} + +/* Gruvbox slider */ +.gruvbox .slider-track { + background: oklch(0.26 0.02 60); +} + +.gruvbox .slider-range { + background: linear-gradient(to right, #fabd2f, #fe8019); +} + +.gruvbox .slider-thumb { + background: oklch(0.22 0.02 60); + border-color: #fabd2f; +} + +/* Catppuccin slider */ +.catppuccin .slider-track { + background: oklch(0.26 0.02 260); +} + +.catppuccin .slider-range { + background: linear-gradient(to right, #cba6f7, #89b4fa); +} + +.catppuccin .slider-thumb { + background: oklch(0.22 0.02 260); + border-color: #cba6f7; +} + +/* One Dark slider */ +.onedark .slider-track { + background: oklch(0.25 0.01 250); +} + +.onedark .slider-range { + background: linear-gradient(to right, #61afef, #c678dd); +} + +.onedark .slider-thumb { + background: oklch(0.23 0.01 250); + border-color: #61afef; +} + +/* Synthwave slider */ +.synthwave .slider-track { + background: oklch(0.25 0.07 290); +} + +.synthwave .slider-range { + background: linear-gradient(to right, #f97e72, #ff7edb); + box-shadow: 0 0 10px #f97e72, 0 0 5px #ff7edb; +} + +.synthwave .slider-thumb { + background: oklch(0.2 0.06 290); + border-color: #f97e72; + box-shadow: 0 0 8px #f97e72; +} + /* Electron title bar drag region */ .titlebar-drag-region { -webkit-app-region: drag; diff --git a/app/src/app/layout.tsx b/app/src/app/layout.tsx index b968ddf9..017418b9 100644 --- a/app/src/app/layout.tsx +++ b/app/src/app/layout.tsx @@ -26,7 +26,7 @@ export default function RootLayout({ return ( {children} diff --git a/app/src/app/page.tsx b/app/src/app/page.tsx index a9691a92..c4ea914c 100644 --- a/app/src/app/page.tsx +++ b/app/src/app/page.tsx @@ -41,17 +41,52 @@ export default function Home() { // Apply theme class to document useEffect(() => { const root = document.documentElement; + root.classList.remove( + "dark", + "retro", + "light", + "dracula", + "nord", + "monokai", + "tokyonight", + "solarized", + "gruvbox", + "catppuccin", + "onedark", + "synthwave" + ); + if (theme === "dark") { root.classList.add("dark"); + } else if (theme === "retro") { + root.classList.add("retro"); + } else if (theme === "dracula") { + root.classList.add("dracula"); + } else if (theme === "nord") { + root.classList.add("nord"); + } else if (theme === "monokai") { + root.classList.add("monokai"); + } else if (theme === "tokyonight") { + root.classList.add("tokyonight"); + } else if (theme === "solarized") { + root.classList.add("solarized"); + } else if (theme === "gruvbox") { + root.classList.add("gruvbox"); + } else if (theme === "catppuccin") { + root.classList.add("catppuccin"); + } else if (theme === "onedark") { + root.classList.add("onedark"); + } else if (theme === "synthwave") { + root.classList.add("synthwave"); } else if (theme === "light") { - root.classList.remove("dark"); - } else { + root.classList.add("light"); + } else if (theme === "system") { // System theme const isDark = window.matchMedia("(prefers-color-scheme: dark)").matches; if (isDark) { root.classList.add("dark"); } else { - root.classList.remove("dark"); + root.classList.add("light"); } } }, [theme]); diff --git a/app/src/components/layout/sidebar.tsx b/app/src/components/layout/sidebar.tsx index 6652a0ec..2e4afeab 100644 --- a/app/src/components/layout/sidebar.tsx +++ b/app/src/components/layout/sidebar.tsx @@ -264,7 +264,7 @@ export function Sidebar() { return (