@abumble/design-system 0.0.46 → 0.0.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/themes.js CHANGED
@@ -1,52 +1,52 @@
1
- import { jsx as k } from "react/jsx-runtime";
2
- import { useState as m, useEffect as c, useCallback as l, useMemo as E } from "react";
3
- import { T as y } from "./shared/useTheme.js";
1
+ import { jsx as S } from "react/jsx-runtime";
2
+ import { useState as m, useEffect as a, useCallback as l, useMemo as y } from "react";
3
+ import { T as E } from "./shared/useTheme.js";
4
4
  import { u as b } from "./shared/useTheme.js";
5
- const h = "theme", u = "color-theme";
5
+ const u = "theme", h = "color-theme";
6
6
  function v() {
7
7
  if (typeof window > "u") return "system";
8
- const e = localStorage.getItem(h);
8
+ const e = localStorage.getItem(u);
9
9
  return e === "light" || e === "dark" || e === "system" ? e : "dark";
10
10
  }
11
11
  function w(e) {
12
12
  if (typeof window > "u") return e;
13
- const o = localStorage.getItem(u);
14
- return o === "linen" || o === "steel" ? o : e;
13
+ const t = localStorage.getItem(h);
14
+ return t === "linen" || t === "steel" || t === "sage" || t === "dusk" || t === "canopy" ? t : e;
15
15
  }
16
16
  function C(e) {
17
- const o = document.documentElement;
18
- e === "dark" ? o.classList.add("dark") : o.classList.remove("dark");
17
+ const t = document.documentElement;
18
+ e === "dark" ? t.classList.add("dark") : t.classList.remove("dark");
19
19
  }
20
20
  function L(e) {
21
21
  document.documentElement.setAttribute("data-theme", e);
22
22
  }
