@lukeashford/aurelius 1.1.0 → 2.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.
@@ -0,0 +1,368 @@
1
+ /* Aurelius Design System - CSS Theme
2
+ * Tailwind v4 CSS-first approach using @theme directive
3
+ * This file defines all design tokens as CSS custom properties
4
+ */
5
+
6
+ @theme {
7
+ /* ===== COLORS ===== */
8
+
9
+ /* Black spectrum */
10
+ --color-void: #000000;
11
+ --color-obsidian: #0a0a0a;
12
+ --color-charcoal: #141414;
13
+ --color-graphite: #1f1f1f;
14
+ --color-slate: #2a2a2a;
15
+ --color-ash: #3d3d3d;
16
+
17
+ /* Gold spectrum */
18
+ --color-gold: #c9a227;
19
+ --color-gold-light: #d4b84a;
20
+ --color-gold-bright: #e5c84d;
21
+ --color-gold-muted: #8b7355;
22
+ --color-gold-pale: #d4c4a8;
23
+ --color-gold-glow: rgba(201, 162, 39, 0.15);
24
+
25
+ /* Neutrals */
26
+ --color-white: #ffffff;
27
+ --color-silver: #a3a3a3;
28
+ --color-zinc: #71717a;
29
+ --color-dim: #52525b;
30
+
31
+ /* Semantic */
32
+ --color-success: #22c55e;
33
+ --color-success-muted: #166534;
34
+ --color-error: #dc2626;
35
+ --color-error-muted: #991b1b;
36
+ --color-warning: #d97706;
37
+ --color-warning-muted: #92400e;
38
+ --color-info: #0ea5e9;
39
+ --color-info-muted: #0369a1;
40
+
41
+ /* ===== TYPOGRAPHY ===== */
42
+
43
+ /* Font families */
44
+ --font-heading: "Marcellus", serif;
45
+ --font-body: "Raleway", system-ui, sans-serif;
46
+ --font-mono: "JetBrains Mono", "Fira Code", "SF Mono", monospace;
47
+
48
+ /* Font sizes */
49
+ --text-xs: 0.75rem;
50
+ --text-xs--line-height: 1rem;
51
+ --text-sm: 0.875rem;
52
+ --text-sm--line-height: 1.25rem;
53
+ --text-base: 1rem;
54
+ --text-base--line-height: 1.5rem;
55
+ --text-lg: 1.125rem;
56
+ --text-lg--line-height: 1.75rem;
57
+ --text-xl: 1.25rem;
58
+ --text-xl--line-height: 1.75rem;
59
+ --text-2xl: 1.5rem;
60
+ --text-2xl--line-height: 2rem;
61
+ --text-3xl: 1.875rem;
62
+ --text-3xl--line-height: 2.25rem;
63
+ --text-4xl: 2.25rem;
64
+ --text-4xl--line-height: 2.5rem;
65
+ --text-5xl: 3rem;
66
+ --text-5xl--line-height: 1;
67
+ --text-6xl: 3.75rem;
68
+ --text-6xl--line-height: 1;
69
+
70
+ /* Font weights */
71
+ --font-weight-normal: 400;
72
+ --font-weight-medium: 500;
73
+ --font-weight-semibold: 600;
74
+ --font-weight-bold: 700;
75
+
76
+ /* Line heights */
77
+ --line-height-none: 1;
78
+ --line-height-tight: 1.25;
79
+ --line-height-snug: 1.375;
80
+ --line-height-normal: 1.5;
81
+ --line-height-relaxed: 1.625;
82
+ --line-height-loose: 2;
83
+
84
+ /* Letter spacing */
85
+ --letter-spacing-tighter: -0.05em;
86
+ --letter-spacing-tight: -0.025em;
87
+ --letter-spacing-normal: 0;
88
+ --letter-spacing-wide: 0.025em;
89
+ --letter-spacing-wider: 0.05em;
90
+ --letter-spacing-widest: 0.1em;
91
+
92
+ /* ===== SPACING ===== */
93
+ --spacing-px: 1px;
94
+ --spacing-0: 0;
95
+ --spacing-0_5: 0.125rem;
96
+ --spacing-1: 0.25rem;
97
+ --spacing-1_5: 0.375rem;
98
+ --spacing-2: 0.5rem;
99
+ --spacing-2_5: 0.625rem;
100
+ --spacing-3: 0.75rem;
101
+ --spacing-3_5: 0.875rem;
102
+ --spacing-4: 1rem;
103
+ --spacing-5: 1.25rem;
104
+ --spacing-6: 1.5rem;
105
+ --spacing-7: 1.75rem;
106
+ --spacing-8: 2rem;
107
+ --spacing-9: 2.25rem;
108
+ --spacing-10: 2.5rem;
109
+ --spacing-11: 2.75rem;
110
+ --spacing-12: 3rem;
111
+ --spacing-14: 3.5rem;
112
+ --spacing-16: 4rem;
113
+ --spacing-20: 5rem;
114
+ --spacing-24: 6rem;
115
+ --spacing-28: 7rem;
116
+ --spacing-32: 8rem;
117
+
118
+ /* ===== BORDER RADIUS ===== */
119
+ --radius-sm: 0.125rem;
120
+ --radius-md: 0.25rem;
121
+ --radius-lg: 0.375rem;
122
+ --radius-xl: 0.5rem;
123
+ --radius-2xl: 0.75rem;
124
+ --radius-3xl: 1rem;
125
+ --radius-full: 9999px;
126
+
127
+ /* ===== SHADOWS ===== */
128
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
129
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4), 0 2px 4px -2px rgba(0, 0, 0, 0.3);
130
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -4px rgba(0, 0, 0, 0.3);
131
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.4), 0 8px 10px -6px rgba(0, 0, 0, 0.3);
132
+ --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
133
+ --shadow-glow: 0 0 20px rgba(201, 162, 39, 0.3);
134
+ --shadow-glow-sm: 0 0 10px rgba(201, 162, 39, 0.2);
135
+ --shadow-glow-lg: 0 0 40px rgba(201, 162, 39, 0.4);
136
+ --shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.3);
137
+
138
+ /* ===== TRANSITIONS ===== */
139
+
140
+ /* Durations */
141
+ --duration-instant: 75ms;
142
+ --duration-fast: 150ms;
143
+ --duration-normal: 200ms;
144
+ --duration-slow: 300ms;
145
+ --duration-slower: 500ms;
146
+
147
+ /* Easing functions */
148
+ --ease-smooth: cubic-bezier(0.16, 1, 0.3, 1);
149
+ --ease-snap: cubic-bezier(0.5, 0, 0.1, 1);
150
+
151
+ /* ===== ANIMATIONS ===== */
152
+ --animate-fade-in: fade-in 200ms ease-out;
153
+ --animate-fade-out: fade-out 150ms ease-in;
154
+ --animate-slide-in-right: slide-in-right 300ms var(--ease-smooth);
155
+ --animate-slide-out-right: slide-out-right 200ms ease-in;
156
+ --animate-pulse-glow: pulse-glow 2s ease-in-out infinite;
157
+ }
158
+
159
+ @keyframes fade-in {
160
+ 0% { opacity: 0; }
161
+ 100% { opacity: 1; }
162
+ }
163
+
164
+ @keyframes fade-out {
165
+ 0% { opacity: 1; }
166
+ 100% { opacity: 0; }
167
+ }
168
+
169
+ @keyframes slide-in-right {
170
+ 0% { transform: translateX(100%); opacity: 0; }
171
+ 100% { transform: translateX(0); opacity: 1; }
172
+ }
173
+
174
+ @keyframes slide-out-right {
175
+ 0% { transform: translateX(0); opacity: 1; }
176
+ 100% { transform: translateX(100%); opacity: 0; }
177
+ }
178
+
179
+ @keyframes pulse-glow {
180
+ 0%, 100% { box-shadow: 0 0 20px rgba(201, 162, 39, 0.3); }
181
+ 50% { box-shadow: 0 0 30px rgba(201, 162, 39, 0.5); }
182
+ }
183
+
184
+ /* ===== BASE STYLES (applied via @layer base) ===== */
185
+ @layer base {
186
+ html {
187
+ font-family: var(--font-body);
188
+ background-color: var(--color-obsidian);
189
+ color: var(--color-white);
190
+ -webkit-font-smoothing: antialiased;
191
+ -moz-osx-font-smoothing: grayscale;
192
+ }
193
+
194
+ body {
195
+ min-height: 100vh;
196
+ line-height: 1.5;
197
+ }
198
+
199
+ /* Table styles */
200
+ table {
201
+ border-collapse: collapse;
202
+ width: 100%;
203
+ }
204
+
205
+ table, th, td {
206
+ border: 1px solid var(--color-gold-muted);
207
+ }
208
+
209
+ th, td {
210
+ padding: 0.5rem 0.75rem;
211
+ }
212
+
213
+ table:hover {
214
+ box-shadow: var(--shadow-glow);
215
+ }
216
+
217
+ /* Progress element */
218
+ progress {
219
+ appearance: none;
220
+ -webkit-appearance: none;
221
+ border: 1px solid var(--color-gold-muted);
222
+ border-radius: 0;
223
+ background-color: var(--color-charcoal);
224
+ width: 100%;
225
+ height: 0.5rem;
226
+ }
227
+
228
+ progress::-webkit-progress-bar {
229
+ background-color: var(--color-charcoal);
230
+ }
231
+
232
+ progress::-webkit-progress-value {
233
+ background-color: var(--color-gold);
234
+ }
235
+
236
+ progress::-moz-progress-bar {
237
+ background-color: var(--color-gold);
238
+ }
239
+
240
+ /* Headings */
241
+ h1, h2, h3, h4, h5, h6 {
242
+ font-family: var(--font-heading);
243
+ font-weight: 600;
244
+ letter-spacing: -0.025em;
245
+ color: var(--color-white);
246
+ }
247
+
248
+ h1 { font-size: 2.25rem; line-height: 1.25; }
249
+ h2 { font-size: 1.875rem; line-height: 1.25; }
250
+ h3 { font-size: 1.5rem; line-height: 1.375; }
251
+ h4 { font-size: 1.25rem; line-height: 1.375; }
252
+ h5 { font-size: 1.125rem; line-height: 1.5; }
253
+ h6 { font-size: 1rem; line-height: 1.5; }
254
+
255
+ /* Code */
256
+ code, pre, kbd, samp {
257
+ font-family: var(--font-mono);
258
+ font-size: 0.875em;
259
+ }
260
+
261
+ /* Links */
262
+ a {
263
+ color: var(--color-gold);
264
+ text-decoration: none;
265
+ transition: color var(--duration-fast) ease-out;
266
+ }
267
+
268
+ a:hover {
269
+ color: var(--color-gold-light);
270
+ }
271
+
272
+ /* Focus */
273
+ :focus-visible {
274
+ outline: 2px solid var(--color-gold);
275
+ outline-offset: 2px;
276
+ }
277
+
278
+ /* Selection */
279
+ ::selection {
280
+ background-color: var(--color-gold);
281
+ color: var(--color-obsidian);
282
+ }
283
+
284
+ /* Scrollbars */
285
+ ::-webkit-scrollbar {
286
+ width: 8px;
287
+ height: 8px;
288
+ }
289
+
290
+ ::-webkit-scrollbar-track {
291
+ background: var(--color-charcoal);
292
+ }
293
+
294
+ ::-webkit-scrollbar-thumb {
295
+ background: var(--color-ash);
296
+ border-radius: var(--radius-full);
297
+ }
298
+
299
+ ::-webkit-scrollbar-thumb:hover {
300
+ background: var(--color-silver);
301
+ }
302
+ }
303
+
304
+ /* ===== UTILITY CLASSES ===== */
305
+ @utility text-gradient-gold {
306
+ background: linear-gradient(to right, var(--color-gold), var(--color-gold-light), var(--color-gold));
307
+ -webkit-background-clip: text;
308
+ background-clip: text;
309
+ color: transparent;
310
+ }
311
+
312
+ @utility glow {
313
+ box-shadow: var(--shadow-glow);
314
+ }
315
+
316
+ @utility glow-sm {
317
+ box-shadow: var(--shadow-glow-sm);
318
+ }
319
+
320
+ @utility glow-lg {
321
+ box-shadow: var(--shadow-glow-lg);
322
+ }
323
+
324
+ @utility scroll-smooth {
325
+ scroll-behavior: smooth;
326
+ -webkit-overflow-scrolling: touch;
327
+ }
328
+
329
+ @utility scrollbar-hide {
330
+ -ms-overflow-style: none;
331
+ scrollbar-width: none;
332
+ &::-webkit-scrollbar {
333
+ display: none;
334
+ }
335
+ }
336
+
337
+ @utility backdrop-glass {
338
+ backdrop-filter: blur(12px);
339
+ background-color: rgba(20, 20, 20, 0.8);
340
+ }
341
+
342
+ @utility focus-ring {
343
+ &:focus-visible {
344
+ outline: 2px solid #c9a227;
345
+ outline-offset: 2px;
346
+ }
347
+ }
348
+
349
+ @utility line-clamp-2 {
350
+ display: -webkit-box;
351
+ -webkit-line-clamp: 2;
352
+ -webkit-box-orient: vertical;
353
+ overflow: hidden;
354
+ }
355
+
356
+ @utility line-clamp-3 {
357
+ display: -webkit-box;
358
+ -webkit-line-clamp: 3;
359
+ -webkit-box-orient: vertical;
360
+ overflow: hidden;
361
+ }
362
+
363
+ @utility center-absolute {
364
+ position: absolute;
365
+ top: 50%;
366
+ left: 50%;
367
+ transform: translate(-50%, -50%);
368
+ }
package/llms.md CHANGED
@@ -1,73 +1,41 @@
1
1
  # Aurelius Design System — AI Manifest
