@lattice-php/lattice 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +8 -0
  2. package/dist/action/components/action-form.d.ts +24 -0
  3. package/dist/action/components/action-form.js +270 -0
  4. package/dist/action/components/action-form.js.map +1 -0
  5. package/dist/action/components/action-group.d.ts +1 -8
  6. package/dist/action/components/action-group.js +24 -66
  7. package/dist/action/components/action-group.js.map +1 -1
  8. package/dist/action/components/action.d.ts +1 -24
  9. package/dist/action/components/action.js +61 -46
  10. package/dist/action/components/action.js.map +1 -1
  11. package/dist/action/effects.d.ts +6 -25
  12. package/dist/action/effects.js +2 -2
  13. package/dist/action/effects.js.map +1 -1
  14. package/dist/action/index.d.ts +1 -1
  15. package/dist/core/components/badge.d.ts +1 -8
  16. package/dist/core/components/badge.js +2 -3
  17. package/dist/core/components/badge.js.map +1 -1
  18. package/dist/core/components/button.d.ts +4 -12
  19. package/dist/core/components/button.js +6 -9
  20. package/dist/core/components/button.js.map +1 -1
  21. package/dist/core/components/card.d.ts +1 -9
  22. package/dist/core/components/card.js +1 -3
  23. package/dist/core/components/card.js.map +1 -1
  24. package/dist/core/components/confirm-dialog.d.ts +2 -3
  25. package/dist/core/components/confirm-dialog.js +19 -13
  26. package/dist/core/components/confirm-dialog.js.map +1 -1
  27. package/dist/core/components/fragment.d.ts +1 -10
  28. package/dist/core/components/fragment.js +5 -6
  29. package/dist/core/components/fragment.js.map +1 -1
  30. package/dist/core/components/grid.d.ts +1 -8
  31. package/dist/core/components/grid.js +1 -2
  32. package/dist/core/components/grid.js.map +1 -1
  33. package/dist/core/components/heading.d.ts +1 -9
  34. package/dist/core/components/heading.js +2 -3
  35. package/dist/core/components/heading.js.map +1 -1
  36. package/dist/core/components/icon.d.ts +3 -0
  37. package/dist/core/components/icon.js +30 -0
  38. package/dist/core/components/icon.js.map +1 -0
  39. package/dist/core/components/index.d.ts +1 -1
  40. package/dist/core/components/index.js +4 -0
  41. package/dist/core/components/index.js.map +1 -1
  42. package/dist/core/components/link.d.ts +1 -12
  43. package/dist/core/components/link.js +4 -9
  44. package/dist/core/components/link.js.map +1 -1
  45. package/dist/core/components/modal.d.ts +1 -11
  46. package/dist/core/components/modal.js +27 -31
  47. package/dist/core/components/modal.js.map +1 -1
  48. package/dist/core/components/section.d.ts +3 -0
  49. package/dist/core/components/section.js +79 -0
  50. package/dist/core/components/section.js.map +1 -0
  51. package/dist/core/components/segmented-control.d.ts +1 -14
  52. package/dist/core/components/segmented-control.js +4 -7
  53. package/dist/core/components/segmented-control.js.map +1 -1
  54. package/dist/core/components/segmented-pills.d.ts +4 -2
  55. package/dist/core/components/segmented-pills.js +10 -1
  56. package/dist/core/components/segmented-pills.js.map +1 -1
  57. package/dist/core/components/spinner.js +8 -4
  58. package/dist/core/components/spinner.js.map +1 -1
  59. package/dist/core/components/stack.d.ts +1 -11
  60. package/dist/core/components/stack.js +5 -5
  61. package/dist/core/components/stack.js.map +1 -1
  62. package/dist/core/components/tabs.d.ts +1 -19
  63. package/dist/core/components/tabs.js +45 -21
  64. package/dist/core/components/tabs.js.map +1 -1
  65. package/dist/core/components/text.d.ts +1 -9
  66. package/dist/core/components/text.js +2 -3
  67. package/dist/core/components/text.js.map +1 -1
  68. package/dist/core/registry.d.ts +9 -3
  69. package/dist/core/registry.js +21 -5
  70. package/dist/core/registry.js.map +1 -1
  71. package/dist/core/renderer.js +7 -13
  72. package/dist/core/renderer.js.map +1 -1
  73. package/dist/core/types.d.ts +54 -26
  74. package/dist/form/components/base/checkbox.js +5 -2
  75. package/dist/form/components/base/checkbox.js.map +1 -1
  76. package/dist/form/components/base/field.d.ts +2 -1
  77. package/dist/form/components/base/field.js +5 -1
  78. package/dist/form/components/base/field.js.map +1 -1
  79. package/dist/form/components/base/password-input.js +9 -2
  80. package/dist/form/components/base/password-input.js.map +1 -1
  81. package/dist/form/components/base/submit-button.d.ts +4 -4
  82. package/dist/form/components/base/submit-button.js +2 -2
  83. package/dist/form/components/base/submit-button.js.map +1 -1
  84. package/dist/form/components/conditions.d.ts +6 -9
  85. package/dist/form/components/conditions.js +10 -2
  86. package/dist/form/components/conditions.js.map +1 -1
  87. package/dist/form/components/context.d.ts +0 -4
  88. package/dist/form/components/context.js +1 -5
  89. package/dist/form/components/context.js.map +1 -1
  90. package/dist/form/components/field-props.d.ts +24 -0
  91. package/dist/form/components/field-props.js +15 -0
  92. package/dist/form/components/field-props.js.map +1 -0
  93. package/dist/form/components/fields/checkbox.d.ts +1 -15
  94. package/dist/form/components/fields/checkbox.js +16 -21
  95. package/dist/form/components/fields/checkbox.js.map +1 -1
  96. package/dist/form/components/fields/choice.d.ts +1 -13
  97. package/dist/form/components/fields/choice.js +13 -20
  98. package/dist/form/components/fields/choice.js.map +1 -1
  99. package/dist/form/components/fields/date-input.d.ts +1 -19
  100. package/dist/form/components/fields/date-input.js +11 -16
  101. package/dist/form/components/fields/date-input.js.map +1 -1
  102. package/dist/form/components/fields/hidden-input.d.ts +1 -9
  103. package/dist/form/components/fields/hidden-input.js +2 -3
  104. package/dist/form/components/fields/hidden-input.js.map +1 -1
  105. package/dist/form/components/fields/number-input.d.ts +1 -22
  106. package/dist/form/components/fields/number-input.js +38 -41
  107. package/dist/form/components/fields/number-input.js.map +1 -1
  108. package/dist/form/components/fields/password-input.d.ts +1 -28
  109. package/dist/form/components/fields/password-input.js +15 -24
  110. package/dist/form/components/fields/password-input.js.map +1 -1
  111. package/dist/form/components/fields/rich-editor.d.ts +1 -16
  112. package/dist/form/components/fields/rich-editor.js +57 -47
  113. package/dist/form/components/fields/rich-editor.js.map +1 -1
  114. package/dist/form/components/fields/select.d.ts +1 -22
  115. package/dist/form/components/fields/select.js +85 -74
  116. package/dist/form/components/fields/select.js.map +1 -1
  117. package/dist/form/components/fields/simple-field.d.ts +9 -0
  118. package/dist/form/components/fields/simple-field.js +22 -0
  119. package/dist/form/components/fields/simple-field.js.map +1 -0
  120. package/dist/form/components/fields/text-input.d.ts +1 -20
  121. package/dist/form/components/fields/text-input.js +12 -17
  122. package/dist/form/components/fields/text-input.js.map +1 -1
  123. package/dist/form/components/fields/textarea.d.ts +1 -19
  124. package/dist/form/components/fields/textarea.js +11 -16
  125. package/dist/form/components/fields/textarea.js.map +1 -1
  126. package/dist/form/components/form.d.ts +1 -20
  127. package/dist/form/components/form.js +29 -36
  128. package/dist/form/components/form.js.map +1 -1
  129. package/dist/form/components/index.d.ts +0 -1
  130. package/dist/form/components/index.js +1 -2
  131. package/dist/form/components/resolved-nodes.d.ts +1 -1
  132. package/dist/form/components/resolved-nodes.js +2 -2
  133. package/dist/form/components/resolved-nodes.js.map +1 -1
  134. package/dist/form/components/types.d.ts +1 -0
  135. package/dist/form/components/use-controlled-field.d.ts +3 -9
  136. package/dist/form/components/use-controlled-field.js +5 -9
  137. package/dist/form/components/use-controlled-field.js.map +1 -1
  138. package/dist/form/components/use-dependent-field.d.ts +1 -1
  139. package/dist/form/components/use-dependent-field.js +8 -8
  140. package/dist/form/components/use-dependent-field.js.map +1 -1
  141. package/dist/form/components/use-form-resolver.d.ts +1 -1
  142. package/dist/form/components/use-form-resolver.js +8 -13
  143. package/dist/form/components/use-form-resolver.js.map +1 -1
  144. package/dist/form/components/use-seed-default.d.ts +5 -0
  145. package/dist/form/components/use-seed-default.js +23 -0
  146. package/dist/form/components/use-seed-default.js.map +1 -0
  147. package/dist/form/index.d.ts +1 -1
  148. package/dist/form/index.js +0 -1
  149. package/dist/form/index.js.map +1 -1
  150. package/dist/form/skeleton.d.ts +1 -1
  151. package/dist/form/skeleton.js +1 -1
  152. package/dist/form/skeleton.js.map +1 -1
  153. package/dist/i18n/backend.d.ts +24 -0
  154. package/dist/i18n/backend.js +39 -0
  155. package/dist/i18n/backend.js.map +1 -0
  156. package/dist/i18n/index.d.ts +3 -0
  157. package/dist/i18n/index.js +3 -0
  158. package/dist/i18n/instance.js +48 -0
  159. package/dist/i18n/instance.js.map +1 -0
  160. package/dist/icons/icon-renderer.js +30 -5
  161. package/dist/icons/icon-renderer.js.map +1 -1
  162. package/dist/icons/index.d.ts +2 -0
  163. package/dist/icons/index.js +2 -1
  164. package/dist/icons/sprite.d.ts +30 -0
  165. package/dist/icons/sprite.js +40 -0
  166. package/dist/icons/sprite.js.map +1 -0
  167. package/dist/index.d.ts +9 -5
  168. package/dist/index.js +7 -3
  169. package/dist/inertia.d.ts +1 -6
  170. package/dist/inertia.js +4 -8
  171. package/dist/inertia.js.map +1 -1
  172. package/dist/lattice.css +129 -5
  173. package/dist/layout/components.d.ts +1 -0
  174. package/dist/layout/components.js +19 -0
  175. package/dist/layout/components.js.map +1 -0
  176. package/dist/layout/context.d.ts +12 -0
  177. package/dist/layout/context.js +19 -0
  178. package/dist/layout/context.js.map +1 -0
  179. package/dist/layout/index.d.ts +3 -0
  180. package/dist/layout/index.js +4 -0
  181. package/dist/layout/menu-item.d.ts +3 -0
  182. package/dist/layout/menu-item.js +130 -0
  183. package/dist/layout/menu-item.js.map +1 -0
  184. package/dist/layout/menu.d.ts +3 -0
  185. package/dist/layout/menu.js +13 -0
  186. package/dist/layout/menu.js.map +1 -0
  187. package/dist/layout/outlet.d.ts +6 -0
  188. package/dist/layout/outlet.js +14 -0
  189. package/dist/layout/outlet.js.map +1 -0
  190. package/dist/layout/schema-layout.d.ts +10 -0
  191. package/dist/layout/schema-layout.js +30 -0
  192. package/dist/layout/schema-layout.js.map +1 -0
  193. package/dist/layout/sidebar.d.ts +3 -0
  194. package/dist/layout/sidebar.js +48 -0
  195. package/dist/layout/sidebar.js.map +1 -0
  196. package/dist/lib/utils.d.ts +0 -2
  197. package/dist/lib/utils.js +1 -4
  198. package/dist/lib/utils.js.map +1 -1
  199. package/dist/node_modules/i18next/dist/esm/i18next.js +1982 -0
  200. package/dist/node_modules/i18next/dist/esm/i18next.js.map +1 -0
  201. package/dist/node_modules/i18next-http-backend/esm/index.js +352 -0
  202. package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -0
  203. package/dist/node_modules/react-i18next/dist/es/context.js +23 -0
  204. package/dist/node_modules/react-i18next/dist/es/context.js.map +1 -0
  205. package/dist/node_modules/react-i18next/dist/es/defaults.js +29 -0
  206. package/dist/node_modules/react-i18next/dist/es/defaults.js.map +1 -0
  207. package/dist/node_modules/react-i18next/dist/es/i18nInstance.js +10 -0
  208. package/dist/node_modules/react-i18next/dist/es/i18nInstance.js.map +1 -0
  209. package/dist/node_modules/react-i18next/dist/es/initReactI18next.js +14 -0
  210. package/dist/node_modules/react-i18next/dist/es/initReactI18next.js.map +1 -0
  211. package/dist/node_modules/react-i18next/dist/es/unescape.js +30 -0
  212. package/dist/node_modules/react-i18next/dist/es/unescape.js.map +1 -0
  213. package/dist/node_modules/react-i18next/dist/es/useTranslation.js +157 -0
  214. package/dist/node_modules/react-i18next/dist/es/useTranslation.js.map +1 -0
  215. package/dist/node_modules/react-i18next/dist/es/utils.js +58 -0
  216. package/dist/node_modules/react-i18next/dist/es/utils.js.map +1 -0
  217. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +70 -0
  218. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -0
  219. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +61 -0
  220. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +1 -0
  221. package/dist/node_modules/use-sync-external-store/shim/index.js +13 -0
  222. package/dist/node_modules/use-sync-external-store/shim/index.js.map +1 -0
  223. package/dist/page.d.ts +1 -1
  224. package/dist/page.js +2 -2
  225. package/dist/page.js.map +1 -1
  226. package/dist/provider.d.ts +8 -3
  227. package/dist/provider.js +17 -9
  228. package/dist/provider.js.map +1 -1
  229. package/dist/registry.d.ts +1 -1
  230. package/dist/registry.js +2 -1
  231. package/dist/registry.js.map +1 -1
  232. package/dist/table/bulk.d.ts +6 -10
  233. package/dist/table/bulk.js +13 -35
  234. package/dist/table/bulk.js.map +1 -1
  235. package/dist/table/column-registry.d.ts +9 -0
  236. package/dist/table/components/bulk-bar.js +34 -3
  237. package/dist/table/components/bulk-bar.js.map +1 -1
  238. package/dist/table/components/cells/badge-cell.d.ts +5 -0
  239. package/dist/table/components/cells/badge-cell.js +16 -0
  240. package/dist/table/components/cells/badge-cell.js.map +1 -0
  241. package/dist/table/components/cells/icon-cell.d.ts +5 -0
  242. package/dist/table/components/cells/icon-cell.js +22 -0
  243. package/dist/table/components/cells/icon-cell.js.map +1 -0
  244. package/dist/table/components/cells/image-cell.d.ts +5 -0
  245. package/dist/table/components/cells/image-cell.js +24 -0
  246. package/dist/table/components/cells/image-cell.js.map +1 -0
  247. package/dist/table/components/cells/text-cell.d.ts +6 -0
  248. package/dist/table/components/cells/text-cell.js +50 -0
  249. package/dist/table/components/cells/text-cell.js.map +1 -0
  250. package/dist/table/components/column-filter-control.js +59 -96
  251. package/dist/table/components/column-filter-control.js.map +1 -1
  252. package/dist/table/components/column-header.js +22 -11
  253. package/dist/table/components/column-header.js.map +1 -1
  254. package/dist/table/components/filter-stack-bar.d.ts +2 -2
  255. package/dist/table/components/filter-stack-bar.js +10 -8
  256. package/dist/table/components/filter-stack-bar.js.map +1 -1
  257. package/dist/table/components/filter-value-input.d.ts +5 -3
  258. package/dist/table/components/filter-value-input.js +25 -16
  259. package/dist/table/components/filter-value-input.js.map +1 -1
  260. package/dist/table/components/pagination.d.ts +1 -1
  261. package/dist/table/components/pagination.js +20 -8
  262. package/dist/table/components/pagination.js.map +1 -1
  263. package/dist/table/components/sort-bar.d.ts +2 -2
  264. package/dist/table/components/sort-bar.js +12 -10
  265. package/dist/table/components/sort-bar.js.map +1 -1
  266. package/dist/table/components/table-action-node.d.ts +1 -1
  267. package/dist/table/components/table-action-node.js +1 -1
  268. package/dist/table/components/table-action-node.js.map +1 -1
  269. package/dist/table/components/table-cell.d.ts +1 -1
  270. package/dist/table/components/table-cell.js +24 -43
  271. package/dist/table/components/table-cell.js.map +1 -1
  272. package/dist/table/components/table.d.ts +6 -2
  273. package/dist/table/components/table.js +40 -17
  274. package/dist/table/components/table.js.map +1 -1
  275. package/dist/table/format.js +5 -3
  276. package/dist/table/format.js.map +1 -1
  277. package/dist/table/index.d.ts +1 -1
  278. package/dist/table/index.js.map +1 -1
  279. package/dist/table/payload.d.ts +1 -1
  280. package/dist/table/query.d.ts +0 -1
  281. package/dist/table/query.js +8 -9
  282. package/dist/table/query.js.map +1 -1
  283. package/dist/table/types.d.ts +38 -42
  284. package/dist/table/use-table.d.ts +3 -4
  285. package/dist/table/use-table.js +12 -23
  286. package/dist/table/use-table.js.map +1 -1
  287. package/dist/test-support.d.ts +14 -0
  288. package/dist/test-support.js +14 -0
  289. package/dist/test-support.js.map +1 -0
  290. package/dist/toast/index.d.ts +1 -0
  291. package/dist/toast/index.js +2 -0
  292. package/dist/toast/toaster.d.ts +3 -0
  293. package/dist/toast/toaster.js +126 -0
  294. package/dist/toast/toaster.js.map +1 -0
  295. package/dist/types/generated.d.ts +677 -0
  296. package/dist/types/generated.js +0 -0
  297. package/dist/types/index.d.ts +1 -1
  298. package/package.json +18 -3
  299. package/resources/icons/align-center.svg +17 -0
  300. package/resources/icons/align-justify.svg +17 -0
  301. package/resources/icons/align-left.svg +17 -0
  302. package/resources/icons/align-right.svg +17 -0
  303. package/resources/icons/arrow-down.svg +16 -0
  304. package/resources/icons/arrow-up.svg +16 -0
  305. package/resources/icons/bold.svg +15 -0
  306. package/resources/icons/check.svg +15 -0
  307. package/resources/icons/chevron-down.svg +15 -0
  308. package/resources/icons/chevron-right.svg +15 -0
  309. package/resources/icons/chevrons-up-down.svg +16 -0
  310. package/resources/icons/circle-alert.svg +17 -0
  311. package/resources/icons/circle-check.svg +16 -0
  312. package/resources/icons/circle-help.svg +17 -0
  313. package/resources/icons/circle-x.svg +17 -0
  314. package/resources/icons/code.svg +16 -0
  315. package/resources/icons/columns-3.svg +17 -0
  316. package/resources/icons/copy.svg +16 -0
  317. package/resources/icons/external-link.svg +17 -0
  318. package/resources/icons/eye-off.svg +18 -0
  319. package/resources/icons/eye.svg +16 -0
  320. package/resources/icons/filter.svg +15 -0
  321. package/resources/icons/heading-1.svg +18 -0
  322. package/resources/icons/heading-2.svg +18 -0
  323. package/resources/icons/heading-3.svg +19 -0
  324. package/resources/icons/highlighter.svg +16 -0
  325. package/resources/icons/info.svg +17 -0
  326. package/resources/icons/italic.svg +17 -0
  327. package/resources/icons/layout-dashboard.svg +18 -0
  328. package/resources/icons/link.svg +16 -0
  329. package/resources/icons/list-ordered.svg +20 -0
  330. package/resources/icons/list.svg +20 -0
  331. package/resources/icons/loader-2.svg +15 -0
  332. package/resources/icons/minus.svg +15 -0
  333. package/resources/icons/more-horizontal.svg +17 -0
  334. package/resources/icons/panel-left.svg +16 -0
  335. package/resources/icons/pencil-line.svg +17 -0
  336. package/resources/icons/pencil.svg +16 -0
  337. package/resources/icons/plus.svg +16 -0
  338. package/resources/icons/quote.svg +16 -0
  339. package/resources/icons/rows-3.svg +17 -0
  340. package/resources/icons/search.svg +16 -0
  341. package/resources/icons/send.svg +16 -0
  342. package/resources/icons/settings.svg +16 -0
  343. package/resources/icons/smile.svg +18 -0
  344. package/resources/icons/strikethrough.svg +17 -0
  345. package/resources/icons/table.svg +18 -0
  346. package/resources/icons/trash-2.svg +19 -0
  347. package/resources/icons/underline.svg +16 -0
  348. package/resources/icons/x.svg +16 -0
  349. package/dist/core/props.d.ts +0 -14
  350. package/dist/core/props.js +0 -30
  351. package/dist/core/props.js.map +0 -1
  352. package/dist/form/components/fields/submit-button.d.ts +0 -10
  353. package/dist/form/components/fields/submit-button.js +0 -14
  354. package/dist/form/components/fields/submit-button.js.map +0 -1
  355. package/dist/generated/types.d.ts +0 -17
  356. package/dist/icons/default-icons.d.ts +0 -3
  357. package/dist/icons/default-icons.js +0 -44
  358. package/dist/icons/default-icons.js.map +0 -1
  359. package/dist/icons/dynamic-lucide-renderer.d.ts +0 -2
  360. package/dist/icons/dynamic-lucide-renderer.js +0 -18
  361. package/dist/icons/dynamic-lucide-renderer.js.map +0 -1
  362. package/dist/menu/index.d.ts +0 -1
  363. package/dist/menu/index.js +0 -2
  364. package/dist/menu/use-menu.d.ts +0 -2
  365. package/dist/menu/use-menu.js +0 -9
  366. package/dist/menu/use-menu.js.map +0 -1
  367. /package/dist/{generated/types.js → table/column-registry.js} +0 -0
