@nestjs-dash/design-system 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/dist/components/admin-shell.d.ts +48 -0
  2. package/dist/components/admin-shell.d.ts.map +1 -0
  3. package/dist/components/admin-shell.js +49 -0
  4. package/dist/components/admin-shell.js.map +1 -0
  5. package/dist/components/chart.d.ts +12 -0
  6. package/dist/components/chart.d.ts.map +1 -0
  7. package/dist/components/chart.js +68 -0
  8. package/dist/components/chart.js.map +1 -0
  9. package/dist/components/confirm-dialog.d.ts +17 -0
  10. package/dist/components/confirm-dialog.d.ts.map +1 -0
  11. package/dist/components/confirm-dialog.js +8 -0
  12. package/dist/components/confirm-dialog.js.map +1 -0
  13. package/dist/components/data-pagination.d.ts +13 -0
  14. package/dist/components/data-pagination.d.ts.map +1 -0
  15. package/dist/components/data-pagination.js +61 -0
  16. package/dist/components/data-pagination.js.map +1 -0
  17. package/dist/components/data-table.d.ts +27 -0
  18. package/dist/components/data-table.d.ts.map +1 -0
  19. package/dist/components/data-table.js +82 -0
  20. package/dist/components/data-table.js.map +1 -0
  21. package/dist/components/empty-state.d.ts +5 -0
  22. package/dist/components/empty-state.d.ts.map +1 -0
  23. package/dist/components/empty-state.js +5 -0
  24. package/dist/components/empty-state.js.map +1 -0
  25. package/dist/components/file-upload-field.d.ts +28 -0
  26. package/dist/components/file-upload-field.d.ts.map +1 -0
  27. package/dist/components/file-upload-field.js +104 -0
  28. package/dist/components/file-upload-field.js.map +1 -0
  29. package/dist/components/icon.d.ts +8 -0
  30. package/dist/components/icon.d.ts.map +1 -0
  31. package/dist/components/icon.js +21 -0
  32. package/dist/components/icon.js.map +1 -0
  33. package/dist/components/image-placeholder.d.ts +7 -0
  34. package/dist/components/image-placeholder.d.ts.map +1 -0
  35. package/dist/components/image-placeholder.js +11 -0
  36. package/dist/components/image-placeholder.js.map +1 -0
  37. package/dist/components/image-upload-field.d.ts +29 -0
  38. package/dist/components/image-upload-field.d.ts.map +1 -0
  39. package/dist/components/image-upload-field.js +103 -0
  40. package/dist/components/image-upload-field.js.map +1 -0
  41. package/dist/components/repeater-field.d.ts +18 -0
  42. package/dist/components/repeater-field.d.ts.map +1 -0
  43. package/dist/components/repeater-field.js +104 -0
  44. package/dist/components/repeater-field.js.map +1 -0
  45. package/dist/components/rich-box-field.d.ts +29 -0
  46. package/dist/components/rich-box-field.d.ts.map +1 -0
  47. package/dist/components/rich-box-field.js +69 -0
  48. package/dist/components/rich-box-field.js.map +1 -0
  49. package/dist/components/rich-editor-field.d.ts +15 -0
  50. package/dist/components/rich-editor-field.d.ts.map +1 -0
  51. package/dist/components/rich-editor-field.js +52 -0
  52. package/dist/components/rich-editor-field.js.map +1 -0
  53. package/dist/components/schema-form.d.ts +42 -0
  54. package/dist/components/schema-form.d.ts.map +1 -0
  55. package/dist/components/schema-form.js +180 -0
  56. package/dist/components/schema-form.js.map +1 -0
  57. package/dist/components/tags-input-field.d.ts +14 -0
  58. package/dist/components/tags-input-field.d.ts.map +1 -0
  59. package/dist/components/tags-input-field.js +59 -0
  60. package/dist/components/tags-input-field.js.map +1 -0
  61. package/dist/components/theme-toggle.d.ts +12 -0
  62. package/dist/components/theme-toggle.d.ts.map +1 -0
  63. package/dist/components/theme-toggle.js +19 -0
  64. package/dist/components/theme-toggle.js.map +1 -0
  65. package/dist/components/ui/alert.d.ts +10 -0
  66. package/dist/components/ui/alert.d.ts.map +1 -0
  67. package/dist/components/ui/alert.js +26 -0
  68. package/dist/components/ui/alert.js.map +1 -0
  69. package/dist/components/ui/avatar.d.ts +12 -0
  70. package/dist/components/ui/avatar.d.ts.map +1 -0
  71. package/dist/components/ui/avatar.js +25 -0
  72. package/dist/components/ui/avatar.js.map +1 -0
  73. package/dist/components/ui/badge.d.ts +10 -0
  74. package/dist/components/ui/badge.d.ts.map +1 -0
  75. package/dist/components/ui/badge.js +26 -0
  76. package/dist/components/ui/badge.js.map +1 -0
  77. package/dist/components/ui/breadcrumb.d.ts +12 -0
  78. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  79. package/dist/components/ui/breadcrumb.js +29 -0
  80. package/dist/components/ui/breadcrumb.js.map +1 -0
  81. package/dist/components/ui/button.d.ts +11 -0
  82. package/dist/components/ui/button.d.ts.map +1 -0
  83. package/dist/components/ui/button.js +39 -0
  84. package/dist/components/ui/button.js.map +1 -0
  85. package/dist/components/ui/card.d.ts +10 -0
  86. package/dist/components/ui/card.d.ts.map +1 -0
  87. package/dist/components/ui/card.js +26 -0
  88. package/dist/components/ui/card.js.map +1 -0
  89. package/dist/components/ui/checkbox.d.ts +5 -0
  90. package/dist/components/ui/checkbox.d.ts.map +1 -0
  91. package/dist/components/ui/checkbox.js +10 -0
  92. package/dist/components/ui/checkbox.js.map +1 -0
  93. package/dist/components/ui/collapsible.d.ts +6 -0
  94. package/dist/components/ui/collapsible.d.ts.map +1 -0
  95. package/dist/components/ui/collapsible.js +13 -0
  96. package/dist/components/ui/collapsible.js.map +1 -0
  97. package/dist/components/ui/dialog.d.ts +18 -0
  98. package/dist/components/ui/dialog.d.ts.map +1 -0
  99. package/dist/components/ui/dialog.js +39 -0
  100. package/dist/components/ui/dialog.js.map +1 -0
  101. package/dist/components/ui/dropdown-menu.d.ts +26 -0
  102. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  103. package/dist/components/ui/dropdown-menu.js +53 -0
  104. package/dist/components/ui/dropdown-menu.js.map +1 -0
  105. package/dist/components/ui/input.d.ts +4 -0
  106. package/dist/components/ui/input.d.ts.map +1 -0
  107. package/dist/components/ui/input.js +8 -0
  108. package/dist/components/ui/input.js.map +1 -0
  109. package/dist/components/ui/label.d.ts +5 -0
  110. package/dist/components/ui/label.d.ts.map +1 -0
  111. package/dist/components/ui/label.js +9 -0
  112. package/dist/components/ui/label.js.map +1 -0
  113. package/dist/components/ui/pagination.d.ts +14 -0
  114. package/dist/components/ui/pagination.d.ts.map +1 -0
  115. package/dist/components/ui/pagination.js +31 -0
  116. package/dist/components/ui/pagination.js.map +1 -0
  117. package/dist/components/ui/scroll-area.d.ts +6 -0
  118. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  119. package/dist/components/ui/scroll-area.js +13 -0
  120. package/dist/components/ui/scroll-area.js.map +1 -0
  121. package/dist/components/ui/select.d.ts +16 -0
  122. package/dist/components/ui/select.d.ts.map +1 -0
  123. package/dist/components/ui/select.js +40 -0
  124. package/dist/components/ui/select.js.map +1 -0
  125. package/dist/components/ui/separator.d.ts +5 -0
  126. package/dist/components/ui/separator.d.ts.map +1 -0
  127. package/dist/components/ui/separator.js +10 -0
  128. package/dist/components/ui/separator.js.map +1 -0
  129. package/dist/components/ui/sheet.d.ts +15 -0
  130. package/dist/components/ui/sheet.d.ts.map +1 -0
  131. package/dist/components/ui/sheet.js +41 -0
  132. package/dist/components/ui/sheet.js.map +1 -0
  133. package/dist/components/ui/sidebar.d.ts +70 -0
  134. package/dist/components/ui/sidebar.d.ts.map +1 -0
  135. package/dist/components/ui/sidebar.js +203 -0
  136. package/dist/components/ui/sidebar.js.map +1 -0
  137. package/dist/components/ui/skeleton.d.ts +3 -0
  138. package/dist/components/ui/skeleton.d.ts.map +1 -0
  139. package/dist/components/ui/skeleton.js +7 -0
  140. package/dist/components/ui/skeleton.js.map +1 -0
  141. package/dist/components/ui/table.d.ts +11 -0
  142. package/dist/components/ui/table.d.ts.map +1 -0
  143. package/dist/components/ui/table.js +30 -0
  144. package/dist/components/ui/table.js.map +1 -0
  145. package/dist/components/ui/tabs.d.ts +12 -0
  146. package/dist/components/ui/tabs.d.ts.map +1 -0
  147. package/dist/components/ui/tabs.js +34 -0
  148. package/dist/components/ui/tabs.js.map +1 -0
  149. package/dist/components/ui/textarea.d.ts +4 -0
  150. package/dist/components/ui/textarea.d.ts.map +1 -0
  151. package/dist/components/ui/textarea.js +8 -0
  152. package/dist/components/ui/textarea.js.map +1 -0
  153. package/dist/components/ui/tooltip.d.ts +8 -0
  154. package/dist/components/ui/tooltip.d.ts.map +1 -0
  155. package/dist/components/ui/tooltip.js +18 -0
  156. package/dist/components/ui/tooltip.js.map +1 -0
  157. package/dist/hooks/use-mobile.d.ts +2 -0
  158. package/dist/hooks/use-mobile.d.ts.map +1 -0
  159. package/dist/hooks/use-mobile.js +18 -0
  160. package/dist/hooks/use-mobile.js.map +1 -0
  161. package/dist/index.d.ts +45 -0
  162. package/dist/index.d.ts.map +1 -0
  163. package/dist/index.js +44 -0
  164. package/dist/index.js.map +1 -0
  165. package/dist/lib/badge-colors.d.ts +4 -0
  166. package/dist/lib/badge-colors.d.ts.map +1 -0
  167. package/dist/lib/badge-colors.js +22 -0
  168. package/dist/lib/badge-colors.js.map +1 -0
  169. package/dist/lib/format-date.d.ts +7 -0
  170. package/dist/lib/format-date.d.ts.map +1 -0
  171. package/dist/lib/format-date.js +35 -0
  172. package/dist/lib/format-date.js.map +1 -0
  173. package/dist/lib/utils.d.ts +2 -0
  174. package/dist/lib/utils.d.ts.map +1 -0
  175. package/dist/lib/utils.js +2 -0
  176. package/dist/lib/utils.js.map +1 -0
  177. package/dist/nestjs-dash.css +2 -0
  178. package/dist/pagination.d.ts +10 -0
  179. package/dist/pagination.d.ts.map +1 -0
  180. package/dist/pagination.js +42 -0
  181. package/dist/pagination.js.map +1 -0
  182. package/dist/ui.d.ts +99 -0
  183. package/dist/ui.d.ts.map +1 -0
  184. package/dist/ui.js +104 -0
  185. package/dist/ui.js.map +1 -0
  186. package/package.json +81 -0
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useRef } from 'react';
3
+ import { cn } from '../lib/utils.js';
4
+ import { Icon } from './icon.js';
5
+ import { Button } from './ui/button.js';
6
+ import { Label } from './ui/label.js';
7
+ import { Textarea } from './ui/textarea.js';
8
+ const TOOLBAR = [
9
+ { label: 'Bold', icon: 'bold', wrap: { prefix: '**', suffix: '**', placeholder: 'bold text' } },
10
+ {
11
+ label: 'Italic',
12
+ icon: 'italic',
13
+ wrap: { prefix: '_', suffix: '_', placeholder: 'italic text' },
14
+ },
15
+ {
16
+ label: 'Link',
17
+ icon: 'link',
18
+ wrap: { prefix: '[', suffix: '](https://)', placeholder: 'link text' },
19
+ },
20
+ { label: 'Heading', icon: 'heading-2', wrap: { prefix: '## ', placeholder: 'Heading' } },
21
+ { label: 'Bullet list', icon: 'list', wrap: { prefix: '- ', placeholder: 'List item' } },
22
+ {
23
+ label: 'Numbered list',
24
+ icon: 'list-ordered',
25
+ wrap: { prefix: '1. ', placeholder: 'List item' },
26
+ },
27
+ { label: 'Quote', icon: 'quote', wrap: { prefix: '> ', placeholder: 'Quote' } },
28
+ ];
29
+ /**
30
+ * Markdown-toolbar-over-textarea: toolbar buttons wrap the current selection in
31
+ * markdown syntax. This is a lightweight authoring aid, not a WYSIWYG editor — the
32
+ * field's stored value is plain markdown text (no HTML, no injection surface).
33
+ */
34
+ export function RichEditorField(props) {
35
+ const ref = useRef(null);
36
+ function applyWrap(wrap) {
37
+ const el = ref.current;
38
+ if (!el)
39
+ return;
40
+ const start = el.selectionStart;
41
+ const end = el.selectionEnd;
42
+ const value = el.value;
43
+ const selected = value.slice(start, end) || wrap.placeholder || '';
44
+ const suffix = wrap.suffix ?? '';
45
+ el.value = value.slice(0, start) + wrap.prefix + selected + suffix + value.slice(end);
46
+ const cursor = start + wrap.prefix.length + selected.length + suffix.length;
47
+ el.focus();
48
+ el.setSelectionRange(cursor, cursor);
49
+ }
50
+ return (_jsxs("div", { className: "mb-4 grid gap-1.5", "data-afi-rich-editor": true, children: [_jsx(Label, { htmlFor: props.id, children: props.label }), _jsx("div", { className: "flex flex-wrap gap-1 rounded-t-md border border-b-0 border-input bg-muted/40 p-1", children: TOOLBAR.map((item) => (_jsx(Button, { type: "button", variant: "ghost", size: "icon-sm", "aria-label": item.label, onClick: () => applyWrap(item.wrap), children: _jsx(Icon, { name: item.icon }) }, item.label))) }), _jsx(Textarea, { ref: ref, id: props.id, name: props.name, rows: props.rows ?? 8, defaultValue: props.defaultValue != null ? String(props.defaultValue) : undefined, required: props.required, "aria-invalid": Boolean(props.error), className: cn('rounded-t-none font-mono text-sm') })] }));
51
+ }
52
+ //# sourceMappingURL=rich-editor-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-editor-field.js","sourceRoot":"","sources":["../../src/components/rich-editor-field.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type SchemaNode } from '@nestjs-dash/support';
2
+ export type SchemaFormContext = {
3
+ values?: Record<string, unknown>;
4
+ fieldOptions?: Record<string, Array<{
5
+ value: string;
6
+ label: string;
7
+ }>>;
8
+ htmlContent?: Record<string, string>;
9
+ /** Panel `/uploads` endpoint used by `image-upload` fields. */
10
+ uploadUrl?: string;
11
+ /** Validation errors keyed by field name (from a rejected create/update submission). */
12
+ errors?: Record<string, string[]>;
13
+ };
14
+ /** Render a bare list of fields (no Card/form/submit wrapper) — for embedding inside another form, e.g. an action's confirm-dialog modal. */
15
+ export declare function SchemaFields(props: {
16
+ fields: SchemaNode[];
17
+ values?: Record<string, unknown>;
18
+ fieldOptions?: Record<string, Array<{
19
+ value: string;
20
+ label: string;
21
+ }>>;
22
+ errors?: Record<string, string[]>;
23
+ }): import("react").JSX.Element;
24
+ export declare function SchemaForm(props: {
25
+ schema: SchemaNode;
26
+ className?: string;
27
+ action?: string;
28
+ method?: 'post' | 'get';
29
+ submitLabel?: string;
30
+ values?: Record<string, unknown>;
31
+ fieldOptions?: Record<string, Array<{
32
+ value: string;
33
+ label: string;
34
+ }>>;
35
+ htmlContent?: Record<string, string>;
36
+ /** Panel `/uploads` endpoint used by `image-upload` fields. */
37
+ uploadUrl?: string;
38
+ /** Validation errors keyed by field name (from a rejected create/update submission). */
39
+ errors?: Record<string, string[]>;
40
+ }): import("react").JSX.Element;
41
+ export declare function renderSchemaNode(node: SchemaNode): import("react").JSX.Element;
42
+ //# sourceMappingURL=schema-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-form.d.ts","sourceRoot":"","sources":["../../src/components/schema-form.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAyG7E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACnC,CAAC;AAqVF,6IAA6I;AAC7I,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACnC,+BAOA;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACnC,+BAmBA;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,+BAShD"}
@@ -0,0 +1,180 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { jsonTextareaFieldKey } from '@nestjs-dash/support';
3
+ import { useId, useState } from 'react';
4
+ import { cn } from '../lib/utils.js';
5
+ import { FileUploadField } from './file-upload-field.js';
6
+ import { Icon } from './icon.js';
7
+ import { ImageUploadField } from './image-upload-field.js';
8
+ import { RepeaterField } from './repeater-field.js';
9
+ import { RichBoxField } from './rich-box-field.js';
10
+ import { RichEditorField } from './rich-editor-field.js';
11
+ import { TagsInputField } from './tags-input-field.js';
12
+ import { Button } from './ui/button.js';
13
+ import { Card, CardContent } from './ui/card.js';
14
+ import { Input } from './ui/input.js';
15
+ import { Label } from './ui/label.js';
16
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './ui/select.js';
17
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs.js';
18
+ import { Textarea } from './ui/textarea.js';
19
+ /** Simple-input wrapper: renders `<Input>` plus icon/prefix/suffix adornments (Part B: `.icon()`/`.prefix()`/`.suffix()`). */
20
+ function AddonInput({ icon, iconPosition = 'start', prefix, suffix, className, ...inputProps }) {
21
+ const startNode = prefix ?? (icon && iconPosition === 'start' ? _jsx(Icon, { name: icon }) : null);
22
+ const endNode = suffix ?? (icon && iconPosition === 'end' ? _jsx(Icon, { name: icon }) : null);
23
+ if (!startNode && !endNode) {
24
+ return _jsx(Input, { className: className, ...inputProps });
25
+ }
26
+ return (_jsxs("div", { className: "relative flex items-center", children: [startNode ? (_jsx("span", { className: "pointer-events-none absolute left-3 flex items-center text-sm text-muted-foreground [&_svg]:size-4", children: startNode })) : null, _jsx(Input, { className: cn(startNode ? 'pl-9' : undefined, endNode ? 'pr-9' : undefined, className), ...inputProps }), endNode ? (_jsx("span", { className: "pointer-events-none absolute right-3 flex items-center text-sm text-muted-foreground [&_svg]:size-4", children: endNode })) : null] }));
27
+ }
28
+ function FieldShell(props) {
29
+ return (_jsxs("div", { className: "mb-4 grid gap-1.5", children: [_jsx(Label, { htmlFor: props.htmlFor, children: props.label }), props.children, props.error ? _jsx("p", { className: "text-sm text-destructive", children: props.error }) : null] }));
30
+ }
31
+ function SelectField(props) {
32
+ const initial = props.defaultValue && props.options.some((o) => o.value === props.defaultValue)
33
+ ? props.defaultValue
34
+ : '';
35
+ const [value, setValue] = useState(initial);
36
+ const id = useId();
37
+ return (_jsxs(FieldShell, { label: props.label, htmlFor: id, error: props.error, children: [_jsx("input", { type: "hidden", name: props.name, value: value, required: props.required }), _jsxs(Select, { value: value, onValueChange: setValue, children: [_jsx(SelectTrigger, { id: id, className: "w-full", "aria-invalid": Boolean(props.error), children: _jsx(SelectValue, { placeholder: "Select\u2026" }) }), _jsx(SelectContent, { children: props.options.map((option) => (_jsx(SelectItem, { value: option.value, children: option.label }, option.value))) })] })] }));
38
+ }
39
+ function renderField(field, ctx) {
40
+ const name = String(field.name ?? field.props.name ?? '');
41
+ const label = String(field.props.label ?? name);
42
+ const value = ctx.values?.[name];
43
+ const shape = String(field.props.shape ?? 'square');
44
+ const error = ctx.errors?.[name]?.join(', ');
45
+ if (field.kind === 'html') {
46
+ const htmlKey = String(field.props.htmlKey ?? '');
47
+ const html = ctx.htmlContent?.[htmlKey] ?? '';
48
+ return (_jsx("div", { className: "mb-4",
49
+ // Resource-aware Html.make() content is trusted admin markup.
50
+ dangerouslySetInnerHTML: { __html: html } }, name || htmlKey));
51
+ }
52
+ if (field.kind === 'image-upload') {
53
+ const shapeKind = shape === 'circle' ? 'circle' : 'square';
54
+ const multiple = Boolean(field.props.multiple);
55
+ return (_jsx(ImageUploadField, { name: name, label: label, shape: shapeKind, multiple: multiple, maxFiles: field.props.maxFiles != null ? Number(field.props.maxFiles) : undefined, maxSizeKb: field.props.maxSize != null ? Number(field.props.maxSize) : undefined, accept: Array.isArray(field.props.acceptedFileTypes)
56
+ ? field.props.acceptedFileTypes.join(',')
57
+ : undefined, disk: typeof field.props.disk === 'string' ? field.props.disk : undefined, directory: typeof field.props.directory === 'string' ? field.props.directory : undefined, visibility: typeof field.props.visibility === 'string' ? field.props.visibility : undefined, required: Boolean(field.props.required), defaultValue: value ?? field.props.defaultValue, uploadUrl: ctx.uploadUrl ?? '/uploads' }, name));
58
+ }
59
+ if (field.kind === 'file-upload') {
60
+ const multiple = Boolean(field.props.multiple);
61
+ return (_jsx(FileUploadField, { name: name, label: label, multiple: multiple, maxFiles: field.props.maxFiles != null ? Number(field.props.maxFiles) : undefined, maxSizeKb: field.props.maxSize != null ? Number(field.props.maxSize) : undefined, accept: Array.isArray(field.props.acceptedFileTypes)
62
+ ? field.props.acceptedFileTypes.join(',')
63
+ : undefined, disk: typeof field.props.disk === 'string' ? field.props.disk : undefined, directory: typeof field.props.directory === 'string' ? field.props.directory : undefined, visibility: typeof field.props.visibility === 'string' ? field.props.visibility : undefined, required: Boolean(field.props.required), defaultValue: value ?? field.props.defaultValue, uploadUrl: ctx.uploadUrl ?? '/uploads' }, name));
64
+ }
65
+ if (field.kind === 'repeater') {
66
+ return (_jsx(RepeaterField, { name: name, label: label, schema: field.children ?? [], minItems: field.props.minItems != null ? Number(field.props.minItems) : undefined, maxItems: field.props.maxItems != null ? Number(field.props.maxItems) : undefined, addActionLabel: typeof field.props.addActionLabel === 'string' ? field.props.addActionLabel : undefined, defaultValue: value ?? field.props.defaultValue }, name));
67
+ }
68
+ if (field.kind === 'tags-input') {
69
+ return (_jsx(TagsInputField, { name: name, label: label, placeholder: typeof field.props.placeholder === 'string' ? field.props.placeholder : undefined, maxTags: field.props.maxTags != null ? Number(field.props.maxTags) : undefined, required: Boolean(field.props.required), defaultValue: value ?? field.props.defaultValue }, name));
70
+ }
71
+ if (field.kind === 'rich-editor') {
72
+ const id = `field-${name}`;
73
+ return (_jsx(RichEditorField, { id: id, name: name, label: label, rows: field.props.rows != null ? Number(field.props.rows) : undefined, defaultValue: value ?? field.props.defaultValue, required: Boolean(field.props.required), error: error }, name));
74
+ }
75
+ if (field.kind === 'rich-box') {
76
+ const jsonProperty = typeof field.props.jsonProperty === 'string' ? field.props.jsonProperty : undefined;
77
+ // A `.json(property)` field submits/reads under a qualified key, not the bare column `name` —
78
+ // multiple property fields (e.g. one per locale) routinely target the same JSON column, and a
79
+ // shared HTML `name` (or React key) would collide.
80
+ const inputName = jsonTextareaFieldKey(name, jsonProperty);
81
+ const inputValue = jsonProperty ? ctx.values?.[inputName] : value;
82
+ return (_jsx(RichBoxField, { id: `field-${inputName}`, name: inputName, label: label, defaultValue: inputValue ?? field.props.defaultValue, required: Boolean(field.props.required), error: error, placeholder: typeof field.props.placeholder === 'string' ? field.props.placeholder : undefined, height: typeof field.props.height === 'string' ? field.props.height : undefined, theme: field.props.theme === 'bubble' ? 'bubble' : 'snow', toolbar: field.props.toolbar === false || Array.isArray(field.props.toolbar)
83
+ ? field.props.toolbar
84
+ : undefined, formats: Array.isArray(field.props.formats) ? field.props.formats : undefined, readOnly: Boolean(field.props.readOnly), modules: field.props.modules && typeof field.props.modules === 'object'
85
+ ? field.props.modules
86
+ : undefined }, inputName));
87
+ }
88
+ if (field.kind === 'code-editor') {
89
+ const id = `field-${name}`;
90
+ return (_jsxs(FieldShell, { label: label, htmlFor: id, error: error, children: [typeof field.props.language === 'string' ? (_jsx("p", { className: "m-0 mb-1 text-xs text-muted-foreground", children: field.props.language })) : null, _jsx(Textarea, { id: id, name: name, rows: Number(field.props.rows ?? 8), defaultValue: value != null ? String(value) : undefined, "aria-invalid": Boolean(error), className: "font-mono text-sm" })] }, name));
91
+ }
92
+ if (field.kind === 'textarea') {
93
+ const isJson = field.props.json === true;
94
+ const jsonProperty = typeof field.props.jsonProperty === 'string' ? field.props.jsonProperty : undefined;
95
+ // A `.json(property)` field submits/reads under a qualified key, not the bare column `name` —
96
+ // multiple property fields (e.g. one per locale) routinely target the same JSON column, and a
97
+ // shared HTML `name` (or React key) would collide.
98
+ const inputName = jsonTextareaFieldKey(name, jsonProperty);
99
+ const inputValue = jsonProperty ? ctx.values?.[inputName] : value;
100
+ const id = `field-${inputName}`;
101
+ return (_jsx(FieldShell, { label: label, htmlFor: id, error: error, children: _jsx(Textarea, { id: id, name: inputName, rows: Number(field.props.rows ?? (isJson && !jsonProperty ? 8 : 4)), defaultValue: inputValue != null ? String(inputValue) : undefined, "aria-invalid": Boolean(error), className: isJson && !jsonProperty ? 'font-mono text-sm' : undefined }) }, inputName));
102
+ }
103
+ if (field.kind === 'radio') {
104
+ const options = ctx.fieldOptions?.[name] ??
105
+ field.props.options ??
106
+ [];
107
+ const selected = value != null
108
+ ? String(value)
109
+ : field.props.defaultValue != null
110
+ ? String(field.props.defaultValue)
111
+ : undefined;
112
+ return (_jsx(FieldShell, { label: label, error: error, children: _jsx("div", { className: "flex flex-col gap-2", children: options.map((option, index) => {
113
+ const optionValue = String(option.value);
114
+ const optionId = `field-${name}-${index}`;
115
+ return (_jsxs("label", { htmlFor: optionId, className: "flex items-center gap-2 text-sm", children: [_jsx("input", { id: optionId, type: "radio", name: name, value: optionValue, defaultChecked: selected === optionValue, required: Boolean(field.props.required), className: "size-4" }), option.label] }, optionId));
116
+ }) }) }, name));
117
+ }
118
+ if (field.kind === 'select') {
119
+ const options = ctx.fieldOptions?.[name] ??
120
+ field.props.options ??
121
+ [];
122
+ return (_jsx(SelectField, { name: name, label: label, options: options, required: Boolean(field.props.required), defaultValue: value != null ? String(value) : undefined, error: error }, name));
123
+ }
124
+ if (field.kind === 'tabs') {
125
+ const tabs = (field.children ?? []).filter((child) => child.kind === 'tab');
126
+ if (tabs.length === 0)
127
+ return null;
128
+ const defaultValue = String(tabs[0]?.props.id ?? tabs[0]?.name ?? tabs[0]?.props.name ?? '0');
129
+ return (_jsxs(Tabs, { defaultValue: defaultValue, className: "mb-5", "data-afi-tabs": true, children: [_jsx(TabsList, { variant: "line", className: "mb-4 w-full justify-start", children: tabs.map((tab, index) => {
130
+ const tabId = String(tab.props.id ?? tab.name ?? tab.props.name ?? index);
131
+ return (_jsx(TabsTrigger, { value: tabId, children: String(tab.props.label ?? tabId) }, tabId));
132
+ }) }), tabs.map((tab, index) => {
133
+ const tabId = String(tab.props.id ?? tab.name ?? tab.props.name ?? index);
134
+ return (_jsx(TabsContent, { value: tabId, className: "space-y-0", children: (tab.children ?? []).map((child) => renderField(child, ctx)) }, tabId));
135
+ })] }, name || 'tabs'));
136
+ }
137
+ if (field.kind === 'section' || field.kind === 'grid' || field.kind === 'schema') {
138
+ const columns = field.kind === 'grid' ? Number(field.props.columns ?? 2) : undefined;
139
+ return (_jsxs("div", { className: cn(field.kind === 'section' &&
140
+ 'mb-5 border-b border-border pb-4 last:mb-0 last:border-0 last:pb-0', field.kind === 'grid' && 'mb-4 grid gap-x-4'),
141
+ // Tailwind's JIT scanner can't see a dynamically-interpolated `grid-cols-${n}` class, and
142
+ // `columns` is an arbitrary author-supplied number — set it inline instead of relying on a
143
+ // safelisted set of utility classes.
144
+ style: columns ? { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` } : undefined, children: [field.props.label ? (_jsx("h3", { className: "mb-3 text-[1.05rem] font-semibold", children: String(field.props.label) })) : null, (field.children ?? []).map((child) => renderField(child, ctx))] }, name || field.kind));
145
+ }
146
+ const id = `field-${name}`;
147
+ const kindType = {
148
+ 'date-picker': 'date',
149
+ 'date-time-picker': 'datetime-local',
150
+ 'color-picker': 'color',
151
+ };
152
+ return (_jsx(FieldShell, { label: label, htmlFor: id, error: error, children: _jsx(AddonInput, { id: id, name: name, type: kindType[field.kind] ?? String(field.props.type ?? 'text'), placeholder: typeof field.props.placeholder === 'string' ? field.props.placeholder : undefined, min: typeof field.props.minDate === 'string' ? field.props.minDate : undefined, max: typeof field.props.maxDate === 'string' ? field.props.maxDate : undefined, icon: typeof field.props.icon === 'string' ? field.props.icon : undefined, iconPosition: field.props.iconPosition === 'end' ? 'end' : 'start', prefix: typeof field.props.prefix === 'string' ? field.props.prefix : undefined, suffix: typeof field.props.suffix === 'string' ? field.props.suffix : undefined, required: Boolean(field.props.required), defaultValue: value != null ? String(value) : undefined, "aria-invalid": Boolean(error) }) }, name));
153
+ }
154
+ /** Render a bare list of fields (no Card/form/submit wrapper) — for embedding inside another form, e.g. an action's confirm-dialog modal. */
155
+ export function SchemaFields(props) {
156
+ const ctx = {
157
+ values: props.values,
158
+ fieldOptions: props.fieldOptions,
159
+ errors: props.errors,
160
+ };
161
+ return _jsx(_Fragment, { children: props.fields.map((field) => renderField(field, ctx)) });
162
+ }
163
+ export function SchemaForm(props) {
164
+ const fields = props.schema.children ?? [];
165
+ const ctx = {
166
+ values: props.values,
167
+ fieldOptions: props.fieldOptions,
168
+ htmlContent: props.htmlContent,
169
+ uploadUrl: props.uploadUrl,
170
+ errors: props.errors,
171
+ };
172
+ return (_jsx(Card, { className: cn('py-4', props.className), children: _jsx(CardContent, { className: "px-4", children: _jsxs("form", { method: props.method ?? 'post', action: props.action, className: "contents", children: [fields.map((field) => renderField(field, ctx)), _jsx(Button, { type: "submit", children: props.submitLabel ?? 'Save' })] }) }) }));
173
+ }
174
+ export function renderSchemaNode(node) {
175
+ if (node.kind === 'schema') {
176
+ return _jsx(SchemaForm, { schema: node });
177
+ }
178
+ return (_jsx(Card, { className: "py-4", children: _jsx(CardContent, { className: "px-4 font-mono text-sm", children: JSON.stringify(node) }) }));
179
+ }
180
+ //# sourceMappingURL=schema-form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-form.js","sourceRoot":"","sources":["../../src/components/schema-form.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Chip input for string tags. Submits one JSON-stringified hidden input (same
3
+ * convention `ImageUploadField` uses for its multi-file payload) — the server
4
+ * parses it back into an array via `parseJsonArrayFields` before persistence.
5
+ */
6
+ export declare function TagsInputField(props: {
7
+ name: string;
8
+ label: string;
9
+ placeholder?: string;
10
+ maxTags?: number;
11
+ required?: boolean;
12
+ defaultValue?: unknown;
13
+ }): import("react").JSX.Element;
14
+ //# sourceMappingURL=tags-input-field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags-input-field.d.ts","sourceRoot":"","sources":["../../src/components/tags-input-field.tsx"],"names":[],"mappings":"AAuBA;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,+BAgEA"}
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId, useState } from 'react';
3
+ import { Badge } from './ui/badge.js';
4
+ import { Icon } from './icon.js';
5
+ import { Label } from './ui/label.js';
6
+ function parseTags(value) {
7
+ if (value == null || value === '')
8
+ return [];
9
+ if (Array.isArray(value))
10
+ return value.map((entry) => String(entry));
11
+ if (typeof value === 'string') {
12
+ try {
13
+ const parsed = JSON.parse(value);
14
+ if (Array.isArray(parsed))
15
+ return parsed.map((entry) => String(entry));
16
+ }
17
+ catch {
18
+ /* treat as comma-separated */
19
+ }
20
+ return value
21
+ .split(',')
22
+ .map((entry) => entry.trim())
23
+ .filter(Boolean);
24
+ }
25
+ return [];
26
+ }
27
+ /**
28
+ * Chip input for string tags. Submits one JSON-stringified hidden input (same
29
+ * convention `ImageUploadField` uses for its multi-file payload) — the server
30
+ * parses it back into an array via `parseJsonArrayFields` before persistence.
31
+ */
32
+ export function TagsInputField(props) {
33
+ const [tags, setTags] = useState(() => parseTags(props.defaultValue));
34
+ const [draft, setDraft] = useState('');
35
+ const id = useId();
36
+ function addTag(raw) {
37
+ const value = raw.trim();
38
+ if (!value)
39
+ return;
40
+ if (props.maxTags && tags.length >= props.maxTags)
41
+ return;
42
+ setTags((prev) => (prev.includes(value) ? prev : [...prev, value]));
43
+ setDraft('');
44
+ }
45
+ function handleKeyDown(event) {
46
+ if (event.key === 'Enter' || event.key === ',') {
47
+ event.preventDefault();
48
+ addTag(draft);
49
+ }
50
+ else if (event.key === 'Backspace' && draft === '' && tags.length > 0) {
51
+ setTags((prev) => prev.slice(0, -1));
52
+ }
53
+ }
54
+ function removeAt(index) {
55
+ setTags((prev) => prev.filter((_, i) => i !== index));
56
+ }
57
+ return (_jsxs("div", { className: "mb-4 grid gap-1.5", "data-afi-tags-input": true, children: [_jsx(Label, { htmlFor: id, children: props.label }), _jsxs("div", { className: "flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1.5 focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50", children: [tags.map((tag, index) => (_jsxs(Badge, { variant: "secondary", className: "gap-1", children: [tag, _jsx("button", { type: "button", onClick: () => removeAt(index), "aria-label": `Remove ${tag}`, className: "ml-0.5 inline-flex", children: _jsx(Icon, { name: "x", className: "size-3" }) })] }, `${tag}-${index}`))), _jsx("input", { id: id, type: "text", value: draft, onChange: (event) => setDraft(event.target.value), onKeyDown: handleKeyDown, onBlur: () => addTag(draft), placeholder: tags.length === 0 ? props.placeholder : undefined, required: Boolean(props.required) && tags.length === 0, className: "min-w-24 flex-1 border-0 bg-transparent p-0.5 text-sm outline-none placeholder:text-muted-foreground" })] }), _jsx("input", { type: "hidden", name: props.name, value: JSON.stringify(tags), "data-afi-payload": true, readOnly: true })] }));
58
+ }
59
+ //# sourceMappingURL=tags-input-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags-input-field.js","sourceRoot":"","sources":["../../src/components/tags-input-field.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type ThemeMode = 'light' | 'dark' | 'system';
2
+ /**
3
+ * Light/dark/system theme toggle. Purely presentational — it has no
4
+ * knowledge of cookies or HTTP; the caller (the admin app's toolbar wiring)
5
+ * owns persisting `mode` and applying it to the document.
6
+ */
7
+ export declare function ThemeToggle(props: {
8
+ mode: ThemeMode;
9
+ onChange: (mode: ThemeMode) => void;
10
+ className?: string;
11
+ }): import("react").JSX.Element;
12
+ //# sourceMappingURL=theme-toggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-toggle.d.ts","sourceRoot":"","sources":["../../src/components/theme-toggle.tsx"],"names":[],"mappings":"AASA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AAQpD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BA8BA"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from './ui/button.js';
3
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from './ui/dropdown-menu.js';
4
+ import { Icon } from './icon.js';
5
+ const OPTIONS = [
6
+ { mode: 'light', label: 'Light', icon: 'sun' },
7
+ { mode: 'dark', label: 'Dark', icon: 'moon' },
8
+ { mode: 'system', label: 'System', icon: 'monitor' },
9
+ ];
10
+ /**
11
+ * Light/dark/system theme toggle. Purely presentational — it has no
12
+ * knowledge of cookies or HTTP; the caller (the admin app's toolbar wiring)
13
+ * owns persisting `mode` and applying it to the document.
14
+ */
15
+ export function ThemeToggle(props) {
16
+ const current = OPTIONS.find((option) => option.mode === props.mode) ?? OPTIONS[2];
17
+ return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { type: "button", variant: "ghost", size: "icon", className: props.className, "aria-label": `Theme: ${current.label}`, children: _jsx(Icon, { name: current.icon }) }) }), _jsx(DropdownMenuContent, { align: "end", children: OPTIONS.map((option) => (_jsxs(DropdownMenuItem, { "aria-current": option.mode === props.mode ? 'true' : undefined, onSelect: () => props.onChange(option.mode), children: [_jsx(Icon, { name: option.icon }), option.label] }, option.mode))) })] }));
18
+ }
19
+ //# sourceMappingURL=theme-toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-toggle.js","sourceRoot":"","sources":["../../src/components/theme-toggle.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,MAAM,OAAO,GAA4D;IACvE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE;IAC9C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IAC7C,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;CACrD,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAI3B;IACC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IAEnF,OAAO,CACL,MAAC,YAAY,eACX,KAAC,mBAAmB,IAAC,OAAO,kBAC1B,KAAC,MAAM,IACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,SAAS,EAAE,KAAK,CAAC,SAAS,gBACd,UAAU,OAAQ,CAAC,KAAK,EAAE,YAEtC,KAAC,IAAI,IAAC,IAAI,EAAE,OAAQ,CAAC,IAAI,GAAI,GACtB,GACW,EACtB,KAAC,mBAAmB,IAAC,KAAK,EAAC,KAAK,YAC7B,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,MAAC,gBAAgB,oBAED,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC7D,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,aAE3C,KAAC,IAAI,IAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAI,EAC1B,MAAM,CAAC,KAAK,KALR,MAAM,CAAC,IAAI,CAMC,CACpB,CAAC,GACkB,IACT,CAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ import { type VariantProps } from 'class-variance-authority';
3
+ declare const alertVariants: (props?: ({
4
+ variant?: "default" | "destructive" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ declare function Alert({ className, variant, ...props }: React.ComponentProps<'div'> & VariantProps<typeof alertVariants>): React.JSX.Element;
7
+ declare function AlertTitle({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
8
+ declare function AlertDescription({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
9
+ export { Alert, AlertTitle, AlertDescription };
10
+ //# sourceMappingURL=alert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/components/ui/alert.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,QAAA,MAAM,aAAa;;8EAclB,CAAC;AAEF,iBAAS,KAAK,CAAC,EACb,SAAS,EACT,OAAO,EACP,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,qBASlE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQvE;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW7E;AAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { cva } from 'class-variance-authority';
4
+ import { cn } from 'cn';
5
+ const alertVariants = cva('relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current', {
6
+ variants: {
7
+ variant: {
8
+ default: 'bg-card text-card-foreground',
9
+ destructive: 'bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current',
10
+ },
11
+ },
12
+ defaultVariants: {
13
+ variant: 'default',
14
+ },
15
+ });
16
+ function Alert({ className, variant, ...props }) {
17
+ return (_jsx("div", { "data-slot": "alert", role: "alert", className: cn(alertVariants({ variant }), className), ...props }));
18
+ }
19
+ function AlertTitle({ className, ...props }) {
20
+ return (_jsx("div", { "data-slot": "alert-title", className: cn('col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight', className), ...props }));
21
+ }
22
+ function AlertDescription({ className, ...props }) {
23
+ return (_jsx("div", { "data-slot": "alert-description", className: cn('col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed', className), ...props }));
24
+ }
25
+ export { Alert, AlertTitle, AlertDescription };
26
+ //# sourceMappingURL=alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert.js","sourceRoot":"","sources":["../../../src/components/ui/alert.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,CAAC;AAExB,MAAM,aAAa,GAAG,GAAG,CACvB,mOAAmO,EACnO;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EAAE,8BAA8B;YACvC,WAAW,EACT,mGAAmG;SACtG;KACF;IACD,eAAe,EAAE;QACf,OAAO,EAAE,SAAS;KACnB;CACF,CACF,CAAC;AAEF,SAAS,KAAK,CAAC,EACb,SAAS,EACT,OAAO,EACP,GAAG,KAAK,EACyD;IACjE,OAAO,CACL,2BACY,OAAO,EACjB,IAAI,EAAC,OAAO,EACZ,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,KAChD,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACtE,OAAO,CACL,2BACY,aAAa,EACvB,SAAS,EAAE,EAAE,CAAC,6DAA6D,EAAE,SAAS,CAAC,KACnF,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IAC5E,OAAO,CACL,2BACY,mBAAmB,EAC7B,SAAS,EAAE,EAAE,CACX,gGAAgG,EAChG,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ import { Avatar as AvatarPrimitive } from 'radix-ui';
3
+ declare function Avatar({ className, size, ...props }: React.ComponentProps<typeof AvatarPrimitive.Root> & {
4
+ size?: 'default' | 'sm' | 'lg';
5
+ }): React.JSX.Element;
6
+ declare function AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>): React.JSX.Element;
7
+ declare function AvatarFallback({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Fallback>): React.JSX.Element;
8
+ declare function AvatarBadge({ className, ...props }: React.ComponentProps<'span'>): React.JSX.Element;
9
+ declare function AvatarGroup({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
10
+ declare function AvatarGroupCount({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
11
+ export { Avatar, AvatarImage, AvatarFallback, AvatarBadge, AvatarGroup, AvatarGroupCount };
12
+ //# sourceMappingURL=avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/ui/avatar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AAErD,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG;IACrD,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;CAChC,qBAYA;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,qBAQ/F;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,qBAWvD;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAczE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAWxE;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW7E;AAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,25 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { cn } from 'cn';
5
+ import { Avatar as AvatarPrimitive } from 'radix-ui';
6
+ function Avatar({ className, size = 'default', ...props }) {
7
+ return (_jsx(AvatarPrimitive.Root, { "data-slot": "avatar", "data-size": size, className: cn('group/avatar relative flex size-8 shrink-0 overflow-hidden rounded-full select-none data-[size=lg]:size-10 data-[size=sm]:size-6', className), ...props }));
8
+ }
9
+ function AvatarImage({ className, ...props }) {
10
+ return (_jsx(AvatarPrimitive.Image, { "data-slot": "avatar-image", className: cn('aspect-square size-full', className), ...props }));
11
+ }
12
+ function AvatarFallback({ className, ...props }) {
13
+ return (_jsx(AvatarPrimitive.Fallback, { "data-slot": "avatar-fallback", className: cn('flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs', className), ...props }));
14
+ }
15
+ function AvatarBadge({ className, ...props }) {
16
+ return (_jsx("span", { "data-slot": "avatar-badge", className: cn('absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground ring-2 ring-background select-none', 'group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden', 'group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2', 'group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2', className), ...props }));
17
+ }
18
+ function AvatarGroup({ className, ...props }) {
19
+ return (_jsx("div", { "data-slot": "avatar-group", className: cn('group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background', className), ...props }));
20
+ }
21
+ function AvatarGroupCount({ className, ...props }) {
22
+ return (_jsx("div", { "data-slot": "avatar-group-count", className: cn('relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3', className), ...props }));
23
+ }
24
+ export { Avatar, AvatarImage, AvatarFallback, AvatarBadge, AvatarGroup, AvatarGroupCount };
25
+ //# sourceMappingURL=avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../src/components/ui/avatar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AAErD,SAAS,MAAM,CAAC,EACd,SAAS,EACT,IAAI,GAAG,SAAS,EAChB,GAAG,KAAK,EAGT;IACC,OAAO,CACL,KAAC,eAAe,CAAC,IAAI,iBACT,QAAQ,eACP,IAAI,EACf,SAAS,EAAE,EAAE,CACX,kIAAkI,EAClI,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAsD;IAC9F,OAAO,CACL,KAAC,eAAe,CAAC,KAAK,iBACV,cAAc,EACxB,SAAS,EAAE,EAAE,CAAC,yBAAyB,EAAE,SAAS,CAAC,KAC/C,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,EACtB,SAAS,EACT,GAAG,KAAK,EAC8C;IACtD,OAAO,CACL,KAAC,eAAe,CAAC,QAAQ,iBACb,iBAAiB,EAC3B,SAAS,EAAE,EAAE,CACX,oIAAoI,EACpI,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAgC;IACxE,OAAO,CACL,4BACY,cAAc,EACxB,SAAS,EAAE,EAAE,CACX,2JAA2J,EAC3J,+EAA+E,EAC/E,2FAA2F,EAC3F,+EAA+E,EAC/E,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACvE,OAAO,CACL,2BACY,cAAc,EACxB,SAAS,EAAE,EAAE,CACX,qGAAqG,EACrG,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IAC5E,OAAO,CACL,2BACY,oBAAoB,EAC9B,SAAS,EAAE,EAAE,CACX,0VAA0V,EAC1V,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ import { type VariantProps } from 'class-variance-authority';
3
+ declare const badgeVariants: (props?: ({
4
+ variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ declare function Badge({ className, variant, asChild, ...props }: React.ComponentProps<'span'> & VariantProps<typeof badgeVariants> & {
7
+ asChild?: boolean;
8
+ }): React.JSX.Element;
9
+ export { Badge, badgeVariants };
10
+ //# sourceMappingURL=badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../src/components/ui/badge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIlE,QAAA,MAAM,aAAa;;8EAmBlB,CAAC;AAEF,iBAAS,KAAK,CAAC,EACb,SAAS,EACT,OAAmB,EACnB,OAAe,EACf,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,qBAW3F;AAED,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC"}