@quinkit/ui 0.1.0

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.
Files changed (37) hide show
  1. package/dist/index.d.cts +1445 -0
  2. package/dist/index.d.ts +1445 -0
  3. package/dist/index.js +2567 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.mjs +2366 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/package.json +97 -0
  8. package/src/styles/globals.css +150 -0
  9. package/src/styles/theme-switcher.tsx +95 -0
  10. package/src/styles/themes/.gitkeep +0 -0
  11. package/src/styles/themes/dashboard-data.css +64 -0
  12. package/src/styles/themes/dashboard-executive.css +64 -0
  13. package/src/styles/themes/dashboard-glass.css +64 -0
  14. package/src/styles/themes/dashboard.css +46 -0
  15. package/src/styles/themes/ecommerce-luxury.css +64 -0
  16. package/src/styles/themes/ecommerce-minimal.css +64 -0
  17. package/src/styles/themes/ecommerce-playful.css +64 -0
  18. package/src/styles/themes/ecommerce.css +36 -0
  19. package/src/styles/themes/edtech-campus.css +64 -0
  20. package/src/styles/themes/edtech-kids.css +64 -0
  21. package/src/styles/themes/edtech-professional.css +64 -0
  22. package/src/styles/themes/edtech.css +36 -0
  23. package/src/styles/themes/fintech-crypto.css +64 -0
  24. package/src/styles/themes/fintech-modern.css +64 -0
  25. package/src/styles/themes/fintech-wealth.css +64 -0
  26. package/src/styles/themes/fintech.css +46 -0
  27. package/src/styles/themes/healthcare-clinical.css +64 -0
  28. package/src/styles/themes/healthcare-urgent.css +64 -0
  29. package/src/styles/themes/healthcare-wellness.css +64 -0
  30. package/src/styles/themes/healthcare.css +46 -0
  31. package/src/styles/tokens/.gitkeep +0 -0
  32. package/src/styles/tokens/charts.css +26 -0
  33. package/src/styles/tokens/dark.css +36 -0
  34. package/src/styles/tokens/palettes.css +2663 -0
  35. package/src/styles/tokens/primitives.css +34 -0
  36. package/src/styles/tokens/semantic.css +35 -0
  37. package/src/styles/tokens/typography.css +82 -0
