@modern-admin/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/dist/components/accordion.d.ts +7 -0
  2. package/dist/components/accordion.d.ts.map +1 -0
  3. package/dist/components/accordion.jsx +19 -0
  4. package/dist/components/accordion.jsx.map +1 -0
  5. package/dist/components/alert-dialog.d.ts +22 -0
  6. package/dist/components/alert-dialog.d.ts.map +1 -0
  7. package/dist/components/alert-dialog.jsx +27 -0
  8. package/dist/components/alert-dialog.jsx.map +1 -0
  9. package/dist/components/audit-timeline.d.ts +24 -0
  10. package/dist/components/audit-timeline.d.ts.map +1 -0
  11. package/dist/components/audit-timeline.jsx +60 -0
  12. package/dist/components/audit-timeline.jsx.map +1 -0
  13. package/dist/components/avatar.d.ts +6 -0
  14. package/dist/components/avatar.d.ts.map +1 -0
  15. package/dist/components/avatar.jsx +10 -0
  16. package/dist/components/avatar.jsx.map +1 -0
  17. package/dist/components/badge.d.ts +10 -0
  18. package/dist/components/badge.d.ts.map +1 -0
  19. package/dist/components/badge.jsx +19 -0
  20. package/dist/components/badge.jsx.map +1 -0
  21. package/dist/components/breadcrumb.d.ts +17 -0
  22. package/dist/components/breadcrumb.d.ts.map +1 -0
  23. package/dist/components/breadcrumb.jsx +27 -0
  24. package/dist/components/breadcrumb.jsx.map +1 -0
  25. package/dist/components/button.d.ts +12 -0
  26. package/dist/components/button.d.ts.map +1 -0
  27. package/dist/components/button.jsx +37 -0
  28. package/dist/components/button.jsx.map +1 -0
  29. package/dist/components/calendar.d.ts +9 -0
  30. package/dist/components/calendar.d.ts.map +1 -0
  31. package/dist/components/calendar.jsx +102 -0
  32. package/dist/components/calendar.jsx.map +1 -0
  33. package/dist/components/card.d.ts +8 -0
  34. package/dist/components/card.d.ts.map +1 -0
  35. package/dist/components/card.jsx +18 -0
  36. package/dist/components/card.jsx.map +1 -0
  37. package/dist/components/chart.d.ts +97 -0
  38. package/dist/components/chart.d.ts.map +1 -0
  39. package/dist/components/chart.jsx +233 -0
  40. package/dist/components/chart.jsx.map +1 -0
  41. package/dist/components/checkbox.d.ts +4 -0
  42. package/dist/components/checkbox.d.ts.map +1 -0
  43. package/dist/components/checkbox.jsx +11 -0
  44. package/dist/components/checkbox.jsx.map +1 -0
  45. package/dist/components/combobox.d.ts +46 -0
  46. package/dist/components/combobox.d.ts.map +1 -0
  47. package/dist/components/combobox.jsx +145 -0
  48. package/dist/components/combobox.jsx.map +1 -0
  49. package/dist/components/command.d.ts +80 -0
  50. package/dist/components/command.d.ts.map +1 -0
  51. package/dist/components/command.jsx +32 -0
  52. package/dist/components/command.jsx.map +1 -0
  53. package/dist/components/date-picker.d.ts +24 -0
  54. package/dist/components/date-picker.d.ts.map +1 -0
  55. package/dist/components/date-picker.jsx +149 -0
  56. package/dist/components/date-picker.jsx.map +1 -0
  57. package/dist/components/date-range-input.d.ts +22 -0
  58. package/dist/components/date-range-input.d.ts.map +1 -0
  59. package/dist/components/date-range-input.jsx +202 -0
  60. package/dist/components/date-range-input.jsx.map +1 -0
  61. package/dist/components/dialog.d.ts +19 -0
  62. package/dist/components/dialog.d.ts.map +1 -0
  63. package/dist/components/dialog.jsx +30 -0
  64. package/dist/components/dialog.jsx.map +1 -0
  65. package/dist/components/diff-view.d.ts +24 -0
  66. package/dist/components/diff-view.d.ts.map +1 -0
  67. package/dist/components/diff-view.jsx +69 -0
  68. package/dist/components/diff-view.jsx.map +1 -0
  69. package/dist/components/dropdown-menu.d.ts +27 -0
  70. package/dist/components/dropdown-menu.d.ts.map +1 -0
  71. package/dist/components/dropdown-menu.jsx +48 -0
  72. package/dist/components/dropdown-menu.jsx.map +1 -0
  73. package/dist/components/empty.d.ts +15 -0
  74. package/dist/components/empty.d.ts.map +1 -0
  75. package/dist/components/empty.jsx +27 -0
  76. package/dist/components/empty.jsx.map +1 -0
  77. package/dist/components/field.d.ts +23 -0
  78. package/dist/components/field.d.ts.map +1 -0
  79. package/dist/components/field.jsx +60 -0
  80. package/dist/components/field.jsx.map +1 -0
  81. package/dist/components/file-input.d.ts +50 -0
  82. package/dist/components/file-input.d.ts.map +1 -0
  83. package/dist/components/file-input.jsx +104 -0
  84. package/dist/components/file-input.jsx.map +1 -0
  85. package/dist/components/form.d.ts +20 -0
  86. package/dist/components/form.d.ts.map +1 -0
  87. package/dist/components/form.jsx +66 -0
  88. package/dist/components/form.jsx.map +1 -0
  89. package/dist/components/info-tooltip.d.ts +11 -0
  90. package/dist/components/info-tooltip.d.ts.map +1 -0
  91. package/dist/components/info-tooltip.jsx +17 -0
  92. package/dist/components/info-tooltip.jsx.map +1 -0
  93. package/dist/components/input.d.ts +13 -0
  94. package/dist/components/input.d.ts.map +1 -0
  95. package/dist/components/input.jsx +19 -0
  96. package/dist/components/input.jsx.map +1 -0
  97. package/dist/components/json-editor.d.ts +23 -0
  98. package/dist/components/json-editor.d.ts.map +1 -0
  99. package/dist/components/json-editor.jsx +143 -0
  100. package/dist/components/json-editor.jsx.map +1 -0
  101. package/dist/components/kbd.d.ts +15 -0
  102. package/dist/components/kbd.d.ts.map +1 -0
  103. package/dist/components/kbd.jsx +23 -0
  104. package/dist/components/kbd.jsx.map +1 -0
  105. package/dist/components/key-value-editor.d.ts +92 -0
  106. package/dist/components/key-value-editor.d.ts.map +1 -0
  107. package/dist/components/key-value-editor.jsx +187 -0
  108. package/dist/components/key-value-editor.jsx.map +1 -0
  109. package/dist/components/keyboard-shortcuts-help.d.ts +17 -0
  110. package/dist/components/keyboard-shortcuts-help.d.ts.map +1 -0
  111. package/dist/components/keyboard-shortcuts-help.jsx +97 -0
  112. package/dist/components/keyboard-shortcuts-help.jsx.map +1 -0
  113. package/dist/components/label.d.ts +5 -0
  114. package/dist/components/label.d.ts.map +1 -0
  115. package/dist/components/label.jsx +8 -0
  116. package/dist/components/label.jsx.map +1 -0
  117. package/dist/components/media-preview.d.ts +30 -0
  118. package/dist/components/media-preview.d.ts.map +1 -0
  119. package/dist/components/media-preview.jsx +189 -0
  120. package/dist/components/media-preview.jsx.map +1 -0
  121. package/dist/components/multi-file-input.d.ts +76 -0
  122. package/dist/components/multi-file-input.d.ts.map +1 -0
  123. package/dist/components/multi-file-input.jsx +131 -0
  124. package/dist/components/multi-file-input.jsx.map +1 -0
  125. package/dist/components/password-input.d.ts +10 -0
  126. package/dist/components/password-input.d.ts.map +1 -0
  127. package/dist/components/password-input.jsx +18 -0
  128. package/dist/components/password-input.jsx.map +1 -0
  129. package/dist/components/popover.d.ts +7 -0
  130. package/dist/components/popover.d.ts.map +1 -0
  131. package/dist/components/popover.jsx +11 -0
  132. package/dist/components/popover.jsx.map +1 -0
  133. package/dist/components/revision-timeline.d.ts +30 -0
  134. package/dist/components/revision-timeline.d.ts.map +1 -0
  135. package/dist/components/revision-timeline.jsx +42 -0
  136. package/dist/components/revision-timeline.jsx.map +1 -0
  137. package/dist/components/richtext-editor.d.ts +43 -0
  138. package/dist/components/richtext-editor.d.ts.map +1 -0
  139. package/dist/components/richtext-editor.jsx +319 -0
  140. package/dist/components/richtext-editor.jsx.map +1 -0
  141. package/dist/components/richtext-mode.d.ts +23 -0
  142. package/dist/components/richtext-mode.d.ts.map +1 -0
  143. package/dist/components/richtext-mode.js +36 -0
  144. package/dist/components/richtext-mode.js.map +1 -0
  145. package/dist/components/richtext-render.d.ts +8 -0
  146. package/dist/components/richtext-render.d.ts.map +1 -0
  147. package/dist/components/richtext-render.jsx +33 -0
  148. package/dist/components/richtext-render.jsx.map +1 -0
  149. package/dist/components/richtext-sync.d.ts +37 -0
  150. package/dist/components/richtext-sync.d.ts.map +1 -0
  151. package/dist/components/richtext-sync.js +46 -0
  152. package/dist/components/richtext-sync.js.map +1 -0
  153. package/dist/components/scroll-area.d.ts +5 -0
  154. package/dist/components/scroll-area.d.ts.map +1 -0
  155. package/dist/components/scroll-area.jsx +16 -0
  156. package/dist/components/scroll-area.jsx.map +1 -0
  157. package/dist/components/select.d.ts +36 -0
  158. package/dist/components/select.d.ts.map +1 -0
  159. package/dist/components/select.jsx +87 -0
  160. package/dist/components/select.jsx.map +1 -0
  161. package/dist/components/separator.d.ts +4 -0
  162. package/dist/components/separator.d.ts.map +1 -0
  163. package/dist/components/separator.jsx +6 -0
  164. package/dist/components/separator.jsx.map +1 -0
  165. package/dist/components/sheet.d.ts +29 -0
  166. package/dist/components/sheet.d.ts.map +1 -0
  167. package/dist/components/sheet.jsx +44 -0
  168. package/dist/components/sheet.jsx.map +1 -0
  169. package/dist/components/sidebar.d.ts +70 -0
  170. package/dist/components/sidebar.d.ts.map +1 -0
  171. package/dist/components/sidebar.jsx +245 -0
  172. package/dist/components/sidebar.jsx.map +1 -0
  173. package/dist/components/skeleton.d.ts +3 -0
  174. package/dist/components/skeleton.d.ts.map +1 -0
  175. package/dist/components/skeleton.jsx +6 -0
  176. package/dist/components/skeleton.jsx.map +1 -0
  177. package/dist/components/sonner.d.ts +6 -0
  178. package/dist/components/sonner.d.ts.map +1 -0
  179. package/dist/components/sonner.jsx +29 -0
  180. package/dist/components/sonner.jsx.map +1 -0
  181. package/dist/components/switch.d.ts +4 -0
  182. package/dist/components/switch.d.ts.map +1 -0
  183. package/dist/components/switch.jsx +8 -0
  184. package/dist/components/switch.jsx.map +1 -0
  185. package/dist/components/table.d.ts +10 -0
  186. package/dist/components/table.d.ts.map +1 -0
  187. package/dist/components/table.jsx +21 -0
  188. package/dist/components/table.jsx.map +1 -0
  189. package/dist/components/tabs.d.ts +7 -0
  190. package/dist/components/tabs.d.ts.map +1 -0
  191. package/dist/components/tabs.jsx +14 -0
  192. package/dist/components/tabs.jsx.map +1 -0
  193. package/dist/components/textarea.d.ts +4 -0
  194. package/dist/components/textarea.d.ts.map +1 -0
  195. package/dist/components/textarea.jsx +5 -0
  196. package/dist/components/textarea.jsx.map +1 -0
  197. package/dist/components/tooltip.d.ts +7 -0
  198. package/dist/components/tooltip.d.ts.map +1 -0
  199. package/dist/components/tooltip.jsx +11 -0
  200. package/dist/components/tooltip.jsx.map +1 -0
  201. package/dist/index.d.ts +52 -0
  202. package/dist/index.d.ts.map +1 -0
  203. package/dist/index.js +72 -0
  204. package/dist/index.js.map +1 -0
  205. package/dist/lib/theme.d.ts +11 -0
  206. package/dist/lib/theme.d.ts.map +1 -0
  207. package/dist/lib/theme.js +44 -0
  208. package/dist/lib/theme.js.map +1 -0
  209. package/dist/lib/utils.d.ts +3 -0
  210. package/dist/lib/utils.d.ts.map +1 -0
  211. package/dist/lib/utils.js +6 -0
  212. package/dist/lib/utils.js.map +1 -0
  213. package/dist/styles.css +242 -0
  214. package/package.json +85 -0
  215. package/src/components/accordion.tsx +48 -0
  216. package/src/components/alert-dialog.tsx +113 -0
  217. package/src/components/audit-timeline.tsx +102 -0
  218. package/src/components/avatar.tsx +42 -0
  219. package/src/components/badge.tsx +34 -0
  220. package/src/components/breadcrumb.tsx +99 -0
  221. package/src/components/button.tsx +58 -0
  222. package/src/components/calendar.tsx +176 -0
  223. package/src/components/card.tsx +60 -0
  224. package/src/components/chart.tsx +558 -0
  225. package/src/components/checkbox.tsx +23 -0
  226. package/src/components/combobox.tsx +264 -0
  227. package/src/components/command.tsx +120 -0
  228. package/src/components/date-picker.tsx +221 -0
  229. package/src/components/date-range-input.tsx +295 -0
  230. package/src/components/dialog.tsx +94 -0
  231. package/src/components/diff-view.tsx +182 -0
  232. package/src/components/dropdown-menu.tsx +165 -0
  233. package/src/components/empty.tsx +100 -0
  234. package/src/components/field.tsx +168 -0
  235. package/src/components/file-input.tsx +233 -0
  236. package/src/components/form.tsx +152 -0
  237. package/src/components/info-tooltip.tsx +40 -0
  238. package/src/components/input.tsx +55 -0
  239. package/src/components/json-editor.tsx +210 -0
  240. package/src/components/kbd.tsx +35 -0
  241. package/src/components/key-value-editor.tsx +423 -0
  242. package/src/components/keyboard-shortcuts-help.tsx +136 -0
  243. package/src/components/label.tsx +16 -0
  244. package/src/components/media-preview.tsx +278 -0
  245. package/src/components/multi-file-input.tsx +315 -0
  246. package/src/components/password-input.tsx +50 -0
  247. package/src/components/popover.tsx +26 -0
  248. package/src/components/revision-timeline.tsx +93 -0
  249. package/src/components/richtext-editor.tsx +624 -0
  250. package/src/components/richtext-mode.ts +39 -0
  251. package/src/components/richtext-render.tsx +51 -0
  252. package/src/components/richtext-sync.ts +57 -0
  253. package/src/components/scroll-area.tsx +41 -0
  254. package/src/components/select.tsx +200 -0
  255. package/src/components/separator.tsx +21 -0
  256. package/src/components/sheet.tsx +109 -0
  257. package/src/components/sidebar.tsx +660 -0
  258. package/src/components/skeleton.tsx +9 -0
  259. package/src/components/sonner.tsx +45 -0
  260. package/src/components/switch.tsx +24 -0
  261. package/src/components/table.tsx +93 -0
  262. package/src/components/tabs.tsx +57 -0
  263. package/src/components/textarea.tsx +18 -0
  264. package/src/components/tooltip.tsx +25 -0
  265. package/src/index.ts +342 -0
  266. package/src/lib/theme.ts +45 -0
  267. package/src/lib/utils.ts +6 -0
  268. package/src/styles.css +242 -0
