@gv-tech/design-system 2.1.0 → 2.2.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.
- package/.github/CONTRIBUTING.md +14 -10
- package/.github/RELEASING.md +1 -1
- package/.github/copilot-instructions.md +30 -62
- package/.release-please-manifest.json +1 -1
- package/CHANGELOG.md +19 -0
- package/README.md +8 -9
- package/dist/components/ui/theme-toggle.test.d.ts +2 -0
- package/dist/components/ui/theme-toggle.test.d.ts.map +1 -0
- package/dist/design-system.css +1 -1
- package/dist/favicon.png +0 -0
- package/dist/hooks/use-theme.d.ts +52 -0
- package/dist/hooks/use-theme.d.ts.map +1 -0
- package/dist/hooks/use-theme.test.d.ts +2 -0
- package/dist/hooks/use-theme.test.d.ts.map +1 -0
- package/dist/index.cjs.js +2 -2
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +829 -773
- package/dist/index.es.js.map +1 -1
- package/dist/logo192.png +0 -0
- package/dist/logo512.png +0 -0
- package/dist/manifest.json +3 -3
- package/dist/pages/ColorTokensDocs.d.ts.map +1 -1
- package/dist/pages/components/ThemeToggleDocs.d.ts.map +1 -1
- package/dist/registry/alert-dialog.test.json +1 -1
- package/dist/registry/index.json +7 -0
- package/dist/registry/theme-toggle.json +1 -1
- package/dist/registry/theme-toggle.test.json +13 -0
- package/dist/theme/tokens.d.ts +115 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/index.html +1 -1
- package/package.json +9 -9
- package/public/favicon.png +0 -0
- package/public/logo192.png +0 -0
- package/public/logo512.png +0 -0
- package/public/manifest.json +3 -3
- package/scripts/validate.js +1 -0
- package/src/components/ui/alert-dialog.test.tsx +2 -0
- package/src/components/ui/theme-toggle.test.tsx +49 -0
- package/src/components/ui/theme-toggle.tsx +1 -1
- package/src/globals.css +2 -1
- package/src/hooks/use-theme.test.tsx +27 -0
- package/src/hooks/use-theme.ts +15 -0
- package/src/index.ts +2 -1
- package/src/pages/ColorTokensDocs.tsx +173 -136
- package/src/pages/components/ThemeToggleDocs.tsx +35 -8
- package/src/theme/tokens.ts +68 -0
- package/.nvmrc +0 -1
- package/babel.config.js +0 -3
- package/dist/favicon.ico +0 -0
- package/dist/lib/tokens.d.ts +0 -54
- package/dist/lib/tokens.d.ts.map +0 -1
- package/netlify.toml +0 -6
- package/public/favicon.ico +0 -0
- package/serve.json +0 -4
- package/src/lib/tokens.ts +0 -54
- package/temp.md +0 -292
|
@@ -1,177 +1,214 @@
|
|
|
1
1
|
import { CodeBlock } from '@/components/docs/CodeBlock';
|
|
2
2
|
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
|
3
3
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table';
|
|
4
|
-
import { tokens } from '@/
|
|
4
|
+
import { tokens } from '@/theme/tokens';
|
|
5
5
|
|
|
6
6
|
export function ColorTokensDocs() {
|
|
7
7
|
return (
|
|
8
|
-
<div className="space-y-
|
|
9
|
-
<div className="space-y-
|
|
10
|
-
<h1 className="text-
|
|
11
|
-
<p className="text-
|
|
12
|
-
|
|
8
|
+
<div className="space-y-12">
|
|
9
|
+
<div className="space-y-4">
|
|
10
|
+
<h1 className="text-4xl font-extrabold tracking-tight">Color Tokens</h1>
|
|
11
|
+
<p className="text-xl text-muted-foreground max-w-2xl">
|
|
12
|
+
The Garcia Ventures design system is built on a robust token architecture that ensures consistency,
|
|
13
|
+
accessibility, and easy maintenance across all digital products.
|
|
13
14
|
</p>
|
|
14
15
|
</div>
|
|
15
16
|
|
|
16
|
-
<section className="space-y-
|
|
17
|
-
<h2 className="text-
|
|
17
|
+
<section className="space-y-6">
|
|
18
|
+
<h2 className="text-3xl font-bold tracking-tight">Design Philosophy</h2>
|
|
19
|
+
<div className="grid gap-6 md:grid-cols-3">
|
|
20
|
+
<Card className="bg-primary/5 border-primary/20">
|
|
21
|
+
<CardHeader>
|
|
22
|
+
<CardTitle className="text-lg">Intellect</CardTitle>
|
|
23
|
+
</CardHeader>
|
|
24
|
+
<CardContent>
|
|
25
|
+
<p className="text-sm text-muted-foreground">
|
|
26
|
+
Represented by Royal Blue, signaling depth, trust, and professional expertise.
|
|
27
|
+
</p>
|
|
28
|
+
</CardContent>
|
|
29
|
+
</Card>
|
|
30
|
+
<Card className="bg-secondary/5 border-secondary/20">
|
|
31
|
+
<CardHeader>
|
|
32
|
+
<CardTitle className="text-lg">Stability</CardTitle>
|
|
33
|
+
</CardHeader>
|
|
34
|
+
<CardContent>
|
|
35
|
+
<p className="text-sm text-muted-foreground">
|
|
36
|
+
Rooted in Brand Green, reflecting growth, balance, and environmental consciousness.
|
|
37
|
+
</p>
|
|
38
|
+
</CardContent>
|
|
39
|
+
</Card>
|
|
40
|
+
<Card className="bg-accent/5 border-accent/20">
|
|
41
|
+
<CardHeader>
|
|
42
|
+
<CardTitle className="text-lg">Transparency</CardTitle>
|
|
43
|
+
</CardHeader>
|
|
44
|
+
<CardContent>
|
|
45
|
+
<p className="text-sm text-muted-foreground">
|
|
46
|
+
Expressed through Floral White, prioritizing clarity and a clean user experience.
|
|
47
|
+
</p>
|
|
48
|
+
</CardContent>
|
|
49
|
+
</Card>
|
|
50
|
+
</div>
|
|
51
|
+
</section>
|
|
52
|
+
|
|
53
|
+
<section className="space-y-6">
|
|
54
|
+
<h2 className="text-3xl font-bold tracking-tight">Adoption Guide</h2>
|
|
18
55
|
<p className="text-muted-foreground">
|
|
19
|
-
|
|
20
|
-
across light and dark modes to ensure accessibility and professional aesthetics.
|
|
56
|
+
There are three primary ways to consume these tokens depending on your project's technology stack.
|
|
21
57
|
</p>
|
|
22
58
|
|
|
23
|
-
<div className="
|
|
59
|
+
<div className="space-y-8">
|
|
60
|
+
<div className="space-y-4">
|
|
61
|
+
<h3 className="text-xl font-semibold">1. Tailwind CSS (Recommended)</h3>
|
|
62
|
+
<p className="text-sm text-muted-foreground">
|
|
63
|
+
Most projects should use standard Tailwind utility classes. These are automatically mapped to our tokens
|
|
64
|
+
via CSS variables.
|
|
65
|
+
</p>
|
|
66
|
+
<CodeBlock
|
|
67
|
+
language="tsx"
|
|
68
|
+
code={`// Use standard semantic classes
|
|
69
|
+
<button className="bg-primary text-primary-foreground hover:bg-primary/90">
|
|
70
|
+
Primary Action
|
|
71
|
+
</button>
|
|
72
|
+
|
|
73
|
+
<div className="border-border bg-card text-card-foreground">
|
|
74
|
+
Card Content
|
|
75
|
+
</div>`}
|
|
76
|
+
/>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<div className="space-y-4">
|
|
80
|
+
<h3 className="text-xl font-semibold">2. TypeScript / React</h3>
|
|
81
|
+
<p className="text-sm text-muted-foreground">
|
|
82
|
+
For logic-heavy styling or CSS-in-JS solutions, import the \`tokens\` object directly.
|
|
83
|
+
</p>
|
|
84
|
+
<CodeBlock
|
|
85
|
+
language="tsx"
|
|
86
|
+
code={`import { tokens } from '@gv-tech/design-system';
|
|
87
|
+
|
|
88
|
+
const MyComponent = () => {
|
|
89
|
+
return (
|
|
90
|
+
<div style={{ color: tokens.palette.brand.blue }}>
|
|
91
|
+
Using Royal Blue directly
|
|
92
|
+
</div>
|
|
93
|
+
);
|
|
94
|
+
};`}
|
|
95
|
+
/>
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<div className="space-y-4">
|
|
99
|
+
<h3 className="text-xl font-semibold">3. Vanilla CSS</h3>
|
|
100
|
+
<p className="text-sm text-muted-foreground">
|
|
101
|
+
Directly access the CSS variables in your style tags or external stylesheets.
|
|
102
|
+
</p>
|
|
103
|
+
<CodeBlock
|
|
104
|
+
language="css"
|
|
105
|
+
code={`.custom-element {
|
|
106
|
+
background-color: hsl(var(--primary));
|
|
107
|
+
color: hsl(var(--primary-foreground));
|
|
108
|
+
border: 1px solid hsl(var(--border));
|
|
109
|
+
}`}
|
|
110
|
+
/>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
</section>
|
|
114
|
+
|
|
115
|
+
<section className="space-y-6">
|
|
116
|
+
<div className="flex items-center justify-between">
|
|
117
|
+
<h2 className="text-3xl font-bold tracking-tight">Core Palette</h2>
|
|
118
|
+
</div>
|
|
119
|
+
<div className="grid gap-6 md:grid-cols-2 lg:grid-cols-3">
|
|
24
120
|
<Card>
|
|
25
|
-
<
|
|
26
|
-
<
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
<div>
|
|
32
|
-
<p className="text-sm font-medium">Primary (Blue)</p>
|
|
33
|
-
<p className="text-xs text-muted-foreground">Royal Blue / Cornflower</p>
|
|
34
|
-
</div>
|
|
35
|
-
</div>
|
|
36
|
-
<div className="flex items-center gap-4">
|
|
37
|
-
<div className="h-10 w-10 rounded-md border" style={{ backgroundColor: 'hsl(93 28% 54%)' }} />
|
|
121
|
+
<CardContent className="pt-6 space-y-4">
|
|
122
|
+
<div
|
|
123
|
+
className="h-24 w-full rounded-lg border shadow-inner"
|
|
124
|
+
style={{ backgroundColor: tokens.palette.brand.blue }}
|
|
125
|
+
/>
|
|
126
|
+
<div className="flex justify-between items-start">
|
|
38
127
|
<div>
|
|
39
|
-
<
|
|
40
|
-
<p className="text-xs text-muted-foreground">
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
<div className="flex items-center gap-4">
|
|
44
|
-
<div className="h-10 w-10 rounded-md border" style={{ backgroundColor: 'hsl(210 29% 98%)' }} />
|
|
45
|
-
<div>
|
|
46
|
-
<p className="text-sm font-medium">Neutral (Off-White)</p>
|
|
47
|
-
<p className="text-xs text-muted-foreground">Light Neutral / Floral White</p>
|
|
128
|
+
<h4 className="font-bold">Royal Blue</h4>
|
|
129
|
+
<p className="text-xs text-muted-foreground">Intellect & Trust</p>
|
|
48
130
|
</div>
|
|
131
|
+
<code className="text-xs bg-muted px-1.5 py-0.5 rounded">{tokens.palette.brand.blue}</code>
|
|
49
132
|
</div>
|
|
50
133
|
</CardContent>
|
|
51
134
|
</Card>
|
|
52
|
-
|
|
53
135
|
<Card>
|
|
54
|
-
<
|
|
55
|
-
<
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
136
|
+
<CardContent className="pt-6 space-y-4">
|
|
137
|
+
<div
|
|
138
|
+
className="h-24 w-full rounded-lg border shadow-inner"
|
|
139
|
+
style={{ backgroundColor: tokens.palette.brand.green }}
|
|
140
|
+
/>
|
|
141
|
+
<div className="flex justify-between items-start">
|
|
60
142
|
<div>
|
|
61
|
-
<
|
|
62
|
-
<p className="text-xs text-muted-foreground"
|
|
143
|
+
<h4 className="font-bold">Stability Green</h4>
|
|
144
|
+
<p className="text-xs text-muted-foreground">Growth & Balance</p>
|
|
63
145
|
</div>
|
|
146
|
+
<code className="text-xs bg-muted px-1.5 py-0.5 rounded">{tokens.palette.brand.green}</code>
|
|
64
147
|
</div>
|
|
65
|
-
|
|
66
|
-
|
|
148
|
+
</CardContent>
|
|
149
|
+
</Card>
|
|
150
|
+
<Card>
|
|
151
|
+
<CardContent className="pt-6 space-y-4">
|
|
152
|
+
<div
|
|
153
|
+
className="h-24 w-full rounded-lg border shadow-inner"
|
|
154
|
+
style={{ backgroundColor: tokens.palette.brand.floralWhite }}
|
|
155
|
+
/>
|
|
156
|
+
<div className="flex justify-between items-start">
|
|
67
157
|
<div>
|
|
68
|
-
<
|
|
69
|
-
<p className="text-xs text-muted-foreground"
|
|
158
|
+
<h4 className="font-bold">Floral White</h4>
|
|
159
|
+
<p className="text-xs text-muted-foreground">Transparency & Clarity</p>
|
|
70
160
|
</div>
|
|
161
|
+
<code className="text-xs bg-muted px-1.5 py-0.5 rounded">{tokens.palette.brand.floralWhite}</code>
|
|
71
162
|
</div>
|
|
72
163
|
</CardContent>
|
|
73
164
|
</Card>
|
|
74
165
|
</div>
|
|
75
166
|
</section>
|
|
76
167
|
|
|
77
|
-
<section className="space-y-
|
|
78
|
-
<h2 className="text-
|
|
79
|
-
<
|
|
80
|
-
All color tokens are mapped to standard Tailwind colors via CSS variables in our design system.
|
|
81
|
-
</p>
|
|
82
|
-
<CodeBlock
|
|
83
|
-
language="tsx"
|
|
84
|
-
code={`<div className="bg-primary text-primary-foreground">
|
|
85
|
-
Primary Content
|
|
86
|
-
</div>
|
|
87
|
-
<div className="text-secondary">
|
|
88
|
-
Secondary Accent
|
|
89
|
-
</div>
|
|
90
|
-
<div className="border-border bg-muted/30">
|
|
91
|
-
Muted Container
|
|
92
|
-
</div>`}
|
|
93
|
-
/>
|
|
94
|
-
</section>
|
|
95
|
-
|
|
96
|
-
<section className="space-y-4">
|
|
97
|
-
<h2 className="text-2xl font-semibold tracking-tight">Usage: TypeScript Tokens</h2>
|
|
98
|
-
<p className="text-muted-foreground">
|
|
99
|
-
For programmatic usage or non-Tailwind applications, you can import the raw token values.
|
|
100
|
-
</p>
|
|
101
|
-
<CodeBlock
|
|
102
|
-
language="tsx"
|
|
103
|
-
code={`import { tokens } from '@gv-tech/design-system';
|
|
104
|
-
|
|
105
|
-
// Accessing HSL values
|
|
106
|
-
const primary = tokens.colors.light.primary;
|
|
107
|
-
const brandGreen = tokens.colors.brand.green;`}
|
|
108
|
-
/>
|
|
109
|
-
</section>
|
|
110
|
-
|
|
111
|
-
<section className="space-y-4">
|
|
112
|
-
<h2 className="text-2xl font-semibold tracking-tight">CSS Variables Reference</h2>
|
|
113
|
-
<p className="text-muted-foreground">
|
|
114
|
-
Below is a complete reference of all semantic color tokens available in the design system.
|
|
115
|
-
</p>
|
|
116
|
-
<div className="rounded-md border overflow-hidden">
|
|
168
|
+
<section className="space-y-6">
|
|
169
|
+
<h2 className="text-3xl font-bold tracking-tight">Semantic Tokens Reference</h2>
|
|
170
|
+
<div className="rounded-xl border shadow-sm overflow-hidden">
|
|
117
171
|
<Table>
|
|
118
172
|
<TableHeader>
|
|
119
173
|
<TableRow className="bg-muted/50 hover:bg-muted/50">
|
|
120
|
-
<TableHead>
|
|
174
|
+
<TableHead className="w-[200px]">Token</TableHead>
|
|
175
|
+
<TableHead>Variable Name</TableHead>
|
|
121
176
|
<TableHead>Light Mode</TableHead>
|
|
122
177
|
<TableHead>Dark Mode</TableHead>
|
|
123
178
|
</TableRow>
|
|
124
179
|
</TableHeader>
|
|
125
180
|
<TableBody>
|
|
126
|
-
{(Object.keys(tokens.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
<
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
</
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
<TableHeader>
|
|
158
|
-
<TableRow className="bg-muted/50 hover:bg-muted/50">
|
|
159
|
-
<TableHead>Token</TableHead>
|
|
160
|
-
<TableHead>Value</TableHead>
|
|
161
|
-
</TableRow>
|
|
162
|
-
</TableHeader>
|
|
163
|
-
<TableBody>
|
|
164
|
-
{Object.entries(tokens.colors.brand).map(([key, value]) => (
|
|
165
|
-
<TableRow key={key}>
|
|
166
|
-
<TableCell className="font-mono text-xs">tokens.colors.brand.{key}</TableCell>
|
|
167
|
-
<TableCell>
|
|
168
|
-
<div className="flex items-center gap-2">
|
|
169
|
-
<div className="h-4 w-4 rounded-sm border" style={{ backgroundColor: value }} />
|
|
170
|
-
<span className="text-muted-foreground">{value}</span>
|
|
171
|
-
</div>
|
|
172
|
-
</TableCell>
|
|
173
|
-
</TableRow>
|
|
174
|
-
))}
|
|
181
|
+
{(Object.keys(tokens.theme.light) as Array<keyof typeof tokens.theme.light>).map((key) => {
|
|
182
|
+
if (key === 'radius') return null;
|
|
183
|
+
return (
|
|
184
|
+
<TableRow key={key} className="group">
|
|
185
|
+
<TableCell className="font-medium group-hover:text-primary transition-colors">
|
|
186
|
+
{key.charAt(0).toUpperCase() + key.slice(1).replace(/([A-Z])/g, ' $1')}
|
|
187
|
+
</TableCell>
|
|
188
|
+
<TableCell className="font-mono text-xs text-muted-foreground">
|
|
189
|
+
--{key.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase())}
|
|
190
|
+
</TableCell>
|
|
191
|
+
<TableCell>
|
|
192
|
+
<div className="flex items-center gap-3">
|
|
193
|
+
<div
|
|
194
|
+
className="h-6 w-6 rounded-md border shadow-sm"
|
|
195
|
+
style={{ backgroundColor: tokens.theme.light[key] as string }}
|
|
196
|
+
/>
|
|
197
|
+
<span className="text-xs font-mono">{tokens.theme.light[key]}</span>
|
|
198
|
+
</div>
|
|
199
|
+
</TableCell>
|
|
200
|
+
<TableCell>
|
|
201
|
+
<div className="flex items-center gap-3">
|
|
202
|
+
<div
|
|
203
|
+
className="h-6 w-6 rounded-md border shadow-sm"
|
|
204
|
+
style={{ backgroundColor: tokens.theme.dark[key] as string }}
|
|
205
|
+
/>
|
|
206
|
+
<span className="text-xs font-mono">{tokens.theme.dark[key]}</span>
|
|
207
|
+
</div>
|
|
208
|
+
</TableCell>
|
|
209
|
+
</TableRow>
|
|
210
|
+
);
|
|
211
|
+
})}
|
|
175
212
|
</TableBody>
|
|
176
213
|
</Table>
|
|
177
214
|
</div>
|
|
@@ -30,23 +30,48 @@ export function ThemeToggleDocs() {
|
|
|
30
30
|
</ComponentShowcase>
|
|
31
31
|
|
|
32
32
|
<ComponentShowcase
|
|
33
|
-
title="
|
|
34
|
-
description="You can control the theme externally by passing customTheme and onThemeChange props."
|
|
33
|
+
title="Controlled Mode"
|
|
34
|
+
description="You can control the theme externally by passing customTheme and onThemeChange props. This is useful for testing or when using a different theme provider."
|
|
35
35
|
code={`const [theme, setTheme] = useState('light');
|
|
36
36
|
|
|
37
37
|
<ThemeToggle
|
|
38
38
|
customTheme={theme}
|
|
39
|
-
onThemeChange={
|
|
39
|
+
onThemeChange={setTheme}
|
|
40
40
|
/>
|
|
41
41
|
|
|
42
42
|
<p>Current Theme: {theme}</p>`}
|
|
43
43
|
>
|
|
44
44
|
<div className="flex flex-col items-center gap-4">
|
|
45
|
-
<ThemeToggle customTheme={customTheme} onThemeChange={
|
|
45
|
+
<ThemeToggle customTheme={customTheme} onThemeChange={setCustomTheme} />
|
|
46
46
|
<p className="text-sm font-medium">Current Selection: {customTheme}</p>
|
|
47
47
|
</div>
|
|
48
48
|
</ComponentShowcase>
|
|
49
49
|
|
|
50
|
+
<div className="space-y-4">
|
|
51
|
+
<h3 className="text-xl font-semibold">useTheme Hook</h3>
|
|
52
|
+
<p className="text-sm text-muted-foreground">
|
|
53
|
+
The `useTheme` hook provides access to the current theme and the active design tokens.
|
|
54
|
+
</p>
|
|
55
|
+
<div className="rounded-md border bg-muted p-4">
|
|
56
|
+
<pre className="text-xs">
|
|
57
|
+
<code>
|
|
58
|
+
{`import { useTheme } from '@gv-tech/design-system';
|
|
59
|
+
|
|
60
|
+
export function MyComponent() {
|
|
61
|
+
const { theme, setTheme, tokens } = useTheme();
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<div style={{ backgroundColor: tokens.background }}>
|
|
65
|
+
<p>Current theme: {theme}</p>
|
|
66
|
+
<button onClick={() => setTheme('dark')}>Dark Mode</button>
|
|
67
|
+
</div>
|
|
68
|
+
);
|
|
69
|
+
}`}
|
|
70
|
+
</code>
|
|
71
|
+
</pre>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
50
75
|
<div className="space-y-4">
|
|
51
76
|
<h3 className="text-xl font-semibold">ThemeToggle Props</h3>
|
|
52
77
|
<PropsTable
|
|
@@ -104,14 +129,16 @@ export function ThemeToggleDocs() {
|
|
|
104
129
|
</div>
|
|
105
130
|
|
|
106
131
|
<div className="rounded-lg border bg-muted/50 p-6">
|
|
107
|
-
<h4 className="font-medium text-foreground">Custom
|
|
132
|
+
<h4 className="font-medium text-foreground">Controlled / Custom State</h4>
|
|
108
133
|
<p className="mt-1 text-sm text-muted-foreground">
|
|
109
134
|
Pass your own theme state and change handler to integrate with custom logic or external storage.
|
|
110
135
|
</p>
|
|
111
136
|
<pre className="mt-4 overflow-x-auto rounded-md bg-background p-4 text-xs">
|
|
112
|
-
<code>{
|
|
113
|
-
|
|
114
|
-
|
|
137
|
+
<code>{`const [theme, setTheme] = useState("light")
|
|
138
|
+
|
|
139
|
+
<ThemeToggle
|
|
140
|
+
customTheme={theme}
|
|
141
|
+
onThemeChange={setTheme}
|
|
115
142
|
/>`}</code>
|
|
116
143
|
</pre>
|
|
117
144
|
</div>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Design system tokens for Garcia Ventures.
|
|
3
|
+
* This file defines the core palette and semantic tokens for the theme system.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export const palette = {
|
|
7
|
+
brand: {
|
|
8
|
+
blue: 'hsl(225 73% 57%)', // Royal Blue (Intellect)
|
|
9
|
+
green: 'hsl(151 66% 27%)', // #177245 (Stability)
|
|
10
|
+
floralWhite: 'hsl(40 100% 97%)', // Light Neutral / Floral White
|
|
11
|
+
},
|
|
12
|
+
// Additional primitives can be added here
|
|
13
|
+
} as const;
|
|
14
|
+
|
|
15
|
+
export const theme = {
|
|
16
|
+
light: {
|
|
17
|
+
background: 'hsl(0 0% 96%)', // White Smoke
|
|
18
|
+
foreground: 'hsl(222 47% 11%)', // Oxford Blue
|
|
19
|
+
card: 'hsl(0 0% 100%)', // White
|
|
20
|
+
cardForeground: 'hsl(222 47% 11%)', // Oxford Blue
|
|
21
|
+
popover: 'hsl(0 0% 100%)', // White
|
|
22
|
+
popoverForeground: 'hsl(222 47% 11%)', // Oxford Blue
|
|
23
|
+
primary: palette.brand.blue, // Royal Blue (Intellect)
|
|
24
|
+
primaryForeground: 'hsl(0 0% 100%)', // White
|
|
25
|
+
secondary: 'hsl(93 28% 54%)', // Asparagus / Pistachio
|
|
26
|
+
secondaryForeground: 'hsl(0 0% 100%)', // White
|
|
27
|
+
muted: 'hsl(0 0% 92%)', // Gainsboro
|
|
28
|
+
mutedForeground: 'hsl(215 16% 47%)', // Steel Blue
|
|
29
|
+
accent: 'hsl(0 0% 88%)', // French Gray
|
|
30
|
+
accentForeground: 'hsl(222 47% 11%)', // Oxford Blue
|
|
31
|
+
destructive: 'hsl(0 84.2% 60.2%)', // Vivid Red
|
|
32
|
+
destructiveForeground: 'hsl(0 0% 100%)', // White
|
|
33
|
+
border: 'hsl(0 0% 89%)', // Light Gray
|
|
34
|
+
input: 'hsl(0 0% 89%)', // Light Gray
|
|
35
|
+
ring: 'hsl(222 47% 11%)', // Oxford Blue
|
|
36
|
+
radius: '0.5rem',
|
|
37
|
+
},
|
|
38
|
+
dark: {
|
|
39
|
+
background: 'hsl(0 0% 9%)', // Night
|
|
40
|
+
foreground: 'hsl(0 0% 100%)', // White
|
|
41
|
+
card: 'hsl(0 0% 14%)', // Eerie Black
|
|
42
|
+
cardForeground: 'hsl(0 0% 100%)', // White
|
|
43
|
+
popover: 'hsl(0 0% 11%)', // Night (alt)
|
|
44
|
+
popoverForeground: 'hsl(0 0% 100%)', // White
|
|
45
|
+
primary: 'hsl(227 96% 71%)', // Baby Blue
|
|
46
|
+
primaryForeground: 'hsl(0 0% 9%)', // Night
|
|
47
|
+
secondary: 'hsl(96 44% 61%)', // Celadon
|
|
48
|
+
secondaryForeground: 'hsl(0 0% 9%)', // Night
|
|
49
|
+
muted: 'hsl(0 0% 6%)', // Black
|
|
50
|
+
mutedForeground: 'hsl(0 0% 70%)', // Silver
|
|
51
|
+
accent: 'hsl(0 0% 15%)', // Jet
|
|
52
|
+
accentForeground: 'hsl(0 0% 100%)', // White
|
|
53
|
+
destructive: 'hsl(0 62.8% 30.6%)', // Blood Red
|
|
54
|
+
destructiveForeground: 'hsl(0 0% 100%)', // White
|
|
55
|
+
border: 'hsl(0 0% 18%)', // Raisin Black
|
|
56
|
+
input: 'hsl(0 0% 18%)', // Raisin Black
|
|
57
|
+
ring: 'hsl(0 0% 90%)', // Platinum
|
|
58
|
+
radius: '0.5rem',
|
|
59
|
+
},
|
|
60
|
+
} as const;
|
|
61
|
+
|
|
62
|
+
export const tokens = {
|
|
63
|
+
palette,
|
|
64
|
+
theme,
|
|
65
|
+
} as const;
|
|
66
|
+
|
|
67
|
+
export type ThemeTokens = typeof theme.light;
|
|
68
|
+
export type PaletteTokens = typeof palette;
|
package/.nvmrc
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
24
|
package/babel.config.js
DELETED
package/dist/favicon.ico
DELETED
|
Binary file
|
package/dist/lib/tokens.d.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/** Design system color tokens for Garcia Ventures. */
|
|
2
|
-
export declare const tokens: {
|
|
3
|
-
readonly colors: {
|
|
4
|
-
readonly light: {
|
|
5
|
-
readonly background: "hsl(0 0% 96%)";
|
|
6
|
-
readonly foreground: "hsl(222 47% 11%)";
|
|
7
|
-
readonly card: "hsl(0 0% 100%)";
|
|
8
|
-
readonly cardForeground: "hsl(222 47% 11%)";
|
|
9
|
-
readonly popover: "hsl(0 0% 100%)";
|
|
10
|
-
readonly popoverForeground: "hsl(222 47% 11%)";
|
|
11
|
-
readonly primary: "hsl(225 73% 57%)";
|
|
12
|
-
readonly primaryForeground: "hsl(0 0% 100%)";
|
|
13
|
-
readonly secondary: "hsl(93 28% 54%)";
|
|
14
|
-
readonly secondaryForeground: "hsl(0 0% 100%)";
|
|
15
|
-
readonly muted: "hsl(0 0% 92%)";
|
|
16
|
-
readonly mutedForeground: "hsl(215 16% 47%)";
|
|
17
|
-
readonly accent: "hsl(0 0% 88%)";
|
|
18
|
-
readonly accentForeground: "hsl(222 47% 11%)";
|
|
19
|
-
readonly destructive: "hsl(0 84.2% 60.2%)";
|
|
20
|
-
readonly destructiveForeground: "hsl(0 0% 100%)";
|
|
21
|
-
readonly border: "hsl(0 0% 89%)";
|
|
22
|
-
readonly input: "hsl(0 0% 89%)";
|
|
23
|
-
readonly ring: "hsl(222 47% 11%)";
|
|
24
|
-
};
|
|
25
|
-
readonly dark: {
|
|
26
|
-
readonly background: "hsl(0 0% 9%)";
|
|
27
|
-
readonly foreground: "hsl(0 0% 100%)";
|
|
28
|
-
readonly card: "hsl(0 0% 14%)";
|
|
29
|
-
readonly cardForeground: "hsl(0 0% 100%)";
|
|
30
|
-
readonly popover: "hsl(0 0% 11%)";
|
|
31
|
-
readonly popoverForeground: "hsl(0 0% 100%)";
|
|
32
|
-
readonly primary: "hsl(227 96% 71%)";
|
|
33
|
-
readonly primaryForeground: "hsl(0 0% 9%)";
|
|
34
|
-
readonly secondary: "hsl(96 44% 61%)";
|
|
35
|
-
readonly secondaryForeground: "hsl(0 0% 9%)";
|
|
36
|
-
readonly muted: "hsl(0 0% 6%)";
|
|
37
|
-
readonly mutedForeground: "hsl(0 0% 70%)";
|
|
38
|
-
readonly accent: "hsl(0 0% 15%)";
|
|
39
|
-
readonly accentForeground: "hsl(0 0% 100%)";
|
|
40
|
-
readonly destructive: "hsl(0 62.8% 30.6%)";
|
|
41
|
-
readonly destructiveForeground: "hsl(0 0% 100%)";
|
|
42
|
-
readonly border: "hsl(0 0% 18%)";
|
|
43
|
-
readonly input: "hsl(0 0% 18%)";
|
|
44
|
-
readonly ring: "hsl(0 0% 90%)";
|
|
45
|
-
};
|
|
46
|
-
readonly brand: {
|
|
47
|
-
readonly green: "hsl(151 66% 27%)";
|
|
48
|
-
readonly blue: "hsl(225 73% 57%)";
|
|
49
|
-
};
|
|
50
|
-
};
|
|
51
|
-
};
|
|
52
|
-
export type ThemeTokens = typeof tokens.colors.light;
|
|
53
|
-
export type BrandTokens = typeof tokens.colors.brand;
|
|
54
|
-
//# sourceMappingURL=tokens.d.ts.map
|
package/dist/lib/tokens.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/lib/tokens.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDT,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;AACrD,MAAM,MAAM,WAAW,GAAG,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC"}
|
package/netlify.toml
DELETED
package/public/favicon.ico
DELETED
|
Binary file
|
package/serve.json
DELETED
package/src/lib/tokens.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/** Design system color tokens for Garcia Ventures. */
|
|
2
|
-
export const tokens = {
|
|
3
|
-
colors: {
|
|
4
|
-
light: {
|
|
5
|
-
background: 'hsl(0 0% 96%)',
|
|
6
|
-
foreground: 'hsl(222 47% 11%)',
|
|
7
|
-
card: 'hsl(0 0% 100%)',
|
|
8
|
-
cardForeground: 'hsl(222 47% 11%)',
|
|
9
|
-
popover: 'hsl(0 0% 100%)',
|
|
10
|
-
popoverForeground: 'hsl(222 47% 11%)',
|
|
11
|
-
primary: 'hsl(225 73% 57%)',
|
|
12
|
-
primaryForeground: 'hsl(0 0% 100%)',
|
|
13
|
-
secondary: 'hsl(93 28% 54%)',
|
|
14
|
-
secondaryForeground: 'hsl(0 0% 100%)',
|
|
15
|
-
muted: 'hsl(0 0% 92%)',
|
|
16
|
-
mutedForeground: 'hsl(215 16% 47%)',
|
|
17
|
-
accent: 'hsl(0 0% 88%)',
|
|
18
|
-
accentForeground: 'hsl(222 47% 11%)',
|
|
19
|
-
destructive: 'hsl(0 84.2% 60.2%)',
|
|
20
|
-
destructiveForeground: 'hsl(0 0% 100%)',
|
|
21
|
-
border: 'hsl(0 0% 89%)',
|
|
22
|
-
input: 'hsl(0 0% 89%)',
|
|
23
|
-
ring: 'hsl(222 47% 11%)',
|
|
24
|
-
},
|
|
25
|
-
dark: {
|
|
26
|
-
background: 'hsl(0 0% 9%)',
|
|
27
|
-
foreground: 'hsl(0 0% 100%)',
|
|
28
|
-
card: 'hsl(0 0% 14%)',
|
|
29
|
-
cardForeground: 'hsl(0 0% 100%)',
|
|
30
|
-
popover: 'hsl(0 0% 11%)',
|
|
31
|
-
popoverForeground: 'hsl(0 0% 100%)',
|
|
32
|
-
primary: 'hsl(227 96% 71%)',
|
|
33
|
-
primaryForeground: 'hsl(0 0% 9%)',
|
|
34
|
-
secondary: 'hsl(96 44% 61%)',
|
|
35
|
-
secondaryForeground: 'hsl(0 0% 9%)',
|
|
36
|
-
muted: 'hsl(0 0% 6%)',
|
|
37
|
-
mutedForeground: 'hsl(0 0% 70%)',
|
|
38
|
-
accent: 'hsl(0 0% 15%)',
|
|
39
|
-
accentForeground: 'hsl(0 0% 100%)',
|
|
40
|
-
destructive: 'hsl(0 62.8% 30.6%)',
|
|
41
|
-
destructiveForeground: 'hsl(0 0% 100%)',
|
|
42
|
-
border: 'hsl(0 0% 18%)',
|
|
43
|
-
input: 'hsl(0 0% 18%)',
|
|
44
|
-
ring: 'hsl(0 0% 90%)',
|
|
45
|
-
},
|
|
46
|
-
brand: {
|
|
47
|
-
green: 'hsl(151 66% 27%)',
|
|
48
|
-
blue: 'hsl(225 73% 57%)',
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
} as const;
|
|
52
|
-
|
|
53
|
-
export type ThemeTokens = typeof tokens.colors.light;
|
|
54
|
-
export type BrandTokens = typeof tokens.colors.brand;
|