package/package.json ADDED
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "@quinkit/ui",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "Quinkit UI is a commercial, domain-specific React UI component library built as a shadcn/ui extension.",
6
+ "type": "module",
7
+ "homepage": "https://quinkit-ui.com",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/nomiwsd/quinkit-ui.git",
11
+ "directory": "packages/ui"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/nomiwsd/quinkit-ui/issues"
15
+ },
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "main": "./dist/index.js",
20
+ "module": "./dist/index.mjs",
21
+ "types": "./dist/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.mjs",
26
+ "require": "./dist/index.js"
27
+ },
28
+ "./styles": {
29
+ "default": "./src/styles/globals.css"
30
+ }
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "src/styles"
35
+ ],
36
+ "sideEffects": [
37
+ "**/*.css"
38
+ ],
39
+ "peerDependencies": {
40
+ "react": "^19.0.0",
41
+ "react-dom": "^19.0.0"
42
+ },
43
+ "devDependencies": {
44
+ "@storybook/react-vite": "latest",
45
+ "@tailwindcss/vite": "latest",
46
+ "@testing-library/jest-dom": "latest",
47
+ "@testing-library/react": "latest",
48
+ "@testing-library/user-event": "latest",
49
+ "@types/react": "latest",
50
+ "@types/react-dom": "latest",
51
+ "jsdom": "latest",
52
+ "react": "^19.0.0",
53
+ "react-dom": "^19.0.0",
54
+ "storybook": "latest",
55
+ "tailwindcss": "latest",
56
+ "tsup": "latest",
57
+ "typescript": "^5.9.3",
58
+ "vitest": "latest"
59
+ },
60
+ "dependencies": {
61
+ "@radix-ui/react-accordion": "^1.2.16",
62
+ "@radix-ui/react-alert-dialog": "^1.1.19",
63
+ "@radix-ui/react-aspect-ratio": "^1.1.11",
64
+ "@radix-ui/react-avatar": "^1.2.2",
65
+ "@radix-ui/react-checkbox": "^1.3.7",
66
+ "@radix-ui/react-dialog": "^1.1.19",
67
+ "@radix-ui/react-dropdown-menu": "^2.1.20",
68
+ "@radix-ui/react-label": "^2.1.11",
69
+ "@radix-ui/react-navigation-menu": "^1.2.18",
70
+ "@radix-ui/react-popover": "^1.1.19",
71
+ "@radix-ui/react-progress": "^1.1.12",
72
+ "@radix-ui/react-radio-group": "^1.4.3",
73
+ "@radix-ui/react-scroll-area": "^1.2.14",
74
+ "@radix-ui/react-select": "^2.3.3",
75
+ "@radix-ui/react-separator": "^1.1.11",
76
+ "@radix-ui/react-slot": "^1.3.0",
77
+ "@radix-ui/react-switch": "^1.3.3",
78
+ "@radix-ui/react-tabs": "^1.1.17",
79
+ "@radix-ui/react-tooltip": "^1.2.12",
80
+ "@tanstack/react-table": "^8.21.3",
81
+ "clsx": "^2.1.1",
82
+ "cmdk": "^1.1.1",
83
+ "date-fns": "^4.4.0",
84
+ "react-day-picker": "^10.0.1",
85
+ "react-hook-form": "^7.81.0",
86
+ "sonner": "^2.0.7",
87
+ "tailwind-merge": "^3.6.0"
88
+ },
89
+ "scripts": {
90
+ "build": "tsup",
91
+ "build-storybook": "storybook build",
92
+ "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
93
+ "storybook": "storybook dev -p 0 --no-open --ci",
94
+ "test": "vitest run",
95
+ "type-check": "tsc --noEmit"
96
+ }
97
+ }
@@ -0,0 +1,150 @@
1
+ @import "./tokens/typography.css";
2
+ @import "tailwindcss";
3
+ @import "./tokens/primitives.css";
4
+ @import "./tokens/semantic.css";
5
+ @import "./tokens/dark.css";
6
+ @import "./themes/dashboard.css";
7
+ @import "./themes/ecommerce.css";
8
+ @import "./themes/healthcare.css";
9
+ @import "./themes/fintech.css";
10
+ @import "./themes/edtech.css";
11
+ @import "./themes/dashboard-executive.css";
12
+ @import "./themes/dashboard-glass.css";
13
+ @import "./themes/dashboard-data.css";
14
+ @import "./themes/ecommerce-luxury.css";
15
+ @import "./themes/ecommerce-playful.css";
16
+ @import "./themes/ecommerce-minimal.css";
17
+ @import "./themes/healthcare-clinical.css";
18
+ @import "./themes/healthcare-wellness.css";
19
+ @import "./themes/healthcare-urgent.css";
20
+ @import "./themes/fintech-wealth.css";
21
+ @import "./themes/fintech-crypto.css";
22
+ @import "./themes/fintech-modern.css";
23
+ @import "./themes/edtech-campus.css";
24
+ @import "./themes/edtech-kids.css";
25
+ @import "./themes/edtech-professional.css";
26
+ @import "./tokens/charts.css";
27
+ @import "./tokens/palettes.css";
28
+
29
+ /* Tailwind v4 source detection is relative to this stylesheet. Include both
30
+ * the UI package and the dev app so utilities used outside packages/ui are
31
+ * generated when consumers import this stylesheet directly in the monorepo. */
32
+ @source "../";
33
+ @source "../../../../apps/dev/app";
34
+
35
+ /* Bridge ui-* tokens into Tailwind's @theme so utilities like bg-primary,
36
+ * text-muted-foreground, border-border, ring-ring resolve. Uses @theme inline
37
+ * because these reference other CSS variables (Tailwind v4 requirement). */
38
+ @theme inline {
39
+ --font-sans: var(--ui-font-body);
40
+ --font-serif: var(--ui-font-serif);
41
+ --font-mono: var(--ui-font-mono);
42
+ --font-heading: var(--ui-font-heading);
43
+ --font-body: var(--ui-font-body);
44
+
45
+ --text-xs: var(--ui-text-xs);
46
+ --text-xs--line-height: var(--ui-text-xs--line-height);
47
+ --text-sm: var(--ui-text-sm);
48
+ --text-sm--line-height: var(--ui-text-sm--line-height);
49
+ --text-base: var(--ui-text-base);
50
+ --text-base--line-height: var(--ui-text-base--line-height);
51
+ --text-lg: var(--ui-text-lg);
52
+ --text-lg--line-height: var(--ui-text-lg--line-height);
53
+ --text-xl: var(--ui-text-xl);
54
+ --text-xl--line-height: var(--ui-text-xl--line-height);
55
+ --text-2xl: var(--ui-text-2xl);
56
+ --text-2xl--line-height: var(--ui-text-2xl--line-height);
57
+ --text-3xl: var(--ui-text-3xl);
58
+ --text-3xl--line-height: var(--ui-text-3xl--line-height);
59
+ --text-4xl: var(--ui-text-4xl);
60
+ --text-4xl--line-height: var(--ui-text-4xl--line-height);
61
+ --text-5xl: var(--ui-text-5xl);
62
+ --text-5xl--line-height: var(--ui-text-5xl--line-height);
63
+ --text-6xl: var(--ui-text-6xl);
64
+ --text-6xl--line-height: var(--ui-text-6xl--line-height);
65
+ --text-7xl: var(--ui-text-7xl);
66
+ --text-7xl--line-height: var(--ui-text-7xl--line-height);
67
+ --text-8xl: var(--ui-text-8xl);
68
+ --text-8xl--line-height: var(--ui-text-8xl--line-height);
69
+ --text-9xl: var(--ui-text-9xl);
70
+ --text-9xl--line-height: var(--ui-text-9xl--line-height);
71
+
72
+ --leading-none: var(--ui-leading-none);
73
+ --leading-tight: var(--ui-leading-tight);
74
+ --leading-snug: var(--ui-leading-snug);
75
+ --leading-normal: var(--ui-leading-normal);
76
+ --leading-relaxed: var(--ui-leading-relaxed);
77
+ --leading-loose: var(--ui-leading-loose);
78
+ --tracking-tighter: var(--ui-tracking-tighter);
79
+ --tracking-tight: var(--ui-tracking-tight);
80
+ --tracking-normal: var(--ui-tracking-normal);
81
+ --tracking-wide: var(--ui-tracking-wide);
82
+ --tracking-wider: var(--ui-tracking-wider);
83
+ --tracking-widest: var(--ui-tracking-widest);
84
+
85
+ --color-background: var(--ui-color-background);
86
+ --color-foreground: var(--ui-color-foreground);
87
+
88
+ --color-card: var(--ui-color-card);
89
+ --color-card-foreground: var(--ui-color-card-foreground);
90
+
91
+ --color-popover: var(--ui-color-popover);
92
+ --color-popover-foreground: var(--ui-color-popover-foreground);
93
+
94
+ --color-primary: var(--ui-color-primary);
95
+ --color-primary-foreground: var(--ui-color-primary-foreground);
96
+
97
+ --color-secondary: var(--ui-color-secondary);
98
+ --color-secondary-foreground: var(--ui-color-secondary-foreground);
99
+
100
+ --color-muted: var(--ui-color-muted);
101
+ --color-muted-foreground: var(--ui-color-muted-foreground);
102
+
103
+ --color-accent: var(--ui-color-accent);
104
+ --color-accent-foreground: var(--ui-color-accent-foreground);
105
+
106
+ --color-destructive: var(--ui-color-destructive);
107
+ --color-destructive-foreground: var(--ui-color-destructive-foreground);
108
+
109
+ --color-success: var(--ui-color-success);
110
+ --color-success-foreground: var(--ui-color-success-foreground);
111
+
112
+ --color-warning: var(--ui-color-warning);
113
+ --color-warning-foreground: var(--ui-color-warning-foreground);
114
+
115
+ --color-border: var(--ui-color-border);
116
+ --color-input: var(--ui-color-input);
117
+ --color-ring: var(--ui-color-ring);
118
+
119
+ --color-chart-1: var(--ui-color-chart-1);
120
+ --color-chart-2: var(--ui-color-chart-2);
121
+ --color-chart-3: var(--ui-color-chart-3);
122
+ --color-chart-4: var(--ui-color-chart-4);
123
+ --color-chart-5: var(--ui-color-chart-5);
124
+
125
+ --radius-sm: var(--ui-radius-sm);
126
+ --radius-md: var(--ui-radius-md);
127
+ --radius-lg: var(--ui-radius-lg);
128
+ --radius-xl: var(--ui-radius-xl);
129
+ }
130
+
131
+ @layer base {
132
+ body {
133
+ font-family: var(--ui-font-body);
134
+ letter-spacing: var(--ui-tracking-body, 0em);
135
+ line-height: var(--ui-leading-body, 1.6);
136
+ }
137
+
138
+ h1,
139
+ h2,
140
+ h3,
141
+ h4,
142
+ h5,
143
+ h6,
144
+ .font-heading {
145
+ font-family: var(--ui-font-heading);
146
+ font-weight: var(--ui-weight-heading, 700);
147
+ letter-spacing: var(--ui-tracking-heading, -0.02em);
148
+ line-height: var(--ui-leading-heading, 1.15);
149
+ }
150
+ }
@@ -0,0 +1,95 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+ import {
5
+ type Appearance,
6
+ applyAppearance,
7
+ applyPalette,
8
+ getStoredAppearance,
9
+ getStoredPalette,
10
+ type UiPalette,
11
+ uiPalettes
12
+ } from "../lib/palettes";
13
+
14
+ /**
15
+ * Minimal palette + appearance switcher.
16
+ * - SSR-safe: reads storage only after mount, so server and first client
17
+ * render agree (avoids hydration mismatch).
18
+ * - Persists to localStorage via the appliers in palettes.ts.
19
+ * - No `any`.
20
+ *
21
+ * For zero-flash theming, also run a tiny inline script in <head> that sets
22
+ * document.documentElement.dataset.palette + the `dark` class from storage
23
+ * before React hydrates. This component then syncs with it.
24
+ */
25
+ export function ThemeSwitcher() {
26
+ const [mounted, setMounted] = useState(false);
27
+ const [palette, setPalette] = useState<UiPalette>("neutral-slate");
28
+ const [appearance, setAppearance] = useState<Appearance>("system");
29
+
30
+ useEffect(() => {
31
+ setPalette(getStoredPalette());
32
+ setAppearance(getStoredAppearance());
33
+ setMounted(true);
34
+ }, []);
35
+
36
+ useEffect(() => {
37
+ if (mounted) applyPalette(palette);
38
+ }, [mounted, palette]);
39
+
40
+ useEffect(() => {
41
+ if (!mounted) return;
42
+ applyAppearance(appearance);
43
+ if (appearance !== "system") return;
44
+ const mq = window.matchMedia("(prefers-color-scheme: dark)");
45
+ const onChange = () => applyAppearance("system");
46
+ mq.addEventListener("change", onChange);
47
+ return () => mq.removeEventListener("change", onChange);
48
+ }, [mounted, appearance]);
49
+
50
+ // Render a stable shell until mounted to keep SSR/CSR output identical.
51
+ if (!mounted) {
52
+ return <div aria-hidden className="h-9" />;
53
+ }
54
+
55
+ const appearances: Appearance[] = ["light", "dark", "system"];
56
+
57
+ return (
58
+ <div className="flex flex-wrap items-center gap-3">
59
+ <label className="flex items-center gap-2 text-sm text-muted-foreground">
60
+ Palette
61
+ <select
62
+ value={palette}
63
+ onChange={(e) => setPalette(e.target.value as UiPalette)}
64
+ className="rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
65
+ >
66
+ {uiPalettes.map((p) => (
67
+ <option key={p.value} value={p.value}>
68
+ {p.name} ({p.category})
69
+ </option>
70
+ ))}
71
+ </select>
72
+ </label>
73
+
74
+ <fieldset className="inline-flex rounded-md border border-input p-0.5">
75
+ <legend className="sr-only">Appearance</legend>
76
+ {appearances.map((a) => (
77
+ <button
78
+ key={a}
79
+ type="button"
80
+ aria-pressed={appearance === a}
81
+ onClick={() => setAppearance(a)}
82
+ className={
83
+ "rounded px-2.5 py-1 text-sm capitalize transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring " +
84
+ (appearance === a
85
+ ? "bg-primary text-primary-foreground"
86
+ : "text-muted-foreground hover:text-foreground")
87
+ }
88
+ >
89
+ {a}
90
+ </button>
91
+ ))}
92
+ </fieldset>
93
+ </div>
94
+ );
95
+ }
File without changes
@@ -0,0 +1,64 @@
1
+ /* FILE: packages/ui/src/styles/themes/dashboard-data.css */
2
+
3
+ [data-theme="dashboard-data"] {
4
+ --ui-font-heading: "Geist Mono", ui-monospace, "JetBrains Mono", monospace;
5
+ --ui-font-body: "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;
6
+ --ui-font-mono: "Geist Mono", ui-monospace, "JetBrains Mono", monospace;
7
+ --ui-tracking-heading: 0em;
8
+ --ui-tracking-body: 0em;
9
+ --ui-leading-heading: 1.2;
10
+ --ui-leading-body: 1.55;
11
+ --ui-weight-heading: 600;
12
+ --ui-radius-sm: 0rem;
13
+ --ui-radius-md: 0rem;
14
+ --ui-radius-lg: 0.125rem;
15
+ --ui-radius-xl: 0.25rem;
16
+ --ui-color-background: oklch(0.985 0 0);
17
+ --ui-color-foreground: oklch(0.18 0 0);
18
+ --ui-color-card: oklch(1 0 0);
19
+ --ui-color-card-foreground: oklch(0.18 0 0);
20
+ --ui-color-popover: oklch(1 0 0);
21
+ --ui-color-popover-foreground: oklch(0.18 0 0);
22
+ --ui-color-primary: oklch(0.715 0.126 215);
23
+ --ui-color-primary-foreground: oklch(0.2 0.02 215);
24
+ --ui-color-secondary: oklch(0.962 0 0);
25
+ --ui-color-secondary-foreground: oklch(0.29 0 0);
26
+ --ui-color-accent: oklch(0.95 0.03 215);
27
+ --ui-color-accent-foreground: oklch(0.3 0.07 215);
28
+ --ui-color-muted: oklch(0.968 0 0);
29
+ --ui-color-muted-foreground: oklch(0.5 0 0);
30
+ --ui-color-border: oklch(0.916 0 0);
31
+ --ui-color-input: oklch(0.916 0 0);
32
+ --ui-color-ring: oklch(0.715 0.126 215);
33
+ --ui-color-chart-1: oklch(0.62 0.15 200);
34
+ --ui-color-chart-2: oklch(0.6 0.2 300);
35
+ --ui-color-chart-3: oklch(0.66 0.15 150);
36
+ --ui-color-chart-4: oklch(0.72 0.15 75);
37
+ --ui-color-chart-5: oklch(0.62 0.2 25);
38
+ }
39
+
40
+ .dark[data-theme="dashboard-data"],
41
+ [data-theme="dashboard-data"].dark {
42
+ --ui-color-background: oklch(0.16 0 0);
43
+ --ui-color-foreground: oklch(0.96 0 0);
44
+ --ui-color-card: oklch(0.2 0 0);
45
+ --ui-color-card-foreground: oklch(0.96 0 0);
46
+ --ui-color-popover: oklch(0.2 0 0);
47
+ --ui-color-popover-foreground: oklch(0.96 0 0);
48
+ --ui-color-primary: oklch(0.715 0.126 215);
49
+ --ui-color-primary-foreground: oklch(0.2 0.02 215);
50
+ --ui-color-secondary: oklch(0.274 0 0);
51
+ --ui-color-secondary-foreground: oklch(0.972 0 0);
52
+ --ui-color-accent: oklch(0.3 0.05 215);
53
+ --ui-color-accent-foreground: oklch(0.92 0.04 215);
54
+ --ui-color-muted: oklch(0.274 0 0);
55
+ --ui-color-muted-foreground: oklch(0.712 0 0);
56
+ --ui-color-border: oklch(0.305 0 0);
57
+ --ui-color-input: oklch(0.33 0 0);
58
+ --ui-color-ring: oklch(0.715 0.126 215);
59
+ --ui-color-chart-1: oklch(0.72 0.14 200);
60
+ --ui-color-chart-2: oklch(0.7 0.18 300);
61
+ --ui-color-chart-3: oklch(0.74 0.14 150);
62
+ --ui-color-chart-4: oklch(0.8 0.14 75);
63
+ --ui-color-chart-5: oklch(0.7 0.18 25);
64
+ }
@@ -0,0 +1,64 @@
1
+ /* FILE: packages/ui/src/styles/themes/dashboard-executive.css */
2
+
3
+ [data-theme="dashboard-executive"] {
4
+ --ui-font-heading: "Geist", ui-sans-serif, system-ui, sans-serif;
5
+ --ui-font-body: "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;
6
+ --ui-font-mono: "Geist Mono", ui-monospace, "JetBrains Mono", monospace;
7
+ --ui-tracking-heading: -0.02em;
8
+ --ui-tracking-body: 0em;
9
+ --ui-leading-heading: 1.1;
10
+ --ui-leading-body: 1.5;
11
+ --ui-weight-heading: 600;
12
+ --ui-radius-sm: 0.125rem;
13
+ --ui-radius-md: 0.25rem;
14
+ --ui-radius-lg: 0.375rem;
15
+ --ui-radius-xl: 0.5rem;
16
+ --ui-color-background: oklch(0.994 0.003 255);
17
+ --ui-color-foreground: oklch(0.2 0.02 255);
18
+ --ui-color-card: oklch(1 0 0);
19
+ --ui-color-card-foreground: oklch(0.2 0.02 255);
20
+ --ui-color-popover: oklch(1 0 0);
21
+ --ui-color-popover-foreground: oklch(0.2 0.02 255);
22
+ --ui-color-primary: oklch(0.546 0.215 263);
23
+ --ui-color-primary-foreground: oklch(0.985 0 0);
24
+ --ui-color-secondary: oklch(0.962 0.006 255);
25
+ --ui-color-secondary-foreground: oklch(0.29 0.018 255);
26
+ --ui-color-accent: oklch(0.95 0.03 263);
27
+ --ui-color-accent-foreground: oklch(0.3 0.07 263);
28
+ --ui-color-muted: oklch(0.968 0.006 255);
29
+ --ui-color-muted-foreground: oklch(0.5 0.024 255);
30
+ --ui-color-border: oklch(0.916 0.006 255);
31
+ --ui-color-input: oklch(0.916 0.006 255);
32
+ --ui-color-ring: oklch(0.546 0.215 263);
33
+ --ui-color-chart-1: oklch(0.6 0.15 263);
34
+ --ui-color-chart-2: oklch(0.62 0.15 303);
35
+ --ui-color-chart-3: oklch(0.62 0.15 358);
36
+ --ui-color-chart-4: oklch(0.62 0.15 53);
37
+ --ui-color-chart-5: oklch(0.62 0.15 118);
38
+ }
39
+
40
+ .dark[data-theme="dashboard-executive"],
41
+ [data-theme="dashboard-executive"].dark {
42
+ --ui-color-background: oklch(0.17 0.02 255);
43
+ --ui-color-foreground: oklch(0.96 0.005 255);
44
+ --ui-color-card: oklch(0.205 0.022 255);
45
+ --ui-color-card-foreground: oklch(0.96 0.005 255);
46
+ --ui-color-popover: oklch(0.205 0.022 255);
47
+ --ui-color-popover-foreground: oklch(0.96 0.005 255);
48
+ --ui-color-primary: oklch(0.766 0.2 263);
49
+ --ui-color-primary-foreground: oklch(0.2 0.02 263);
50
+ --ui-color-secondary: oklch(0.274 0.01 255);
51
+ --ui-color-secondary-foreground: oklch(0.972 0.01 255);
52
+ --ui-color-accent: oklch(0.3 0.05 263);
53
+ --ui-color-accent-foreground: oklch(0.92 0.04 263);
54
+ --ui-color-muted: oklch(0.274 0.01 255);
55
+ --ui-color-muted-foreground: oklch(0.712 0.016 255);
56
+ --ui-color-border: oklch(0.305 0.01 255);
57
+ --ui-color-input: oklch(0.33 0.01 255);
58
+ --ui-color-ring: oklch(0.766 0.2 263);
59
+ --ui-color-chart-1: oklch(0.6 0.15 263);
60
+ --ui-color-chart-2: oklch(0.72 0.14 303);
61
+ --ui-color-chart-3: oklch(0.72 0.14 358);
62
+ --ui-color-chart-4: oklch(0.72 0.14 53);
63
+ --ui-color-chart-5: oklch(0.72 0.14 118);
64
+ }
@@ -0,0 +1,64 @@
1
+ /* FILE: packages/ui/src/styles/themes/dashboard-glass.css */
2
+
3
+ [data-theme="dashboard-glass"] {
4
+ --ui-font-heading: "Plus Jakarta Sans", ui-sans-serif, system-ui, sans-serif;
5
+ --ui-font-body: "Plus Jakarta Sans", ui-sans-serif, system-ui, sans-serif;
6
+ --ui-font-mono: "Geist Mono", ui-monospace, "JetBrains Mono", monospace;
7
+ --ui-tracking-heading: -0.015em;
8
+ --ui-tracking-body: 0em;
9
+ --ui-leading-heading: 1.15;
10
+ --ui-leading-body: 1.6;
11
+ --ui-weight-heading: 600;
12
+ --ui-radius-sm: 0.5rem;
13
+ --ui-radius-md: 0.75rem;
14
+ --ui-radius-lg: 1rem;
15
+ --ui-radius-xl: 1.5rem;
16
+ --ui-color-background: oklch(0.985 0.012 300);
17
+ --ui-color-foreground: oklch(0.24 0.03 300);
18
+ --ui-color-card: oklch(1 0.006 300 / 0.62);
19
+ --ui-color-card-foreground: oklch(0.24 0.03 300);
20
+ --ui-color-popover: oklch(1 0.006 300 / 0.62);
21
+ --ui-color-popover-foreground: oklch(0.24 0.03 300);
22
+ --ui-color-primary: oklch(0.622 0.212 284);
23
+ --ui-color-primary-foreground: oklch(0.2 0.02 284);
24
+ --ui-color-secondary: oklch(0.962 0.006 300);
25
+ --ui-color-secondary-foreground: oklch(0.29 0.018 300);
26
+ --ui-color-accent: oklch(0.774 0.126 292);
27
+ --ui-color-accent-foreground: oklch(0.2 0.02 292);
28
+ --ui-color-muted: oklch(0.968 0.006 300);
29
+ --ui-color-muted-foreground: oklch(0.5 0.024 300);
30
+ --ui-color-border: oklch(0.916 0.006 300);
31
+ --ui-color-input: oklch(0.916 0.006 300);
32
+ --ui-color-ring: oklch(0.622 0.212 284);
33
+ --ui-color-chart-1: oklch(0.6 0.15 284);
34
+ --ui-color-chart-2: oklch(0.62 0.15 324);
35
+ --ui-color-chart-3: oklch(0.62 0.15 19);
36
+ --ui-color-chart-4: oklch(0.62 0.15 74);
37
+ --ui-color-chart-5: oklch(0.62 0.15 139);
38
+ }
39
+
40
+ .dark[data-theme="dashboard-glass"],
41
+ [data-theme="dashboard-glass"].dark {
42
+ --ui-color-background: oklch(0.18 0.022 300);
43
+ --ui-color-foreground: oklch(0.96 0.008 300);
44
+ --ui-color-card: oklch(0.26 0.03 300 / 0.55);
45
+ --ui-color-card-foreground: oklch(0.96 0.008 300);
46
+ --ui-color-popover: oklch(0.26 0.03 300 / 0.55);
47
+ --ui-color-popover-foreground: oklch(0.96 0.008 300);
48
+ --ui-color-primary: oklch(0.68 0.2 284);
49
+ --ui-color-primary-foreground: oklch(0.2 0.02 284);
50
+ --ui-color-secondary: oklch(0.274 0.01 300);
51
+ --ui-color-secondary-foreground: oklch(0.972 0.01 300);
52
+ --ui-color-accent: oklch(0.774 0.126 292);
53
+ --ui-color-accent-foreground: oklch(0.2 0.02 292);
54
+ --ui-color-muted: oklch(0.274 0.01 300);
55
+ --ui-color-muted-foreground: oklch(0.712 0.016 300);
56
+ --ui-color-border: oklch(0.305 0.01 300);
57
+ --ui-color-input: oklch(0.33 0.01 300);
58
+ --ui-color-ring: oklch(0.68 0.2 284);
59
+ --ui-color-chart-1: oklch(0.6 0.15 284);
60
+ --ui-color-chart-2: oklch(0.72 0.14 324);
61
+ --ui-color-chart-3: oklch(0.72 0.14 19);
62
+ --ui-color-chart-4: oklch(0.72 0.14 74);
63
+ --ui-color-chart-5: oklch(0.72 0.14 139);
64
+ }
@@ -0,0 +1,46 @@
1
+ /* dashboard.css — Executive Clarity kit theme.
2
+ * Activated with: <html data-theme="dashboard">
3
+ */
4
+
5
+ [data-theme="dashboard"] {
6
+ --ui-color-primary: oklch(0.22 0.035 260);
7
+ --ui-color-primary-foreground: oklch(0.99 0 0);
8
+ --ui-color-secondary: oklch(0.96 0.008 260);
9
+ --ui-color-secondary-foreground: oklch(0.3 0.02 260);
10
+ --ui-color-accent: oklch(0.94 0.015 260);
11
+ --ui-color-accent-foreground: oklch(0.45 0.16 260);
12
+ --ui-color-muted: oklch(0.965 0.008 260);
13
+ --ui-color-muted-foreground: oklch(0.52 0.02 260);
14
+ --ui-color-border: oklch(0.9 0.01 260);
15
+ --ui-color-input: oklch(0.9 0.01 260);
16
+ --ui-color-ring: oklch(0.5 0.18 260);
17
+ --ui-color-chart-1: oklch(0.45 0.12 260);
18
+ --ui-color-chart-2: oklch(0.6 0.13 212);
19
+ --ui-color-chart-3: oklch(0.62 0.13 155);
20
+ --ui-color-chart-4: oklch(0.74 0.13 85);
21
+ --ui-color-chart-5: oklch(0.6 0.16 25);
22
+ --ui-radius-sm: 0.25rem;
23
+ --ui-radius-md: 0.375rem;
24
+ --ui-radius-lg: 0.5rem;
25
+ --ui-radius-xl: 0.75rem;
26
+ }
27
+
28
+ .dark[data-theme="dashboard"],
29
+ [data-theme="dashboard"].dark {
30
+ --ui-color-primary: oklch(0.93 0.015 260);
31
+ --ui-color-primary-foreground: oklch(0.18 0.03 260);
32
+ --ui-color-secondary: oklch(0.24 0.015 260);
33
+ --ui-color-secondary-foreground: oklch(0.98 0.01 260);
34
+ --ui-color-accent: oklch(0.28 0.02 260);
35
+ --ui-color-accent-foreground: oklch(0.7 0.14 260);
36
+ --ui-color-muted: oklch(0.24 0.015 260);
37
+ --ui-color-muted-foreground: oklch(0.7 0.02 260);
38
+ --ui-color-border: oklch(0.28 0.015 260);
39
+ --ui-color-input: oklch(0.3 0.015 260);
40
+ --ui-color-ring: oklch(0.65 0.15 260);
41
+ --ui-color-chart-1: oklch(0.72 0.13 260);
42
+ --ui-color-chart-2: oklch(0.72 0.12 212);
43
+ --ui-color-chart-3: oklch(0.72 0.13 155);
44
+ --ui-color-chart-4: oklch(0.8 0.13 85);
45
+ --ui-color-chart-5: oklch(0.7 0.16 25);
46
+ }
@@ -0,0 +1,64 @@
1
+ /* FILE: packages/ui/src/styles/themes/ecommerce-luxury.css */
2
+
3
+ [data-theme="ecommerce-luxury"] {
4
+ --ui-font-heading: "Playfair Display", ui-serif, Georgia, serif;
5
+ --ui-font-body: "Lato", ui-sans-serif, system-ui, sans-serif;
6
+ --ui-font-mono: "Geist Mono", ui-monospace, "JetBrains Mono", monospace;
7
+ --ui-tracking-heading: 0em;
8
+ --ui-tracking-body: 0.01em;
9
+ --ui-leading-heading: 1.05;
10
+ --ui-leading-body: 1.65;
11
+ --ui-weight-heading: 600;
12
+ --ui-radius-sm: 0rem;
13
+ --ui-radius-md: 0rem;
14
+ --ui-radius-lg: 0.125rem;
15
+ --ui-radius-xl: 0.25rem;
16
+ --ui-color-background: oklch(0.992 0.004 60);
17
+ --ui-color-foreground: oklch(0.22 0.01 60);
18
+ --ui-color-card: oklch(1 0 0);
19
+ --ui-color-card-foreground: oklch(0.22 0.01 60);
20
+ --ui-color-popover: oklch(1 0 0);
21
+ --ui-color-popover-foreground: oklch(0.22 0.01 60);
22
+ --ui-color-primary: oklch(0.3 0.009 59);
23
+ --ui-color-primary-foreground: oklch(0.985 0 0);
24
+ --ui-color-secondary: oklch(0.962 0.006 60);
25
+ --ui-color-secondary-foreground: oklch(0.29 0.018 60);
26
+ --ui-color-accent: oklch(0.728 0.099 82);
27
+ --ui-color-accent-foreground: oklch(0.2 0.02 82);
28
+ --ui-color-muted: oklch(0.968 0.006 60);
29
+ --ui-color-muted-foreground: oklch(0.5 0.024 60);
30
+ --ui-color-border: oklch(0.916 0.006 60);
31
+ --ui-color-input: oklch(0.916 0.006 60);
32
+ --ui-color-ring: oklch(0.3 0.009 59);
33
+ --ui-color-chart-1: oklch(0.6 0.15 59);
34
+ --ui-color-chart-2: oklch(0.62 0.15 99);
35
+ --ui-color-chart-3: oklch(0.62 0.15 154);
36
+ --ui-color-chart-4: oklch(0.62 0.15 209);
37
+ --ui-color-chart-5: oklch(0.62 0.15 274);
38
+ }
39
+
40
+ .dark[data-theme="ecommerce-luxury"],
41
+ [data-theme="ecommerce-luxury"].dark {
42
+ --ui-color-background: oklch(0.155 0.006 60);
43
+ --ui-color-foreground: oklch(0.95 0.006 60);
44
+ --ui-color-card: oklch(0.185 0.008 60);
45
+ --ui-color-card-foreground: oklch(0.95 0.006 60);
46
+ --ui-color-popover: oklch(0.185 0.008 60);
47
+ --ui-color-popover-foreground: oklch(0.95 0.006 60);
48
+ --ui-color-primary: oklch(0.68 0.009 59);
49
+ --ui-color-primary-foreground: oklch(0.2 0.02 59);
50
+ --ui-color-secondary: oklch(0.274 0.01 60);
51
+ --ui-color-secondary-foreground: oklch(0.972 0.01 60);
52
+ --ui-color-accent: oklch(0.728 0.099 82);
53
+ --ui-color-accent-foreground: oklch(0.2 0.02 82);
54
+ --ui-color-muted: oklch(0.274 0.01 60);
55
+ --ui-color-muted-foreground: oklch(0.712 0.016 60);
56
+ --ui-color-border: oklch(0.305 0.01 60);
57
+ --ui-color-input: oklch(0.33 0.01 60);
58
+ --ui-color-ring: oklch(0.68 0.009 59);
59
+ --ui-color-chart-1: oklch(0.6 0.15 59);
60
+ --ui-color-chart-2: oklch(0.72 0.14 99);
61
+ --ui-color-chart-3: oklch(0.72 0.14 154);
62
+ --ui-color-chart-4: oklch(0.72 0.14 209);
63
+ --ui-color-chart-5: oklch(0.72 0.14 274);
64
+ }