@darthcharles/greda 0.1.0 → 1.0.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/dist/tokens.css CHANGED
@@ -1,28 +1,22 @@
1
- /* Colors are space-separated HSL channels. All other tokens use CSS values.
2
- Low-specificity defaults let consumer :root rules win in either import order. */
3
- :where(:root) {
4
- color-scheme: light;
5
- --background: 0 0% 100%;
6
- --foreground: 222 47% 11%;
7
- --card: 0 0% 100%;
8
- --card-foreground: 222 47% 11%;
9
- --popover: 0 0% 100%;
10
- --popover-foreground: 222 47% 11%;
11
- --accent: 220 20% 94%;
12
- --accent-foreground: 222 35% 20%;
13
- --primary: 220 80% 45%;
14
- --primary-foreground: 0 0% 100%;
15
- --primary-hover: 220 80% 38%;
16
- --secondary: 220 20% 94%;
17
- --secondary-foreground: 222 35% 20%;
18
- --muted: 220 15% 96%;
19
- --muted-foreground: 220 10% 42%;
20
- --border: 220 15% 82%;
21
- --input: 220 15% 82%;
22
- --ring: 220 80% 45%;
23
- --destructive: 0 72% 43%;
24
- --destructive-foreground: 0 0% 100%;
25
- --overlay: 222 47% 11% / 0.4;
1
+ /* Consumers customize only the generic --base-* colors. All color values are
2
+ space-separated HSL channels. Role assignments are owned by Greda. */
3
+ :where(:root, [data-color-scheme="light"]) {
4
+ --base-white: 0 0% 100%;
5
+ --base-black: 222 47% 11%;
6
+ --base-gray-50: 220 15% 96%;
7
+ --base-gray-100: 220 20% 94%;
8
+ --base-gray-200: 220 15% 82%;
9
+ --base-gray-300: 220 15% 72%;
10
+ --base-gray-500: 220 10% 42%;
11
+ --base-gray-600: 220 15% 36%;
12
+ --base-gray-800: 222 20% 18%;
13
+ --base-gray-900: 222 30% 9%;
14
+ --base-primary: 220 80% 45%;
15
+ --base-primary-hover: 220 80% 38%;
16
+ --base-secondary: 220 20% 94%;
17
+ --base-tertiary: 214 100% 96.863%;
18
+ --base-accent: 220 20% 94%;
19
+ --base-destructive: 0 72% 43%;
26
20
  --font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
27
21
  sans-serif;
28
22
  --font-heading: var(--font-sans);
@@ -61,9 +55,6 @@
61
55
  --dialog-width: 32.5rem;
62
56
  --tooltip-width: 20rem;
63
57
  --toast-width: 24rem;
64
- --shadow-sm: 0 1px 2px hsl(222 47% 11% / 0.08);
65
- --shadow: 0 8px 24px hsl(222 47% 11% / 0.12);
66
- --shadow-dialog: 0 24px 70px hsl(222 47% 11% / 0.24);
67
58
  --focus-width: 2px;
68
59
  --focus-offset: 2px;
69
60
  --disabled-opacity: 0.5;
@@ -72,31 +63,206 @@
72
63
  --z-popover: 60;
73
64
  --z-toast: 70;
74
65
  }
75
- :where([data-color-scheme="light"]) {
66
+
67
+ /* Rebind roles at theme boundaries so scoped base overrides update every role.
68
+ Low specificity lets consumers supply base colors in either import order. */
69
+ :where(:root, [data-theme], [data-color-scheme]) {
76
70
  color-scheme: light;
71
+ --surface-primary: var(--base-white);
72
+ --surface-secondary: var(--base-gray-100);
73
+ --surface-tertiary: var(--base-tertiary);
74
+ --surface-raised: var(--base-gray-50);
75
+ --surface-inverse: var(--base-black);
76
+ --text-primary: var(--base-black);
77
+ --text-secondary: var(--base-gray-600);
78
+ --text-muted: var(--base-gray-500);
79
+ --text-inverse: var(--base-white);
80
+ --text-action: var(--base-primary);
81
+ --border-primary: var(--base-gray-200);
82
+ --border-secondary: var(--base-gray-100);
83
+ --border-inverse: var(--base-gray-600);
84
+ --border-action: var(--base-primary);
85
+
86
+ /* Existing component tokens derive from the same generic base palette. */
87
+ --background: var(--surface-primary);
88
+ --foreground: var(--text-primary);
89
+ --card: var(--surface-raised);
90
+ --card-foreground: var(--text-primary);
91
+ --popover: var(--surface-raised);
92
+ --popover-foreground: var(--text-primary);
93
+ --accent: var(--base-accent);
94
+ --accent-foreground: var(--text-primary);
95
+ --primary: var(--base-primary);
96
+ --primary-foreground: var(--base-white);
97
+ --primary-hover: var(--base-primary-hover);
98
+ --secondary: var(--base-secondary);
99
+ --secondary-foreground: var(--text-primary);
100
+ --muted: var(--surface-secondary);
101
+ --muted-foreground: var(--text-muted);
102
+ --border: var(--border-primary);
103
+ --input: var(--border-primary);
104
+ --ring: var(--base-primary);
105
+ --destructive: var(--base-destructive);
106
+ --destructive-foreground: var(--base-white);
107
+ --overlay: var(--base-black) / 0.4;
108
+ --shadow-sm: 0 1px 2px hsl(var(--base-black) / 0.08);
109
+ --shadow: 0 8px 24px hsl(var(--base-black) / 0.12);
110
+ --shadow-dialog: 0 24px 70px hsl(var(--base-black) / 0.24);
77
111
  }
112
+
78
113
  /* Opt in independently of the consumer's brand theme. */
79
114
  :where([data-color-scheme="dark"]) {
80
115
  color-scheme: dark;
81
- --background: 222 30% 9%;
82
- --foreground: 220 20% 96%;
83
- --card: 222 25% 13%;
84
- --card-foreground: 220 20% 96%;
85
- --popover: 222 25% 13%;
86
- --popover-foreground: 220 20% 96%;
87
- --accent: 222 20% 22%;
88
- --accent-foreground: 220 20% 96%;
89
- --primary: 217 90% 70%;
90
- --primary-foreground: 222 47% 11%;
91
- --primary-hover: 217 90% 78%;
92
- --secondary: 222 20% 22%;
93
- --secondary-foreground: 220 20% 96%;
94
- --muted: 222 20% 18%;
95
- --muted-foreground: 220 15% 72%;
96
- --border: 220 15% 36%;
97
- --input: 220 15% 36%;
98
- --ring: 217 90% 70%;
99
- --destructive: 0 80% 72%;
100
- --destructive-foreground: 222 47% 11%;
101
- --overlay: 222 47% 3% / 0.7;
116
+ --base-primary: 217 90% 70%;
117
+ --base-primary-hover: 217 90% 78%;
118
+ --base-secondary: 222 20% 22%;
119
+ --base-tertiary: 218 40% 18%;
120
+ --base-accent: 222 20% 22%;
121
+ --base-destructive: 0 80% 72%;
122
+ --surface-primary: var(--base-gray-900);
123
+ --surface-secondary: var(--base-gray-800);
124
+ --surface-raised: var(--base-gray-800);
125
+ --surface-inverse: var(--base-white);
126
+ --text-primary: var(--base-white);
127
+ --text-secondary: var(--base-gray-300);
128
+ --text-muted: var(--base-gray-300);
129
+ --text-inverse: var(--base-black);
130
+ --border-primary: var(--base-gray-600);
131
+ --border-secondary: var(--base-gray-800);
132
+ --border-inverse: var(--base-gray-200);
133
+ --primary-foreground: var(--base-black);
134
+ --destructive-foreground: var(--base-black);
135
+ --overlay: var(--base-black) / 0.7;
136
+ }
137
+
138
+
139
+ /* Tailwind 4: import this file from your Tailwind CSS entry point. */
140
+ @layer theme {
141
+ @theme inline {
142
+ --color-background: hsl(var(--background));
143
+ --color-foreground: hsl(var(--foreground));
144
+ --color-card: hsl(var(--card));
145
+ --color-card-foreground: hsl(var(--card-foreground));
146
+ --color-popover: hsl(var(--popover));
147
+ --color-popover-foreground: hsl(var(--popover-foreground));
148
+ --color-accent: hsl(var(--accent));
149
+ --color-accent-foreground: hsl(var(--accent-foreground));
150
+ --greda-bg-primary: var(--primary);
151
+ --greda-text-primary: var(--text-primary);
152
+ --greda-border-primary: var(--border-primary);
153
+ --color-primary-foreground: hsl(var(--primary-foreground));
154
+ --color-primary-hover: hsl(var(--primary-hover));
155
+ --greda-bg-secondary: var(--secondary);
156
+ --greda-text-secondary: var(--text-secondary);
157
+ --greda-border-secondary: var(--border-secondary);
158
+ --color-secondary-foreground: hsl(var(--secondary-foreground));
159
+ --greda-bg-muted: var(--muted);
160
+ --greda-text-muted: var(--text-muted);
161
+ --greda-border-muted: var(--muted);
162
+ --color-muted-foreground: hsl(var(--muted-foreground));
163
+ --color-border: hsl(var(--border));
164
+ --color-input: hsl(var(--input));
165
+ --color-ring: hsl(var(--ring));
166
+ --color-destructive: hsl(var(--destructive));
167
+ --color-destructive-foreground: hsl(var(--destructive-foreground));
168
+ --color-overlay: hsl(var(--overlay));
169
+ --greda-surface-primary: var(--surface-primary);
170
+ --greda-surface-secondary: var(--surface-secondary);
171
+ --greda-surface-tertiary: var(--surface-tertiary);
172
+ --greda-surface-raised: var(--surface-raised);
173
+ --greda-surface-inverse: var(--surface-inverse);
174
+ --greda-text-inverse: var(--text-inverse);
175
+ --greda-text-action: var(--text-action);
176
+ --greda-border-inverse: var(--border-inverse);
177
+ --greda-border-action: var(--border-action);
178
+ --spacing: var(--spacing-unit);
179
+ --spacing-0: var(--space-0);
180
+ --spacing-0\.5: var(--space-0-5);
181
+ --spacing-1: var(--space-1);
182
+ --spacing-1\.5: var(--space-1-5);
183
+ --spacing-2: var(--space-2);
184
+ --spacing-2\.5: var(--space-2-5);
185
+ --spacing-3: var(--space-3);
186
+ --spacing-3\.5: var(--space-3-5);
187
+ --spacing-4: var(--space-4);
188
+ --spacing-5: var(--space-5);
189
+ --spacing-6: var(--space-6);
190
+ --spacing-8: var(--space-8);
191
+ --spacing-9: var(--space-9);
192
+ --spacing-10: var(--space-10);
193
+ --spacing-12: var(--space-12);
194
+ --spacing-16: var(--space-16);
195
+ --spacing-20: var(--space-20);
196
+ --spacing-24: var(--space-24);
197
+ --spacing-32: var(--space-32);
198
+ --font-sans: var(--font-sans);
199
+ --font-heading: var(--font-heading);
200
+ --text-xs: var(--font-size-xs);
201
+ --text-xs--line-height: var(--line-height);
202
+ --text-sm: var(--font-size-sm);
203
+ --text-sm--line-height: var(--line-height);
204
+ --text-base: var(--font-size-md);
205
+ --text-base--line-height: var(--line-height);
206
+ --text-lg: var(--font-size-lg);
207
+ --text-lg--line-height: var(--line-height);
208
+ --font-weight-medium: var(--font-weight-medium);
209
+ --font-weight-semibold: var(--font-weight-bold);
210
+ --radius-sm: var(--radius-sm);
211
+ --radius-md: var(--radius);
212
+ --radius-lg: var(--radius-lg);
213
+ --radius-xl: var(--radius-lg);
214
+ --radius-full: var(--radius-full);
215
+ --shadow: var(--shadow);
216
+ --shadow-sm: var(--shadow-sm);
217
+ --shadow-md: var(--shadow);
218
+ --shadow-lg: var(--shadow-dialog);
219
+ --container-lg: var(--dialog-width);
220
+ --default-transition-duration: var(--duration);
221
+ --default-border-width: var(--border-width);
222
+ --ring-width-1: var(--focus-width);
223
+ --ring-width-2: var(--focus-width);
224
+ --ring-offset-width-2: var(--focus-offset);
225
+ }
226
+ }
227
+
228
+ @custom-variant dark (&:where([data-color-scheme="dark"], [data-color-scheme="dark"] *));
229
+
230
+ @utility bg-* {
231
+ background-color: hsl(--value(--greda-bg-*));
232
+ background-color: hsl(--value(--greda-bg-*) / calc(--modifier(integer) * 1%));
233
+ background-color: hsl(--value(--greda-bg-*) / --modifier([number], [percentage]));
234
+ }
235
+
236
+ @utility surface-* {
237
+ background-color: hsl(--value(--greda-surface-*));
238
+ background-color: hsl(--value(--greda-surface-*) / calc(--modifier(integer) * 1%));
239
+ background-color: hsl(--value(--greda-surface-*) / --modifier([number], [percentage]));
240
+ }
241
+
242
+ @utility text-* {
243
+ color: hsl(--value(--greda-text-*));
244
+ color: hsl(--value(--greda-text-*) / calc(--modifier(integer) * 1%));
245
+ color: hsl(--value(--greda-text-*) / --modifier([number], [percentage]));
246
+ }
247
+
248
+ @utility border-* {
249
+ border-color: hsl(--value(--greda-border-*));
250
+ border-color: hsl(--value(--greda-border-*) / calc(--modifier(integer) * 1%));
251
+ border-color: hsl(--value(--greda-border-*) / --modifier([number], [percentage]));
252
+ }
253
+
254
+ @utility z-overlay {
255
+ z-index: var(--z-overlay);
256
+ }
257
+
258
+ @utility z-popover {
259
+ z-index: var(--z-popover);
260
+ }
261
+
262
+ @utility z-toast {
263
+ z-index: var(--z-toast);
264
+ }
265
+
266
+ @utility opacity-disabled {
267
+ opacity: var(--disabled-opacity);
102
268
  }
package/dist/utils.js CHANGED
@@ -1,10 +1,16 @@
1
1
  import { clsx as e } from "clsx";
2
- import { extendTailwindMerge as n } from "tailwind-merge";
3
- const o = n({ prefix: "ds-" });
4
- function m(...r) {
5
- return o(e(r));
2
+ import { extendTailwindMerge as o } from "tailwind-merge";
3
+ const t = o({
4
+ extend: {
5
+ classGroups: {
6
+ "bg-color": [{ surface: ["primary", "secondary", "tertiary", "raised", "inverse"] }]
7
+ }
8
+ }
9
+ });
10
+ function s(...r) {
11
+ return t(e(r));
6
12
  }
7
13
  export {
8
- m as cn
14
+ s as cn
9
15
  };
10
16
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../src/lib/utils.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst merge = extendTailwindMerge({ prefix: \"ds-\" });\n/** Combine conditional classes and resolve conflicting prefixed utilities. */\nexport function cn(...inputs: ClassValue[]) {\n return merge(clsx(inputs));\n}\n"],"names":["merge","extendTailwindMerge","cn","inputs","clsx"],"mappings":";;AAGA,MAAMA,IAAQC,EAAoB,EAAE,QAAQ,OAAO;AAE5C,SAASC,KAAMC,GAAsB;AAC1C,SAAOH,EAAMI,EAAKD,CAAM,CAAC;AAC3B;"}
1
+ {"version":3,"file":"utils.js","sources":["../src/lib/utils.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n \"bg-color\": [{ surface: [\"primary\", \"secondary\", \"tertiary\", \"raised\", \"inverse\"] }],\n },\n },\n});\n\n/** Combine conditional classes and resolve conflicting Tailwind utilities. */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"],"names":["twMerge","extendTailwindMerge","cn","inputs","clsx"],"mappings":";;AAGA,MAAMA,IAAUC,EAAoB;AAAA,EAClC,QAAQ;AAAA,IACN,aAAa;AAAA,MACX,YAAY,CAAC,EAAE,SAAS,CAAC,WAAW,aAAa,YAAY,UAAU,SAAS,EAAA,CAAG;AAAA,IAAA;AAAA,EACrF;AAEJ,CAAC;AAGM,SAASC,KAAMC,GAAsB;AAC1C,SAAOH,EAAQI,EAAKD,CAAM,CAAC;AAC7B;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@darthcharles/greda",
3
- "version": "0.1.0",
3
+ "version": "1.0.0",
4
4
  "description": "Generic React components with a complete, overridable base theme.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -50,8 +50,7 @@
50
50
  "release": "npm run check && changeset publish",
51
51
  "prepack": "npm run build",
52
52
  "test:browser": "playwright test",
53
- "validate:stories": "node scripts/validate-stories.mjs",
54
- "docs:tokens": "node scripts/generate-token-reference.mjs"
53
+ "validate:stories": "node scripts/validate-stories.mjs"
55
54
  },
56
55
  "dependencies": {
57
56
  "@radix-ui/react-checkbox": "^1.0.0",
@@ -91,6 +90,7 @@
91
90
  "storybook": "^10.6.3",
92
91
  "tailwindcss": "^3.4.17",
93
92
  "tailwindcss-animate": "^1.0.7",
93
+ "tailwindcss-v4": "npm:tailwindcss@^4.3.3",
94
94
  "typescript": "^5.9.0",
95
95
  "vite": "^7.0.0",
96
96
  "vitest": "^3.2.0"