@miethe/ui 0.3.0 → 0.6.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 (168) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +776 -9
  3. package/dist/components/content-viewer/ArticleViewer.d.ts +42 -0
  4. package/dist/components/content-viewer/ArticleViewer.d.ts.map +1 -0
  5. package/dist/components/content-viewer/ArticleViewer.js +321 -0
  6. package/dist/components/content-viewer/ArticleViewer.js.map +1 -0
  7. package/dist/components/content-viewer/FrontmatterHeader.d.ts +32 -0
  8. package/dist/components/content-viewer/FrontmatterHeader.d.ts.map +1 -0
  9. package/dist/components/content-viewer/FrontmatterHeader.js +95 -0
  10. package/dist/components/content-viewer/FrontmatterHeader.js.map +1 -0
  11. package/dist/components/content-viewer/callouts/Callout.d.ts +43 -0
  12. package/dist/components/content-viewer/callouts/Callout.d.ts.map +1 -0
  13. package/dist/components/content-viewer/callouts/Callout.js +86 -0
  14. package/dist/components/content-viewer/callouts/Callout.js.map +1 -0
  15. package/dist/components/content-viewer/callouts/index.d.ts +2 -0
  16. package/dist/components/content-viewer/callouts/index.d.ts.map +1 -0
  17. package/dist/components/content-viewer/callouts/index.js +2 -0
  18. package/dist/components/content-viewer/callouts/index.js.map +1 -0
  19. package/dist/components/content-viewer/index.d.ts +21 -0
  20. package/dist/components/content-viewer/index.d.ts.map +1 -0
  21. package/dist/components/content-viewer/index.js +29 -0
  22. package/dist/components/content-viewer/index.js.map +1 -0
  23. package/dist/components/content-viewer/plugins/index.d.ts +5 -0
  24. package/dist/components/content-viewer/plugins/index.d.ts.map +1 -0
  25. package/dist/components/content-viewer/plugins/index.js +5 -0
  26. package/dist/components/content-viewer/plugins/index.js.map +1 -0
  27. package/dist/components/content-viewer/plugins/lowlightLoader.d.ts +63 -0
  28. package/dist/components/content-viewer/plugins/lowlightLoader.d.ts.map +1 -0
  29. package/dist/components/content-viewer/plugins/lowlightLoader.js +120 -0
  30. package/dist/components/content-viewer/plugins/lowlightLoader.js.map +1 -0
  31. package/dist/components/content-viewer/plugins/rehypeCodeHighlight.d.ts +44 -0
  32. package/dist/components/content-viewer/plugins/rehypeCodeHighlight.d.ts.map +1 -0
  33. package/dist/components/content-viewer/plugins/rehypeCodeHighlight.js +122 -0
  34. package/dist/components/content-viewer/plugins/rehypeCodeHighlight.js.map +1 -0
  35. package/dist/components/content-viewer/plugins/rehypeExternalLinks.d.ts +59 -0
  36. package/dist/components/content-viewer/plugins/rehypeExternalLinks.d.ts.map +1 -0
  37. package/dist/components/content-viewer/plugins/rehypeExternalLinks.js +79 -0
  38. package/dist/components/content-viewer/plugins/rehypeExternalLinks.js.map +1 -0
  39. package/dist/components/content-viewer/plugins/rehypeHeadingIds.d.ts +37 -0
  40. package/dist/components/content-viewer/plugins/rehypeHeadingIds.d.ts.map +1 -0
  41. package/dist/components/content-viewer/plugins/rehypeHeadingIds.js +82 -0
  42. package/dist/components/content-viewer/plugins/rehypeHeadingIds.js.map +1 -0
  43. package/dist/components/content-viewer/plugins/remarkCallouts.d.ts +39 -0
  44. package/dist/components/content-viewer/plugins/remarkCallouts.d.ts.map +1 -0
  45. package/dist/components/content-viewer/plugins/remarkCallouts.js +77 -0
  46. package/dist/components/content-viewer/plugins/remarkCallouts.js.map +1 -0
  47. package/dist/components/content-viewer/plugins/slugify.d.ts +24 -0
  48. package/dist/components/content-viewer/plugins/slugify.d.ts.map +1 -0
  49. package/dist/components/content-viewer/plugins/slugify.js +31 -0
  50. package/dist/components/content-viewer/plugins/slugify.js.map +1 -0
  51. package/dist/components/content-viewer/sanitize.d.ts +75 -0
  52. package/dist/components/content-viewer/sanitize.d.ts.map +1 -0
  53. package/dist/components/content-viewer/sanitize.js +252 -0
  54. package/dist/components/content-viewer/sanitize.js.map +1 -0
  55. package/dist/components/content-viewer/types.d.ts +315 -0
  56. package/dist/components/content-viewer/types.d.ts.map +1 -0
  57. package/dist/components/content-viewer/types.js +8 -0
  58. package/dist/components/content-viewer/types.js.map +1 -0
  59. package/dist/components/content-viewer/variants.d.ts +71 -0
  60. package/dist/components/content-viewer/variants.d.ts.map +1 -0
  61. package/dist/components/content-viewer/variants.js +105 -0
  62. package/dist/components/content-viewer/variants.js.map +1 -0
  63. package/dist/content-viewer/ContentPane.d.ts +44 -1
  64. package/dist/content-viewer/ContentPane.d.ts.map +1 -1
  65. package/dist/content-viewer/ContentPane.js +139 -5
  66. package/dist/content-viewer/ContentPane.js.map +1 -1
  67. package/dist/content-viewer/FileTree.d.ts +23 -1
  68. package/dist/content-viewer/FileTree.d.ts.map +1 -1
  69. package/dist/content-viewer/FileTree.js +20 -5
  70. package/dist/content-viewer/FileTree.js.map +1 -1
  71. package/dist/content-viewer/index.d.ts +2 -0
  72. package/dist/content-viewer/index.d.ts.map +1 -1
  73. package/dist/content-viewer/index.js +2 -0
  74. package/dist/content-viewer/index.js.map +1 -1
  75. package/dist/diff/DiffViewer.js +3 -3
  76. package/dist/diff/DiffViewer.js.map +1 -1
  77. package/dist/discovery/discovery-card.d.ts +25 -0
  78. package/dist/discovery/discovery-card.d.ts.map +1 -0
  79. package/dist/discovery/discovery-card.js +265 -0
  80. package/dist/discovery/discovery-card.js.map +1 -0
  81. package/dist/discovery/index.d.ts +3 -0
  82. package/dist/discovery/index.d.ts.map +1 -0
  83. package/dist/discovery/index.js +3 -0
  84. package/dist/discovery/index.js.map +1 -0
  85. package/dist/display/ContextInfoCard.d.ts +61 -0
  86. package/dist/display/ContextInfoCard.d.ts.map +1 -0
  87. package/dist/display/ContextInfoCard.js +45 -0
  88. package/dist/display/ContextInfoCard.js.map +1 -0
  89. package/dist/display/index.d.ts +2 -0
  90. package/dist/display/index.d.ts.map +1 -1
  91. package/dist/display/index.js +1 -0
  92. package/dist/display/index.js.map +1 -1
  93. package/dist/editor/CodeEditor.d.ts +39 -0
  94. package/dist/editor/CodeEditor.d.ts.map +1 -0
  95. package/dist/editor/CodeEditor.js +114 -0
  96. package/dist/editor/CodeEditor.js.map +1 -0
  97. package/dist/editor/MarkdownEditor.d.ts +3 -2
  98. package/dist/editor/MarkdownEditor.d.ts.map +1 -1
  99. package/dist/editor/MarkdownEditor.js +32 -80
  100. package/dist/editor/MarkdownEditor.js.map +1 -1
  101. package/dist/editor/SplitPreview.d.ts +10 -1
  102. package/dist/editor/SplitPreview.d.ts.map +1 -1
  103. package/dist/editor/SplitPreview.js +4 -2
  104. package/dist/editor/SplitPreview.js.map +1 -1
  105. package/dist/editor/codeLanguages.d.ts +28 -0
  106. package/dist/editor/codeLanguages.d.ts.map +1 -0
  107. package/dist/editor/codeLanguages.js +54 -0
  108. package/dist/editor/codeLanguages.js.map +1 -0
  109. package/dist/editor/index.d.ts +2 -0
  110. package/dist/editor/index.d.ts.map +1 -1
  111. package/dist/editor/index.js +6 -0
  112. package/dist/editor/index.js.map +1 -1
  113. package/dist/editor/theme.d.ts +16 -0
  114. package/dist/editor/theme.d.ts.map +1 -0
  115. package/dist/editor/theme.js +82 -0
  116. package/dist/editor/theme.js.map +1 -0
  117. package/dist/filters/filter-bar.d.ts +14 -0
  118. package/dist/filters/filter-bar.d.ts.map +1 -0
  119. package/dist/filters/filter-bar.js +47 -0
  120. package/dist/filters/filter-bar.js.map +1 -0
  121. package/dist/filters/filter-slot-config.d.ts +239 -0
  122. package/dist/filters/filter-slot-config.d.ts.map +1 -0
  123. package/dist/filters/filter-slot-config.js +24 -0
  124. package/dist/filters/filter-slot-config.js.map +1 -0
  125. package/dist/filters/index.d.ts +2 -0
  126. package/dist/filters/index.d.ts.map +1 -1
  127. package/dist/filters/index.js +1 -0
  128. package/dist/filters/index.js.map +1 -1
  129. package/dist/primitives/Card.d.ts +28 -0
  130. package/dist/primitives/Card.d.ts.map +1 -0
  131. package/dist/primitives/Card.js +30 -0
  132. package/dist/primitives/Card.js.map +1 -0
  133. package/dist/primitives/CollectionPicker.d.ts +47 -0
  134. package/dist/primitives/CollectionPicker.d.ts.map +1 -0
  135. package/dist/primitives/CollectionPicker.js +105 -0
  136. package/dist/primitives/CollectionPicker.js.map +1 -0
  137. package/dist/primitives/CreateEntityDialog.d.ts +144 -0
  138. package/dist/primitives/CreateEntityDialog.d.ts.map +1 -0
  139. package/dist/primitives/CreateEntityDialog.js +379 -0
  140. package/dist/primitives/CreateEntityDialog.js.map +1 -0
  141. package/dist/primitives/FormField.d.ts +29 -0
  142. package/dist/primitives/FormField.d.ts.map +1 -0
  143. package/dist/primitives/FormField.js +27 -0
  144. package/dist/primitives/FormField.js.map +1 -0
  145. package/dist/primitives/Label.d.ts +20 -0
  146. package/dist/primitives/Label.d.ts.map +1 -0
  147. package/dist/primitives/Label.js +21 -0
  148. package/dist/primitives/Label.js.map +1 -0
  149. package/dist/primitives/SecretField.d.ts +28 -0
  150. package/dist/primitives/SecretField.d.ts.map +1 -0
  151. package/dist/primitives/SecretField.js +65 -0
  152. package/dist/primitives/SecretField.js.map +1 -0
  153. package/dist/primitives/Spinner.d.ts +16 -0
  154. package/dist/primitives/Spinner.d.ts.map +1 -0
  155. package/dist/primitives/Spinner.js +34 -0
  156. package/dist/primitives/Spinner.js.map +1 -0
  157. package/dist/primitives/Switch.d.ts +32 -0
  158. package/dist/primitives/Switch.d.ts.map +1 -0
  159. package/dist/primitives/Switch.js +43 -0
  160. package/dist/primitives/Switch.js.map +1 -0
  161. package/dist/primitives/index.d.ts +16 -0
  162. package/dist/primitives/index.d.ts.map +1 -1
  163. package/dist/primitives/index.js +9 -0
  164. package/dist/primitives/index.js.map +1 -1
  165. package/dist/utils/type-colors.d.ts.map +1 -1
  166. package/dist/utils/type-colors.js +4 -0
  167. package/dist/utils/type-colors.js.map +1 -1
  168. package/package.json +40 -6