@@ -1,21 +1,2 @@
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
- }
1
+ import { RendererComponent } from '../../core/types';
21
2
  export declare const FormComponent: RendererComponent<"form">;
@@ -1,33 +1,25 @@
1
1
  import { withRefHeader } from "../../core/component-ref.js";
2
- import { getBooleanProp, getOptionalNumberProp, getStringProp } from "../../core/props.js";
3
2
  import { LATTICE_EVENT } from "../../events/event-names.js";
4
3
  import { FormProvider } from "./context.js";
5
- import { FormSubmitButton } from "./base/submit-button.js";
4
+ import { walkFields } from "./field-props.js";
6
5
  import { ResolvedNodesProvider } from "./resolved-nodes.js";
7
6
  import { FormValuesProvider } from "./values.js";
8
7
  import { useFormResolver } from "./use-form-resolver.js";
8
+ import { FormSubmitButton } from "./base/submit-button.js";
9
9
  import { useEffect, useMemo } from "react";
10
10
  import { Form } from "@inertiajs/react";
11
11
  import { jsx, jsxs } from "react/jsx-runtime";
12
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
- }
13
+ function collectFields(nodes) {
14
+ const collected = {
15
+ labels: {},
16
+ values: {}
17
+ };
18
+ walkFields(nodes, (props) => {
19
+ if (!props.name) return;
20
+ if (props.label) collected.labels[props.name] = props.label;
21
+ if (props.value !== void 0) collected.values[props.name] = props.value;
22
+ });
31
23
  return collected;
32
24
  }
