@quinkit/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/index.d.cts +1445 -0
  2. package/dist/index.d.ts +1445 -0
  3. package/dist/index.js +2567 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.mjs +2366 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/package.json +97 -0
  8. package/src/styles/globals.css +150 -0
  9. package/src/styles/theme-switcher.tsx +95 -0
  10. package/src/styles/themes/.gitkeep +0 -0
  11. package/src/styles/themes/dashboard-data.css +64 -0
  12. package/src/styles/themes/dashboard-executive.css +64 -0
  13. package/src/styles/themes/dashboard-glass.css +64 -0
  14. package/src/styles/themes/dashboard.css +46 -0
  15. package/src/styles/themes/ecommerce-luxury.css +64 -0
  16. package/src/styles/themes/ecommerce-minimal.css +64 -0
  17. package/src/styles/themes/ecommerce-playful.css +64 -0
  18. package/src/styles/themes/ecommerce.css +36 -0
  19. package/src/styles/themes/edtech-campus.css +64 -0
  20. package/src/styles/themes/edtech-kids.css +64 -0
  21. package/src/styles/themes/edtech-professional.css +64 -0
  22. package/src/styles/themes/edtech.css +36 -0
  23. package/src/styles/themes/fintech-crypto.css +64 -0
  24. package/src/styles/themes/fintech-modern.css +64 -0
  25. package/src/styles/themes/fintech-wealth.css +64 -0
  26. package/src/styles/themes/fintech.css +46 -0
  27. package/src/styles/themes/healthcare-clinical.css +64 -0
  28. package/src/styles/themes/healthcare-urgent.css +64 -0
  29. package/src/styles/themes/healthcare-wellness.css +64 -0
  30. package/src/styles/themes/healthcare.css +46 -0
  31. package/src/styles/tokens/.gitkeep +0 -0
  32. package/src/styles/tokens/charts.css +26 -0
  33. package/src/styles/tokens/dark.css +36 -0
  34. package/src/styles/tokens/palettes.css +2663 -0
  35. package/src/styles/tokens/primitives.css +34 -0
  36. package/src/styles/tokens/semantic.css +35 -0
  37. package/src/styles/tokens/typography.css +82 -0