@@ -0,0 +1,379 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * CreateEntityDialog — @miethe/ui primitive
5
+ *
6
+ * A schema-driven creation dialog for any entity type.
7
+ * Dynamically renders form fields from an `EntityFormSchema` definition using
8
+ * react-hook-form for state management and per-field validation.
9
+ *
10
+ * Only the `simple` mode is fully implemented here. `tabs` and `composite`
11
+ * modes render a placeholder until PRIM-003 / PRIM-004 are complete.
12
+ *
13
+ * @example Simple usage
14
+ * ```tsx
15
+ * <CreateEntityDialog
16
+ * open={isOpen}
17
+ * onOpenChange={setIsOpen}
18
+ * schema={{
19
+ * mode: 'simple',
20
+ * fields: [
21
+ * { name: 'name', label: 'Name', type: 'text', required: true },
22
+ * { name: 'description', label: 'Description', type: 'textarea' },
23
+ * ],
24
+ * }}
25
+ * onSubmit={async (values) => { await create(values); }}
26
+ * title="Create Skill"
27
+ * description="Add a new skill to your collection"
28
+ * />
29
+ * ```
30
+ */
31
+ import * as React from 'react';
32
+ import * as SelectPrimitive from '@radix-ui/react-select';
33
+ import * as TabsPrimitive from '@radix-ui/react-tabs';
34
+ import { AlertCircle, ChevronDown, X } from 'lucide-react';
35
+ import { useForm } from 'react-hook-form';
36
+ import { Dialog, DialogContent, DialogHeader, DialogFooter, DialogTitle, DialogDescription, } from './Dialog';
37
+ import { Input } from './Input';
38
+ import { CollectionPicker } from './CollectionPicker';
39
+ import { cn } from './utils';
40
+ // ============================================================================
41
+ // Internal helpers
42
+ // ============================================================================
43
+ /** Build react-hook-form validate rules from a FieldDef */
44
+ function buildValidateRule(field) {
45
+ return (value) => {
46
+ // Required check
47
+ if (field.required) {
48
+ const isEmpty = value === undefined ||
49
+ value === null ||
50
+ value === '' ||
51
+ (Array.isArray(value) && value.length === 0);
52
+ if (isEmpty)
53
+ return `${field.label} is required`;
54
+ }
55
+ // Zod-based validation when provided
56
+ if (field.validation && value !== undefined && value !== null && value !== '') {
57
+ const result = field.validation.safeParse(value);
58
+ if (!result.success && result.error) {
59
+ return result.error.issues[0]?.message ?? 'Invalid value';
60
+ }
61
+ }
62
+ return true;
63
+ };
64
+ }
65
+ // ============================================================================
66
+ // Textarea primitive (local — mirrors shadcn Textarea)
67
+ // ============================================================================
68
+ const Textarea = React.forwardRef(({ className, ...props }, ref) => (_jsx("textarea", { ref: ref, className: cn('flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2', 'text-sm ring-offset-background placeholder:text-muted-foreground', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:cursor-not-allowed disabled:opacity-50', 'resize-y', className), ...props })));
69
+ Textarea.displayName = 'Textarea';
70
+ function InternalSelect({ options, value, onChange, placeholder, disabled, required, id, 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, }) {
71
+ return (_jsxs(SelectPrimitive.Root, { value: value, onValueChange: onChange, disabled: disabled, required: required, children: [_jsxs(SelectPrimitive.Trigger, { id: id, className: cn('flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2', 'text-sm ring-offset-background placeholder:text-muted-foreground', 'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', 'disabled:cursor-not-allowed disabled:opacity-50', '[&>span]:line-clamp-1'), "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, "aria-required": required, children: [_jsx(SelectPrimitive.Value, { placeholder: placeholder }), _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDown, { className: "h-4 w-4 opacity-50", "aria-hidden": "true" }) })] }), _jsx(SelectPrimitive.Portal, { children: _jsx(SelectPrimitive.Content, { className: cn('relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md', 'data-[state=open]:animate-in data-[state=closed]:animate-out', 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0', 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95', 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2', 'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2'), position: "popper", sideOffset: 4, children: _jsx(SelectPrimitive.Viewport, { className: cn('p-1', 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'), children: options.map((opt) => (_jsxs(SelectPrimitive.Item, { value: opt.value, className: cn('relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none', 'focus:bg-accent focus:text-accent-foreground', 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50'), children: [_jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("polyline", { points: "20 6 9 17 4 12" }) }) }) }), _jsx(SelectPrimitive.ItemText, { children: opt.label })] }, opt.value))) }) }) })] }));
72
+ }
73
+ function MultiSelect({ options, value, onChange, disabled, id, 'aria-labelledby': ariaLabelledBy, 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, 'aria-required': ariaRequired }) {
74
+ const toggle = (optValue) => {
75
+ if (value.includes(optValue)) {
76
+ onChange(value.filter((v) => v !== optValue));
77
+ }
78
+ else {
79
+ onChange([...value, optValue]);
80
+ }
81
+ };
82
+ return (_jsx("div", { id: id, role: "group", "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, "aria-required": ariaRequired, className: "flex flex-col gap-2", children: options.map((opt) => (_jsxs("label", { className: cn('flex items-center gap-2 text-sm cursor-pointer', disabled && 'cursor-not-allowed opacity-50'), children: [_jsx("input", { type: "checkbox", checked: value.includes(opt.value), onChange: () => toggle(opt.value), disabled: disabled, className: cn('h-4 w-4 rounded border border-input accent-primary', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2') }), opt.label] }, opt.value))) }));
83
+ }
84
+ function TagInput({ value, onChange, placeholder, disabled, id, 'aria-labelledby': ariaLabelledBy, 'aria-describedby': ariaDescribedBy, 'aria-invalid': ariaInvalid, 'aria-required': ariaRequired }) {
85
+ const [inputValue, setInputValue] = React.useState('');
86
+ const inputRef = React.useRef(null);
87
+ const addTag = (raw) => {
88
+ const tags = raw
89
+ .split(',')
90
+ .map((t) => t.trim())
91
+ .filter(Boolean);
92
+ if (tags.length === 0)
93
+ return;
94
+ const next = Array.from(new Set([...value, ...tags]));
95
+ onChange(next);
96
+ setInputValue('');
97
+ };
98
+ const removeTag = (tag) => {
99
+ onChange(value.filter((t) => t !== tag));
100
+ };
101
+ const handleKeyDown = (e) => {
102
+ if (e.key === 'Enter' || e.key === ',') {
103
+ e.preventDefault();
104
+ addTag(inputValue);
105
+ }
106
+ else if (e.key === 'Backspace' && inputValue === '' && value.length > 0) {
107
+ onChange(value.slice(0, -1));
108
+ }
109
+ };
110
+ return (_jsxs("div", { className: cn('flex min-h-10 w-full flex-wrap gap-1.5 rounded-md border border-input bg-background px-3 py-2', 'text-sm ring-offset-background', 'focus-within:outline-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2', disabled && 'cursor-not-allowed opacity-50'), onClick: () => inputRef.current?.focus(), role: "group", "aria-labelledby": ariaLabelledBy, "aria-label": ariaLabelledBy ? undefined : 'Tag input', children: [value.map((tag) => (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-secondary px-2 py-0.5 text-xs font-medium text-secondary-foreground", children: [tag, !disabled && (_jsx("button", { type: "button", onClick: (e) => {
111
+ e.stopPropagation();
112
+ removeTag(tag);
113
+ }, className: "rounded-full hover:text-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "aria-label": `Remove tag ${tag}`, children: _jsx(X, { className: "h-3 w-3", "aria-hidden": "true" }) }))] }, tag))), _jsx("input", { ref: inputRef, id: id, type: "text", value: inputValue, onChange: (e) => setInputValue(e.target.value), onKeyDown: handleKeyDown, onBlur: () => { if (inputValue.trim())
114
+ addTag(inputValue); }, placeholder: value.length === 0 ? placeholder : undefined, disabled: disabled, className: "min-w-[120px] flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed", "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, "aria-required": ariaRequired })] }));
115
+ }
116
+ function FieldRenderer({ field, form, disabled }) {
117
+ const { register, control: _control, formState: { errors }, watch, setValue, } = form;
118
+ const fieldId = `ced-field-${field.name}`;
119
+ const errorId = `ced-err-${field.name}`;
120
+ const descId = field.description ? `ced-desc-${field.name}` : undefined;
121
+ const labelElId = `ced-label-${field.name}`;
122
+ const error = errors[field.name];
123
+ const errorMessage = error && typeof error.message === 'string' ? error.message : undefined;
124
+ const ariaDescribedBy = [descId, errorMessage ? errorId : undefined]
125
+ .filter(Boolean)
126
+ .join(' ') || undefined;
127
+ const ariaProps = {
128
+ 'aria-describedby': ariaDescribedBy,
129
+ 'aria-invalid': errorMessage ? true : undefined,
130
+ 'aria-required': field.required ? true : undefined,
131
+ };
132
+ const labelNode = (_jsxs("label", { id: labelElId, htmlFor: fieldId, className: "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70", children: [field.label, field.required && (_jsxs(_Fragment, { children: [_jsx("span", { className: "ml-1 text-destructive", "aria-hidden": "true", children: "*" }), _jsx("span", { className: "sr-only", children: "(required)" })] }))] }));
133
+ const descNode = field.description ? (_jsx("p", { id: descId, className: "text-xs text-muted-foreground", children: field.description })) : null;
134
+ const errorNode = errorMessage ? (_jsx("p", { id: errorId, role: "alert", className: "text-xs text-destructive", children: errorMessage })) : null;
135
+ // ── boolean ──────────────────────────────────────────────────────────────
136
+ if (field.type === 'boolean') {
137
+ const currentValue = watch(field.name);
138
+ return (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { id: fieldId, type: "checkbox", checked: Boolean(currentValue), onChange: (e) => setValue(field.name, e.target.checked, { shouldValidate: true }), disabled: disabled, className: "h-4 w-4 rounded border-input accent-primary focus-visible:ring-2 focus-visible:ring-ring", ...ariaProps }), labelNode] }), descNode, errorNode] }));
139
+ }
140
+ // ── select ────────────────────────────────────────────────────────────────
141
+ if (field.type === 'select') {
142
+ const currentValue = watch(field.name);
143
+ return (_jsxs("div", { className: "flex flex-col gap-1.5", children: [labelNode, _jsx(InternalSelect, { id: fieldId, options: field.options ?? [], value: currentValue ?? '', onChange: (v) => setValue(field.name, v, { shouldValidate: true }), placeholder: field.placeholder ?? `Select ${field.label}…`, disabled: disabled, required: field.required, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaProps['aria-invalid'] ?? false }), descNode, errorNode] }));
144
+ }
145
+ // ── multiselect ───────────────────────────────────────────────────────────
146
+ if (field.type === 'multiselect') {
147
+ const currentValue = watch(field.name);
148
+ return (_jsxs("div", { className: "flex flex-col gap-1.5", children: [labelNode, _jsx(MultiSelect, { id: fieldId, options: field.options ?? [], value: currentValue ?? [], onChange: (v) => setValue(field.name, v, { shouldValidate: true }), disabled: disabled, "aria-labelledby": labelElId, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaProps['aria-invalid'] ?? false, "aria-required": ariaProps['aria-required'] ?? false }), descNode, errorNode] }));
149
+ }
150
+ // ── tags ──────────────────────────────────────────────────────────────────
151
+ if (field.type === 'tags') {
152
+ const currentValue = watch(field.name);
153
+ return (_jsxs("div", { className: "flex flex-col gap-1.5", children: [labelNode, _jsx(TagInput, { id: fieldId, value: currentValue ?? [], onChange: (v) => setValue(field.name, v, { shouldValidate: true }), placeholder: field.placeholder ?? 'Add tags…', disabled: disabled, "aria-labelledby": labelElId, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaProps['aria-invalid'] ?? false, "aria-required": ariaProps['aria-required'] ?? false }), descNode, errorNode] }));
154
+ }
155
+ // ── textarea ──────────────────────────────────────────────────────────────
156
+ if (field.type === 'textarea') {
157
+ return (_jsxs("div", { className: "flex flex-col gap-1.5", children: [labelNode, _jsx(Textarea, { id: fieldId, placeholder: field.placeholder, disabled: disabled, className: cn(errorMessage && 'border-destructive'), ...ariaProps, ...register(field.name, { validate: buildValidateRule(field) }) }), descNode, errorNode] }));
158
+ }
159
+ // ── text | number (default) ───────────────────────────────────────────────
160
+ return (_jsxs("div", { className: "flex flex-col gap-1.5", children: [labelNode, _jsx(Input, { id: fieldId, type: field.type === 'number' ? 'number' : 'text', placeholder: field.placeholder, disabled: disabled, className: cn(errorMessage && 'border-destructive'), ...ariaProps, ...register(field.name, {
161
+ validate: buildValidateRule(field),
162
+ valueAsNumber: field.type === 'number',
163
+ }) }), descNode, errorNode] }));
164
+ }
165
+ function SimpleFormBody({ schema, form, isSubmitting, collections, defaultCollectionId, collectionValue, onCollectionChange, }) {
166
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [schema.fields.map((field) => (_jsx(FieldRenderer, { field: field, form: form, disabled: isSubmitting }, field.name))), schema.collection?.enabled && (_jsx(CollectionPicker, { config: schema.collection, collections: collections ?? [], value: collectionValue, onChange: onCollectionChange, defaultCollectionId: defaultCollectionId ?? schema.collection.defaultCollectionId }))] }));
167
+ }
168
+ function TabsFormBody({ schema, form, isSubmitting, activeTab, onActiveTabChange, tabErrors, collections, defaultCollectionId, collectionValue, onCollectionChange, }) {
169
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs(TabsPrimitive.Root, { value: activeTab, onValueChange: onActiveTabChange, children: [_jsx(TabsPrimitive.List, { className: cn('inline-flex h-9 w-full items-center justify-start rounded-lg bg-muted p-1 text-muted-foreground', 'border-b border-border'), "aria-label": "Form sections", children: schema.tabs.map((tab) => {
170
+ const errCount = tabErrors[tab.id] ?? 0;
171
+ const Icon = tab.icon;
172
+ return (_jsxs(TabsPrimitive.Trigger, { value: tab.id, className: cn('relative inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50', 'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow'), children: [Icon && (_jsx(Icon, { className: cn('h-3.5 w-3.5', errCount > 0 ? 'text-destructive' : 'text-muted-foreground'), "aria-hidden": "true" })), _jsx("span", { className: cn(errCount > 0 && 'text-destructive'), children: tab.label }), errCount > 0 && (_jsx("span", { className: "ml-0.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-[10px] font-semibold text-destructive-foreground", "aria-label": `${errCount} error${errCount === 1 ? '' : 's'}`, children: errCount }))] }, tab.id));
173
+ }) }), schema.tabs.map((tab) => (_jsx(TabsPrimitive.Content, { value: tab.id, className: cn('mt-4 ring-offset-background', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2'), children: tab.renderTabContent ? (tab.renderTabContent(form)) : (_jsx("div", { className: "flex flex-col gap-4", children: tab.fields.map((field) => (_jsx(FieldRenderer, { field: field, form: form, disabled: isSubmitting }, field.name))) })) }, tab.id)))] }), schema.collection?.enabled && (_jsx(CollectionPicker, { config: schema.collection, collections: collections ?? [], value: collectionValue, onChange: onCollectionChange, defaultCollectionId: defaultCollectionId ?? schema.collection.defaultCollectionId }))] }));
174
+ }
175
+ // ============================================================================
176
+ // COMPOSITE_MEMBERS_TAB_ID / COMPOSITE_REVIEW_TAB_ID — stable virtual tab ids
177
+ // ============================================================================
178
+ const COMPOSITE_MEMBERS_TAB_ID = '__composite_members__';
179
+ const COMPOSITE_REVIEW_TAB_ID = '__composite_review__';
180
+ function MemberPickerTab({ config, memberIds, onMemberIdsChange, disabled, memberError, }) {
181
+ const [inputValue, setInputValue] = React.useState('');
182
+ const inputRef = React.useRef(null);
183
+ const inputId = 'composite-member-input';
184
+ const errorId = 'composite-member-error';
185
+ const addMember = (raw) => {
186
+ const ids = raw
187
+ .split(',')
188
+ .map((s) => s.trim())
189
+ .filter(Boolean);
190
+ if (ids.length === 0)
191
+ return;
192
+ // Enforce max
193
+ if (config.validateMax !== undefined) {
194
+ const available = config.validateMax - memberIds.length;
195
+ if (available <= 0)
196
+ return;
197
+ const toAdd = ids.slice(0, available);
198
+ onMemberIdsChange(Array.from(new Set([...memberIds, ...toAdd])));
199
+ }
200
+ else {
201
+ onMemberIdsChange(Array.from(new Set([...memberIds, ...ids])));
202
+ }
203
+ setInputValue('');
204
+ };
205
+ const removeMember = (id) => {
206
+ onMemberIdsChange(memberIds.filter((m) => m !== id));
207
+ };
208
+ const handleKeyDown = (e) => {
209
+ if (e.key === 'Enter' || e.key === ',') {
210
+ e.preventDefault();
211
+ addMember(inputValue);
212
+ }
213
+ else if (e.key === 'Backspace' && inputValue === '' && memberIds.length > 0) {
214
+ onMemberIdsChange(memberIds.slice(0, -1));
215
+ }
216
+ };
217
+ const atMax = config.validateMax !== undefined && memberIds.length >= config.validateMax;
218
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsxs("label", { htmlFor: inputId, className: "text-sm font-medium leading-none", children: [config.label, config.validateMin !== undefined && config.validateMin > 0 && (_jsxs(_Fragment, { children: [_jsx("span", { className: "ml-1 text-destructive", "aria-hidden": "true", children: "*" }), _jsx("span", { className: "sr-only", children: "(required)" })] }))] }), (config.validateMin !== undefined || config.validateMax !== undefined) && (_jsx("p", { className: "text-xs text-muted-foreground", children: config.validateMin !== undefined && config.validateMax !== undefined
219
+ ? `Select between ${config.validateMin} and ${config.validateMax} members`
220
+ : config.validateMin !== undefined
221
+ ? `Select at least ${config.validateMin} member${config.validateMin === 1 ? '' : 's'}`
222
+ : `Select up to ${config.validateMax} member${config.validateMax === 1 ? '' : 's'}` })), _jsxs("div", { className: cn('flex min-h-[44px] w-full flex-wrap gap-1.5 rounded-md border border-input bg-background px-3 py-2', 'text-sm ring-offset-background', 'focus-within:outline-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2', memberError && 'border-destructive', disabled && 'cursor-not-allowed opacity-50'), onClick: () => inputRef.current?.focus(), role: "group", "aria-label": `${config.label} members`, children: [memberIds.map((id) => (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-secondary px-2 py-0.5 text-xs font-medium text-secondary-foreground", children: [_jsx("span", { className: "max-w-[160px] truncate", title: id, children: id }), !disabled && (_jsx("button", { type: "button", onClick: (e) => {
223
+ e.stopPropagation();
224
+ removeMember(id);
225
+ }, className: "rounded-full hover:text-destructive focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "aria-label": `Remove member ${id}`, children: _jsx(X, { className: "h-3 w-3", "aria-hidden": "true" }) }))] }, id))), !atMax && (_jsx("input", { ref: inputRef, id: inputId, type: "text", value: inputValue, onChange: (e) => setInputValue(e.target.value), onKeyDown: handleKeyDown, onBlur: () => { if (inputValue.trim())
226
+ addMember(inputValue); }, placeholder: memberIds.length === 0 ? `Enter ${config.entityType} IDs…` : undefined, disabled: disabled, "aria-describedby": memberError ? errorId : undefined, "aria-invalid": memberError ? true : undefined, className: "min-w-[180px] flex-1 bg-transparent outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed" }))] }), memberError && (_jsx("p", { id: errorId, role: "alert", className: "text-xs text-destructive", children: memberError }))] }), _jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground", children: [_jsxs("span", { className: cn('rounded-full px-2 py-0.5 font-medium', memberIds.length > 0
227
+ ? 'bg-primary/10 text-primary'
228
+ : 'bg-muted text-muted-foreground'), children: [memberIds.length, " selected"] }), atMax && (_jsx("span", { className: "text-amber-600 dark:text-amber-400", children: "Maximum reached" }))] })] }));
229
+ }
230
+ function DefaultReviewStep({ tabs, formValues, memberIds, membersConfig, }) {
231
+ return (_jsxs("div", { className: "flex flex-col gap-6", children: [tabs.map((tab) => {
232
+ const filledFields = tab.fields.filter((f) => formValues[f.name] !== undefined && formValues[f.name] !== '' &&
233
+ !(Array.isArray(formValues[f.name]) && formValues[f.name].length === 0));
234
+ if (filledFields.length === 0)
235
+ return null;
236
+ return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("h4", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: tab.label }), _jsx("dl", { className: "flex flex-col gap-1.5", children: filledFields.map((f) => {
237
+ const val = formValues[f.name];
238
+ let display;
239
+ if (Array.isArray(val)) {
240
+ display = val.join(', ') || '—';
241
+ }
242
+ else if (typeof val === 'boolean') {
243
+ display = val ? 'Yes' : 'No';
244
+ }
245
+ else {
246
+ display = String(val ?? '—');
247
+ }
248
+ return (_jsxs("div", { className: "flex gap-2 text-sm", children: [_jsx("dt", { className: "w-32 shrink-0 font-medium text-muted-foreground truncate", children: f.label }), _jsx("dd", { className: "flex-1 truncate", children: display })] }, f.name));
249
+ }) })] }, tab.id));
250
+ }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("h4", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: membersConfig.label }), memberIds.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "No members selected" })) : (_jsx("ul", { role: "list", className: "flex flex-col gap-1", children: memberIds.map((id) => (_jsxs("li", { role: "listitem", className: "flex items-center gap-2 text-sm", children: [_jsx("span", { className: "h-1.5 w-1.5 shrink-0 rounded-full bg-primary", "aria-hidden": "true" }), _jsx("span", { className: "truncate", children: id })] }, id))) }))] })] }));
251
+ }
252
+ function CompositeFormBody({ schema, form, isSubmitting, activeTab, onActiveTabChange, tabErrors, memberIds, onMemberIdsChange, memberError, collections, defaultCollectionId, collectionValue, onCollectionChange, }) {
253
+ // Review tab is always shown in composite mode (default summary when renderReviewStep is absent)
254
+ const hasCustomReview = schema.renderReviewStep !== undefined;
255
+ // Build the virtual tab list: schema tabs + members + review
256
+ const membersTabTrigger = (_jsxs(TabsPrimitive.Trigger, { value: COMPOSITE_MEMBERS_TAB_ID, className: cn('relative inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50', 'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow'), children: [_jsx("span", { className: cn(memberError && 'text-destructive'), children: schema.members.label }), memberError && (_jsx("span", { className: "ml-0.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-[10px] font-semibold text-destructive-foreground", "aria-label": "1 error", children: "1" }))] }, COMPOSITE_MEMBERS_TAB_ID));
257
+ const reviewTabTrigger = (_jsx(TabsPrimitive.Trigger, { value: COMPOSITE_REVIEW_TAB_ID, className: cn('relative inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50', 'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow'), children: "Review" }, COMPOSITE_REVIEW_TAB_ID));
258
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs(TabsPrimitive.Root, { value: activeTab, onValueChange: onActiveTabChange, children: [_jsxs(TabsPrimitive.List, { className: cn('inline-flex h-9 w-full items-center justify-start rounded-lg bg-muted p-1 text-muted-foreground', 'border-b border-border'), "aria-label": "Form sections", children: [schema.tabs.map((tab) => {
259
+ const errCount = tabErrors[tab.id] ?? 0;
260
+ const Icon = tab.icon;
261
+ return (_jsxs(TabsPrimitive.Trigger, { value: tab.id, className: cn('relative inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50', 'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow'), children: [Icon && (_jsx(Icon, { className: cn('h-3.5 w-3.5', errCount > 0 ? 'text-destructive' : 'text-muted-foreground'), "aria-hidden": "true" })), _jsx("span", { className: cn(errCount > 0 && 'text-destructive'), children: tab.label }), errCount > 0 && (_jsx("span", { className: "ml-0.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-[10px] font-semibold text-destructive-foreground", "aria-label": `${errCount} error${errCount === 1 ? '' : 's'}`, children: errCount }))] }, tab.id));
262
+ }), membersTabTrigger, reviewTabTrigger] }), schema.tabs.map((tab) => (_jsx(TabsPrimitive.Content, { value: tab.id, className: cn('mt-4 ring-offset-background', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2'), children: tab.renderTabContent ? (tab.renderTabContent(form)) : (_jsx("div", { className: "flex flex-col gap-4", children: tab.fields.map((field) => (_jsx(FieldRenderer, { field: field, form: form, disabled: isSubmitting }, field.name))) })) }, tab.id))), _jsx(TabsPrimitive.Content, { value: COMPOSITE_MEMBERS_TAB_ID, className: cn('mt-4 ring-offset-background', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2'), children: _jsx(MemberPickerTab, { config: schema.members, memberIds: memberIds, onMemberIdsChange: onMemberIdsChange, disabled: isSubmitting, memberError: memberError }) }), _jsx(TabsPrimitive.Content, { value: COMPOSITE_REVIEW_TAB_ID, className: cn('mt-4 ring-offset-background', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2'), children: hasCustomReview && schema.renderReviewStep
263
+ ? schema.renderReviewStep({
264
+ values: form.getValues(),
265
+ memberIds,
266
+ })
267
+ : (_jsx(DefaultReviewStep, { tabs: schema.tabs, formValues: form.getValues(), memberIds: memberIds, membersConfig: schema.members })) })] }), schema.collection?.enabled && (_jsx(CollectionPicker, { config: schema.collection, collections: collections ?? [], value: collectionValue, onChange: onCollectionChange, defaultCollectionId: defaultCollectionId ?? schema.collection.defaultCollectionId }))] }));
268
+ }
269
+ // ============================================================================
270
+ // CreateEntityDialog
271
+ // ============================================================================
272
+ export function CreateEntityDialog({ open, onOpenChange, schema, onSubmit, title, description, submitLabel = 'Create', isSubmitting = false, error, collections, defaultCollectionId, memberIds: controlledMemberIds, onMemberIdsChange: onControlledMemberIdsChange, }) {
273
+ // Build default values from schema fields (handles all modes)
274
+ const defaultValues = React.useMemo(() => {
275
+ const allFields = schema.mode === 'simple'
276
+ ? schema.fields
277
+ : schema.tabs.flatMap((t) => t.fields);
278
+ return Object.fromEntries(allFields.map((f) => {
279
+ if (f.defaultValue !== undefined)
280
+ return [f.name, f.defaultValue];
281
+ if (f.type === 'multiselect' || f.type === 'tags')
282
+ return [f.name, []];
283
+ if (f.type === 'boolean')
284
+ return [f.name, false];
285
+ if (f.type === 'number')
286
+ return [f.name, ''];
287
+ return [f.name, ''];
288
+ }));
289
+ }, [schema]);
290
+ const form = useForm({ defaultValues });
291
+ // Collection picker state (managed outside react-hook-form)
292
+ const [collectionValue, setCollectionValue] = React.useState(defaultCollectionId);
293
+ // Active tab state for tabs mode (first tab is default)
294
+ const firstTabId = schema.mode !== 'simple' && schema.tabs.length > 0
295
+ ? schema.tabs[0].id
296
+ : '';
297
+ const [activeTab, setActiveTab] = React.useState(firstTabId);
298
+ // Member IDs for composite mode — uncontrolled internal state seeded by prop
299
+ const [internalMemberIds, setInternalMemberIds] = React.useState(controlledMemberIds ?? []);
300
+ const memberIds = controlledMemberIds ?? internalMemberIds;
301
+ const handleMemberIdsChange = React.useCallback((ids) => {
302
+ setInternalMemberIds(ids);
303
+ onControlledMemberIdsChange?.(ids);
304
+ }, [onControlledMemberIdsChange]);
305
+ // Member validation error (composite mode)
306
+ const [memberError, setMemberError] = React.useState(undefined);
307
+ // Compute per-tab error counts from form state
308
+ const tabErrors = React.useMemo(() => {
309
+ if (schema.mode === 'simple')
310
+ return {};
311
+ const errors = form.formState.errors;
312
+ const counts = {};
313
+ for (const tab of schema.tabs) {
314
+ counts[tab.id] = tab.fields.filter((f) => errors[f.name] !== undefined).length;
315
+ }
316
+ return counts;
317
+ }, [schema, form.formState.errors]);
318
+ // Reset form when dialog closes
319
+ const handleOpenChange = (nextOpen) => {
320
+ if (!nextOpen) {
321
+ form.reset(defaultValues);
322
+ setCollectionValue(defaultCollectionId);
323
+ setActiveTab(firstTabId);
324
+ setInternalMemberIds(controlledMemberIds ?? []);
325
+ setMemberError(undefined);
326
+ }
327
+ onOpenChange(nextOpen);
328
+ };
329
+ // On submit: validate all fields + member count; navigate to first error tab
330
+ const handleSubmit = form.handleSubmit(async (values) => {
331
+ // Validate member count for composite mode
332
+ if (schema.mode === 'composite') {
333
+ const { validateMin, validateMax } = schema.members;
334
+ if (validateMin !== undefined && memberIds.length < validateMin) {
335
+ const msg = `At least ${validateMin} member${validateMin === 1 ? '' : 's'} required`;
336
+ setMemberError(msg);
337
+ setActiveTab(COMPOSITE_MEMBERS_TAB_ID);
338
+ return;
339
+ }
340
+ if (validateMax !== undefined && memberIds.length > validateMax) {
341
+ const msg = `No more than ${validateMax} member${validateMax === 1 ? '' : 's'} allowed`;
342
+ setMemberError(msg);
343
+ setActiveTab(COMPOSITE_MEMBERS_TAB_ID);
344
+ return;
345
+ }
346
+ }
347
+ setMemberError(undefined);
348
+ const payload = { ...values };
349
+ if (collectionValue) {
350
+ payload['_collectionId'] = collectionValue;
351
+ }
352
+ if (schema.mode === 'composite') {
353
+ payload['_memberIds'] = memberIds;
354
+ }
355
+ await onSubmit(payload);
356
+ }, (errors) => {
357
+ // Navigate to the first tab that contains an error
358
+ if (schema.mode !== 'simple') {
359
+ for (const tab of schema.tabs) {
360
+ const hasError = tab.fields.some((f) => errors[f.name] !== undefined);
361
+ if (hasError) {
362
+ setActiveTab(tab.id);
363
+ break;
364
+ }
365
+ }
366
+ }
367
+ });
368
+ // ── Tabs mode ─────────────────────────────────────────────────────────────
369
+ if (schema.mode === 'tabs') {
370
+ return (_jsx(Dialog, { open: open, onOpenChange: handleOpenChange, children: _jsxs(DialogContent, { className: "flex max-h-[90vh] flex-col overflow-hidden sm:max-w-[560px]", children: [_jsxs(DialogHeader, { className: "shrink-0", children: [_jsx(DialogTitle, { children: title }), description && _jsx(DialogDescription, { children: description })] }), error && (_jsxs("div", { role: "alert", className: cn('flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2', 'text-sm text-destructive'), children: [_jsx(AlertCircle, { className: "mt-0.5 h-4 w-4 shrink-0", "aria-hidden": "true" }), _jsx("span", { children: error })] })), _jsx("form", { id: "create-entity-form", onSubmit: handleSubmit, className: "min-h-0 flex-1 overflow-y-auto py-4", noValidate: true, children: _jsx(TabsFormBody, { schema: schema, form: form, isSubmitting: isSubmitting, activeTab: activeTab, onActiveTabChange: setActiveTab, tabErrors: tabErrors, collections: collections, defaultCollectionId: defaultCollectionId, collectionValue: collectionValue, onCollectionChange: setCollectionValue }) }), _jsxs(DialogFooter, { className: "shrink-0 border-t pt-4", children: [_jsx("button", { type: "button", onClick: () => handleOpenChange(false), disabled: isSubmitting, className: cn('inline-flex h-10 items-center justify-center rounded-md border border-input bg-background px-4 py-2', 'text-sm font-medium ring-offset-background', 'hover:bg-accent hover:text-accent-foreground', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50'), children: "Cancel" }), _jsx("button", { type: "submit", form: "create-entity-form", disabled: isSubmitting, className: cn('inline-flex h-10 items-center justify-center rounded-md bg-primary px-4 py-2', 'text-sm font-medium text-primary-foreground ring-offset-background', 'hover:bg-primary/90', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50'), "aria-busy": isSubmitting, children: isSubmitting ? 'Saving…' : submitLabel })] })] }) }));
371
+ }
372
+ // ── Composite mode ────────────────────────────────────────────────────────
373
+ if (schema.mode === 'composite') {
374
+ return (_jsx(Dialog, { open: open, onOpenChange: handleOpenChange, children: _jsxs(DialogContent, { className: "flex max-h-[90vh] flex-col overflow-hidden sm:max-w-[600px]", children: [_jsxs(DialogHeader, { className: "shrink-0", children: [_jsx(DialogTitle, { children: title }), description && _jsx(DialogDescription, { children: description })] }), error && (_jsxs("div", { role: "alert", className: cn('flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2', 'text-sm text-destructive'), children: [_jsx(AlertCircle, { className: "mt-0.5 h-4 w-4 shrink-0", "aria-hidden": "true" }), _jsx("span", { children: error })] })), _jsx("form", { id: "create-entity-form", onSubmit: handleSubmit, className: "min-h-0 flex-1 overflow-y-auto py-4", noValidate: true, children: _jsx(CompositeFormBody, { schema: schema, form: form, isSubmitting: isSubmitting, activeTab: activeTab, onActiveTabChange: setActiveTab, tabErrors: tabErrors, memberIds: memberIds, onMemberIdsChange: handleMemberIdsChange, memberError: memberError, collections: collections, defaultCollectionId: defaultCollectionId, collectionValue: collectionValue, onCollectionChange: setCollectionValue }) }), _jsxs(DialogFooter, { className: "shrink-0 border-t pt-4", children: [_jsx("button", { type: "button", onClick: () => handleOpenChange(false), disabled: isSubmitting, className: cn('inline-flex h-10 items-center justify-center rounded-md border border-input bg-background px-4 py-2', 'text-sm font-medium ring-offset-background', 'hover:bg-accent hover:text-accent-foreground', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50'), children: "Cancel" }), _jsx("button", { type: "submit", form: "create-entity-form", disabled: isSubmitting, className: cn('inline-flex h-10 items-center justify-center rounded-md bg-primary px-4 py-2', 'text-sm font-medium text-primary-foreground ring-offset-background', 'hover:bg-primary/90', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50'), "aria-busy": isSubmitting, children: isSubmitting ? 'Saving…' : submitLabel })] })] }) }));
375
+ }
376
+ // ── Simple mode ───────────────────────────────────────────────────────────
377
+ return (_jsx(Dialog, { open: open, onOpenChange: handleOpenChange, children: _jsxs(DialogContent, { className: "flex max-h-[90vh] flex-col overflow-hidden sm:max-w-[560px]", children: [_jsxs(DialogHeader, { className: "shrink-0", children: [_jsx(DialogTitle, { children: title }), description && _jsx(DialogDescription, { children: description })] }), error && (_jsxs("div", { role: "alert", className: cn('flex items-start gap-2 rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2', 'text-sm text-destructive'), children: [_jsx(AlertCircle, { className: "mt-0.5 h-4 w-4 shrink-0", "aria-hidden": "true" }), _jsx("span", { children: error })] })), _jsx("form", { id: "create-entity-form", onSubmit: handleSubmit, className: "min-h-0 flex-1 overflow-y-auto py-4", noValidate: true, children: _jsx(SimpleFormBody, { schema: schema, form: form, isSubmitting: isSubmitting, collections: collections, defaultCollectionId: defaultCollectionId, collectionValue: collectionValue, onCollectionChange: setCollectionValue }) }), _jsxs(DialogFooter, { className: "shrink-0 border-t pt-4", children: [_jsx("button", { type: "button", onClick: () => handleOpenChange(false), disabled: isSubmitting, className: cn('inline-flex h-10 items-center justify-center rounded-md border border-input bg-background px-4 py-2', 'text-sm font-medium ring-offset-background', 'hover:bg-accent hover:text-accent-foreground', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50'), children: "Cancel" }), _jsx("button", { type: "submit", form: "create-entity-form", disabled: isSubmitting, className: cn('inline-flex h-10 items-center justify-center rounded-md bg-primary px-4 py-2', 'text-sm font-medium text-primary-foreground ring-offset-background', 'hover:bg-primary/90', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', 'disabled:pointer-events-none disabled:opacity-50'), "aria-busy": isSubmitting, children: isSubmitting ? 'Saving…' : submitLabel })] })] }) }));
378
+ }
379
+ //# sourceMappingURL=CreateEntityDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateEntityDialog.js","sourceRoot":"","sources":["../../src/primitives/CreateEntityDialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import * as React from 'react';
2
+ export interface FormFieldProps {
3
+ /** Text label rendered above the control. */
4
+ label?: string;
5
+ /** Associates the label with the control via `htmlFor` / `id`. */
6
+ htmlFor?: string;
7
+ /** Inline error message; triggers `role="alert"` on the error element. */
8
+ error?: string;
9
+ /** Supplementary hint rendered below the control. */
10
+ hint?: string;
11
+ /** Renders an asterisk and communicates `aria-required` semantics. */
12
+ required?: boolean;
13
+ children?: React.ReactNode;
14
+ className?: string;
15
+ }
16
+ /**
17
+ * Composable form field wrapper that renders an optional label, child control,
18
+ * optional error message, and optional hint text.
19
+ *
20
+ * When `error` is set the error text is wrapped in `role="alert"` so that
21
+ * screen readers announce it immediately. When `required` is set an asterisk
22
+ * is appended to the label (hidden from AT) and `aria-required={true}` is
23
+ * injected directly onto the child control via `React.cloneElement` — so
24
+ * callers do not need to remember to pass `aria-required` themselves. If the
25
+ * child already carries an explicit `aria-required` prop it is preserved.
26
+ */
27
+ declare function FormField({ label, htmlFor, error, hint, required, children, className, }: FormFieldProps): import("react/jsx-runtime").JSX.Element;
28
+ export { FormField };
29
+ //# sourceMappingURL=FormField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormField.d.ts","sourceRoot":"","sources":["../../src/primitives/FormField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,iBAAS,SAAS,CAAC,EACjB,KAAK,EACL,OAAO,EACP,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE,cAAc,2CA0ChB;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { cn } from './utils';
4
+ import { Label } from './Label';
5
+ /**
6
+ * Composable form field wrapper that renders an optional label, child control,
7
+ * optional error message, and optional hint text.
8
+ *
9
+ * When `error` is set the error text is wrapped in `role="alert"` so that
10
+ * screen readers announce it immediately. When `required` is set an asterisk
11
+ * is appended to the label (hidden from AT) and `aria-required={true}` is
12
+ * injected directly onto the child control via `React.cloneElement` — so
13
+ * callers do not need to remember to pass `aria-required` themselves. If the
14
+ * child already carries an explicit `aria-required` prop it is preserved.
15
+ */
16
+ function FormField({ label, htmlFor, error, hint, required, children, className, }) {
17
+ // Inject aria-required onto the direct child control when required is true,
18
+ // without overriding an explicit value the caller already set.
19
+ const child = required && React.isValidElement(children)
20
+ ? React.cloneElement(children, {
21
+ 'aria-required': children.props['aria-required'] ?? true,
22
+ })
23
+ : children;
24
+ return (_jsxs("div", { className: cn('flex flex-col gap-1.5', className), children: [label && (_jsxs(Label, { htmlFor: htmlFor, children: [label, required && (_jsx("span", { className: "ml-0.5 text-destructive", "aria-hidden": "true", children: "*" }))] })), _jsx("div", { "data-required": required ? 'true' : undefined, children: child }), error && (_jsx("p", { role: "alert", className: "text-sm font-medium text-destructive", children: error })), hint && !error && (_jsx("p", { className: "text-sm text-muted-foreground", children: hint }))] }));
25
+ }
26
+ export { FormField };
27
+ //# sourceMappingURL=FormField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormField.js","sourceRoot":"","sources":["../../src/primitives/FormField.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAiBhC;;;;;;;;;;GAUG;AACH,SAAS,SAAS,CAAC,EACjB,KAAK,EACL,OAAO,EACP,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,EACR,SAAS,GACM;IACf,4EAA4E;IAC5E,+DAA+D;IAC/D,MAAM,KAAK,GACT,QAAQ,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC;QACxC,CAAC,CAAC,KAAK,CAAC,YAAY,CAChB,QAAuD,EACvD;YACE,eAAe,EACZ,QAAwD,CAAC,KAAK,CAC7D,eAAe,CAChB,IAAI,IAAI;SACZ,CACF;QACH,CAAC,CAAC,QAAQ,CAAC;IAEf,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,aACnD,KAAK,IAAI,CACR,MAAC,KAAK,IAAC,OAAO,EAAE,OAAO,aACpB,KAAK,EACL,QAAQ,IAAI,CACX,eAAM,SAAS,EAAC,yBAAyB,iBAAa,MAAM,kBAErD,CACR,IACK,CACT,EAED,+BAAoB,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,YAAG,KAAK,GAAO,EAE/D,KAAK,IAAI,CACR,YAAG,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,sCAAsC,YAC7D,KAAK,GACJ,CACL,EAEA,IAAI,IAAI,CAAC,KAAK,IAAI,CACjB,YAAG,SAAS,EAAC,+BAA+B,YAAE,IAAI,GAAK,CACxD,IACG,CACP,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+ import { type VariantProps } from 'class-variance-authority';
3
+ declare const labelVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
4
+ export interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement>, VariantProps<typeof labelVariants> {
5
+ }
6
+ /**
7
+ * Accessible form label rendered as a `<label>` element.
8
+ * Pass `htmlFor` matching the target control's `id` to associate them.
9
+ * Automatically dims when the associated control is disabled (via the
10
+ * `peer-disabled` Tailwind variant).
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * <Label htmlFor="email">Email address</Label>
15
+ * <Input id="email" type="email" />
16
+ * ```
17
+ */
18
+ declare const Label: React.ForwardRefExoticComponent<LabelProps & React.RefAttributes<HTMLLabelElement>>;
19
+ export { Label };
20
+ //# sourceMappingURL=Label.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Label.d.ts","sourceRoot":"","sources":["../../src/primitives/Label.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,QAAA,MAAM,aAAa,oFAElB,CAAC;AAEF,MAAM,WAAW,UACf,SAAQ,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EACjD,YAAY,CAAC,OAAO,aAAa,CAAC;CAAG;AAEzC;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,KAAK,qFAIV,CAAC;AAGF,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -0,0 +1,21 @@
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 './utils';
5
+ const labelVariants = cva('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70');
6
+ /**
7
+ * Accessible form label rendered as a `<label>` element.
8
+ * Pass `htmlFor` matching the target control's `id` to associate them.
9
+ * Automatically dims when the associated control is disabled (via the
10
+ * `peer-disabled` Tailwind variant).
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * <Label htmlFor="email">Email address</Label>
15
+ * <Input id="email" type="email" />
16
+ * ```
17
+ */
18
+ const Label = React.forwardRef(({ className, ...props }, ref) => (_jsx("label", { ref: ref, className: cn(labelVariants(), className), ...props })));
19
+ Label.displayName = 'Label';
20
+ export { Label };
21
+ //# sourceMappingURL=Label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Label.js","sourceRoot":"","sources":["../../src/primitives/Label.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,SAAS,CAAC;AAE7B,MAAM,aAAa,GAAG,GAAG,CACvB,4FAA4F,CAC7F,CAAC;AAMF;;;;;;;;;;;GAWG;AACH,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAC5B,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,gBAAO,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAC1E,CACF,CAAC;AACF,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC;AAE5B,OAAO,EAAE,KAAK,EAAE,CAAC"}