23
23
  function _({
24
24
  children: e,
25
- defaultColorTheme: o = "steel"
25
+ defaultColorTheme: t = "steel"
26
26
  }) {
27
27
  const [r, f] = m(v), [s, T] = m(
28
- () => w(o)
28
+ () => w(t)
29
29
  ), [p, g] = m(
30
30
  () => window.matchMedia("(prefers-color-scheme: dark)").matches
31
31
  ), n = r === "system" ? p ? "dark" : "light" : r;
32
- c(() => {
32
+ a(() => {
33
33
  C(n);
34
- }, [n]), c(() => {
34
+ }, [n]), a(() => {
35
35
  L(s);
36
- }, [s]), c(() => {
36
+ }, [s]), a(() => {
37
37
  if (r !== "system") return;
38
- const t = window.matchMedia("(prefers-color-scheme: dark)"), i = () => g(t.matches);
39
- return t.addEventListener("change", i), () => t.removeEventListener("change", i);
38
+ const o = window.matchMedia("(prefers-color-scheme: dark)"), i = () => g(o.matches);
39
+ return o.addEventListener("change", i), () => o.removeEventListener("change", i);
40
40
  }, [r]);
41
- const a = l((t) => {
42
- f(t), localStorage.setItem(h, t);
43
- }, []), d = l((t) => {
44
- T(t), localStorage.setItem(u, t);
45
- }, []), S = E(
46
- () => ({ theme: r, setTheme: a, effectiveTheme: n, colorTheme: s, setColorTheme: d }),
47
- [r, a, n, s, d]
41
+ const c = l((o) => {
42
+ f(o), localStorage.setItem(u, o);
43
+ }, []), d = l((o) => {
44
+ T(o), localStorage.setItem(h, o);
45
+ }, []), k = y(
46
+ () => ({ theme: r, setTheme: c, effectiveTheme: n, colorTheme: s, setColorTheme: d }),
47
+ [r, c, n, s, d]
48
48
  );
49
- return /* @__PURE__ */ k(y.Provider, { value: S, children: e });
49
+ return /* @__PURE__ */ S(E.Provider, { value: k, children: e });
50
50
  }
51
51
  export {
52
52
  _ as ThemeProvider,
@@ -1 +1 @@
1
- {"version":3,"file":"themes.js","sources":["../src/themes/ThemeProvider.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { ThemeContext } from './ThemeContext'\nimport './linen.css'\nimport './steel.css'\n\nexport type Theme = 'light' | 'dark' | 'system'\nexport type ColorTheme = 'linen' | 'steel'\n\nconst STORAGE_KEY = 'theme'\nconst COLOR_THEME_STORAGE_KEY = 'color-theme'\n\nfunction getStoredTheme(): Theme {\n\tif (typeof window === 'undefined') return 'system'\n\tconst stored = localStorage.getItem(STORAGE_KEY)\n\tif (stored === 'light' || stored === 'dark' || stored === 'system')\n\t\treturn stored\n\treturn 'dark'\n}\n\nfunction getStoredColorTheme(defaultColorTheme: ColorTheme): ColorTheme {\n\tif (typeof window === 'undefined') return defaultColorTheme\n\tconst stored = localStorage.getItem(COLOR_THEME_STORAGE_KEY)\n\tif (stored === 'linen' || stored === 'steel') return stored\n\treturn defaultColorTheme\n}\n\nfunction applyTheme(effective: 'light' | 'dark') {\n\tconst root = document.documentElement\n\tif (effective === 'dark') {\n\t\troot.classList.add('dark')\n\t} else {\n\t\troot.classList.remove('dark')\n\t}\n}\n\nfunction applyColorTheme(colorTheme: ColorTheme) {\n\tdocument.documentElement.setAttribute('data-theme', colorTheme)\n}\n\nexport function ThemeProvider({\n\tchildren,\n\tdefaultColorTheme = 'steel',\n}: {\n\tchildren: ReactNode\n\tdefaultColorTheme?: ColorTheme\n}) {\n\tconst [theme, setThemeState] = useState<Theme>(getStoredTheme)\n\tconst [colorTheme, setColorThemeState] = useState<ColorTheme>(() =>\n\t\tgetStoredColorTheme(defaultColorTheme),\n\t)\n\tconst [systemDark, setSystemDark] = useState(\n\t\t() => window.matchMedia('(prefers-color-scheme: dark)').matches,\n\t)\n\n\tconst effectiveTheme: 'light' | 'dark' =\n\t\ttheme === 'system' ? (systemDark ? 'dark' : 'light') : theme\n\n\tuseEffect(() => {\n\t\tapplyTheme(effectiveTheme)\n\t}, [effectiveTheme])\n\n\tuseEffect(() => {\n\t\tapplyColorTheme(colorTheme)\n\t}, [colorTheme])\n\n\tuseEffect(() => {\n\t\tif (theme !== 'system') return\n\t\tconst media = window.matchMedia('(prefers-color-scheme: dark)')\n\t\tconst handler = () => setSystemDark(media.matches)\n\t\tmedia.addEventListener('change', handler)\n\t\treturn () => media.removeEventListener('change', handler)\n\t}, [theme])\n\n\tconst setTheme = useCallback((next: Theme) => {\n\t\tsetThemeState(next)\n\t\tlocalStorage.setItem(STORAGE_KEY, next)\n\t}, [])\n\n\tconst setColorTheme = useCallback((next: ColorTheme) => {\n\t\tsetColorThemeState(next)\n\t\tlocalStorage.setItem(COLOR_THEME_STORAGE_KEY, next)\n\t}, [])\n\n\tconst value = useMemo(\n\t\t() => ({ theme, setTheme, effectiveTheme, colorTheme, setColorTheme }),\n\t\t[theme, setTheme, effectiveTheme, colorTheme, setColorTheme],\n\t)\n\n\treturn (\n\t\t<ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n\t)\n}\n"],"names":["STORAGE_KEY","COLOR_THEME_STORAGE_KEY","getStoredTheme","stored","getStoredColorTheme","defaultColorTheme","applyTheme","effective","root","applyColorTheme","colorTheme","ThemeProvider","children","theme","setThemeState","useState","setColorThemeState","systemDark","setSystemDark","effectiveTheme","useEffect","media","handler","setTheme","useCallback","next","setColorTheme","value","useMemo","jsx","ThemeContext"],"mappings":";;;;AASA,MAAMA,IAAc,SACdC,IAA0B;AAEhC,SAASC,IAAwB;AAChC,MAAI,OAAO,SAAW,IAAa,QAAO;AAC1C,QAAMC,IAAS,aAAa,QAAQH,CAAW;AAC/C,SAAIG,MAAW,WAAWA,MAAW,UAAUA,MAAW,WAClDA,IACD;AACR;AAEA,SAASC,EAAoBC,GAA2C;AACvE,MAAI,OAAO,SAAW,IAAa,QAAOA;AAC1C,QAAMF,IAAS,aAAa,QAAQF,CAAuB;AAC3D,SAAIE,MAAW,WAAWA,MAAW,UAAgBA,IAC9CE;AACR;AAEA,SAASC,EAAWC,GAA6B;AAChD,QAAMC,IAAO,SAAS;AACtB,EAAID,MAAc,SACjBC,EAAK,UAAU,IAAI,MAAM,IAEzBA,EAAK,UAAU,OAAO,MAAM;AAE9B;AAEA,SAASC,EAAgBC,GAAwB;AAChD,WAAS,gBAAgB,aAAa,cAAcA,CAAU;AAC/D;AAEO,SAASC,EAAc;AAAA,EAC7B,UAAAC;AAAA,EACA,mBAAAP,IAAoB;AACrB,GAGG;AACF,QAAM,CAACQ,GAAOC,CAAa,IAAIC,EAAgBb,CAAc,GACvD,CAACQ,GAAYM,CAAkB,IAAID;AAAA,IAAqB,MAC7DX,EAAoBC,CAAiB;AAAA,EAAA,GAEhC,CAACY,GAAYC,CAAa,IAAIH;AAAA,IACnC,MAAM,OAAO,WAAW,8BAA8B,EAAE;AAAA,EAAA,GAGnDI,IACLN,MAAU,WAAYI,IAAa,SAAS,UAAWJ;AAExD,EAAAO,EAAU,MAAM;AACf,IAAAd,EAAWa,CAAc;AAAA,EAC1B,GAAG,CAACA,CAAc,CAAC,GAEnBC,EAAU,MAAM;AACf,IAAAX,EAAgBC,CAAU;AAAA,EAC3B,GAAG,CAACA,CAAU,CAAC,GAEfU,EAAU,MAAM;AACf,QAAIP,MAAU,SAAU;AACxB,UAAMQ,IAAQ,OAAO,WAAW,8BAA8B,GACxDC,IAAU,MAAMJ,EAAcG,EAAM,OAAO;AACjD,WAAAA,EAAM,iBAAiB,UAAUC,CAAO,GACjC,MAAMD,EAAM,oBAAoB,UAAUC,CAAO;AAAA,EACzD,GAAG,CAACT,CAAK,CAAC;AAEV,QAAMU,IAAWC,EAAY,CAACC,MAAgB;AAC7C,IAAAX,EAAcW,CAAI,GAClB,aAAa,QAAQzB,GAAayB,CAAI;AAAA,EACvC,GAAG,CAAA,CAAE,GAECC,IAAgBF,EAAY,CAACC,MAAqB;AACvD,IAAAT,EAAmBS,CAAI,GACvB,aAAa,QAAQxB,GAAyBwB,CAAI;AAAA,EACnD,GAAG,CAAA,CAAE,GAECE,IAAQC;AAAA,IACb,OAAO,EAAE,OAAAf,GAAO,UAAAU,GAAU,gBAAAJ,GAAgB,YAAAT,GAAY,eAAAgB,EAAA;AAAA,IACtD,CAACb,GAAOU,GAAUJ,GAAgBT,GAAYgB,CAAa;AAAA,EAAA;AAG5D,SACC,gBAAAG,EAACC,EAAa,UAAb,EAAsB,OAAAH,GAAe,UAAAf,EAAA,CAAS;AAEjD;"}
1
+ {"version":3,"file":"themes.js","sources":["../src/themes/ThemeProvider.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport { ThemeContext } from './ThemeContext'\nimport './linen.css'\nimport './steel.css'\nimport './sage.css'\nimport './dusk.css'\nimport './canopy.css'\n\nexport type Theme = 'light' | 'dark' | 'system'\nexport type ColorTheme = 'linen' | 'steel' | 'sage' | 'dusk' | 'canopy'\n\nconst STORAGE_KEY = 'theme'\nconst COLOR_THEME_STORAGE_KEY = 'color-theme'\n\nfunction getStoredTheme(): Theme {\n\tif (typeof window === 'undefined') return 'system'\n\tconst stored = localStorage.getItem(STORAGE_KEY)\n\tif (stored === 'light' || stored === 'dark' || stored === 'system')\n\t\treturn stored\n\treturn 'dark'\n}\n\nfunction getStoredColorTheme(defaultColorTheme: ColorTheme): ColorTheme {\n\tif (typeof window === 'undefined') return defaultColorTheme\n\tconst stored = localStorage.getItem(COLOR_THEME_STORAGE_KEY)\n\tif (stored === 'linen' || stored === 'steel' || stored === 'sage' || stored === 'dusk' || stored === 'canopy') return stored\n\treturn defaultColorTheme\n}\n\nfunction applyTheme(effective: 'light' | 'dark') {\n\tconst root = document.documentElement\n\tif (effective === 'dark') {\n\t\troot.classList.add('dark')\n\t} else {\n\t\troot.classList.remove('dark')\n\t}\n}\n\nfunction applyColorTheme(colorTheme: ColorTheme) {\n\tdocument.documentElement.setAttribute('data-theme', colorTheme)\n}\n\nexport function ThemeProvider({\n\tchildren,\n\tdefaultColorTheme = 'steel',\n}: {\n\tchildren: ReactNode\n\tdefaultColorTheme?: ColorTheme\n}) {\n\tconst [theme, setThemeState] = useState<Theme>(getStoredTheme)\n\tconst [colorTheme, setColorThemeState] = useState<ColorTheme>(() =>\n\t\tgetStoredColorTheme(defaultColorTheme),\n\t)\n\tconst [systemDark, setSystemDark] = useState(\n\t\t() => window.matchMedia('(prefers-color-scheme: dark)').matches,\n\t)\n\n\tconst effectiveTheme: 'light' | 'dark' =\n\t\ttheme === 'system' ? (systemDark ? 'dark' : 'light') : theme\n\n\tuseEffect(() => {\n\t\tapplyTheme(effectiveTheme)\n\t}, [effectiveTheme])\n\n\tuseEffect(() => {\n\t\tapplyColorTheme(colorTheme)\n\t}, [colorTheme])\n\n\tuseEffect(() => {\n\t\tif (theme !== 'system') return\n\t\tconst media = window.matchMedia('(prefers-color-scheme: dark)')\n\t\tconst handler = () => setSystemDark(media.matches)\n\t\tmedia.addEventListener('change', handler)\n\t\treturn () => media.removeEventListener('change', handler)\n\t}, [theme])\n\n\tconst setTheme = useCallback((next: Theme) => {\n\t\tsetThemeState(next)\n\t\tlocalStorage.setItem(STORAGE_KEY, next)\n\t}, [])\n\n\tconst setColorTheme = useCallback((next: ColorTheme) => {\n\t\tsetColorThemeState(next)\n\t\tlocalStorage.setItem(COLOR_THEME_STORAGE_KEY, next)\n\t}, [])\n\n\tconst value = useMemo(\n\t\t() => ({ theme, setTheme, effectiveTheme, colorTheme, setColorTheme }),\n\t\t[theme, setTheme, effectiveTheme, colorTheme, setColorTheme],\n\t)\n\n\treturn (\n\t\t<ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n\t)\n}\n"],"names":["STORAGE_KEY","COLOR_THEME_STORAGE_KEY","getStoredTheme","stored","getStoredColorTheme","defaultColorTheme","applyTheme","effective","root","applyColorTheme","colorTheme","ThemeProvider","children","theme","setThemeState","useState","setColorThemeState","systemDark","setSystemDark","effectiveTheme","useEffect","media","handler","setTheme","useCallback","next","setColorTheme","value","useMemo","jsx","ThemeContext"],"mappings":";;;;AAYA,MAAMA,IAAc,SACdC,IAA0B;AAEhC,SAASC,IAAwB;AAChC,MAAI,OAAO,SAAW,IAAa,QAAO;AAC1C,QAAMC,IAAS,aAAa,QAAQH,CAAW;AAC/C,SAAIG,MAAW,WAAWA,MAAW,UAAUA,MAAW,WAClDA,IACD;AACR;AAEA,SAASC,EAAoBC,GAA2C;AACvE,MAAI,OAAO,SAAW,IAAa,QAAOA;AAC1C,QAAMF,IAAS,aAAa,QAAQF,CAAuB;AAC3D,SAAIE,MAAW,WAAWA,MAAW,WAAWA,MAAW,UAAUA,MAAW,UAAUA,MAAW,WAAiBA,IAC/GE;AACR;AAEA,SAASC,EAAWC,GAA6B;AAChD,QAAMC,IAAO,SAAS;AACtB,EAAID,MAAc,SACjBC,EAAK,UAAU,IAAI,MAAM,IAEzBA,EAAK,UAAU,OAAO,MAAM;AAE9B;AAEA,SAASC,EAAgBC,GAAwB;AAChD,WAAS,gBAAgB,aAAa,cAAcA,CAAU;AAC/D;AAEO,SAASC,EAAc;AAAA,EAC7B,UAAAC;AAAA,EACA,mBAAAP,IAAoB;AACrB,GAGG;AACF,QAAM,CAACQ,GAAOC,CAAa,IAAIC,EAAgBb,CAAc,GACvD,CAACQ,GAAYM,CAAkB,IAAID;AAAA,IAAqB,MAC7DX,EAAoBC,CAAiB;AAAA,EAAA,GAEhC,CAACY,GAAYC,CAAa,IAAIH;AAAA,IACnC,MAAM,OAAO,WAAW,8BAA8B,EAAE;AAAA,EAAA,GAGnDI,IACLN,MAAU,WAAYI,IAAa,SAAS,UAAWJ;AAExD,EAAAO,EAAU,MAAM;AACf,IAAAd,EAAWa,CAAc;AAAA,EAC1B,GAAG,CAACA,CAAc,CAAC,GAEnBC,EAAU,MAAM;AACf,IAAAX,EAAgBC,CAAU;AAAA,EAC3B,GAAG,CAACA,CAAU,CAAC,GAEfU,EAAU,MAAM;AACf,QAAIP,MAAU,SAAU;AACxB,UAAMQ,IAAQ,OAAO,WAAW,8BAA8B,GACxDC,IAAU,MAAMJ,EAAcG,EAAM,OAAO;AACjD,WAAAA,EAAM,iBAAiB,UAAUC,CAAO,GACjC,MAAMD,EAAM,oBAAoB,UAAUC,CAAO;AAAA,EACzD,GAAG,CAACT,CAAK,CAAC;AAEV,QAAMU,IAAWC,EAAY,CAACC,MAAgB;AAC7C,IAAAX,EAAcW,CAAI,GAClB,aAAa,QAAQzB,GAAayB,CAAI;AAAA,EACvC,GAAG,CAAA,CAAE,GAECC,IAAgBF,EAAY,CAACC,MAAqB;AACvD,IAAAT,EAAmBS,CAAI,GACvB,aAAa,QAAQxB,GAAyBwB,CAAI;AAAA,EACnD,GAAG,CAAA,CAAE,GAECE,IAAQC;AAAA,IACb,OAAO,EAAE,OAAAf,GAAO,UAAAU,GAAU,gBAAAJ,GAAgB,YAAAT,GAAY,eAAAgB,EAAA;AAAA,IACtD,CAACb,GAAOU,GAAUJ,GAAgBT,GAAYgB,CAAa;AAAA,EAAA;AAG5D,SACC,gBAAAG,EAACC,EAAa,UAAb,EAAsB,OAAAH,GAAe,UAAAf,EAAA,CAAS;AAEjD;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abumble/design-system",
3
- "version": "0.0.46",
3
+ "version": "0.0.48",
4
4
  "files": [
5
5
  "dist",
6
6
  "src/styles.css",
@@ -52,6 +52,7 @@
52
52
  "prepublishOnly": "npm run build",
53
53
  "publish:npm": "npm publish --access public",
54
54
  "dev": "vite",
55
+ "sandbox": "vite --config sandbox/vite.config.ts",
55
56
  "storybook": "storybook dev -p 6006",
56
57
  "build-storybook": "storybook build"
57
58
  },
package/src/styles.css CHANGED
@@ -2,6 +2,8 @@
2
2
  @import 'tw-animate-css';
3
3
  @import './themes/linen.css';
4
4
  @import './themes/steel.css';
5
+ @import './themes/sage.css';
6
+ @import './themes/dusk.css';
5
7
 
6
8
  @tailwind base;
7
9
  @tailwind components;
@@ -9,6 +11,10 @@
9
11
 
10
12
  @custom-variant dark (&:is(.dark *));
11
13
 
14
+ :root {
15
+ --radius: 0.3rem;
16
+ }
17
+
12
18
  @theme {
13
19
  /*
14
20
  This defines the utility class 'list-square'
@@ -113,13 +119,17 @@
113
119
  }
114
120
 
115
121
  .sidebar {
116
- @apply text-sidebar-foreground;
122
+ @apply bg-sidebar text-sidebar-foreground;
117
123
  }
118
124
 
119
125
  .header {
120
126
  @apply z-50 fixed w-full h-14 top-0 px-3 flex justify-between text-card-foreground bg-card border-container items-center;
121
127
  }
122
128
 
129
+ .app-title {
130
+ @apply text-xl font-bold tracking-tight ml-2;
131
+ }
132
+
123
133
  .sub-heading {
124
134
  @apply mt-8 mb-1 font-semibold text-foreground;
125
135
  }
@@ -3,9 +3,12 @@ import { useCallback, useEffect, useMemo, useState } from 'react'
3
3
  import { ThemeContext } from './ThemeContext'
4
4
  import './linen.css'
5
5
  import './steel.css'
6
+ import './sage.css'
7
+ import './dusk.css'
8
+ import './canopy.css'
6
9
 
7
10
  export type Theme = 'light' | 'dark' | 'system'
8
- export type ColorTheme = 'linen' | 'steel'
11
+ export type ColorTheme = 'linen' | 'steel' | 'sage' | 'dusk' | 'canopy'
9
12
 
10
13
  const STORAGE_KEY = 'theme'
11
14
  const COLOR_THEME_STORAGE_KEY = 'color-theme'
@@ -21,7 +24,7 @@ function getStoredTheme(): Theme {
21
24
  function getStoredColorTheme(defaultColorTheme: ColorTheme): ColorTheme {
22
25
  if (typeof window === 'undefined') return defaultColorTheme
23
26
  const stored = localStorage.getItem(COLOR_THEME_STORAGE_KEY)
24
- if (stored === 'linen' || stored === 'steel') return stored
27
+ if (stored === 'linen' || stored === 'steel' || stored === 'sage' || stored === 'dusk' || stored === 'canopy') return stored
25
28
  return defaultColorTheme
26
29
  }
27
30
 
@@ -0,0 +1,157 @@
1
+ [data-theme="canopy"] {
2
+ /* --- Light Theme (Professional Navy & Sky — Product Dashboard) --- */
3
+ --background: oklch(0.97 0.008 210);
4
+ --foreground: oklch(0.16 0.035 225);
5
+
6
+ /* Brand palette */
7
+ --color-canopy: #0f172a;
8
+ --color-hive: #0ea5e9;
9
+ --color-parchment: #f1f5f9;
10
+
11
+ /* Chart palette */
12
+ --chart-1: oklch(0.65 0.18 142);
13
+ --chart-2: oklch(0.72 0.17 72);
14
+ --chart-3: oklch(0.69 0.19 38);
15
+ --chart-4: oklch(0.55 0.2 25);
16
+ --chart-5: oklch(0.57 0.22 264);
17
+ --chart-6: oklch(0.55 0.22 290);
18
+ --chart-7: oklch(0.62 0.2 314);
19
+ --chart-8: oklch(0.62 0.2 340);
20
+
21
+ /* Surfaces */
22
+ --card: oklch(1 0 0 / 0.85);
23
+ --card-foreground: oklch(0.16 0.035 225);
24
+
25
+ --popover: oklch(1 0 0);
26
+ --popover-foreground: oklch(0.16 0.035 225);
27
+
28
+ /* Primary: Sky Blue */
29
+ --primary: oklch(0.62 0.18 210);
30
+ --primary-foreground: oklch(1 0 0);
31
+
32
+ --secondary: oklch(0.93 0.01 210);
33
+ --secondary-foreground: oklch(0.62 0.18 210);
34
+
35
+ --muted: oklch(0.93 0.01 210);
36
+ --muted-foreground: oklch(0.5 0.02 210);
37
+
38
+ --accent: oklch(0.93 0.01 210);
39
+ --accent-foreground: oklch(0.62 0.18 210);
40
+
41
+ --destructive: oklch(0.55 0.19 15);
42
+ --destructive-foreground: oklch(1 0 0);
43
+
44
+ --border: oklch(0.88 0.008 210);
45
+ --input: oklch(0.88 0.008 210);
46
+ --ring: oklch(0.62 0.18 210 / 0.3);
47
+
48
+ /* Sidebar (Elevated cool surface) */
49
+ --sidebar: oklch(1 0 0);
50
+ --sidebar-foreground: oklch(0.16 0.035 225);
51
+ --sidebar-primary: oklch(0.62 0.18 210);
52
+ --sidebar-primary-foreground: oklch(1 0 0);
53
+ --sidebar-accent: oklch(0.93 0.01 210);
54
+ --sidebar-accent-foreground: oklch(0.16 0.035 225);
55
+ --sidebar-border: oklch(0.88 0.008 210);
56
+
57
+ /* Banners */
58
+ --banner-info: oklch(0.94 0.02 210);
59
+ --banner-info-foreground: oklch(0.24 0.09 210);
60
+ --banner-info-border: oklch(0.52 0.18 210);
61
+ --banner-note: oklch(0.94 0.02 162);
62
+ --banner-note-foreground: oklch(0.24 0.1 162);
63
+ --banner-note-border: oklch(0.48 0.16 162);
64
+ --banner-warning: oklch(0.95 0.04 78);
65
+ --banner-warning-foreground: oklch(0.34 0.13 62);
66
+ --banner-warning-border: oklch(0.62 0.18 72);
67
+ --banner-alert: oklch(0.95 0.03 22);
68
+ --banner-alert-foreground: oklch(0.34 0.14 22);
69
+ --banner-alert-border: oklch(0.52 0.2 22);
70
+
71
+ /* Interactive Elements */
72
+ --badge-success: oklch(0.35 0.1 160);
73
+ --badge-success-foreground: oklch(0.98 0.01 160);
74
+ --checkbox-checked: oklch(0.62 0.18 210);
75
+ --checkbox-checked-foreground: oklch(1 0 0);
76
+ --checkbox-unchecked-bg: oklch(1 0 0);
77
+ --checkbox-unchecked-border: oklch(0.85 0.01 210);
78
+ }
79
+
80
+ [data-theme="canopy"].dark {
81
+ /* --- Dark Theme (Deep Slate & Sky Glow) --- */
82
+ --background: oklch(0.14 0.03 240);
83
+ --foreground: oklch(0.95 0.005 210);
84
+
85
+ /* Brand palette — dark */
86
+ --color-canopy: #020617;
87
+ --color-hive: #38bdf8;
88
+ --color-parchment: #0f172a;
89
+
90
+ /* Chart palette — dark */
91
+ --chart-1: oklch(0.72 0.2 142);
92
+ --chart-2: oklch(0.78 0.18 72);
93
+ --chart-3: oklch(0.75 0.2 38);
94
+ --chart-4: oklch(0.65 0.22 25);
95
+ --chart-5: oklch(0.65 0.22 264);
96
+ --chart-6: oklch(0.63 0.22 290);
97
+ --chart-7: oklch(0.7 0.2 314);
98
+ --chart-8: oklch(0.7 0.2 340);
99
+
100
+ /* Card Elevation */
101
+ --card: oklch(0.19 0.035 235 / 0.75);
102
+ --card-foreground: oklch(0.95 0.005 210);
103
+
104
+ --popover: oklch(0.17 0.03 240);
105
+ --popover-foreground: oklch(0.95 0.005 210);
106
+
107
+ /* Primary: Bright Sky Glow */
108
+ --primary: oklch(0.72 0.18 210);
109
+ --primary-foreground: oklch(0.14 0.03 240);
110
+
111
+ --secondary: oklch(0.24 0.035 235);
112
+ --secondary-foreground: oklch(0.72 0.18 210);
113
+
114
+ --muted: oklch(0.24 0.035 235);
115
+ --muted-foreground: oklch(0.65 0.015 210);
116
+
117
+ --accent: oklch(0.24 0.035 235);
118
+ --accent-foreground: oklch(0.72 0.18 210);
119
+
120
+ --destructive: oklch(0.45 0.15 25);
121
+ --destructive-foreground: oklch(0.95 0.005 210);
122
+
123
+ --border: oklch(0.28 0.035 235);
124
+ --input: oklch(0.28 0.035 235);
125
+ --ring: oklch(0.72 0.18 210 / 0.3);
126
+
127
+ /* Sidebar (Deep Slate) */
128
+ --sidebar: oklch(0.19 0.035 235);
129
+ --sidebar-foreground: oklch(0.95 0.005 210);
130
+ --sidebar-primary: oklch(0.72 0.18 210);
131
+ --sidebar-primary-foreground: oklch(0.14 0.03 240);
132
+ --sidebar-accent: oklch(0.24 0.035 235);
133
+ --sidebar-accent-foreground: oklch(0.95 0.005 210);
134
+ --sidebar-border: oklch(0.28 0.035 235);
135
+
136
+ /* Banners (Dark) */
137
+ --banner-info: oklch(0.22 0.04 220);
138
+ --banner-info-foreground: oklch(0.88 0.05 220);
139
+ --banner-info-border: oklch(0.48 0.16 220);
140
+ --banner-note: oklch(0.22 0.05 155);
141
+ --banner-note-foreground: oklch(0.88 0.06 155);
142
+ --banner-note-border: oklch(0.5 0.12 155);
143
+ --banner-warning: oklch(0.26 0.06 70);
144
+ --banner-warning-foreground: oklch(0.92 0.1 80);
145
+ --banner-warning-border: oklch(0.65 0.2 75);
146
+ --banner-alert: oklch(0.23 0.05 25);
147
+ --banner-alert-foreground: oklch(0.9 0.06 25);
148
+ --banner-alert-border: oklch(0.44 0.14 25);
149
+
150
+ /* Interactive Elements (Dark) */
151
+ --badge-success: oklch(0.48 0.15 150);
152
+ --badge-success-foreground: oklch(1 0 0);
153
+ --checkbox-checked: oklch(0.72 0.18 210);
154
+ --checkbox-checked-foreground: oklch(0.14 0.03 240);
155
+ --checkbox-unchecked-bg: oklch(0.22 0.01 235);
156
+ --checkbox-unchecked-border: oklch(0.38 0.01 235);
157
+ }
@@ -0,0 +1,158 @@
1
+ [data-theme="dusk"] {
2
+ /* --- Light Theme (Creative, Sophisticated - Pale Lavender) --- */
3
+ --background: oklch(0.965 0.015 295);
4
+ --foreground: oklch(0.2 0.02 295);
5
+
6
+ /* Brand palette */
7
+ --color-canopy: oklch(0.16 0.04 285);
8
+ --color-hive: oklch(0.62 0.2 285);
9
+ --color-parchment: oklch(0.975 0.006 285);
10
+
11
+ /* Chart palette */
12
+ --chart-1: oklch(0.65 0.18 142);
13
+ --chart-2: oklch(0.72 0.17 72);
14
+ --chart-3: oklch(0.69 0.19 38);
15
+ --chart-4: oklch(0.55 0.2 25);
16
+ --chart-5: oklch(0.57 0.22 264);
17
+ --chart-6: oklch(0.55 0.22 290);
18
+ --chart-7: oklch(0.62 0.2 314);
19
+ --chart-8: oklch(0.62 0.2 340);
20
+
21
+ /* Surfaces */
22
+ --card: oklch(0.99 0.004 295 / 0.85);
23
+ --card-foreground: oklch(0.2 0.02 295);
24
+
25
+ --popover: oklch(1 0 0);
26
+ --popover-foreground: oklch(0.2 0.02 295);
27
+
28
+ /* Primary: Deep Violet */
29
+ --primary: oklch(0.3 0.06 295);
30
+ --primary-foreground: oklch(0.98 0.005 295);
31
+
32
+ /* Button/Surface Colors */
33
+ --secondary: oklch(0.97 0.005 295);
34
+ --secondary-foreground: oklch(0.3 0.06 295);
35
+
36
+ --muted: oklch(0.94 0.005 295);
37
+ --muted-foreground: oklch(0.52 0.02 295);
38
+
39
+ --accent: oklch(0.92 0.008 295);
40
+ --accent-foreground: oklch(0.3 0.06 295);
41
+
42
+ --destructive: oklch(0.55 0.15 25);
43
+ --destructive-foreground: oklch(1 0 0);
44
+
45
+ --border: oklch(0.89 0.006 295);
46
+ --input: oklch(0.89 0.006 295);
47
+ --ring: oklch(0.3 0.06 295 / 0.15);
48
+
49
+ /* Sidebar (Soft Lavender) */
50
+ --sidebar: oklch(0.99 0.004 295);
51
+ --sidebar-foreground: oklch(0.25 0.02 295);
52
+ --sidebar-primary: oklch(0.3 0.06 295);
53
+ --sidebar-primary-foreground: oklch(0.98 0.005 295);
54
+ --sidebar-accent: oklch(0.93 0.008 295);
55
+ --sidebar-accent-foreground: oklch(0.25 0.02 295);
56
+ --sidebar-border: oklch(0.91 0.006 295);
57
+
58
+ /* Banners */
59
+ --banner-info: oklch(0.94 0.02 245);
60
+ --banner-info-foreground: oklch(0.24 0.09 245);
61
+ --banner-info-border: oklch(0.52 0.18 245);
62
+ --banner-note: oklch(0.94 0.02 295);
63
+ --banner-note-foreground: oklch(0.24 0.1 295);
64
+ --banner-note-border: oklch(0.48 0.16 295);
65
+ --banner-warning: oklch(0.95 0.04 78);
66
+ --banner-warning-foreground: oklch(0.34 0.13 62);
67
+ --banner-warning-border: oklch(0.62 0.18 72);
68
+ --banner-alert: oklch(0.95 0.03 22);
69
+ --banner-alert-foreground: oklch(0.34 0.14 22);
70
+ --banner-alert-border: oklch(0.52 0.2 22);
71
+
72
+ /* Interactive Elements */
73
+ --badge-success: oklch(0.35 0.1 160);
74
+ --badge-success-foreground: oklch(0.98 0.01 160);
75
+ --checkbox-checked: oklch(0.3 0.06 295);
76
+ --checkbox-checked-foreground: oklch(1 0 0);
77
+ --checkbox-unchecked-bg: oklch(1 0 0);
78
+ --checkbox-unchecked-border: oklch(0.86 0.008 295);
79
+ }
80
+
81
+ [data-theme="dusk"].dark {
82
+ /* --- Dark Theme (Amethyst with Bright Purple Glow) --- */
83
+ --background: oklch(0.17 0.02 305);
84
+ --foreground: oklch(0.95 0.005 310);
85
+
86
+ /* Brand palette — dark */
87
+ --color-canopy: oklch(0.09 0.02 305);
88
+ --color-hive: oklch(0.78 0.2 305);
89
+ --color-parchment: oklch(0.17 0.018 305);
90
+
91
+ /* Chart palette — dark */
92
+ --chart-1: oklch(0.72 0.2 142);
93
+ --chart-2: oklch(0.78 0.18 72);
94
+ --chart-3: oklch(0.75 0.2 38);
95
+ --chart-4: oklch(0.65 0.22 25);
96
+ --chart-5: oklch(0.65 0.22 264);
97
+ --chart-6: oklch(0.63 0.22 290);
98
+ --chart-7: oklch(0.7 0.2 314);
99
+ --chart-8: oklch(0.7 0.2 340);
100
+
101
+ /* Card Elevation */
102
+ --card: oklch(0.22 0.025 305 / 0.75);
103
+ --card-foreground: oklch(0.95 0.005 310);
104
+
105
+ --popover: oklch(0.20 0.02 305);
106
+ --popover-foreground: oklch(0.95 0.005 310);
107
+
108
+ /* Primary: Bright Purple Glow */
109
+ --primary: oklch(0.88 0.1 305);
110
+ --primary-foreground: oklch(0.17 0.02 305);
111
+
112
+ --secondary: oklch(0.27 0.025 305);
113
+ --secondary-foreground: oklch(0.88 0.1 305);
114
+
115
+ --muted: oklch(0.27 0.025 305);
116
+ --muted-foreground: oklch(0.68 0.015 305);
117
+
118
+ --accent: oklch(0.27 0.025 305);
119
+ --accent-foreground: oklch(0.88 0.1 305);
120
+
121
+ --destructive: oklch(0.45 0.15 25);
122
+ --destructive-foreground: oklch(0.95 0.005 310);
123
+
124
+ --border: oklch(0.31 0.025 305);
125
+ --input: oklch(0.31 0.025 305);
126
+ --ring: oklch(0.88 0.1 305 / 0.3);
127
+
128
+ /* Sidebar (Amethyst) */
129
+ --sidebar: oklch(0.22 0.025 305);
130
+ --sidebar-foreground: oklch(0.95 0.005 310);
131
+ --sidebar-primary: oklch(0.88 0.1 305);
132
+ --sidebar-primary-foreground: oklch(0.17 0.02 305);
133
+ --sidebar-accent: oklch(0.27 0.025 305);
134
+ --sidebar-accent-foreground: oklch(0.95 0.005 310);
135
+ --sidebar-border: oklch(0.31 0.025 305);
136
+
137
+ /* Banners (Dark) */
138
+ --banner-info: oklch(0.22 0.04 260);
139
+ --banner-info-foreground: oklch(0.88 0.05 260);
140
+ --banner-info-border: oklch(0.48 0.16 260);
141
+ --banner-note: oklch(0.22 0.05 295);
142
+ --banner-note-foreground: oklch(0.88 0.06 295);
143
+ --banner-note-border: oklch(0.5 0.12 295);
144
+ --banner-warning: oklch(0.26 0.06 70);
145
+ --banner-warning-foreground: oklch(0.92 0.1 80);
146
+ --banner-warning-border: oklch(0.65 0.2 75);
147
+ --banner-alert: oklch(0.23 0.05 25);
148
+ --banner-alert-foreground: oklch(0.9 0.06 25);
149
+ --banner-alert-border: oklch(0.44 0.14 25);
150
+
151
+ /* Interactive Elements (Dark) */
152
+ --badge-success: oklch(0.48 0.15 150);
153
+ --badge-success-foreground: oklch(1 0 0);
154
+ --checkbox-checked: oklch(0.88 0.08 295);
155
+ --checkbox-checked-foreground: oklch(0.17 0.015 280);
156
+ --checkbox-unchecked-bg: oklch(0.24 0.01 280);
157
+ --checkbox-unchecked-border: oklch(0.38 0.01 280);
158
+ }