diff --git a/bun.lock b/bun.lock index 14576b16..a00cb113 100644 --- a/bun.lock +++ b/bun.lock @@ -99,6 +99,7 @@ "sounds": "workspace:*", "tailwind-merge": "^3.3.1", "tailwindcss-animate": "^1.0.7", + "themes": "workspace:*", "three": "^0.182.0", "types": "workspace:*", "vaul": "^1.1.2", @@ -239,6 +240,9 @@ "name": "sounds", "version": "1.0.0", }, + "src/workspaces/themes": { + "name": "themes", + }, "src/workspaces/types": { "name": "types", "version": "0.0.1", @@ -1999,6 +2003,8 @@ "text-segmentation": ["text-segmentation@1.0.3", "", { "dependencies": { "utrie": "^1.0.2" } }, "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw=="], + "themes": ["themes@workspace:src/workspaces/themes"], + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], diff --git a/package.json b/package.json index 5c844539..ca824df9 100644 --- a/package.json +++ b/package.json @@ -117,6 +117,7 @@ "sonner": "^2.0.7", "sounds": "workspace:*", "tailwind-merge": "^3.3.1", + "themes": "workspace:*", "tailwindcss-animate": "^1.0.7", "three": "^0.182.0", "types": "workspace:*", diff --git a/src/apps/officer-web/frontend.tsx b/src/apps/officer-web/frontend.tsx index 56e0db75..890a64ce 100644 --- a/src/apps/officer-web/frontend.tsx +++ b/src/apps/officer-web/frontend.tsx @@ -6,6 +6,7 @@ import { ThemeProvider } from '@/components/ui/ThemeProvider'; import { Toaster } from '@/components/ui/toaster'; import { Toaster as Sonner } from 'sonner'; import { TooltipProvider } from '@/components/ui/tooltip'; +import 'themes/DuckPond/client'; import './styles/index.css'; const headLinks = [ diff --git a/src/apps/officer-web/styles/globals.css b/src/apps/officer-web/styles/globals.css index 80db409c..85fac418 100644 --- a/src/apps/officer-web/styles/globals.css +++ b/src/apps/officer-web/styles/globals.css @@ -16,12 +16,12 @@ @theme { /* Duck Landing Page Colors */ - --color-duck-yellow: #F4C430; - --color-duck-orange: #EA580C; - --color-duck-teal: #0891B2; - --color-duck-forest: #166534; - --color-duck-dark: #14532D; - --color-duck-beige: #E7D4B5; + --color-duck-yellow: var(--duck-yellow); + --color-duck-orange: var(--duck-orange); + --color-duck-teal: var(--duck-teal); + --color-duck-forest: var(--duck-forest); + --color-duck-dark: var(--duck-dark); + --color-duck-beige: var(--duck-beige); --color-border: hsl(var(--border)); --color-input: hsl(var(--input)); @@ -120,119 +120,6 @@ } } -/* Definition of the design system. All colors, gradients, fonts, etc should be defined here. -All colors MUST be HSL. -*/ - -@layer base { - :root { - --cta: 211 74.77% 45.58%; - --cta-foreground: 0 0% 100%; - - --naturegreen: 145 79% 38%; - --naturegreen-foreground: 0 0% 100%; - - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; - - --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; - - --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; - - --primary: 222.2 47.4% 11.2%; - --primary-foreground: 210 40% 98%; - - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; - - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; - - --accent: 211 74.77% 45.58%; - --accent-foreground: 0 0% 0%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; - - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - --ring: 222.2 84% 4.9%; - - --radius: 0.5rem; - - /* Chart gradients */ - --chart-primary: 211 82% 64%; - --chart-secondary: 211 82% 84%; - - /* Status colors */ - --status-success: 142 76% 36%; - --status-warning: 43 96% 56%; - --status-in-progress: 211 82% 64%; - - --sidebar-background: 0 0% 98%; - --sidebar-foreground: 240 5.3% 26.1%; - --sidebar-primary: 240 5.9% 10%; - --sidebar-primary-foreground: 0 0% 98%; - --sidebar-accent: 240 4.8% 95.9%; - --sidebar-accent-foreground: 240 5.9% 10%; - --sidebar-border: 220 13% 91%; - --sidebar-ring: 217.2 91.2% 59.8%; - - /* Hover Effect */ - --ctahover: 211 91.53% 34.82%; - } - - .dark { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; - - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; - - --primary: 210 40% 98%; - --primary-foreground: 222.2 47.4% 11.2%; - - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; - - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - - --accent: 211 82% 64%; - --accent-foreground: 0 0% 0%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - --ring: 212.7 26.8% 83.9%; - - /* Chart gradients */ - --chart-primary: 211 82% 64%; - --chart-secondary: 211 82% 84%; - - /* Status colors */ - --status-success: 142 76% 36%; - --status-warning: 43 96% 56%; - --status-in-progress: 211 82% 64%; - - --sidebar-background: 240 5.9% 10%; - --sidebar-foreground: 240 4.8% 95.9%; - --sidebar-primary: 224.3 76.3% 48%; - --sidebar-primary-foreground: 0 0% 100%; - --sidebar-accent: 240 3.7% 15.9%; - --sidebar-accent-foreground: 240 4.8% 95.9%; - --sidebar-border: 240 3.7% 15.9%; - --sidebar-ring: 217.2 91.2% 59.8%; - } -} - @layer base { * { @apply border-border; @@ -259,268 +146,3 @@ All colors MUST be HSL. .file-grid [data-file-item][data-state="open"] .file-item-ellipsis { opacity: 1 !important; } - -/* File Viewer — Markdown Prose */ -.file-viewer-md { - color: #14532d; - font-size: 0.95rem; - line-height: 1.75; -} - -.file-viewer-md h1 { - font-size: 2em; - font-weight: 700; - margin: 1.5em 0 0.5em; - padding-bottom: 0.3em; - border-bottom: 2px solid rgba(20, 83, 45, 0.12); - letter-spacing: -0.02em; -} - -.file-viewer-md h2 { - font-size: 1.5em; - font-weight: 600; - margin: 1.4em 0 0.4em; - padding-bottom: 0.25em; - border-bottom: 1px solid rgba(20, 83, 45, 0.08); -} - -.file-viewer-md h3 { - font-size: 1.25em; - font-weight: 600; - margin: 1.2em 0 0.4em; -} - -.file-viewer-md h4, .file-viewer-md h5, .file-viewer-md h6 { - font-size: 1.05em; - font-weight: 600; - margin: 1em 0 0.3em; -} - -.file-viewer-md p { - margin: 0.75em 0; -} - -.file-viewer-md a { - color: #0891b2; - text-decoration: underline; - text-underline-offset: 2px; -} - -.file-viewer-md a:hover { - color: #0e7490; -} - -.file-viewer-md strong { - font-weight: 600; - color: #14532d; -} - -.file-viewer-md blockquote { - margin: 1em 0; - padding: 0.5em 1em; - border-left: 3px solid #0891b2; - background: rgba(8, 145, 178, 0.05); - border-radius: 0 0.5rem 0.5rem 0; - color: #166534; -} - -.file-viewer-md ul, .file-viewer-md ol { - margin: 0.75em 0; - padding-left: 1.75em; -} - -.file-viewer-md li { - margin: 0.25em 0; -} - -.file-viewer-md li::marker { - color: #0891b2; -} - -.file-viewer-md hr { - border: none; - height: 1px; - background: rgba(20, 83, 45, 0.12); - margin: 2em 0; -} - -.file-viewer-md table { - width: 100%; - border-collapse: collapse; - margin: 1em 0; - font-size: 0.9em; -} - -.file-viewer-md th { - background: rgba(8, 145, 178, 0.08); - font-weight: 600; - text-align: left; - padding: 0.5em 0.75em; - border: 1px solid rgba(20, 83, 45, 0.12); -} - -.file-viewer-md td { - padding: 0.5em 0.75em; - border: 1px solid rgba(20, 83, 45, 0.08); -} - -.file-viewer-md tr:nth-child(even) { - background: rgba(20, 83, 45, 0.02); -} - -.file-viewer-md img { - max-width: 100%; - border-radius: 0.5rem; - margin: 1em 0; -} - -.file-viewer-md input[type="checkbox"] { - accent-color: #0891b2; - margin-right: 0.5em; -} - -/* Skills — Markdown Prose */ -.skill-md { - color: #14532d; - font-size: 0.95rem; - line-height: 1.75; -} - -.skill-md h1 { - font-size: 2em; - font-weight: 700; - margin: 1.5em 0 0.5em; - padding-bottom: 0.3em; - border-bottom: 2px solid rgba(20, 83, 45, 0.12); - letter-spacing: -0.02em; -} - -.skill-md h2 { - font-size: 1.5em; - font-weight: 600; - margin: 1.4em 0 0.4em; - padding-bottom: 0.25em; - border-bottom: 1px solid rgba(20, 83, 45, 0.08); -} - -.skill-md h3 { - font-size: 1.25em; - font-weight: 600; - margin: 1.2em 0 0.4em; -} - -.skill-md h4, .skill-md h5, .skill-md h6 { - font-size: 1.05em; - font-weight: 600; - margin: 1em 0 0.3em; -} - -.skill-md p { - margin: 0.75em 0; -} - -.skill-md a { - color: #0891b2; - text-decoration: underline; - text-underline-offset: 2px; -} - -.skill-md a:hover { - color: #0e7490; -} - -.skill-md strong { - font-weight: 600; - color: #14532d; -} - -.skill-md blockquote { - margin: 1em 0; - padding: 0.5em 1em; - border-left: 3px solid #0891b2; - background: rgba(8, 145, 178, 0.05); - border-radius: 0 0.5rem 0.5rem 0; - color: #166534; -} - -.skill-md ul, .skill-md ol { - margin: 0.75em 0; - padding-left: 1.75em; -} - -.skill-md li { - margin: 0.25em 0; -} - -.skill-md li::marker { - color: #0891b2; -} - -.skill-md code { - padding: 0.15em 0.4em; - border-radius: 0.25rem; - background: rgba(8, 145, 178, 0.1); - color: #0891b2; - font-size: 0.85em; - font-family: ui-monospace, monospace; -} - -.skill-md pre { - margin: 1em 0; - padding: 1em; - border-radius: 0.5rem; - background: #0d1117; - overflow-x: auto; - font-size: 0.875rem; - line-height: 1.6; -} - -.skill-md pre code { - padding: 0; - border-radius: 0; - background: none; - color: #e6edf3; - font-size: inherit; -} - -.skill-md hr { - border: none; - height: 1px; - background: rgba(20, 83, 45, 0.12); - margin: 2em 0; -} - -.skill-md table { - width: 100%; - border-collapse: collapse; - margin: 1em 0; - font-size: 0.9em; -} - -.skill-md th { - background: rgba(8, 145, 178, 0.08); - font-weight: 600; - text-align: left; - padding: 0.5em 0.75em; - border: 1px solid rgba(20, 83, 45, 0.12); -} - -.skill-md td { - padding: 0.5em 0.75em; - border: 1px solid rgba(20, 83, 45, 0.08); -} - -.skill-md tr:nth-child(even) { - background: rgba(20, 83, 45, 0.02); -} - -.skill-md img { - max-width: 100%; - border-radius: 0.5rem; - margin: 1em 0; -} - -.skill-md input[type="checkbox"] { - accent-color: #0891b2; - margin-right: 0.5em; -} diff --git a/src/workspaces/components/Card.tsx b/src/workspaces/components/Card.tsx index 900c26ad..8f71f65a 100644 --- a/src/workspaces/components/Card.tsx +++ b/src/workspaces/components/Card.tsx @@ -2,10 +2,10 @@ import type { CSSProperties, ComponentPropsWithoutRef } from 'react'; import { cn } from 'helpers/cn'; export const cardStyle = (overrides?: CSSProperties): CSSProperties => ({ - backgroundColor: 'rgba(255, 255, 255, 0.9)', + backgroundColor: 'var(--card-bg)', backgroundImage: ` - linear-gradient(to right, rgba(20, 83, 45, 0.08) 1px, transparent 1px), - linear-gradient(to bottom, rgba(20, 83, 45, 0.08) 1px, transparent 1px) + linear-gradient(to right, var(--card-grid-color) 1px, transparent 1px), + linear-gradient(to bottom, var(--card-grid-color) 1px, transparent 1px) `, backgroundSize: '20px 20px', ...overrides, diff --git a/src/workspaces/components/ui/tailwind.css b/src/workspaces/components/ui/tailwind.css index 64e4be8a..62e6a492 100644 --- a/src/workspaces/components/ui/tailwind.css +++ b/src/workspaces/components/ui/tailwind.css @@ -2,109 +2,6 @@ @tailwind components; @tailwind utilities; -/* BLUE */ -@layer base { - :root { - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; - --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; - --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; - --primary: 221.2 83.2% 53.3%; - --primary-foreground: 210 40% 98%; - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; - --success: 142.1 76.2% 36.3%; - --success-foreground: 355.7 100% 97.3%; - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - --ring: 221.2 83.2% 53.3%; - --radius: 0.5rem; - --sidebar-border: none; - --sidebar-shadow: none; - --sidebar-width-icon: 10rem; - } - - .dark { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; - --primary: 217.2 91.2% 59.8%; - --primary-foreground: 222.2 47.4% 11.2%; - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; - --success: 142.1 76.2% 36.3%; - --success-foreground: 355.7 100% 97.3%; - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - --accent: 217.2 32.6% 17.5%; - --accent-foreground: 210 40% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - --ring: 224.3 76.3% 48%; - } -} - -/* GREEN */ -/* @layer base { - :root { - --background: 0 0% 100%; - --foreground: 240 10% 3.9%; - --card: 0 0% 100%; - --card-foreground: 240 10% 3.9%; - --popover: 0 0% 100%; - --popover-foreground: 240 10% 3.9%; - --primary: 142.1 76.2% 36.3%; - --primary-foreground: 355.7 100% 97.3%; - --secondary: 240 4.8% 95.9%; - --secondary-foreground: 240 5.9% 10%; - --muted: 240 4.8% 95.9%; - --muted-foreground: 240 3.8% 46.1%; - --accent: 240 4.8% 95.9%; - --accent-foreground: 240 5.9% 10%; - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 0 0% 98%; - --border: 240 5.9% 90%; - --input: 240 5.9% 90%; - --ring: 142.1 76.2% 36.3%; - --radius: 0.5rem; - } - - .dark { - --background: 20 14.3% 4.1%; - --foreground: 0 0% 95%; - --card: 24 9.8% 10%; - --card-foreground: 0 0% 95%; - --popover: 0 0% 9%; - --popover-foreground: 0 0% 95%; - --primary: 142.1 70.6% 45.3%; - --primary-foreground: 144.9 80.4% 10%; - --secondary: 240 3.7% 15.9%; - --secondary-foreground: 0 0% 98%; - --muted: 0 0% 15%; - --muted-foreground: 240 5% 64.9%; - --accent: 12 6.5% 15.1%; - --accent-foreground: 0 0% 98%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 0 85.7% 97.3%; - --border: 240 3.7% 15.9%; - --input: 240 3.7% 15.9%; - --ring: 142.4 71.8% 29.2%; - } -} */ - @layer base { * { @apply border-border; diff --git a/src/workspaces/themes/DuckPond/client.ts b/src/workspaces/themes/DuckPond/client.ts new file mode 100644 index 00000000..a0bea0e6 --- /dev/null +++ b/src/workspaces/themes/DuckPond/client.ts @@ -0,0 +1,2 @@ +import './variables.css'; +import './prose.css'; diff --git a/src/workspaces/themes/DuckPond/index.ts b/src/workspaces/themes/DuckPond/index.ts new file mode 100644 index 00000000..14af4343 --- /dev/null +++ b/src/workspaces/themes/DuckPond/index.ts @@ -0,0 +1 @@ +export const meta = { id: 'DuckPond', name: 'Duck Pond', description: 'Warm greens and teals inspired by a forest pond.' }; diff --git a/src/workspaces/themes/DuckPond/prose.css b/src/workspaces/themes/DuckPond/prose.css new file mode 100644 index 00000000..d07d0e13 --- /dev/null +++ b/src/workspaces/themes/DuckPond/prose.css @@ -0,0 +1,264 @@ +/* File Viewer — Markdown Prose */ +.file-viewer-md { + color: #14532d; + font-size: 0.95rem; + line-height: 1.75; +} + +.file-viewer-md h1 { + font-size: 2em; + font-weight: 700; + margin: 1.5em 0 0.5em; + padding-bottom: 0.3em; + border-bottom: 2px solid rgba(20, 83, 45, 0.12); + letter-spacing: -0.02em; +} + +.file-viewer-md h2 { + font-size: 1.5em; + font-weight: 600; + margin: 1.4em 0 0.4em; + padding-bottom: 0.25em; + border-bottom: 1px solid rgba(20, 83, 45, 0.08); +} + +.file-viewer-md h3 { + font-size: 1.25em; + font-weight: 600; + margin: 1.2em 0 0.4em; +} + +.file-viewer-md h4, .file-viewer-md h5, .file-viewer-md h6 { + font-size: 1.05em; + font-weight: 600; + margin: 1em 0 0.3em; +} + +.file-viewer-md p { + margin: 0.75em 0; +} + +.file-viewer-md a { + color: #0891b2; + text-decoration: underline; + text-underline-offset: 2px; +} + +.file-viewer-md a:hover { + color: #0e7490; +} + +.file-viewer-md strong { + font-weight: 600; + color: #14532d; +} + +.file-viewer-md blockquote { + margin: 1em 0; + padding: 0.5em 1em; + border-left: 3px solid #0891b2; + background: rgba(8, 145, 178, 0.05); + border-radius: 0 0.5rem 0.5rem 0; + color: #166534; +} + +.file-viewer-md ul, .file-viewer-md ol { + margin: 0.75em 0; + padding-left: 1.75em; +} + +.file-viewer-md li { + margin: 0.25em 0; +} + +.file-viewer-md li::marker { + color: #0891b2; +} + +.file-viewer-md hr { + border: none; + height: 1px; + background: rgba(20, 83, 45, 0.12); + margin: 2em 0; +} + +.file-viewer-md table { + width: 100%; + border-collapse: collapse; + margin: 1em 0; + font-size: 0.9em; +} + +.file-viewer-md th { + background: rgba(8, 145, 178, 0.08); + font-weight: 600; + text-align: left; + padding: 0.5em 0.75em; + border: 1px solid rgba(20, 83, 45, 0.12); +} + +.file-viewer-md td { + padding: 0.5em 0.75em; + border: 1px solid rgba(20, 83, 45, 0.08); +} + +.file-viewer-md tr:nth-child(even) { + background: rgba(20, 83, 45, 0.02); +} + +.file-viewer-md img { + max-width: 100%; + border-radius: 0.5rem; + margin: 1em 0; +} + +.file-viewer-md input[type="checkbox"] { + accent-color: #0891b2; + margin-right: 0.5em; +} + +/* Skills — Markdown Prose */ +.skill-md { + color: #14532d; + font-size: 0.95rem; + line-height: 1.75; +} + +.skill-md h1 { + font-size: 2em; + font-weight: 700; + margin: 1.5em 0 0.5em; + padding-bottom: 0.3em; + border-bottom: 2px solid rgba(20, 83, 45, 0.12); + letter-spacing: -0.02em; +} + +.skill-md h2 { + font-size: 1.5em; + font-weight: 600; + margin: 1.4em 0 0.4em; + padding-bottom: 0.25em; + border-bottom: 1px solid rgba(20, 83, 45, 0.08); +} + +.skill-md h3 { + font-size: 1.25em; + font-weight: 600; + margin: 1.2em 0 0.4em; +} + +.skill-md h4, .skill-md h5, .skill-md h6 { + font-size: 1.05em; + font-weight: 600; + margin: 1em 0 0.3em; +} + +.skill-md p { + margin: 0.75em 0; +} + +.skill-md a { + color: #0891b2; + text-decoration: underline; + text-underline-offset: 2px; +} + +.skill-md a:hover { + color: #0e7490; +} + +.skill-md strong { + font-weight: 600; + color: #14532d; +} + +.skill-md blockquote { + margin: 1em 0; + padding: 0.5em 1em; + border-left: 3px solid #0891b2; + background: rgba(8, 145, 178, 0.05); + border-radius: 0 0.5rem 0.5rem 0; + color: #166534; +} + +.skill-md ul, .skill-md ol { + margin: 0.75em 0; + padding-left: 1.75em; +} + +.skill-md li { + margin: 0.25em 0; +} + +.skill-md li::marker { + color: #0891b2; +} + +.skill-md code { + padding: 0.15em 0.4em; + border-radius: 0.25rem; + background: rgba(8, 145, 178, 0.1); + color: #0891b2; + font-size: 0.85em; + font-family: ui-monospace, monospace; +} + +.skill-md pre { + margin: 1em 0; + padding: 1em; + border-radius: 0.5rem; + background: #0d1117; + overflow-x: auto; + font-size: 0.875rem; + line-height: 1.6; +} + +.skill-md pre code { + padding: 0; + border-radius: 0; + background: none; + color: #e6edf3; + font-size: inherit; +} + +.skill-md hr { + border: none; + height: 1px; + background: rgba(20, 83, 45, 0.12); + margin: 2em 0; +} + +.skill-md table { + width: 100%; + border-collapse: collapse; + margin: 1em 0; + font-size: 0.9em; +} + +.skill-md th { + background: rgba(8, 145, 178, 0.08); + font-weight: 600; + text-align: left; + padding: 0.5em 0.75em; + border: 1px solid rgba(20, 83, 45, 0.12); +} + +.skill-md td { + padding: 0.5em 0.75em; + border: 1px solid rgba(20, 83, 45, 0.08); +} + +.skill-md tr:nth-child(even) { + background: rgba(20, 83, 45, 0.02); +} + +.skill-md img { + max-width: 100%; + border-radius: 0.5rem; + margin: 1em 0; +} + +.skill-md input[type="checkbox"] { + accent-color: #0891b2; + margin-right: 0.5em; +} diff --git a/src/workspaces/themes/DuckPond/variables.css b/src/workspaces/themes/DuckPond/variables.css new file mode 100644 index 00000000..29e4849d --- /dev/null +++ b/src/workspaces/themes/DuckPond/variables.css @@ -0,0 +1,144 @@ +@layer base { + :root { + /* Duck brand hex colors */ + --duck-yellow: #F4C430; + --duck-orange: #EA580C; + --duck-teal: #0891B2; + --duck-forest: #166534; + --duck-dark: #14532D; + --duck-beige: #E7D4B5; + + /* Card component */ + --card-bg: rgba(255, 255, 255, 0.9); + --card-grid-color: rgba(20, 83, 45, 0.08); + + --cta: 211 74.77% 45.58%; + --cta-foreground: 0 0% 100%; + + --naturegreen: 145 79% 38%; + --naturegreen-foreground: 0 0% 100%; + + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 211 74.77% 45.58%; + --accent-foreground: 0 0% 0%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --success: 142.1 76.2% 36.3%; + --success-foreground: 355.7 100% 97.3%; + + --brand: 145 79% 38%; + --brand-foreground: 0 0% 100%; + --brand-muted: 145 40% 90%; + + --warning: 43 96% 56%; + --warning-foreground: 0 0% 0%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + + /* Chart gradients */ + --chart-primary: 211 82% 64%; + --chart-secondary: 211 82% 84%; + + /* Status colors */ + --status-success: 142 76% 36%; + --status-warning: 43 96% 56%; + --status-in-progress: 211 82% 64%; + + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%; + + /* Hover Effect */ + --ctahover: 211 91.53% 34.82%; + } + + .dark { + /* Card component */ + --card-bg: rgba(10, 20, 15, 0.9); + --card-grid-color: rgba(200, 230, 210, 0.06); + + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 211 82% 64%; + --accent-foreground: 0 0% 0%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --success: 142.1 76.2% 36.3%; + --success-foreground: 355.7 100% 97.3%; + + --brand: 145 60% 45%; + --brand-foreground: 0 0% 100%; + --brand-muted: 145 30% 25%; + + --warning: 43 96% 56%; + --warning-foreground: 0 0% 0%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + + /* Chart gradients */ + --chart-primary: 211 82% 64%; + --chart-secondary: 211 82% 84%; + + /* Status colors */ + --status-success: 142 76% 36%; + --status-warning: 43 96% 56%; + --status-in-progress: 211 82% 64%; + + --sidebar-background: 240 5.9% 10%; + --sidebar-foreground: 240 4.8% 95.9%; + --sidebar-primary: 224.3 76.3% 48%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 240 3.7% 15.9%; + --sidebar-accent-foreground: 240 4.8% 95.9%; + --sidebar-border: 240 3.7% 15.9%; + --sidebar-ring: 217.2 91.2% 59.8%; + } +} diff --git a/src/workspaces/themes/index.ts b/src/workspaces/themes/index.ts new file mode 100644 index 00000000..9e1282b5 --- /dev/null +++ b/src/workspaces/themes/index.ts @@ -0,0 +1 @@ +export const themes = [{ id: 'DuckPond', name: 'Duck Pond' }] as const; diff --git a/src/workspaces/themes/package.json b/src/workspaces/themes/package.json new file mode 100644 index 00000000..f0986315 --- /dev/null +++ b/src/workspaces/themes/package.json @@ -0,0 +1,9 @@ +{ + "name": "themes", + "private": true, + "exports": { + ".": "./index.ts", + "./DuckPond": "./DuckPond/index.ts", + "./DuckPond/client": "./DuckPond/client.ts" + } +}