2
2
 
3
- ## Setup
3
+ ## Setup (Tailwind v4)
4
4
 
5
- ### 1. Install dependencies
5
+ ### 1. Install
6
6
 
7
7
  ```bash
8
- npm install -D eslint eslint-plugin-tailwindcss
8
+ npm install @lukeashford/aurelius
9
+ npm install -D eslint @typescript-eslint/parser eslint-plugin-better-tailwindcss @poupe/eslint-plugin-tailwindcss @eslint/css tailwind-csstree
9
10
  ```
10
11
 
11
- ### 2. Configure Tailwind
12
+ ### 2. Import the design system
12
13
 
13
- ```javascript
14
- // tailwind.config.js
15
- const aureliusPreset = require('@lukeashford/aurelius/tailwind.preset')
16
-
17
- module.exports = {
18
- presets: [aureliusPreset],
19
- content: [
20
- './src/**/*.{js,ts,jsx,tsx}',
21
- './node_modules/@lukeashford/aurelius/dist/**/*.{js,mjs}',
22
- ],
23
- }
24
- ```
25
-
26
- ### 3. Configure ESLint (enforces design system)
27
-
28
- ```javascript
29
- // eslint.config.js
30
- import tailwindcss from 'eslint-plugin-tailwindcss';
31
-
32
- export default [
33
- {
34
- plugins: { tailwindcss },
35
- rules: {
36
- 'tailwindcss/no-arbitrary-value': 'error',
37
- 'tailwindcss/no-custom-classname': 'error',
38
- },
39
- settings: {
40
- tailwindcss: { config: './tailwind.config.js' },
41
- },
42
- },
43
- ];
44
- ```
14
+ Create or update your `index.css`:
45
15
 
