@llmnative/react 1.18.1 → 1.19.1

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/themes/default.ts CHANGED
@@ -1,495 +1,502 @@
1
- import type { Theme, ThemeDefinition, ThemePresetConfig } from '../src/Theme';
2
- import type { MotionRegistry } from '../src/motion';
3
-
4
- export const preset: ThemePresetConfig = {
5
- mode: 'light',
6
- radius: 0.5,
7
- colors: {
8
- background: '0 0% 100%',
9
- foreground: '222.2 84% 4.9%',
10
- card: '0 0% 100%',
11
- cardForeground: '222.2 84% 4.9%',
12
- popover: '0 0% 100%',
13
- popoverForeground: '222.2 84% 4.9%',
14
- primary: '221.2 83.2% 53.3%',
15
- primaryForeground: '210 40% 98%',
16
- secondary: '210 40% 96.1%',
17
- secondaryForeground: '222.2 47.4% 11.2%',
18
- muted: '210 40% 96.1%',
19
- mutedForeground: '215.4 16.3% 46.9%',
20
- accent: '210 40% 96.1%',
21
- accentForeground: '222.2 47.4% 11.2%',
22
- destructive: '0 84.2% 60.2%',
23
- destructiveForeground:'210 40% 98%',
24
- success: '142.1 76.2% 36.3%',
25
- successForeground: '0 0% 100%',
26
- warning: '32.1 94.6% 43.7%',
27
- warningForeground: '0 0% 100%',
28
- info: '198.6 88.7% 48.4%',
29
- infoForeground: '0 0% 100%',
30
- border: '214.3 31.8% 91.4%',
31
- input: '214.3 31.8% 91.4%',
32
- ring: '221.2 83.2% 53.3%',
33
- },
34
- dark: {
35
- background: '222.2 84% 4.9%',
36
- foreground: '210 40% 98%',
37
- card: '222.2 84% 4.9%',
38
- cardForeground: '210 40% 98%',
39
- popover: '222.2 84% 4.9%',
40
- popoverForeground: '210 40% 98%',
41
- primary: '217.2 91.2% 59.8%',
42
- primaryForeground: '222.2 47.4% 11.2%',
43
- secondary: '217.2 32.6% 17.5%',
44
- secondaryForeground: '210 40% 98%',
45
- muted: '217.2 32.6% 17.5%',
46
- mutedForeground: '215 20.2% 65.1%',
47
- accent: '217.2 32.6% 17.5%',
48
- accentForeground: '210 40% 98%',
49
- destructive: '0 62.8% 30.6%',
50
- destructiveForeground:'210 40% 98%',
51
- success: '142.1 70.6% 45.3%',
52
- successForeground: '0 0% 100%',
53
- warning: '32.1 94.6% 55%',
54
- warningForeground: '0 0% 100%',
55
- info: '198.6 88.7% 60%',
56
- infoForeground: '0 0% 100%',
57
- border: '217.2 32.6% 17.5%',
58
- input: '217.2 32.6% 17.5%',
59
- ring: '224.3 76.3% 48%',
60
- },
61
- };
62
-
63
- export const motion: MotionRegistry = {
64
- none: {
65
- from: {},
66
- to: {},
67
- transition: { duration: 0, easing: 'linear', properties: ['opacity', 'transform', 'box-shadow'] },
68
- reducedMotion: 'always',
69
- },
70
- fade: {
71
- from: { opacity: 0 },
72
- to: { opacity: 1 },
73
- transition: { duration: 160, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity'] },
74
- reducedMotion: 'respect-user',
75
- },
76
- fadeUp: {
77
- from: { opacity: 0, transform: 'translateY(8px)' },
78
- to: { opacity: 1, transform: 'translateY(0)' },
79
- transition: { duration: 160, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity', 'transform'] },
80
- reducedMotion: 'respect-user',
81
- },
82
- fadeDown: {
83
- from: { opacity: 0, transform: 'translateY(-8px)' },
84
- to: { opacity: 1, transform: 'translateY(0)' },
85
- transition: { duration: 140, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity', 'transform', 'visibility'] },
86
- reducedMotion: 'respect-user',
87
- },
88
- slideFromRight: {
89
- from: { opacity: 0, transform: 'translateX(100%)' },
90
- to: { opacity: 1, transform: 'translateX(0)' },
91
- transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },
92
- reducedMotion: 'respect-user',
93
- },
94
- slideFromLeft: {
95
- from: { opacity: 0, transform: 'translateX(-100%)' },
96
- to: { opacity: 1, transform: 'translateX(0)' },
97
- transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },
98
- reducedMotion: 'respect-user',
99
- },
100
- slideFromTop: {
101
- from: { opacity: 0, transform: 'translateY(-100%)' },
102
- to: { opacity: 1, transform: 'translateY(0)' },
103
- transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },
104
- reducedMotion: 'respect-user',
105
- },
106
- slideFromBottom: {
107
- from: { opacity: 0, transform: 'translateY(100%)' },
108
- to: { opacity: 1, transform: 'translateY(0)' },
109
- transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },
110
- reducedMotion: 'respect-user',
111
- },
112
- press: {
113
- from: {},
114
- to: { transform: 'scale(0.98)' },
115
- transition: { duration: 100, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['transform', 'box-shadow'] },
116
- reducedMotion: 'respect-user',
117
- },
118
- imageZoom: {
119
- from: { transform: 'scale(1)' },
120
- to: { transform: 'scale(1.06)' },
121
- transition: { duration: 300, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['transform'] },
122
- reducedMotion: 'respect-user',
123
- },
124
- };
125
-
126
- export const components: Theme = {
127
- Grid: {
128
- // REVERT NOTE (2026-07-15): before this change, `Card.className` was 'border-0' only
129
- // (outer border removed, but bg-card/rounded/shadow kept — header+footer still sat in
130
- // a white rounded box), `Table.wrapperClassName`/`Gallery.wrapperClassName` were both
131
- // ''. The change moves the "raised card" surface (border+bg+shadow+radius) from the
132
- // Card wrapper (which held header+body+footer together) down into Table/Gallery's own
133
- // wrapper — so the toolbar row (view toggle, column picker, New component…) sits
134
- // directly on the page's floor background with no box of its own, and only the actual
135
- // data surface reads as a raised panel. To revert: restore the four blocks below to
136
- // the values in this note.
137
- Card: {
138
- wrapperClassName: '',
139
- // Fully transparent/borderless/shapeless now — header and footer (when used) are
140
- // meant to float on the page's own background, not sit inside a card of their own;
141
- // the "raised surface" look lives in Table/Gallery's wrapperClassName instead.
142
- className: 'rounded-none border-0 bg-transparent shadow-none',
143
- headerClassName: 'flex justify-between border-b-0 bg-transparent px-0 py-2',
144
- bodyClassName: 'p-0 mt-2',
145
- footerClassName: 'border-t-0 bg-transparent px-0 py-2',
146
- loading: false,
147
- },
148
- Table: {
149
- // The table's own raised surface — previously this border+bg lived on the
150
- // shared Card wrapper (see revert note above).
151
- wrapperClassName: 'rounded-lg border border-border bg-card shadow-sm',
152
- className: '',
153
- headerClassName: '',
154
- bodyClassName: '',
155
- footerClassName: '',
156
- scrollClassName: 'overflow-x-auto',
157
- selectedClassName: 'bg-primary/10',
158
- },
159
- Gallery: {
160
- // Same rationale as Table above; `p-3` so cards don't sit flush against the border.
161
- wrapperClassName: 'rounded-lg border border-border bg-card shadow-sm p-3',
162
- className: '',
163
- scrollClassName: '',
164
- headerClassName: '',
165
- bodyClassName: '',
166
- footerClassName: '',
167
- selectedClassName: 'bg-primary/20',
168
- gap: 1,
169
- rowCols: 4,
170
- },
171
- Modal: {
172
- mode: 'form',
173
- size: 'lg',
174
- position: 'center',
175
- wrapperClassName: '',
176
- className: '',
177
- headerClassName: '',
178
- titleClassName: '',
179
- subtitleClassName: 'pr-1 text-muted-foreground',
180
- bodyClassName: '',
181
- footerClassName: '',
182
- iconExpand: 'fullscreen',
183
- iconCollapse: 'fullscreen-exit',
184
- motion: {
185
- center: 'fade',
186
- top: 'slideFromTop',
187
- left: 'slideFromLeft',
188
- right: 'slideFromRight',
189
- bottom: 'slideFromBottom',
190
- backdrop: 'fade',
191
- },
192
- },
193
- },
194
- Table: {
195
- wrapperClassName: '',
196
- className: '',
197
- headerClassName: '',
198
- bodyClassName: '',
199
- footerClassName: '',
200
- scrollClassName: 'overflow-x-auto',
201
- selectedClassName: 'bg-primary/10',
202
- },
203
- Gallery: {
204
- wrapperClassName: '',
205
- className: '',
206
- scrollClassName: '',
207
- headerClassName: '',
208
- bodyClassName: '',
209
- footerClassName: '',
210
- selectedClassName: 'bg-primary/20',
211
- gap: 4,
212
- rowCols: 2,
213
- },
214
- Pagination: {
215
- wrapperClassName: '',
216
- className: '',
217
- stickyClassName: 'fixed bottom-0 left-0 right-0 mx-5',
218
- scrollToTop: false,
219
- scrollBehavior: 'auto',
220
- maxItems: 5,
221
- sticky: true,
222
- align: 'end',
223
- },
224
- Carousel: {
225
- showIndicators: true,
226
- showControls: true,
227
- showCaption: true,
228
- dark: false,
229
- autoPlay: true,
230
- },
231
- Card: {
232
- wrapperClassName: '',
233
- className: '',
234
- headerClassName: 'flex justify-between bg-white/[.15] font-normal',
235
- bodyClassName: 'flex flex-col',
236
- footerClassName: '',
237
- loading: false,
238
- },
239
- Loader: {
240
- wrapperClassName: '',
241
- className: '',
242
- icon: 'loader-2',
243
- title: 'Loading..',
244
- description: '',
245
- },
246
- ActionButton: {
247
- className: 'btn-primary',
248
- badgeClassName: 'rounded-full bg-destructive text-destructive-foreground',
249
- motion: {
250
- press: 'press',
251
- },
252
- },
253
- LoadingButton: {
254
- className: 'btn-primary',
255
- badgeClassName: 'rounded-full bg-destructive text-destructive-foreground',
256
- motion: {
257
- press: 'press',
258
- },
259
- },
260
- LinkButton: {
261
- className: 'btn-outline-secondary',
262
- },
263
- Alert: {
264
- className: '',
265
- },
266
- Badge: {
267
- className: '',
268
- },
269
- Modal: {
270
- size: 'lg',
271
- position: 'center',
272
- wrapperClassName: '',
273
- className: '',
274
- headerClassName: '',
275
- titleClassName: '',
276
- subtitleClassName: 'pr-1 text-muted-foreground',
277
- bodyClassName: '',
278
- footerClassName: '',
279
- iconExpand: 'fullscreen',
280
- iconCollapse: 'fullscreen-exit',
281
- motion: {
282
- center: 'fade',
283
- top: 'slideFromTop',
284
- left: 'slideFromLeft',
285
- right: 'slideFromRight',
286
- bottom: 'slideFromBottom',
287
- backdrop: 'fade',
288
- },
289
- },
290
- Dropdown: {
291
- wrapperClassName: '',
292
- className: '',
293
- triggerClassName: 'btn btn-outline-primary',
294
- badgeClassName: '',
295
- menuClassName: 'border-border/60 bg-popover/95 shadow-xl shadow-black/5 backdrop-blur supports-[backdrop-filter]:bg-popover/90 dark:shadow-black/20',
296
- menuHeaderClass: 'text-muted-foreground/70',
297
- menuItemClass: '',
298
- menuDividerClass: 'bg-border/60',
299
- headerClassName: '',
300
- footerClassName: '',
301
- Menu: {
302
- wrapperClassName: '',
303
- className: 'list-none p-0 m-0',
304
- headerClassName: '',
305
- itemClassName: '',
306
- linkClassName: 'flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm hover:bg-accent',
307
- iconClassName: 'text-muted-foreground',
308
- textClassName: '',
309
- badgeClassName: '',
310
- arrowClassName: '',
311
- submenuClassName: '',
312
- },
313
- motion: {
314
- open: 'fadeDown',
315
- close: 'fadeDown',
316
- press: 'press',
317
- },
318
- },
319
- Notifications: {
320
- wrapperClassName: '',
321
- Dropdown: {
322
- className: '',
323
- triggerClassName: 'btn btn-link',
324
- menuClassName: 'mt-1 text-[11px] w-[300px] pt-1',
325
- },
326
- },
327
- Select: {
328
- wrapperClassName: '',
329
- className: '',
330
- },
331
- Autocomplete: {
332
- wrapperClassName: '',
333
- className: '',
334
- },
335
- AddressAutocomplete: {
336
- wrapperClassName: '',
337
- className: '',
338
- menuClassName: 'border-border/60 bg-popover/95 shadow-xl shadow-black/5 backdrop-blur supports-[backdrop-filter]:bg-popover/90 dark:shadow-black/20',
339
- itemClassName: '',
340
- },
341
- Form: {
342
- wrapperClassName: '',
343
- buttonSaveClass: 'btn-outline-primary',
344
- buttonDeleteClass: 'btn-outline-danger',
345
- buttonBackClass: 'btn-link',
346
- Card: {
347
- headerClassName: '',
348
- bodyClassName: '',
349
- footerClassName: 'flex items-center justify-end gap-3',
350
- },
351
- },
352
- Menu: {
353
- wrapperClassName: 'flex-1 overflow-auto p-4',
354
- className: 'flex flex-col mb-auto',
355
- headerClassName: '',
356
- itemClassName: '',
357
- linkClassName: 'flex items-center gap-2 rounded-md px-3 py-2 text-sm font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground',
358
- iconClassName: 'mr-1 shrink-0',
359
- textClassName: 'flex-1',
360
- badgeClassName: 'ml-1',
361
- arrowClassName: '',
362
- submenuClassName: 'mt-1 flex flex-col gap-1 pl-4',
363
- },
364
- SideNav: {
365
- wrapperClassName: '',
366
- shellClassName: 'border-r border-border bg-card/80 text-foreground backdrop-blur supports-[backdrop-filter]:bg-card/70',
367
- overlayClassName: 'shadow-xl',
368
- headerClassName: 'border-b border-border/60 px-1.5 py-2',
369
- navClassName: 'px-1.5 py-2',
370
- footerClassName: 'border-t border-border/60 px-1.5 py-2',
371
- groupLabelClassName: 'text-[10.5px] font-semibold uppercase tracking-widest text-muted-foreground/60 select-none',
372
- groupDividerClassName: 'bg-border/50',
373
- itemClassName: 'rounded-lg',
374
- itemActiveClassName: 'bg-primary/10 text-primary font-medium shadow-sm',
375
- itemChildActiveClassName: 'bg-accent/80 text-foreground font-medium',
376
- itemInactiveClassName: 'text-muted-foreground hover:text-foreground hover:bg-accent/70',
377
- itemIconClassName: '',
378
- itemTextClassName: '',
379
- itemBadgeClassName: 'ml-auto shrink-0 text-[10px] font-semibold leading-none px-1.5 py-[3px] rounded-full bg-primary/15 text-primary',
380
- itemCollapsedBadgeClassName: 'absolute -top-0.5 -right-1 h-[7px] w-[7px] rounded-full bg-primary ring-1 ring-card',
381
- itemToggleClassName: 'shrink-0 flex items-center justify-center w-6 h-6 rounded-md transition-colors text-muted-foreground/50 hover:text-foreground hover:bg-accent/70',
382
- subItemClassName: 'rounded-md',
383
- subItemActiveClassName: 'bg-primary/10 text-primary font-medium',
384
- subItemInactiveClassName: 'text-muted-foreground hover:text-foreground hover:bg-accent/70',
385
- collapseButtonClassName: 'shrink-0 flex items-center justify-center rounded-md w-8 h-8 transition-colors text-muted-foreground hover:text-foreground hover:bg-accent/70',
386
- },
387
- Toolbar: {
388
- wrapperClassName: 'z-20 w-full',
389
- stickyClassName: 'sticky top-0',
390
- restingClassName: 'bg-transparent border-transparent shadow-none',
391
- scrolledClassName: 'border-b border-border/60 bg-background/85 backdrop-blur supports-[backdrop-filter]:bg-background/75',
392
- innerClassName: 'flex min-h-14 items-center gap-3 px-4 md:px-6',
393
- leadingClassName: 'flex min-w-0 items-center gap-2 shrink-0',
394
- centerClassName: 'flex min-w-0 flex-1 items-center gap-3',
395
- trailingClassName: 'flex items-center gap-2 shrink-0',
396
- },
397
- ListCard: {
398
- wrapperClassName: '',
399
- className: 'shadow-sm',
400
- activeClassName: 'border-primary/30 bg-primary/10 shadow-sm',
401
- inactiveClassName: 'hover:bg-accent/40',
402
- disabledClassName: 'cursor-not-allowed opacity-60',
403
- dashedClassName: 'border-dashed',
404
- compactClassName: 'p-3',
405
- leadingClassName: '',
406
- bodyClassName: '',
407
- headerClassName: '',
408
- titleClassName: '',
409
- descriptionClassName: '',
410
- metaClassName: '',
411
- badgeClassName: '',
412
- trailingClassName: '',
413
- footerClassName: '',
414
- motion: {
415
- press: 'press',
416
- },
417
- },
418
- ProviderSwitcher: {
419
- wrapperClassName: 'w-full',
420
- className: 'w-full',
421
- triggerClassName: 'flex w-full items-center gap-2 rounded-xl px-1.5 py-1.5 text-left text-sm font-semibold text-foreground transition-colors hover:bg-accent/40',
422
- disabledClassName: 'pointer-events-none opacity-60',
423
- iconWrapperClassName: 'flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary',
424
- labelClassName: 'block truncate',
425
- captionClassName: 'block truncate text-[11px] font-normal text-muted-foreground/80',
426
- chevronClassName: 'ml-auto shrink-0 text-muted-foreground/70',
427
- itemClassName: '',
428
- itemActiveClassName: '',
429
- itemInactiveClassName: '',
430
- itemMetaClassName: 'text-xs text-muted-foreground',
431
- checkClassName: 'text-primary',
432
- },
433
- Brand: {
434
- wrapperClassName: '',
435
- className: 'flex items-center',
436
- logoClassName: 'flex items-center gap-2 font-semibold',
437
- labelClassName: 'text-sm font-medium',
438
- },
439
- SignIn: {
440
- className: 'flex items-center',
441
- avatarClass: 'mx-2 rounded-full object-cover',
442
- },
443
- Image: {
444
- wrapperClassName: '',
445
- className: '',
446
- motion: {
447
- enter: 'fade',
448
- hover: false,
449
- },
450
- },
451
- ImageAvatar: {
452
- wrapperClassName: '',
453
- className: '',
454
- motion: { enter: 'fade', hover: false },
455
- },
456
- Percentage: {
457
- wrapperClassName: '',
458
- className: '',
459
- },
460
- Tab: {
461
- wrapperClassName: '',
462
- className: '',
463
- menuClassName: '',
464
- itemClassName: '',
465
- contentClassName: '',
466
- triggerClassName: '',
467
- activeTriggerClassName: '',
468
- inactiveTriggerClassName: '',
469
- motion: {
470
- enter: 'fadeUp',
471
- },
472
- },
473
- Code: {
474
- wrapperClassName: '',
475
- className: '',
476
- },
477
- CodeEditor: {
478
- wrapperClassName: '',
479
- className: '',
480
- },
481
- Prompt: {
482
- wrapperClassName: '',
483
- className: '',
484
- },
485
- Repeat: {
486
- itemClassName: '',
487
- inlineItemClassName: '',
488
- addButtonClassName: '',
489
- },
490
- };
491
-
492
- const definition: ThemeDefinition = { preset, motion, components };
493
-
494
- export default definition;
495
-
1
+ import type { Theme, ThemeDefinition, ThemePresetConfig } from '../src/Theme';
2
+ import type { MotionRegistry } from '../src/motion';
3
+
4
+ export const preset: ThemePresetConfig = {
5
+ mode: 'light',
6
+ radius: 0.5,
7
+ colors: {
8
+ background: '0 0% 100%',
9
+ foreground: '222.2 84% 4.9%',
10
+ card: '0 0% 100%',
11
+ cardForeground: '222.2 84% 4.9%',
12
+ popover: '0 0% 100%',
13
+ popoverForeground: '222.2 84% 4.9%',
14
+ primary: '221.2 83.2% 53.3%',
15
+ primaryForeground: '210 40% 98%',
16
+ secondary: '210 40% 96.1%',
17
+ secondaryForeground: '222.2 47.4% 11.2%',
18
+ muted: '210 40% 96.1%',
19
+ mutedForeground: '215.4 16.3% 46.9%',
20
+ accent: '210 40% 96.1%',
21
+ accentForeground: '222.2 47.4% 11.2%',
22
+ destructive: '0 84.2% 60.2%',
23
+ destructiveForeground:'210 40% 98%',
24
+ success: '142.1 76.2% 36.3%',
25
+ successForeground: '0 0% 100%',
26
+ warning: '32.1 94.6% 43.7%',
27
+ warningForeground: '0 0% 100%',
28
+ info: '198.6 88.7% 48.4%',
29
+ infoForeground: '0 0% 100%',
30
+ border: '214.3 31.8% 91.4%',
31
+ input: '214.3 31.8% 91.4%',
32
+ ring: '221.2 83.2% 53.3%',
33
+ },
34
+ dark: {
35
+ background: '222.2 84% 4.9%',
36
+ foreground: '210 40% 98%',
37
+ card: '222.2 84% 4.9%',
38
+ cardForeground: '210 40% 98%',
39
+ popover: '222.2 84% 4.9%',
40
+ popoverForeground: '210 40% 98%',
41
+ primary: '217.2 91.2% 59.8%',
42
+ primaryForeground: '222.2 47.4% 11.2%',
43
+ secondary: '217.2 32.6% 17.5%',
44
+ secondaryForeground: '210 40% 98%',
45
+ muted: '217.2 32.6% 17.5%',
46
+ mutedForeground: '215 20.2% 65.1%',
47
+ accent: '217.2 32.6% 17.5%',
48
+ accentForeground: '210 40% 98%',
49
+ destructive: '0 62.8% 30.6%',
50
+ destructiveForeground:'210 40% 98%',
51
+ success: '142.1 70.6% 45.3%',
52
+ successForeground: '0 0% 100%',
53
+ warning: '32.1 94.6% 55%',
54
+ warningForeground: '0 0% 100%',
55
+ info: '198.6 88.7% 60%',
56
+ infoForeground: '0 0% 100%',
57
+ border: '217.2 32.6% 17.5%',
58
+ input: '217.2 32.6% 17.5%',
59
+ ring: '224.3 76.3% 48%',
60
+ },
61
+ };
62
+
63
+ export const motion: MotionRegistry = {
64
+ none: {
65
+ from: {},
66
+ to: {},
67
+ transition: { duration: 0, easing: 'linear', properties: ['opacity', 'transform', 'box-shadow'] },
68
+ reducedMotion: 'always',
69
+ },
70
+ fade: {
71
+ from: { opacity: 0 },
72
+ to: { opacity: 1 },
73
+ transition: { duration: 160, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity'] },
74
+ reducedMotion: 'respect-user',
75
+ },
76
+ fadeUp: {
77
+ from: { opacity: 0, transform: 'translateY(8px)' },
78
+ to: { opacity: 1, transform: 'translateY(0)' },
79
+ transition: { duration: 160, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity', 'transform'] },
80
+ reducedMotion: 'respect-user',
81
+ },
82
+ fadeDown: {
83
+ from: { opacity: 0, transform: 'translateY(-8px)' },
84
+ to: { opacity: 1, transform: 'translateY(0)' },
85
+ transition: { duration: 140, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity', 'transform', 'visibility'] },
86
+ reducedMotion: 'respect-user',
87
+ },
88
+ slideFromRight: {
89
+ from: { opacity: 0, transform: 'translateX(100%)' },
90
+ to: { opacity: 1, transform: 'translateX(0)' },
91
+ transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },
92
+ reducedMotion: 'respect-user',
93
+ },
94
+ slideFromLeft: {
95
+ from: { opacity: 0, transform: 'translateX(-100%)' },
96
+ to: { opacity: 1, transform: 'translateX(0)' },
97
+ transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },
98
+ reducedMotion: 'respect-user',
99
+ },
100
+ slideFromTop: {
101
+ from: { opacity: 0, transform: 'translateY(-100%)' },
102
+ to: { opacity: 1, transform: 'translateY(0)' },
103
+ transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },
104
+ reducedMotion: 'respect-user',
105
+ },
106
+ slideFromBottom: {
107
+ from: { opacity: 0, transform: 'translateY(100%)' },
108
+ to: { opacity: 1, transform: 'translateY(0)' },
109
+ transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },
110
+ reducedMotion: 'respect-user',
111
+ },
112
+ press: {
113
+ from: {},
114
+ to: { transform: 'scale(0.98)' },
115
+ transition: { duration: 100, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['transform', 'box-shadow'] },
116
+ reducedMotion: 'respect-user',
117
+ },
118
+ imageZoom: {
119
+ from: { transform: 'scale(1)' },
120
+ to: { transform: 'scale(1.06)' },
121
+ transition: { duration: 300, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['transform'] },
122
+ reducedMotion: 'respect-user',
123
+ },
124
+ };
125
+
126
+ export const components: Theme = {
127
+ Grid: {
128
+ // REVERT NOTE (2026-07-15): before this change, `Card.className` was 'border-0' only
129
+ // (outer border removed, but bg-card/rounded/shadow kept — header+footer still sat in
130
+ // a white rounded box), `Table.wrapperClassName`/`Gallery.wrapperClassName` were both
131
+ // ''. The change moves the "raised card" surface (border+bg+shadow+radius) from the
132
+ // Card wrapper (which held header+body+footer together) down into Table/Gallery's own
133
+ // wrapper — so the toolbar row (view toggle, column picker, New component…) sits
134
+ // directly on the page's floor background with no box of its own, and only the actual
135
+ // data surface reads as a raised panel. To revert: restore the four blocks below to
136
+ // the values in this note.
137
+ Card: {
138
+ wrapperClassName: '',
139
+ // Fully transparent/borderless/shapeless now — header and footer (when used) are
140
+ // meant to float on the page's own background, not sit inside a card of their own;
141
+ // the "raised surface" look lives in Table/Gallery's wrapperClassName instead.
142
+ className: 'rounded-none border-0 bg-transparent shadow-none',
143
+ headerClassName: 'flex justify-between border-b-0 bg-transparent px-0 py-2',
144
+ bodyClassName: 'p-0 mt-2',
145
+ footerClassName: 'border-t-0 bg-transparent px-0 py-2',
146
+ loading: false,
147
+ },
148
+ Table: {
149
+ // The table's own raised surface — previously this border+bg lived on the
150
+ // shared Card wrapper (see revert note above).
151
+ wrapperClassName: 'rounded-lg border border-border bg-card shadow-sm',
152
+ className: '',
153
+ headerClassName: '',
154
+ bodyClassName: '',
155
+ footerClassName: '',
156
+ scrollClassName: 'overflow-x-auto',
157
+ selectedClassName: 'bg-primary/10',
158
+ },
159
+ Gallery: {
160
+ // Same rationale as Table above; `p-3` so cards don't sit flush against the border.
161
+ wrapperClassName: 'rounded-lg border border-border bg-card shadow-sm p-3',
162
+ className: '',
163
+ scrollClassName: '',
164
+ headerClassName: '',
165
+ bodyClassName: '',
166
+ footerClassName: '',
167
+ selectedClassName: 'bg-primary/20',
168
+ gap: 1,
169
+ rowCols: 4,
170
+ },
171
+ Modal: {
172
+ mode: 'form',
173
+ size: 'lg',
174
+ position: 'center',
175
+ wrapperClassName: '',
176
+ className: '',
177
+ headerClassName: '',
178
+ titleClassName: '',
179
+ subtitleClassName: 'pr-1 text-muted-foreground',
180
+ bodyClassName: '',
181
+ footerClassName: '',
182
+ iconExpand: 'fullscreen',
183
+ iconCollapse: 'fullscreen-exit',
184
+ motion: {
185
+ center: 'fade',
186
+ top: 'slideFromTop',
187
+ left: 'slideFromLeft',
188
+ right: 'slideFromRight',
189
+ bottom: 'slideFromBottom',
190
+ backdrop: 'fade',
191
+ },
192
+ },
193
+ },
194
+ Table: {
195
+ wrapperClassName: '',
196
+ className: '',
197
+ headerClassName: '',
198
+ bodyClassName: '',
199
+ footerClassName: '',
200
+ scrollClassName: 'overflow-x-auto',
201
+ selectedClassName: 'bg-primary/10',
202
+ },
203
+ Gallery: {
204
+ wrapperClassName: '',
205
+ className: '',
206
+ scrollClassName: '',
207
+ headerClassName: '',
208
+ bodyClassName: '',
209
+ footerClassName: '',
210
+ selectedClassName: 'bg-primary/20',
211
+ gap: 4,
212
+ rowCols: 2,
213
+ },
214
+ Pagination: {
215
+ wrapperClassName: '',
216
+ className: '',
217
+ stickyClassName: 'fixed bottom-0 left-0 right-0 mx-5',
218
+ scrollToTop: false,
219
+ scrollBehavior: 'auto',
220
+ maxItems: 5,
221
+ sticky: true,
222
+ align: 'end',
223
+ },
224
+ Carousel: {
225
+ showIndicators: true,
226
+ showControls: true,
227
+ showCaption: true,
228
+ dark: false,
229
+ autoPlay: true,
230
+ },
231
+ Card: {
232
+ wrapperClassName: '',
233
+ className: '',
234
+ headerClassName: 'flex justify-between bg-white/[.15] font-normal',
235
+ bodyClassName: 'flex flex-col',
236
+ footerClassName: '',
237
+ loading: false,
238
+ },
239
+ Loader: {
240
+ wrapperClassName: '',
241
+ className: '',
242
+ icon: 'loader-2',
243
+ title: 'Loading..',
244
+ description: '',
245
+ },
246
+ ActionButton: {
247
+ className: 'btn-primary',
248
+ badgeClassName: 'rounded-full bg-destructive text-destructive-foreground',
249
+ motion: {
250
+ press: 'press',
251
+ },
252
+ },
253
+ LoadingButton: {
254
+ className: 'btn-primary',
255
+ badgeClassName: 'rounded-full bg-destructive text-destructive-foreground',
256
+ motion: {
257
+ press: 'press',
258
+ },
259
+ },
260
+ LinkButton: {
261
+ className: 'btn-outline-secondary',
262
+ },
263
+ Alert: {
264
+ className: '',
265
+ },
266
+ Badge: {
267
+ className: '',
268
+ },
269
+ Modal: {
270
+ size: 'lg',
271
+ position: 'center',
272
+ wrapperClassName: '',
273
+ className: '',
274
+ headerClassName: '',
275
+ titleClassName: '',
276
+ subtitleClassName: 'pr-1 text-muted-foreground',
277
+ bodyClassName: '',
278
+ footerClassName: '',
279
+ iconExpand: 'fullscreen',
280
+ iconCollapse: 'fullscreen-exit',
281
+ motion: {
282
+ center: 'fade',
283
+ top: 'slideFromTop',
284
+ left: 'slideFromLeft',
285
+ right: 'slideFromRight',
286
+ bottom: 'slideFromBottom',
287
+ backdrop: 'fade',
288
+ },
289
+ },
290
+ Dropdown: {
291
+ wrapperClassName: '',
292
+ className: '',
293
+ triggerClassName: 'btn btn-outline-primary',
294
+ badgeClassName: '',
295
+ menuClassName: 'border-border/60 bg-popover/95 shadow-xl shadow-black/5 backdrop-blur supports-[backdrop-filter]:bg-popover/90 dark:shadow-black/20',
296
+ menuHeaderClass: 'text-muted-foreground/70',
297
+ menuItemClass: '',
298
+ menuDividerClass: 'bg-border/60',
299
+ headerClassName: '',
300
+ footerClassName: '',
301
+ Menu: {
302
+ wrapperClassName: '',
303
+ className: 'list-none p-0 m-0',
304
+ headerClassName: '',
305
+ itemClassName: '',
306
+ linkClassName: 'flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm hover:bg-accent',
307
+ iconClassName: 'text-muted-foreground',
308
+ textClassName: '',
309
+ badgeClassName: '',
310
+ arrowClassName: '',
311
+ submenuClassName: '',
312
+ },
313
+ motion: {
314
+ open: 'fadeDown',
315
+ close: 'fadeDown',
316
+ press: 'press',
317
+ },
318
+ },
319
+ Notifications: {
320
+ wrapperClassName: '',
321
+ Dropdown: {
322
+ className: '',
323
+ triggerClassName: 'btn btn-link',
324
+ menuClassName: 'mt-1 text-[11px] w-[300px] pt-1',
325
+ },
326
+ },
327
+ Select: {
328
+ wrapperClassName: '',
329
+ className: '',
330
+ },
331
+ Autocomplete: {
332
+ wrapperClassName: '',
333
+ className: '',
334
+ },
335
+ AddressAutocomplete: {
336
+ wrapperClassName: '',
337
+ className: '',
338
+ menuClassName: 'border-border/60 bg-popover/95 shadow-xl shadow-black/5 backdrop-blur supports-[backdrop-filter]:bg-popover/90 dark:shadow-black/20',
339
+ itemClassName: '',
340
+ },
341
+ Form: {
342
+ wrapperClassName: '',
343
+ buttonSaveClass: 'btn-outline-primary',
344
+ buttonDeleteClass: 'btn-outline-danger',
345
+ buttonBackClass: 'btn-link',
346
+ Card: {
347
+ headerClassName: '',
348
+ bodyClassName: '',
349
+ footerClassName: 'flex items-center justify-end gap-3',
350
+ },
351
+ },
352
+ Menu: {
353
+ wrapperClassName: 'flex-1 overflow-auto p-4',
354
+ className: 'flex flex-col mb-auto',
355
+ headerClassName: '',
356
+ itemClassName: '',
357
+ linkClassName: 'flex items-center gap-2 rounded-md px-3 py-2 text-sm font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground',
358
+ iconClassName: 'mr-1 shrink-0',
359
+ textClassName: 'flex-1',
360
+ badgeClassName: 'ml-1',
361
+ arrowClassName: '',
362
+ submenuClassName: 'mt-1 flex flex-col gap-1 pl-4',
363
+ },
364
+ SideNav: {
365
+ wrapperClassName: '',
366
+ shellClassName: 'border-r border-border bg-card/80 text-foreground backdrop-blur supports-[backdrop-filter]:bg-card/70',
367
+ overlayClassName: 'shadow-xl',
368
+ headerClassName: 'border-b border-border/60 px-1.5 py-2',
369
+ navClassName: 'px-1.5 py-2',
370
+ footerClassName: 'border-t border-border/60 px-1.5 py-2',
371
+ groupLabelClassName: 'text-[10.5px] font-semibold uppercase tracking-widest text-muted-foreground/60 select-none',
372
+ groupDividerClassName: 'bg-border/50',
373
+ itemClassName: 'rounded-lg',
374
+ itemActiveClassName: 'bg-primary/10 text-primary font-medium shadow-sm',
375
+ itemChildActiveClassName: 'bg-accent/80 text-foreground font-medium',
376
+ itemInactiveClassName: 'text-muted-foreground hover:text-foreground hover:bg-accent/70',
377
+ itemIconClassName: '',
378
+ itemTextClassName: '',
379
+ itemBadgeClassName: 'ml-auto shrink-0 text-[10px] font-semibold leading-none px-1.5 py-[3px] rounded-full bg-primary/15 text-primary',
380
+ itemCollapsedBadgeClassName: 'absolute -top-0.5 -right-1 h-[7px] w-[7px] rounded-full bg-primary ring-1 ring-card',
381
+ itemToggleClassName: 'shrink-0 flex items-center justify-center w-6 h-6 rounded-md transition-colors text-muted-foreground/50 hover:text-foreground hover:bg-accent/70',
382
+ subItemClassName: 'rounded-md',
383
+ subItemActiveClassName: 'bg-primary/10 text-primary font-medium',
384
+ subItemInactiveClassName: 'text-muted-foreground hover:text-foreground hover:bg-accent/70',
385
+ collapseButtonClassName: 'shrink-0 flex items-center justify-center rounded-md w-8 h-8 transition-colors text-muted-foreground hover:text-foreground hover:bg-accent/70',
386
+ },
387
+ Toolbar: {
388
+ wrapperClassName: 'z-20 w-full',
389
+ stickyClassName: 'sticky top-0',
390
+ restingClassName: 'bg-transparent border-transparent shadow-none',
391
+ scrolledClassName: 'border-b border-border/60 bg-background/85 backdrop-blur supports-[backdrop-filter]:bg-background/75',
392
+ innerClassName: 'flex min-h-14 items-center gap-3 px-4 md:px-6',
393
+ leadingClassName: 'flex min-w-0 items-center gap-2 shrink-0',
394
+ centerClassName: 'flex min-w-0 flex-1 items-center gap-3',
395
+ trailingClassName: 'flex items-center gap-2 shrink-0',
396
+ },
397
+ ListCard: {
398
+ wrapperClassName: '',
399
+ className: 'shadow-sm',
400
+ activeClassName: 'border-primary/30 bg-primary/10 shadow-sm',
401
+ inactiveClassName: 'hover:bg-accent/40',
402
+ disabledClassName: 'cursor-not-allowed opacity-60',
403
+ dashedClassName: 'border-dashed',
404
+ compactClassName: 'p-3',
405
+ leadingClassName: '',
406
+ bodyClassName: '',
407
+ headerClassName: '',
408
+ titleClassName: '',
409
+ descriptionClassName: '',
410
+ metaClassName: '',
411
+ badgeClassName: '',
412
+ trailingClassName: '',
413
+ footerClassName: '',
414
+ motion: {
415
+ press: 'press',
416
+ },
417
+ },
418
+ ProviderSwitcher: {
419
+ wrapperClassName: 'w-full',
420
+ className: 'w-full',
421
+ triggerClassName: 'flex w-full items-center gap-2 rounded-xl px-1.5 py-1.5 text-left text-sm font-semibold text-foreground transition-colors hover:bg-accent/40',
422
+ disabledClassName: 'pointer-events-none opacity-60',
423
+ iconWrapperClassName: 'flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary/10 text-primary',
424
+ labelClassName: 'block truncate',
425
+ captionClassName: 'block truncate text-[11px] font-normal text-muted-foreground/80',
426
+ chevronClassName: 'ml-auto shrink-0 text-muted-foreground/70',
427
+ itemClassName: '',
428
+ itemActiveClassName: '',
429
+ itemInactiveClassName: '',
430
+ itemMetaClassName: 'text-xs text-muted-foreground',
431
+ checkClassName: 'text-primary',
432
+ },
433
+ Brand: {
434
+ wrapperClassName: '',
435
+ className: 'flex items-center',
436
+ logoClassName: 'flex items-center gap-2 font-semibold',
437
+ labelClassName: 'text-sm font-medium',
438
+ },
439
+ SignIn: {
440
+ className: 'flex items-center',
441
+ avatarClass: 'mx-2 rounded-full object-cover',
442
+ },
443
+ Image: {
444
+ wrapperClassName: '',
445
+ className: '',
446
+ motion: {
447
+ enter: 'fade',
448
+ hover: false,
449
+ },
450
+ },
451
+ ImageAvatar: {
452
+ wrapperClassName: '',
453
+ className: '',
454
+ motion: { enter: 'fade', hover: false },
455
+ },
456
+ Percentage: {
457
+ wrapperClassName: '',
458
+ className: '',
459
+ },
460
+ DescriptionList: {
461
+ wrapperClassName: '',
462
+ className: '',
463
+ itemClassName: '',
464
+ labelClassName: '',
465
+ valueClassName: '',
466
+ },
467
+ Tab: {
468
+ wrapperClassName: '',
469
+ className: '',
470
+ menuClassName: '',
471
+ itemClassName: '',
472
+ contentClassName: '',
473
+ triggerClassName: '',
474
+ activeTriggerClassName: '',
475
+ inactiveTriggerClassName: '',
476
+ motion: {
477
+ enter: 'fadeUp',
478
+ },
479
+ },
480
+ Code: {
481
+ wrapperClassName: '',
482
+ className: '',
483
+ },
484
+ CodeEditor: {
485
+ wrapperClassName: '',
486
+ className: '',
487
+ },
488
+ Prompt: {
489
+ wrapperClassName: '',
490
+ className: '',
491
+ },
492
+ Repeat: {
493
+ itemClassName: '',
494
+ inlineItemClassName: '',
495
+ addButtonClassName: '',
496
+ },
497
+ };
498
+
499
+ const definition: ThemeDefinition = { preset, motion, components };
500
+
501
+ export default definition;
502
+