@modern-admin/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/components/accordion.d.ts +7 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.jsx +19 -0
- package/dist/components/accordion.jsx.map +1 -0
- package/dist/components/alert-dialog.d.ts +22 -0
- package/dist/components/alert-dialog.d.ts.map +1 -0
- package/dist/components/alert-dialog.jsx +27 -0
- package/dist/components/alert-dialog.jsx.map +1 -0
- package/dist/components/audit-timeline.d.ts +24 -0
- package/dist/components/audit-timeline.d.ts.map +1 -0
- package/dist/components/audit-timeline.jsx +60 -0
- package/dist/components/audit-timeline.jsx.map +1 -0
- package/dist/components/avatar.d.ts +6 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.jsx +10 -0
- package/dist/components/avatar.jsx.map +1 -0
- package/dist/components/badge.d.ts +10 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.jsx +19 -0
- package/dist/components/badge.jsx.map +1 -0
- package/dist/components/breadcrumb.d.ts +17 -0
- package/dist/components/breadcrumb.d.ts.map +1 -0
- package/dist/components/breadcrumb.jsx +27 -0
- package/dist/components/breadcrumb.jsx.map +1 -0
- package/dist/components/button.d.ts +12 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.jsx +37 -0
- package/dist/components/button.jsx.map +1 -0
- package/dist/components/calendar.d.ts +9 -0
- package/dist/components/calendar.d.ts.map +1 -0
- package/dist/components/calendar.jsx +102 -0
- package/dist/components/calendar.jsx.map +1 -0
- package/dist/components/card.d.ts +8 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.jsx +18 -0
- package/dist/components/card.jsx.map +1 -0
- package/dist/components/chart.d.ts +97 -0
- package/dist/components/chart.d.ts.map +1 -0
- package/dist/components/chart.jsx +233 -0
- package/dist/components/chart.jsx.map +1 -0
- package/dist/components/checkbox.d.ts +4 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.jsx +11 -0
- package/dist/components/checkbox.jsx.map +1 -0
- package/dist/components/combobox.d.ts +46 -0
- package/dist/components/combobox.d.ts.map +1 -0
- package/dist/components/combobox.jsx +145 -0
- package/dist/components/combobox.jsx.map +1 -0
- package/dist/components/command.d.ts +80 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/command.jsx +32 -0
- package/dist/components/command.jsx.map +1 -0
- package/dist/components/date-picker.d.ts +24 -0
- package/dist/components/date-picker.d.ts.map +1 -0
- package/dist/components/date-picker.jsx +149 -0
- package/dist/components/date-picker.jsx.map +1 -0
- package/dist/components/date-range-input.d.ts +22 -0
- package/dist/components/date-range-input.d.ts.map +1 -0
- package/dist/components/date-range-input.jsx +202 -0
- package/dist/components/date-range-input.jsx.map +1 -0
- package/dist/components/dialog.d.ts +19 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.jsx +30 -0
- package/dist/components/dialog.jsx.map +1 -0
- package/dist/components/diff-view.d.ts +24 -0
- package/dist/components/diff-view.d.ts.map +1 -0
- package/dist/components/diff-view.jsx +69 -0
- package/dist/components/diff-view.jsx.map +1 -0
- package/dist/components/dropdown-menu.d.ts +27 -0
- package/dist/components/dropdown-menu.d.ts.map +1 -0
- package/dist/components/dropdown-menu.jsx +48 -0
- package/dist/components/dropdown-menu.jsx.map +1 -0
- package/dist/components/empty.d.ts +15 -0
- package/dist/components/empty.d.ts.map +1 -0
- package/dist/components/empty.jsx +27 -0
- package/dist/components/empty.jsx.map +1 -0
- package/dist/components/field.d.ts +23 -0
- package/dist/components/field.d.ts.map +1 -0
- package/dist/components/field.jsx +60 -0
- package/dist/components/field.jsx.map +1 -0
- package/dist/components/file-input.d.ts +50 -0
- package/dist/components/file-input.d.ts.map +1 -0
- package/dist/components/file-input.jsx +104 -0
- package/dist/components/file-input.jsx.map +1 -0
- package/dist/components/form.d.ts +20 -0
- package/dist/components/form.d.ts.map +1 -0
- package/dist/components/form.jsx +66 -0
- package/dist/components/form.jsx.map +1 -0
- package/dist/components/info-tooltip.d.ts +11 -0
- package/dist/components/info-tooltip.d.ts.map +1 -0
- package/dist/components/info-tooltip.jsx +17 -0
- package/dist/components/info-tooltip.jsx.map +1 -0
- package/dist/components/input.d.ts +13 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.jsx +19 -0
- package/dist/components/input.jsx.map +1 -0
- package/dist/components/json-editor.d.ts +23 -0
- package/dist/components/json-editor.d.ts.map +1 -0
- package/dist/components/json-editor.jsx +143 -0
- package/dist/components/json-editor.jsx.map +1 -0
- package/dist/components/kbd.d.ts +15 -0
- package/dist/components/kbd.d.ts.map +1 -0
- package/dist/components/kbd.jsx +23 -0
- package/dist/components/kbd.jsx.map +1 -0
- package/dist/components/key-value-editor.d.ts +92 -0
- package/dist/components/key-value-editor.d.ts.map +1 -0
- package/dist/components/key-value-editor.jsx +187 -0
- package/dist/components/key-value-editor.jsx.map +1 -0
- package/dist/components/keyboard-shortcuts-help.d.ts +17 -0
- package/dist/components/keyboard-shortcuts-help.d.ts.map +1 -0
- package/dist/components/keyboard-shortcuts-help.jsx +97 -0
- package/dist/components/keyboard-shortcuts-help.jsx.map +1 -0
- package/dist/components/label.d.ts +5 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/label.jsx +8 -0
- package/dist/components/label.jsx.map +1 -0
- package/dist/components/media-preview.d.ts +30 -0
- package/dist/components/media-preview.d.ts.map +1 -0
- package/dist/components/media-preview.jsx +189 -0
- package/dist/components/media-preview.jsx.map +1 -0
- package/dist/components/multi-file-input.d.ts +76 -0
- package/dist/components/multi-file-input.d.ts.map +1 -0
- package/dist/components/multi-file-input.jsx +131 -0
- package/dist/components/multi-file-input.jsx.map +1 -0
- package/dist/components/password-input.d.ts +10 -0
- package/dist/components/password-input.d.ts.map +1 -0
- package/dist/components/password-input.jsx +18 -0
- package/dist/components/password-input.jsx.map +1 -0
- package/dist/components/popover.d.ts +7 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.jsx +11 -0
- package/dist/components/popover.jsx.map +1 -0
- package/dist/components/revision-timeline.d.ts +30 -0
- package/dist/components/revision-timeline.d.ts.map +1 -0
- package/dist/components/revision-timeline.jsx +42 -0
- package/dist/components/revision-timeline.jsx.map +1 -0
- package/dist/components/richtext-editor.d.ts +43 -0
- package/dist/components/richtext-editor.d.ts.map +1 -0
- package/dist/components/richtext-editor.jsx +319 -0
- package/dist/components/richtext-editor.jsx.map +1 -0
- package/dist/components/richtext-mode.d.ts +23 -0
- package/dist/components/richtext-mode.d.ts.map +1 -0
- package/dist/components/richtext-mode.js +36 -0
- package/dist/components/richtext-mode.js.map +1 -0
- package/dist/components/richtext-render.d.ts +8 -0
- package/dist/components/richtext-render.d.ts.map +1 -0
- package/dist/components/richtext-render.jsx +33 -0
- package/dist/components/richtext-render.jsx.map +1 -0
- package/dist/components/richtext-sync.d.ts +37 -0
- package/dist/components/richtext-sync.d.ts.map +1 -0
- package/dist/components/richtext-sync.js +46 -0
- package/dist/components/richtext-sync.js.map +1 -0
- package/dist/components/scroll-area.d.ts +5 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/scroll-area.jsx +16 -0
- package/dist/components/scroll-area.jsx.map +1 -0
- package/dist/components/select.d.ts +36 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.jsx +87 -0
- package/dist/components/select.jsx.map +1 -0
- package/dist/components/separator.d.ts +4 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.jsx +6 -0
- package/dist/components/separator.jsx.map +1 -0
- package/dist/components/sheet.d.ts +29 -0
- package/dist/components/sheet.d.ts.map +1 -0
- package/dist/components/sheet.jsx +44 -0
- package/dist/components/sheet.jsx.map +1 -0
- package/dist/components/sidebar.d.ts +70 -0
- package/dist/components/sidebar.d.ts.map +1 -0
- package/dist/components/sidebar.jsx +245 -0
- package/dist/components/sidebar.jsx.map +1 -0
- package/dist/components/skeleton.d.ts +3 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.jsx +6 -0
- package/dist/components/skeleton.jsx.map +1 -0
- package/dist/components/sonner.d.ts +6 -0
- package/dist/components/sonner.d.ts.map +1 -0
- package/dist/components/sonner.jsx +29 -0
- package/dist/components/sonner.jsx.map +1 -0
- package/dist/components/switch.d.ts +4 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.jsx +8 -0
- package/dist/components/switch.jsx.map +1 -0
- package/dist/components/table.d.ts +10 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.jsx +21 -0
- package/dist/components/table.jsx.map +1 -0
- package/dist/components/tabs.d.ts +7 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.jsx +14 -0
- package/dist/components/tabs.jsx.map +1 -0
- package/dist/components/textarea.d.ts +4 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.jsx +5 -0
- package/dist/components/textarea.jsx.map +1 -0
- package/dist/components/tooltip.d.ts +7 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.jsx +11 -0
- package/dist/components/tooltip.jsx.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/theme.d.ts +11 -0
- package/dist/lib/theme.d.ts.map +1 -0
- package/dist/lib/theme.js +44 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/styles.css +242 -0
- package/package.json +85 -0
- package/src/components/accordion.tsx +48 -0
- package/src/components/alert-dialog.tsx +113 -0
- package/src/components/audit-timeline.tsx +102 -0
- package/src/components/avatar.tsx +42 -0
- package/src/components/badge.tsx +34 -0
- package/src/components/breadcrumb.tsx +99 -0
- package/src/components/button.tsx +58 -0
- package/src/components/calendar.tsx +176 -0
- package/src/components/card.tsx +60 -0
- package/src/components/chart.tsx +558 -0
- package/src/components/checkbox.tsx +23 -0
- package/src/components/combobox.tsx +264 -0
- package/src/components/command.tsx +120 -0
- package/src/components/date-picker.tsx +221 -0
- package/src/components/date-range-input.tsx +295 -0
- package/src/components/dialog.tsx +94 -0
- package/src/components/diff-view.tsx +182 -0
- package/src/components/dropdown-menu.tsx +165 -0
- package/src/components/empty.tsx +100 -0
- package/src/components/field.tsx +168 -0
- package/src/components/file-input.tsx +233 -0
- package/src/components/form.tsx +152 -0
- package/src/components/info-tooltip.tsx +40 -0
- package/src/components/input.tsx +55 -0
- package/src/components/json-editor.tsx +210 -0
- package/src/components/kbd.tsx +35 -0
- package/src/components/key-value-editor.tsx +423 -0
- package/src/components/keyboard-shortcuts-help.tsx +136 -0
- package/src/components/label.tsx +16 -0
- package/src/components/media-preview.tsx +278 -0
- package/src/components/multi-file-input.tsx +315 -0
- package/src/components/password-input.tsx +50 -0
- package/src/components/popover.tsx +26 -0
- package/src/components/revision-timeline.tsx +93 -0
- package/src/components/richtext-editor.tsx +624 -0
- package/src/components/richtext-mode.ts +39 -0
- package/src/components/richtext-render.tsx +51 -0
- package/src/components/richtext-sync.ts +57 -0
- package/src/components/scroll-area.tsx +41 -0
- package/src/components/select.tsx +200 -0
- package/src/components/separator.tsx +21 -0
- package/src/components/sheet.tsx +109 -0
- package/src/components/sidebar.tsx +660 -0
- package/src/components/skeleton.tsx +9 -0
- package/src/components/sonner.tsx +45 -0
- package/src/components/switch.tsx +24 -0
- package/src/components/table.tsx +93 -0
- package/src/components/tabs.tsx +57 -0
- package/src/components/textarea.tsx +18 -0
- package/src/components/tooltip.tsx +25 -0
- package/src/index.ts +342 -0
- package/src/lib/theme.ts +45 -0
- package/src/lib/utils.ts +6 -0
- package/src/styles.css +242 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.jsx","sourceRoot":"","sources":["../../src/components/dialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface DiffField {
|
|
3
|
+
path: string;
|
|
4
|
+
/** Human-readable property label. When present, shown before the path. */
|
|
5
|
+
label?: string;
|
|
6
|
+
before?: unknown;
|
|
7
|
+
after?: unknown;
|
|
8
|
+
kind: 'added' | 'changed' | 'removed';
|
|
9
|
+
}
|
|
10
|
+
export interface DiffViewLabels {
|
|
11
|
+
added?: string;
|
|
12
|
+
changed?: string;
|
|
13
|
+
removed?: string;
|
|
14
|
+
before?: string;
|
|
15
|
+
after?: string;
|
|
16
|
+
noChanges?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface DiffViewProps {
|
|
19
|
+
fields: ReadonlyArray<DiffField>;
|
|
20
|
+
labels?: DiffViewLabels;
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function DiffView({ fields, labels, className }: DiffViewProps): React.ReactElement;
|
|
24
|
+
//# sourceMappingURL=diff-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-view.d.ts","sourceRoot":"","sources":["../../src/components/diff-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAA;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAoBD,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CAqBzF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { cn } from '../lib/utils.js';
|
|
3
|
+
const DEFAULT_LABELS = {
|
|
4
|
+
added: 'Added',
|
|
5
|
+
changed: 'Changed',
|
|
6
|
+
removed: 'Removed',
|
|
7
|
+
before: 'Before',
|
|
8
|
+
after: 'After',
|
|
9
|
+
noChanges: 'No changes',
|
|
10
|
+
};
|
|
11
|
+
const formatValue = (value) => {
|
|
12
|
+
if (value === undefined)
|
|
13
|
+
return '';
|
|
14
|
+
if (value === null)
|
|
15
|
+
return 'null';
|
|
16
|
+
if (typeof value === 'string')
|
|
17
|
+
return value;
|
|
18
|
+
return JSON.stringify(value, null, 2);
|
|
19
|
+
};
|
|
20
|
+
const isMultiline = (text) => text.includes('\n') || text.length > 80;
|
|
21
|
+
export function DiffView({ fields, labels, className }) {
|
|
22
|
+
const l = { ...DEFAULT_LABELS, ...labels };
|
|
23
|
+
if (fields.length === 0) {
|
|
24
|
+
return (<div className={cn('rounded-md border border-dashed p-4 text-sm text-muted-foreground', className)}>
|
|
25
|
+
{l.noChanges}
|
|
26
|
+
</div>);
|
|
27
|
+
}
|
|
28
|
+
return (<ul className={cn('divide-y divide-border overflow-hidden rounded-md border bg-card text-xs', className)}>
|
|
29
|
+
{fields.map((field) => (<FieldDiff key={field.path} field={field} labels={l}/>))}
|
|
30
|
+
</ul>);
|
|
31
|
+
}
|
|
32
|
+
function FieldDiff({ field, labels, }) {
|
|
33
|
+
const beforeText = field.kind === 'added' ? '' : formatValue(field.before);
|
|
34
|
+
const afterText = field.kind === 'removed' ? '' : formatValue(field.after);
|
|
35
|
+
const compact = !isMultiline(beforeText) && !isMultiline(afterText);
|
|
36
|
+
return (<li className="grid grid-cols-[8rem_1fr] gap-x-3 px-3 py-1.5 sm:grid-cols-[10rem_1fr]">
|
|
37
|
+
<div className="min-w-0 pt-0.5">
|
|
38
|
+
{field.label && (<p className="truncate text-[11px] font-medium text-foreground" title={field.label}>
|
|
39
|
+
{field.label}
|
|
40
|
+
</p>)}
|
|
41
|
+
<code className="truncate font-mono text-[10px] text-muted-foreground" title={field.path}>
|
|
42
|
+
{field.path}
|
|
43
|
+
</code>
|
|
44
|
+
</div>
|
|
45
|
+
{compact ? (<CompactValues kind={field.kind} before={beforeText} after={afterText} labels={labels}/>) : (<StackedValues kind={field.kind} before={beforeText} after={afterText} labels={labels}/>)}
|
|
46
|
+
</li>);
|
|
47
|
+
}
|
|
48
|
+
function CompactValues({ kind, before, after, labels, }) {
|
|
49
|
+
return (<div className="flex min-w-0 flex-col gap-0.5 font-mono text-xs leading-5">
|
|
50
|
+
{kind !== 'added' && (<span aria-label={labels.before} className="truncate rounded bg-red-50 px-1.5 text-red-900 line-through decoration-red-400/60 dark:bg-red-950/40 dark:text-red-100" title={before}>
|
|
51
|
+
{before || '\u00A0'}
|
|
52
|
+
</span>)}
|
|
53
|
+
{kind !== 'removed' && (<span aria-label={labels.after} className="truncate rounded bg-green-50 px-1.5 text-green-900 dark:bg-green-950/40 dark:text-green-100" title={after}>
|
|
54
|
+
{after || '\u00A0'}
|
|
55
|
+
</span>)}
|
|
56
|
+
</div>);
|
|
57
|
+
}
|
|
58
|
+
function StackedValues({ kind, before, after, labels, }) {
|
|
59
|
+
return (<div className="min-w-0 overflow-hidden rounded font-mono text-xs leading-5">
|
|
60
|
+
{kind !== 'added' && (<pre aria-label={labels.before} className="overflow-x-auto whitespace-pre-wrap bg-red-50 px-2 py-0.5 text-red-900 dark:bg-red-950/40 dark:text-red-100">
|
|
61
|
+
{prefixed('-', before)}
|
|
62
|
+
</pre>)}
|
|
63
|
+
{kind !== 'removed' && (<pre aria-label={labels.after} className="overflow-x-auto whitespace-pre-wrap bg-green-50 px-2 py-0.5 text-green-900 dark:bg-green-950/40 dark:text-green-100">
|
|
64
|
+
{prefixed('+', after)}
|
|
65
|
+
</pre>)}
|
|
66
|
+
</div>);
|
|
67
|
+
}
|
|
68
|
+
const prefixed = (sign, text) => text.split('\n').map((l) => `${sign} ${l}`).join('\n');
|
|
69
|
+
//# sourceMappingURL=diff-view.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-view.jsx","sourceRoot":"","sources":["../../src/components/diff-view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
3
|
+
export declare const DropdownMenu: React.FC<DropdownMenuPrimitive.DropdownMenuProps>;
|
|
4
|
+
export declare const DropdownMenuTrigger: React.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
5
|
+
export declare const DropdownMenuGroup: React.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuGroupProps & React.RefAttributes<HTMLDivElement>>;
|
|
6
|
+
export declare const DropdownMenuPortal: React.FC<DropdownMenuPrimitive.DropdownMenuPortalProps>;
|
|
7
|
+
export declare const DropdownMenuSub: React.FC<DropdownMenuPrimitive.DropdownMenuSubProps>;
|
|
8
|
+
export declare const DropdownMenuRadioGroup: React.ForwardRefExoticComponent<DropdownMenuPrimitive.DropdownMenuRadioGroupProps & React.RefAttributes<HTMLDivElement>>;
|
|
9
|
+
export declare const DropdownMenuSubTrigger: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubTriggerProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
|
|
10
|
+
inset?: boolean;
|
|
11
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
12
|
+
export declare const DropdownMenuSubContent: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSubContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
13
|
+
export declare const DropdownMenuContent: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
14
|
+
export declare const DropdownMenuItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
|
|
15
|
+
inset?: boolean;
|
|
16
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
17
|
+
export declare const DropdownMenuCheckboxItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuCheckboxItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
18
|
+
export declare const DropdownMenuRadioItem: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuRadioItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
19
|
+
export declare const DropdownMenuLabel: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & {
|
|
20
|
+
inset?: boolean;
|
|
21
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
22
|
+
export declare const DropdownMenuSeparator: React.ForwardRefExoticComponent<Omit<DropdownMenuPrimitive.DropdownMenuSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
23
|
+
export declare const DropdownMenuShortcut: {
|
|
24
|
+
({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>): React.ReactElement;
|
|
25
|
+
displayName: string;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=dropdown-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropdown-menu.d.ts","sourceRoot":"","sources":["../../src/components/dropdown-menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,qBAAqB,MAAM,+BAA+B,CAAA;AAItE,eAAO,MAAM,YAAY,mDAA6B,CAAA;AACtD,eAAO,MAAM,mBAAmB,0HAAgC,CAAA;AAChE,eAAO,MAAM,iBAAiB,qHAA8B,CAAA;AAC5D,eAAO,MAAM,kBAAkB,yDAA+B,CAAA;AAC9D,eAAO,MAAM,eAAe,sDAA4B,CAAA;AACxD,eAAO,MAAM,sBAAsB,0HAAmC,CAAA;AAEtE,eAAO,MAAM,sBAAsB;YAGvB,OAAO;wCAejB,CAAA;AAGF,eAAO,MAAM,sBAAsB,6KAYjC,CAAA;AAGF,eAAO,MAAM,mBAAmB,0KAe9B,CAAA;AAGF,eAAO,MAAM,gBAAgB;YAGjB,OAAO;wCAYjB,CAAA;AAGF,eAAO,MAAM,wBAAwB,+KAoBnC,CAAA;AAGF,eAAO,MAAM,qBAAqB,4KAmBhC,CAAA;AAGF,eAAO,MAAM,iBAAiB;YAGlB,OAAO;wCAQjB,CAAA;AAGF,eAAO,MAAM,qBAAqB,4KAShC,CAAA;AAGF,eAAO,MAAM,oBAAoB;8BAG9B,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,YAAY;;CAK5D,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
3
|
+
import { Check, ChevronRight, Circle } from 'lucide-react';
|
|
4
|
+
import { cn } from '../lib/utils.js';
|
|
5
|
+
export const DropdownMenu = DropdownMenuPrimitive.Root;
|
|
6
|
+
export const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
|
|
7
|
+
export const DropdownMenuGroup = DropdownMenuPrimitive.Group;
|
|
8
|
+
export const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
|
|
9
|
+
export const DropdownMenuSub = DropdownMenuPrimitive.Sub;
|
|
10
|
+
export const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
|
|
11
|
+
export const DropdownMenuSubTrigger = React.forwardRef(({ className, inset, children, ...props }, ref) => (<DropdownMenuPrimitive.SubTrigger ref={ref} className={cn('flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent', inset && 'pl-8', className)} {...props}>
|
|
12
|
+
{children}
|
|
13
|
+
<ChevronRight className="ml-auto h-4 w-4"/>
|
|
14
|
+
</DropdownMenuPrimitive.SubTrigger>));
|
|
15
|
+
DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
|
|
16
|
+
export const DropdownMenuSubContent = React.forwardRef(({ className, ...props }, ref) => (<DropdownMenuPrimitive.SubContent ref={ref} className={cn('z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2', className)} {...props}/>));
|
|
17
|
+
DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
|
|
18
|
+
export const DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (<DropdownMenuPrimitive.Portal>
|
|
19
|
+
<DropdownMenuPrimitive.Content ref={ref} sideOffset={sideOffset} className={cn('z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2', className)} {...props}/>
|
|
20
|
+
</DropdownMenuPrimitive.Portal>));
|
|
21
|
+
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
|
|
22
|
+
export const DropdownMenuItem = React.forwardRef(({ className, inset, ...props }, ref) => (<DropdownMenuPrimitive.Item ref={ref} className={cn('relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', inset && 'pl-8', className)} {...props}/>));
|
|
23
|
+
DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
|
|
24
|
+
export const DropdownMenuCheckboxItem = React.forwardRef(({ className, children, checked, ...props }, ref) => (<DropdownMenuPrimitive.CheckboxItem ref={ref} className={cn('relative flex cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', className)} checked={checked} {...props}>
|
|
25
|
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
26
|
+
<DropdownMenuPrimitive.ItemIndicator>
|
|
27
|
+
<Check className="h-4 w-4"/>
|
|
28
|
+
</DropdownMenuPrimitive.ItemIndicator>
|
|
29
|
+
</span>
|
|
30
|
+
{children}
|
|
31
|
+
</DropdownMenuPrimitive.CheckboxItem>));
|
|
32
|
+
DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
|
|
33
|
+
export const DropdownMenuRadioItem = React.forwardRef(({ className, children, ...props }, ref) => (<DropdownMenuPrimitive.RadioItem ref={ref} className={cn('relative flex cursor-pointer select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50', className)} {...props}>
|
|
34
|
+
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
|
35
|
+
<DropdownMenuPrimitive.ItemIndicator>
|
|
36
|
+
<Circle className="h-2 w-2 fill-current"/>
|
|
37
|
+
</DropdownMenuPrimitive.ItemIndicator>
|
|
38
|
+
</span>
|
|
39
|
+
{children}
|
|
40
|
+
</DropdownMenuPrimitive.RadioItem>));
|
|
41
|
+
DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
|
|
42
|
+
export const DropdownMenuLabel = React.forwardRef(({ className, inset, ...props }, ref) => (<DropdownMenuPrimitive.Label ref={ref} className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)} {...props}/>));
|
|
43
|
+
DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
|
|
44
|
+
export const DropdownMenuSeparator = React.forwardRef(({ className, ...props }, ref) => (<DropdownMenuPrimitive.Separator ref={ref} className={cn('-mx-1 my-1 h-px bg-muted', className)} {...props}/>));
|
|
45
|
+
DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
|
|
46
|
+
export const DropdownMenuShortcut = ({ className, ...props }) => (<span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props}/>);
|
|
47
|
+
DropdownMenuShortcut.displayName = 'DropdownMenuShortcut';
|
|
48
|
+
//# sourceMappingURL=dropdown-menu.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropdown-menu.jsx","sourceRoot":"","sources":["../../src/components/dropdown-menu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
3
|
+
export declare const Empty: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
4
|
+
export declare const EmptyHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
5
|
+
declare const emptyMediaVariants: (props?: ({
|
|
6
|
+
variant?: "default" | "icon" | null | undefined;
|
|
7
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
8
|
+
export interface EmptyMediaProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof emptyMediaVariants> {
|
|
9
|
+
}
|
|
10
|
+
export declare const EmptyMedia: React.ForwardRefExoticComponent<EmptyMediaProps & React.RefAttributes<HTMLDivElement>>;
|
|
11
|
+
export declare const EmptyTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLHeadingElement>>;
|
|
12
|
+
export declare const EmptyDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
|
|
13
|
+
export declare const EmptyContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=empty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"empty.d.ts","sourceRoot":"","sources":["../../src/components/empty.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAGjE,eAAO,MAAM,KAAK,6GAYjB,CAAA;AAGD,eAAO,MAAM,WAAW,6GASvB,CAAA;AAGD,QAAA,MAAM,kBAAkB;;8EAWvB,CAAA;AAED,MAAM,WAAW,eACf,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAC1C,YAAY,CAAC,OAAO,kBAAkB,CAAC;CAAG;AAE9C,eAAO,MAAM,UAAU,wFAStB,CAAA;AAGD,eAAO,MAAM,UAAU,qHAUrB,CAAA;AAGF,eAAO,MAAM,gBAAgB,yHAU3B,CAAA;AAGF,eAAO,MAAM,YAAY,6GASxB,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// shadcn-style Empty — placeholder for empty states.
|
|
2
|
+
// Compose: <Empty><EmptyHeader><EmptyMedia/><EmptyTitle/><EmptyDescription/></EmptyHeader><EmptyContent>…</EmptyContent></Empty>
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { cn } from '../lib/utils.js';
|
|
6
|
+
export const Empty = React.forwardRef(({ className, ...props }, ref) => (<div ref={ref} data-slot="empty" className={cn('flex w-full flex-col items-center justify-center gap-6 rounded-lg border border-dashed border-border bg-card/40 p-8 text-center', className)} {...props}/>));
|
|
7
|
+
Empty.displayName = 'Empty';
|
|
8
|
+
export const EmptyHeader = React.forwardRef(({ className, ...props }, ref) => (<div ref={ref} data-slot="empty-header" className={cn('flex flex-col items-center gap-3 text-center', className)} {...props}/>));
|
|
9
|
+
EmptyHeader.displayName = 'EmptyHeader';
|
|
10
|
+
const emptyMediaVariants = cva('flex shrink-0 items-center justify-center [&>svg]:size-6', {
|
|
11
|
+
variants: {
|
|
12
|
+
variant: {
|
|
13
|
+
default: 'text-muted-foreground',
|
|
14
|
+
icon: 'flex size-12 items-center justify-center rounded-full bg-muted text-muted-foreground [&>svg]:size-6',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
defaultVariants: { variant: 'icon' },
|
|
18
|
+
});
|
|
19
|
+
export const EmptyMedia = React.forwardRef(({ className, variant, ...props }, ref) => (<div ref={ref} data-slot="empty-media" className={cn(emptyMediaVariants({ variant }), className)} {...props}/>));
|
|
20
|
+
EmptyMedia.displayName = 'EmptyMedia';
|
|
21
|
+
export const EmptyTitle = React.forwardRef(({ className, ...props }, ref) => (<h3 ref={ref} data-slot="empty-title" className={cn('text-base font-semibold tracking-tight', className)} {...props}/>));
|
|
22
|
+
EmptyTitle.displayName = 'EmptyTitle';
|
|
23
|
+
export const EmptyDescription = React.forwardRef(({ className, ...props }, ref) => (<p ref={ref} data-slot="empty-description" className={cn('max-w-sm text-sm text-muted-foreground', className)} {...props}/>));
|
|
24
|
+
EmptyDescription.displayName = 'EmptyDescription';
|
|
25
|
+
export const EmptyContent = React.forwardRef(({ className, ...props }, ref) => (<div ref={ref} data-slot="empty-content" className={cn('flex flex-wrap items-center justify-center gap-2', className)} {...props}/>));
|
|
26
|
+
EmptyContent.displayName = 'EmptyContent';
|
|
27
|
+
//# sourceMappingURL=empty.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"empty.jsx","sourceRoot":"","sources":["../../src/components/empty.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
3
|
+
declare const fieldVariants: (props?: ({
|
|
4
|
+
orientation?: "horizontal" | "vertical" | "responsive" | null | undefined;
|
|
5
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
|
+
export interface FieldProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof fieldVariants> {
|
|
7
|
+
/** Render with a custom element via Radix Slot. */
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const Field: React.ForwardRefExoticComponent<FieldProps & React.RefAttributes<HTMLDivElement>>;
|
|
11
|
+
export declare const FieldLabel: React.ForwardRefExoticComponent<Omit<Omit<import("@radix-ui/react-label").LabelProps & React.RefAttributes<HTMLLabelElement>, "ref"> & VariantProps<(props?: import("class-variance-authority/types").ClassProp | undefined) => string> & React.RefAttributes<HTMLLabelElement>, "ref"> & React.RefAttributes<HTMLLabelElement>>;
|
|
12
|
+
export declare const FieldDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
|
|
13
|
+
export declare const FieldError: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & {
|
|
14
|
+
errors?: ReadonlyArray<string | undefined>;
|
|
15
|
+
} & React.RefAttributes<HTMLParagraphElement>>;
|
|
16
|
+
export declare const FieldGroup: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
17
|
+
export declare const FieldSet: React.ForwardRefExoticComponent<React.FieldsetHTMLAttributes<HTMLFieldSetElement> & React.RefAttributes<HTMLFieldSetElement>>;
|
|
18
|
+
export declare const FieldLegend: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLLegendElement> & React.RefAttributes<HTMLLegendElement>>;
|
|
19
|
+
export declare const FieldSeparator: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
20
|
+
/** Wrapper for label + description + control + error stacked vertically. */
|
|
21
|
+
export declare const FieldContent: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/components/field.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIjE,QAAA,MAAM,aAAa;;8EASjB,CAAA;AAEF,MAAM,WAAW,UACf,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAC1C,YAAY,CAAC,OAAO,aAAa,CAAC;IACpC,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,eAAO,MAAM,KAAK,mFAajB,CAAA;AAGD,eAAO,MAAM,UAAU,kUAarB,CAAA;AAGF,eAAO,MAAM,gBAAgB,yHAU3B,CAAA;AAGF,eAAO,MAAM,UAAU;aAEmC,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC;8CAezF,CAAA;AAGF,eAAO,MAAM,UAAU,6GAUtB,CAAA;AAGD,eAAO,MAAM,QAAQ,+HASpB,CAAA;AAGD,eAAO,MAAM,WAAW,mHAUtB,CAAA;AAGF,eAAO,MAAM,cAAc,6GAW1B,CAAA;AAGD,4EAA4E;AAC5E,eAAO,MAAM,YAAY,6GASxB,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// shadcn-style Field — composable form-field layout primitives.
|
|
2
|
+
// Pure layout; no react-hook-form binding here. Pair with FormField from
|
|
3
|
+
// `./form.js` when wiring to RHF, or use standalone for lightweight forms.
|
|
4
|
+
//
|
|
5
|
+
// Conventions match the canonical shadcn `field` recipe:
|
|
6
|
+
// <Field>
|
|
7
|
+
// <FieldLabel>…</FieldLabel>
|
|
8
|
+
// <Input />
|
|
9
|
+
// <FieldDescription>…</FieldDescription>
|
|
10
|
+
// <FieldError>…</FieldError>
|
|
11
|
+
// </Field>
|
|
12
|
+
//
|
|
13
|
+
// <FieldGroup>…</FieldGroup>
|
|
14
|
+
// <FieldSet><FieldLegend/><FieldGroup/></FieldSet>
|
|
15
|
+
import * as React from 'react';
|
|
16
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
17
|
+
import { cva } from 'class-variance-authority';
|
|
18
|
+
import { cn } from '../lib/utils.js';
|
|
19
|
+
import { Label } from './label.js';
|
|
20
|
+
const fieldVariants = cva('group/field flex w-full', {
|
|
21
|
+
variants: {
|
|
22
|
+
orientation: {
|
|
23
|
+
vertical: 'flex-col gap-2',
|
|
24
|
+
horizontal: 'flex-row items-center gap-3',
|
|
25
|
+
responsive: 'flex-col gap-2 sm:flex-row sm:items-center sm:gap-3',
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
defaultVariants: { orientation: 'vertical' },
|
|
29
|
+
});
|
|
30
|
+
export const Field = React.forwardRef(({ className, orientation, asChild, ...props }, ref) => {
|
|
31
|
+
const Comp = asChild ? Slot : 'div';
|
|
32
|
+
return (<Comp ref={ref} data-slot="field" data-orientation={orientation ?? 'vertical'} className={cn(fieldVariants({ orientation }), className)} {...props}/>);
|
|
33
|
+
});
|
|
34
|
+
Field.displayName = 'Field';
|
|
35
|
+
export const FieldLabel = React.forwardRef(({ className, ...props }, ref) => (<Label ref={ref} data-slot="field-label" className={cn('group-data-[invalid=true]/field:text-destructive flex items-center gap-2 text-sm font-medium leading-none', className)} {...props}/>));
|
|
36
|
+
FieldLabel.displayName = 'FieldLabel';
|
|
37
|
+
export const FieldDescription = React.forwardRef(({ className, ...props }, ref) => (<p ref={ref} data-slot="field-description" className={cn('text-sm text-muted-foreground leading-snug', className)} {...props}/>));
|
|
38
|
+
FieldDescription.displayName = 'FieldDescription';
|
|
39
|
+
export const FieldError = React.forwardRef(({ className, children, errors, ...props }, ref) => {
|
|
40
|
+
const list = errors?.filter((e) => Boolean(e));
|
|
41
|
+
const body = list && list.length > 0 ? list.join(', ') : children;
|
|
42
|
+
if (!body)
|
|
43
|
+
return null;
|
|
44
|
+
return (<p ref={ref} data-slot="field-error" className={cn('text-sm font-medium text-destructive', className)} {...props}>
|
|
45
|
+
{body}
|
|
46
|
+
</p>);
|
|
47
|
+
});
|
|
48
|
+
FieldError.displayName = 'FieldError';
|
|
49
|
+
export const FieldGroup = React.forwardRef(({ className, ...props }, ref) => (<div ref={ref} data-slot="field-group" role="group" className={cn('flex flex-col gap-5', className)} {...props}/>));
|
|
50
|
+
FieldGroup.displayName = 'FieldGroup';
|
|
51
|
+
export const FieldSet = React.forwardRef(({ className, ...props }, ref) => (<fieldset ref={ref} data-slot="field-set" className={cn('flex flex-col gap-4 rounded-lg border border-border p-4', className)} {...props}/>));
|
|
52
|
+
FieldSet.displayName = 'FieldSet';
|
|
53
|
+
export const FieldLegend = React.forwardRef(({ className, ...props }, ref) => (<legend ref={ref} data-slot="field-legend" className={cn('px-1 text-sm font-medium leading-none', className)} {...props}/>));
|
|
54
|
+
FieldLegend.displayName = 'FieldLegend';
|
|
55
|
+
export const FieldSeparator = React.forwardRef(({ className, ...props }, ref) => (<div ref={ref} data-slot="field-separator" role="separator" aria-orientation="horizontal" className={cn('h-px w-full bg-border', className)} {...props}/>));
|
|
56
|
+
FieldSeparator.displayName = 'FieldSeparator';
|
|
57
|
+
/** Wrapper for label + description + control + error stacked vertically. */
|
|
58
|
+
export const FieldContent = React.forwardRef(({ className, ...props }, ref) => (<div ref={ref} data-slot="field-content" className={cn('flex min-w-0 flex-col gap-1.5', className)} {...props}/>));
|
|
59
|
+
FieldContent.displayName = 'FieldContent';
|
|
60
|
+
//# sourceMappingURL=field.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field.jsx","sourceRoot":"","sources":["../../src/components/field.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileInput — styled file picker with optional drag-and-drop, current-file
|
|
3
|
+
* display, and a remove button. Purely presentational: upload logic lives in
|
|
4
|
+
* the `packages/react` property renderer.
|
|
5
|
+
*
|
|
6
|
+
* Mobile-first: full-width by default, tap-friendly hit areas.
|
|
7
|
+
*/
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
export interface FileInputLabels {
|
|
10
|
+
/** Dropzone aria-label. Default: "Choose file". */
|
|
11
|
+
chooseFile?: string;
|
|
12
|
+
/** Drop zone hint before the link. Default: "Drag and drop or". */
|
|
13
|
+
dragAndDrop?: string;
|
|
14
|
+
/** Link text when no file selected. Default: "choose a file". */
|
|
15
|
+
chooseAFile?: string;
|
|
16
|
+
/** Upload spinner text (no filename). Default: "Uploading…". */
|
|
17
|
+
uploading?: string;
|
|
18
|
+
/** Upload spinner text with filename — `{name}` is replaced. Default: "Uploading {name}…". */
|
|
19
|
+
uploadingFile?: string;
|
|
20
|
+
/** Remove button aria-label. Default: "Remove file". */
|
|
21
|
+
removeFile?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface FileInputProps {
|
|
24
|
+
/** Current stored value (storage key or URL). Shown as the "current file". */
|
|
25
|
+
value?: string | null;
|
|
26
|
+
/** Human-readable display name for the current file. Falls back to `value`. */
|
|
27
|
+
displayName?: string | null;
|
|
28
|
+
/** Public URL used for image thumbnail previews. */
|
|
29
|
+
previewUrl?: string | null;
|
|
30
|
+
/** HTML `accept` attribute (e.g. `'image/*'` or `'.pdf,.docx'`). */
|
|
31
|
+
accept?: string;
|
|
32
|
+
/** Whether a file is currently being uploaded. Shows a spinner. */
|
|
33
|
+
uploading?: boolean;
|
|
34
|
+
/** Upload progress 0–100 (overrides the spinner with a determinate bar when set). */
|
|
35
|
+
uploadProgress?: number;
|
|
36
|
+
/** Local file name shown next to the progress indicator. */
|
|
37
|
+
uploadingName?: string;
|
|
38
|
+
/** Upload error message. */
|
|
39
|
+
error?: string;
|
|
40
|
+
disabled?: boolean;
|
|
41
|
+
className?: string;
|
|
42
|
+
/** Translated UI labels. All optional — English strings are the defaults. */
|
|
43
|
+
labels?: FileInputLabels;
|
|
44
|
+
/** Called when the user picks a new file. */
|
|
45
|
+
onFileSelect: (file: File) => void;
|
|
46
|
+
/** Called when the user removes the current file. */
|
|
47
|
+
onRemove?: () => void;
|
|
48
|
+
}
|
|
49
|
+
export declare function FileInput({ value, displayName, previewUrl, accept, uploading, uploadProgress, uploadingName, error, disabled, className, labels, onFileSelect, onRemove, }: FileInputProps): React.ReactElement;
|
|
50
|
+
//# sourceMappingURL=file-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-input.d.ts","sourceRoot":"","sources":["../../src/components/file-input.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8FAA8F;IAC9F,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mEAAmE;IACnE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,6CAA6C;IAC7C,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAClC,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,WAAW,EACX,UAAU,EACV,MAAM,EACN,SAAiB,EACjB,cAAc,EACd,aAAa,EACb,KAAK,EACL,QAAgB,EAChB,SAAS,EACT,MAAM,EACN,YAAY,EACZ,QAAQ,GACT,EAAE,cAAc,GAAG,KAAK,CAAC,YAAY,CAmKrC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FileInput — styled file picker with optional drag-and-drop, current-file
|
|
3
|
+
* display, and a remove button. Purely presentational: upload logic lives in
|
|
4
|
+
* the `packages/react` property renderer.
|
|
5
|
+
*
|
|
6
|
+
* Mobile-first: full-width by default, tap-friendly hit areas.
|
|
7
|
+
*/
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
import { Upload, X, FileText, Loader2 } from 'lucide-react';
|
|
10
|
+
import { cn } from '../lib/utils.js';
|
|
11
|
+
import { Button } from './button.js';
|
|
12
|
+
export function FileInput({ value, displayName, previewUrl, accept, uploading = false, uploadProgress, uploadingName, error, disabled = false, className, labels, onFileSelect, onRemove, }) {
|
|
13
|
+
const l = {
|
|
14
|
+
chooseFile: labels?.chooseFile ?? 'Choose file',
|
|
15
|
+
dragAndDrop: labels?.dragAndDrop ?? 'Drag and drop or',
|
|
16
|
+
chooseAFile: labels?.chooseAFile ?? 'choose a file',
|
|
17
|
+
uploading: labels?.uploading ?? 'Uploading…',
|
|
18
|
+
uploadingFile: labels?.uploadingFile ?? 'Uploading {name}…',
|
|
19
|
+
removeFile: labels?.removeFile ?? 'Remove file',
|
|
20
|
+
};
|
|
21
|
+
const inputRef = React.useRef(null);
|
|
22
|
+
const [isDragging, setIsDragging] = React.useState(false);
|
|
23
|
+
const handleFiles = (files) => {
|
|
24
|
+
const first = files?.[0];
|
|
25
|
+
if (!first || disabled || uploading)
|
|
26
|
+
return;
|
|
27
|
+
onFileSelect(first);
|
|
28
|
+
};
|
|
29
|
+
const handleInputChange = (e) => handleFiles(e.target.files);
|
|
30
|
+
const handleDrop = (e) => {
|
|
31
|
+
e.preventDefault();
|
|
32
|
+
setIsDragging(false);
|
|
33
|
+
handleFiles(e.dataTransfer.files);
|
|
34
|
+
};
|
|
35
|
+
const handleDragOver = (e) => {
|
|
36
|
+
e.preventDefault();
|
|
37
|
+
if (!disabled && !uploading)
|
|
38
|
+
setIsDragging(true);
|
|
39
|
+
};
|
|
40
|
+
const handleDragLeave = () => setIsDragging(false);
|
|
41
|
+
const label = displayName || (value ? value.split('/').pop() : null);
|
|
42
|
+
// Detect image for thumbnail preview
|
|
43
|
+
const isImage = previewUrl
|
|
44
|
+
? /\.(jpe?g|png|gif|webp|avif|svg|bmp)(\?|$)/i.test(previewUrl)
|
|
45
|
+
: false;
|
|
46
|
+
return (<div className={cn('w-full space-y-2', className)}>
|
|
47
|
+
{/* Drop zone / trigger */}
|
|
48
|
+
<div role="button" tabIndex={disabled ? -1 : 0} aria-label={l.chooseFile} onClick={() => !disabled && !uploading && inputRef.current?.click()} onKeyDown={(e) => {
|
|
49
|
+
if ((e.key === 'Enter' || e.key === ' ') && !disabled && !uploading) {
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
inputRef.current?.click();
|
|
52
|
+
}
|
|
53
|
+
}} onDrop={handleDrop} onDragOver={handleDragOver} onDragLeave={handleDragLeave} className={cn('flex min-h-[5rem] w-full cursor-pointer flex-col items-center justify-center gap-2 rounded-md border-2 border-dashed border-border bg-muted/30 px-4 py-6 text-center transition-colors', 'hover:border-primary/50 hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', isDragging && 'border-primary bg-primary/5', (disabled || uploading) && 'cursor-not-allowed opacity-60')}>
|
|
54
|
+
{uploading ? (<div className="flex w-full max-w-sm flex-col items-center gap-2">
|
|
55
|
+
<div className="flex items-center gap-2 text-sm text-muted-foreground">
|
|
56
|
+
<Loader2 className="size-5 animate-spin"/>
|
|
57
|
+
<span className="truncate" title={uploadingName ?? undefined}>
|
|
58
|
+
{uploadingName
|
|
59
|
+
? l.uploadingFile.replace('{name}', uploadingName)
|
|
60
|
+
: l.uploading}
|
|
61
|
+
</span>
|
|
62
|
+
</div>
|
|
63
|
+
{uploadProgress != null && (<div className="flex w-full items-center gap-2">
|
|
64
|
+
<div className="h-1.5 flex-1 overflow-hidden rounded-full bg-muted" role="progressbar" aria-valuemin={0} aria-valuemax={100} aria-valuenow={uploadProgress}>
|
|
65
|
+
<div className="h-full rounded-full bg-primary transition-[width] duration-150 ease-out" style={{ width: `${uploadProgress}%` }}/>
|
|
66
|
+
</div>
|
|
67
|
+
<span className="w-10 shrink-0 text-right text-xs tabular-nums text-muted-foreground">
|
|
68
|
+
{uploadProgress}%
|
|
69
|
+
</span>
|
|
70
|
+
</div>)}
|
|
71
|
+
</div>) : (<>
|
|
72
|
+
<Upload className="size-6 text-muted-foreground"/>
|
|
73
|
+
<span className="text-sm font-medium text-foreground">
|
|
74
|
+
<span className="hidden sm:inline">{l.dragAndDrop} </span>
|
|
75
|
+
<span className="text-primary underline-offset-2 hover:underline">
|
|
76
|
+
{l.chooseAFile}
|
|
77
|
+
</span>
|
|
78
|
+
</span>
|
|
79
|
+
{accept && (<span className="text-xs text-muted-foreground">{accept}</span>)}
|
|
80
|
+
</>)}
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
{/* Current file row */}
|
|
84
|
+
{value && !uploading && (<div className="flex items-center gap-2 rounded-md border border-border bg-background px-3 py-2">
|
|
85
|
+
{isImage && previewUrl ? (<img src={previewUrl} alt={label ?? 'preview'} className="size-10 shrink-0 rounded object-cover"/>) : (<FileText className="size-5 shrink-0 text-muted-foreground"/>)}
|
|
86
|
+
<span className="min-w-0 flex-1 truncate text-sm text-foreground" title={label ?? value}>
|
|
87
|
+
{label ?? value}
|
|
88
|
+
</span>
|
|
89
|
+
{onRemove && !disabled && (<Button type="button" variant="ghost" size="icon" className="size-7 shrink-0 text-muted-foreground hover:text-destructive" aria-label={l.removeFile} onClick={(e) => {
|
|
90
|
+
e.stopPropagation();
|
|
91
|
+
onRemove();
|
|
92
|
+
}}>
|
|
93
|
+
<X className="size-4"/>
|
|
94
|
+
</Button>)}
|
|
95
|
+
</div>)}
|
|
96
|
+
|
|
97
|
+
{/* Error message */}
|
|
98
|
+
{error && (<p className="text-sm text-destructive">{error}</p>)}
|
|
99
|
+
|
|
100
|
+
{/* Hidden native input */}
|
|
101
|
+
<input ref={inputRef} type="file" accept={accept} className="sr-only" onChange={handleInputChange} disabled={disabled || uploading} tabIndex={-1} aria-hidden/>
|
|
102
|
+
</div>);
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=file-input.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-input.jsx","sourceRoot":"","sources":["../../src/components/file-input.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type ControllerProps, type FieldPath, type FieldValues } from 'react-hook-form';
|
|
3
|
+
export declare const Form: <TFieldValues extends FieldValues, TContext = any, TTransformedValues = TFieldValues>(props: import("react-hook-form").FormProviderProps<TFieldValues, TContext, TTransformedValues>) => React.JSX.Element;
|
|
4
|
+
export declare const FormField: <TFieldValues extends FieldValues = FieldValues, TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({ ...props }: ControllerProps<TFieldValues, TName>) => React.ReactElement;
|
|
5
|
+
export declare const useFormField: () => {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
formItemId: string;
|
|
9
|
+
formDescriptionId: string;
|
|
10
|
+
formMessageId: string;
|
|
11
|
+
error?: {
|
|
12
|
+
message?: string;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export declare const FormItem: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
16
|
+
export declare const FormLabel: React.ForwardRefExoticComponent<Omit<Omit<import("@radix-ui/react-label").LabelProps & React.RefAttributes<HTMLLabelElement>, "ref"> & import("class-variance-authority").VariantProps<(props?: import("class-variance-authority/types").ClassProp | undefined) => string> & React.RefAttributes<HTMLLabelElement>, "ref"> & React.RefAttributes<HTMLLabelElement>>;
|
|
17
|
+
export declare const FormControl: React.ForwardRefExoticComponent<Omit<import("@radix-ui/react-slot").SlotProps & React.RefAttributes<HTMLElement>, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
18
|
+
export declare const FormDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
|
|
19
|
+
export declare const FormMessage: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
|
|
20
|
+
//# sourceMappingURL=form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/components/form.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAA;AAIxB,eAAO,MAAM,IAAI,4MAAe,CAAA;AAWhC,eAAO,MAAM,SAAS,GACpB,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,KAAK,SAAS,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,EAC/D,cAEG,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,KAAG,KAAK,CAAC,YAI/C,CAAA;AAQH,eAAO,MAAM,YAAY,QAAO;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAiB7B,CAAA;AAED,eAAO,MAAM,QAAQ,6GASpB,CAAA;AAGD,eAAO,MAAM,SAAS,qWAapB,CAAA;AAGF,eAAO,MAAM,WAAW,8JAgBtB,CAAA;AAGF,eAAO,MAAM,eAAe,yHAa1B,CAAA;AAGF,eAAO,MAAM,WAAW,yHAiBtB,CAAA"}
|