@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.
- package/dist/index.d.cts +1445 -0
- package/dist/index.d.ts +1445 -0
- package/dist/index.js +2567 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2366 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +97 -0
- package/src/styles/globals.css +150 -0
- package/src/styles/theme-switcher.tsx +95 -0
- package/src/styles/themes/.gitkeep +0 -0
- package/src/styles/themes/dashboard-data.css +64 -0
- package/src/styles/themes/dashboard-executive.css +64 -0
- package/src/styles/themes/dashboard-glass.css +64 -0
- package/src/styles/themes/dashboard.css +46 -0
- package/src/styles/themes/ecommerce-luxury.css +64 -0
- package/src/styles/themes/ecommerce-minimal.css +64 -0
- package/src/styles/themes/ecommerce-playful.css +64 -0
- package/src/styles/themes/ecommerce.css +36 -0
- package/src/styles/themes/edtech-campus.css +64 -0
- package/src/styles/themes/edtech-kids.css +64 -0
- package/src/styles/themes/edtech-professional.css +64 -0
- package/src/styles/themes/edtech.css +36 -0
- package/src/styles/themes/fintech-crypto.css +64 -0
- package/src/styles/themes/fintech-modern.css +64 -0
- package/src/styles/themes/fintech-wealth.css +64 -0
- package/src/styles/themes/fintech.css +46 -0
- package/src/styles/themes/healthcare-clinical.css +64 -0
- package/src/styles/themes/healthcare-urgent.css +64 -0
- package/src/styles/themes/healthcare-wellness.css +64 -0
- package/src/styles/themes/healthcare.css +46 -0
- package/src/styles/tokens/.gitkeep +0 -0
- package/src/styles/tokens/charts.css +26 -0
- package/src/styles/tokens/dark.css +36 -0
- package/src/styles/tokens/palettes.css +2663 -0
- package/src/styles/tokens/primitives.css +34 -0
- package/src/styles/tokens/semantic.css +35 -0
- 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
|