46
- ### 4. Add lint script
16
+ ```css
17
+ /* Import the complete Aurelius design system (includes Tailwind v4, fonts, and theme) */
18
+ @import '@lukeashford/aurelius/styles/base.css';
47
19
 
48
- ```json
49
- {
50
- "scripts": {
51
- "lint": "eslint src --max-warnings 0",
52
- "dev": "npm run lint && vite",
53
- "build": "npm run lint && vite build"
54
- }
55
- }
20
+ /* Tell Tailwind to scan the Aurelius package for utility classes */
21
+ @source "../node_modules/@lukeashford/aurelius/dist";
56
22
  ```
57
23
 
58
- ### 5. Import fonts and directives
24
+ Then import it in your entry file:
59
25
 
60
26
  ```typescript
61
- // main.tsx
62
- import '@lukeashford/aurelius/styles/fonts.css'
27
+ // main.tsx or index.tsx
63
28
  import './index.css'
64
29
  ```
65
30
 
66
- ```css
67
- /* index.css */
68
- @tailwind base;
69
- @tailwind components;
70
- @tailwind utilities;
31
+ ### 3. Configure ESLint
32
+
33
+ Aurelius ships with a default ESLint config you can re-export in one line. It enforces design system
34
+ constraints — if ESLint complains, you're leaving the rails.
35
+
36
+ ```javascript
37
+ // eslint.config.mjs
38
+ export { default } from '@lukeashford/aurelius/eslint';
71
39
  ```
