@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.
- package/dist/components/admin-shell.d.ts +48 -0
- package/dist/components/admin-shell.d.ts.map +1 -0
- package/dist/components/admin-shell.js +49 -0
- package/dist/components/admin-shell.js.map +1 -0
- package/dist/components/chart.d.ts +12 -0
- package/dist/components/chart.d.ts.map +1 -0
- package/dist/components/chart.js +68 -0
- package/dist/components/chart.js.map +1 -0
- package/dist/components/confirm-dialog.d.ts +17 -0
- package/dist/components/confirm-dialog.d.ts.map +1 -0
- package/dist/components/confirm-dialog.js +8 -0
- package/dist/components/confirm-dialog.js.map +1 -0
- package/dist/components/data-pagination.d.ts +13 -0
- package/dist/components/data-pagination.d.ts.map +1 -0
- package/dist/components/data-pagination.js +61 -0
- package/dist/components/data-pagination.js.map +1 -0
- package/dist/components/data-table.d.ts +27 -0
- package/dist/components/data-table.d.ts.map +1 -0
- package/dist/components/data-table.js +82 -0
- package/dist/components/data-table.js.map +1 -0
- package/dist/components/empty-state.d.ts +5 -0
- package/dist/components/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state.js +5 -0
- package/dist/components/empty-state.js.map +1 -0
- package/dist/components/file-upload-field.d.ts +28 -0
- package/dist/components/file-upload-field.d.ts.map +1 -0
- package/dist/components/file-upload-field.js +104 -0
- package/dist/components/file-upload-field.js.map +1 -0
- package/dist/components/icon.d.ts +8 -0
- package/dist/components/icon.d.ts.map +1 -0
- package/dist/components/icon.js +21 -0
- package/dist/components/icon.js.map +1 -0
- package/dist/components/image-placeholder.d.ts +7 -0
- package/dist/components/image-placeholder.d.ts.map +1 -0
- package/dist/components/image-placeholder.js +11 -0
- package/dist/components/image-placeholder.js.map +1 -0
- package/dist/components/image-upload-field.d.ts +29 -0
- package/dist/components/image-upload-field.d.ts.map +1 -0
- package/dist/components/image-upload-field.js +103 -0
- package/dist/components/image-upload-field.js.map +1 -0
- package/dist/components/repeater-field.d.ts +18 -0
- package/dist/components/repeater-field.d.ts.map +1 -0
- package/dist/components/repeater-field.js +104 -0
- package/dist/components/repeater-field.js.map +1 -0
- package/dist/components/rich-box-field.d.ts +29 -0
- package/dist/components/rich-box-field.d.ts.map +1 -0
- package/dist/components/rich-box-field.js +69 -0
- package/dist/components/rich-box-field.js.map +1 -0
- package/dist/components/rich-editor-field.d.ts +15 -0
- package/dist/components/rich-editor-field.d.ts.map +1 -0
- package/dist/components/rich-editor-field.js +52 -0
- package/dist/components/rich-editor-field.js.map +1 -0
- package/dist/components/schema-form.d.ts +42 -0
- package/dist/components/schema-form.d.ts.map +1 -0
- package/dist/components/schema-form.js +180 -0
- package/dist/components/schema-form.js.map +1 -0
- package/dist/components/tags-input-field.d.ts +14 -0
- package/dist/components/tags-input-field.d.ts.map +1 -0
- package/dist/components/tags-input-field.js +59 -0
- package/dist/components/tags-input-field.js.map +1 -0
- package/dist/components/theme-toggle.d.ts +12 -0
- package/dist/components/theme-toggle.d.ts.map +1 -0
- package/dist/components/theme-toggle.js +19 -0
- package/dist/components/theme-toggle.js.map +1 -0
- package/dist/components/ui/alert.d.ts +10 -0
- package/dist/components/ui/alert.d.ts.map +1 -0
- package/dist/components/ui/alert.js +26 -0
- package/dist/components/ui/alert.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +12 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/avatar.js +25 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +10 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +26 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +12 -0
- package/dist/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb.js +29 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/button.d.ts +11 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +39 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/card.d.ts +10 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/card.js +26 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +5 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/checkbox.js +10 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +6 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.js +13 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +18 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dialog.js +39 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +26 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.js +53 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/input.d.ts +4 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +8 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/label.d.ts +5 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/label.js +9 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/pagination.d.ts +14 -0
- package/dist/components/ui/pagination.d.ts.map +1 -0
- package/dist/components/ui/pagination.js +31 -0
- package/dist/components/ui/pagination.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +6 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/scroll-area.js +13 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/select.d.ts +16 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/select.js +40 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/separator.d.ts +5 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/separator.js +10 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.d.ts +15 -0
- package/dist/components/ui/sheet.d.ts.map +1 -0
- package/dist/components/ui/sheet.js +41 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/sidebar.d.ts +70 -0
- package/dist/components/ui/sidebar.d.ts.map +1 -0
- package/dist/components/ui/sidebar.js +203 -0
- package/dist/components/ui/sidebar.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +3 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +7 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/table.d.ts +11 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/table.js +30 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +12 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs.js +34 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +4 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +8 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +8 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +18 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +18 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/badge-colors.d.ts +4 -0
- package/dist/lib/badge-colors.d.ts.map +1 -0
- package/dist/lib/badge-colors.js +22 -0
- package/dist/lib/badge-colors.js.map +1 -0
- package/dist/lib/format-date.d.ts +7 -0
- package/dist/lib/format-date.d.ts.map +1 -0
- package/dist/lib/format-date.js +35 -0
- package/dist/lib/format-date.js.map +1 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +2 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/nestjs-dash.css +2 -0
- package/dist/pagination.d.ts +10 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +42 -0
- package/dist/pagination.js.map +1 -0
- package/dist/ui.d.ts +99 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +104 -0
- package/dist/ui.js.map +1 -0
- 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"}
|