33
25
  function FormResetListener({ componentId, reset }) {
@@ -41,36 +33,40 @@ function FormResetListener({ componentId, reset }) {
41
33
  }, [componentId, reset]);
42
34
  return null;
43
35
  }
44
- function FormBody({ action, children, componentRef, nodes, shouldRenderSubmitButton, submitLabel }) {
36
+ function FormBody({ action, children, componentRef, nodes, shouldRenderSubmitButton, submitLabel, summaryLabel }) {
45
37
  return /* @__PURE__ */ jsx(ResolvedNodesProvider, {
46
38
  nodes: useFormResolver(action, componentRef, nodes),
47
39
  children: /* @__PURE__ */ jsxs("div", {
48
40
  className: "flex flex-col gap-6",
49
41
  children: [children, shouldRenderSubmitButton && /* @__PURE__ */ jsx("div", {
50
42
  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 })
43
+ children: /* @__PURE__ */ jsx(FormSubmitButton, {
44
+ label: submitLabel,
45
+ summaryLabel
46
+ })
52
47
  })]
53
48
  })
54
49
  });
55
50
  }
56
51
  var FormComponent = ({ children, node }) => {
57
- const props = node.props ?? {};
52
+ const props = node.props;
58
53
  const action = props.action ?? "#";
59
54
  const errorBag = props.errorBag;
60
- const componentRef = getStringProp(props, "ref");
55
+ const componentRef = props.ref ?? "";
61
56
  const method = props.method ?? "post";
62
- const precognitive = getBooleanProp(props, "precognitive");
57
+ const precognitive = props.precognitive ?? false;
63
58
  const resetOnError = props.resetOnError ?? false;
64
59
  const resetOnSuccess = props.resetOnSuccess ?? [];
65
- const state = getFormState(node.props);
66
- const { labels: fieldLabels, values: fieldValues } = useMemo(() => collectFields(node.children), [node.children]);
60
+ const state = props.state;
61
+ const { labels: fieldLabels, values: fieldValues } = useMemo(() => collectFields(node.schema), [node.schema]);
67
62
  const initialValues = {
68
63
  ...fieldValues,
69
64
  ...state
70
65
  };
71
- const shouldRenderSubmitButton = getBooleanProp(props, "submitButton", true);
66
+ const shouldRenderSubmitButton = props.submitButton ?? true;
72
67
  const submitLabel = props.submitLabel ?? "Submit";
73
- const validationTimeout = getOptionalNumberProp(props, "validationTimeout");
68
+ const summaryLabel = props.validationSummaryLabel;
69
+ const validationTimeout = props.validationTimeout ?? void 0;
74
70
  return /* @__PURE__ */ jsx(Form, {
75
71
  action,
76
72
  "data-lattice-component": node.id,
@@ -81,20 +77,16 @@ var FormComponent = ({ children, node }) => {
81
77
  validationTimeout: precognitive ? validationTimeout : void 0,
82
78
  headers: withRefHeader(componentRef),
83
79
  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, {
80
+ children: ({ clearErrors, errors, processing, reset, validate }) => /* @__PURE__ */ jsxs(FormProvider, {
85
81
  value: {
86
82
  action,
87
83
  clearErrors: (field) => clearErrors(field),
88
84
  componentRef,
89
85
  errors,
90
86
  fieldLabels,
91
- invalid: (field) => invalid(field),
92
87
  precognitive,
93
88
  processing,
94
- touch: (field) => touch(field),
95
- validate: (field) => validate(field),
96
- validating,
97
- valid: (field) => valid(field)
89
+ validate: (field) => validate(field)
98
90
  },
99
91
  children: [
100
92
  /* @__PURE__ */ jsx(FormResetListener, {
@@ -110,9 +102,10 @@ var FormComponent = ({ children, node }) => {
110
102
  children: /* @__PURE__ */ jsx(FormBody, {
111
103
  action,
112
104
  componentRef,
113
- nodes: node.children,
105
+ nodes: node.schema,
114
106
  shouldRenderSubmitButton,
115
107
  submitLabel,
108
+ summaryLabel,
116
109
  children
117
110
  })
118
111
  })
@@ -1 +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"}
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 { LATTICE_EVENT } from \"@lattice/lattice/events/event-names\";\nimport type { Node, RendererComponent } from \"@lattice/lattice/core/types\";\nimport { useEffect, useMemo } from \"react\";\nimport { FormSubmitButton } from \"./base/submit-button\";\nimport { FormProvider } from \"./context\";\nimport { walkFields } from \"./field-props\";\nimport { ResolvedNodesProvider } from \"./resolved-nodes\";\nimport { useFormResolver } from \"./use-form-resolver\";\nimport { FormValuesProvider } from \"./values\";\n\ntype CollectedFields = {\n labels: Record<string, string>;\n values: Record<string, unknown>;\n};\n\nfunction collectFields(nodes: Node[] | undefined): CollectedFields {\n const collected: CollectedFields = { labels: {}, values: {} };\n\n walkFields(nodes, (props) => {\n if (!props.name) {\n return;\n }\n if (props.label) {\n collected.labels[props.name] = props.label;\n }\n if (props.value !== undefined) {\n collected.values[props.name] = props.value;\n }\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 | null }>).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 summaryLabel,\n}: {\n action: string;\n children: React.ReactNode;\n componentRef: string;\n nodes: Node[] | undefined;\n shouldRenderSubmitButton: boolean;\n submitLabel: string;\n summaryLabel: 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} summaryLabel={summaryLabel} />\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 = props.ref ?? \"\";\n const method = props.method ?? \"post\";\n const precognitive = props.precognitive ?? false;\n const resetOnError = props.resetOnError ?? false;\n const resetOnSuccess = props.resetOnSuccess ?? [];\n const state = props.state;\n const { labels: fieldLabels, values: fieldValues } = useMemo(\n () => collectFields(node.schema),\n [node.schema],\n );\n const initialValues = { ...fieldValues, ...state };\n const shouldRenderSubmitButton = props.submitButton ?? true;\n const submitLabel = props.submitLabel ?? \"Submit\";\n const summaryLabel = props.validationSummaryLabel;\n const validationTimeout = props.validationTimeout ?? undefined;\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 {({ clearErrors, errors, processing, reset, validate }) => (\n <FormProvider\n value={{\n action,\n clearErrors: (field) => clearErrors(field),\n componentRef,\n errors: errors as Record<string, string | undefined>,\n fieldLabels,\n precognitive,\n processing,\n validate: (field) => validate(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.schema}\n shouldRenderSubmitButton={shouldRenderSubmitButton}\n submitLabel={submitLabel}\n summaryLabel={summaryLabel}\n >\n {children}\n </FormBody>\n </FormValuesProvider>\n </FormProvider>\n )}\n </InertiaForm>\n );\n};\n"],"mappings":";;;;;;;;;;;;AAiBA,SAAS,cAAc,OAA4C;CACjE,MAAM,YAA6B;EAAE,QAAQ,CAAC;EAAG,QAAQ,CAAC;CAAE;CAE5D,WAAW,QAAQ,UAAU;EAC3B,IAAI,CAAC,MAAM,MACT;EAEF,IAAI,MAAM,OACR,UAAU,OAAO,MAAM,QAAQ,MAAM;EAEvC,IAAI,MAAM,UAAU,KAAA,GAClB,UAAU,OAAO,MAAM,QAAQ,MAAM;CAEzC,CAAC;CAED,OAAO;AACT;AAEA,SAAS,kBAAkB,EACzB,aACA,SAIC;CACD,gBAAgB;EACd,MAAM,WAAW,UAAiB;GAChC,MAAM,SAAU,MAA+C;GAE/D,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,aACA,gBASC;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;KAAkB,OAAO;KAA2B;IAAe,CAAA;GAChE,CAAA,CAEJ;;CACgB,CAAA;AAE3B;AAEA,IAAa,iBAA4C,EAAE,UAAU,WAAW;CAC9E,MAAM,QAAQ,KAAK;CACnB,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,WAAW,MAAM;CACvB,MAAM,eAAe,MAAM,OAAO;CAClC,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,eAAe,MAAM,gBAAgB;CAC3C,MAAM,eAAe,MAAM,gBAAgB;CAC3C,MAAM,iBAAiB,MAAM,kBAAkB,CAAC;CAChD,MAAM,QAAQ,MAAM;CACpB,MAAM,EAAE,QAAQ,aAAa,QAAQ,gBAAgB,cAC7C,cAAc,KAAK,MAAM,GAC/B,CAAC,KAAK,MAAM,CACd;CACA,MAAM,gBAAgB;EAAE,GAAG;EAAa,GAAG;CAAM;CACjD,MAAM,2BAA2B,MAAM,gBAAgB;CACvD,MAAM,cAAc,MAAM,eAAe;CACzC,MAAM,eAAe,MAAM;CAC3B,MAAM,oBAAoB,MAAM,qBAAqB,KAAA;CAErD,OACE,oBAAC,MAAD;EACU;EACR,0BAAwB,KAAK;EACnB;EACF;EACM;EACE;EAChB,mBAAmB,eAAe,oBAAoB,KAAA;EACtD,SAAS,cAAc,YAAY;EACnC,WAAU;aAER,EAAE,aAAa,QAAQ,YAAY,OAAO,eAC1C,qBAAC,cAAD;GACE,OAAO;IACL;IACA,cAAc,UAAU,YAAY,KAAK;IACzC;IACQ;IACR;IACA;IACA;IACA,WAAW,UAAU,SAAS,KAAK;GACrC;aAVF;IAYE,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;MACC;MAEb;KACO,CAAA;IACQ,CAAA;GACR;;CAEL,CAAA;AAEjB"}
@@ -6,6 +6,5 @@ export { HiddenInputComponent } from './fields/hidden-input';
6
6
  export { NumberInputComponent } from './fields/number-input';
7
7
  export { PasswordInputComponent } from './fields/password-input';
8
8
  export { SelectComponent } from './fields/select';
9
- export { SubmitButtonComponent } from './fields/submit-button';
10
9
  export { TextareaComponent } from './fields/textarea';
11
10
  export { TextInputComponent } from './fields/text-input';
@@ -6,7 +6,6 @@ import { HiddenInputComponent } from "./fields/hidden-input.js";
6
6
  import { NumberInputComponent } from "./fields/number-input.js";
7
7
  import { PasswordInputComponent } from "./fields/password-input.js";
8
8
  import { SelectComponent } from "./fields/select.js";
9
- import { SubmitButtonComponent } from "./fields/submit-button.js";
10
9
  import { TextareaComponent } from "./fields/textarea.js";
11
10
  import { TextInputComponent } from "./fields/text-input.js";
12
- export { CheckboxComponent, ChoiceComponent, DateInputComponent, FormComponent, HiddenInputComponent, NumberInputComponent, PasswordInputComponent, SelectComponent, SubmitButtonComponent, TextInputComponent, TextareaComponent };
11
+ export { CheckboxComponent, ChoiceComponent, DateInputComponent, FormComponent, HiddenInputComponent, NumberInputComponent, PasswordInputComponent, SelectComponent, TextInputComponent, TextareaComponent };
@@ -1,4 +1,4 @@
1
- import { Node } from '../../../../core/types';
1
+ import { Node } from '../../core/types';
2
2
  export declare function ResolvedNodesProvider({ nodes, children, }: {
3
3
  nodes: Record<string, Node>;
4
4
  children: React.ReactNode;
@@ -1,4 +1,4 @@
1
- import { getStringProp } from "../../core/props.js";
1
+ import { fieldProps } from "./field-props.js";
2
2
  import { createContext, useContext } from "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region resources/js/form/components/resolved-nodes.tsx
@@ -11,7 +11,7 @@ function ResolvedNodesProvider({ nodes, children }) {
11
11
  }
12
12
  function useResolvedNode(node) {
13
13
  const nodes = useContext(ResolvedNodesContext);
14
- const name = getStringProp(node.props, "name");
14
+ const name = fieldProps(node).name ?? "";
15
15
  return name && nodes[name] ? nodes[name] : node;
16
16
  }
17
17
  //#endregion
@@ -1 +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"}
1
+ {"version":3,"file":"resolved-nodes.js","names":[],"sources":["../../../resources/js/form/components/resolved-nodes.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { Node } from \"@lattice/lattice/core/types\";\nimport { fieldProps } from \"./field-props\";\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 = fieldProps(node).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,WAAW,IAAI,EAAE,QAAQ;CAEtC,OAAO,QAAQ,MAAM,QAAQ,MAAM,QAAQ;AAC7C"}
@@ -1,4 +1,5 @@
1
1
  import { Method } from '@inertiajs/core';
2
+ export type { Checkbox, Choice, DateInput, Form, FormFieldNode, FormNode, FormNodeType, HiddenInput, NumberInput, PasswordInput, RichEditor, Select, Textarea, TextInput, } from '../../types/generated';
2
3
  export type FormMethod = Method;
3
4
  export type FormLabelAction = {
4
5
  href: string;
@@ -1,16 +1,10 @@
1
- import { Node } from '../../../../core/types';
1
+ import { Node } from '../../core/types';
2
2
  import { FieldState } from './conditions';
3
- type ControlledField = FieldState & {
3
+ export type ControlledField = FieldState & {
4
4
  name: string;
5
5
  value: string;
6
6
  error?: string;
7
7
  commit: (value: unknown) => void;
8
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
- */
9
+ /** Shared wiring read by every store-controlled, condition-aware field. */
15
10
  export declare function useControlledField(node: Node): ControlledField;
16
- export {};
@@ -1,21 +1,17 @@
1
- import { getStringProp } from "../../core/props.js";
2
1
  import { useFormContext } from "./context.js";
2
+ import { fieldProps } from "./field-props.js";
3
3
  import { useFormValue } from "./values.js";
4
4
  import { useDependentField } from "./use-dependent-field.js";
5
5
  import { useFieldCommit } from "./use-field-commit.js";
6
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
- */
7
+ /** Shared wiring read by every store-controlled, condition-aware field. */
13
8
  function useControlledField(node) {
14
9
  const { errors } = useFormContext();
15
10
  const state = useDependentField(node);
16
- const name = getStringProp(node.props, "name");
11
+ const props = fieldProps(node);
12
+ const name = props.name ?? "";
17
13
  const storedValue = useFormValue(name);
18
- const currentValue = storedValue !== void 0 ? storedValue : node.props?.value;
14
+ const currentValue = storedValue !== void 0 ? storedValue : props.value;
19
15
  const value = typeof currentValue === "string" || typeof currentValue === "number" ? String(currentValue) : "";
20
16
  const { commit: commitField } = useFieldCommit();
21
17
  const commit = (next) => commitField(name, next);
@@ -1 +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"}
1
+ {"version":3,"file":"use-controlled-field.js","names":[],"sources":["../../../resources/js/form/components/use-controlled-field.ts"],"sourcesContent":["import type { Node } from \"@lattice/lattice/core/types\";\nimport type { FieldState } from \"./conditions\";\nimport { fieldProps } from \"./field-props\";\nimport { useFormContext } from \"./context\";\nimport { useDependentField } from \"./use-dependent-field\";\nimport { useFieldCommit } from \"./use-field-commit\";\nimport { useFormValue } from \"./values\";\n\nexport type ControlledField = FieldState & {\n name: string;\n value: string;\n error?: string;\n commit: (value: unknown) => void;\n};\n\n/** Shared wiring read by every store-controlled, condition-aware field. */\nexport function useControlledField(node: Node): ControlledField {\n const { errors } = useFormContext();\n const state = useDependentField(node);\n const props = fieldProps(node);\n const name = props.name ?? \"\";\n const storedValue = useFormValue(name);\n const currentValue = storedValue !== undefined ? storedValue : 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":";;;;;;;AAgBA,SAAgB,mBAAmB,MAA6B;CAC9D,MAAM,EAAE,WAAW,eAAe;CAClC,MAAM,QAAQ,kBAAkB,IAAI;CACpC,MAAM,QAAQ,WAAW,IAAI;CAC7B,MAAM,OAAO,MAAM,QAAQ;CAC3B,MAAM,cAAc,aAAa,IAAI;CACrC,MAAM,eAAe,gBAAgB,KAAA,IAAY,cAAc,MAAM;CACrE,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"}
@@ -1,3 +1,3 @@
1
- import { Node } from '../../../../core/types';
1
+ import { Node } from '../../core/types';
2
2
  import { FieldState } from './conditions';
3
3
  export declare function useDependentField(node: Node): FieldState;
@@ -1,15 +1,15 @@
1
- import { getBooleanProp } from "../../core/props.js";
2
- import { evaluateConditions } from "./conditions.js";
1
+ import { fieldProps } from "./field-props.js";
3
2
  import { useFormValues } from "./values.js";
3
+ import { evaluateConditions } from "./conditions.js";
4
4
  //#region resources/js/form/components/use-dependent-field.ts
5
5
  function useDependentField(node) {
6
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")
7
+ const props = fieldProps(node);
8
+ return evaluateConditions(props.conditions ?? void 0, values, {
9
+ hidden: props.hidden ?? false,
10
+ required: props.required ?? false,
11
+ readOnly: props.readOnly ?? false,
12
+ disabled: props.disabled ?? false
13
13
  });
14
14
  }
15
15
  //#endregion
@@ -1 +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"}
1
+ {"version":3,"file":"use-dependent-field.js","names":[],"sources":["../../../resources/js/form/components/use-dependent-field.ts"],"sourcesContent":["import type { Node } from \"@lattice/lattice/core/types\";\nimport { type FieldState, evaluateConditions } from \"./conditions\";\nimport { fieldProps } from \"./field-props\";\nimport { useFormValues } from \"./values\";\n\nexport function useDependentField(node: Node): FieldState {\n const values = useFormValues();\n const props = fieldProps(node);\n\n return evaluateConditions(props.conditions ?? undefined, values, {\n hidden: props.hidden ?? false,\n required: props.required ?? false,\n readOnly: props.readOnly ?? false,\n disabled: props.disabled ?? false,\n });\n}\n"],"mappings":";;;;AAKA,SAAgB,kBAAkB,MAAwB;CACxD,MAAM,SAAS,cAAc;CAC7B,MAAM,QAAQ,WAAW,IAAI;CAE7B,OAAO,mBAAmB,MAAM,cAAc,KAAA,GAAW,QAAQ;EAC/D,QAAQ,MAAM,UAAU;EACxB,UAAU,MAAM,YAAY;EAC5B,UAAU,MAAM,YAAY;EAC5B,UAAU,MAAM,YAAY;CAC9B,CAAC;AACH"}
@@ -1,2 +1,2 @@
1
- import { Node } from '../../../../core/types';
1
+ import { Node } from '../../core/types';
2
2
  export declare function useFormResolver(action: string, componentRef: string, nodes: Node[] | undefined): Record<string, Node>;
@@ -1,27 +1,22 @@
1
- import { getBooleanProp } from "../../core/props.js";
1
+ import { walkFields } from "./field-props.js";
2
2
  import { postFormAction } from "./form-transport.js";
3
3
  import { useFormValues, useSetFormValue } from "./values.js";
4
4
  import { useEffect, useMemo, useState } from "react";
5
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
6
  function useFormResolver(action, componentRef, nodes) {
15
7
  const values = useFormValues();
16
8
  const setValue = useSetFormValue();
17
9
  const [resolved, setResolved] = useState({});
18
10
  const watch = useMemo(() => {
19
11
  const keys = /* @__PURE__ */ new Set();
20
- const state = { any: false };
21
- collectWatch(nodes, keys, state);
12
+ let any = false;
13
+ walkFields(nodes, (props) => {
14
+ if (Array.isArray(props.dependsOnKeys)) for (const key of props.dependsOnKeys) keys.add(String(key));
15
+ if (props.dependsOnAny) any = true;
16
+ });
22
17
  return {
23
18
  keys: [...keys],
24
- any: state.any
19
+ any
25
20
  };
26
21
  }, [nodes]);
27
22
  useEffect(() => {
@@ -42,7 +37,7 @@ function useFormResolver(action, componentRef, nodes) {
42
37
  controller.abort();
43
38
  };
44
39
  }, [
45
- watch.any ? JSON.stringify(values) : JSON.stringify(watch.keys.map((key) => values[key])),
40
+ watch.any ? values : JSON.stringify(watch.keys.map((key) => values[key])),
46
41
  action,
47
42
  componentRef,
48
43
  watch.keys.length,
@@ -1 +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"}
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 type { Node } from \"@lattice/lattice/core/types\";\nimport { walkFields } from \"./field-props\";\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\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 let any = false;\n walkFields(nodes, (props) => {\n if (Array.isArray(props.dependsOnKeys)) {\n for (const key of props.dependsOnKeys) {\n keys.add(String(key));\n }\n }\n if (props.dependsOnAny) {\n any = true;\n }\n });\n return { keys: [...keys], any };\n }, [nodes]);\n\n // In \"any\" mode the values store keeps a stable reference until something\n // actually changes (Object.is in setValue), so its identity is the change\n // signal — no need to serialize every value. Otherwise hash the watched keys.\n const watchSignature = watch.any ? values : 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 }, [watchSignature, action, componentRef, watch.keys.length, watch.any, setValue]);\n\n return resolved;\n}\n"],"mappings":";;;;;AAWA,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,IAAI,MAAM;EACV,WAAW,QAAQ,UAAU;GAC3B,IAAI,MAAM,QAAQ,MAAM,aAAa,GACnC,KAAK,MAAM,OAAO,MAAM,eACtB,KAAK,IAAI,OAAO,GAAG,CAAC;GAGxB,IAAI,MAAM,cACR,MAAM;EAEV,CAAC;EACD,OAAO;GAAE,MAAM,CAAC,GAAG,IAAI;GAAG;EAAI;CAChC,GAAG,CAAC,KAAK,CAAC;CAOV,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;EAnCoB,MAAM,MAAM,SAAS,KAAK,UAAU,MAAM,KAAK,KAAK,QAAQ,OAAO,IAAI,CAAC;EAmC3E;EAAQ;EAAc,MAAM,KAAK;EAAQ,MAAM;EAAK;CAAQ,CAAC;CAEjF,OAAO;AACT"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Seed a field's default into the store so dependent fields and the submitted
3
+ * payload reflect it before the user interacts. Pass undefined to skip.
4
+ */
5
+ export declare function useSeedDefault(name: string, value: unknown): void;
@@ -0,0 +1,23 @@
1
+ import { useFormValue, useSetFormValue } from "./values.js";
2
+ import { useEffect } from "react";
3
+ //#region resources/js/form/components/use-seed-default.ts
4
+ /**
5
+ * Seed a field's default into the store so dependent fields and the submitted
6
+ * payload reflect it before the user interacts. Pass undefined to skip.
7
+ */
8
+ function useSeedDefault(name, value) {
9
+ const stored = useFormValue(name);
10
+ const setValue = useSetFormValue();
11
+ useEffect(() => {
12
+ if (stored === void 0 && value !== void 0) setValue(name, value);
13
+ }, [
14
+ name,
15
+ value,
16
+ stored,
17
+ setValue
18
+ ]);
19
+ }
20
+ //#endregion
21
+ export { useSeedDefault };
22
+
23
+ //# sourceMappingURL=use-seed-default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-seed-default.js","names":[],"sources":["../../../resources/js/form/components/use-seed-default.ts"],"sourcesContent":["import { useEffect } from \"react\";\nimport { useFormValue, useSetFormValue } from \"./values\";\n\n/**\n * Seed a field's default into the store so dependent fields and the submitted\n * payload reflect it before the user interacts. Pass undefined to skip.\n */\nexport function useSeedDefault(name: string, value: unknown): void {\n const stored = useFormValue(name);\n const setValue = useSetFormValue();\n\n useEffect(() => {\n if (stored === undefined && value !== undefined) {\n setValue(name, value);\n }\n }, [name, value, stored, setValue]);\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,eAAe,MAAc,OAAsB;CACjE,MAAM,SAAS,aAAa,IAAI;CAChC,MAAM,WAAW,gBAAgB;CAEjC,gBAAgB;EACd,IAAI,WAAW,KAAA,KAAa,UAAU,KAAA,GACpC,SAAS,MAAM,KAAK;CAExB,GAAG;EAAC;EAAM;EAAO;EAAQ;CAAQ,CAAC;AACpC"}
@@ -1 +1 @@
1
- export declare const formComponents: import('../../../core/registry').Plugin;
1
+ export declare const formComponents: import('../core/registry').Plugin;
@@ -21,7 +21,6 @@ var formComponents = createPlugin({
21
21
  return { default: RichEditorComponent };
22
22
  }),
23
23
  "form.select": lazyComponent(loadFormComponent("SelectComponent")),
24
- "form.submit-button": lazyComponent(loadFormComponent("SubmitButtonComponent")),
25
24
  "form.textarea": lazyComponent(loadFormComponent("TextareaComponent")),
26
25
  "form.text-input": lazyComponent(loadFormComponent("TextInputComponent"))
27
26
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../resources/js/form/index.ts"],"sourcesContent":["import { createPlugin, lazyComponent } from \"@lattice/lattice/core/registry\";\nimport type { RendererComponent, RendererComponentModule } from \"@lattice/lattice/core/types\";\nimport { FormSkeletonComponent } from \"./skeleton\";\n\ntype FormComponentName =\n | \"CheckboxComponent\"\n | \"ChoiceComponent\"\n | \"DateInputComponent\"\n | \"FormComponent\"\n | \"HiddenInputComponent\"\n | \"NumberInputComponent\"\n | \"PasswordInputComponent\"\n | \"SelectComponent\"\n | \"SubmitButtonComponent\"\n | \"TextareaComponent\"\n | \"TextInputComponent\";\n\nconst loadFormComponents = () => import(\"./components\");\n\nfunction loadFormComponent<TType extends string>(\n name: FormComponentName,\n): () => Promise<RendererComponentModule<TType>> {\n return async () => {\n const components = await loadFormComponents();\n\n return {\n default: components[name] as RendererComponent<TType>,\n };\n };\n}\n\nexport const formComponents = createPlugin({\n components: {\n form: lazyComponent(loadFormComponent(\"FormComponent\"), {\n fallback: FormSkeletonComponent,\n }),\n \"form.checkbox\": lazyComponent(loadFormComponent(\"CheckboxComponent\")),\n \"form.choice\": lazyComponent(loadFormComponent(\"ChoiceComponent\")),\n \"form.date-input\": lazyComponent(loadFormComponent(\"DateInputComponent\")),\n \"form.hidden-input\": lazyComponent(loadFormComponent(\"HiddenInputComponent\")),\n \"form.number-input\": lazyComponent(loadFormComponent(\"NumberInputComponent\")),\n \"form.password-input\": lazyComponent(loadFormComponent(\"PasswordInputComponent\")),\n // Loaded from its own module so TipTap is split into a separate chunk,\n // only fetched on pages that actually render a rich editor.\n \"form.rich-editor\": lazyComponent<\"form.rich-editor\">(async () => {\n const { RichEditorComponent } = await import(\"./components/fields/rich-editor\");\n\n return { default: RichEditorComponent };\n }),\n \"form.select\": lazyComponent(loadFormComponent(\"SelectComponent\")),\n \"form.submit-button\": lazyComponent(loadFormComponent(\"SubmitButtonComponent\")),\n \"form.textarea\": lazyComponent(loadFormComponent(\"TextareaComponent\")),\n \"form.text-input\": lazyComponent(loadFormComponent(\"TextInputComponent\")),\n },\n name: \"lattice/form\",\n});\n"],"mappings":";;;AAiBA,IAAM,2BAA2B,OAAO;AAExC,SAAS,kBACP,MAC+C;CAC/C,OAAO,YAAY;EAGjB,OAAO,EACL,UAAS,MAHc,mBAAmB,GAGtB,MACtB;CACF;AACF;AAEA,IAAa,iBAAiB,aAAa;CACzC,YAAY;EACV,MAAM,cAAc,kBAAkB,eAAe,GAAG,EACtD,UAAU,sBACZ,CAAC;EACD,iBAAiB,cAAc,kBAAkB,mBAAmB,CAAC;EACrE,eAAe,cAAc,kBAAkB,iBAAiB,CAAC;EACjE,mBAAmB,cAAc,kBAAkB,oBAAoB,CAAC;EACxE,qBAAqB,cAAc,kBAAkB,sBAAsB,CAAC;EAC5E,qBAAqB,cAAc,kBAAkB,sBAAsB,CAAC;EAC5E,uBAAuB,cAAc,kBAAkB,wBAAwB,CAAC;EAGhF,oBAAoB,cAAkC,YAAY;GAChE,MAAM,EAAE,wBAAwB,MAAM,OAAO;GAE7C,OAAO,EAAE,SAAS,oBAAoB;EACxC,CAAC;EACD,eAAe,cAAc,kBAAkB,iBAAiB,CAAC;EACjE,sBAAsB,cAAc,kBAAkB,uBAAuB,CAAC;EAC9E,iBAAiB,cAAc,kBAAkB,mBAAmB,CAAC;EACrE,mBAAmB,cAAc,kBAAkB,oBAAoB,CAAC;CAC1E;CACA,MAAM;AACR,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../resources/js/form/index.ts"],"sourcesContent":["import { createPlugin, lazyComponent } from \"@lattice/lattice/core/registry\";\nimport type { RendererComponent, RendererComponentModule } from \"@lattice/lattice/core/types\";\nimport { FormSkeletonComponent } from \"./skeleton\";\n\ntype FormComponentName =\n | \"CheckboxComponent\"\n | \"ChoiceComponent\"\n | \"DateInputComponent\"\n | \"FormComponent\"\n | \"HiddenInputComponent\"\n | \"NumberInputComponent\"\n | \"PasswordInputComponent\"\n | \"SelectComponent\"\n | \"TextareaComponent\"\n | \"TextInputComponent\";\n\nconst loadFormComponents = () => import(\"./components\");\n\nfunction loadFormComponent<TType extends string>(\n name: FormComponentName,\n): () => Promise<RendererComponentModule<TType>> {\n return async () => {\n const components = await loadFormComponents();\n\n return {\n default: components[name] as unknown as RendererComponent<TType>,\n };\n };\n}\n\nexport const formComponents = createPlugin({\n components: {\n form: lazyComponent(loadFormComponent(\"FormComponent\"), {\n fallback: FormSkeletonComponent,\n }),\n \"form.checkbox\": lazyComponent(loadFormComponent(\"CheckboxComponent\")),\n \"form.choice\": lazyComponent(loadFormComponent(\"ChoiceComponent\")),\n \"form.date-input\": lazyComponent(loadFormComponent(\"DateInputComponent\")),\n \"form.hidden-input\": lazyComponent(loadFormComponent(\"HiddenInputComponent\")),\n \"form.number-input\": lazyComponent(loadFormComponent(\"NumberInputComponent\")),\n \"form.password-input\": lazyComponent(loadFormComponent(\"PasswordInputComponent\")),\n // Loaded from its own module so TipTap is split into a separate chunk,\n // only fetched on pages that actually render a rich editor.\n \"form.rich-editor\": lazyComponent<\"form.rich-editor\">(async () => {\n const { RichEditorComponent } = await import(\"./components/fields/rich-editor\");\n\n return { default: RichEditorComponent };\n }),\n \"form.select\": lazyComponent(loadFormComponent(\"SelectComponent\")),\n \"form.textarea\": lazyComponent(loadFormComponent(\"TextareaComponent\")),\n \"form.text-input\": lazyComponent(loadFormComponent(\"TextInputComponent\")),\n },\n name: \"lattice/form\",\n});\n"],"mappings":";;;AAgBA,IAAM,2BAA2B,OAAO;AAExC,SAAS,kBACP,MAC+C;CAC/C,OAAO,YAAY;EAGjB,OAAO,EACL,UAAS,MAHc,mBAAmB,GAGtB,MACtB;CACF;AACF;AAEA,IAAa,iBAAiB,aAAa;CACzC,YAAY;EACV,MAAM,cAAc,kBAAkB,eAAe,GAAG,EACtD,UAAU,sBACZ,CAAC;EACD,iBAAiB,cAAc,kBAAkB,mBAAmB,CAAC;EACrE,eAAe,cAAc,kBAAkB,iBAAiB,CAAC;EACjE,mBAAmB,cAAc,kBAAkB,oBAAoB,CAAC;EACxE,qBAAqB,cAAc,kBAAkB,sBAAsB,CAAC;EAC5E,qBAAqB,cAAc,kBAAkB,sBAAsB,CAAC;EAC5E,uBAAuB,cAAc,kBAAkB,wBAAwB,CAAC;EAGhF,oBAAoB,cAAkC,YAAY;GAChE,MAAM,EAAE,wBAAwB,MAAM,OAAO;GAE7C,OAAO,EAAE,SAAS,oBAAoB;EACxC,CAAC;EACD,eAAe,cAAc,kBAAkB,iBAAiB,CAAC;EACjE,iBAAiB,cAAc,kBAAkB,mBAAmB,CAAC;EACrE,mBAAmB,cAAc,kBAAkB,oBAAoB,CAAC;CAC1E;CACA,MAAM;AACR,CAAC"}
@@ -1,2 +1,2 @@
1
- import { RendererComponent } from '../../../core/types';
1
+ import { RendererComponent } from '../core/types';
2
2
  export declare const FormSkeletonComponent: RendererComponent<"form">;
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  //#region resources/js/form/skeleton.tsx
3
3
  var FormSkeletonComponent = ({ node }) => {
4
- const fieldCount = Math.max(1, Math.min(4, node.children?.find((child) => child.type === "grid")?.children?.filter((child) => child.type !== "form.hidden-input").length ?? 2));
4
+ const fieldCount = Math.max(1, Math.min(4, node.schema?.find((child) => child.type === "grid")?.schema?.filter((child) => child.type !== "form.hidden-input").length ?? 2));
5
5
  return /* @__PURE__ */ jsx("div", {
6
6
  "aria-hidden": "true",
7
7
  className: "mx-auto flex w-full max-w-md animate-pulse flex-col gap-6 rounded-lt border border-lt-border bg-lt-surface p-6 shadow-xs",
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton.js","names":[],"sources":["../../resources/js/form/skeleton.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice/lattice/core/types\";\n\nexport const FormSkeletonComponent: RendererComponent<\"form\"> = ({ node }) => {\n const fieldCount = Math.max(\n 1,\n Math.min(\n 4,\n node.children\n ?.find((child) => child.type === \"grid\")\n ?.children?.filter((child) => child.type !== \"form.hidden-input\").length ?? 2,\n ),\n );\n\n return (\n <div\n aria-hidden=\"true\"\n className=\"mx-auto flex w-full max-w-md animate-pulse flex-col gap-6 rounded-lt border border-lt-border bg-lt-surface p-6 shadow-xs\"\n data-lattice-skeleton={node.id ?? node.type}\n >\n <div className=\"grid gap-6\">\n {Array.from({ length: fieldCount }).map((_, index) => (\n <div className=\"grid gap-2\" key={index}>\n <div className=\"h-4 w-28 rounded bg-lt-muted\" />\n <div className=\"h-10 rounded-lt-sm bg-lt-muted\" />\n </div>\n ))}\n\n <div className=\"mt-4 h-10 rounded-lt-sm bg-lt-muted\" />\n </div>\n </div>\n );\n};\n"],"mappings":";;AAEA,IAAa,yBAAoD,EAAE,WAAW;CAC5E,MAAM,aAAa,KAAK,IACtB,GACA,KAAK,IACH,GACA,KAAK,UACD,MAAM,UAAU,MAAM,SAAS,MAAM,GACrC,UAAU,QAAQ,UAAU,MAAM,SAAS,mBAAmB,EAAE,UAAU,CAChF,CACF;CAEA,OACE,oBAAC,OAAD;EACE,eAAY;EACZ,WAAU;EACV,yBAAuB,KAAK,MAAM,KAAK;YAEvC,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,MAAM,KAAK,EAAE,QAAQ,WAAW,CAAC,EAAE,KAAK,GAAG,UAC1C,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,OAAD,EAAK,WAAU,+BAAgC,CAAA,GAC/C,oBAAC,OAAD,EAAK,WAAU,iCAAkC,CAAA,CAC9C;MAH4B,KAG5B,CACN,GAED,oBAAC,OAAD,EAAK,WAAU,sCAAuC,CAAA,CACnD;;CACF,CAAA;AAET"}
1
+ {"version":3,"file":"skeleton.js","names":[],"sources":["../../resources/js/form/skeleton.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice/lattice/core/types\";\n\nexport const FormSkeletonComponent: RendererComponent<\"form\"> = ({ node }) => {\n const fieldCount = Math.max(\n 1,\n Math.min(\n 4,\n node.schema\n ?.find((child) => child.type === \"grid\")\n ?.schema?.filter((child) => child.type !== \"form.hidden-input\").length ?? 2,\n ),\n );\n\n return (\n <div\n aria-hidden=\"true\"\n className=\"mx-auto flex w-full max-w-md animate-pulse flex-col gap-6 rounded-lt border border-lt-border bg-lt-surface p-6 shadow-xs\"\n data-lattice-skeleton={node.id ?? node.type}\n >\n <div className=\"grid gap-6\">\n {Array.from({ length: fieldCount }).map((_, index) => (\n <div className=\"grid gap-2\" key={index}>\n <div className=\"h-4 w-28 rounded bg-lt-muted\" />\n <div className=\"h-10 rounded-lt-sm bg-lt-muted\" />\n </div>\n ))}\n\n <div className=\"mt-4 h-10 rounded-lt-sm bg-lt-muted\" />\n </div>\n </div>\n );\n};\n"],"mappings":";;AAEA,IAAa,yBAAoD,EAAE,WAAW;CAC5E,MAAM,aAAa,KAAK,IACtB,GACA,KAAK,IACH,GACA,KAAK,QACD,MAAM,UAAU,MAAM,SAAS,MAAM,GACrC,QAAQ,QAAQ,UAAU,MAAM,SAAS,mBAAmB,EAAE,UAAU,CAC9E,CACF;CAEA,OACE,oBAAC,OAAD;EACE,eAAY;EACZ,WAAU;EACV,yBAAuB,KAAK,MAAM,KAAK;YAEvC,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,MAAM,KAAK,EAAE,QAAQ,WAAW,CAAC,EAAE,KAAK,GAAG,UAC1C,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,OAAD,EAAK,WAAU,+BAAgC,CAAA,GAC/C,oBAAC,OAAD,EAAK,WAAU,iCAAkC,CAAA,CAC9C;MAH4B,KAG5B,CACN,GAED,oBAAC,OAAD,EAAK,WAAU,sCAAuC,CAAA,CACnD;;CACF,CAAA;AAET"}
@@ -0,0 +1,24 @@
1
+ export type BackendOptions = {
2
+ /** i18next-http-backend load path. Defaults to laravel-i18next's namespaced route. */
3
+ loadPath?: string;
4
+ /** Path that receives keys reported by saveMissing. */
5
+ addPath?: string;
6
+ /** Report missing keys back to the backend (laravel-i18next persists them). */
7
+ saveMissing?: boolean;
8
+ /** Extra request headers, e.g. the CSRF token for the saveMissing POST. */
9
+ customHeaders?: () => Record<string, string>;
10
+ };
11
+ /** The i18n settings the backend shares to the frontend (Inertia `lattice.i18n`). */
12
+ export type I18nConfig = {
13
+ enabled: boolean;
14
+ saveMissing: boolean;
15
+ };
16
+ /** Apply the i18n config shared from the backend; wires the HTTP backend only when `enabled`. */
17
+ export declare function configureI18n(config: I18nConfig | undefined): Promise<void>;
18
+ /**
19
+ * Load translations from a backend such as bambamboole/laravel-i18next,
20
+ * overriding the renderer's inline English defaults. Call before the first
21
+ * render. Importing this module is the opt-in: apps that never call it don't
22
+ * bundle the HTTP backend.
23
+ */
24
+ export declare function enableBackend(options?: BackendOptions): Promise<void>;
@@ -0,0 +1,39 @@
1
+ import { ensureI18n, i18n } from "./instance.js";
2
+ import { Backend } from "../node_modules/i18next-http-backend/esm/index.js";
3
+ //#region resources/js/i18n/backend.ts
4
+ /** laravel-i18next's namespaced routes; an app behind a custom prefix overrides them via {@link BackendOptions}. */
5
+ var DEFAULT_LOAD_PATH = "/locales/{{lng}}/{{ns}}.json";
6
+ var DEFAULT_ADD_PATH = "/locales/add/{{lng}}/{{ns}}";
7
+ /** Apply the i18n config shared from the backend; wires the HTTP backend only when `enabled`. */
8
+ async function configureI18n(config) {
9
+ if (!config?.enabled) {
10
+ await ensureI18n();
11
+ return;
12
+ }
13
+ await enableBackend({ saveMissing: config.saveMissing });
14
+ }
15
+ /**
16
+ * Load translations from a backend such as bambamboole/laravel-i18next,
17
+ * overriding the renderer's inline English defaults. Call before the first
18
+ * render. Importing this module is the opt-in: apps that never call it don't
19
+ * bundle the HTTP backend.
20
+ */
21
+ async function enableBackend(options = {}) {
22
+ const { loadPath = DEFAULT_LOAD_PATH, addPath = DEFAULT_ADD_PATH, saveMissing = false, customHeaders } = options;
23
+ i18n.use(Backend);
24
+ await ensureI18n((base) => ({
25
+ ...base,
26
+ partialBundledLanguages: true,
27
+ saveMissing,
28
+ backend: {
29
+ loadPath,
30
+ addPath,
31
+ customHeaders,
32
+ withCredentials: true
33
+ }
34
+ }));
35
+ }
36
+ //#endregion
37
+ export { configureI18n, enableBackend };
38
+
39
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","names":[],"sources":["../../resources/js/i18n/backend.ts"],"sourcesContent":["import HttpBackend from \"i18next-http-backend\";\nimport { ensureI18n, i18n } from \"./instance\";\n\n/** laravel-i18next's namespaced routes; an app behind a custom prefix overrides them via {@link BackendOptions}. */\nconst DEFAULT_LOAD_PATH = \"/locales/{{lng}}/{{ns}}.json\";\nconst DEFAULT_ADD_PATH = \"/locales/add/{{lng}}/{{ns}}\";\n\nexport type BackendOptions = {\n /** i18next-http-backend load path. Defaults to laravel-i18next's namespaced route. */\n loadPath?: string;\n /** Path that receives keys reported by saveMissing. */\n addPath?: string;\n /** Report missing keys back to the backend (laravel-i18next persists them). */\n saveMissing?: boolean;\n /** Extra request headers, e.g. the CSRF token for the saveMissing POST. */\n customHeaders?: () => Record<string, string>;\n};\n\n/** The i18n settings the backend shares to the frontend (Inertia `lattice.i18n`). */\nexport type I18nConfig = {\n enabled: boolean;\n saveMissing: boolean;\n};\n\n/** Apply the i18n config shared from the backend; wires the HTTP backend only when `enabled`. */\nexport async function configureI18n(config: I18nConfig | undefined): Promise<void> {\n if (!config?.enabled) {\n await ensureI18n();\n\n return;\n }\n\n await enableBackend({ saveMissing: config.saveMissing });\n}\n\n/**\n * Load translations from a backend such as bambamboole/laravel-i18next,\n * overriding the renderer's inline English defaults. Call before the first\n * render. Importing this module is the opt-in: apps that never call it don't\n * bundle the HTTP backend.\n */\nexport async function enableBackend(options: BackendOptions = {}): Promise<void> {\n const {\n loadPath = DEFAULT_LOAD_PATH,\n addPath = DEFAULT_ADD_PATH,\n saveMissing = false,\n customHeaders,\n } = options;\n\n i18n.use(HttpBackend);\n\n await ensureI18n((base) => ({\n ...base,\n partialBundledLanguages: true,\n saveMissing,\n backend: { loadPath, addPath, customHeaders, withCredentials: true },\n }));\n}\n"],"mappings":";;;;AAIA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;;AAoBzB,eAAsB,cAAc,QAA+C;CACjF,IAAI,CAAC,QAAQ,SAAS;EACpB,MAAM,WAAW;EAEjB;CACF;CAEA,MAAM,cAAc,EAAE,aAAa,OAAO,YAAY,CAAC;AACzD;;;;;;;AAQA,eAAsB,cAAc,UAA0B,CAAC,GAAkB;CAC/E,MAAM,EACJ,WAAW,mBACX,UAAU,kBACV,cAAc,OACd,kBACE;CAEJ,KAAK,IAAI,OAAW;CAEpB,MAAM,YAAY,UAAU;EAC1B,GAAG;EACH,yBAAyB;EACzB;EACA,SAAS;GAAE;GAAU;GAAS;GAAe,iBAAiB;EAAK;CACrE,EAAE;AACJ"}
@@ -0,0 +1,3 @@
1
+ export { i18n, useT, translate } from './instance';
2
+ export { configureI18n, enableBackend } from './backend';
3
+ export type { BackendOptions, I18nConfig } from './backend';