72
40
 
73
41
  ---
@@ -75,10 +43,10 @@ import './index.css'
75
43
  ## Rules (MUST follow)
76
44
 
77
45
  1. **Dark mode only.** Use `bg-obsidian`, `bg-charcoal`, `bg-void`. Never white backgrounds.
78
- 2. **Text colors.** Use `text - white` for headings and primary content. Use `text-silver` for secondary text, descriptions, and metadata.
46
+ 2. **Text colors.** Use `text-white` for headings and primary content. Use `text-silver` for secondary text, descriptions, and metadata.
79
47
  3. **Gold is for primary actions only.** Don't overuse `text-gold` or `bg-gold`.
80
48
  4. **Use components first.** Check the Components table below before building custom elements.
81
- 5. **Use Tailwind classes from this manifest.** Never hardcode hex values or use arbitrary values like `bg-[#123]`.
49
+ 5. **Stay on-system.** No custom/non-Aurelius class names, no arbitrary value utilities (`bg-[...]`, `text-[...]`, etc.), and follow Tailwind v4 CSS best practices in `.css` files.
82
50
  6. **Subtle borders over shadows.** Prefer `border-ash` over heavy drop shadows.
83
51
 
84
52
  ---
@@ -89,23 +57,23 @@ Import from `@lukeashford/aurelius`:
89
57
 
