@lattice-php/lattice 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 (277) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +39 -0
  3. package/dist/action/components/action-group.d.ts +10 -0
  4. package/dist/action/components/action-group.js +79 -0
  5. package/dist/action/components/action-group.js.map +1 -0
  6. package/dist/action/components/action.d.ts +26 -0
  7. package/dist/action/components/action.js +87 -0
  8. package/dist/action/components/action.js.map +1 -0
  9. package/dist/action/effects.d.ts +30 -0
  10. package/dist/action/effects.js +44 -0
  11. package/dist/action/effects.js.map +1 -0
  12. package/dist/action/index.d.ts +1 -0
  13. package/dist/action/index.js +15 -0
  14. package/dist/action/index.js.map +1 -0
  15. package/dist/appearance/index.d.ts +9 -0
  16. package/dist/appearance/index.js +66 -0
  17. package/dist/appearance/index.js.map +1 -0
  18. package/dist/clipboard/index.d.ts +5 -0
  19. package/dist/clipboard/index.js +24 -0
  20. package/dist/clipboard/index.js.map +1 -0
  21. package/dist/core/component-ref.d.ts +8 -0
  22. package/dist/core/component-ref.js +15 -0
  23. package/dist/core/component-ref.js.map +1 -0
  24. package/dist/core/components/badge.d.ts +19 -0
  25. package/dist/core/components/badge.js +32 -0
  26. package/dist/core/components/badge.js.map +1 -0
  27. package/dist/core/components/button.d.ts +23 -0
  28. package/dist/core/components/button.js +68 -0
  29. package/dist/core/components/button.js.map +1 -0
  30. package/dist/core/components/card.d.ts +19 -0
  31. package/dist/core/components/card.js +62 -0
  32. package/dist/core/components/card.js.map +1 -0
  33. package/dist/core/components/confirm-dialog.d.ts +13 -0
  34. package/dist/core/components/confirm-dialog.js +47 -0
  35. package/dist/core/components/confirm-dialog.js.map +1 -0
  36. package/dist/core/components/fragment.d.ts +12 -0
  37. package/dist/core/components/fragment.js +62 -0
  38. package/dist/core/components/fragment.js.map +1 -0
  39. package/dist/core/components/grid.d.ts +10 -0
  40. package/dist/core/components/grid.js +16 -0
  41. package/dist/core/components/grid.js.map +1 -0
  42. package/dist/core/components/heading.d.ts +11 -0
  43. package/dist/core/components/heading.js +39 -0
  44. package/dist/core/components/heading.js.map +1 -0
  45. package/dist/core/components/index.d.ts +1 -0
  46. package/dist/core/components/index.js +36 -0
  47. package/dist/core/components/index.js.map +1 -0
  48. package/dist/core/components/link.d.ts +18 -0
  49. package/dist/core/components/link.js +26 -0
  50. package/dist/core/components/link.js.map +1 -0
  51. package/dist/core/components/modal.d.ts +13 -0
  52. package/dist/core/components/modal.js +75 -0
  53. package/dist/core/components/modal.js.map +1 -0
  54. package/dist/core/components/segmented-control.d.ts +16 -0
  55. package/dist/core/components/segmented-control.js +30 -0
  56. package/dist/core/components/segmented-control.js.map +1 -0
  57. package/dist/core/components/segmented-pills.d.ts +13 -0
  58. package/dist/core/components/segmented-pills.js +31 -0
  59. package/dist/core/components/segmented-pills.js.map +1 -0
  60. package/dist/core/components/spinner.d.ts +2 -0
  61. package/dist/core/components/spinner.js +16 -0
  62. package/dist/core/components/spinner.js.map +1 -0
  63. package/dist/core/components/stack.d.ts +13 -0
  64. package/dist/core/components/stack.js +47 -0
  65. package/dist/core/components/stack.js.map +1 -0
  66. package/dist/core/components/tabs.d.ts +22 -0
  67. package/dist/core/components/tabs.js +118 -0
  68. package/dist/core/components/tabs.js.map +1 -0
  69. package/dist/core/components/text.d.ts +11 -0
  70. package/dist/core/components/text.js +18 -0
  71. package/dist/core/components/text.js.map +1 -0
  72. package/dist/core/props.d.ts +14 -0
  73. package/dist/core/props.js +30 -0
  74. package/dist/core/props.js.map +1 -0
  75. package/dist/core/registry.d.ts +26 -0
  76. package/dist/core/registry.js +36 -0
  77. package/dist/core/registry.js.map +1 -0
  78. package/dist/core/renderer.d.ts +16 -0
  79. package/dist/core/renderer.js +61 -0
  80. package/dist/core/renderer.js.map +1 -0
  81. package/dist/core/types.d.ts +55 -0
  82. package/dist/core/types.js +0 -0
  83. package/dist/events/event-bridge.d.ts +14 -0
  84. package/dist/events/event-bridge.js +75 -0
  85. package/dist/events/event-bridge.js.map +1 -0
  86. package/dist/events/event-names.d.ts +21 -0
  87. package/dist/events/event-names.js +22 -0
  88. package/dist/events/event-names.js.map +1 -0
  89. package/dist/form/components/base/checkbox.d.ts +4 -0
  90. package/dist/form/components/base/checkbox.js +22 -0
  91. package/dist/form/components/base/checkbox.js.map +1 -0
  92. package/dist/form/components/base/field.d.ts +9 -0
  93. package/dist/form/components/base/field.js +38 -0
  94. package/dist/form/components/base/field.js.map +1 -0
  95. package/dist/form/components/base/input-error.d.ts +4 -0
  96. package/dist/form/components/base/input-error.js +14 -0
  97. package/dist/form/components/base/input-error.js.map +1 -0
  98. package/dist/form/components/base/input.d.ts +3 -0
  99. package/dist/form/components/base/input.js +16 -0
  100. package/dist/form/components/base/input.js.map +1 -0
  101. package/dist/form/components/base/label.d.ts +4 -0
  102. package/dist/form/components/base/label.js +16 -0
  103. package/dist/form/components/base/label.js.map +1 -0
  104. package/dist/form/components/base/password-input.d.ts +7 -0
  105. package/dist/form/components/base/password-input.js +29 -0
  106. package/dist/form/components/base/password-input.js.map +1 -0
  107. package/dist/form/components/base/submit-button.d.ts +6 -0
  108. package/dist/form/components/base/submit-button.js +46 -0
  109. package/dist/form/components/base/submit-button.js.map +1 -0
  110. package/dist/form/components/base/textarea.d.ts +3 -0
  111. package/dist/form/components/base/textarea.js +15 -0
  112. package/dist/form/components/base/textarea.js.map +1 -0
  113. package/dist/form/components/conditions.d.ts +25 -0
  114. package/dist/form/components/conditions.js +62 -0
  115. package/dist/form/components/conditions.js.map +1 -0
  116. package/dist/form/components/context.d.ts +20 -0
  117. package/dist/form/components/context.js +30 -0
  118. package/dist/form/components/context.js.map +1 -0
  119. package/dist/form/components/fields/checkbox.d.ts +16 -0
  120. package/dist/form/components/fields/checkbox.js +51 -0
  121. package/dist/form/components/fields/checkbox.js.map +1 -0
  122. package/dist/form/components/fields/choice.d.ts +14 -0
  123. package/dist/form/components/fields/choice.js +49 -0
  124. package/dist/form/components/fields/choice.js.map +1 -0
  125. package/dist/form/components/fields/date-input.d.ts +20 -0
  126. package/dist/form/components/fields/date-input.js +33 -0
  127. package/dist/form/components/fields/date-input.js.map +1 -0
  128. package/dist/form/components/fields/hidden-input.d.ts +10 -0
  129. package/dist/form/components/fields/hidden-input.js +12 -0
  130. package/dist/form/components/fields/hidden-input.js.map +1 -0
  131. package/dist/form/components/fields/number-input.d.ts +23 -0
  132. package/dist/form/components/fields/number-input.js +55 -0
  133. package/dist/form/components/fields/number-input.js.map +1 -0
  134. package/dist/form/components/fields/password-input.d.ts +29 -0
  135. package/dist/form/components/fields/password-input.js +73 -0
  136. package/dist/form/components/fields/password-input.js.map +1 -0
  137. package/dist/form/components/fields/rich-editor.d.ts +17 -0
  138. package/dist/form/components/fields/rich-editor.js +302 -0
  139. package/dist/form/components/fields/rich-editor.js.map +1 -0
  140. package/dist/form/components/fields/select.d.ts +23 -0
  141. package/dist/form/components/fields/select.js +182 -0
  142. package/dist/form/components/fields/select.js.map +1 -0
  143. package/dist/form/components/fields/submit-button.d.ts +10 -0
  144. package/dist/form/components/fields/submit-button.js +14 -0
  145. package/dist/form/components/fields/submit-button.js.map +1 -0
  146. package/dist/form/components/fields/text-input.d.ts +21 -0
  147. package/dist/form/components/fields/text-input.js +33 -0
  148. package/dist/form/components/fields/text-input.js.map +1 -0
  149. package/dist/form/components/fields/textarea.d.ts +20 -0
  150. package/dist/form/components/fields/textarea.js +32 -0
  151. package/dist/form/components/fields/textarea.js.map +1 -0
  152. package/dist/form/components/form-transport.d.ts +8 -0
  153. package/dist/form/components/form-transport.js +31 -0
  154. package/dist/form/components/form-transport.js.map +1 -0
  155. package/dist/form/components/form.d.ts +21 -0
  156. package/dist/form/components/form.js +126 -0
  157. package/dist/form/components/form.js.map +1 -0
  158. package/dist/form/components/index.d.ts +11 -0
  159. package/dist/form/components/index.js +12 -0
  160. package/dist/form/components/resolved-nodes.d.ts +6 -0
  161. package/dist/form/components/resolved-nodes.js +20 -0
  162. package/dist/form/components/resolved-nodes.js.map +1 -0
  163. package/dist/form/components/types.d.ts +7 -0
  164. package/dist/form/components/types.js +0 -0
  165. package/dist/form/components/use-controlled-field.d.ts +16 -0
  166. package/dist/form/components/use-controlled-field.js +33 -0
  167. package/dist/form/components/use-controlled-field.js.map +1 -0
  168. package/dist/form/components/use-dependent-field.d.ts +3 -0
  169. package/dist/form/components/use-dependent-field.js +18 -0
  170. package/dist/form/components/use-dependent-field.js.map +1 -0
  171. package/dist/form/components/use-field-commit.d.ts +14 -0
  172. package/dist/form/components/use-field-commit.js +30 -0
  173. package/dist/form/components/use-field-commit.js.map +1 -0
  174. package/dist/form/components/use-form-resolver.d.ts +2 -0
  175. package/dist/form/components/use-form-resolver.js +57 -0
  176. package/dist/form/components/use-form-resolver.js.map +1 -0
  177. package/dist/form/components/values.d.ts +7 -0
  178. package/dist/form/components/values.js +37 -0
  179. package/dist/form/components/values.js.map +1 -0
  180. package/dist/form/index.d.ts +1 -0
  181. package/dist/form/index.js +33 -0
  182. package/dist/form/index.js.map +1 -0
  183. package/dist/form/skeleton.d.ts +2 -0
  184. package/dist/form/skeleton.js +21 -0
  185. package/dist/form/skeleton.js.map +1 -0
  186. package/dist/generated/types.d.ts +17 -0
  187. package/dist/generated/types.js +0 -0
  188. package/dist/icons/default-icons.d.ts +3 -0
  189. package/dist/icons/default-icons.js +44 -0
  190. package/dist/icons/default-icons.js.map +1 -0
  191. package/dist/icons/dynamic-lucide-renderer.d.ts +2 -0
  192. package/dist/icons/dynamic-lucide-renderer.js +18 -0
  193. package/dist/icons/dynamic-lucide-renderer.js.map +1 -0
  194. package/dist/icons/icon-renderer.d.ts +14 -0
  195. package/dist/icons/icon-renderer.js +35 -0
  196. package/dist/icons/icon-renderer.js.map +1 -0
  197. package/dist/icons/index.d.ts +2 -0
  198. package/dist/icons/index.js +2 -0
  199. package/dist/index.d.ts +22 -0
  200. package/dist/index.js +14 -0
  201. package/dist/inertia.d.ts +17 -0
  202. package/dist/inertia.js +26 -0
  203. package/dist/inertia.js.map +1 -0
  204. package/dist/lattice.css +247 -0
  205. package/dist/lib/utils.d.ts +4 -0
  206. package/dist/lib/utils.js +13 -0
  207. package/dist/lib/utils.js.map +1 -0
  208. package/dist/menu/index.d.ts +1 -0
  209. package/dist/menu/index.js +2 -0
  210. package/dist/menu/use-menu.d.ts +2 -0
  211. package/dist/menu/use-menu.js +9 -0
  212. package/dist/menu/use-menu.js.map +1 -0
  213. package/dist/page.d.ts +6 -0
  214. package/dist/page.js +30 -0
  215. package/dist/page.js.map +1 -0
  216. package/dist/provider.d.ts +7 -0
  217. package/dist/provider.js +19 -0
  218. package/dist/provider.js.map +1 -0
  219. package/dist/registry.d.ts +1 -0
  220. package/dist/registry.js +11 -0
  221. package/dist/registry.js.map +1 -0
  222. package/dist/table/bulk.d.ts +18 -0
  223. package/dist/table/bulk.js +44 -0
  224. package/dist/table/bulk.js.map +1 -0
  225. package/dist/table/components/bulk-bar.d.ts +11 -0
  226. package/dist/table/components/bulk-bar.js +76 -0
  227. package/dist/table/components/bulk-bar.js.map +1 -0
  228. package/dist/table/components/column-filter-control.d.ts +14 -0
  229. package/dist/table/components/column-filter-control.js +244 -0
  230. package/dist/table/components/column-filter-control.js.map +1 -0
  231. package/dist/table/components/column-header.d.ts +7 -0
  232. package/dist/table/components/column-header.js +37 -0
  233. package/dist/table/components/column-header.js.map +1 -0
  234. package/dist/table/components/filter-stack-bar.d.ts +7 -0
  235. package/dist/table/components/filter-stack-bar.js +35 -0
  236. package/dist/table/components/filter-stack-bar.js.map +1 -0
  237. package/dist/table/components/filter-value-input.d.ts +11 -0
  238. package/dist/table/components/filter-value-input.js +82 -0
  239. package/dist/table/components/filter-value-input.js.map +1 -0
  240. package/dist/table/components/pagination.d.ts +14 -0
  241. package/dist/table/components/pagination.js +67 -0
  242. package/dist/table/components/pagination.js.map +1 -0
  243. package/dist/table/components/sort-bar.d.ts +7 -0
  244. package/dist/table/components/sort-bar.js +43 -0
  245. package/dist/table/components/sort-bar.js.map +1 -0
  246. package/dist/table/components/table-action-node.d.ts +4 -0
  247. package/dist/table/components/table-action-node.js +24 -0
  248. package/dist/table/components/table-action-node.js.map +1 -0
  249. package/dist/table/components/table-cell.d.ts +5 -0
  250. package/dist/table/components/table-cell.js +63 -0
  251. package/dist/table/components/table-cell.js.map +1 -0
  252. package/dist/table/components/table.d.ts +3 -0
  253. package/dist/table/components/table.js +189 -0
  254. package/dist/table/components/table.js.map +1 -0
  255. package/dist/table/format.d.ts +3 -0
  256. package/dist/table/format.js +41 -0
  257. package/dist/table/format.js.map +1 -0
  258. package/dist/table/index.d.ts +1 -0
  259. package/dist/table/index.js +10 -0
  260. package/dist/table/index.js.map +1 -0
  261. package/dist/table/payload.d.ts +9 -0
  262. package/dist/table/payload.js +46 -0
  263. package/dist/table/payload.js.map +1 -0
  264. package/dist/table/query.d.ts +12 -0
  265. package/dist/table/query.js +83 -0
  266. package/dist/table/query.js.map +1 -0
  267. package/dist/table/types.d.ts +67 -0
  268. package/dist/table/types.js +0 -0
  269. package/dist/table/use-table-selection.d.ts +12 -0
  270. package/dist/table/use-table-selection.js +46 -0
  271. package/dist/table/use-table-selection.js.map +1 -0
  272. package/dist/table/use-table.d.ts +19 -0
  273. package/dist/table/use-table.js +157 -0
  274. package/dist/table/use-table.js.map +1 -0
  275. package/dist/types/index.d.ts +2 -0
  276. package/dist/types/index.js +0 -0
  277. package/package.json +151 -0