@@ -0,0 +1,66 @@
1
+ // shadcn-style Form: thin wrappers around react-hook-form's `Controller` that
2
+ // pipe field state into accessible label/control/message slots. Apps render
3
+ // `<Form>` (== FormProvider) at the top, then use `<FormField>` per input.
4
+ import * as React from 'react';
5
+ import { Slot } from '@radix-ui/react-slot';
6
+ import { Controller, FormProvider, useFormContext, } from 'react-hook-form';
7
+ import { cn } from '../lib/utils.js';
8
+ import { Label } from './label.js';
9
+ export const Form = FormProvider;
10
+ const FormFieldContext = React.createContext(null);
11
+ export const FormField = ({ ...props }) => (<FormFieldContext.Provider value={{ name: props.name }}>
12
+ <Controller {...props}/>
13
+ </FormFieldContext.Provider>);
14
+ const FormItemContext = React.createContext(null);
15
+ export const useFormField = () => {
16
+ const fieldContext = React.useContext(FormFieldContext);
17
+ const itemContext = React.useContext(FormItemContext);
18
+ const { getFieldState, formState } = useFormContext();
19
+ if (!fieldContext)
20
+ throw new Error('useFormField must be used within <FormField>');
21
+ if (!itemContext)
22
+ throw new Error('useFormField must be used within <FormItem>');
23
+ const fieldState = getFieldState(fieldContext.name, formState);
24
+ const { id } = itemContext;
25
+ return {
26
+ id,
27
+ name: fieldContext.name,
28
+ formItemId: `${id}-form-item`,
29
+ formDescriptionId: `${id}-form-item-description`,
30
+ formMessageId: `${id}-form-item-message`,
31
+ ...fieldState,
32
+ };
33
+ };
34
+ export const FormItem = React.forwardRef(({ className, ...props }, ref) => {
35
+ const id = React.useId();
36
+ return (<FormItemContext.Provider value={{ id }}>
37
+ <div ref={ref} className={cn('space-y-2', className)} {...props}/>
38
+ </FormItemContext.Provider>);
39
+ });
40
+ FormItem.displayName = 'FormItem';
41
+ export const FormLabel = React.forwardRef(({ className, ...props }, ref) => {
42
+ const { error, formItemId } = useFormField();
43
+ return (<Label ref={ref} className={cn(error && 'text-destructive', className)} htmlFor={formItemId} {...props}/>);
44
+ });
45
+ FormLabel.displayName = 'FormLabel';
46
+ export const FormControl = React.forwardRef(({ ...props }, ref) => {
47
+ const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
48
+ return (<Slot ref={ref} id={formItemId} aria-describedby={!error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`} aria-invalid={!!error} {...props}/>);
49
+ });
50
+ FormControl.displayName = 'FormControl';
51
+ export const FormDescription = React.forwardRef(({ className, ...props }, ref) => {
52
+ const { formDescriptionId } = useFormField();
53
+ return (<p ref={ref} id={formDescriptionId} className={cn('text-sm text-muted-foreground', className)} {...props}/>);
54
+ });
55
+ FormDescription.displayName = 'FormDescription';
56
+ export const FormMessage = React.forwardRef(({ className, children, ...props }, ref) => {
57
+ const { error, formMessageId } = useFormField();
58
+ const body = error ? String(error.message ?? '') : children;
59
+ if (!body)
60
+ return null;
61
+ return (<p ref={ref} id={formMessageId} className={cn('text-sm font-medium text-destructive', className)} {...props}>
62
+ {body}
63
+ </p>);
64
+ });
65
+ FormMessage.displayName = 'FormMessage';
66
+ //# sourceMappingURL=form.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.jsx","sourceRoot":"","sources":["../../src/components/form.tsx"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,4EAA4E;AAC5E,2EAA2E;AAE3E,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EACL,UAAU,EACV,YAAY,EACZ,cAAc,GAIf,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,MAAM,CAAC,MAAM,IAAI,GAAG,YAAY,CAAA;AAShC,MAAM,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAA+B,IAAI,CAAC,CAAA;AAEhF,MAAM,CAAC,MAAM,SAAS,GAAG,CAGvB,EACE,GAAG,KAAK,EAC6B,EAAsB,EAAE,CAAC,CAC9D,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAA2B,CAAC,CAC9E;MAAA,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,EACxB;IAAA,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAC7B,CAAA;AAMH,MAAM,eAAe,GAAG,KAAK,CAAC,aAAa,CAA8B,IAAI,CAAC,CAAA;AAE9E,MAAM,CAAC,MAAM,YAAY,GAAG,GAO1B,EAAE;IACF,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA;IACvD,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;IACrD,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,cAAc,EAAE,CAAA;IACrD,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IAClF,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChF,MAAM,UAAU,GAAG,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAC9D,MAAM,EAAE,EAAE,EAAE,GAAG,WAAW,CAAA;IAC1B,OAAO;QACL,EAAE;QACF,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,UAAU,EAAE,GAAG,EAAE,YAAY;QAC7B,iBAAiB,EAAE,GAAG,EAAE,wBAAwB;QAChD,aAAa,EAAE,GAAG,EAAE,oBAAoB;QACxC,GAAG,UAAU;KACd,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CACtC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAC/B,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;IACxB,OAAO,CACL,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CACtC;QAAA,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAClE;MAAA,EAAE,eAAe,CAAC,QAAQ,CAAC,CAC5B,CAAA;AACH,CAAC,CACF,CAAA;AACD,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAA;AAEjC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAGvC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACjC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,YAAY,EAAE,CAAA;IAC5C,OAAO,CACL,CAAC,KAAK,CACJ,GAAG,CAAC,CAAC,GAAG,CAAC,CACT,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,kBAAkB,EAAE,SAAS,CAAC,CAAC,CACtD,OAAO,CAAC,CAAC,UAAU,CAAC,CACpB,IAAI,KAAK,CAAC,EACV,CACH,CAAA;AACH,CAAC,CAAC,CAAA;AACF,SAAS,CAAC,WAAW,GAAG,WAAW,CAAA;AAEnC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGzC,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACtB,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,aAAa,EAAE,GAAG,YAAY,EAAE,CAAA;IAC9E,OAAO,CACL,CAAC,IAAI,CACH,GAAG,CAAC,CAAC,GAAG,CAAC,CACT,EAAE,CAAC,CAAC,UAAU,CAAC,CACf,gBAAgB,CAAC,CACf,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,iBAAiB,EAAE,CAAC,CAAC,CAAC,GAAG,iBAAiB,IAAI,aAAa,EACzE,CAAC,CACD,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CACtB,IAAI,KAAK,CAAC,EACV,CACH,CAAA;AACH,CAAC,CAAC,CAAA;AACF,WAAW,CAAC,WAAW,GAAG,aAAa,CAAA;AAEvC,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAG7C,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IACjC,MAAM,EAAE,iBAAiB,EAAE,GAAG,YAAY,EAAE,CAAA;IAC5C,OAAO,CACL,CAAC,CAAC,CACA,GAAG,CAAC,CAAC,GAAG,CAAC,CACT,EAAE,CAAC,CAAC,iBAAiB,CAAC,CACtB,SAAS,CAAC,CAAC,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,CAAC,CAC1D,IAAI,KAAK,CAAC,EACV,CACH,CAAA;AACH,CAAC,CAAC,CAAA;AACF,eAAe,CAAC,WAAW,GAAG,iBAAiB,CAAA;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGzC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAC3C,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,YAAY,EAAE,CAAA;IAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IAC3D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,OAAO,CACL,CAAC,CAAC,CACA,GAAG,CAAC,CAAC,GAAG,CAAC,CACT,EAAE,CAAC,CAAC,aAAa,CAAC,CAClB,SAAS,CAAC,CAAC,EAAE,CAAC,sCAAsC,EAAE,SAAS,CAAC,CAAC,CACjE,IAAI,KAAK,CAAC,CAEV;MAAA,CAAC,IAAI,CACP;IAAA,EAAE,CAAC,CAAC,CACL,CAAA;AACH,CAAC,CAAC,CAAA;AACF,WAAW,CAAC,WAAW,GAAG,aAAa,CAAA"}
@@ -0,0 +1,11 @@
1
+ import * as React from 'react';
2
+ import { TooltipContent } from './tooltip.js';
3
+ export interface InfoTooltipProps {
4
+ content: React.ReactNode;
5
+ ariaLabel?: string;
6
+ className?: string;
7
+ iconClassName?: string;
8
+ side?: React.ComponentProps<typeof TooltipContent>['side'];
9
+ }
10
+ export declare function InfoTooltip({ content, ariaLabel, className, iconClassName, side, }: InfoTooltipProps): React.ReactElement;
11
+ //# sourceMappingURL=info-tooltip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info-tooltip.d.ts","sourceRoot":"","sources":["../../src/components/info-tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAW,cAAc,EAAkB,MAAM,cAAc,CAAA;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;CAC3D;AAED,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,SAAS,EACT,SAAS,EACT,aAAa,EACb,IAAY,GACb,EAAE,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAoBvC"}
@@ -0,0 +1,17 @@
1
+ import * as React from 'react';
2
+ import { Info } from 'lucide-react';
3
+ import { cn } from '../lib/utils.js';
4
+ import { Tooltip, TooltipContent, TooltipTrigger } from './tooltip.js';
5
+ export function InfoTooltip({ content, ariaLabel, className, iconClassName, side = 'top', }) {
6
+ return (<Tooltip>
7
+ <TooltipTrigger asChild>
8
+ <button type="button" aria-label={ariaLabel} className={cn('inline-flex size-4 shrink-0 items-center justify-center rounded-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2', className)}>
9
+ <Info className={cn('size-3.5', iconClassName)}/>
10
+ </button>
11
+ </TooltipTrigger>
12
+ <TooltipContent side={side} className="max-w-80 whitespace-pre-wrap text-left leading-relaxed">
13
+ {content}
14
+ </TooltipContent>
15
+ </Tooltip>);
16
+ }
17
+ //# sourceMappingURL=info-tooltip.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info-tooltip.jsx","sourceRoot":"","sources":["../../src/components/info-tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAUtE,MAAM,UAAU,WAAW,CAAC,EAC1B,OAAO,EACP,SAAS,EACT,SAAS,EACT,aAAa,EACb,IAAI,GAAG,KAAK,GACK;IACjB,OAAO,CACL,CAAC,OAAO,CACN;MAAA,CAAC,cAAc,CAAC,OAAO,CACrB;QAAA,CAAC,MAAM,CACL,IAAI,CAAC,QAAQ,CACb,UAAU,CAAC,CAAC,SAAS,CAAC,CACtB,SAAS,CAAC,CAAC,EAAE,CACX,sOAAsO,EACtO,SAAS,CACV,CAAC,CAEF;UAAA,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,EACjD;QAAA,EAAE,MAAM,CACV;MAAA,EAAE,cAAc,CAChB;MAAA,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wDAAwD,CAC5F;QAAA,CAAC,OAAO,CACV;MAAA,EAAE,cAAc,CAClB;IAAA,EAAE,OAAO,CAAC,CACX,CAAA;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ export interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
3
+ /**
4
+ * When provided, a clear button (×) is rendered on the right side of the
5
+ * input whenever it has a non-empty value. The button is hidden when the
6
+ * input is disabled or the value is empty.
7
+ */
8
+ onClear?: () => void;
9
+ /** aria-label for the clear button. Defaults to "Clear". */
10
+ clearLabel?: string;
11
+ }
12
+ export declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
13
+ //# sourceMappingURL=input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,MAAM,WAAW,UAAW,SAAQ,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;IAC7E;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,eAAO,MAAM,KAAK,qFAsCjB,CAAA"}
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+ import { X } from 'lucide-react';
3
+ import { cn } from '../lib/utils.js';
4
+ export const Input = React.forwardRef(({ className, type, onClear, clearLabel, ...props }, ref) => {
5
+ const showClear = !!onClear && !!props.value && !props.disabled;
6
+ const input = (<input type={type ?? 'text'} ref={ref} className={cn('flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',
7
+ // Hide native number-input spinner buttons (Firefox + WebKit/Blink).
8
+ '[appearance:textfield] [&::-webkit-outer-spin-button]:m-0 [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none', showClear && 'pr-8', className)} {...props}/>);
9
+ if (!onClear)
10
+ return input;
11
+ return (<div className="relative">
12
+ {input}
13
+ {showClear && (<button type="button" tabIndex={-1} aria-label={clearLabel ?? 'Clear'} onClick={onClear} className="absolute right-2 top-1/2 -translate-y-1/2 rounded-sm p-0.5 text-muted-foreground opacity-50 hover:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring">
14
+ <X className="size-3.5"/>
15
+ </button>)}
16
+ </div>);
17
+ });
18
+ Input.displayName = 'Input';
19
+ //# sourceMappingURL=input.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.jsx","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAA;AAChC,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAapC,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CACnC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE;IAC1D,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAA;IAE/D,MAAM,KAAK,GAAG,CACZ,CAAC,KAAK,CACJ,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CACrB,GAAG,CAAC,CAAC,GAAG,CAAC,CACT,SAAS,CAAC,CAAC,EAAE,CACX,sUAAsU;QACtU,qEAAqE;QACrE,4LAA4L,EAC5L,SAAS,IAAI,MAAM,EACnB,SAAS,CACV,CAAC,CACF,IAAI,KAAK,CAAC,EACV,CACH,CAAA;IAED,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAA;IAE1B,OAAO,CACL,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CACvB;QAAA,CAAC,KAAK,CACN;QAAA,CAAC,SAAS,IAAI,CACZ,CAAC,MAAM,CACL,IAAI,CAAC,QAAQ,CACb,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CACb,UAAU,CAAC,CAAC,UAAU,IAAI,OAAO,CAAC,CAClC,OAAO,CAAC,CAAC,OAAO,CAAC,CACjB,SAAS,CAAC,uLAAuL,CAEjM;YAAA,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,EACzB;UAAA,EAAE,MAAM,CAAC,CACV,CACH;MAAA,EAAE,GAAG,CAAC,CACP,CAAA;AACH,CAAC,CACF,CAAA;AACD,KAAK,CAAC,WAAW,GAAG,OAAO,CAAA"}
@@ -0,0 +1,23 @@
1
+ import * as React from 'react';
2
+ export interface JsonEditorProps {
3
+ value: unknown;
4
+ onChange(next: unknown): void;
5
+ onBlur?(): void;
6
+ disabled?: boolean;
7
+ placeholder?: string;
8
+ rows?: number;
9
+ className?: string;
10
+ /** Translated label for the inline "Format" button. */
11
+ formatLabel?: string;
12
+ /** Translated prefix for parse-error messages. */
13
+ invalidLabel?: string;
14
+ }
15
+ export declare function JsonEditor({ value, onChange, onBlur, disabled, placeholder, rows, className, formatLabel, invalidLabel, }: JsonEditorProps): React.ReactElement;
16
+ export interface JsonViewProps {
17
+ value: unknown;
18
+ className?: string;
19
+ /** Render a single-line collapsed `<code>` instead of a pretty `<pre>`. */
20
+ inline?: boolean;
21
+ }
22
+ export declare function JsonView({ value, className, inline }: JsonViewProps): React.ReactElement;
23
+ //# sourceMappingURL=json-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-editor.d.ts","sourceRoot":"","sources":["../../src/components/json-editor.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAwB9B,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B,MAAM,CAAC,IAAI,IAAI,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAwBD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,WAAkB,EAClB,IAAQ,EACR,SAAS,EACT,WAAsB,EACtB,YAA6B,GAC9B,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CA+FtC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,aAAa,GAAG,KAAK,CAAC,YAAY,CA0BxF"}
@@ -0,0 +1,143 @@
1
+ // JsonEditor + JsonView — editing/displaying JSON-typed property values.
2
+ //
3
+ // Editor: a monospace Textarea with live parse, an inline "Format" button
4
+ // and an error band for parse failures. Calls onChange with the parsed
5
+ // value (object/array/primitive) — never with the raw string — so the form
6
+ // layer stores structured data.
7
+ //
8
+ // View: pretty-printed <pre> for show, single-line collapsed code for list.
9
+ import * as React from 'react';
10
+ import { AlertCircle, Wand2 } from 'lucide-react';
11
+ import { cn } from '../lib/utils.js';
12
+ import { Button } from './button.js';
13
+ import { Textarea } from './textarea.js';
14
+ const stringify = (value) => {
15
+ if (value == null)
16
+ return '';
17
+ if (typeof value === 'string') {
18
+ // Strings that are themselves JSON come back from some adapters.
19
+ // Normalize to pretty form; otherwise leave the raw string alone.
20
+ try {
21
+ return JSON.stringify(JSON.parse(value), null, 2);
22
+ }
23
+ catch {
24
+ return value;
25
+ }
26
+ }
27
+ try {
28
+ return JSON.stringify(value, null, 2);
29
+ }
30
+ catch {
31
+ return String(value);
32
+ }
33
+ };
34
+ // Canonical (key-stable, no whitespace) JSON serialization used to decide
35
+ // whether an externally arriving `value` is structurally identical to what
36
+ // the user is currently typing. Reference comparison would always fail
37
+ // because the parent typically returns a fresh object on every re-render.
38
+ const canonical = (value) => {
39
+ if (value == null)
40
+ return '';
41
+ try {
42
+ return JSON.stringify(value);
43
+ }
44
+ catch {
45
+ return '';
46
+ }
47
+ };
48
+ const tryParse = (text) => {
49
+ if (text.trim() === '')
50
+ return { ok: true, value: null };
51
+ try {
52
+ return { ok: true, value: JSON.parse(text) };
53
+ }
54
+ catch {
55
+ return { ok: false };
56
+ }
57
+ };
58
+ export function JsonEditor({ value, onChange, onBlur, disabled, placeholder = '{}', rows = 8, className, formatLabel = 'Format', invalidLabel = 'Invalid JSON', }) {
59
+ const [draft, setDraft] = React.useState(() => stringify(value));
60
+ const [error, setError] = React.useState(null);
61
+ // Resync the textarea only when the *external* value differs structurally
62
+ // from what the user is currently typing. Without the canonical-form check,
63
+ // every keystroke that produces valid JSON would trigger
64
+ // onChange(parsed) → parent re-render → useEffect → setDraft(stringify(value))
65
+ // and the user's in-progress text would get auto-pretty-printed on every
66
+ // keystroke. By comparing canonical JSON, our own emissions become no-ops
67
+ // here, while genuine external resets (record reload, form.reset()) still
68
+ // refresh the draft.
69
+ React.useEffect(() => {
70
+ const parsed = tryParse(draft);
71
+ const draftCanonical = parsed.ok ? canonical(parsed.value) : '__invalid__';
72
+ if (draftCanonical === canonical(value))
73
+ return;
74
+ setDraft(stringify(value));
75
+ setError(null);
76
+ // Intentionally depend only on `value`. `draft` is read via closure: we
77
+ // only want this to fire on external changes, not when the user types.
78
+ // eslint-disable-next-line react-hooks/exhaustive-deps
79
+ }, [value]);
80
+ const handleChange = (next) => {
81
+ setDraft(next);
82
+ if (next.trim() === '') {
83
+ setError(null);
84
+ onChange(null);
85
+ return;
86
+ }
87
+ const parsed = tryParse(next);
88
+ if (parsed.ok) {
89
+ setError(null);
90
+ onChange(parsed.value);
91
+ }
92
+ else {
93
+ try {
94
+ JSON.parse(next);
95
+ }
96
+ catch (e) {
97
+ setError(e instanceof Error ? e.message : invalidLabel);
98
+ }
99
+ }
100
+ };
101
+ const format = () => {
102
+ if (draft.trim() === '')
103
+ return;
104
+ try {
105
+ const parsed = JSON.parse(draft);
106
+ const pretty = JSON.stringify(parsed, null, 2);
107
+ setDraft(pretty);
108
+ setError(null);
109
+ onChange(parsed);
110
+ }
111
+ catch (e) {
112
+ setError(e instanceof Error ? e.message : invalidLabel);
113
+ }
114
+ };
115
+ return (<div className={cn('space-y-2', className)}>
116
+ <div className="relative">
117
+ <Textarea value={draft} onChange={(e) => handleChange(e.target.value)} onBlur={onBlur} disabled={disabled} rows={rows} spellCheck={false} placeholder={placeholder} className={cn('pr-20 font-mono text-xs leading-relaxed', error && 'border-destructive focus-visible:ring-destructive/40')}/>
118
+ <Button type="button" variant="ghost" size="sm" onClick={format} disabled={disabled || draft.trim() === ''} className="absolute right-1 top-1 h-7 px-2 text-xs" title={formatLabel}>
119
+ <Wand2 className="size-3.5"/>
120
+ <span className="hidden sm:inline">{formatLabel}</span>
121
+ </Button>
122
+ </div>
123
+ {error ? (<p className="flex items-start gap-1.5 text-xs text-destructive">
124
+ <AlertCircle className="mt-0.5 size-3.5 shrink-0"/>
125
+ <span className="break-all">
126
+ {invalidLabel}: {error}
127
+ </span>
128
+ </p>) : null}
129
+ </div>);
130
+ }
131
+ export function JsonView({ value, className, inline }) {
132
+ const text = React.useMemo(() => stringify(value), [value]);
133
+ if (inline) {
134
+ const compact = text.replace(/\s+/g, ' ').trim();
135
+ return (<code className={cn('line-clamp-1 max-w-[24rem] truncate font-mono text-xs text-muted-foreground', className)} title={text || undefined}>
136
+ {compact || '—'}
137
+ </code>);
138
+ }
139
+ return (<pre className={cn('max-h-96 overflow-auto rounded-md border border-border bg-muted/40 p-3 font-mono text-xs leading-relaxed text-foreground', className)}>
140
+ <code>{text || '—'}</code>
141
+ </pre>);
142
+ }
143
+ //# sourceMappingURL=json-editor.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-editor.jsx","sourceRoot":"","sources":["../../src/components/json-editor.tsx"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,0EAA0E;AAC1E,uEAAuE;AACvE,2EAA2E;AAC3E,gCAAgC;AAChC,EAAE;AACF,4EAA4E;AAE5E,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAU,EAAE;IAC3C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAA;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,iEAAiE;QACjE,kEAAkE;QAClE,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;AACH,CAAC,CAAA;AAgBD,0EAA0E;AAC1E,2EAA2E;AAC3E,uEAAuE;AACvE,0EAA0E;AAC1E,MAAM,SAAS,GAAG,CAAC,KAAc,EAAU,EAAE;IAC3C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAA;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAgD,EAAE;IAC9E,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACxD,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,EAAE,CAAA;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAA;IACtB,CAAC;AACH,CAAC,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,WAAW,GAAG,IAAI,EAClB,IAAI,GAAG,CAAC,EACR,SAAS,EACT,WAAW,GAAG,QAAQ,EACtB,YAAY,GAAG,cAAc,GACb;IAChB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAS,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;IACxE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAgB,IAAI,CAAC,CAAA;IAE7D,0EAA0E;IAC1E,4EAA4E;IAC5E,yDAAyD;IACzD,iFAAiF;IACjF,yEAAyE;IACzE,0EAA0E;IAC1E,0EAA0E;IAC1E,qBAAqB;IACrB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC9B,MAAM,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAA;QAC1E,IAAI,cAAc,KAAK,SAAS,CAAC,KAAK,CAAC;YAAE,OAAM;QAC/C,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1B,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,wEAAwE;QACxE,uEAAuE;QACvE,uDAAuD;IACzD,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAEX,MAAM,YAAY,GAAG,CAAC,IAAY,EAAQ,EAAE;QAC1C,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,CAAA;YACd,QAAQ,CAAC,IAAI,CAAC,CAAA;YACd,OAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC7B,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,CAAA;YACd,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;YACzD,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAM;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAA;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YAC9C,QAAQ,CAAC,MAAM,CAAC,CAAA;YAChB,QAAQ,CAAC,IAAI,CAAC,CAAA;YACd,QAAQ,CAAC,MAAM,CAAC,CAAA;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;QACzD,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CACL,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CACzC;MAAA,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CACvB;QAAA,CAAC,QAAQ,CACP,KAAK,CAAC,CAAC,KAAK,CAAC,CACb,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC9C,MAAM,CAAC,CAAC,MAAM,CAAC,CACf,QAAQ,CAAC,CAAC,QAAQ,CAAC,CACnB,IAAI,CAAC,CAAC,IAAI,CAAC,CACX,UAAU,CAAC,CAAC,KAAK,CAAC,CAClB,WAAW,CAAC,CAAC,WAAW,CAAC,CACzB,SAAS,CAAC,CAAC,EAAE,CACX,yCAAyC,EACzC,KAAK,IAAI,sDAAsD,CAChE,CAAC,EAEJ;QAAA,CAAC,MAAM,CACL,IAAI,CAAC,QAAQ,CACb,OAAO,CAAC,OAAO,CACf,IAAI,CAAC,IAAI,CACT,OAAO,CAAC,CAAC,MAAM,CAAC,CAChB,QAAQ,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAC1C,SAAS,CAAC,yCAAyC,CACnD,KAAK,CAAC,CAAC,WAAW,CAAC,CAEnB;UAAA,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAC3B;UAAA,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,CACxD;QAAA,EAAE,MAAM,CACV;MAAA,EAAE,GAAG,CACL;MAAA,CAAC,KAAK,CAAC,CAAC,CAAC,CACP,CAAC,CAAC,CAAC,SAAS,CAAC,mDAAmD,CAC9D;UAAA,CAAC,WAAW,CAAC,SAAS,CAAC,0BAA0B,EACjD;UAAA,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CACzB;YAAA,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,CACxB;UAAA,EAAE,IAAI,CACR;QAAA,EAAE,CAAC,CAAC,CACL,CAAC,CAAC,CAAC,IAAI,CACV;IAAA,EAAE,GAAG,CAAC,CACP,CAAA;AACH,CAAC;AASD,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAiB;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;IAC3D,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;QAChD,OAAO,CACL,CAAC,IAAI,CACH,SAAS,CAAC,CAAC,EAAE,CACX,6EAA6E,EAC7E,SAAS,CACV,CAAC,CACF,KAAK,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC,CAEzB;QAAA,CAAC,OAAO,IAAI,GAAG,CACjB;MAAA,EAAE,IAAI,CAAC,CACR,CAAA;IACH,CAAC;IACD,OAAO,CACL,CAAC,GAAG,CACF,SAAS,CAAC,CAAC,EAAE,CACX,0HAA0H,EAC1H,SAAS,CACV,CAAC,CAEF;MAAA,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,CAC3B;IAAA,EAAE,GAAG,CAAC,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * Single keyboard key glyph. Renders a `<kbd>` styled like a typical
4
+ * key cap. Compose multiple `<Kbd>` siblings to spell out a chord:
5
+ * `<Kbd>Ctrl</Kbd>+<Kbd>S</Kbd>`. The cap uses `bg-muted` /
6
+ * `text-foreground/80` so it reads well on any neutral surface
7
+ * (cards, popovers, tooltips).
8
+ */
9
+ export declare const Kbd: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLElement> & React.RefAttributes<HTMLElement>>;
10
+ /**
11
+ * Resolve the platform-appropriate label for the primary modifier
12
+ * key. Renders `⌘` on macOS / iOS, `Ctrl` everywhere else.
13
+ */
14
+ export declare function getModKeyLabel(): string;
15
+ //# sourceMappingURL=kbd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kbd.d.ts","sourceRoot":"","sources":["../../src/components/kbd.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B;;;;;;GAMG;AACH,eAAO,MAAM,GAAG,uGAYd,CAAA;AAGF;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAKvC"}
@@ -0,0 +1,23 @@
1
+ import * as React from 'react';
2
+ import { cn } from '../lib/utils.js';
3
+ /**
4
+ * Single keyboard key glyph. Renders a `<kbd>` styled like a typical
5
+ * key cap. Compose multiple `<Kbd>` siblings to spell out a chord:
6
+ * `<Kbd>Ctrl</Kbd>+<Kbd>S</Kbd>`. The cap uses `bg-muted` /
7
+ * `text-foreground/80` so it reads well on any neutral surface
8
+ * (cards, popovers, tooltips).
9
+ */
10
+ export const Kbd = React.forwardRef(({ className, ...props }, ref) => (<kbd ref={ref} className={cn('inline-flex h-5 min-w-[1.25rem] items-center justify-center rounded border border-border bg-muted px-1.5 font-mono text-[10px] font-medium text-foreground/80 shadow-[0_1px_0_0_var(--border)]', className)} {...props}/>));
11
+ Kbd.displayName = 'Kbd';
12
+ /**
13
+ * Resolve the platform-appropriate label for the primary modifier
14
+ * key. Renders `⌘` on macOS / iOS, `Ctrl` everywhere else.
15
+ */
16
+ export function getModKeyLabel() {
17
+ if (typeof navigator === 'undefined')
18
+ return 'Ctrl';
19
+ const platform = navigator.platform || '';
20
+ const ua = navigator.userAgent || '';
21
+ return /Mac|iPhone|iPad|iPod/i.test(platform) || /Mac/i.test(ua) ? '⌘' : 'Ctrl';
22
+ }
23
+ //# sourceMappingURL=kbd.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kbd.jsx","sourceRoot":"","sources":["../../src/components/kbd.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAEpC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAGjC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,CAAC,GAAG,CACF,GAAG,CAAC,CAAC,GAAG,CAAC,CACT,SAAS,CAAC,CAAC,EAAE,CACX,gMAAgM,EAChM,SAAS,CACV,CAAC,CACF,IAAI,KAAK,CAAC,EACV,CACH,CAAC,CAAA;AACF,GAAG,CAAC,WAAW,GAAG,KAAK,CAAA;AAEvB;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAO,SAAS,KAAK,WAAW;QAAE,OAAO,MAAM,CAAA;IACnD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAA;IACzC,MAAM,EAAE,GAAG,SAAS,CAAC,SAAS,IAAI,EAAE,CAAA;IACpC,OAAO,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAA;AACjF,CAAC"}
@@ -0,0 +1,92 @@
1
+ import * as React from 'react';
2
+ import { type ComboboxLabels, type ComboboxSuggestion } from './combobox.js';
3
+ /** Built-in editor types. Resource code may pass a string; unknown values
4
+ * fall back to a plain string input. */
5
+ export type KeyValueFieldType = 'string' | 'number' | 'boolean' | 'textarea' | 'select' | 'autocomplete';
6
+ /** One declared key inside the JSON object. */
7
+ export interface KeyValueFieldSpec {
8
+ /** JSON key on the underlying object. */
9
+ key: string;
10
+ /** Visible label. Defaults to the key. */
11
+ label?: string;
12
+ /** Editor kind. Default: `'string'`. */
13
+ type?: KeyValueFieldType;
14
+ /** Helper text shown under the input. */
15
+ description?: string;
16
+ /** Placeholder for text/number inputs. */
17
+ placeholder?: string;
18
+ /** Visual `*` marker; required-ness is enforced by the form layer. */
19
+ isRequired?: boolean;
20
+ /**
21
+ * Enum source for `type: 'select'` and static suggestions for
22
+ * `type: 'autocomplete'`. Either a list of strings (used both as value
23
+ * and label) or `{ value, label }` objects.
24
+ */
25
+ availableValues?: ReadonlyArray<string | {
26
+ value: string;
27
+ label: string;
28
+ }>;
29
+ /**
30
+ * For `type: 'autocomplete'`: pull dynamic suggestions from the named
31
+ * field of records of another resource (e.g. `users.email`). Resolved
32
+ * by the `packages/react` layer before render — KeyValueEditor itself
33
+ * never fetches, the loaded values arrive via `suggestionsByKey`.
34
+ */
35
+ suggestionsResource?: string;
36
+ /** Path of the field on `suggestionsResource` to project. */
37
+ suggestionsField?: string;
38
+ }
39
+ /** English-default labels surfaced through `labels` for i18n. */
40
+ export interface KeyValueEditorLabels {
41
+ /** Placeholder shown in the empty `select` slot. Default: '—'. */
42
+ emptyOption?: string;
43
+ /** Visually-hidden / fallback label suffix when a row has no `label`. */
44
+ fieldLabelFallback?: (key: string) => string;
45
+ /** Forwarded to the inner `Combobox` for autocomplete fields. */
46
+ combobox?: ComboboxLabels;
47
+ }
48
+ export interface KeyValueEditorProps {
49
+ /** Declared key set. Order is preserved on screen. */
50
+ fields: ReadonlyArray<KeyValueFieldSpec>;
51
+ /** Current value. Anything that is not a plain object is treated as `{}`. */
52
+ value: unknown;
53
+ /** Emits a fresh JSON object on every change. */
54
+ onChange(next: Record<string, unknown>): void;
55
+ onBlur?(): void;
56
+ disabled?: boolean;
57
+ className?: string;
58
+ labels?: KeyValueEditorLabels;
59
+ /**
60
+ * Pre-loaded suggestions per autocomplete field, keyed by `field.key`.
61
+ * The editor stays i18n-/network-unaware: callers (e.g. the React
62
+ * property renderer) load values from the database and feed them in.
63
+ */
64
+ suggestionsByKey?: Readonly<Record<string, ReadonlyArray<ComboboxSuggestion>>>;
65
+ /** Per-key loading flags to render a spinner while suggestions stream in. */
66
+ suggestionsLoadingByKey?: Readonly<Record<string, boolean>>;
67
+ }
68
+ export declare function KeyValueEditor({ fields, value, onChange, onBlur, disabled, className, labels, suggestionsByKey, suggestionsLoadingByKey, }: KeyValueEditorProps): React.ReactElement;
69
+ export interface KeyValueViewLabels {
70
+ /** Placeholder for missing values. Default: '—'. */
71
+ emptyValue?: string;
72
+ /** Field label fallback when a spec entry has no `label`. */
73
+ fieldLabelFallback?: (key: string) => string;
74
+ /** Boolean true label. Default: 'Yes'. */
75
+ trueLabel?: string;
76
+ /** Boolean false label. Default: 'No'. */
77
+ falseLabel?: string;
78
+ }
79
+ export interface KeyValueViewProps {
80
+ fields: ReadonlyArray<KeyValueFieldSpec>;
81
+ value: unknown;
82
+ className?: string;
83
+ /**
84
+ * `'inline'` collapses all fields into a single comma-separated row used
85
+ * by the list view. `'block'` (default) renders a vertical key/value
86
+ * table for the show view.
87
+ */
88
+ variant?: 'inline' | 'block';
89
+ labels?: KeyValueViewLabels;
90
+ }
91
+ export declare function KeyValueView({ fields, value, className, variant, labels, }: KeyValueViewProps): React.ReactElement;
92
+ //# sourceMappingURL=key-value-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-value-editor.d.ts","sourceRoot":"","sources":["../../src/components/key-value-editor.tsx"],"names":[],"mappings":"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"}