90
58
  | Component | Props |
91
59
  |-----------|-------|
92
- | Alert | variant, title |
93
- | Avatar | src, alt, name, size, status |
94
- | Badge | variant |
95
- | Button | variant, size, loading |
96
- | Card | variant, interactive |
60
+ | Alert | variant (info, success, warning, error), title |
61
+ | Avatar | src, alt, name, size (xs, sm, md, lg, xl, 2xl), status (online, offline, busy) |
62
+ | Badge | variant (default, gold, success, error, warning, info) |
63
+ | Button | variant (primary, important, elevated, outlined, featured, ghost, danger), size (sm, md, lg, xl), loading |
64
+ | Card | variant (default, elevated, outlined, ghost, featured), interactive |
97
65
  | Checkbox | label |
98
66
  | HelperText | error |
99
67
  | Input | error, leadingIcon, trailingIcon |
100
68
  | Label | required |
101
- | Modal | isOpen, onClose, title, children, className |
69
+ | Modal | isOpen, title, children, className |
102
70
  | Radio | label |
103
71
  | Select | error, options |
104
72
  | Skeleton | children |
105
- | Spinner | size |
106
- | Switch | checked, defaultChecked, onCheckedChange, label |
73
+ | Spinner | size (sm, md, lg) |
74
+ | Switch | checked, defaultChecked, label |
107
75
  | Textarea | error |
108
- | Tooltip | content, children, open, side |
76
+ | Tooltip | content, children, open, side (top, right, bottom, left) |
109
77
 
110
78
  ### Component usage example
111
79
 
@@ -130,19 +98,19 @@ Use ONLY these token-based classes. Arbitrary values like `bg-[#0a0a0a]` will fa
130
98
  bg-void, bg-obsidian, bg-charcoal, bg-graphite, bg-slate, bg-ash, bg-gold, bg-gold-light, bg-gold-bright, bg-gold-muted, bg-gold-pale, bg-gold-glow, bg-white, bg-silver, bg-zinc, bg-dim, bg-success, bg-success-muted, bg-error, bg-error-muted, bg-warning, bg-warning-muted, bg-info, bg-info-muted