@@ -0,0 +1,33 @@
1
+ import { getBooleanProp, getOptionalNumberProp, getStringProp } from "../../../core/props.js";
2
+ import { FormFieldFrame } from "../base/field.js";
3
+ import { useControlledField } from "../use-controlled-field.js";
4
+ import { Input } from "../base/input.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region resources/js/form/components/fields/text-input.tsx
7
+ var TextInputComponent = ({ node }) => {
8
+ const { name, value, error, hidden, required, readonly, disabled, commit } = useControlledField(node);
9
+ if (hidden) return null;
10
+ return /* @__PURE__ */ jsx(FormFieldFrame, {
11
+ error,
12
+ label: getStringProp(node.props, "label"),
13
+ name,
14
+ required,
15
+ children: /* @__PURE__ */ jsx(Input, {
16
+ autoComplete: getStringProp(node.props, "autoComplete"),
17
+ autoFocus: getBooleanProp(node.props, "autoFocus"),
18
+ disabled,
19
+ id: name,
20
+ name,
21
+ onChange: (event) => commit(event.target.value),
22
+ placeholder: getStringProp(node.props, "placeholder"),
23
+ readOnly: readonly,
24
+ tabIndex: getOptionalNumberProp(node.props, "tabIndex"),
25
+ type: getStringProp(node.props, "type", "text"),
26
+ value
27
+ })
28
+ });
29
+ };
30
+ //#endregion
31
+ export { TextInputComponent };
32
+
33
+ //# sourceMappingURL=text-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-input.js","names":[],"sources":["../../../../resources/js/form/components/fields/text-input.tsx"],"sourcesContent":["import { getBooleanProp, getOptionalNumberProp, getStringProp } from \"@lattice/lattice/core/props\";\nimport type { RendererComponent } from \"@lattice/lattice/core/types\";\nimport { FormFieldFrame } from \"../base/field\";\nimport { Input } from \"../base/input\";\nimport { useControlledField } from \"../use-controlled-field\";\n\ndeclare module \"@lattice/lattice/core/types\" {\n interface ComponentProps {\n \"form.text-input\": {\n autoComplete?: string;\n autoFocus?: boolean;\n conditions?: unknown;\n disabled?: boolean;\n hidden?: boolean;\n label?: string;\n name?: string;\n placeholder?: string;\n readonly?: boolean;\n required?: boolean;\n tabIndex?: number;\n type?: \"email\" | \"text\";\n value?: string;\n };\n }\n}\n\nexport const TextInputComponent: RendererComponent<\"form.text-input\"> = ({ node }) => {\n const { name, value, error, hidden, required, readonly, disabled, commit } =\n useControlledField(node);\n\n if (hidden) {\n return null;\n }\n\n return (\n <FormFieldFrame\n error={error}\n label={getStringProp(node.props, \"label\")}\n name={name}\n required={required}\n >\n <Input\n autoComplete={getStringProp(node.props, \"autoComplete\")}\n autoFocus={getBooleanProp(node.props, \"autoFocus\")}\n disabled={disabled}\n id={name}\n name={name}\n onChange={(event) => commit(event.target.value)}\n placeholder={getStringProp(node.props, \"placeholder\")}\n readOnly={readonly}\n tabIndex={getOptionalNumberProp(node.props, \"tabIndex\")}\n type={getStringProp(node.props, \"type\", \"text\")}\n value={value}\n />\n </FormFieldFrame>\n );\n};\n"],"mappings":";;;;;;AA0BA,IAAa,sBAA4D,EAAE,WAAW;CACpF,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,UAAU,UAAU,UAAU,WAChE,mBAAmB,IAAI;CAEzB,IAAI,QACF,OAAO;CAGT,OACE,oBAAC,gBAAD;EACS;EACP,OAAO,cAAc,KAAK,OAAO,OAAO;EAClC;EACI;YAEV,oBAAC,OAAD;GACE,cAAc,cAAc,KAAK,OAAO,cAAc;GACtD,WAAW,eAAe,KAAK,OAAO,WAAW;GACvC;GACV,IAAI;GACE;GACN,WAAW,UAAU,OAAO,MAAM,OAAO,KAAK;GAC9C,aAAa,cAAc,KAAK,OAAO,aAAa;GACpD,UAAU;GACV,UAAU,sBAAsB,KAAK,OAAO,UAAU;GACtD,MAAM,cAAc,KAAK,OAAO,QAAQ,MAAM;GACvC;EACR,CAAA;CACa,CAAA;AAEpB"}
@@ -0,0 +1,20 @@
1
+ import { RendererComponent } from '../../../../../core/types';
2
+ declare module '../../../../../core/types' {
3
+ interface ComponentProps {
4
+ "form.textarea": {
5
+ autoFocus?: boolean;
6
+ conditions?: unknown;
7
+ disabled?: boolean;
8
+ hidden?: boolean;
9
+ label?: string;
10
+ name?: string;
11
+ placeholder?: string;
12
+ readonly?: boolean;
13
+ required?: boolean;
14
+ rows?: number;
15
+ tabIndex?: number;
16
+ value?: string;
17
+ };
18
+ }
19
+ }
20
+ export declare const TextareaComponent: RendererComponent<"form.textarea">;
@@ -0,0 +1,32 @@
1
+ import { getBooleanProp, getOptionalNumberProp, getStringProp } from "../../../core/props.js";
2
+ import { FormFieldFrame } from "../base/field.js";
3
+ import { useControlledField } from "../use-controlled-field.js";
4
+ import { Textarea } from "../base/textarea.js";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region resources/js/form/components/fields/textarea.tsx
7
+ var TextareaComponent = ({ node }) => {
8
+ const { name, value, error, hidden, required, readonly, disabled, commit } = useControlledField(node);
9
+ if (hidden) return null;
10
+ return /* @__PURE__ */ jsx(FormFieldFrame, {
11
+ error,
12
+ label: getStringProp(node.props, "label"),
13
+ name,
14
+ required,
15
+ children: /* @__PURE__ */ jsx(Textarea, {
16
+ autoFocus: getBooleanProp(node.props, "autoFocus"),
17
+ disabled,
18
+ id: name,
19
+ name,
20
+ onChange: (event) => commit(event.target.value),
21
+ placeholder: getStringProp(node.props, "placeholder"),
22
+ readOnly: readonly,
23
+ rows: getOptionalNumberProp(node.props, "rows"),
24
+ tabIndex: getOptionalNumberProp(node.props, "tabIndex"),
25
+ value
26
+ })
27
+ });
28
+ };
29
+ //#endregion
30
+ export { TextareaComponent };
31
+
32
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","names":[],"sources":["../../../../resources/js/form/components/fields/textarea.tsx"],"sourcesContent":["import { getBooleanProp, getOptionalNumberProp, getStringProp } from \"@lattice/lattice/core/props\";\nimport type { RendererComponent } from \"@lattice/lattice/core/types\";\nimport { FormFieldFrame } from \"../base/field\";\nimport { Textarea } from \"../base/textarea\";\nimport { useControlledField } from \"../use-controlled-field\";\n\ndeclare module \"@lattice/lattice/core/types\" {\n interface ComponentProps {\n \"form.textarea\": {\n autoFocus?: boolean;\n conditions?: unknown;\n disabled?: boolean;\n hidden?: boolean;\n label?: string;\n name?: string;\n placeholder?: string;\n readonly?: boolean;\n required?: boolean;\n rows?: number;\n tabIndex?: number;\n value?: string;\n };\n }\n}\n\nexport const TextareaComponent: RendererComponent<\"form.textarea\"> = ({ node }) => {\n const { name, value, error, hidden, required, readonly, disabled, commit } =\n useControlledField(node);\n\n if (hidden) {\n return null;\n }\n\n return (\n <FormFieldFrame\n error={error}\n label={getStringProp(node.props, \"label\")}\n name={name}\n required={required}\n >\n <Textarea\n autoFocus={getBooleanProp(node.props, \"autoFocus\")}\n disabled={disabled}\n id={name}\n name={name}\n onChange={(event) => commit(event.target.value)}\n placeholder={getStringProp(node.props, \"placeholder\")}\n readOnly={readonly}\n rows={getOptionalNumberProp(node.props, \"rows\")}\n tabIndex={getOptionalNumberProp(node.props, \"tabIndex\")}\n value={value}\n />\n </FormFieldFrame>\n );\n};\n"],"mappings":";;;;;;AAyBA,IAAa,qBAAyD,EAAE,WAAW;CACjF,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,UAAU,UAAU,UAAU,WAChE,mBAAmB,IAAI;CAEzB,IAAI,QACF,OAAO;CAGT,OACE,oBAAC,gBAAD;EACS;EACP,OAAO,cAAc,KAAK,OAAO,OAAO;EAClC;EACI;YAEV,oBAAC,UAAD;GACE,WAAW,eAAe,KAAK,OAAO,WAAW;GACvC;GACV,IAAI;GACE;GACN,WAAW,UAAU,OAAO,MAAM,OAAO,KAAK;GAC9C,aAAa,cAAc,KAAK,OAAO,aAAa;GACpD,UAAU;GACV,MAAM,sBAAsB,KAAK,OAAO,MAAM;GAC9C,UAAU,sBAAsB,KAAK,OAAO,UAAU;GAC/C;EACR,CAAA;CACa,CAAA;AAEpB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared client transport for the lattice form endpoint. Every form sub-action
3
+ * (validation resolve, option search) POSTs to the same signed form URL, so the
4
+ * CSRF header, component-ref header, and request shape live here in one place.
5
+ */
6
+ export declare const FORM_DEBOUNCE_MS = 250;
7
+ export declare function xsrfToken(): string;
8
+ export declare function postFormAction<T>(action: string, componentRef: string, body: Record<string, unknown>, signal: AbortSignal): Promise<T | null>;
@@ -0,0 +1,31 @@
1
+ import { withRefHeader } from "../../core/component-ref.js";
2
+ //#region resources/js/form/components/form-transport.ts
3
+ /**
4
+ * Shared client transport for the lattice form endpoint. Every form sub-action
5
+ * (validation resolve, option search) POSTs to the same signed form URL, so the
6
+ * CSRF header, component-ref header, and request shape live here in one place.
7
+ */
8
+ var FORM_DEBOUNCE_MS = 250;
9
+ function xsrfToken() {
10
+ const match = document.cookie.match(/XSRF-TOKEN=([^;]+)/);
11
+ return match ? decodeURIComponent(match[1]) : "";
12
+ }
13
+ function postFormAction(action, componentRef, body, signal) {
14
+ return fetch(action, {
15
+ method: "POST",
16
+ credentials: "same-origin",
17
+ signal,
18
+ headers: {
19
+ "Content-Type": "application/json",
20
+ Accept: "application/json",
21
+ "X-Requested-With": "XMLHttpRequest",
22
+ "X-XSRF-TOKEN": xsrfToken(),
23
+ ...withRefHeader(componentRef)
24
+ },
25
+ body: JSON.stringify(body)
26
+ }).then((response) => response.ok ? response.json() : null);
27
+ }
28
+ //#endregion
29
+ export { FORM_DEBOUNCE_MS, postFormAction, xsrfToken };
30
+
31
+ //# sourceMappingURL=form-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-transport.js","names":[],"sources":["../../../resources/js/form/components/form-transport.ts"],"sourcesContent":["/**\n * Shared client transport for the lattice form endpoint. Every form sub-action\n * (validation resolve, option search) POSTs to the same signed form URL, so the\n * CSRF header, component-ref header, and request shape live here in one place.\n */\n\nimport { withRefHeader } from \"@lattice/lattice/core/component-ref\";\n\nexport const FORM_DEBOUNCE_MS = 250;\n\nexport function xsrfToken(): string {\n const match = document.cookie.match(/XSRF-TOKEN=([^;]+)/);\n\n return match ? decodeURIComponent(match[1]) : \"\";\n}\n\nexport function postFormAction<T>(\n action: string,\n componentRef: string,\n body: Record<string, unknown>,\n signal: AbortSignal,\n): Promise<T | null> {\n return fetch(action, {\n method: \"POST\",\n credentials: \"same-origin\",\n signal,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n \"X-XSRF-TOKEN\": xsrfToken(),\n ...withRefHeader(componentRef),\n },\n body: JSON.stringify(body),\n }).then((response) => (response.ok ? (response.json() as Promise<T>) : null));\n}\n"],"mappings":";;;;;;;AAQA,IAAa,mBAAmB;AAEhC,SAAgB,YAAoB;CAClC,MAAM,QAAQ,SAAS,OAAO,MAAM,oBAAoB;CAExD,OAAO,QAAQ,mBAAmB,MAAM,EAAE,IAAI;AAChD;AAEA,SAAgB,eACd,QACA,cACA,MACA,QACmB;CACnB,OAAO,MAAM,QAAQ;EACnB,QAAQ;EACR,aAAa;EACb;EACA,SAAS;GACP,gBAAgB;GAChB,QAAQ;GACR,oBAAoB;GACpB,gBAAgB,UAAU;GAC1B,GAAG,cAAc,YAAY;EAC/B;EACA,MAAM,KAAK,UAAU,IAAI;CAC3B,CAAC,EAAE,MAAM,aAAc,SAAS,KAAM,SAAS,KAAK,IAAmB,IAAK;AAC9E"}
@@ -0,0 +1,21 @@
1
+ import { RendererComponent } from '../../../../core/types';
2
+ import { FormMethod } from './types';
3
+ declare module '../../../../core/types' {
4
+ interface ComponentProps {
5
+ form: {
6
+ action?: string;
7
+ errorBag?: string;
8
+ ref?: string;
9
+ method?: FormMethod;
10
+ precognitive?: boolean;
11
+ resetOnError?: boolean | string[];
12
+ resetOnSuccess?: boolean | string[];
13
+ state?: Record<string, unknown>;
14
+ status?: string;
15
+ submitButton?: boolean;
16
+ submitLabel?: string;
17
+ validationTimeout?: number;
18
+ };
19
+ }
20
+ }
21
+ export declare const FormComponent: RendererComponent<"form">;
@@ -0,0 +1,126 @@
1
+ import { withRefHeader } from "../../core/component-ref.js";
2
+ import { getBooleanProp, getOptionalNumberProp, getStringProp } from "../../core/props.js";
3
+ import { LATTICE_EVENT } from "../../events/event-names.js";
4
+ import { FormProvider } from "./context.js";
5
+ import { FormSubmitButton } from "./base/submit-button.js";
6
+ import { ResolvedNodesProvider } from "./resolved-nodes.js";
7
+ import { FormValuesProvider } from "./values.js";
8
+ import { useFormResolver } from "./use-form-resolver.js";
9
+ import { useEffect, useMemo } from "react";
10
+ import { Form } from "@inertiajs/react";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ //#region resources/js/form/components/form.tsx
13
+ function getFormState(props) {
14
+ const state = props?.state;
15
+ if (typeof state !== "object" || state === null || Array.isArray(state)) return {};
16
+ return state;
17
+ }
18
+ function collectFields(nodes, collected = {
19
+ labels: {},
20
+ values: {}
21
+ }) {
22
+ for (const child of nodes ?? []) {
23
+ const name = getStringProp(child.props, "name");
24
+ if (name) {
25
+ const label = getStringProp(child.props, "label");
26
+ if (label) collected.labels[name] = label;
27
+ if (child.props?.value !== void 0) collected.values[name] = child.props.value;
28
+ }
29
+ collectFields(child.children, collected);
30
+ }
31
+ return collected;
32
+ }
33
+ function FormResetListener({ componentId, reset }) {
34
+ useEffect(() => {
35
+ const handler = (event) => {
36
+ const detail = event.detail;
37
+ if (!detail?.form || detail.form === componentId) reset();
38
+ };
39
+ window.addEventListener(LATTICE_EVENT.resetForm, handler);
40
+ return () => window.removeEventListener(LATTICE_EVENT.resetForm, handler);
41
+ }, [componentId, reset]);
42
+ return null;
43
+ }
44
+ function FormBody({ action, children, componentRef, nodes, shouldRenderSubmitButton, submitLabel }) {
45
+ return /* @__PURE__ */ jsx(ResolvedNodesProvider, {
46
+ nodes: useFormResolver(action, componentRef, nodes),
47
+ children: /* @__PURE__ */ jsxs("div", {
48
+ className: "flex flex-col gap-6",
49
+ children: [children, shouldRenderSubmitButton && /* @__PURE__ */ jsx("div", {
50
+ className: "flex justify-end rounded-lt border border-lt-border bg-lt-surface px-6 py-4 shadow-xs",
51
+ children: /* @__PURE__ */ jsx(FormSubmitButton, { label: submitLabel })
52
+ })]
53
+ })
54
+ });
55
+ }
56
+ var FormComponent = ({ children, node }) => {
57
+ const props = node.props ?? {};
58
+ const action = props.action ?? "#";
59
+ const errorBag = props.errorBag;
60
+ const componentRef = getStringProp(props, "ref");
61
+ const method = props.method ?? "post";
62
+ const precognitive = getBooleanProp(props, "precognitive");
63
+ const resetOnError = props.resetOnError ?? false;
64
+ const resetOnSuccess = props.resetOnSuccess ?? [];
65
+ const state = getFormState(node.props);
66
+ const { labels: fieldLabels, values: fieldValues } = useMemo(() => collectFields(node.children), [node.children]);
67
+ const initialValues = {
68
+ ...fieldValues,
69
+ ...state
70
+ };
71
+ const shouldRenderSubmitButton = getBooleanProp(props, "submitButton", true);
72
+ const submitLabel = props.submitLabel ?? "Submit";
73
+ const validationTimeout = getOptionalNumberProp(props, "validationTimeout");
74
+ return /* @__PURE__ */ jsx(Form, {
75
+ action,
76
+ "data-lattice-component": node.id,
77
+ errorBag,
78
+ method,
79
+ resetOnError,
80
+ resetOnSuccess,
81
+ validationTimeout: precognitive ? validationTimeout : void 0,
82
+ headers: withRefHeader(componentRef),
83
+ className: "mx-auto flex w-full max-w-2xl flex-col gap-6",
84
+ children: ({ clearErrors, errors, invalid, processing, reset, touch, validate, validating, valid }) => /* @__PURE__ */ jsxs(FormProvider, {
85
+ value: {
86
+ action,
87
+ clearErrors: (field) => clearErrors(field),
88
+ componentRef,
89
+ errors,
90
+ fieldLabels,
91
+ invalid: (field) => invalid(field),
92
+ precognitive,
93
+ processing,
94
+ touch: (field) => touch(field),
95
+ validate: (field) => validate(field),
96
+ validating,
97
+ valid: (field) => valid(field)
98
+ },
99
+ children: [
100
+ /* @__PURE__ */ jsx(FormResetListener, {
101
+ componentId: node.id,
102
+ reset
103
+ }),
104
+ props.status && /* @__PURE__ */ jsx("div", {
105
+ className: "text-center text-sm font-medium text-green-600 dark:text-green-400",
106
+ children: props.status
107
+ }),
108
+ /* @__PURE__ */ jsx(FormValuesProvider, {
109
+ initial: initialValues,
110
+ children: /* @__PURE__ */ jsx(FormBody, {
111
+ action,
112
+ componentRef,
113
+ nodes: node.children,
114
+ shouldRenderSubmitButton,
115
+ submitLabel,
116
+ children
117
+ })
118
+ })
119
+ ]
120
+ })
121
+ });
122
+ };
123
+ //#endregion
124
+ export { FormComponent };
125
+
126
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","names":[],"sources":["../../../resources/js/form/components/form.tsx"],"sourcesContent":["import { Form as InertiaForm } from \"@inertiajs/react\";\nimport { withRefHeader } from \"@lattice/lattice/core/component-ref\";\nimport { getBooleanProp, getOptionalNumberProp, getStringProp } from \"@lattice/lattice/core/props\";\nimport { LATTICE_EVENT } from \"@lattice/lattice/events/event-names\";\nimport type { Node, NodeProps, RendererComponent } from \"@lattice/lattice/core/types\";\nimport { useEffect, useMemo } from \"react\";\nimport { FormSubmitButton } from \"./base/submit-button\";\nimport { FormProvider } from \"./context\";\nimport { ResolvedNodesProvider } from \"./resolved-nodes\";\nimport type { FormMethod } from \"./types\";\nimport { useFormResolver } from \"./use-form-resolver\";\nimport { FormValuesProvider } from \"./values\";\n\ndeclare module \"@lattice/lattice/core/types\" {\n interface ComponentProps {\n form: {\n action?: string;\n errorBag?: string;\n ref?: string;\n method?: FormMethod;\n precognitive?: boolean;\n resetOnError?: boolean | string[];\n resetOnSuccess?: boolean | string[];\n state?: Record<string, unknown>;\n status?: string;\n submitButton?: boolean;\n submitLabel?: string;\n validationTimeout?: number;\n };\n }\n}\n\nfunction getFormState(props: NodeProps | undefined): Record<string, unknown> {\n const state = props?.state;\n\n if (typeof state !== \"object\" || state === null || Array.isArray(state)) {\n return {};\n }\n\n return state as Record<string, unknown>;\n}\n\ntype CollectedFields = {\n labels: Record<string, string>;\n values: Record<string, unknown>;\n};\n\nfunction collectFields(\n nodes: Node[] | undefined,\n collected: CollectedFields = { labels: {}, values: {} },\n): CollectedFields {\n for (const child of nodes ?? []) {\n const name = getStringProp(child.props, \"name\");\n\n if (name) {\n const label = getStringProp(child.props, \"label\");\n if (label) {\n collected.labels[name] = label;\n }\n if (child.props?.value !== undefined) {\n collected.values[name] = child.props.value;\n }\n }\n\n collectFields(child.children, collected);\n }\n\n return collected;\n}\n\nfunction FormResetListener({\n componentId,\n reset,\n}: {\n componentId?: string;\n reset: (...fields: string[]) => void;\n}) {\n useEffect(() => {\n const handler = (event: Event) => {\n const detail = (event as CustomEvent<{ form?: string }>).detail;\n\n if (!detail?.form || detail.form === componentId) {\n reset();\n }\n };\n\n window.addEventListener(LATTICE_EVENT.resetForm, handler);\n\n return () => window.removeEventListener(LATTICE_EVENT.resetForm, handler);\n }, [componentId, reset]);\n\n return null;\n}\n\nfunction FormBody({\n action,\n children,\n componentRef,\n nodes,\n shouldRenderSubmitButton,\n submitLabel,\n}: {\n action: string;\n children: React.ReactNode;\n componentRef: string;\n nodes: Node[] | undefined;\n shouldRenderSubmitButton: boolean;\n submitLabel: string;\n}) {\n const resolvedNodes = useFormResolver(action, componentRef, nodes);\n\n return (\n <ResolvedNodesProvider nodes={resolvedNodes}>\n <div className=\"flex flex-col gap-6\">\n {children}\n\n {shouldRenderSubmitButton && (\n <div className=\"flex justify-end rounded-lt border border-lt-border bg-lt-surface px-6 py-4 shadow-xs\">\n <FormSubmitButton label={submitLabel} />\n </div>\n )}\n </div>\n </ResolvedNodesProvider>\n );\n}\n\nexport const FormComponent: RendererComponent<\"form\"> = ({ children, node }) => {\n const props = node.props ?? {};\n const action = props.action ?? \"#\";\n const errorBag = props.errorBag;\n const componentRef = getStringProp(props, \"ref\");\n const method = props.method ?? \"post\";\n const precognitive = getBooleanProp(props, \"precognitive\");\n const resetOnError = props.resetOnError ?? false;\n const resetOnSuccess = props.resetOnSuccess ?? [];\n const state = getFormState(node.props);\n const { labels: fieldLabels, values: fieldValues } = useMemo(\n () => collectFields(node.children),\n [node.children],\n );\n const initialValues = { ...fieldValues, ...state };\n const shouldRenderSubmitButton = getBooleanProp(props, \"submitButton\", true);\n const submitLabel = props.submitLabel ?? \"Submit\";\n const validationTimeout = getOptionalNumberProp(props, \"validationTimeout\");\n\n return (\n <InertiaForm\n action={action}\n data-lattice-component={node.id}\n errorBag={errorBag}\n method={method}\n resetOnError={resetOnError}\n resetOnSuccess={resetOnSuccess}\n validationTimeout={precognitive ? validationTimeout : undefined}\n headers={withRefHeader(componentRef)}\n className=\"mx-auto flex w-full max-w-2xl flex-col gap-6\"\n >\n {({\n clearErrors,\n errors,\n invalid,\n processing,\n reset,\n touch,\n validate,\n validating,\n valid,\n }) => (\n <FormProvider\n value={{\n action,\n clearErrors: (field) => clearErrors(field),\n componentRef,\n errors: errors as Record<string, string | undefined>,\n fieldLabels,\n invalid: (field) => invalid(field),\n precognitive,\n processing,\n touch: (field) => touch(field),\n validate: (field) => validate(field),\n validating,\n valid: (field) => valid(field),\n }}\n >\n <FormResetListener componentId={node.id} reset={reset} />\n\n {props.status && (\n <div className=\"text-center text-sm font-medium text-green-600 dark:text-green-400\">\n {props.status}\n </div>\n )}\n\n <FormValuesProvider initial={initialValues}>\n <FormBody\n action={action}\n componentRef={componentRef}\n nodes={node.children}\n shouldRenderSubmitButton={shouldRenderSubmitButton}\n submitLabel={submitLabel}\n >\n {children}\n </FormBody>\n </FormValuesProvider>\n </FormProvider>\n )}\n </InertiaForm>\n );\n};\n"],"mappings":";;;;;;;;;;;;AAgCA,SAAS,aAAa,OAAuD;CAC3E,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO,CAAC;CAGV,OAAO;AACT;AAOA,SAAS,cACP,OACA,YAA6B;CAAE,QAAQ,CAAC;CAAG,QAAQ,CAAC;AAAE,GACrC;CACjB,KAAK,MAAM,SAAS,SAAS,CAAC,GAAG;EAC/B,MAAM,OAAO,cAAc,MAAM,OAAO,MAAM;EAE9C,IAAI,MAAM;GACR,MAAM,QAAQ,cAAc,MAAM,OAAO,OAAO;GAChD,IAAI,OACF,UAAU,OAAO,QAAQ;GAE3B,IAAI,MAAM,OAAO,UAAU,KAAA,GACzB,UAAU,OAAO,QAAQ,MAAM,MAAM;EAEzC;EAEA,cAAc,MAAM,UAAU,SAAS;CACzC;CAEA,OAAO;AACT;AAEA,SAAS,kBAAkB,EACzB,aACA,SAIC;CACD,gBAAgB;EACd,MAAM,WAAW,UAAiB;GAChC,MAAM,SAAU,MAAyC;GAEzD,IAAI,CAAC,QAAQ,QAAQ,OAAO,SAAS,aACnC,MAAM;EAEV;EAEA,OAAO,iBAAiB,cAAc,WAAW,OAAO;EAExD,aAAa,OAAO,oBAAoB,cAAc,WAAW,OAAO;CAC1E,GAAG,CAAC,aAAa,KAAK,CAAC;CAEvB,OAAO;AACT;AAEA,SAAS,SAAS,EAChB,QACA,UACA,cACA,OACA,0BACA,eAQC;CAGD,OACE,oBAAC,uBAAD;EAAuB,OAHH,gBAAgB,QAAQ,cAAc,KAG5B;YAC5B,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,UAEA,4BACC,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,kBAAD,EAAkB,OAAO,YAAc,CAAA;GACpC,CAAA,CAEJ;;CACgB,CAAA;AAE3B;AAEA,IAAa,iBAA4C,EAAE,UAAU,WAAW;CAC9E,MAAM,QAAQ,KAAK,SAAS,CAAC;CAC7B,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,WAAW,MAAM;CACvB,MAAM,eAAe,cAAc,OAAO,KAAK;CAC/C,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,eAAe,eAAe,OAAO,cAAc;CACzD,MAAM,eAAe,MAAM,gBAAgB;CAC3C,MAAM,iBAAiB,MAAM,kBAAkB,CAAC;CAChD,MAAM,QAAQ,aAAa,KAAK,KAAK;CACrC,MAAM,EAAE,QAAQ,aAAa,QAAQ,gBAAgB,cAC7C,cAAc,KAAK,QAAQ,GACjC,CAAC,KAAK,QAAQ,CAChB;CACA,MAAM,gBAAgB;EAAE,GAAG;EAAa,GAAG;CAAM;CACjD,MAAM,2BAA2B,eAAe,OAAO,gBAAgB,IAAI;CAC3E,MAAM,cAAc,MAAM,eAAe;CACzC,MAAM,oBAAoB,sBAAsB,OAAO,mBAAmB;CAE1E,OACE,oBAAC,MAAD;EACU;EACR,0BAAwB,KAAK;EACnB;EACF;EACM;EACE;EAChB,mBAAmB,eAAe,oBAAoB,KAAA;EACtD,SAAS,cAAc,YAAY;EACnC,WAAU;aAER,EACA,aACA,QACA,SACA,YACA,OACA,OACA,UACA,YACA,YAEA,qBAAC,cAAD;GACE,OAAO;IACL;IACA,cAAc,UAAU,YAAY,KAAK;IACzC;IACQ;IACR;IACA,UAAU,UAAU,QAAQ,KAAK;IACjC;IACA;IACA,QAAQ,UAAU,MAAM,KAAK;IAC7B,WAAW,UAAU,SAAS,KAAK;IACnC;IACA,QAAQ,UAAU,MAAM,KAAK;GAC/B;aAdF;IAgBE,oBAAC,mBAAD;KAAmB,aAAa,KAAK;KAAW;IAAQ,CAAA;IAEvD,MAAM,UACL,oBAAC,OAAD;KAAK,WAAU;eACZ,MAAM;IACJ,CAAA;IAGP,oBAAC,oBAAD;KAAoB,SAAS;eAC3B,oBAAC,UAAD;MACU;MACM;MACd,OAAO,KAAK;MACc;MACb;MAEZ;KACO,CAAA;IACQ,CAAA;GACR;;CAEL,CAAA;AAEjB"}
@@ -0,0 +1,11 @@
1
+ export { CheckboxComponent } from './fields/checkbox';
2
+ export { ChoiceComponent } from './fields/choice';
3
+ export { DateInputComponent } from './fields/date-input';
4
+ export { FormComponent } from './form';
5
+ export { HiddenInputComponent } from './fields/hidden-input';
6
+ export { NumberInputComponent } from './fields/number-input';
7
+ export { PasswordInputComponent } from './fields/password-input';
8
+ export { SelectComponent } from './fields/select';
9
+ export { SubmitButtonComponent } from './fields/submit-button';
10
+ export { TextareaComponent } from './fields/textarea';
11
+ export { TextInputComponent } from './fields/text-input';
@@ -0,0 +1,12 @@
1
+ import { FormComponent } from "./form.js";
2
+ import { CheckboxComponent } from "./fields/checkbox.js";
3
+ import { ChoiceComponent } from "./fields/choice.js";
4
+ import { DateInputComponent } from "./fields/date-input.js";
5
+ import { HiddenInputComponent } from "./fields/hidden-input.js";
6
+ import { NumberInputComponent } from "./fields/number-input.js";
7
+ import { PasswordInputComponent } from "./fields/password-input.js";
8
+ import { SelectComponent } from "./fields/select.js";
9
+ import { SubmitButtonComponent } from "./fields/submit-button.js";
10
+ import { TextareaComponent } from "./fields/textarea.js";
11
+ import { TextInputComponent } from "./fields/text-input.js";
12
+ export { CheckboxComponent, ChoiceComponent, DateInputComponent, FormComponent, HiddenInputComponent, NumberInputComponent, PasswordInputComponent, SelectComponent, SubmitButtonComponent, TextInputComponent, TextareaComponent };
@@ -0,0 +1,6 @@
1
+ import { Node } from '../../../../core/types';
2
+ export declare function ResolvedNodesProvider({ nodes, children, }: {
3
+ nodes: Record<string, Node>;
4
+ children: React.ReactNode;
5
+ }): import("react").JSX.Element;
6
+ export declare function useResolvedNode(node: Node): Node;
@@ -0,0 +1,20 @@
1
+ import { getStringProp } from "../../core/props.js";
2
+ import { createContext, useContext } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region resources/js/form/components/resolved-nodes.tsx
5
+ var ResolvedNodesContext = createContext({});
6
+ function ResolvedNodesProvider({ nodes, children }) {
7
+ return /* @__PURE__ */ jsx(ResolvedNodesContext.Provider, {
8
+ value: nodes,
9
+ children
10
+ });
11
+ }
12
+ function useResolvedNode(node) {
13
+ const nodes = useContext(ResolvedNodesContext);
14
+ const name = getStringProp(node.props, "name");
15
+ return name && nodes[name] ? nodes[name] : node;
16
+ }
17
+ //#endregion
18
+ export { ResolvedNodesProvider, useResolvedNode };
19
+
20
+ //# sourceMappingURL=resolved-nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolved-nodes.js","names":[],"sources":["../../../resources/js/form/components/resolved-nodes.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport { getStringProp } from \"@lattice/lattice/core/props\";\nimport type { Node } from \"@lattice/lattice/core/types\";\n\nconst ResolvedNodesContext = createContext<Record<string, Node>>({});\n\nexport function ResolvedNodesProvider({\n nodes,\n children,\n}: {\n nodes: Record<string, Node>;\n children: React.ReactNode;\n}) {\n return <ResolvedNodesContext.Provider value={nodes}>{children}</ResolvedNodesContext.Provider>;\n}\n\nexport function useResolvedNode(node: Node): Node {\n const nodes = useContext(ResolvedNodesContext);\n const name = getStringProp(node.props, \"name\");\n\n return name && nodes[name] ? nodes[name] : node;\n}\n"],"mappings":";;;;AAIA,IAAM,uBAAuB,cAAoC,CAAC,CAAC;AAEnE,SAAgB,sBAAsB,EACpC,OACA,YAIC;CACD,OAAO,oBAAC,qBAAqB,UAAtB;EAA+B,OAAO;EAAQ;CAAwC,CAAA;AAC/F;AAEA,SAAgB,gBAAgB,MAAkB;CAChD,MAAM,QAAQ,WAAW,oBAAoB;CAC7C,MAAM,OAAO,cAAc,KAAK,OAAO,MAAM;CAE7C,OAAO,QAAQ,MAAM,QAAQ,MAAM,QAAQ;AAC7C"}
@@ -0,0 +1,7 @@
1
+ import { Method } from '@inertiajs/core';
2
+ export type FormMethod = Method;
3
+ export type FormLabelAction = {
4
+ href: string;
5
+ label: string;
6
+ tabIndex?: number;
7
+ };
File without changes
@@ -0,0 +1,16 @@
1
+ import { Node } from '../../../../core/types';
2
+ import { FieldState } from './conditions';
3
+ type ControlledField = FieldState & {
4
+ name: string;
5
+ value: string;
6
+ error?: string;
7
+ commit: (value: unknown) => void;
8
+ };
9
+ /**
10
+ * Shared wiring for store-controlled, condition-aware fields: derives the current
11
+ * string value (store, falling back to the node's value prop), the field state
12
+ * (hidden/required/readonly/disabled), the current error, and a `commit` callback
13
+ * that writes to the store and triggers precognition validation / error clearing.
14
+ */
15
+ export declare function useControlledField(node: Node): ControlledField;
16
+ export {};
@@ -0,0 +1,33 @@
1
+ import { getStringProp } from "../../core/props.js";
2
+ import { useFormContext } from "./context.js";
3
+ import { useFormValue } from "./values.js";
4
+ import { useDependentField } from "./use-dependent-field.js";
5
+ import { useFieldCommit } from "./use-field-commit.js";
6
+ //#region resources/js/form/components/use-controlled-field.ts
7
+ /**
8
+ * Shared wiring for store-controlled, condition-aware fields: derives the current
9
+ * string value (store, falling back to the node's value prop), the field state
10
+ * (hidden/required/readonly/disabled), the current error, and a `commit` callback
11
+ * that writes to the store and triggers precognition validation / error clearing.
12
+ */
13
+ function useControlledField(node) {
14
+ const { errors } = useFormContext();
15
+ const state = useDependentField(node);
16
+ const name = getStringProp(node.props, "name");
17
+ const storedValue = useFormValue(name);
18
+ const currentValue = storedValue !== void 0 ? storedValue : node.props?.value;
19
+ const value = typeof currentValue === "string" || typeof currentValue === "number" ? String(currentValue) : "";
20
+ const { commit: commitField } = useFieldCommit();
21
+ const commit = (next) => commitField(name, next);
22
+ return {
23
+ ...state,
24
+ name,
25
+ value,
26
+ error: errors[name],
27
+ commit
28
+ };
29
+ }
30
+ //#endregion
31
+ export { useControlledField };
32
+
33
+ //# sourceMappingURL=use-controlled-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-controlled-field.js","names":[],"sources":["../../../resources/js/form/components/use-controlled-field.ts"],"sourcesContent":["import { getStringProp } from \"@lattice/lattice/core/props\";\nimport type { Node } from \"@lattice/lattice/core/types\";\nimport type { FieldState } from \"./conditions\";\nimport { useFormContext } from \"./context\";\nimport { useDependentField } from \"./use-dependent-field\";\nimport { useFieldCommit } from \"./use-field-commit\";\nimport { useFormValue } from \"./values\";\n\ntype ControlledField = FieldState & {\n name: string;\n value: string;\n error?: string;\n commit: (value: unknown) => void;\n};\n\n/**\n * Shared wiring for store-controlled, condition-aware fields: derives the current\n * string value (store, falling back to the node's value prop), the field state\n * (hidden/required/readonly/disabled), the current error, and a `commit` callback\n * that writes to the store and triggers precognition validation / error clearing.\n */\nexport function useControlledField(node: Node): ControlledField {\n const { errors } = useFormContext();\n const state = useDependentField(node);\n const name = getStringProp(node.props, \"name\");\n const storedValue = useFormValue(name);\n const currentValue = storedValue !== undefined ? storedValue : node.props?.value;\n const value =\n typeof currentValue === \"string\" || typeof currentValue === \"number\"\n ? String(currentValue)\n : \"\";\n\n const { commit: commitField } = useFieldCommit();\n const commit = (next: unknown): void => commitField(name, next);\n\n return { ...state, name, value, error: errors[name], commit };\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,SAAgB,mBAAmB,MAA6B;CAC9D,MAAM,EAAE,WAAW,eAAe;CAClC,MAAM,QAAQ,kBAAkB,IAAI;CACpC,MAAM,OAAO,cAAc,KAAK,OAAO,MAAM;CAC7C,MAAM,cAAc,aAAa,IAAI;CACrC,MAAM,eAAe,gBAAgB,KAAA,IAAY,cAAc,KAAK,OAAO;CAC3E,MAAM,QACJ,OAAO,iBAAiB,YAAY,OAAO,iBAAiB,WACxD,OAAO,YAAY,IACnB;CAEN,MAAM,EAAE,QAAQ,gBAAgB,eAAe;CAC/C,MAAM,UAAU,SAAwB,YAAY,MAAM,IAAI;CAE9D,OAAO;EAAE,GAAG;EAAO;EAAM;EAAO,OAAO,OAAO;EAAO;CAAO;AAC9D"}
@@ -0,0 +1,3 @@
1
+ import { Node } from '../../../../core/types';
2
+ import { FieldState } from './conditions';
3
+ export declare function useDependentField(node: Node): FieldState;
@@ -0,0 +1,18 @@
1
+ import { getBooleanProp } from "../../core/props.js";
2
+ import { evaluateConditions } from "./conditions.js";
3
+ import { useFormValues } from "./values.js";
4
+ //#region resources/js/form/components/use-dependent-field.ts
5
+ function useDependentField(node) {
6
+ const values = useFormValues();
7
+ const conditions = node.props?.conditions;
8
+ return evaluateConditions(conditions, values, {
9
+ hidden: getBooleanProp(node.props, "hidden"),
10
+ required: getBooleanProp(node.props, "required"),
11
+ readonly: getBooleanProp(node.props, "readonly"),
12
+ disabled: getBooleanProp(node.props, "disabled")
13
+ });
14
+ }
15
+ //#endregion
16
+ export { useDependentField };
17
+
18
+ //# sourceMappingURL=use-dependent-field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-dependent-field.js","names":[],"sources":["../../../resources/js/form/components/use-dependent-field.ts"],"sourcesContent":["import { getBooleanProp } from \"@lattice/lattice/core/props\";\nimport type { Node } from \"@lattice/lattice/core/types\";\nimport { type FieldConditions, type FieldState, evaluateConditions } from \"./conditions\";\nimport { useFormValues } from \"./values\";\n\nexport function useDependentField(node: Node): FieldState {\n const values = useFormValues();\n const conditions = node.props?.conditions as FieldConditions | undefined;\n\n return evaluateConditions(conditions, values, {\n hidden: getBooleanProp(node.props, \"hidden\"),\n required: getBooleanProp(node.props, \"required\"),\n readonly: getBooleanProp(node.props, \"readonly\"),\n disabled: getBooleanProp(node.props, \"disabled\"),\n });\n}\n"],"mappings":";;;;AAKA,SAAgB,kBAAkB,MAAwB;CACxD,MAAM,SAAS,cAAc;CAC7B,MAAM,aAAa,KAAK,OAAO;CAE/B,OAAO,mBAAmB,YAAY,QAAQ;EAC5C,QAAQ,eAAe,KAAK,OAAO,QAAQ;EAC3C,UAAU,eAAe,KAAK,OAAO,UAAU;EAC/C,UAAU,eAAe,KAAK,OAAO,UAAU;EAC/C,UAAU,eAAe,KAAK,OAAO,UAAU;CACjD,CAAC;AACH"}
@@ -0,0 +1,14 @@
1
+ export type FieldCommit = {
2
+ /** Write the value and validate immediately (precognitive) or clear errors. */
3
+ commit: (name: string, value: unknown) => void;
4
+ /** Write the value and clear errors, deferring validation to a later `blur`. */
5
+ change: (name: string, value: unknown) => void;
6
+ /** Validate the field now if precognitive (e.g. on blur or popover close). */
7
+ blur: (name: string) => void;
8
+ };
9
+ /**
10
+ * The shared field-mutation contract every form field uses to write its value
11
+ * and drive precognition. Fields that validate on change call `commit`; fields
12
+ * that validate on blur/close (rich editor, select) call `change` then `blur`.
13
+ */
14
+ export declare function useFieldCommit(): FieldCommit;
@@ -0,0 +1,30 @@
1
+ import { useFormContext } from "./context.js";
2
+ import { useSetFormValue } from "./values.js";
3
+ //#region resources/js/form/components/use-field-commit.ts
4
+ /**
5
+ * The shared field-mutation contract every form field uses to write its value
6
+ * and drive precognition. Fields that validate on change call `commit`; fields
7
+ * that validate on blur/close (rich editor, select) call `change` then `blur`.
8
+ */
9
+ function useFieldCommit() {
10
+ const { clearErrors, precognitive, validate } = useFormContext();
11
+ const setValue = useSetFormValue();
12
+ return {
13
+ commit(name, value) {
14
+ setValue(name, value);
15
+ if (precognitive) validate(name);
16
+ else clearErrors(name);
17
+ },
18
+ change(name, value) {
19
+ setValue(name, value);
20
+ clearErrors(name);
21
+ },
22
+ blur(name) {
23
+ if (precognitive) validate(name);
24
+ }
25
+ };
26
+ }
27
+ //#endregion
28
+ export { useFieldCommit };
29
+
30
+ //# sourceMappingURL=use-field-commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-field-commit.js","names":[],"sources":["../../../resources/js/form/components/use-field-commit.ts"],"sourcesContent":["import { useFormContext } from \"./context\";\nimport { useSetFormValue } from \"./values\";\n\nexport type FieldCommit = {\n /** Write the value and validate immediately (precognitive) or clear errors. */\n commit: (name: string, value: unknown) => void;\n /** Write the value and clear errors, deferring validation to a later `blur`. */\n change: (name: string, value: unknown) => void;\n /** Validate the field now if precognitive (e.g. on blur or popover close). */\n blur: (name: string) => void;\n};\n\n/**\n * The shared field-mutation contract every form field uses to write its value\n * and drive precognition. Fields that validate on change call `commit`; fields\n * that validate on blur/close (rich editor, select) call `change` then `blur`.\n */\nexport function useFieldCommit(): FieldCommit {\n const { clearErrors, precognitive, validate } = useFormContext();\n const setValue = useSetFormValue();\n\n return {\n commit(name, value) {\n setValue(name, value);\n if (precognitive) {\n validate(name);\n } else {\n clearErrors(name);\n }\n },\n change(name, value) {\n setValue(name, value);\n clearErrors(name);\n },\n blur(name) {\n if (precognitive) {\n validate(name);\n }\n },\n };\n}\n"],"mappings":";;;;;;;;AAiBA,SAAgB,iBAA8B;CAC5C,MAAM,EAAE,aAAa,cAAc,aAAa,eAAe;CAC/D,MAAM,WAAW,gBAAgB;CAEjC,OAAO;EACL,OAAO,MAAM,OAAO;GAClB,SAAS,MAAM,KAAK;GACpB,IAAI,cACF,SAAS,IAAI;QAEb,YAAY,IAAI;EAEpB;EACA,OAAO,MAAM,OAAO;GAClB,SAAS,MAAM,KAAK;GACpB,YAAY,IAAI;EAClB;EACA,KAAK,MAAM;GACT,IAAI,cACF,SAAS,IAAI;EAEjB;CACF;AACF"}
@@ -0,0 +1,2 @@
1
+ import { Node } from '../../../../core/types';
2
+ export declare function useFormResolver(action: string, componentRef: string, nodes: Node[] | undefined): Record<string, Node>;
@@ -0,0 +1,57 @@
1
+ import { getBooleanProp } from "../../core/props.js";
2
+ import { postFormAction } from "./form-transport.js";
3
+ import { useFormValues, useSetFormValue } from "./values.js";
4
+ import { useEffect, useMemo, useState } from "react";
5
+ //#region resources/js/form/components/use-form-resolver.ts
6
+ function collectWatch(nodes, keys, state) {
7
+ for (const child of nodes ?? []) {
8
+ const dependsOnKeys = child.props?.dependsOnKeys;
9
+ if (Array.isArray(dependsOnKeys)) for (const key of dependsOnKeys) keys.add(String(key));
10
+ if (getBooleanProp(child.props, "dependsOnAny")) state.any = true;
11
+ collectWatch(child.children, keys, state);
12
+ }
13
+ }
14
+ function useFormResolver(action, componentRef, nodes) {
15
+ const values = useFormValues();
16
+ const setValue = useSetFormValue();
17
+ const [resolved, setResolved] = useState({});
18
+ const watch = useMemo(() => {
19
+ const keys = /* @__PURE__ */ new Set();
20
+ const state = { any: false };
21
+ collectWatch(nodes, keys, state);
22
+ return {
23
+ keys: [...keys],
24
+ any: state.any
25
+ };
26
+ }, [nodes]);
27
+ useEffect(() => {
28
+ if (watch.keys.length === 0 && !watch.any) return;
29
+ const controller = new AbortController();
30
+ const timer = window.setTimeout(() => {
31
+ postFormAction(action, componentRef, {
32
+ _resolve: true,
33
+ ...values
34
+ }, controller.signal).then((response) => {
35
+ if (!response) return;
36
+ for (const [name, value] of Object.entries(response.values ?? {})) setValue(name, value);
37
+ if (response.fields) setResolved(response.fields);
38
+ }).catch(() => {});
39
+ }, 250);
40
+ return () => {
41
+ window.clearTimeout(timer);
42
+ controller.abort();
43
+ };
44
+ }, [
45
+ watch.any ? JSON.stringify(values) : JSON.stringify(watch.keys.map((key) => values[key])),
46
+ action,
47
+ componentRef,
48
+ watch.keys.length,
49
+ watch.any,
50
+ setValue
51
+ ]);
52
+ return resolved;
53
+ }
54
+ //#endregion
55
+ export { useFormResolver };
56
+
57
+ //# sourceMappingURL=use-form-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-form-resolver.js","names":[],"sources":["../../../resources/js/form/components/use-form-resolver.ts"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { getBooleanProp } from \"@lattice/lattice/core/props\";\nimport type { Node } from \"@lattice/lattice/core/types\";\nimport { FORM_DEBOUNCE_MS, postFormAction } from \"./form-transport\";\nimport { useFormValues, useSetFormValue } from \"./values\";\n\ntype ResolveResponse = {\n fields?: Record<string, Node>;\n values?: Record<string, unknown>;\n};\n\nfunction collectWatch(nodes: Node[] | undefined, keys: Set<string>, state: { any: boolean }): void {\n for (const child of nodes ?? []) {\n const dependsOnKeys = child.props?.dependsOnKeys;\n if (Array.isArray(dependsOnKeys)) {\n for (const key of dependsOnKeys) {\n keys.add(String(key));\n }\n }\n if (getBooleanProp(child.props, \"dependsOnAny\")) {\n state.any = true;\n }\n collectWatch(child.children, keys, state);\n }\n}\n\nexport function useFormResolver(\n action: string,\n componentRef: string,\n nodes: Node[] | undefined,\n): Record<string, Node> {\n const values = useFormValues();\n const setValue = useSetFormValue();\n const [resolved, setResolved] = useState<Record<string, Node>>({});\n\n const watch = useMemo(() => {\n const keys = new Set<string>();\n const state = { any: false };\n collectWatch(nodes, keys, state);\n return { keys: [...keys], any: state.any };\n }, [nodes]);\n\n const watched = watch.any\n ? JSON.stringify(values)\n : JSON.stringify(watch.keys.map((key) => values[key]));\n\n useEffect(() => {\n if (watch.keys.length === 0 && !watch.any) {\n return;\n }\n\n const controller = new AbortController();\n\n const timer = window.setTimeout(() => {\n void postFormAction<ResolveResponse>(\n action,\n componentRef,\n { _resolve: true, ...values },\n controller.signal,\n )\n .then((response) => {\n if (!response) {\n return;\n }\n for (const [name, value] of Object.entries(response.values ?? {})) {\n setValue(name, value);\n }\n if (response.fields) {\n setResolved(response.fields);\n }\n })\n .catch(() => {});\n }, FORM_DEBOUNCE_MS);\n\n return () => {\n window.clearTimeout(timer);\n controller.abort();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [watched, action, componentRef, watch.keys.length, watch.any, setValue]);\n\n return resolved;\n}\n"],"mappings":";;;;;AAWA,SAAS,aAAa,OAA2B,MAAmB,OAA+B;CACjG,KAAK,MAAM,SAAS,SAAS,CAAC,GAAG;EAC/B,MAAM,gBAAgB,MAAM,OAAO;EACnC,IAAI,MAAM,QAAQ,aAAa,GAC7B,KAAK,MAAM,OAAO,eAChB,KAAK,IAAI,OAAO,GAAG,CAAC;EAGxB,IAAI,eAAe,MAAM,OAAO,cAAc,GAC5C,MAAM,MAAM;EAEd,aAAa,MAAM,UAAU,MAAM,KAAK;CAC1C;AACF;AAEA,SAAgB,gBACd,QACA,cACA,OACsB;CACtB,MAAM,SAAS,cAAc;CAC7B,MAAM,WAAW,gBAAgB;CACjC,MAAM,CAAC,UAAU,eAAe,SAA+B,CAAC,CAAC;CAEjE,MAAM,QAAQ,cAAc;EAC1B,MAAM,uBAAO,IAAI,IAAY;EAC7B,MAAM,QAAQ,EAAE,KAAK,MAAM;EAC3B,aAAa,OAAO,MAAM,KAAK;EAC/B,OAAO;GAAE,MAAM,CAAC,GAAG,IAAI;GAAG,KAAK,MAAM;EAAI;CAC3C,GAAG,CAAC,KAAK,CAAC;CAMV,gBAAgB;EACd,IAAI,MAAM,KAAK,WAAW,KAAK,CAAC,MAAM,KACpC;EAGF,MAAM,aAAa,IAAI,gBAAgB;EAEvC,MAAM,QAAQ,OAAO,iBAAiB;GACpC,eACE,QACA,cACA;IAAE,UAAU;IAAM,GAAG;GAAO,GAC5B,WAAW,MACb,EACG,MAAM,aAAa;IAClB,IAAI,CAAC,UACH;IAEF,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,UAAU,CAAC,CAAC,GAC9D,SAAS,MAAM,KAAK;IAEtB,IAAI,SAAS,QACX,YAAY,SAAS,MAAM;GAE/B,CAAC,EACA,YAAY,CAAC,CAAC;EACnB,GAAA,GAAmB;EAEnB,aAAa;GACX,OAAO,aAAa,KAAK;GACzB,WAAW,MAAM;EACnB;CAEF,GAAG;EArCa,MAAM,MAClB,KAAK,UAAU,MAAM,IACrB,KAAK,UAAU,MAAM,KAAK,KAAK,QAAQ,OAAO,IAAI,CAAC;EAmC1C;EAAQ;EAAc,MAAM,KAAK;EAAQ,MAAM;EAAK;CAAQ,CAAC;CAE1E,OAAO;AACT"}
@@ -0,0 +1,7 @@
1
+ export declare function FormValuesProvider({ initial, children, }: {
2
+ initial: Record<string, unknown>;
3
+ children: React.ReactNode;
4
+ }): import("react").JSX.Element;
5
+ export declare function useFormValues(): Record<string, unknown>;
6
+ export declare function useFormValue(name: string): unknown;
7
+ export declare function useSetFormValue(): (name: string, value: unknown) => void;