package/dist/index.js ADDED
@@ -0,0 +1,2567 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var AvatarPrimitive = require('@radix-ui/react-avatar');
5
+ var clsx = require('clsx');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+ var CheckboxPrimitive = require('@radix-ui/react-checkbox');
9
+ var LabelPrimitive = require('@radix-ui/react-label');
10
+ var RadioGroupPrimitive = require('@radix-ui/react-radio-group');
11
+ var SelectPrimitive = require('@radix-ui/react-select');
12
+ var SeparatorPrimitive = require('@radix-ui/react-separator');
13
+ var SwitchPrimitive = require('@radix-ui/react-switch');
14
+ var AspectRatioPrimitive = require('@radix-ui/react-aspect-ratio');
15
+ var reactDayPicker = require('react-day-picker');
16
+ var reactTable = require('@tanstack/react-table');
17
+ var dateFns = require('date-fns');
18
+ var PopoverPrimitive = require('@radix-ui/react-popover');
19
+ var ProgressPrimitive = require('@radix-ui/react-progress');
20
+ var ScrollAreaPrimitive = require('@radix-ui/react-scroll-area');
21
+ var AccordionPrimitive = require('@radix-ui/react-accordion');
22
+ var AlertDialogPrimitive = require('@radix-ui/react-alert-dialog');
23
+ var cmdk = require('cmdk');
24
+ var DialogPrimitive = require('@radix-ui/react-dialog');
25
+ var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
26
+ var NavigationMenuPrimitive = require('@radix-ui/react-navigation-menu');
27
+ var TabsPrimitive = require('@radix-ui/react-tabs');
28
+ var TooltipPrimitive = require('@radix-ui/react-tooltip');
29
+ var sonner = require('sonner');
30
+ var reactHookForm = require('react-hook-form');
31
+
32
+ function _interopNamespace(e) {
33
+ if (e && e.__esModule) return e;
34
+ var n = Object.create(null);
35
+ if (e) {
36
+ Object.keys(e).forEach(function (k) {
37
+ if (k !== 'default') {
38
+ var d = Object.getOwnPropertyDescriptor(e, k);
39
+ Object.defineProperty(n, k, d.get ? d : {
40
+ enumerable: true,
41
+ get: function () { return e[k]; }
42
+ });
43
+ }
44
+ });
45
+ }
46
+ n.default = e;
47
+ return Object.freeze(n);
48
+ }
49
+
50
+ var AvatarPrimitive__namespace = /*#__PURE__*/_interopNamespace(AvatarPrimitive);
51
+ var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespace(CheckboxPrimitive);
52
+ var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
53
+ var RadioGroupPrimitive__namespace = /*#__PURE__*/_interopNamespace(RadioGroupPrimitive);
54
+ var SelectPrimitive__namespace = /*#__PURE__*/_interopNamespace(SelectPrimitive);
55
+ var SeparatorPrimitive__namespace = /*#__PURE__*/_interopNamespace(SeparatorPrimitive);
56
+ var SwitchPrimitive__namespace = /*#__PURE__*/_interopNamespace(SwitchPrimitive);
57
+ var AspectRatioPrimitive__namespace = /*#__PURE__*/_interopNamespace(AspectRatioPrimitive);
58
+ var PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespace(PopoverPrimitive);
59
+ var ProgressPrimitive__namespace = /*#__PURE__*/_interopNamespace(ProgressPrimitive);
60
+ var ScrollAreaPrimitive__namespace = /*#__PURE__*/_interopNamespace(ScrollAreaPrimitive);
61
+ var AccordionPrimitive__namespace = /*#__PURE__*/_interopNamespace(AccordionPrimitive);
62
+ var AlertDialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(AlertDialogPrimitive);
63
+ var DialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(DialogPrimitive);
64
+ var DropdownMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(DropdownMenuPrimitive);
65
+ var NavigationMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(NavigationMenuPrimitive);
66
+ var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
67
+ var TooltipPrimitive__namespace = /*#__PURE__*/_interopNamespace(TooltipPrimitive);
68
+
69
+ // src/hooks/useDebounce.ts
70
+ function useDebounce(value, delayMs = 300) {
71
+ const [debouncedValue, setDebouncedValue] = react.useState(value);
72
+ react.useEffect(() => {
73
+ const timeout = window.setTimeout(() => setDebouncedValue(value), delayMs);
74
+ return () => window.clearTimeout(timeout);
75
+ }, [value, delayMs]);
76
+ return debouncedValue;
77
+ }
78
+ function useMediaQuery(query, initialValue = false) {
79
+ const [matches, setMatches] = react.useState(initialValue);
80
+ react.useEffect(() => {
81
+ const mediaQuery = window.matchMedia(query);
82
+ const updateMatches = () => setMatches(mediaQuery.matches);
83
+ updateMatches();
84
+ mediaQuery.addEventListener("change", updateMatches);
85
+ return () => mediaQuery.removeEventListener("change", updateMatches);
86
+ }, [query]);
87
+ return matches;
88
+ }
89
+
90
+ // src/lib/palettes.ts
91
+ var uiPalettes = [
92
+ {
93
+ name: "Neutral Slate",
94
+ value: "neutral-slate",
95
+ category: "Neutral",
96
+ description: "Neutral Slate palette for neutral interfaces.",
97
+ inspiredBy: ["Neutral Slate"],
98
+ bestFor: ["Neutral UI", "dashboards", "product screens"]
99
+ },
100
+ {
101
+ name: "Executive Slate",
102
+ value: "executive-slate",
103
+ category: "Neutral",
104
+ description: "Executive Slate palette for neutral interfaces.",
105
+ inspiredBy: ["Executive Slate"],
106
+ bestFor: ["Neutral UI", "dashboards", "product screens"]
107
+ },
108
+ {
109
+ name: "Vercel Mono",
110
+ value: "vercel-mono",
111
+ category: "Neutral",
112
+ description: "Vercel Mono palette for neutral interfaces.",
113
+ inspiredBy: ["Vercel Mono"],
114
+ bestFor: ["Neutral UI", "dashboards", "product screens"]
115
+ },
116
+ {
117
+ name: "Warm Sand",
118
+ value: "warm-sand",
119
+ category: "Neutral",
120
+ description: "Warm Sand palette for neutral interfaces.",
121
+ inspiredBy: ["Warm Sand"],
122
+ bestFor: ["Neutral UI", "dashboards", "product screens"]
123
+ },
124
+ {
125
+ name: "Zinc Cool",
126
+ value: "zinc-cool",
127
+ category: "Neutral",
128
+ description: "Zinc Cool palette for neutral interfaces.",
129
+ inspiredBy: ["Zinc Cool"],
130
+ bestFor: ["Neutral UI", "dashboards", "product screens"]
131
+ },
132
+ {
133
+ name: "Stone Warm",
134
+ value: "stone-warm",
135
+ category: "Neutral",
136
+ description: "Stone Warm palette for neutral interfaces.",
137
+ inspiredBy: ["Stone Warm"],
138
+ bestFor: ["Neutral UI", "dashboards", "product screens"]
139
+ },
140
+ {
141
+ name: "Ink Black",
142
+ value: "ink-black",
143
+ category: "Neutral",
144
+ description: "Ink Black palette for neutral interfaces.",
145
+ inspiredBy: ["Ink Black"],
146
+ bestFor: ["Neutral UI", "dashboards", "product screens"]
147
+ },
148
+ {
149
+ name: "Parchment",
150
+ value: "parchment",
151
+ category: "Neutral",
152
+ description: "Parchment palette for neutral interfaces.",
153
+ inspiredBy: ["Parchment"],
154
+ bestFor: ["Neutral UI", "dashboards", "product screens"]
155
+ },
156
+ {
157
+ name: "Default Blue",
158
+ value: "default-blue",
159
+ category: "SaaS",
160
+ description: "Default Blue palette for saas interfaces.",
161
+ inspiredBy: ["Default Blue"],
162
+ bestFor: ["SaaS UI", "dashboards", "product screens"]
163
+ },
164
+ {
165
+ name: "Linear Minimal",
166
+ value: "linear-minimal",
167
+ category: "SaaS",
168
+ description: "Linear Minimal palette for saas interfaces.",
169
+ inspiredBy: ["Linear Minimal"],
170
+ bestFor: ["SaaS UI", "dashboards", "product screens"]
171
+ },
172
+ {
173
+ name: "Github Neutral",
174
+ value: "github-neutral",
175
+ category: "SaaS",
176
+ description: "Github Neutral palette for saas interfaces.",
177
+ inspiredBy: ["Github Neutral"],
178
+ bestFor: ["SaaS UI", "dashboards", "product screens"]
179
+ },
180
+ {
181
+ name: "Atlassian Blue",
182
+ value: "atlassian-blue",
183
+ category: "SaaS",
184
+ description: "Atlassian Blue palette for saas interfaces.",
185
+ inspiredBy: ["Atlassian Blue"],
186
+ bestFor: ["SaaS UI", "dashboards", "product screens"]
187
+ },
188
+ {
189
+ name: "Analytics Cyan",
190
+ value: "analytics-cyan",
191
+ category: "SaaS",
192
+ description: "Analytics Cyan palette for saas interfaces.",
193
+ inspiredBy: ["Analytics Cyan"],
194
+ bestFor: ["SaaS UI", "dashboards", "product screens"]
195
+ },
196
+ {
197
+ name: "Notion Blue",
198
+ value: "notion-blue",
199
+ category: "SaaS",
200
+ description: "Notion Blue palette for saas interfaces.",
201
+ inspiredBy: ["Notion Blue"],
202
+ bestFor: ["SaaS UI", "dashboards", "product screens"]
203
+ },
204
+ {
205
+ name: "Intercom Blue",
206
+ value: "intercom-blue",
207
+ category: "SaaS",
208
+ description: "Intercom Blue palette for saas interfaces.",
209
+ inspiredBy: ["Intercom Blue"],
210
+ bestFor: ["SaaS UI", "dashboards", "product screens"]
211
+ },
212
+ {
213
+ name: "Salesforce Sky",
214
+ value: "salesforce-sky",
215
+ category: "SaaS",
216
+ description: "Salesforce Sky palette for saas interfaces.",
217
+ inspiredBy: ["Salesforce Sky"],
218
+ bestFor: ["SaaS UI", "dashboards", "product screens"]
219
+ },
220
+ {
221
+ name: "Medical Teal",
222
+ value: "medical-teal",
223
+ category: "Healthcare",
224
+ description: "Medical Teal palette for healthcare interfaces.",
225
+ inspiredBy: ["Medical Teal"],
226
+ bestFor: ["Healthcare UI", "dashboards", "product screens"]
227
+ },
228
+ {
229
+ name: "Clinical Blue",
230
+ value: "clinical-blue",
231
+ category: "Healthcare",
232
+ description: "Clinical Blue palette for healthcare interfaces.",
233
+ inspiredBy: ["Clinical Blue"],
234
+ bestFor: ["Healthcare UI", "dashboards", "product screens"]
235
+ },
236
+ {
237
+ name: "Calm Cyan",
238
+ value: "calm-cyan",
239
+ category: "Healthcare",
240
+ description: "Calm Cyan palette for healthcare interfaces.",
241
+ inspiredBy: ["Calm Cyan"],
242
+ bestFor: ["Healthcare UI", "dashboards", "product screens"]
243
+ },
244
+ {
245
+ name: "Teladoc Teal",
246
+ value: "teladoc-teal",
247
+ category: "Healthcare",
248
+ description: "Teladoc Teal palette for healthcare interfaces.",
249
+ inspiredBy: ["Teladoc Teal"],
250
+ bestFor: ["Healthcare UI", "dashboards", "product screens"]
251
+ },
252
+ {
253
+ name: "Noom Green",
254
+ value: "noom-green",
255
+ category: "Healthcare",
256
+ description: "Noom Green palette for healthcare interfaces.",
257
+ inspiredBy: ["Noom Green"],
258
+ bestFor: ["Healthcare UI", "dashboards", "product screens"]
259
+ },
260
+ {
261
+ name: "Headspace Orange",
262
+ value: "headspace-orange",
263
+ category: "Healthcare",
264
+ description: "Headspace Orange palette for healthcare interfaces.",
265
+ inspiredBy: ["Headspace Orange"],
266
+ bestFor: ["Healthcare UI", "dashboards", "product screens"]
267
+ },
268
+ {
269
+ name: "Epic Blue",
270
+ value: "epic-blue",
271
+ category: "Healthcare",
272
+ description: "Epic Blue palette for healthcare interfaces.",
273
+ inspiredBy: ["Epic Blue"],
274
+ bestFor: ["Healthcare UI", "dashboards", "product screens"]
275
+ },
276
+ {
277
+ name: "Fintech Navy",
278
+ value: "fintech-navy",
279
+ category: "Fintech",
280
+ description: "Fintech Navy palette for fintech interfaces.",
281
+ inspiredBy: ["Fintech Navy"],
282
+ bestFor: ["Fintech UI", "dashboards", "product screens"]
283
+ },
284
+ {
285
+ name: "Finance Gold",
286
+ value: "finance-gold",
287
+ category: "Fintech",
288
+ description: "Finance Gold palette for fintech interfaces.",
289
+ inspiredBy: ["Finance Gold"],
290
+ bestFor: ["Fintech UI", "dashboards", "product screens"]
291
+ },
292
+ {
293
+ name: "Emerald Wealth",
294
+ value: "emerald-wealth",
295
+ category: "Fintech",
296
+ description: "Emerald Wealth palette for fintech interfaces.",
297
+ inspiredBy: ["Emerald Wealth"],
298
+ bestFor: ["Fintech UI", "dashboards", "product screens"]
299
+ },
300
+ {
301
+ name: "Risk Amber",
302
+ value: "risk-amber",
303
+ category: "Fintech",
304
+ description: "Risk Amber palette for fintech interfaces.",
305
+ inspiredBy: ["Risk Amber"],
306
+ bestFor: ["Fintech UI", "dashboards", "product screens"]
307
+ },
308
+ {
309
+ name: "Stripe Indigo",
310
+ value: "stripe-indigo",
311
+ category: "Fintech",
312
+ description: "Stripe Indigo palette for fintech interfaces.",
313
+ inspiredBy: ["Stripe Indigo"],
314
+ bestFor: ["Fintech UI", "dashboards", "product screens"]
315
+ },
316
+ {
317
+ name: "Coinbase Blue",
318
+ value: "coinbase-blue",
319
+ category: "Fintech",
320
+ description: "Coinbase Blue palette for fintech interfaces.",
321
+ inspiredBy: ["Coinbase Blue"],
322
+ bestFor: ["Fintech UI", "dashboards", "product screens"]
323
+ },
324
+ {
325
+ name: "Robinhood Green",
326
+ value: "robinhood-green",
327
+ category: "Fintech",
328
+ description: "Robinhood Green palette for fintech interfaces.",
329
+ inspiredBy: ["Robinhood Green"],
330
+ bestFor: ["Fintech UI", "dashboards", "product screens"]
331
+ },
332
+ {
333
+ name: "Plaid Navy",
334
+ value: "plaid-navy",
335
+ category: "Fintech",
336
+ description: "Plaid Navy palette for fintech interfaces.",
337
+ inspiredBy: ["Plaid Navy"],
338
+ bestFor: ["Fintech UI", "dashboards", "product screens"]
339
+ },
340
+ {
341
+ name: "E-commerce Rose",
342
+ value: "ecommerce-rose",
343
+ category: "E-commerce",
344
+ description: "E-commerce Rose palette for e-commerce interfaces.",
345
+ inspiredBy: ["E-commerce Rose"],
346
+ bestFor: ["E-commerce UI", "dashboards", "product screens"]
347
+ },
348
+ {
349
+ name: "Luxury Black Gold",
350
+ value: "luxury-black-gold",
351
+ category: "E-commerce",
352
+ description: "Luxury Black Gold palette for e-commerce interfaces.",
353
+ inspiredBy: ["Luxury Black Gold"],
354
+ bestFor: ["E-commerce UI", "dashboards", "product screens"]
355
+ },
356
+ {
357
+ name: "Commerce Green",
358
+ value: "commerce-green",
359
+ category: "E-commerce",
360
+ description: "Commerce Green palette for e-commerce interfaces.",
361
+ inspiredBy: ["Commerce Green"],
362
+ bestFor: ["E-commerce UI", "dashboards", "product screens"]
363
+ },
364
+ {
365
+ name: "Lifestyle Coral",
366
+ value: "lifestyle-coral",
367
+ category: "E-commerce",
368
+ description: "Lifestyle Coral palette for e-commerce interfaces.",
369
+ inspiredBy: ["Lifestyle Coral"],
370
+ bestFor: ["E-commerce UI", "dashboards", "product screens"]
371
+ },
372
+ {
373
+ name: "Shopify Green",
374
+ value: "shopify-green",
375
+ category: "E-commerce",
376
+ description: "Shopify Green palette for e-commerce interfaces.",
377
+ inspiredBy: ["Shopify Green"],
378
+ bestFor: ["E-commerce UI", "dashboards", "product screens"]
379
+ },
380
+ {
381
+ name: "Amazon Orange",
382
+ value: "amazon-orange",
383
+ category: "E-commerce",
384
+ description: "Amazon Orange palette for e-commerce interfaces.",
385
+ inspiredBy: ["Amazon Orange"],
386
+ bestFor: ["E-commerce UI", "dashboards", "product screens"]
387
+ },
388
+ {
389
+ name: "Etsy Orange",
390
+ value: "etsy-orange",
391
+ category: "E-commerce",
392
+ description: "Etsy Orange palette for e-commerce interfaces.",
393
+ inspiredBy: ["Etsy Orange"],
394
+ bestFor: ["E-commerce UI", "dashboards", "product screens"]
395
+ },
396
+ {
397
+ name: "Netflix Red",
398
+ value: "netflix-red",
399
+ category: "E-commerce",
400
+ description: "Netflix Red palette for e-commerce interfaces.",
401
+ inspiredBy: ["Netflix Red"],
402
+ bestFor: ["E-commerce UI", "dashboards", "product screens"]
403
+ },
404
+ {
405
+ name: "Edtech Playful",
406
+ value: "edtech-playful",
407
+ category: "EdTech",
408
+ description: "Edtech Playful palette for edtech interfaces.",
409
+ inspiredBy: ["Edtech Playful"],
410
+ bestFor: ["EdTech UI", "dashboards", "product screens"]
411
+ },
412
+ {
413
+ name: "Learning Purple",
414
+ value: "learning-purple",
415
+ category: "EdTech",
416
+ description: "Learning Purple palette for edtech interfaces.",
417
+ inspiredBy: ["Learning Purple"],
418
+ bestFor: ["EdTech UI", "dashboards", "product screens"]
419
+ },
420
+ {
421
+ name: "Gamified Green",
422
+ value: "gamified-green",
423
+ category: "EdTech",
424
+ description: "Gamified Green palette for edtech interfaces.",
425
+ inspiredBy: ["Gamified Green"],
426
+ bestFor: ["EdTech UI", "dashboards", "product screens"]
427
+ },
428
+ {
429
+ name: "Achievement Amber",
430
+ value: "achievement-amber",
431
+ category: "EdTech",
432
+ description: "Achievement Amber palette for edtech interfaces.",
433
+ inspiredBy: ["Achievement Amber"],
434
+ bestFor: ["EdTech UI", "dashboards", "product screens"]
435
+ },
436
+ {
437
+ name: "Duolingo Green",
438
+ value: "duolingo-green",
439
+ category: "EdTech",
440
+ description: "Duolingo Green palette for edtech interfaces.",
441
+ inspiredBy: ["Duolingo Green"],
442
+ bestFor: ["EdTech UI", "dashboards", "product screens"]
443
+ },
444
+ {
445
+ name: "Coursera Blue",
446
+ value: "coursera-blue",
447
+ category: "EdTech",
448
+ description: "Coursera Blue palette for edtech interfaces.",
449
+ inspiredBy: ["Coursera Blue"],
450
+ bestFor: ["EdTech UI", "dashboards", "product screens"]
451
+ },
452
+ {
453
+ name: "Khan Blue",
454
+ value: "khan-blue",
455
+ category: "EdTech",
456
+ description: "Khan Blue palette for edtech interfaces.",
457
+ inspiredBy: ["Khan Blue"],
458
+ bestFor: ["EdTech UI", "dashboards", "product screens"]
459
+ },
460
+ {
461
+ name: "Udemy Purple",
462
+ value: "udemy-purple",
463
+ category: "EdTech",
464
+ description: "Udemy Purple palette for edtech interfaces.",
465
+ inspiredBy: ["Udemy Purple"],
466
+ bestFor: ["EdTech UI", "dashboards", "product screens"]
467
+ },
468
+ {
469
+ name: "AI Cyber",
470
+ value: "ai-cyber",
471
+ category: "AI/Dev",
472
+ description: "AI Cyber palette for ai/dev interfaces.",
473
+ inspiredBy: ["AI Cyber"],
474
+ bestFor: ["AI/Dev UI", "dashboards", "product screens"]
475
+ },
476
+ {
477
+ name: "Raycast Dark",
478
+ value: "raycast-dark",
479
+ category: "AI/Dev",
480
+ description: "Raycast Dark palette for ai/dev interfaces.",
481
+ inspiredBy: ["Raycast Dark"],
482
+ bestFor: ["AI/Dev UI", "dashboards", "product screens"]
483
+ },
484
+ {
485
+ name: "Railway Violet",
486
+ value: "railway-violet",
487
+ category: "AI/Dev",
488
+ description: "Railway Violet palette for ai/dev interfaces.",
489
+ inspiredBy: ["Railway Violet"],
490
+ bestFor: ["AI/Dev UI", "dashboards", "product screens"]
491
+ },
492
+ {
493
+ name: "Terminal Green",
494
+ value: "terminal-green",
495
+ category: "AI/Dev",
496
+ description: "Terminal Green palette for ai/dev interfaces.",
497
+ inspiredBy: ["Terminal Green"],
498
+ bestFor: ["AI/Dev UI", "dashboards", "product screens"]
499
+ },
500
+ {
501
+ name: "VS Code Dark",
502
+ value: "vscode-dark",
503
+ category: "Developer Tools",
504
+ description: "VS Code Dark palette for developer tools interfaces.",
505
+ inspiredBy: ["VS Code Dark"],
506
+ bestFor: ["Developer Tools UI", "dashboards", "product screens"]
507
+ },
508
+ {
509
+ name: "iTerm Green",
510
+ value: "iterm-green",
511
+ category: "Developer Tools",
512
+ description: "iTerm Green palette for developer tools interfaces.",
513
+ inspiredBy: ["iTerm Green"],
514
+ bestFor: ["Developer Tools UI", "dashboards", "product screens"]
515
+ },
516
+ {
517
+ name: "Supabase Emerald",
518
+ value: "supabase-emerald",
519
+ category: "Developer Tools",
520
+ description: "Supabase Emerald palette for developer tools interfaces.",
521
+ inspiredBy: ["Supabase Emerald"],
522
+ bestFor: ["Developer Tools UI", "dashboards", "product screens"]
523
+ },
524
+ {
525
+ name: "Neon Cyber",
526
+ value: "neon-cyber",
527
+ category: "Developer Tools",
528
+ description: "Neon Cyber palette for developer tools interfaces.",
529
+ inspiredBy: ["Neon Cyber"],
530
+ bestFor: ["Developer Tools UI", "dashboards", "product screens"]
531
+ },
532
+ {
533
+ name: "IBM Carbon",
534
+ value: "ibm-carbon",
535
+ category: "Enterprise",
536
+ description: "IBM Carbon palette for enterprise interfaces.",
537
+ inspiredBy: ["IBM Carbon"],
538
+ bestFor: ["Enterprise UI", "dashboards", "product screens"]
539
+ },
540
+ {
541
+ name: "Microsoft Fluent",
542
+ value: "microsoft-fluent",
543
+ category: "Enterprise",
544
+ description: "Microsoft Fluent palette for enterprise interfaces.",
545
+ inspiredBy: ["Microsoft Fluent"],
546
+ bestFor: ["Enterprise UI", "dashboards", "product screens"]
547
+ },
548
+ {
549
+ name: "Gov Blue",
550
+ value: "gov-blue",
551
+ category: "Enterprise",
552
+ description: "Gov Blue palette for enterprise interfaces.",
553
+ inspiredBy: ["Gov Blue"],
554
+ bestFor: ["Enterprise UI", "dashboards", "product screens"]
555
+ },
556
+ {
557
+ name: "Stripe Gradient",
558
+ value: "stripe-gradient",
559
+ category: "Enterprise",
560
+ description: "Stripe Gradient palette for enterprise interfaces.",
561
+ inspiredBy: ["Stripe Gradient"],
562
+ bestFor: ["Enterprise UI", "dashboards", "product screens"]
563
+ },
564
+ {
565
+ name: "Solana Gradient",
566
+ value: "solana-gradient",
567
+ category: "Creative",
568
+ description: "Solana Gradient palette for creative interfaces.",
569
+ inspiredBy: ["Solana Gradient"],
570
+ bestFor: ["Creative UI", "dashboards", "product screens"]
571
+ },
572
+ {
573
+ name: "Figma Purple",
574
+ value: "figma-purple",
575
+ category: "Creative",
576
+ description: "Figma Purple palette for creative interfaces.",
577
+ inspiredBy: ["Figma Purple"],
578
+ bestFor: ["Creative UI", "dashboards", "product screens"]
579
+ },
580
+ {
581
+ name: "Dribbble Pink",
582
+ value: "dribbble-pink",
583
+ category: "Creative",
584
+ description: "Dribbble Pink palette for creative interfaces.",
585
+ inspiredBy: ["Dribbble Pink"],
586
+ bestFor: ["Creative UI", "dashboards", "product screens"]
587
+ },
588
+ {
589
+ name: "Behance Blue",
590
+ value: "behance-blue",
591
+ category: "Creative",
592
+ description: "Behance Blue palette for creative interfaces.",
593
+ inspiredBy: ["Behance Blue"],
594
+ bestFor: ["Creative UI", "dashboards", "product screens"]
595
+ },
596
+ {
597
+ name: "Awwwards Dark",
598
+ value: "awwwards-dark",
599
+ category: "Creative",
600
+ description: "Awwwards Dark palette for creative interfaces.",
601
+ inspiredBy: ["Awwwards Dark"],
602
+ bestFor: ["Creative UI", "dashboards", "product screens"]
603
+ }
604
+ ];
605
+ var uiPaletteValues = uiPalettes.map((palette) => palette.value);
606
+ var DEFAULT_PALETTE = "neutral-slate";
607
+ function palettesByCategory() {
608
+ const out = {};
609
+ for (const palette of uiPalettes) {
610
+ out[palette.category] = out[palette.category] ?? [];
611
+ out[palette.category].push(palette);
612
+ }
613
+ return out;
614
+ }
615
+ function isUiPalette(value) {
616
+ return uiPaletteValues.includes(value);
617
+ }
618
+ var STORAGE_PALETTE = "ui-palette";
619
+ var STORAGE_APPEARANCE = "ui-appearance";
620
+ function applyPalette(palette) {
621
+ if (typeof document === "undefined") return;
622
+ document.documentElement.dataset.palette = palette;
623
+ try {
624
+ localStorage.setItem(STORAGE_PALETTE, palette);
625
+ } catch {
626
+ }
627
+ }
628
+ function applyAppearance(appearance) {
629
+ if (typeof document === "undefined") return;
630
+ const prefersDark = typeof window !== "undefined" && window.matchMedia("(prefers-color-scheme: dark)").matches;
631
+ const isDark = appearance === "dark" || appearance === "system" && prefersDark;
632
+ document.documentElement.classList.toggle("dark", isDark);
633
+ try {
634
+ localStorage.setItem(STORAGE_APPEARANCE, appearance);
635
+ } catch {
636
+ }
637
+ }
638
+ var appliers = {
639
+ appearance: applyAppearance,
640
+ palette: applyPalette
641
+ };
642
+ function getStoredPalette() {
643
+ if (typeof localStorage === "undefined") return DEFAULT_PALETTE;
644
+ const raw = localStorage.getItem(STORAGE_PALETTE);
645
+ return raw && isUiPalette(raw) ? raw : DEFAULT_PALETTE;
646
+ }
647
+ function getStoredAppearance() {
648
+ if (typeof localStorage === "undefined") return "system";
649
+ const raw = localStorage.getItem(STORAGE_APPEARANCE);
650
+ return raw === "light" || raw === "dark" || raw === "system" ? raw : "system";
651
+ }
652
+
653
+ // src/hooks/useTheme.ts
654
+ var uiThemes = [
655
+ // base kits
656
+ "dashboard",
657
+ "ecommerce",
658
+ "healthcare",
659
+ "fintech",
660
+ "edtech",
661
+ // SaaS sub-themes
662
+ "dashboard-executive",
663
+ "dashboard-glass",
664
+ "dashboard-data",
665
+ // E-commerce sub-themes
666
+ "ecommerce-luxury",
667
+ "ecommerce-playful",
668
+ "ecommerce-minimal",
669
+ // Healthcare sub-themes
670
+ "healthcare-clinical",
671
+ "healthcare-wellness",
672
+ "healthcare-urgent",
673
+ // Fintech sub-themes
674
+ "fintech-wealth",
675
+ "fintech-crypto",
676
+ "fintech-modern",
677
+ // EdTech sub-themes
678
+ "edtech-campus",
679
+ "edtech-kids",
680
+ "edtech-professional"
681
+ ];
682
+ var uiThemeLabels = {
683
+ dashboard: "Dashboard",
684
+ ecommerce: "E-Commerce",
685
+ healthcare: "Healthcare",
686
+ fintech: "Fintech",
687
+ edtech: "EdTech",
688
+ "dashboard-executive": "Dashboard \xB7 Executive",
689
+ "dashboard-glass": "Dashboard \xB7 Glass",
690
+ "dashboard-data": "Dashboard \xB7 Data",
691
+ "ecommerce-luxury": "E-Commerce \xB7 Luxury",
692
+ "ecommerce-playful": "E-Commerce \xB7 Playful",
693
+ "ecommerce-minimal": "E-Commerce \xB7 Minimal",
694
+ "healthcare-clinical": "Healthcare \xB7 Clinical",
695
+ "healthcare-wellness": "Healthcare \xB7 Wellness",
696
+ "healthcare-urgent": "Healthcare \xB7 Urgent",
697
+ "fintech-wealth": "Fintech \xB7 Wealth",
698
+ "fintech-crypto": "Fintech \xB7 Crypto",
699
+ "fintech-modern": "Fintech \xB7 Modern",
700
+ "edtech-campus": "EdTech \xB7 Campus",
701
+ "edtech-kids": "EdTech \xB7 Kids",
702
+ "edtech-professional": "EdTech \xB7 Professional"
703
+ };
704
+ var DEFAULT_THEME = "dashboard";
705
+ var STORAGE_THEME = "ui-theme";
706
+ function isUiTheme(value) {
707
+ return uiThemes.includes(value);
708
+ }
709
+ function applyTheme(theme) {
710
+ if (typeof document === "undefined") return;
711
+ document.documentElement.dataset.theme = theme;
712
+ try {
713
+ localStorage.setItem(STORAGE_THEME, theme);
714
+ } catch {
715
+ }
716
+ }
717
+ function getStoredTheme() {
718
+ if (typeof localStorage === "undefined") return DEFAULT_THEME;
719
+ const raw = localStorage.getItem(STORAGE_THEME);
720
+ return raw && isUiTheme(raw) ? raw : DEFAULT_THEME;
721
+ }
722
+ function useTheme() {
723
+ const [mounted, setMounted] = react.useState(false);
724
+ const [theme, setThemeState] = react.useState(DEFAULT_THEME);
725
+ const [palette, setPaletteState] = react.useState("neutral-slate");
726
+ const [appearance, setAppearanceState] = react.useState("system");
727
+ react.useEffect(() => {
728
+ setThemeState(getStoredTheme());
729
+ setPaletteState(getStoredPalette());
730
+ setAppearanceState(getStoredAppearance());
731
+ setMounted(true);
732
+ }, []);
733
+ const setTheme = react.useCallback((nextTheme) => {
734
+ setThemeState(nextTheme);
735
+ applyTheme(nextTheme);
736
+ }, []);
737
+ const setPalette = react.useCallback((nextPalette) => {
738
+ setPaletteState(nextPalette);
739
+ applyPalette(nextPalette);
740
+ }, []);
741
+ const setAppearance = react.useCallback((nextAppearance) => {
742
+ setAppearanceState(nextAppearance);
743
+ applyAppearance(nextAppearance);
744
+ }, []);
745
+ react.useEffect(() => {
746
+ if (!mounted) return;
747
+ applyTheme(theme);
748
+ }, [mounted, theme]);
749
+ react.useEffect(() => {
750
+ if (!mounted) return;
751
+ applyPalette(palette);
752
+ }, [mounted, palette]);
753
+ react.useEffect(() => {
754
+ if (!mounted) return;
755
+ applyAppearance(appearance);
756
+ if (appearance !== "system") return;
757
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
758
+ const updateAppearance = () => applyAppearance("system");
759
+ mediaQuery.addEventListener("change", updateAppearance);
760
+ return () => mediaQuery.removeEventListener("change", updateAppearance);
761
+ }, [mounted, appearance]);
762
+ return {
763
+ appearance,
764
+ mounted,
765
+ palette,
766
+ setAppearance,
767
+ setPalette,
768
+ setTheme,
769
+ theme
770
+ };
771
+ }
772
+
773
+ // src/lib/fonts.ts
774
+ var uiFonts = {
775
+ inter: {
776
+ name: "Inter",
777
+ googleUrl: "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap",
778
+ cssValue: '"Inter", ui-sans-serif, system-ui, -apple-system, sans-serif',
779
+ recommendedFor: [
780
+ "dashboard-executive",
781
+ "fintech-modern",
782
+ "ecommerce-minimal",
783
+ "edtech-professional"
784
+ ]
785
+ },
786
+ geist: {
787
+ name: "Geist",
788
+ googleUrl: "https://fonts.googleapis.com/css2?family=Geist:wght@100..900&display=swap",
789
+ cssValue: '"Geist", ui-sans-serif, system-ui, sans-serif',
790
+ recommendedFor: ["dashboard-executive", "fintech-crypto"]
791
+ },
792
+ "geist-mono": {
793
+ name: "Geist Mono",
794
+ googleUrl: "https://fonts.googleapis.com/css2?family=Geist+Mono:wght@100..900&display=swap",
795
+ cssValue: '"Geist Mono", ui-monospace, "JetBrains Mono", monospace',
796
+ recommendedFor: ["code", "price data", "dashboard-data"]
797
+ },
798
+ "jetbrains-mono": {
799
+ name: "JetBrains Mono",
800
+ googleUrl: "https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&display=swap",
801
+ cssValue: '"JetBrains Mono", ui-monospace, monospace',
802
+ recommendedFor: ["code fallback", "logs"]
803
+ },
804
+ manrope: {
805
+ name: "Manrope",
806
+ googleUrl: "https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&display=swap",
807
+ cssValue: '"Manrope", ui-sans-serif, system-ui, sans-serif',
808
+ recommendedFor: ["healthcare base", "calm headings"]
809
+ },
810
+ outfit: {
811
+ name: "Outfit",
812
+ googleUrl: "https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&display=swap",
813
+ cssValue: '"Outfit", ui-sans-serif, system-ui, sans-serif',
814
+ recommendedFor: ["fintech base", "geometric headings"]
815
+ },
816
+ lato: {
817
+ name: "Lato",
818
+ googleUrl: "https://fonts.googleapis.com/css2?family=Lato:wght@400;700;900&display=swap",
819
+ cssValue: '"Lato", ui-sans-serif, system-ui, sans-serif',
820
+ recommendedFor: ["ecommerce-luxury body", "editorial body"]
821
+ },
822
+ "playfair-display": {
823
+ name: "Playfair Display",
824
+ googleUrl: "https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,600;0,700;0,800;1,500&display=swap",
825
+ cssValue: '"Playfair Display", ui-serif, Georgia, serif',
826
+ recommendedFor: ["ecommerce-luxury", "fintech-wealth"]
827
+ },
828
+ "plus-jakarta-sans": {
829
+ name: "Plus Jakarta Sans",
830
+ googleUrl: "https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap",
831
+ cssValue: '"Plus Jakarta Sans", ui-sans-serif, system-ui, sans-serif',
832
+ recommendedFor: ["dashboard-glass", "edtech base"]
833
+ },
834
+ "cormorant-garamond": {
835
+ name: "Cormorant Garamond",
836
+ googleUrl: "https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400&display=swap",
837
+ cssValue: '"Cormorant Garamond", ui-serif, Georgia, serif',
838
+ recommendedFor: ["luxury display", "editorial"]
839
+ },
840
+ "dm-sans": {
841
+ name: "DM Sans",
842
+ googleUrl: "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&display=swap",
843
+ cssValue: '"DM Sans", ui-sans-serif, system-ui, sans-serif',
844
+ recommendedFor: ["ecommerce-playful"]
845
+ },
846
+ "ibm-plex-sans": {
847
+ name: "IBM Plex Sans",
848
+ googleUrl: "https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600;700&display=swap",
849
+ cssValue: '"IBM Plex Sans", ui-sans-serif, system-ui, sans-serif',
850
+ recommendedFor: ["healthcare-clinical"]
851
+ },
852
+ "ibm-plex-mono": {
853
+ name: "IBM Plex Mono",
854
+ googleUrl: "https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&display=swap",
855
+ cssValue: '"IBM Plex Mono", ui-monospace, monospace',
856
+ recommendedFor: ["healthcare-urgent data", "clinical tables"]
857
+ },
858
+ nunito: {
859
+ name: "Nunito",
860
+ googleUrl: "https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700;800;900&display=swap",
861
+ cssValue: '"Nunito", ui-sans-serif, system-ui, sans-serif',
862
+ recommendedFor: ["healthcare-wellness", "edtech-kids"]
863
+ },
864
+ "source-serif-4": {
865
+ name: "Source Serif 4",
866
+ googleUrl: "https://fonts.googleapis.com/css2?family=Source+Serif+4:wght@400;600;700&display=swap",
867
+ cssValue: '"Source Serif 4", ui-serif, Georgia, serif',
868
+ recommendedFor: ["edtech-campus"]
869
+ }
870
+ };
871
+ var uiFontValues = Object.keys(uiFonts);
872
+ var allFontsHref = "https://fonts.googleapis.com/css2?" + uiFontValues.map((f) => new URL(uiFonts[f].googleUrl).searchParams.get("family") ?? "").filter((family) => family.length > 0).map((fam) => `family=${fam}`).join("&") + "&display=swap";
873
+ function cn(...inputs) {
874
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
875
+ }
876
+ var avatarSizes = {
877
+ sm: "size-8 text-xs",
878
+ md: "size-10 text-sm",
879
+ lg: "size-12 text-base"
880
+ };
881
+ var Avatar = react.forwardRef(
882
+ ({ className, size = "md", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
883
+ AvatarPrimitive__namespace.Root,
884
+ {
885
+ ref,
886
+ className: cn(
887
+ "relative flex shrink-0 overflow-hidden rounded-full",
888
+ avatarSizes[size],
889
+ className
890
+ ),
891
+ ...props
892
+ }
893
+ )
894
+ );
895
+ Avatar.displayName = "Avatar";
896
+ var AvatarImage = react.forwardRef(
897
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
898
+ AvatarPrimitive__namespace.Image,
899
+ {
900
+ ref,
901
+ className: cn("aspect-square size-full object-cover", className),
902
+ ...props
903
+ }
904
+ )
905
+ );
906
+ AvatarImage.displayName = "AvatarImage";
907
+ var AvatarFallback = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
908
+ AvatarPrimitive__namespace.Fallback,
909
+ {
910
+ ref,
911
+ className: cn(
912
+ "flex size-full items-center justify-center rounded-full bg-muted font-medium text-muted-foreground",
913
+ className
914
+ ),
915
+ ...props
916
+ }
917
+ ));
918
+ AvatarFallback.displayName = "AvatarFallback";
919
+ var badgeVariants = {
920
+ default: "border-transparent bg-primary text-primary-foreground",
921
+ secondary: "border-transparent bg-secondary text-secondary-foreground",
922
+ outline: "border-border text-foreground",
923
+ destructive: "border-transparent bg-destructive text-destructive-foreground"
924
+ };
925
+ function Badge({ className, variant = "default", ...props }) {
926
+ return /* @__PURE__ */ jsxRuntime.jsx(
927
+ "span",
928
+ {
929
+ className: cn(
930
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors motion-reduce:transition-none focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
931
+ badgeVariants[variant],
932
+ className
933
+ ),
934
+ ...props
935
+ }
936
+ );
937
+ }
938
+ var variantClasses = {
939
+ default: "bg-primary text-primary-foreground shadow-sm hover:bg-primary/90",
940
+ secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
941
+ outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
942
+ ghost: "hover:bg-accent hover:text-accent-foreground",
943
+ link: "h-auto p-0 text-primary underline-offset-4 hover:underline",
944
+ destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90"
945
+ };
946
+ var sizeClasses = {
947
+ sm: "h-8 rounded-md px-3 text-xs",
948
+ md: "h-10 rounded-md px-4 py-2 text-sm",
949
+ lg: "h-11 rounded-lg px-8 text-base",
950
+ icon: "size-10 rounded-md p-0"
951
+ };
952
+ var Button = react.forwardRef(
953
+ ({
954
+ className,
955
+ variant = "default",
956
+ size = "md",
957
+ isLoading = false,
958
+ disabled,
959
+ children,
960
+ ...props
961
+ }, ref) => {
962
+ return /* @__PURE__ */ jsxRuntime.jsxs(
963
+ "button",
964
+ {
965
+ ref,
966
+ "aria-busy": isLoading || void 0,
967
+ className: cn(
968
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap font-medium transition-colors motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
969
+ variantClasses[variant],
970
+ sizeClasses[size],
971
+ className
972
+ ),
973
+ disabled: disabled || isLoading,
974
+ type: "button",
975
+ ...props,
976
+ children: [
977
+ isLoading ? /* @__PURE__ */ jsxRuntime.jsx(
978
+ "span",
979
+ {
980
+ "aria-hidden": "true",
981
+ className: "size-4 animate-spin rounded-full border-2 border-current border-t-transparent motion-reduce:animate-none"
982
+ }
983
+ ) : null,
984
+ children
985
+ ]
986
+ }
987
+ );
988
+ }
989
+ );
990
+ Button.displayName = "Button";
991
+ var Checkbox = react.forwardRef(
992
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
993
+ CheckboxPrimitive__namespace.Root,
994
+ {
995
+ ref,
996
+ className: cn(
997
+ "peer size-4 shrink-0 rounded-sm border border-primary bg-background shadow-sm transition-colors motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground",
998
+ className
999
+ ),
1000
+ ...props,
1001
+ children: /* @__PURE__ */ jsxRuntime.jsx(CheckboxPrimitive__namespace.Indicator, { className: "flex items-center justify-center text-current", children: /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-xs leading-none", children: "\u2713" }) })
1002
+ }
1003
+ )
1004
+ );
1005
+ Checkbox.displayName = "Checkbox";
1006
+ var Input = react.forwardRef(
1007
+ ({ className, type = "text", error = false, "aria-invalid": ariaInvalid, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1008
+ "input",
1009
+ {
1010
+ ref,
1011
+ "aria-invalid": ariaInvalid ?? (error || void 0),
1012
+ className: cn(
1013
+ "flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground shadow-sm transition-colors motion-reduce:transition-none file:border-0 file:bg-transparent file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
1014
+ error && "border-destructive focus-visible:ring-destructive",
1015
+ className
1016
+ ),
1017
+ type,
1018
+ ...props
1019
+ }
1020
+ )
1021
+ );
1022
+ Input.displayName = "Input";
1023
+ var Label = react.forwardRef(
1024
+ ({ className, required = false, optional = false, error = false, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
1025
+ LabelPrimitive__namespace.Root,
1026
+ {
1027
+ ref,
1028
+ className: cn(
1029
+ "text-sm font-medium leading-none text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
1030
+ error && "text-destructive",
1031
+ className
1032
+ ),
1033
+ ...props,
1034
+ children: [
1035
+ children,
1036
+ required ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "ml-1 text-destructive", children: "*" }) : null,
1037
+ optional && !required ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-1 text-xs font-normal text-muted-foreground", children: "Optional" }) : null
1038
+ ]
1039
+ }
1040
+ )
1041
+ );
1042
+ Label.displayName = "Label";
1043
+ var RadioGroup = react.forwardRef(
1044
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(RadioGroupPrimitive__namespace.Root, { ref, className: cn("grid gap-2", className), ...props })
1045
+ );
1046
+ RadioGroup.displayName = "RadioGroup";
1047
+ var RadioGroupItem = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1048
+ RadioGroupPrimitive__namespace.Item,
1049
+ {
1050
+ ref,
1051
+ className: cn(
1052
+ "aspect-square size-4 rounded-full border border-primary bg-background text-primary shadow-sm transition-colors motion-reduce:transition-none focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
1053
+ className
1054
+ ),
1055
+ ...props,
1056
+ children: /* @__PURE__ */ jsxRuntime.jsx(RadioGroupPrimitive__namespace.Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-2 rounded-full bg-current" }) })
1057
+ }
1058
+ ));
1059
+ RadioGroupItem.displayName = "RadioGroupItem";
1060
+ var Select = SelectPrimitive__namespace.Root;
1061
+ var SelectTrigger = react.forwardRef(({ className, children, placeholder = "Select an option", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
1062
+ SelectPrimitive__namespace.Trigger,
1063
+ {
1064
+ ref,
1065
+ className: cn(
1066
+ "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground shadow-sm transition-colors motion-reduce:transition-none placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 data-[placeholder]:text-muted-foreground",
1067
+ className
1068
+ ),
1069
+ ...props,
1070
+ children: [
1071
+ children ?? /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Value, { placeholder }),
1072
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Icon, { "aria-hidden": "true", className: "ml-2 text-muted-foreground", children: "\u2304" })
1073
+ ]
1074
+ }
1075
+ ));
1076
+ SelectTrigger.displayName = "SelectTrigger";
1077
+ var SelectContent = react.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
1078
+ SelectPrimitive__namespace.Content,
1079
+ {
1080
+ ref,
1081
+ className: cn(
1082
+ "relative z-50 max-h-96 min-w-32 overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in motion-reduce:animate-none",
1083
+ position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1",
1084
+ className
1085
+ ),
1086
+ position,
1087
+ ...props,
1088
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1089
+ SelectPrimitive__namespace.Viewport,
1090
+ {
1091
+ className: cn("p-1", position === "popper" && "min-w-[var(--radix-select-trigger-width)]"),
1092
+ children
1093
+ }
1094
+ )
1095
+ }
1096
+ ) }));
1097
+ SelectContent.displayName = "SelectContent";
1098
+ var SelectItem = react.forwardRef(
1099
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
1100
+ SelectPrimitive__namespace.Item,
1101
+ {
1102
+ ref,
1103
+ className: cn(
1104
+ "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pr-8 pl-2 text-sm outline-none transition-colors motion-reduce:transition-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1105
+ className
1106
+ ),
1107
+ ...props,
1108
+ children: [
1109
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemText, { children }),
1110
+ /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.ItemIndicator, { className: "absolute right-2 inline-flex items-center", children: "\u2713" })
1111
+ ]
1112
+ }
1113
+ )
1114
+ );
1115
+ SelectItem.displayName = "SelectItem";
1116
+ var Separator = react.forwardRef(
1117
+ ({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1118
+ SeparatorPrimitive__namespace.Root,
1119
+ {
1120
+ ref,
1121
+ className: cn(
1122
+ "shrink-0 bg-border",
1123
+ orientation === "horizontal" ? "h-px w-full" : "h-full w-px",
1124
+ className
1125
+ ),
1126
+ decorative,
1127
+ orientation,
1128
+ ...props
1129
+ }
1130
+ )
1131
+ );
1132
+ Separator.displayName = "Separator";
1133
+ var spinnerSizes = {
1134
+ sm: "size-4 border-2",
1135
+ md: "size-6 border-2",
1136
+ lg: "size-8 border-4"
1137
+ };
1138
+ function Spinner({ className, label = "Loading", size = "md", ...props }) {
1139
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-label": label, role: "status", className: "inline-flex items-center", ...props, children: /* @__PURE__ */ jsxRuntime.jsx(
1140
+ "span",
1141
+ {
1142
+ "aria-hidden": "true",
1143
+ className: cn(
1144
+ "inline-block animate-spin rounded-full border-current border-t-transparent text-primary motion-reduce:animate-none",
1145
+ spinnerSizes[size],
1146
+ className
1147
+ )
1148
+ }
1149
+ ) });
1150
+ }
1151
+ var Switch = react.forwardRef(
1152
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1153
+ SwitchPrimitive__namespace.Root,
1154
+ {
1155
+ ref,
1156
+ className: cn(
1157
+ "peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent bg-input shadow-sm transition-colors motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
1158
+ className
1159
+ ),
1160
+ ...props,
1161
+ children: /* @__PURE__ */ jsxRuntime.jsx(SwitchPrimitive__namespace.Thumb, { className: "pointer-events-none block size-5 rounded-full bg-background shadow-lg ring-0 transition-transform motion-reduce:transition-none data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0" })
1162
+ }
1163
+ )
1164
+ );
1165
+ Switch.displayName = "Switch";
1166
+ var resizeClasses = {
1167
+ none: "resize-none",
1168
+ vertical: "resize-y",
1169
+ horizontal: "resize-x",
1170
+ both: "resize"
1171
+ };
1172
+ var Textarea = react.forwardRef(
1173
+ ({ className, error = false, resize = "vertical", "aria-invalid": ariaInvalid, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1174
+ "textarea",
1175
+ {
1176
+ ref,
1177
+ "aria-invalid": ariaInvalid ?? (error || void 0),
1178
+ className: cn(
1179
+ "flex min-h-24 w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground shadow-sm transition-colors motion-reduce:transition-none placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
1180
+ resizeClasses[resize],
1181
+ error && "border-destructive focus-visible:ring-destructive",
1182
+ className
1183
+ ),
1184
+ ...props
1185
+ }
1186
+ )
1187
+ );
1188
+ Textarea.displayName = "Textarea";
1189
+ var variants = {
1190
+ info: "border-primary/40 bg-primary/10 text-foreground",
1191
+ success: "border-green-500/40 bg-green-500/10 text-foreground",
1192
+ warning: "border-yellow-500/40 bg-yellow-500/10 text-foreground",
1193
+ error: "border-destructive/40 bg-destructive/10 text-foreground",
1194
+ destructive: "border-destructive bg-destructive/10 text-destructive"
1195
+ };
1196
+ var Alert = react.forwardRef(
1197
+ ({ className, variant = "info", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1198
+ "div",
1199
+ {
1200
+ ref,
1201
+ role: "alert",
1202
+ className: cn("relative w-full rounded-lg border p-4", variants[variant], className),
1203
+ ...props
1204
+ }
1205
+ )
1206
+ );
1207
+ Alert.displayName = "Alert";
1208
+ var AlertTitle = react.forwardRef(
1209
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("h5", { ref, className: cn("mb-1 font-medium leading-none", className), ...props })
1210
+ );
1211
+ AlertTitle.displayName = "AlertTitle";
1212
+ var AlertDescription = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("p", { ref, className: cn("text-sm [&_p]:leading-relaxed", className), ...props }));
1213
+ AlertDescription.displayName = "AlertDescription";
1214
+ var AspectRatio = AspectRatioPrimitive__namespace.Root;
1215
+ var Breadcrumb = react.forwardRef(
1216
+ ({ label = "breadcrumb", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("nav", { ref, "aria-label": label, ...props })
1217
+ );
1218
+ Breadcrumb.displayName = "Breadcrumb";
1219
+ var BreadcrumbList = react.forwardRef(
1220
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1221
+ "ol",
1222
+ {
1223
+ ref,
1224
+ className: cn(
1225
+ "flex flex-wrap items-center gap-1.5 break-words text-muted-foreground text-sm",
1226
+ className
1227
+ ),
1228
+ ...props
1229
+ }
1230
+ )
1231
+ );
1232
+ BreadcrumbList.displayName = "BreadcrumbList";
1233
+ var BreadcrumbItem = react.forwardRef(
1234
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("li", { ref, className: cn("inline-flex items-center gap-1.5", className), ...props })
1235
+ );
1236
+ BreadcrumbItem.displayName = "BreadcrumbItem";
1237
+ var BreadcrumbLink = react.forwardRef(
1238
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1239
+ "a",
1240
+ {
1241
+ ref,
1242
+ className: cn(
1243
+ "transition-colors motion-reduce:transition-none hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
1244
+ className
1245
+ ),
1246
+ ...props
1247
+ }
1248
+ )
1249
+ );
1250
+ BreadcrumbLink.displayName = "BreadcrumbLink";
1251
+ var BreadcrumbPage = react.forwardRef(
1252
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1253
+ "span",
1254
+ {
1255
+ ref,
1256
+ "aria-current": "page",
1257
+ className: cn("font-normal text-foreground", className),
1258
+ ...props
1259
+ }
1260
+ )
1261
+ );
1262
+ BreadcrumbPage.displayName = "BreadcrumbPage";
1263
+ var BreadcrumbSeparator = react.forwardRef(
1264
+ ({ children = "/", className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("li", { ref, "aria-hidden": "true", className: cn("select-none", className), ...props, children })
1265
+ );
1266
+ BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
1267
+ var BreadcrumbEllipsis = react.forwardRef(
1268
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1269
+ "span",
1270
+ {
1271
+ ref,
1272
+ role: "img",
1273
+ "aria-label": "More pages",
1274
+ className: cn("flex size-9 items-center justify-center", className),
1275
+ ...props,
1276
+ children: "\u2026"
1277
+ }
1278
+ )
1279
+ );
1280
+ BreadcrumbEllipsis.displayName = "BreadcrumbEllipsis";
1281
+ function Calendar({ className, showOutsideDays = true, ...props }) {
1282
+ return /* @__PURE__ */ jsxRuntime.jsx(
1283
+ reactDayPicker.DayPicker,
1284
+ {
1285
+ showOutsideDays,
1286
+ className: cn(
1287
+ "rounded-md border border-border bg-popover p-3 text-popover-foreground",
1288
+ className
1289
+ ),
1290
+ ...props
1291
+ }
1292
+ );
1293
+ }
1294
+ var Table = react.forwardRef(
1295
+ ({ className, label, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full overflow-auto", children: /* @__PURE__ */ jsxRuntime.jsx(
1296
+ "table",
1297
+ {
1298
+ ref,
1299
+ "aria-label": label,
1300
+ className: cn("w-full caption-bottom text-sm", className),
1301
+ ...props
1302
+ }
1303
+ ) })
1304
+ );
1305
+ Table.displayName = "Table";
1306
+ var TableHeader = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("thead", { ref, className: cn("border-b", className), ...props }));
1307
+ TableHeader.displayName = "TableHeader";
1308
+ var TableBody = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props }));
1309
+ TableBody.displayName = "TableBody";
1310
+ var TableFooter = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("tfoot", { ref, className: cn("border-t bg-muted/50 font-medium", className), ...props }));
1311
+ TableFooter.displayName = "TableFooter";
1312
+ var TableRow = react.forwardRef(
1313
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1314
+ "tr",
1315
+ {
1316
+ ref,
1317
+ className: cn(
1318
+ "border-b transition-colors motion-reduce:transition-none hover:bg-muted/50 data-[state=selected]:bg-muted",
1319
+ className
1320
+ ),
1321
+ ...props
1322
+ }
1323
+ )
1324
+ );
1325
+ TableRow.displayName = "TableRow";
1326
+ var TableHead = react.forwardRef(
1327
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1328
+ "th",
1329
+ {
1330
+ ref,
1331
+ className: cn(
1332
+ "h-10 px-2 text-left align-middle font-medium text-muted-foreground",
1333
+ className
1334
+ ),
1335
+ ...props
1336
+ }
1337
+ )
1338
+ );
1339
+ TableHead.displayName = "TableHead";
1340
+ var TableCell = react.forwardRef(
1341
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("td", { ref, className: cn("p-2 align-middle", className), ...props })
1342
+ );
1343
+ TableCell.displayName = "TableCell";
1344
+ var TableCaption = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("caption", { ref, className: cn("mt-4 text-muted-foreground text-sm", className), ...props }));
1345
+ TableCaption.displayName = "TableCaption";
1346
+ function DataTable({
1347
+ columns,
1348
+ data,
1349
+ filterPlaceholder = "Filter rows...",
1350
+ loading = false,
1351
+ emptyMessage = "No results."
1352
+ }) {
1353
+ const table = reactTable.useReactTable({
1354
+ data,
1355
+ columns,
1356
+ getCoreRowModel: reactTable.getCoreRowModel(),
1357
+ getSortedRowModel: reactTable.getSortedRowModel(),
1358
+ getFilteredRowModel: reactTable.getFilteredRowModel(),
1359
+ getPaginationRowModel: reactTable.getPaginationRowModel()
1360
+ });
1361
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
1362
+ /* @__PURE__ */ jsxRuntime.jsx(
1363
+ Input,
1364
+ {
1365
+ type: "search",
1366
+ placeholder: filterPlaceholder,
1367
+ value: table.getState().globalFilter ?? "",
1368
+ onChange: (event) => table.setGlobalFilter(event.target.value)
1369
+ }
1370
+ ),
1371
+ /* @__PURE__ */ jsxRuntime.jsxs(Table, { children: [
1372
+ /* @__PURE__ */ jsxRuntime.jsx(TableHeader, { children: table.getHeaderGroups().map((group) => /* @__PURE__ */ jsxRuntime.jsx(TableRow, { children: group.headers.map((header) => /* @__PURE__ */ jsxRuntime.jsx(TableHead, { children: header.isPlaceholder ? null : reactTable.flexRender(header.column.columnDef.header, header.getContext()) }, header.id)) }, group.id)) }),
1373
+ /* @__PURE__ */ jsxRuntime.jsx(TableBody, { children: loading ? /* @__PURE__ */ jsxRuntime.jsx(TableRow, { children: /* @__PURE__ */ jsxRuntime.jsx(TableCell, { colSpan: columns.length, children: "Loading..." }) }) : table.getRowModel().rows.length ? table.getRowModel().rows.map((row) => /* @__PURE__ */ jsxRuntime.jsx(TableRow, { children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext()) }, cell.id)) }, row.id)) : /* @__PURE__ */ jsxRuntime.jsx(TableRow, { children: /* @__PURE__ */ jsxRuntime.jsx(TableCell, { colSpan: columns.length, children: emptyMessage }) }) })
1374
+ ] }),
1375
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-2", children: [
1376
+ /* @__PURE__ */ jsxRuntime.jsx(
1377
+ Button,
1378
+ {
1379
+ variant: "outline",
1380
+ size: "sm",
1381
+ disabled: !table.getCanPreviousPage(),
1382
+ onClick: () => table.previousPage(),
1383
+ children: "Previous"
1384
+ }
1385
+ ),
1386
+ /* @__PURE__ */ jsxRuntime.jsx(
1387
+ Button,
1388
+ {
1389
+ variant: "outline",
1390
+ size: "sm",
1391
+ disabled: !table.getCanNextPage(),
1392
+ onClick: () => table.nextPage(),
1393
+ children: "Next"
1394
+ }
1395
+ )
1396
+ ] })
1397
+ ] });
1398
+ }
1399
+ var Popover = PopoverPrimitive__namespace.Root;
1400
+ var PopoverTrigger = PopoverPrimitive__namespace.Trigger;
1401
+ var PopoverAnchor = PopoverPrimitive__namespace.Anchor;
1402
+ var PopoverContent = react.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
1403
+ PopoverPrimitive__namespace.Content,
1404
+ {
1405
+ ref,
1406
+ sideOffset,
1407
+ className: cn(
1408
+ "z-50 w-72 rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=closed]:animate-out data-[state=open]:animate-in motion-reduce:animate-none",
1409
+ className
1410
+ ),
1411
+ ...props
1412
+ }
1413
+ ) }));
1414
+ PopoverContent.displayName = "PopoverContent";
1415
+ function DateRangePicker({
1416
+ value,
1417
+ onChange,
1418
+ placeholder = "Pick a date range"
1419
+ }) {
1420
+ const label = value?.from ? value.to ? `${dateFns.format(value.from, "LLL dd, y")} - ${dateFns.format(value.to, "LLL dd, y")}` : dateFns.format(value.from, "LLL dd, y") : placeholder;
1421
+ return /* @__PURE__ */ jsxRuntime.jsxs(Popover, { children: [
1422
+ /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "outline", children: label }) }),
1423
+ /* @__PURE__ */ jsxRuntime.jsx(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsxRuntime.jsx(Calendar, { mode: "range", selected: value, onSelect: onChange, numberOfMonths: 2 }) })
1424
+ ] });
1425
+ }
1426
+ var Pagination = react.forwardRef(({ label = "pagination", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("nav", { ref, "aria-label": label, ...props }));
1427
+ Pagination.displayName = "Pagination";
1428
+ var PaginationContent = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("ul", { ref, className: cn("flex flex-row items-center gap-1", className), ...props }));
1429
+ PaginationContent.displayName = "PaginationContent";
1430
+ var PaginationItem = react.forwardRef((props, ref) => /* @__PURE__ */ jsxRuntime.jsx("li", { ref, ...props }));
1431
+ PaginationItem.displayName = "PaginationItem";
1432
+ var PaginationLink = react.forwardRef(({ className, isActive = false, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1433
+ "a",
1434
+ {
1435
+ ref,
1436
+ "aria-current": isActive ? "page" : void 0,
1437
+ className: cn(
1438
+ "inline-flex size-10 items-center justify-center rounded-md text-sm transition-colors motion-reduce:transition-none hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
1439
+ isActive && "border border-input bg-background",
1440
+ className
1441
+ ),
1442
+ ...props
1443
+ }
1444
+ ));
1445
+ PaginationLink.displayName = "PaginationLink";
1446
+ var PaginationPrevious = react.forwardRef(({ children = "Previous", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(PaginationLink, { ref, "aria-label": "Go to previous page", ...props, children }));
1447
+ PaginationPrevious.displayName = "PaginationPrevious";
1448
+ var PaginationNext = react.forwardRef(({ children = "Next", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(PaginationLink, { ref, "aria-label": "Go to next page", ...props, children }));
1449
+ PaginationNext.displayName = "PaginationNext";
1450
+ function PaginationEllipsis(props) {
1451
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "flex size-10 items-center justify-center", ...props, children: "\u2026" });
1452
+ }
1453
+ var Progress = react.forwardRef(({ className, value = 0, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1454
+ ProgressPrimitive__namespace.Root,
1455
+ {
1456
+ ref,
1457
+ value,
1458
+ className: cn("relative h-2 w-full overflow-hidden rounded-full bg-muted", className),
1459
+ ...props,
1460
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1461
+ ProgressPrimitive__namespace.Indicator,
1462
+ {
1463
+ className: "h-full w-full flex-1 bg-primary transition-all motion-reduce:transition-none",
1464
+ style: { transform: `translateX(-${100 - value}%)` }
1465
+ }
1466
+ )
1467
+ }
1468
+ ));
1469
+ Progress.displayName = "Progress";
1470
+ var ScrollArea = react.forwardRef(
1471
+ ({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
1472
+ ScrollAreaPrimitive__namespace.Root,
1473
+ {
1474
+ ref,
1475
+ className: cn("relative overflow-hidden", className),
1476
+ ...props,
1477
+ children: [
1478
+ /* @__PURE__ */ jsxRuntime.jsx(ScrollAreaPrimitive__namespace.Viewport, { className: "h-full w-full rounded-[inherit]", children }),
1479
+ /* @__PURE__ */ jsxRuntime.jsx(
1480
+ ScrollAreaPrimitive__namespace.Scrollbar,
1481
+ {
1482
+ orientation: "vertical",
1483
+ className: "flex touch-none select-none p-0.5",
1484
+ children: /* @__PURE__ */ jsxRuntime.jsx(ScrollAreaPrimitive__namespace.Thumb, { className: "relative flex-1 rounded-full bg-border" })
1485
+ }
1486
+ ),
1487
+ /* @__PURE__ */ jsxRuntime.jsx(ScrollAreaPrimitive__namespace.Corner, {})
1488
+ ]
1489
+ }
1490
+ )
1491
+ );
1492
+ ScrollArea.displayName = "ScrollArea";
1493
+ var Skeleton = react.forwardRef(({ className, animated = true, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1494
+ "div",
1495
+ {
1496
+ ref,
1497
+ "aria-hidden": "true",
1498
+ className: cn(
1499
+ "rounded-md bg-muted",
1500
+ animated && "animate-pulse motion-reduce:animate-none",
1501
+ className
1502
+ ),
1503
+ ...props
1504
+ }
1505
+ ));
1506
+ Skeleton.displayName = "Skeleton";
1507
+ var Accordion = AccordionPrimitive__namespace.Root;
1508
+ var AccordionItem = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1509
+ AccordionPrimitive__namespace.Item,
1510
+ {
1511
+ ref,
1512
+ className: cn("border-b border-border", className),
1513
+ ...props
1514
+ }
1515
+ ));
1516
+ AccordionItem.displayName = "AccordionItem";
1517
+ var AccordionTrigger = react.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
1518
+ AccordionPrimitive__namespace.Trigger,
1519
+ {
1520
+ ref,
1521
+ className: cn(
1522
+ "flex flex-1 items-center justify-between py-4 font-medium text-sm transition-all motion-reduce:transition-none hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:[&>span]:rotate-180",
1523
+ className
1524
+ ),
1525
+ ...props,
1526
+ children: [
1527
+ children,
1528
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "transition-transform motion-reduce:transition-none", children: "\u2304" })
1529
+ ]
1530
+ }
1531
+ ) }));
1532
+ AccordionTrigger.displayName = "AccordionTrigger";
1533
+ var AccordionContent = react.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1534
+ AccordionPrimitive__namespace.Content,
1535
+ {
1536
+ ref,
1537
+ className: "overflow-hidden text-sm data-[state=closed]:animate-out data-[state=open]:animate-in motion-reduce:animate-none",
1538
+ ...props,
1539
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("pb-4 pt-0", className), children })
1540
+ }
1541
+ ));
1542
+ AccordionContent.displayName = "AccordionContent";
1543
+ var AlertDialog = AlertDialogPrimitive__namespace.Root;
1544
+ var AlertDialogTrigger = AlertDialogPrimitive__namespace.Trigger;
1545
+ var AlertDialogPortal = AlertDialogPrimitive__namespace.Portal;
1546
+ var AlertDialogOverlay = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1547
+ AlertDialogPrimitive__namespace.Overlay,
1548
+ {
1549
+ ref,
1550
+ className: cn(
1551
+ "fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=closed]:animate-out data-[state=open]:animate-in motion-reduce:animate-none",
1552
+ className
1553
+ ),
1554
+ ...props
1555
+ }
1556
+ ));
1557
+ AlertDialogOverlay.displayName = "AlertDialogOverlay";
1558
+ var AlertDialogContent = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(AlertDialogPortal, { children: [
1559
+ /* @__PURE__ */ jsxRuntime.jsx(AlertDialogOverlay, {}),
1560
+ /* @__PURE__ */ jsxRuntime.jsx(
1561
+ AlertDialogPrimitive__namespace.Content,
1562
+ {
1563
+ ref,
1564
+ className: cn(
1565
+ "fixed top-1/2 left-1/2 z-50 grid w-[calc(100%-2rem)] max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl border border-border bg-popover p-6 text-popover-foreground shadow-lg duration-200 data-[state=closed]:animate-out data-[state=open]:animate-in motion-reduce:animate-none sm:w-full",
1566
+ className
1567
+ ),
1568
+ ...props
1569
+ }
1570
+ )
1571
+ ] }));
1572
+ AlertDialogContent.displayName = "AlertDialogContent";
1573
+ function AlertDialogHeader({ className, ...props }) {
1574
+ return /* @__PURE__ */ jsxRuntime.jsx(
1575
+ "div",
1576
+ {
1577
+ className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className),
1578
+ ...props
1579
+ }
1580
+ );
1581
+ }
1582
+ function AlertDialogFooter({ className, ...props }) {
1583
+ return /* @__PURE__ */ jsxRuntime.jsx(
1584
+ "div",
1585
+ {
1586
+ className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className),
1587
+ ...props
1588
+ }
1589
+ );
1590
+ }
1591
+ var AlertDialogTitle = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1592
+ AlertDialogPrimitive__namespace.Title,
1593
+ {
1594
+ ref,
1595
+ className: cn("font-semibold text-lg leading-none tracking-tight", className),
1596
+ ...props
1597
+ }
1598
+ ));
1599
+ AlertDialogTitle.displayName = "AlertDialogTitle";
1600
+ var AlertDialogDescription = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1601
+ AlertDialogPrimitive__namespace.Description,
1602
+ {
1603
+ ref,
1604
+ className: cn("text-muted-foreground text-sm", className),
1605
+ ...props
1606
+ }
1607
+ ));
1608
+ AlertDialogDescription.displayName = "AlertDialogDescription";
1609
+ var AlertDialogCancel = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1610
+ AlertDialogPrimitive__namespace.Cancel,
1611
+ {
1612
+ ref,
1613
+ className: cn(
1614
+ "inline-flex h-10 items-center justify-center rounded-md border border-input bg-background px-4 py-2 font-medium text-sm shadow-sm transition-colors motion-reduce:transition-none hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
1615
+ className
1616
+ ),
1617
+ ...props
1618
+ }
1619
+ ));
1620
+ AlertDialogCancel.displayName = "AlertDialogCancel";
1621
+ var AlertDialogAction = react.forwardRef(({ className, intent = "default", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1622
+ AlertDialogPrimitive__namespace.Action,
1623
+ {
1624
+ ref,
1625
+ className: cn(
1626
+ "inline-flex h-10 items-center justify-center rounded-md px-4 py-2 font-medium text-sm shadow-sm transition-colors motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
1627
+ intent === "destructive" ? "bg-destructive text-destructive-foreground hover:bg-destructive/90" : "bg-primary text-primary-foreground hover:bg-primary/90",
1628
+ className
1629
+ ),
1630
+ ...props
1631
+ }
1632
+ ));
1633
+ AlertDialogAction.displayName = "AlertDialogAction";
1634
+ var Card = react.forwardRef(
1635
+ ({ className, density = "default", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1636
+ "div",
1637
+ {
1638
+ ref,
1639
+ className: cn(
1640
+ "rounded-xl border border-border bg-card text-card-foreground shadow-sm transition-colors motion-reduce:transition-none",
1641
+ density === "compact" && "text-sm",
1642
+ className
1643
+ ),
1644
+ ...props
1645
+ }
1646
+ )
1647
+ );
1648
+ Card.displayName = "Card";
1649
+ var CardHeader = react.forwardRef(
1650
+ ({ className, density = "default", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1651
+ "div",
1652
+ {
1653
+ ref,
1654
+ className: cn("flex flex-col space-y-1.5", density === "compact" ? "p-4" : "p-6", className),
1655
+ ...props
1656
+ }
1657
+ )
1658
+ );
1659
+ CardHeader.displayName = "CardHeader";
1660
+ var CardTitle = react.forwardRef(
1661
+ ({ className, as: Heading = "h3", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1662
+ Heading,
1663
+ {
1664
+ ref,
1665
+ className: cn("font-semibold leading-none tracking-tight text-card-foreground", className),
1666
+ ...props
1667
+ }
1668
+ )
1669
+ );
1670
+ CardTitle.displayName = "CardTitle";
1671
+ var CardDescription = react.forwardRef(
1672
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("p", { ref, className: cn("text-sm text-muted-foreground", className), ...props })
1673
+ );
1674
+ CardDescription.displayName = "CardDescription";
1675
+ var CardContent = react.forwardRef(
1676
+ ({ className, density = "default", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1677
+ "div",
1678
+ {
1679
+ ref,
1680
+ className: cn(density === "compact" ? "p-4 pt-0" : "p-6 pt-0", className),
1681
+ ...props
1682
+ }
1683
+ )
1684
+ );
1685
+ CardContent.displayName = "CardContent";
1686
+ var CardFooter = react.forwardRef(
1687
+ ({ className, density = "default", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1688
+ "div",
1689
+ {
1690
+ ref,
1691
+ className: cn(
1692
+ "flex items-center gap-2",
1693
+ density === "compact" ? "p-4 pt-0" : "p-6 pt-0",
1694
+ className
1695
+ ),
1696
+ ...props
1697
+ }
1698
+ )
1699
+ );
1700
+ CardFooter.displayName = "CardFooter";
1701
+ var Dialog = DialogPrimitive__namespace.Root;
1702
+ var DialogTrigger = DialogPrimitive__namespace.Trigger;
1703
+ var DialogClose = DialogPrimitive__namespace.Close;
1704
+ var DialogPortal = DialogPrimitive__namespace.Portal;
1705
+ var DialogOverlay = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1706
+ DialogPrimitive__namespace.Overlay,
1707
+ {
1708
+ ref,
1709
+ className: cn(
1710
+ "fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=closed]:animate-out data-[state=open]:animate-in motion-reduce:animate-none",
1711
+ className
1712
+ ),
1713
+ ...props
1714
+ }
1715
+ ));
1716
+ DialogOverlay.displayName = "DialogOverlay";
1717
+ var DialogContent = react.forwardRef(({ className, children, showClose = true, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(DialogPortal, { children: [
1718
+ /* @__PURE__ */ jsxRuntime.jsx(DialogOverlay, {}),
1719
+ /* @__PURE__ */ jsxRuntime.jsxs(
1720
+ DialogPrimitive__namespace.Content,
1721
+ {
1722
+ ref,
1723
+ className: cn(
1724
+ "fixed top-1/2 left-1/2 z-50 grid w-[calc(100%-2rem)] max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl border border-border bg-popover p-6 text-popover-foreground shadow-lg duration-200 data-[state=closed]:animate-out data-[state=open]:animate-in motion-reduce:animate-none sm:w-full",
1725
+ className
1726
+ ),
1727
+ ...props,
1728
+ children: [
1729
+ children,
1730
+ showClose ? /* @__PURE__ */ jsxRuntime.jsxs(DialogPrimitive__namespace.Close, { className: "absolute top-4 right-4 rounded-sm opacity-70 transition-opacity motion-reduce:transition-none hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none", children: [
1731
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\xD7" }),
1732
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Close" })
1733
+ ] }) : null
1734
+ ]
1735
+ }
1736
+ )
1737
+ ] }));
1738
+ DialogContent.displayName = "DialogContent";
1739
+ function DialogHeader({ className, ...props }) {
1740
+ return /* @__PURE__ */ jsxRuntime.jsx(
1741
+ "div",
1742
+ {
1743
+ className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className),
1744
+ ...props
1745
+ }
1746
+ );
1747
+ }
1748
+ function DialogFooter({ className, ...props }) {
1749
+ return /* @__PURE__ */ jsxRuntime.jsx(
1750
+ "div",
1751
+ {
1752
+ className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className),
1753
+ ...props
1754
+ }
1755
+ );
1756
+ }
1757
+ var DialogTitle = react.forwardRef(
1758
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1759
+ DialogPrimitive__namespace.Title,
1760
+ {
1761
+ ref,
1762
+ className: cn("font-semibold text-lg leading-none tracking-tight", className),
1763
+ ...props
1764
+ }
1765
+ )
1766
+ );
1767
+ DialogTitle.displayName = "DialogTitle";
1768
+ var DialogDescription = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1769
+ DialogPrimitive__namespace.Description,
1770
+ {
1771
+ ref,
1772
+ className: cn("text-muted-foreground text-sm", className),
1773
+ ...props
1774
+ }
1775
+ ));
1776
+ DialogDescription.displayName = "DialogDescription";
1777
+ var Command = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1778
+ cmdk.Command,
1779
+ {
1780
+ ref,
1781
+ className: cn(
1782
+ "flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
1783
+ className
1784
+ ),
1785
+ ...props
1786
+ }
1787
+ ));
1788
+ Command.displayName = "Command";
1789
+ function CommandDialog({ children, ...props }) {
1790
+ return /* @__PURE__ */ jsxRuntime.jsx(Dialog, { ...props, children: /* @__PURE__ */ jsxRuntime.jsx(DialogContent, { className: "overflow-hidden p-0", children: /* @__PURE__ */ jsxRuntime.jsx(Command, { children }) }) });
1791
+ }
1792
+ var CommandInput = react.forwardRef(
1793
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center border-b px-3", children: /* @__PURE__ */ jsxRuntime.jsx(
1794
+ cmdk.Command.Input,
1795
+ {
1796
+ ref,
1797
+ className: cn(
1798
+ "flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
1799
+ className
1800
+ ),
1801
+ ...props
1802
+ }
1803
+ ) })
1804
+ );
1805
+ CommandInput.displayName = "CommandInput";
1806
+ var CommandList = react.forwardRef(
1807
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1808
+ cmdk.Command.List,
1809
+ {
1810
+ ref,
1811
+ className: cn("max-h-72 overflow-y-auto overflow-x-hidden", className),
1812
+ ...props
1813
+ }
1814
+ )
1815
+ );
1816
+ CommandList.displayName = "CommandList";
1817
+ var CommandEmpty = react.forwardRef(
1818
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1819
+ cmdk.Command.Empty,
1820
+ {
1821
+ ref,
1822
+ className: cn("py-6 text-center text-muted-foreground text-sm", className),
1823
+ ...props
1824
+ }
1825
+ )
1826
+ );
1827
+ CommandEmpty.displayName = "CommandEmpty";
1828
+ var CommandGroup = react.forwardRef(
1829
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1830
+ cmdk.Command.Group,
1831
+ {
1832
+ ref,
1833
+ className: cn("overflow-hidden p-1 text-foreground", className),
1834
+ ...props
1835
+ }
1836
+ )
1837
+ );
1838
+ CommandGroup.displayName = "CommandGroup";
1839
+ var CommandItem = react.forwardRef(
1840
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1841
+ cmdk.Command.Item,
1842
+ {
1843
+ ref,
1844
+ className: cn(
1845
+ "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50",
1846
+ className
1847
+ ),
1848
+ ...props
1849
+ }
1850
+ )
1851
+ );
1852
+ CommandItem.displayName = "CommandItem";
1853
+ var CommandSeparator = react.forwardRef(
1854
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1855
+ cmdk.Command.Separator,
1856
+ {
1857
+ ref,
1858
+ className: cn("-mx-1 h-px bg-border", className),
1859
+ ...props
1860
+ }
1861
+ )
1862
+ );
1863
+ CommandSeparator.displayName = "CommandSeparator";
1864
+ function CommandShortcut({ className, ...props }) {
1865
+ return /* @__PURE__ */ jsxRuntime.jsx(
1866
+ "span",
1867
+ {
1868
+ className: cn("ml-auto text-muted-foreground text-xs tracking-widest", className),
1869
+ ...props
1870
+ }
1871
+ );
1872
+ }
1873
+ var DropdownMenu = DropdownMenuPrimitive__namespace.Root;
1874
+ var DropdownMenuTrigger = DropdownMenuPrimitive__namespace.Trigger;
1875
+ var DropdownMenuRadioGroup = DropdownMenuPrimitive__namespace.RadioGroup;
1876
+ var DropdownMenuContent = react.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
1877
+ DropdownMenuPrimitive__namespace.Content,
1878
+ {
1879
+ ref,
1880
+ sideOffset,
1881
+ className: cn(
1882
+ "z-50 min-w-40 overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=closed]:animate-out data-[state=open]:animate-in motion-reduce:animate-none",
1883
+ className
1884
+ ),
1885
+ ...props
1886
+ }
1887
+ ) }));
1888
+ DropdownMenuContent.displayName = "DropdownMenuContent";
1889
+ var DropdownMenuItem = react.forwardRef(({ className, inset = false, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1890
+ DropdownMenuPrimitive__namespace.Item,
1891
+ {
1892
+ ref,
1893
+ className: cn(
1894
+ "relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors motion-reduce:transition-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1895
+ inset && "pl-8",
1896
+ className
1897
+ ),
1898
+ ...props
1899
+ }
1900
+ ));
1901
+ DropdownMenuItem.displayName = "DropdownMenuItem";
1902
+ var DropdownMenuCheckboxItem = react.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
1903
+ DropdownMenuPrimitive__namespace.CheckboxItem,
1904
+ {
1905
+ ref,
1906
+ checked,
1907
+ className: cn(
1908
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none transition-colors motion-reduce:transition-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1909
+ className
1910
+ ),
1911
+ ...props,
1912
+ children: [
1913
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.ItemIndicator, { children: "\u2713" }) }),
1914
+ children
1915
+ ]
1916
+ }
1917
+ ));
1918
+ DropdownMenuCheckboxItem.displayName = "DropdownMenuCheckboxItem";
1919
+ var DropdownMenuRadioItem = react.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(
1920
+ DropdownMenuPrimitive__namespace.RadioItem,
1921
+ {
1922
+ ref,
1923
+ className: cn(
1924
+ "relative flex cursor-default select-none items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none transition-colors motion-reduce:transition-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
1925
+ className
1926
+ ),
1927
+ ...props,
1928
+ children: [
1929
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuPrimitive__namespace.ItemIndicator, { children: "\u25CF" }) }),
1930
+ children
1931
+ ]
1932
+ }
1933
+ ));
1934
+ DropdownMenuRadioItem.displayName = "DropdownMenuRadioItem";
1935
+ function DropdownMenuLabel({ className, inset = false, ...props }) {
1936
+ return /* @__PURE__ */ jsxRuntime.jsx(
1937
+ DropdownMenuPrimitive__namespace.Label,
1938
+ {
1939
+ className: cn("px-2 py-1.5 font-semibold text-sm", inset && "pl-8", className),
1940
+ ...props
1941
+ }
1942
+ );
1943
+ }
1944
+ var DropdownMenuSeparator = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1945
+ DropdownMenuPrimitive__namespace.Separator,
1946
+ {
1947
+ ref,
1948
+ className: cn("-mx-1 my-1 h-px bg-border", className),
1949
+ ...props
1950
+ }
1951
+ ));
1952
+ DropdownMenuSeparator.displayName = "DropdownMenuSeparator";
1953
+ function DropdownMenuShortcut({ className, ...props }) {
1954
+ return /* @__PURE__ */ jsxRuntime.jsx(
1955
+ "span",
1956
+ {
1957
+ className: cn("ml-auto text-muted-foreground text-xs tracking-widest", className),
1958
+ ...props
1959
+ }
1960
+ );
1961
+ }
1962
+ var NavigationMenu = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1963
+ NavigationMenuPrimitive__namespace.Root,
1964
+ {
1965
+ ref,
1966
+ className: cn("relative z-10 flex max-w-max flex-1 items-center justify-center", className),
1967
+ ...props
1968
+ }
1969
+ ));
1970
+ NavigationMenu.displayName = "NavigationMenu";
1971
+ var NavigationMenuList = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1972
+ NavigationMenuPrimitive__namespace.List,
1973
+ {
1974
+ ref,
1975
+ className: cn("group flex flex-1 list-none items-center justify-center gap-1", className),
1976
+ ...props
1977
+ }
1978
+ ));
1979
+ NavigationMenuList.displayName = "NavigationMenuList";
1980
+ var NavigationMenuItem = NavigationMenuPrimitive__namespace.Item;
1981
+ var NavigationMenuTrigger = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1982
+ NavigationMenuPrimitive__namespace.Trigger,
1983
+ {
1984
+ ref,
1985
+ className: cn(
1986
+ "inline-flex h-10 items-center justify-center rounded-md bg-background px-4 py-2 font-medium text-sm transition-colors motion-reduce:transition-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
1987
+ className
1988
+ ),
1989
+ ...props
1990
+ }
1991
+ ));
1992
+ NavigationMenuTrigger.displayName = "NavigationMenuTrigger";
1993
+ var NavigationMenuContent = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
1994
+ NavigationMenuPrimitive__namespace.Content,
1995
+ {
1996
+ ref,
1997
+ className: cn(
1998
+ "left-0 top-0 w-full rounded-md border border-border bg-popover p-4 text-popover-foreground shadow-md md:absolute md:w-auto",
1999
+ className
2000
+ ),
2001
+ ...props
2002
+ }
2003
+ ));
2004
+ NavigationMenuContent.displayName = "NavigationMenuContent";
2005
+ var NavigationMenuLink = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
2006
+ NavigationMenuPrimitive__namespace.Link,
2007
+ {
2008
+ ref,
2009
+ className: cn(
2010
+ "block rounded-md p-2 text-sm transition-colors motion-reduce:transition-none hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
2011
+ className
2012
+ ),
2013
+ ...props
2014
+ }
2015
+ ));
2016
+ NavigationMenuLink.displayName = "NavigationMenuLink";
2017
+ var NavigationMenuViewport = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
2018
+ NavigationMenuPrimitive__namespace.Viewport,
2019
+ {
2020
+ ref,
2021
+ className: cn(
2022
+ "origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border border-border bg-popover shadow-lg motion-reduce:transition-none md:w-[var(--radix-navigation-menu-viewport-width)]",
2023
+ className
2024
+ ),
2025
+ ...props
2026
+ }
2027
+ ));
2028
+ NavigationMenuViewport.displayName = "NavigationMenuViewport";
2029
+ var NavigationMenuIndicator = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
2030
+ NavigationMenuPrimitive__namespace.Indicator,
2031
+ {
2032
+ ref,
2033
+ className: cn("top-full z-10 flex h-1.5 items-end justify-center overflow-hidden", className),
2034
+ ...props
2035
+ }
2036
+ ));
2037
+ NavigationMenuIndicator.displayName = "NavigationMenuIndicator";
2038
+ var sideClasses = {
2039
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
2040
+ right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
2041
+ bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
2042
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm"
2043
+ };
2044
+ var Sheet = DialogPrimitive__namespace.Root;
2045
+ var SheetTrigger = DialogPrimitive__namespace.Trigger;
2046
+ var SheetClose = DialogPrimitive__namespace.Close;
2047
+ var SheetPortal = DialogPrimitive__namespace.Portal;
2048
+ var SheetOverlay = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
2049
+ DialogPrimitive__namespace.Overlay,
2050
+ {
2051
+ ref,
2052
+ className: cn(
2053
+ "fixed inset-0 z-50 bg-background/80 backdrop-blur-sm data-[state=closed]:animate-out data-[state=open]:animate-in motion-reduce:animate-none",
2054
+ className
2055
+ ),
2056
+ ...props
2057
+ }
2058
+ ));
2059
+ SheetOverlay.displayName = "SheetOverlay";
2060
+ var SheetContent = react.forwardRef(({ className, children, side = "right", showClose = true, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsxs(SheetPortal, { children: [
2061
+ /* @__PURE__ */ jsxRuntime.jsx(SheetOverlay, {}),
2062
+ /* @__PURE__ */ jsxRuntime.jsxs(
2063
+ DialogPrimitive__namespace.Content,
2064
+ {
2065
+ ref,
2066
+ className: cn(
2067
+ "fixed z-50 gap-4 bg-popover p-6 text-popover-foreground shadow-lg transition ease-in-out data-[state=closed]:animate-out data-[state=open]:animate-in motion-reduce:animate-none motion-reduce:transition-none",
2068
+ sideClasses[side],
2069
+ className
2070
+ ),
2071
+ ...props,
2072
+ children: [
2073
+ children,
2074
+ showClose ? /* @__PURE__ */ jsxRuntime.jsxs(DialogPrimitive__namespace.Close, { className: "absolute top-4 right-4 rounded-sm opacity-70 transition-opacity motion-reduce:transition-none hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none", children: [
2075
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\xD7" }),
2076
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Close" })
2077
+ ] }) : null
2078
+ ]
2079
+ }
2080
+ )
2081
+ ] }));
2082
+ SheetContent.displayName = "SheetContent";
2083
+ function SheetHeader({ className, ...props }) {
2084
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col space-y-2 text-left", className), ...props });
2085
+ }
2086
+ function SheetFooter({ className, ...props }) {
2087
+ return /* @__PURE__ */ jsxRuntime.jsx(
2088
+ "div",
2089
+ {
2090
+ className: cn("mt-6 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className),
2091
+ ...props
2092
+ }
2093
+ );
2094
+ }
2095
+ var SheetTitle = react.forwardRef(
2096
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
2097
+ DialogPrimitive__namespace.Title,
2098
+ {
2099
+ ref,
2100
+ className: cn("font-semibold text-lg text-popover-foreground", className),
2101
+ ...props
2102
+ }
2103
+ )
2104
+ );
2105
+ SheetTitle.displayName = "SheetTitle";
2106
+ var SheetDescription = react.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
2107
+ DialogPrimitive__namespace.Description,
2108
+ {
2109
+ ref,
2110
+ className: cn("text-muted-foreground text-sm", className),
2111
+ ...props
2112
+ }
2113
+ ));
2114
+ SheetDescription.displayName = "SheetDescription";
2115
+ var Tabs = TabsPrimitive__namespace.Root;
2116
+ var TabsList = react.forwardRef(
2117
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
2118
+ TabsPrimitive__namespace.List,
2119
+ {
2120
+ ref,
2121
+ className: cn(
2122
+ "inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",
2123
+ className
2124
+ ),
2125
+ ...props
2126
+ }
2127
+ )
2128
+ );
2129
+ TabsList.displayName = "TabsList";
2130
+ var TabsTrigger = react.forwardRef(
2131
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
2132
+ TabsPrimitive__namespace.Trigger,
2133
+ {
2134
+ ref,
2135
+ className: cn(
2136
+ "inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 font-medium text-sm transition-all motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",
2137
+ className
2138
+ ),
2139
+ ...props
2140
+ }
2141
+ )
2142
+ );
2143
+ TabsTrigger.displayName = "TabsTrigger";
2144
+ var TabsContent = react.forwardRef(
2145
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
2146
+ TabsPrimitive__namespace.Content,
2147
+ {
2148
+ ref,
2149
+ className: cn(
2150
+ "mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
2151
+ className
2152
+ ),
2153
+ ...props
2154
+ }
2155
+ )
2156
+ );
2157
+ TabsContent.displayName = "TabsContent";
2158
+ var TooltipProvider = TooltipPrimitive__namespace.Provider;
2159
+ var Tooltip = TooltipPrimitive__namespace.Root;
2160
+ var TooltipTrigger = TooltipPrimitive__namespace.Trigger;
2161
+ var TooltipContent = react.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(TooltipPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
2162
+ TooltipPrimitive__namespace.Content,
2163
+ {
2164
+ ref,
2165
+ sideOffset,
2166
+ className: cn(
2167
+ "z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-primary-foreground text-xs shadow-md data-[state=closed]:animate-out data-[state=delayed-open]:animate-in motion-reduce:animate-none",
2168
+ className
2169
+ ),
2170
+ ...props
2171
+ }
2172
+ ) }));
2173
+ TooltipContent.displayName = "TooltipContent";
2174
+ function Toaster({
2175
+ richColors = true,
2176
+ closeButton = true,
2177
+ position = "bottom-right",
2178
+ ...props
2179
+ }) {
2180
+ return /* @__PURE__ */ jsxRuntime.jsx(
2181
+ sonner.Toaster,
2182
+ {
2183
+ richColors,
2184
+ closeButton,
2185
+ position,
2186
+ ...props
2187
+ }
2188
+ );
2189
+ }
2190
+ function Combobox({
2191
+ options,
2192
+ value,
2193
+ onValueChange,
2194
+ placeholder = "Select option...",
2195
+ emptyText = "No option found.",
2196
+ disabled = false
2197
+ }) {
2198
+ const [open, setOpen] = react.useState(false);
2199
+ const selected = react.useMemo(() => options.find((o) => o.value === value), [options, value]);
2200
+ return /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, children: [
2201
+ /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "outline", disabled, "aria-expanded": open, children: selected?.label ?? placeholder }) }),
2202
+ /* @__PURE__ */ jsxRuntime.jsx(PopoverContent, { className: "w-64 p-0", children: /* @__PURE__ */ jsxRuntime.jsxs(Command, { children: [
2203
+ /* @__PURE__ */ jsxRuntime.jsx(CommandInput, { placeholder: "Search..." }),
2204
+ /* @__PURE__ */ jsxRuntime.jsxs(CommandList, { children: [
2205
+ /* @__PURE__ */ jsxRuntime.jsx(CommandEmpty, { children: emptyText }),
2206
+ /* @__PURE__ */ jsxRuntime.jsx(CommandGroup, { children: options.map((option) => /* @__PURE__ */ jsxRuntime.jsxs(
2207
+ CommandItem,
2208
+ {
2209
+ value: option.label,
2210
+ onSelect: () => {
2211
+ onValueChange?.(option.value);
2212
+ setOpen(false);
2213
+ },
2214
+ children: [
2215
+ option.label,
2216
+ option.value === value ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto", children: "\u2713" }) : null
2217
+ ]
2218
+ },
2219
+ option.value
2220
+ )) })
2221
+ ] })
2222
+ ] }) })
2223
+ ] });
2224
+ }
2225
+ var Form = reactHookForm.FormProvider;
2226
+ var FormFieldContext = react.createContext(null);
2227
+ function FormField(props) {
2228
+ return /* @__PURE__ */ jsxRuntime.jsx(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsxRuntime.jsx(reactHookForm.Controller, { ...props }) });
2229
+ }
2230
+ function useFormField() {
2231
+ const ctx = react.useContext(FormFieldContext);
2232
+ const form = reactHookForm.useFormContext();
2233
+ const state = ctx ? form.getFieldState(ctx.name, form.formState) : void 0;
2234
+ return { name: ctx?.name, error: state?.error };
2235
+ }
2236
+ function FormItem({
2237
+ className,
2238
+ ...props
2239
+ }) {
2240
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("space-y-2", className), ...props });
2241
+ }
2242
+ function FormLabel(props) {
2243
+ const { error } = useFormField();
2244
+ return /* @__PURE__ */ jsxRuntime.jsx(Label, { error: !!error, ...props });
2245
+ }
2246
+ function FormControl({ children }) {
2247
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
2248
+ }
2249
+ function FormDescription({
2250
+ className,
2251
+ ...props
2252
+ }) {
2253
+ return /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-muted-foreground text-sm", className), ...props });
2254
+ }
2255
+ function FormMessage({
2256
+ className,
2257
+ children,
2258
+ ...props
2259
+ }) {
2260
+ const { error } = useFormField();
2261
+ const body = children ?? error?.message;
2262
+ if (!body) return null;
2263
+ return /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-destructive text-sm", className), ...props, children: body });
2264
+ }
2265
+ function Sidebar({
2266
+ sections,
2267
+ defaultCollapsed = false,
2268
+ className,
2269
+ ...props
2270
+ }) {
2271
+ const [collapsed, setCollapsed] = react.useState(defaultCollapsed);
2272
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2273
+ "aside",
2274
+ {
2275
+ className: cn(
2276
+ "flex h-full flex-col border-r border-border bg-background",
2277
+ collapsed ? "w-16" : "w-64",
2278
+ className
2279
+ ),
2280
+ ...props,
2281
+ children: [
2282
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between p-2", children: [
2283
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("font-semibold", collapsed && "sr-only"), children: "Navigation" }),
2284
+ /* @__PURE__ */ jsxRuntime.jsx(
2285
+ Button,
2286
+ {
2287
+ size: "icon",
2288
+ variant: "ghost",
2289
+ "aria-label": "Toggle sidebar",
2290
+ onClick: () => setCollapsed((v) => !v),
2291
+ children: "\u2630"
2292
+ }
2293
+ )
2294
+ ] }),
2295
+ /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "space-y-4 p-2", children: sections.map((section, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
2296
+ section.label && !collapsed ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "px-2 py-1 text-muted-foreground text-xs", children: section.label }) : null,
2297
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-1", children: section.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
2298
+ "a",
2299
+ {
2300
+ href: item.href,
2301
+ "aria-current": item.active ? "page" : void 0,
2302
+ className: cn(
2303
+ "flex rounded-md px-2 py-2 text-sm transition-colors motion-reduce:transition-none hover:bg-accent hover:text-accent-foreground",
2304
+ item.active && "bg-accent text-accent-foreground"
2305
+ ),
2306
+ children: collapsed ? item.label.slice(0, 1) : item.label
2307
+ }
2308
+ ) }, item.label)) })
2309
+ ] }, section.label ?? i)) })
2310
+ ]
2311
+ }
2312
+ );
2313
+ }
2314
+ function ThemeSwitcher() {
2315
+ const [mounted, setMounted] = react.useState(false);
2316
+ const [palette, setPalette] = react.useState("neutral-slate");
2317
+ const [appearance, setAppearance] = react.useState("system");
2318
+ react.useEffect(() => {
2319
+ setPalette(getStoredPalette());
2320
+ setAppearance(getStoredAppearance());
2321
+ setMounted(true);
2322
+ }, []);
2323
+ react.useEffect(() => {
2324
+ if (mounted) applyPalette(palette);
2325
+ }, [mounted, palette]);
2326
+ react.useEffect(() => {
2327
+ if (!mounted) return;
2328
+ applyAppearance(appearance);
2329
+ if (appearance !== "system") return;
2330
+ const mq = window.matchMedia("(prefers-color-scheme: dark)");
2331
+ const onChange = () => applyAppearance("system");
2332
+ mq.addEventListener("change", onChange);
2333
+ return () => mq.removeEventListener("change", onChange);
2334
+ }, [mounted, appearance]);
2335
+ if (!mounted) {
2336
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": true, className: "h-9" });
2337
+ }
2338
+ const appearances = ["light", "dark", "system"];
2339
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
2340
+ /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
2341
+ "Palette",
2342
+ /* @__PURE__ */ jsxRuntime.jsx(
2343
+ "select",
2344
+ {
2345
+ value: palette,
2346
+ onChange: (e) => setPalette(e.target.value),
2347
+ className: "rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
2348
+ children: uiPalettes.map((p) => /* @__PURE__ */ jsxRuntime.jsxs("option", { value: p.value, children: [
2349
+ p.name,
2350
+ " (",
2351
+ p.category,
2352
+ ")"
2353
+ ] }, p.value))
2354
+ }
2355
+ )
2356
+ ] }),
2357
+ /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { className: "inline-flex rounded-md border border-input p-0.5", children: [
2358
+ /* @__PURE__ */ jsxRuntime.jsx("legend", { className: "sr-only", children: "Appearance" }),
2359
+ appearances.map((a) => /* @__PURE__ */ jsxRuntime.jsx(
2360
+ "button",
2361
+ {
2362
+ type: "button",
2363
+ "aria-pressed": appearance === a,
2364
+ onClick: () => setAppearance(a),
2365
+ className: "rounded px-2.5 py-1 text-sm capitalize transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring " + (appearance === a ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:text-foreground"),
2366
+ children: a
2367
+ },
2368
+ a
2369
+ ))
2370
+ ] })
2371
+ ] });
2372
+ }
2373
+
2374
+ // src/utils/formatters.ts
2375
+ function formatCurrency(value, options = {}) {
2376
+ const {
2377
+ currency = "USD",
2378
+ locale = "en-US",
2379
+ minimumFractionDigits,
2380
+ maximumFractionDigits
2381
+ } = options;
2382
+ return new Intl.NumberFormat(locale, {
2383
+ style: "currency",
2384
+ currency,
2385
+ minimumFractionDigits,
2386
+ maximumFractionDigits
2387
+ }).format(value);
2388
+ }
2389
+ function formatDate(value, options = {}) {
2390
+ const { locale = "en-US", ...dateOptions } = options;
2391
+ const date = value instanceof Date ? value : new Date(value);
2392
+ return new Intl.DateTimeFormat(locale, {
2393
+ dateStyle: "medium",
2394
+ ...dateOptions
2395
+ }).format(date);
2396
+ }
2397
+ function formatNumber(value, options = {}) {
2398
+ const { locale = "en-US", ...numberOptions } = options;
2399
+ return new Intl.NumberFormat(locale, numberOptions).format(value);
2400
+ }
2401
+
2402
+ Object.defineProperty(exports, "toast", {
2403
+ enumerable: true,
2404
+ get: function () { return sonner.toast; }
2405
+ });
2406
+ exports.Accordion = Accordion;
2407
+ exports.AccordionContent = AccordionContent;
2408
+ exports.AccordionItem = AccordionItem;
2409
+ exports.AccordionTrigger = AccordionTrigger;
2410
+ exports.Alert = Alert;
2411
+ exports.AlertDescription = AlertDescription;
2412
+ exports.AlertDialog = AlertDialog;
2413
+ exports.AlertDialogAction = AlertDialogAction;
2414
+ exports.AlertDialogCancel = AlertDialogCancel;
2415
+ exports.AlertDialogContent = AlertDialogContent;
2416
+ exports.AlertDialogDescription = AlertDialogDescription;
2417
+ exports.AlertDialogFooter = AlertDialogFooter;
2418
+ exports.AlertDialogHeader = AlertDialogHeader;
2419
+ exports.AlertDialogTitle = AlertDialogTitle;
2420
+ exports.AlertDialogTrigger = AlertDialogTrigger;
2421
+ exports.AlertTitle = AlertTitle;
2422
+ exports.AspectRatio = AspectRatio;
2423
+ exports.Avatar = Avatar;
2424
+ exports.AvatarFallback = AvatarFallback;
2425
+ exports.AvatarImage = AvatarImage;
2426
+ exports.Badge = Badge;
2427
+ exports.Breadcrumb = Breadcrumb;
2428
+ exports.BreadcrumbEllipsis = BreadcrumbEllipsis;
2429
+ exports.BreadcrumbItem = BreadcrumbItem;
2430
+ exports.BreadcrumbLink = BreadcrumbLink;
2431
+ exports.BreadcrumbList = BreadcrumbList;
2432
+ exports.BreadcrumbPage = BreadcrumbPage;
2433
+ exports.BreadcrumbSeparator = BreadcrumbSeparator;
2434
+ exports.Button = Button;
2435
+ exports.Calendar = Calendar;
2436
+ exports.Card = Card;
2437
+ exports.CardContent = CardContent;
2438
+ exports.CardDescription = CardDescription;
2439
+ exports.CardFooter = CardFooter;
2440
+ exports.CardHeader = CardHeader;
2441
+ exports.CardTitle = CardTitle;
2442
+ exports.Checkbox = Checkbox;
2443
+ exports.Combobox = Combobox;
2444
+ exports.Command = Command;
2445
+ exports.CommandDialog = CommandDialog;
2446
+ exports.CommandEmpty = CommandEmpty;
2447
+ exports.CommandGroup = CommandGroup;
2448
+ exports.CommandInput = CommandInput;
2449
+ exports.CommandItem = CommandItem;
2450
+ exports.CommandList = CommandList;
2451
+ exports.CommandSeparator = CommandSeparator;
2452
+ exports.CommandShortcut = CommandShortcut;
2453
+ exports.DEFAULT_PALETTE = DEFAULT_PALETTE;
2454
+ exports.DataTable = DataTable;
2455
+ exports.DateRangePicker = DateRangePicker;
2456
+ exports.Dialog = Dialog;
2457
+ exports.DialogClose = DialogClose;
2458
+ exports.DialogContent = DialogContent;
2459
+ exports.DialogDescription = DialogDescription;
2460
+ exports.DialogFooter = DialogFooter;
2461
+ exports.DialogHeader = DialogHeader;
2462
+ exports.DialogTitle = DialogTitle;
2463
+ exports.DialogTrigger = DialogTrigger;
2464
+ exports.DropdownMenu = DropdownMenu;
2465
+ exports.DropdownMenuCheckboxItem = DropdownMenuCheckboxItem;
2466
+ exports.DropdownMenuContent = DropdownMenuContent;
2467
+ exports.DropdownMenuItem = DropdownMenuItem;
2468
+ exports.DropdownMenuLabel = DropdownMenuLabel;
2469
+ exports.DropdownMenuRadioGroup = DropdownMenuRadioGroup;
2470
+ exports.DropdownMenuRadioItem = DropdownMenuRadioItem;
2471
+ exports.DropdownMenuSeparator = DropdownMenuSeparator;
2472
+ exports.DropdownMenuShortcut = DropdownMenuShortcut;
2473
+ exports.DropdownMenuTrigger = DropdownMenuTrigger;
2474
+ exports.Form = Form;
2475
+ exports.FormControl = FormControl;
2476
+ exports.FormDescription = FormDescription;
2477
+ exports.FormField = FormField;
2478
+ exports.FormItem = FormItem;
2479
+ exports.FormLabel = FormLabel;
2480
+ exports.FormMessage = FormMessage;
2481
+ exports.Input = Input;
2482
+ exports.Label = Label;
2483
+ exports.NavigationMenu = NavigationMenu;
2484
+ exports.NavigationMenuContent = NavigationMenuContent;
2485
+ exports.NavigationMenuIndicator = NavigationMenuIndicator;
2486
+ exports.NavigationMenuItem = NavigationMenuItem;
2487
+ exports.NavigationMenuLink = NavigationMenuLink;
2488
+ exports.NavigationMenuList = NavigationMenuList;
2489
+ exports.NavigationMenuTrigger = NavigationMenuTrigger;
2490
+ exports.NavigationMenuViewport = NavigationMenuViewport;
2491
+ exports.Pagination = Pagination;
2492
+ exports.PaginationContent = PaginationContent;
2493
+ exports.PaginationEllipsis = PaginationEllipsis;
2494
+ exports.PaginationItem = PaginationItem;
2495
+ exports.PaginationLink = PaginationLink;
2496
+ exports.PaginationNext = PaginationNext;
2497
+ exports.PaginationPrevious = PaginationPrevious;
2498
+ exports.Popover = Popover;
2499
+ exports.PopoverAnchor = PopoverAnchor;
2500
+ exports.PopoverContent = PopoverContent;
2501
+ exports.PopoverTrigger = PopoverTrigger;
2502
+ exports.Progress = Progress;
2503
+ exports.RadioGroup = RadioGroup;
2504
+ exports.RadioGroupItem = RadioGroupItem;
2505
+ exports.ScrollArea = ScrollArea;
2506
+ exports.Select = Select;
2507
+ exports.SelectContent = SelectContent;
2508
+ exports.SelectItem = SelectItem;
2509
+ exports.SelectTrigger = SelectTrigger;
2510
+ exports.Separator = Separator;
2511
+ exports.Sheet = Sheet;
2512
+ exports.SheetClose = SheetClose;
2513
+ exports.SheetContent = SheetContent;
2514
+ exports.SheetDescription = SheetDescription;
2515
+ exports.SheetFooter = SheetFooter;
2516
+ exports.SheetHeader = SheetHeader;
2517
+ exports.SheetTitle = SheetTitle;
2518
+ exports.SheetTrigger = SheetTrigger;
2519
+ exports.Sidebar = Sidebar;
2520
+ exports.Skeleton = Skeleton;
2521
+ exports.Spinner = Spinner;
2522
+ exports.Switch = Switch;
2523
+ exports.Table = Table;
2524
+ exports.TableBody = TableBody;
2525
+ exports.TableCaption = TableCaption;
2526
+ exports.TableCell = TableCell;
2527
+ exports.TableFooter = TableFooter;
2528
+ exports.TableHead = TableHead;
2529
+ exports.TableHeader = TableHeader;
2530
+ exports.TableRow = TableRow;
2531
+ exports.Tabs = Tabs;
2532
+ exports.TabsContent = TabsContent;
2533
+ exports.TabsList = TabsList;
2534
+ exports.TabsTrigger = TabsTrigger;
2535
+ exports.Textarea = Textarea;
2536
+ exports.ThemeSwitcher = ThemeSwitcher;
2537
+ exports.Toaster = Toaster;
2538
+ exports.Tooltip = Tooltip;
2539
+ exports.TooltipContent = TooltipContent;
2540
+ exports.TooltipProvider = TooltipProvider;
2541
+ exports.TooltipTrigger = TooltipTrigger;
2542
+ exports.allFontsHref = allFontsHref;
2543
+ exports.appliers = appliers;
2544
+ exports.applyAppearance = applyAppearance;
2545
+ exports.applyPalette = applyPalette;
2546
+ exports.applyTheme = applyTheme;
2547
+ exports.cn = cn;
2548
+ exports.formatCurrency = formatCurrency;
2549
+ exports.formatDate = formatDate;
2550
+ exports.formatNumber = formatNumber;
2551
+ exports.getStoredAppearance = getStoredAppearance;
2552
+ exports.getStoredPalette = getStoredPalette;
2553
+ exports.getStoredTheme = getStoredTheme;
2554
+ exports.isUiPalette = isUiPalette;
2555
+ exports.isUiTheme = isUiTheme;
2556
+ exports.palettesByCategory = palettesByCategory;
2557
+ exports.uiFontValues = uiFontValues;
2558
+ exports.uiFonts = uiFonts;
2559
+ exports.uiPaletteValues = uiPaletteValues;
2560
+ exports.uiPalettes = uiPalettes;
2561
+ exports.uiThemeLabels = uiThemeLabels;
2562
+ exports.uiThemes = uiThemes;
2563
+ exports.useDebounce = useDebounce;
2564
+ exports.useMediaQuery = useMediaQuery;
2565
+ exports.useTheme = useTheme;
2566
+ //# sourceMappingURL=index.js.map
2567
+ //# sourceMappingURL=index.js.map