131
99
 
132
100
  ### Text (`text-*`)
133
- text-white, text-silver, text-gold, text-gold-light, text-gold-muted, text-dim, text-success, text-error, text-warning, text-info
101
+ text-void, text-obsidian, text-charcoal, text-graphite, text-slate, text-ash, text-gold, text-gold-light, text-gold-bright, text-gold-muted, text-gold-pale, text-gold-glow, text-white, text-silver, text-zinc, text-dim, text-success, text-success-muted, text-error, text-error-muted, text-warning, text-warning-muted, text-info, text-info-muted
134
102
 
135
103
  ### Borders (`border-*`)
136
- border-ash, border-gold, border-gold-muted, border-charcoal, border-graphite, border-success, border-error
104
+ border-void, border-obsidian, border-charcoal, border-graphite, border-slate, border-ash, border-gold, border-gold-light, border-gold-bright, border-gold-muted, border-gold-pale, border-gold-glow, border-white, border-silver, border-zinc, border-dim, border-success, border-success-muted, border-error, border-error-muted, border-warning, border-warning-muted, border-info, border-info-muted
105
+
106
+ ### Typography
137
107
 
138
- ### Spacing (`p-*`, `m-*`, `gap-*`, `space-*`)
139
- 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 64
108
+ **Font families:** `font-heading` ("Marcellus", serif), `font-body` ("Raleway", system-ui, sans-serif), `font-mono` ("JetBrains Mono", "Fira Code", "SF Mono", monospace)
140
109
 
141
- ### Border Radius (`rounded-*`)
142
- none (preferred for Aurelius aesthetic), sm, md, lg, xl, 2xl, full
110
+ Standard Tailwind classes for size (`text-sm`, `text-lg`, etc.), weight (`font-medium`, `font-bold`), and spacing are available.
143
111
 
144
- ### Shadows (`shadow-*`)
145
- sm, md, lg, xl, glow, glow-sm, glow-lg
112
+ ### Custom Utilities
113
+ text-gradient-gold, glow, glow-sm, glow-lg, scroll-smooth, scrollbar-hide, backdrop-glass, focus-ring, line-clamp-2, line-clamp-3, center-absolute
146
114
 
147
115
  ### Opacity modifiers
148
116
  Append `/10`, `/20`, `/30`, etc. to colors: `bg-gold/20`, `border-ash/50`
@@ -167,14 +135,4 @@ Append `/10`, `/20`, `/30`, etc. to colors: `bg-gold/20`, `border-ash/50`
167
135
  // ✅ Correct
168
136
  <div className="bg-obsidian text-gold border border-ash p-4">
169
137
  <Button variant="primary">Click</Button>
170
- ```
171
-
172
- ---
173
-
174
- ## Non-Tailwind fallback
175
-
176
- If not using Tailwind, import precompiled CSS:
177
-
178
- ```typescript
179
- import '@lukeashford/aurelius/styles/base.css'
180
138
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lukeashford/aurelius",
3
- "version": "1.1.0",
3
+ "version": "2.1.0",
4
4
  "description": "Design system for Aurelius applications — A cohesive visual language for creative technologists",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -11,44 +11,89 @@
11
11
  "import": "./dist/index.mjs",
12
12
  "require": "./dist/index.js"
13
13
  },
14
- "./tailwind.preset": {
15
- "types": "./dist/tailwind.preset.d.ts",
16
- "import": "./dist/tailwind.preset.mjs",
17
- "require": "./dist/tailwind.preset.js"
18
- },
14
+ "./eslint": "./scripts/eslint.mjs",
15
+ "./styles/base.css": "./dist/styles/base.css",
16
+ "./styles/theme.css": "./dist/styles/theme.css",
17
+ "./styles/fonts.css": "./dist/styles/fonts.css",
19
18
  "./styles/*": "./dist/styles/*",
20
19
  "./llms.md": "./llms.md",
21
20
  "./package.json": "./package.json"
22
21
  },
23
22
  "files": [
24
23
  "dist",
24
+ "scripts/eslint.mjs",
25
25
  "llms.md"
26
26
  ],
27
27
  "scripts": {
28
- "build:css": "tailwindcss -c tailwind.build.config.cjs -i src/styles/base.css -o dist/styles/base.css --minify",
29
- "build": "tsup && npm run build:css && node scripts/generate-manifest.js",
28
+ "build": "npm run typecheck && npm run lint && tsup && node scripts/generate-manifest.js",
30
29
  "dev": "tsup --watch",
31
30
  "typecheck": "tsc --noEmit",
31
+ "lint": "eslint src --max-warnings 0",
32
32
  "prepublishOnly": "npm run build",
33
33
  "dev:demo": "npm --prefix demo run dev",
34
34
  "dev:all": "concurrently -k \"npm run dev\" \"npm run dev:demo\""
35
35
  },
36
36
  "peerDependencies": {
37
- "react": "^18.0.0",
38
- "react-dom": "^18.0.0",
39
- "tailwindcss": ">=3.0.0"
37
+ "@eslint/css": ">=0.9.0",
38
+ "@poupe/eslint-plugin-tailwindcss": ">=0.2.0",
39
+ "@typescript-eslint/parser": ">=8.0.0",
40
+ "eslint": ">=9.0.0",
41
+ "eslint-plugin-better-tailwindcss": ">=4.0.0-beta",
42
+ "react": "^18.0.0 || ^19.0.0",
43
+ "react-dom": "^18.0.0 || ^19.0.0",
44
+ "tailwind-csstree": ">=0.1.0",
45
+ "tailwindcss": ">=4.0.0"
46
+ },
47
+ "peerDependenciesMeta": {
48
+ "tailwindcss": {
49
+ "optional": true
50
+ },
51
+ "eslint": {
52
+ "optional": true
53
+ },
54
+ "eslint-plugin-better-tailwindcss": {
55
+ "optional": true
56
+ },
57
+ "@poupe/eslint-plugin-tailwindcss": {
58
+ "optional": true
59
+ },
60
+ "@typescript-eslint/parser": {
61
+ "optional": true
62
+ },
63
+ "@eslint/css": {
64
+ "optional": true
65
+ },
66
+ "tailwind-csstree": {
67
+ "optional": true
68
+ }
40
69
  },
41
70
  "devDependencies": {
71
+ "@eslint/css": "^0.9.0",
72
+ "@poupe/eslint-plugin-tailwindcss": "^0.2.4",
73
+ "@testing-library/jest-dom": "^6.6.3",
74
+ "@testing-library/react": "^16.1.0",
75
+ "@testing-library/user-event": "^14.5.2",
76
+ "@types/jest": "^29.5.14",
42
77
  "@types/node": "^20.0.0",
43
- "@types/react": "^18.0.0",
44
- "@types/react-dom": "^18.3.7",
78
+ "@types/react": "^19.2.7",
79
+ "@types/react-dom": "^19.2.3",
80
+ "@typescript-eslint/eslint-plugin": "^8.49.0",
81
+ "@typescript-eslint/parser": "^8.49.0",
82
+ "@vitejs/plugin-react": "^4.3.4",
45
83
  "concurrently": "^8.2.2",
46
- "react": "^18.0.0",
47
- "react-dom": "^18.0.0",
48
- "tailwindcss": "^3.4.0",
84
+ "eslint": "^9.0.0",
85
+ "eslint-plugin-better-tailwindcss": "^4.0.0-beta",
86
+ "jest": "^29.7.0",
87
+ "jest-environment-jsdom": "^29.7.0",
88
+ "react": "^19.2.1",
89
+ "react-dom": "^19.2.1",
90
+ "tailwindcss": "^4.1.17",
91
+ "ts-jest": "^29.2.5",
92
+ "ts-node": "^10.9.2",
49
93
  "tsup": "^8.0.0",
50
94
  "tsx": "^4.7.0",
51
- "typescript": "^5.0.0"
95
+ "typescript": "^5.0.0",
96
+ "vite": "^5.4.11"
52
97
  },
53
98
  "repository": {
54
99
  "type": "git",