@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
@@ -3,7 +3,7 @@ import { Spinner } from "../../../core/components/spinner.js";
3
3
  import { useFormContext } from "../context.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region resources/js/form/components/base/submit-button.tsx
6
- function FormSubmitButton({ label, variant = "default" }) {
6
+ function FormSubmitButton({ label, summaryLabel, variant = "default" }) {
7
7
  const { errors, fieldLabels, processing } = useFormContext();
8
8
  const invalidFields = Object.entries(errors).filter(([, message]) => Boolean(message)).map(([name, message]) => ({
9
9
  label: fieldLabels[name] ?? name,
@@ -22,7 +22,7 @@ function FormSubmitButton({ label, variant = "default" }) {
22
22
  role: "tooltip",
23
23
  children: [/* @__PURE__ */ jsx("p", {
24
24
  className: "mb-1 font-medium text-lt-fg",
25
- children: "Fix these fields to continue:"
25
+ children: summaryLabel
26
26
  }), /* @__PURE__ */ jsx("ul", {
27
27
  className: "space-y-1",
28
28
  children: invalidFields.map((field) => /* @__PURE__ */ jsxs("li", {
@@ -1 +1 @@
1
- {"version":3,"file":"submit-button.js","names":[],"sources":["../../../../resources/js/form/components/base/submit-button.tsx"],"sourcesContent":["import { Button } from \"@lattice/lattice/core/components/button\";\nimport { Spinner } from \"@lattice/lattice/core/components/spinner\";\nimport { useFormContext } from \"../context\";\n\ntype SubmitButtonVariant = \"default\" | \"destructive\" | \"ghost\" | \"link\" | \"outline\" | \"secondary\";\n\nexport function FormSubmitButton({\n label,\n variant = \"default\",\n}: {\n label: string;\n variant?: SubmitButtonVariant;\n}) {\n const { errors, fieldLabels, processing } = useFormContext();\n\n const invalidFields = Object.entries(errors)\n .filter(([, message]) => Boolean(message))\n .map(([name, message]) => ({ label: fieldLabels[name] ?? name, message: message as string }));\n const hasErrors = invalidFields.length > 0;\n\n return (\n <span className=\"group relative inline-flex flex-col\">\n <Button disabled={processing || hasErrors} type=\"submit\" variant={variant}>\n {processing && <Spinner />}\n {label}\n </Button>\n\n {hasErrors && (\n <div\n className=\"pointer-events-none absolute bottom-full left-1/2 z-10 mb-2 w-max max-w-xs -translate-x-1/2 rounded-lt border border-lt-border bg-lt-surface p-3 text-left text-sm opacity-0 shadow-md transition-opacity group-hover:opacity-100\"\n role=\"tooltip\"\n >\n <p className=\"mb-1 font-medium text-lt-fg\">Fix these fields to continue:</p>\n <ul className=\"space-y-1\">\n {invalidFields.map((field) => (\n <li className=\"text-lt-muted-fg\" key={field.label}>\n <span className=\"font-medium text-lt-fg\">{field.label}</span> — {field.message}\n </li>\n ))}\n </ul>\n </div>\n )}\n </span>\n );\n}\n"],"mappings":";;;;;AAMA,SAAgB,iBAAiB,EAC/B,OACA,UAAU,aAIT;CACD,MAAM,EAAE,QAAQ,aAAa,eAAe,eAAe;CAE3D,MAAM,gBAAgB,OAAO,QAAQ,MAAM,EACxC,QAAQ,GAAG,aAAa,QAAQ,OAAO,CAAC,EACxC,KAAK,CAAC,MAAM,cAAc;EAAE,OAAO,YAAY,SAAS;EAAe;CAAkB,EAAE;CAC9F,MAAM,YAAY,cAAc,SAAS;CAEzC,OACE,qBAAC,QAAD;EAAM,WAAU;YAAhB,CACE,qBAAC,QAAD;GAAQ,UAAU,cAAc;GAAW,MAAK;GAAkB;aAAlE,CACG,cAAc,oBAAC,SAAD,CAAU,CAAA,GACxB,KACK;MAEP,aACC,qBAAC,OAAD;GACE,WAAU;GACV,MAAK;aAFP,CAIE,oBAAC,KAAD;IAAG,WAAU;cAA8B;GAAgC,CAAA,GAC3E,oBAAC,MAAD;IAAI,WAAU;cACX,cAAc,KAAK,UAClB,qBAAC,MAAD;KAAI,WAAU;eAAd;MACE,oBAAC,QAAD;OAAM,WAAU;iBAA0B,MAAM;MAAY,CAAA;MAAC;MAAI,MAAM;KACrE;OAFkC,MAAM,KAExC,CACL;GACC,CAAA,CACD;IAEH;;AAEV"}
1
+ {"version":3,"file":"submit-button.js","names":[],"sources":["../../../../resources/js/form/components/base/submit-button.tsx"],"sourcesContent":["import { Button } from \"@lattice/lattice/core/components/button\";\nimport { Spinner } from \"@lattice/lattice/core/components/spinner\";\nimport type { ButtonVariant } from \"@lattice/lattice/types/generated\";\nimport { useFormContext } from \"../context\";\n\nexport function FormSubmitButton({\n label,\n summaryLabel,\n variant = \"default\",\n}: {\n label: string;\n summaryLabel: string;\n variant?: ButtonVariant;\n}) {\n const { errors, fieldLabels, processing } = useFormContext();\n\n const invalidFields = Object.entries(errors)\n .filter(([, message]) => Boolean(message))\n .map(([name, message]) => ({ label: fieldLabels[name] ?? name, message: message as string }));\n const hasErrors = invalidFields.length > 0;\n\n return (\n <span className=\"group relative inline-flex flex-col\">\n <Button disabled={processing || hasErrors} type=\"submit\" variant={variant}>\n {processing && <Spinner />}\n {label}\n </Button>\n\n {hasErrors && (\n <div\n className=\"pointer-events-none absolute bottom-full left-1/2 z-10 mb-2 w-max max-w-xs -translate-x-1/2 rounded-lt border border-lt-border bg-lt-surface p-3 text-left text-sm opacity-0 shadow-md transition-opacity group-hover:opacity-100\"\n role=\"tooltip\"\n >\n <p className=\"mb-1 font-medium text-lt-fg\">{summaryLabel}</p>\n <ul className=\"space-y-1\">\n {invalidFields.map((field) => (\n <li className=\"text-lt-muted-fg\" key={field.label}>\n <span className=\"font-medium text-lt-fg\">{field.label}</span> — {field.message}\n </li>\n ))}\n </ul>\n </div>\n )}\n </span>\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,iBAAiB,EAC/B,OACA,cACA,UAAU,aAKT;CACD,MAAM,EAAE,QAAQ,aAAa,eAAe,eAAe;CAE3D,MAAM,gBAAgB,OAAO,QAAQ,MAAM,EACxC,QAAQ,GAAG,aAAa,QAAQ,OAAO,CAAC,EACxC,KAAK,CAAC,MAAM,cAAc;EAAE,OAAO,YAAY,SAAS;EAAe;CAAkB,EAAE;CAC9F,MAAM,YAAY,cAAc,SAAS;CAEzC,OACE,qBAAC,QAAD;EAAM,WAAU;YAAhB,CACE,qBAAC,QAAD;GAAQ,UAAU,cAAc;GAAW,MAAK;GAAkB;aAAlE,CACG,cAAc,oBAAC,SAAD,CAAU,CAAA,GACxB,KACK;MAEP,aACC,qBAAC,OAAD;GACE,WAAU;GACV,MAAK;aAFP,CAIE,oBAAC,KAAD;IAAG,WAAU;cAA+B;GAAgB,CAAA,GAC5D,oBAAC,MAAD;IAAI,WAAU;cACX,cAAc,KAAK,UAClB,qBAAC,MAAD;KAAI,WAAU;eAAd;MACE,oBAAC,QAAD;OAAM,WAAU;iBAA0B,MAAM;MAAY,CAAA;MAAC;MAAI,MAAM;KACrE;OAFkC,MAAM,KAExC,CACL;GACC,CAAA,CACD;IAEH;;AAEV"}
@@ -1,25 +1,22 @@
1
- import { ConditionOperator } from '../../../../generated/types';
2
- export type Condition = {
3
- field: string;
4
- operator: ConditionOperator;
5
- value: unknown;
6
- };
1
+ import { Condition } from '../../types/generated';
2
+ export type { Condition };
7
3
  export type FieldConditions = {
8
4
  visible?: Condition[];
9
5
  required?: Condition[];
10
- readonly?: Condition[];
6
+ readOnly?: Condition[];
11
7
  disabled?: Condition[];
12
8
  };
13
9
  export type FieldFlags = {
14
10
  hidden?: boolean;
15
11
  required?: boolean;
16
- readonly?: boolean;
12
+ readOnly?: boolean;
17
13
  disabled?: boolean;
18
14
  };
19
15
  export type FieldState = {
20
16
  hidden: boolean;
21
17
  required: boolean;
22
- readonly: boolean;
18
+ readOnly: boolean;
23
19
  disabled: boolean;
24
20
  };
21
+ export declare function toBoolean(value: unknown): boolean;
25
22
  export declare function evaluateConditions(conditions: FieldConditions | undefined, values: Record<string, unknown>, flags: FieldFlags): FieldState;
@@ -20,6 +20,12 @@ function isIn(actual, expected) {
20
20
  function isBlank(value) {
21
21
  return value == null || String(value) === "";
22
22
  }
23
+ function compareDates(actual, expected) {
24
+ const left = Date.parse(String(actual));
25
+ const right = Date.parse(String(expected));
26
+ if (Number.isNaN(left) || Number.isNaN(right)) return null;
27
+ return left === right ? 0 : left < right ? -1 : 1;
28
+ }
23
29
  function evaluateUnknownOperator(_operator) {
24
30
  return true;
25
31
  }
@@ -36,6 +42,8 @@ function evaluateOp(operator, actual, expected) {
36
42
  case "ends_with": return String(actual ?? "").endsWith(String(expected ?? ""));
37
43
  case "in": return isIn(actual, expected);
38
44
  case "not_in": return !isIn(actual, expected);
45
+ case "before": return compareDates(actual, expected) === -1;
46
+ case "after": return compareDates(actual, expected) === 1;
39
47
  case "empty": return isBlank(actual);
40
48
  case "filled": return !isBlank(actual);
41
49
  default: return evaluateUnknownOperator(operator);
@@ -52,11 +60,11 @@ function evaluateConditions(conditions, values, flags) {
52
60
  return {
53
61
  hidden: Boolean(flags.hidden) || !visible,
54
62
  required: Boolean(flags.required) || anyMatch(conditions?.required, values),
55
- readonly: Boolean(flags.readonly) || anyMatch(conditions?.readonly, values),
63
+ readOnly: Boolean(flags.readOnly) || anyMatch(conditions?.readOnly, values),
56
64
  disabled: Boolean(flags.disabled) || anyMatch(conditions?.disabled, values)
57
65
  };
58
66
  }
59
67
  //#endregion
60
- export { evaluateConditions };
68
+ export { evaluateConditions, toBoolean };
61
69
 
62
70
  //# sourceMappingURL=conditions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conditions.js","names":[],"sources":["../../../resources/js/form/components/conditions.ts"],"sourcesContent":["import type { ConditionOperator } from \"@lattice/lattice/generated/types\";\n\nexport type Condition = { field: string; operator: ConditionOperator; value: unknown };\n\nexport type FieldConditions = {\n visible?: Condition[];\n required?: Condition[];\n readonly?: Condition[];\n disabled?: Condition[];\n};\n\nexport type FieldFlags = {\n hidden?: boolean;\n required?: boolean;\n readonly?: boolean;\n disabled?: boolean;\n};\n\nexport type FieldState = {\n hidden: boolean;\n required: boolean;\n readonly: boolean;\n disabled: boolean;\n};\n\nconst BOOLEAN_TRUE_VALUES = new Set([\"1\", \"true\", \"on\", \"yes\"]);\n\n// Mirrors PHP filter_var(FILTER_VALIDATE_BOOLEAN) so conditions evaluate\n// identically on the server and the client.\nfunction toBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n return value === 1;\n }\n\n return BOOLEAN_TRUE_VALUES.has(String(value).toLowerCase());\n}\n\nfunction equals(actual: unknown, expected: unknown): boolean {\n if (typeof expected === \"boolean\") {\n return toBoolean(actual) === expected;\n }\n return String(actual ?? \"\") === String(expected ?? \"\");\n}\n\nfunction isIn(actual: unknown, expected: unknown): boolean {\n const needles = (Array.isArray(expected) ? expected : [expected]).map((value) => String(value));\n return needles.includes(String(actual ?? \"\"));\n}\n\nfunction isBlank(value: unknown): boolean {\n return value == null || String(value) === \"\";\n}\n\n// Unknown operators from untrusted payloads fail open (the condition matches).\n// The `never` parameter makes a ConditionOperator added without a case above a\n// compile error rather than a silent fall-through.\nfunction evaluateUnknownOperator(_operator: never): boolean {\n return true;\n}\n\nfunction evaluateOp(operator: ConditionOperator, actual: unknown, expected: unknown): boolean {\n switch (operator) {\n case \"eq\":\n return equals(actual, expected);\n case \"neq\":\n return !equals(actual, expected);\n case \"gt\":\n return Number(actual) > Number(expected);\n case \"lt\":\n return Number(actual) < Number(expected);\n case \"gte\":\n return Number(actual) >= Number(expected);\n case \"lte\":\n return Number(actual) <= Number(expected);\n case \"contains\":\n return String(actual ?? \"\").includes(String(expected ?? \"\"));\n case \"starts_with\":\n return String(actual ?? \"\").startsWith(String(expected ?? \"\"));\n case \"ends_with\":\n return String(actual ?? \"\").endsWith(String(expected ?? \"\"));\n case \"in\":\n return isIn(actual, expected);\n case \"not_in\":\n return !isIn(actual, expected);\n case \"empty\":\n return isBlank(actual);\n case \"filled\":\n return !isBlank(actual);\n default:\n return evaluateUnknownOperator(operator);\n }\n}\n\nfunction allMatch(conditions: Condition[], values: Record<string, unknown>): boolean {\n return conditions.every((condition) =>\n evaluateOp(condition.operator, values[condition.field], condition.value),\n );\n}\n\nfunction anyMatch(conditions: Condition[] | undefined, values: Record<string, unknown>): boolean {\n return Boolean(\n conditions?.some((condition) =>\n evaluateOp(condition.operator, values[condition.field], condition.value),\n ),\n );\n}\n\nexport function evaluateConditions(\n conditions: FieldConditions | undefined,\n values: Record<string, unknown>,\n flags: FieldFlags,\n): FieldState {\n const visible = !conditions?.visible?.length || allMatch(conditions.visible, values);\n\n return {\n hidden: Boolean(flags.hidden) || !visible,\n required: Boolean(flags.required) || anyMatch(conditions?.required, values),\n readonly: Boolean(flags.readonly) || anyMatch(conditions?.readonly, values),\n disabled: Boolean(flags.disabled) || anyMatch(conditions?.disabled, values),\n };\n}\n"],"mappings":";AAyBA,IAAM,sBAAsB,IAAI,IAAI;CAAC;CAAK;CAAQ;CAAM;AAAK,CAAC;AAI9D,SAAS,UAAU,OAAyB;CAC1C,IAAI,OAAO,UAAU,WACnB,OAAO;CAGT,IAAI,OAAO,UAAU,UACnB,OAAO,UAAU;CAGnB,OAAO,oBAAoB,IAAI,OAAO,KAAK,EAAE,YAAY,CAAC;AAC5D;AAEA,SAAS,OAAO,QAAiB,UAA4B;CAC3D,IAAI,OAAO,aAAa,WACtB,OAAO,UAAU,MAAM,MAAM;CAE/B,OAAO,OAAO,UAAU,EAAE,MAAM,OAAO,YAAY,EAAE;AACvD;AAEA,SAAS,KAAK,QAAiB,UAA4B;CAEzD,QADiB,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ,GAAG,KAAK,UAAU,OAAO,KAAK,CACtF,EAAQ,SAAS,OAAO,UAAU,EAAE,CAAC;AAC9C;AAEA,SAAS,QAAQ,OAAyB;CACxC,OAAO,SAAS,QAAQ,OAAO,KAAK,MAAM;AAC5C;AAKA,SAAS,wBAAwB,WAA2B;CAC1D,OAAO;AACT;AAEA,SAAS,WAAW,UAA6B,QAAiB,UAA4B;CAC5F,QAAQ,UAAR;EACE,KAAK,MACH,OAAO,OAAO,QAAQ,QAAQ;EAChC,KAAK,OACH,OAAO,CAAC,OAAO,QAAQ,QAAQ;EACjC,KAAK,MACH,OAAO,OAAO,MAAM,IAAI,OAAO,QAAQ;EACzC,KAAK,MACH,OAAO,OAAO,MAAM,IAAI,OAAO,QAAQ;EACzC,KAAK,OACH,OAAO,OAAO,MAAM,KAAK,OAAO,QAAQ;EAC1C,KAAK,OACH,OAAO,OAAO,MAAM,KAAK,OAAO,QAAQ;EAC1C,KAAK,YACH,OAAO,OAAO,UAAU,EAAE,EAAE,SAAS,OAAO,YAAY,EAAE,CAAC;EAC7D,KAAK,eACH,OAAO,OAAO,UAAU,EAAE,EAAE,WAAW,OAAO,YAAY,EAAE,CAAC;EAC/D,KAAK,aACH,OAAO,OAAO,UAAU,EAAE,EAAE,SAAS,OAAO,YAAY,EAAE,CAAC;EAC7D,KAAK,MACH,OAAO,KAAK,QAAQ,QAAQ;EAC9B,KAAK,UACH,OAAO,CAAC,KAAK,QAAQ,QAAQ;EAC/B,KAAK,SACH,OAAO,QAAQ,MAAM;EACvB,KAAK,UACH,OAAO,CAAC,QAAQ,MAAM;EACxB,SACE,OAAO,wBAAwB,QAAQ;CAC3C;AACF;AAEA,SAAS,SAAS,YAAyB,QAA0C;CACnF,OAAO,WAAW,OAAO,cACvB,WAAW,UAAU,UAAU,OAAO,UAAU,QAAQ,UAAU,KAAK,CACzE;AACF;AAEA,SAAS,SAAS,YAAqC,QAA0C;CAC/F,OAAO,QACL,YAAY,MAAM,cAChB,WAAW,UAAU,UAAU,OAAO,UAAU,QAAQ,UAAU,KAAK,CACzE,CACF;AACF;AAEA,SAAgB,mBACd,YACA,QACA,OACY;CACZ,MAAM,UAAU,CAAC,YAAY,SAAS,UAAU,SAAS,WAAW,SAAS,MAAM;CAEnF,OAAO;EACL,QAAQ,QAAQ,MAAM,MAAM,KAAK,CAAC;EAClC,UAAU,QAAQ,MAAM,QAAQ,KAAK,SAAS,YAAY,UAAU,MAAM;EAC1E,UAAU,QAAQ,MAAM,QAAQ,KAAK,SAAS,YAAY,UAAU,MAAM;EAC1E,UAAU,QAAQ,MAAM,QAAQ,KAAK,SAAS,YAAY,UAAU,MAAM;CAC5E;AACF"}
1
+ {"version":3,"file":"conditions.js","names":[],"sources":["../../../resources/js/form/components/conditions.ts"],"sourcesContent":["import type { Condition, Op } from \"@lattice/lattice/types/generated\";\n\nexport type { Condition };\n\nexport type FieldConditions = {\n visible?: Condition[];\n required?: Condition[];\n readOnly?: Condition[];\n disabled?: Condition[];\n};\n\nexport type FieldFlags = {\n hidden?: boolean;\n required?: boolean;\n readOnly?: boolean;\n disabled?: boolean;\n};\n\nexport type FieldState = {\n hidden: boolean;\n required: boolean;\n readOnly: boolean;\n disabled: boolean;\n};\n\nconst BOOLEAN_TRUE_VALUES = new Set([\"1\", \"true\", \"on\", \"yes\"]);\n\n// Mirrors PHP filter_var(FILTER_VALIDATE_BOOLEAN) so conditions evaluate\n// identically on the server and the client.\nexport function toBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n return value === 1;\n }\n\n return BOOLEAN_TRUE_VALUES.has(String(value).toLowerCase());\n}\n\nfunction equals(actual: unknown, expected: unknown): boolean {\n if (typeof expected === \"boolean\") {\n return toBoolean(actual) === expected;\n }\n return String(actual ?? \"\") === String(expected ?? \"\");\n}\n\nfunction isIn(actual: unknown, expected: unknown): boolean {\n const needles = (Array.isArray(expected) ? expected : [expected]).map((value) => String(value));\n return needles.includes(String(actual ?? \"\"));\n}\n\nfunction isBlank(value: unknown): boolean {\n return value == null || String(value) === \"\";\n}\n\n// Null when either value can't be parsed, so before/after never matches a bad date. Mirrors PHP strtotime.\nfunction compareDates(actual: unknown, expected: unknown): number | null {\n const left = Date.parse(String(actual));\n const right = Date.parse(String(expected));\n\n if (Number.isNaN(left) || Number.isNaN(right)) {\n return null;\n }\n\n return left === right ? 0 : left < right ? -1 : 1;\n}\n\n// Unknown operators from untrusted payloads fail open (the condition matches).\n// The `never` parameter makes an Op value added without a case above a\n// compile error rather than a silent fall-through.\nfunction evaluateUnknownOperator(_operator: never): boolean {\n return true;\n}\n\nfunction evaluateOp(operator: Op, actual: unknown, expected: unknown): boolean {\n switch (operator) {\n case \"eq\":\n return equals(actual, expected);\n case \"neq\":\n return !equals(actual, expected);\n case \"gt\":\n return Number(actual) > Number(expected);\n case \"lt\":\n return Number(actual) < Number(expected);\n case \"gte\":\n return Number(actual) >= Number(expected);\n case \"lte\":\n return Number(actual) <= Number(expected);\n case \"contains\":\n return String(actual ?? \"\").includes(String(expected ?? \"\"));\n case \"starts_with\":\n return String(actual ?? \"\").startsWith(String(expected ?? \"\"));\n case \"ends_with\":\n return String(actual ?? \"\").endsWith(String(expected ?? \"\"));\n case \"in\":\n return isIn(actual, expected);\n case \"not_in\":\n return !isIn(actual, expected);\n case \"before\":\n return compareDates(actual, expected) === -1;\n case \"after\":\n return compareDates(actual, expected) === 1;\n case \"empty\":\n return isBlank(actual);\n case \"filled\":\n return !isBlank(actual);\n default:\n return evaluateUnknownOperator(operator);\n }\n}\n\nfunction allMatch(conditions: Condition[], values: Record<string, unknown>): boolean {\n return conditions.every((condition) =>\n evaluateOp(condition.operator, values[condition.field], condition.value),\n );\n}\n\nfunction anyMatch(conditions: Condition[] | undefined, values: Record<string, unknown>): boolean {\n return Boolean(\n conditions?.some((condition) =>\n evaluateOp(condition.operator, values[condition.field], condition.value),\n ),\n );\n}\n\nexport function evaluateConditions(\n conditions: FieldConditions | undefined,\n values: Record<string, unknown>,\n flags: FieldFlags,\n): FieldState {\n const visible = !conditions?.visible?.length || allMatch(conditions.visible, values);\n\n return {\n hidden: Boolean(flags.hidden) || !visible,\n required: Boolean(flags.required) || anyMatch(conditions?.required, values),\n readOnly: Boolean(flags.readOnly) || anyMatch(conditions?.readOnly, values),\n disabled: Boolean(flags.disabled) || anyMatch(conditions?.disabled, values),\n };\n}\n"],"mappings":";AAyBA,IAAM,sBAAsB,IAAI,IAAI;CAAC;CAAK;CAAQ;CAAM;AAAK,CAAC;AAI9D,SAAgB,UAAU,OAAyB;CACjD,IAAI,OAAO,UAAU,WACnB,OAAO;CAGT,IAAI,OAAO,UAAU,UACnB,OAAO,UAAU;CAGnB,OAAO,oBAAoB,IAAI,OAAO,KAAK,EAAE,YAAY,CAAC;AAC5D;AAEA,SAAS,OAAO,QAAiB,UAA4B;CAC3D,IAAI,OAAO,aAAa,WACtB,OAAO,UAAU,MAAM,MAAM;CAE/B,OAAO,OAAO,UAAU,EAAE,MAAM,OAAO,YAAY,EAAE;AACvD;AAEA,SAAS,KAAK,QAAiB,UAA4B;CAEzD,QADiB,MAAM,QAAQ,QAAQ,IAAI,WAAW,CAAC,QAAQ,GAAG,KAAK,UAAU,OAAO,KAAK,CACtF,EAAQ,SAAS,OAAO,UAAU,EAAE,CAAC;AAC9C;AAEA,SAAS,QAAQ,OAAyB;CACxC,OAAO,SAAS,QAAQ,OAAO,KAAK,MAAM;AAC5C;AAGA,SAAS,aAAa,QAAiB,UAAkC;CACvE,MAAM,OAAO,KAAK,MAAM,OAAO,MAAM,CAAC;CACtC,MAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ,CAAC;CAEzC,IAAI,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,KAAK,GAC1C,OAAO;CAGT,OAAO,SAAS,QAAQ,IAAI,OAAO,QAAQ,KAAK;AAClD;AAKA,SAAS,wBAAwB,WAA2B;CAC1D,OAAO;AACT;AAEA,SAAS,WAAW,UAAc,QAAiB,UAA4B;CAC7E,QAAQ,UAAR;EACE,KAAK,MACH,OAAO,OAAO,QAAQ,QAAQ;EAChC,KAAK,OACH,OAAO,CAAC,OAAO,QAAQ,QAAQ;EACjC,KAAK,MACH,OAAO,OAAO,MAAM,IAAI,OAAO,QAAQ;EACzC,KAAK,MACH,OAAO,OAAO,MAAM,IAAI,OAAO,QAAQ;EACzC,KAAK,OACH,OAAO,OAAO,MAAM,KAAK,OAAO,QAAQ;EAC1C,KAAK,OACH,OAAO,OAAO,MAAM,KAAK,OAAO,QAAQ;EAC1C,KAAK,YACH,OAAO,OAAO,UAAU,EAAE,EAAE,SAAS,OAAO,YAAY,EAAE,CAAC;EAC7D,KAAK,eACH,OAAO,OAAO,UAAU,EAAE,EAAE,WAAW,OAAO,YAAY,EAAE,CAAC;EAC/D,KAAK,aACH,OAAO,OAAO,UAAU,EAAE,EAAE,SAAS,OAAO,YAAY,EAAE,CAAC;EAC7D,KAAK,MACH,OAAO,KAAK,QAAQ,QAAQ;EAC9B,KAAK,UACH,OAAO,CAAC,KAAK,QAAQ,QAAQ;EAC/B,KAAK,UACH,OAAO,aAAa,QAAQ,QAAQ,MAAM;EAC5C,KAAK,SACH,OAAO,aAAa,QAAQ,QAAQ,MAAM;EAC5C,KAAK,SACH,OAAO,QAAQ,MAAM;EACvB,KAAK,UACH,OAAO,CAAC,QAAQ,MAAM;EACxB,SACE,OAAO,wBAAwB,QAAQ;CAC3C;AACF;AAEA,SAAS,SAAS,YAAyB,QAA0C;CACnF,OAAO,WAAW,OAAO,cACvB,WAAW,UAAU,UAAU,OAAO,UAAU,QAAQ,UAAU,KAAK,CACzE;AACF;AAEA,SAAS,SAAS,YAAqC,QAA0C;CAC/F,OAAO,QACL,YAAY,MAAM,cAChB,WAAW,UAAU,UAAU,OAAO,UAAU,QAAQ,UAAU,KAAK,CACzE,CACF;AACF;AAEA,SAAgB,mBACd,YACA,QACA,OACY;CACZ,MAAM,UAAU,CAAC,YAAY,SAAS,UAAU,SAAS,WAAW,SAAS,MAAM;CAEnF,OAAO;EACL,QAAQ,QAAQ,MAAM,MAAM,KAAK,CAAC;EAClC,UAAU,QAAQ,MAAM,QAAQ,KAAK,SAAS,YAAY,UAAU,MAAM;EAC1E,UAAU,QAAQ,MAAM,QAAQ,KAAK,SAAS,YAAY,UAAU,MAAM;EAC1E,UAAU,QAAQ,MAAM,QAAQ,KAAK,SAAS,YAAY,UAAU,MAAM;CAC5E;AACF"}
@@ -4,13 +4,9 @@ type FormContextValue = {
4
4
  componentRef: string;
5
5
  errors: Record<string, string | undefined>;
6
6
  fieldLabels: Record<string, string>;
7
- invalid: (field: string) => boolean;
8
7
  precognitive: boolean;
9
8
  processing: boolean;
10
- touch: (field: string) => void;
11
9
  validate: (field: string) => void;
12
- validating: boolean;
13
- valid: (field: string) => boolean;
14
10
  };
15
11
  export declare function FormProvider({ children, value, }: {
16
12
  children: React.ReactNode;
@@ -7,13 +7,9 @@ var FormContext = createContext({
7
7
  componentRef: "",
8
8
  errors: {},
9
9
  fieldLabels: {},
10
- invalid: () => false,
11
10
  precognitive: false,
12
11
  processing: false,
13
- touch: () => {},
14
- validate: () => {},
15
- validating: false,
16
- valid: () => false
12
+ validate: () => {}
17
13
  });
18
14
  function FormProvider({ children, value }) {
19
15
  return /* @__PURE__ */ jsx(FormContext.Provider, {
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../../resources/js/form/components/context.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\n\ntype FormContextValue = {\n action: string;\n clearErrors: (field: string) => void;\n componentRef: string;\n errors: Record<string, string | undefined>;\n fieldLabels: Record<string, string>;\n invalid: (field: string) => boolean;\n precognitive: boolean;\n processing: boolean;\n touch: (field: string) => void;\n validate: (field: string) => void;\n validating: boolean;\n valid: (field: string) => boolean;\n};\n\nconst FormContext = createContext<FormContextValue>({\n action: \"#\",\n clearErrors: () => {},\n componentRef: \"\",\n errors: {},\n fieldLabels: {},\n invalid: () => false,\n precognitive: false,\n processing: false,\n touch: () => {},\n validate: () => {},\n validating: false,\n valid: () => false,\n});\n\nexport function FormProvider({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: FormContextValue;\n}) {\n return <FormContext.Provider value={value}>{children}</FormContext.Provider>;\n}\n\nexport function useFormContext() {\n return useContext(FormContext);\n}\n"],"mappings":";;;AAiBA,IAAM,cAAc,cAAgC;CAClD,QAAQ;CACR,mBAAmB,CAAC;CACpB,cAAc;CACd,QAAQ,CAAC;CACT,aAAa,CAAC;CACd,eAAe;CACf,cAAc;CACd,YAAY;CACZ,aAAa,CAAC;CACd,gBAAgB,CAAC;CACjB,YAAY;CACZ,aAAa;AACf,CAAC;AAED,SAAgB,aAAa,EAC3B,UACA,SAIC;CACD,OAAO,oBAAC,YAAY,UAAb;EAA6B;EAAQ;CAA+B,CAAA;AAC7E;AAEA,SAAgB,iBAAiB;CAC/B,OAAO,WAAW,WAAW;AAC/B"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../resources/js/form/components/context.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\n\ntype FormContextValue = {\n action: string;\n clearErrors: (field: string) => void;\n componentRef: string;\n errors: Record<string, string | undefined>;\n fieldLabels: Record<string, string>;\n precognitive: boolean;\n processing: boolean;\n validate: (field: string) => void;\n};\n\nconst FormContext = createContext<FormContextValue>({\n action: \"#\",\n clearErrors: () => {},\n componentRef: \"\",\n errors: {},\n fieldLabels: {},\n precognitive: false,\n processing: false,\n validate: () => {},\n});\n\nexport function FormProvider({\n children,\n value,\n}: {\n children: React.ReactNode;\n value: FormContextValue;\n}) {\n return <FormContext.Provider value={value}>{children}</FormContext.Provider>;\n}\n\nexport function useFormContext() {\n return useContext(FormContext);\n}\n"],"mappings":";;;AAaA,IAAM,cAAc,cAAgC;CAClD,QAAQ;CACR,mBAAmB,CAAC;CACpB,cAAc;CACd,QAAQ,CAAC;CACT,aAAa,CAAC;CACd,cAAc;CACd,YAAY;CACZ,gBAAgB,CAAC;AACnB,CAAC;AAED,SAAgB,aAAa,EAC3B,UACA,SAIC;CACD,OAAO,oBAAC,YAAY,UAAb;EAA6B;EAAQ;CAA+B,CAAA;AAC7E;AAEA,SAAgB,iBAAiB;CAC/B,OAAO,WAAW,WAAW;AAC/B"}
@@ -0,0 +1,24 @@
1
+ import { Node } from '../../core/types';
2
+ import { FieldConditions } from './conditions';
3
+ /**
4
+ * The props every form-field node shares (the PHP Field base). Nodes flow through
5
+ * the form framework loosely typed via the generic schema, so this is the typed
6
+ * lens the shared hooks read them through. Everything is optional because the
7
+ * lens is also applied to non-field nodes while walking the schema.
8
+ */
9
+ export type FieldProps = {
10
+ conditions?: FieldConditions | null;
11
+ dependsOnAny?: boolean | null;
12
+ dependsOnKeys?: string[] | null;
13
+ disabled?: boolean | null;
14
+ helperText?: string | null;
15
+ hidden?: boolean | null;
16
+ label?: string | null;
17
+ name?: string;
18
+ readOnly?: boolean | null;
19
+ required?: boolean | null;
20
+ value?: unknown;
21
+ };
22
+ export declare function fieldProps(node: Node): FieldProps;
23
+ /** The single schema traversal shared by the label/value and dependency-watch collectors. */
24
+ export declare function walkFields(nodes: Node[] | undefined, visit: (props: FieldProps, node: Node) => void): void;
@@ -0,0 +1,15 @@
1
+ //#region resources/js/form/components/field-props.ts
2
+ function fieldProps(node) {
3
+ return node.props;
4
+ }
5
+ /** The single schema traversal shared by the label/value and dependency-watch collectors. */
6
+ function walkFields(nodes, visit) {
7
+ for (const child of nodes ?? []) {
8
+ visit(fieldProps(child), child);
9
+ walkFields(child.schema, visit);
10
+ }
11
+ }
12
+ //#endregion
13
+ export { fieldProps, walkFields };
14
+
15
+ //# sourceMappingURL=field-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-props.js","names":[],"sources":["../../../resources/js/form/components/field-props.ts"],"sourcesContent":["import type { Node } from \"@lattice/lattice/core/types\";\nimport type { FieldConditions } from \"./conditions\";\n\n/**\n * The props every form-field node shares (the PHP Field base). Nodes flow through\n * the form framework loosely typed via the generic schema, so this is the typed\n * lens the shared hooks read them through. Everything is optional because the\n * lens is also applied to non-field nodes while walking the schema.\n */\nexport type FieldProps = {\n conditions?: FieldConditions | null;\n dependsOnAny?: boolean | null;\n dependsOnKeys?: string[] | null;\n disabled?: boolean | null;\n helperText?: string | null;\n hidden?: boolean | null;\n label?: string | null;\n name?: string;\n readOnly?: boolean | null;\n required?: boolean | null;\n value?: unknown;\n};\n\nexport function fieldProps(node: Node): FieldProps {\n return node.props as FieldProps;\n}\n\n/** The single schema traversal shared by the label/value and dependency-watch collectors. */\nexport function walkFields(\n nodes: Node[] | undefined,\n visit: (props: FieldProps, node: Node) => void,\n): void {\n for (const child of nodes ?? []) {\n visit(fieldProps(child), child);\n walkFields(child.schema, visit);\n }\n}\n"],"mappings":";AAuBA,SAAgB,WAAW,MAAwB;CACjD,OAAO,KAAK;AACd;;AAGA,SAAgB,WACd,OACA,OACM;CACN,KAAK,MAAM,SAAS,SAAS,CAAC,GAAG;EAC/B,MAAM,WAAW,KAAK,GAAG,KAAK;EAC9B,WAAW,MAAM,QAAQ,KAAK;CAChC;AACF"}
@@ -1,16 +1,2 @@
1
- import { RendererComponent } from '../../../../../core/types';
2
- declare module '../../../../../core/types' {
3
- interface ComponentProps {
4
- "form.checkbox": {
5
- checked?: boolean;
6
- conditions?: unknown;
7
- disabled?: boolean;
8
- hidden?: boolean;
9
- label?: string;
10
- name?: string;
11
- required?: boolean;
12
- tabIndex?: number;
13
- };
14
- }
15
- }
1
+ import { RendererComponent } from '../../../core/types';
16
2
  export declare const CheckboxComponent: RendererComponent<"form.checkbox">;
@@ -1,36 +1,28 @@
1
- import { getOptionalNumberProp, getStringProp } from "../../../core/props.js";
2
1
  import { useFormContext } from "../context.js";
3
2
  import { useFormValue, useSetFormValue } from "../values.js";
3
+ import { toBoolean } from "../conditions.js";
4
4
  import { Checkbox } from "../base/checkbox.js";
5
5
  import { Label } from "../base/label.js";
6
6
  import { useDependentField } from "../use-dependent-field.js";
7
- import { useEffect } from "react";
7
+ import { useSeedDefault } from "../use-seed-default.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region resources/js/form/components/fields/checkbox.tsx
10
- function isTruthy(value) {
11
- return value === true || value === "true" || value === "1" || value === 1;
12
- }
13
10
  var CheckboxComponent = ({ node }) => {
14
11
  const { clearErrors, precognitive, validate } = useFormContext();
15
- const { hidden, readonly, disabled } = useDependentField(node);
16
- const name = getStringProp(node.props, "name");
12
+ const { hidden, readOnly, disabled } = useDependentField(node);
13
+ const name = node.props.name;
17
14
  const setValue = useSetFormValue();
18
15
  const storedValue = useFormValue(name);
19
- const checked = storedValue !== void 0 ? isTruthy(storedValue) : Boolean(node.props?.checked);
20
- useEffect(() => {
21
- if (storedValue === void 0) setValue(name, Boolean(node.props?.checked));
22
- }, [
23
- name,
24
- node.props?.checked,
25
- setValue,
26
- storedValue
27
- ]);
16
+ const defaultChecked = toBoolean(node.props.value);
17
+ const checked = storedValue !== void 0 ? toBoolean(storedValue) : defaultChecked;
18
+ useSeedDefault(name, defaultChecked);
28
19
  if (hidden) return null;
29
- return /* @__PURE__ */ jsxs("div", {
20
+ return /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("div", {
30
21
  className: "flex items-center space-x-3",
31
22
  children: [/* @__PURE__ */ jsx(Checkbox, {
23
+ autoFocus: node.props.autoFocus ?? void 0,
32
24
  checked,
33
- disabled: readonly || disabled,
25
+ disabled: readOnly || disabled,
34
26
  id: name,
35
27
  name,
36
28
  onCheckedChange: (next) => {
@@ -38,12 +30,15 @@ var CheckboxComponent = ({ node }) => {
38
30
  if (precognitive) window.requestAnimationFrame(() => validate(name));
39
31
  else clearErrors(name);
40
32
  },
41
- tabIndex: getOptionalNumberProp(node.props, "tabIndex")
33
+ tabIndex: node.props.tabIndex ?? void 0
42
34
  }), /* @__PURE__ */ jsx(Label, {
43
35
  htmlFor: name,
44
- children: getStringProp(node.props, "label")
36
+ children: node.props.label
45
37
  })]
46
- });
38
+ }), node.props.helperText && /* @__PURE__ */ jsx("p", {
39
+ className: "mt-1 pl-7 text-sm text-lt-muted-fg",
40
+ children: node.props.helperText
41
+ })] });
47
42
  };
48
43
  //#endregion
49
44
  export { CheckboxComponent };
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.js","names":[],"sources":["../../../../resources/js/form/components/fields/checkbox.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport { getOptionalNumberProp, getStringProp } from \"@lattice/lattice/core/props\";\nimport type { RendererComponent } from \"@lattice/lattice/core/types\";\nimport { Checkbox } from \"../base/checkbox\";\nimport { Label } from \"../base/label\";\nimport { useFormContext } from \"../context\";\nimport { useDependentField } from \"../use-dependent-field\";\nimport { useFormValue, useSetFormValue } from \"../values\";\n\ndeclare module \"@lattice/lattice/core/types\" {\n interface ComponentProps {\n \"form.checkbox\": {\n checked?: boolean;\n conditions?: unknown;\n disabled?: boolean;\n hidden?: boolean;\n label?: string;\n name?: string;\n required?: boolean;\n tabIndex?: number;\n };\n }\n}\n\nfunction isTruthy(value: unknown): boolean {\n return value === true || value === \"true\" || value === \"1\" || value === 1;\n}\n\nexport const CheckboxComponent: RendererComponent<\"form.checkbox\"> = ({ node }) => {\n const { clearErrors, precognitive, validate } = useFormContext();\n const { hidden, readonly, disabled } = useDependentField(node);\n const name = getStringProp(node.props, \"name\");\n const setValue = useSetFormValue();\n const storedValue = useFormValue(name);\n const checked = storedValue !== undefined ? isTruthy(storedValue) : Boolean(node.props?.checked);\n\n useEffect(() => {\n if (storedValue === undefined) {\n setValue(name, Boolean(node.props?.checked));\n }\n }, [name, node.props?.checked, setValue, storedValue]);\n\n if (hidden) {\n return null;\n }\n\n return (\n <div className=\"flex items-center space-x-3\">\n <Checkbox\n checked={checked}\n disabled={readonly || disabled}\n id={name}\n name={name}\n onCheckedChange={(next) => {\n const value = next === true;\n setValue(name, value);\n if (precognitive) {\n window.requestAnimationFrame(() => validate(name));\n } else {\n clearErrors(name);\n }\n }}\n tabIndex={getOptionalNumberProp(node.props, \"tabIndex\")}\n />\n <Label htmlFor={name}>{getStringProp(node.props, \"label\")}</Label>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;AAwBA,SAAS,SAAS,OAAyB;CACzC,OAAO,UAAU,QAAQ,UAAU,UAAU,UAAU,OAAO,UAAU;AAC1E;AAEA,IAAa,qBAAyD,EAAE,WAAW;CACjF,MAAM,EAAE,aAAa,cAAc,aAAa,eAAe;CAC/D,MAAM,EAAE,QAAQ,UAAU,aAAa,kBAAkB,IAAI;CAC7D,MAAM,OAAO,cAAc,KAAK,OAAO,MAAM;CAC7C,MAAM,WAAW,gBAAgB;CACjC,MAAM,cAAc,aAAa,IAAI;CACrC,MAAM,UAAU,gBAAgB,KAAA,IAAY,SAAS,WAAW,IAAI,QAAQ,KAAK,OAAO,OAAO;CAE/F,gBAAgB;EACd,IAAI,gBAAgB,KAAA,GAClB,SAAS,MAAM,QAAQ,KAAK,OAAO,OAAO,CAAC;CAE/C,GAAG;EAAC;EAAM,KAAK,OAAO;EAAS;EAAU;CAAW,CAAC;CAErD,IAAI,QACF,OAAO;CAGT,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,UAAD;GACW;GACT,UAAU,YAAY;GACtB,IAAI;GACE;GACN,kBAAkB,SAAS;IAEzB,SAAS,MADK,SAAS,IACH;IACpB,IAAI,cACF,OAAO,4BAA4B,SAAS,IAAI,CAAC;SAEjD,YAAY,IAAI;GAEpB;GACA,UAAU,sBAAsB,KAAK,OAAO,UAAU;EACvD,CAAA,GACD,oBAAC,OAAD;GAAO,SAAS;aAAO,cAAc,KAAK,OAAO,OAAO;EAAS,CAAA,CAC9D;;AAET"}
1
+ {"version":3,"file":"checkbox.js","names":[],"sources":["../../../../resources/js/form/components/fields/checkbox.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice/lattice/core/types\";\nimport { Checkbox } from \"../base/checkbox\";\nimport { Label } from \"../base/label\";\nimport { toBoolean } from \"../conditions\";\nimport { useFormContext } from \"../context\";\nimport { useDependentField } from \"../use-dependent-field\";\nimport { useSeedDefault } from \"../use-seed-default\";\nimport { useFormValue, useSetFormValue } from \"../values\";\n\nexport const CheckboxComponent: RendererComponent<\"form.checkbox\"> = ({ node }) => {\n const { clearErrors, precognitive, validate } = useFormContext();\n const { hidden, readOnly, disabled } = useDependentField(node);\n const name = node.props.name;\n const setValue = useSetFormValue();\n const storedValue = useFormValue(name);\n const defaultChecked = toBoolean(node.props.value);\n const checked = storedValue !== undefined ? toBoolean(storedValue) : defaultChecked;\n\n useSeedDefault(name, defaultChecked);\n\n if (hidden) {\n return null;\n }\n\n return (\n <div>\n <div className=\"flex items-center space-x-3\">\n <Checkbox\n autoFocus={node.props.autoFocus ?? undefined}\n checked={checked}\n disabled={readOnly || disabled}\n id={name}\n name={name}\n onCheckedChange={(next) => {\n const value = next === true;\n setValue(name, value);\n if (precognitive) {\n window.requestAnimationFrame(() => validate(name));\n } else {\n clearErrors(name);\n }\n }}\n tabIndex={node.props.tabIndex ?? undefined}\n />\n <Label htmlFor={name}>{node.props.label}</Label>\n </div>\n {node.props.helperText && (\n <p className=\"mt-1 pl-7 text-sm text-lt-muted-fg\">{node.props.helperText}</p>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;AASA,IAAa,qBAAyD,EAAE,WAAW;CACjF,MAAM,EAAE,aAAa,cAAc,aAAa,eAAe;CAC/D,MAAM,EAAE,QAAQ,UAAU,aAAa,kBAAkB,IAAI;CAC7D,MAAM,OAAO,KAAK,MAAM;CACxB,MAAM,WAAW,gBAAgB;CACjC,MAAM,cAAc,aAAa,IAAI;CACrC,MAAM,iBAAiB,UAAU,KAAK,MAAM,KAAK;CACjD,MAAM,UAAU,gBAAgB,KAAA,IAAY,UAAU,WAAW,IAAI;CAErE,eAAe,MAAM,cAAc;CAEnC,IAAI,QACF,OAAO;CAGT,OACE,qBAAC,OAAD,EAAA,UAAA,CACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,UAAD;GACE,WAAW,KAAK,MAAM,aAAa,KAAA;GAC1B;GACT,UAAU,YAAY;GACtB,IAAI;GACE;GACN,kBAAkB,SAAS;IAEzB,SAAS,MADK,SAAS,IACH;IACpB,IAAI,cACF,OAAO,4BAA4B,SAAS,IAAI,CAAC;SAEjD,YAAY,IAAI;GAEpB;GACA,UAAU,KAAK,MAAM,YAAY,KAAA;EAClC,CAAA,GACD,oBAAC,OAAD;GAAO,SAAS;aAAO,KAAK,MAAM;EAAa,CAAA,CAC5C;KACJ,KAAK,MAAM,cACV,oBAAC,KAAD;EAAG,WAAU;YAAsC,KAAK,MAAM;CAAc,CAAA,CAE3E,EAAA,CAAA;AAET"}
@@ -1,14 +1,2 @@
1
- import { Option } from '../../../../../core/props';
2
- import { RendererComponent } from '../../../../../core/types';
3
- declare module '../../../../../core/types' {
4
- interface ComponentProps {
5
- "form.choice": {
6
- label?: string;
7
- name?: string;
8
- options?: Option[];
9
- tabIndex?: number;
10
- value?: string;
11
- };
12
- }
13
- }
1
+ import { RendererComponent } from '../../../core/types';
14
2
  export declare const ChoiceComponent: RendererComponent<"form.choice">;
@@ -1,32 +1,23 @@
1
- import { getOptionalNumberProp, getOptions, getStringProp } from "../../../core/props.js";
2
- import { SegmentedPills } from "../../../core/components/segmented-pills.js";
3
1
  import { useResolvedNode } from "../resolved-nodes.js";
4
- import { useFormValue, useSetFormValue } from "../values.js";
2
+ import { SegmentedPills } from "../../../core/components/segmented-pills.js";
3
+ import { useSeedDefault } from "../use-seed-default.js";
5
4
  import { FormFieldFrame } from "../base/field.js";
6
5
  import { useControlledField } from "../use-controlled-field.js";
7
- import { useEffect, useMemo } from "react";
6
+ import { useMemo } from "react";
8
7
  import { jsx, jsxs } from "react/jsx-runtime";
9
8
  //#region resources/js/form/components/fields/choice.tsx
10
9
  var ChoiceComponent = ({ node }) => {
11
10
  const resolvedNode = useResolvedNode(node);
12
- const { name, value, error, hidden, required, readonly, disabled, commit } = useControlledField(node);
13
- const storedValue = useFormValue(name);
14
- const setValue = useSetFormValue();
15
- const options = useMemo(() => getOptions(resolvedNode.props), [resolvedNode.props]);
11
+ const { name, value, error, hidden, required, readOnly, disabled, commit } = useControlledField(node);
12
+ const options = useMemo(() => resolvedNode.props.options ?? [], [resolvedNode.props]);
16
13
  const fallbackValue = options[0]?.value ?? "";
17
14
  const selected = value || fallbackValue;
18
- useEffect(() => {
19
- if (storedValue === void 0 && selected) setValue(name, selected);
20
- }, [
21
- name,
22
- storedValue,
23
- selected,
24
- setValue
25
- ]);
15
+ useSeedDefault(name, selected || void 0);
26
16
  if (hidden || options.length === 0) return null;
27
17
  return /* @__PURE__ */ jsxs(FormFieldFrame, {
28
18
  error,
29
- label: getStringProp(node.props, "label"),
19
+ helperText: node.props.helperText ?? void 0,
20
+ label: node.props.label ?? "",
30
21
  name,
31
22
  required,
32
23
  children: [/* @__PURE__ */ jsx("input", {
@@ -34,11 +25,13 @@ var ChoiceComponent = ({ node }) => {
34
25
  type: "hidden",
35
26
  value: selected
36
27
  }), /* @__PURE__ */ jsx(SegmentedPills, {
37
- ariaLabel: getStringProp(node.props, "label"),
38
- disabled: readonly || disabled,
28
+ ariaLabel: node.props.label ?? void 0,
29
+ autoFocus: node.props.autoFocus ?? void 0,
30
+ disabled: readOnly || disabled,
31
+ name,
39
32
  onSelect: commit,
40
33
  options,
41
- tabIndex: getOptionalNumberProp(node.props, "tabIndex"),
34
+ tabIndex: node.props.tabIndex ?? void 0,
42
35
  value: selected
43
36
  })]
44
37
  });
@@ -1 +1 @@
1
- {"version":3,"file":"choice.js","names":[],"sources":["../../../../resources/js/form/components/fields/choice.tsx"],"sourcesContent":["import { useEffect, useMemo } from \"react\";\nimport {\n type Option,\n getOptionalNumberProp,\n getOptions,\n getStringProp,\n} from \"@lattice/lattice/core/props\";\nimport type { RendererComponent } from \"@lattice/lattice/core/types\";\nimport { SegmentedPills } from \"@lattice/lattice/core/components/segmented-pills\";\nimport { FormFieldFrame } from \"../base/field\";\nimport { useControlledField } from \"../use-controlled-field\";\nimport { useResolvedNode } from \"../resolved-nodes\";\nimport { useFormValue, useSetFormValue } from \"../values\";\n\ndeclare module \"@lattice/lattice/core/types\" {\n interface ComponentProps {\n \"form.choice\": {\n label?: string;\n name?: string;\n options?: Option[];\n tabIndex?: number;\n value?: string;\n };\n }\n}\n\nexport const ChoiceComponent: RendererComponent<\"form.choice\"> = ({ node }) => {\n const resolvedNode = useResolvedNode(node);\n const { name, value, error, hidden, required, readonly, disabled, commit } =\n useControlledField(node);\n const storedValue = useFormValue(name);\n const setValue = useSetFormValue();\n const options = useMemo(() => getOptions(resolvedNode.props), [resolvedNode.props]);\n const fallbackValue = options[0]?.value ?? \"\";\n const selected = value || fallbackValue;\n\n // Seed the store with the default selection so dependent fields and the\n // submitted payload reflect it before the user interacts.\n useEffect(() => {\n if (storedValue === undefined && selected) {\n setValue(name, selected);\n }\n }, [name, storedValue, selected, setValue]);\n\n if (hidden || options.length === 0) {\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 name={name} type=\"hidden\" value={selected} />\n <SegmentedPills\n ariaLabel={getStringProp(node.props, \"label\")}\n disabled={readonly || disabled}\n onSelect={commit}\n options={options}\n tabIndex={getOptionalNumberProp(node.props, \"tabIndex\")}\n value={selected}\n />\n </FormFieldFrame>\n );\n};\n"],"mappings":";;;;;;;;;AA0BA,IAAa,mBAAqD,EAAE,WAAW;CAC7E,MAAM,eAAe,gBAAgB,IAAI;CACzC,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,UAAU,UAAU,UAAU,WAChE,mBAAmB,IAAI;CACzB,MAAM,cAAc,aAAa,IAAI;CACrC,MAAM,WAAW,gBAAgB;CACjC,MAAM,UAAU,cAAc,WAAW,aAAa,KAAK,GAAG,CAAC,aAAa,KAAK,CAAC;CAClF,MAAM,gBAAgB,QAAQ,IAAI,SAAS;CAC3C,MAAM,WAAW,SAAS;CAI1B,gBAAgB;EACd,IAAI,gBAAgB,KAAA,KAAa,UAC/B,SAAS,MAAM,QAAQ;CAE3B,GAAG;EAAC;EAAM;EAAa;EAAU;CAAQ,CAAC;CAE1C,IAAI,UAAU,QAAQ,WAAW,GAC/B,OAAO;CAGT,OACE,qBAAC,gBAAD;EACS;EACP,OAAO,cAAc,KAAK,OAAO,OAAO;EAClC;EACI;YAJZ,CAME,oBAAC,SAAD;GAAa;GAAM,MAAK;GAAS,OAAO;EAAW,CAAA,GACnD,oBAAC,gBAAD;GACE,WAAW,cAAc,KAAK,OAAO,OAAO;GAC5C,UAAU,YAAY;GACtB,UAAU;GACD;GACT,UAAU,sBAAsB,KAAK,OAAO,UAAU;GACtD,OAAO;EACR,CAAA,CACa;;AAEpB"}
1
+ {"version":3,"file":"choice.js","names":[],"sources":["../../../../resources/js/form/components/fields/choice.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport type { Option, RendererComponent } from \"@lattice/lattice/core/types\";\nimport { SegmentedPills } from \"@lattice/lattice/core/components/segmented-pills\";\nimport { FormFieldFrame } from \"../base/field\";\nimport { useControlledField } from \"../use-controlled-field\";\nimport { useResolvedNode } from \"../resolved-nodes\";\nimport { useSeedDefault } from \"../use-seed-default\";\n\nexport const ChoiceComponent: RendererComponent<\"form.choice\"> = ({ node }) => {\n const resolvedNode = useResolvedNode(node);\n const { name, value, error, hidden, required, readOnly, disabled, commit } =\n useControlledField(node);\n const options = useMemo(\n () => (resolvedNode.props as { options?: Option[] }).options ?? [],\n [resolvedNode.props],\n );\n const fallbackValue = options[0]?.value ?? \"\";\n const selected = value || fallbackValue;\n\n useSeedDefault(name, selected || undefined);\n\n if (hidden || options.length === 0) {\n return null;\n }\n\n return (\n <FormFieldFrame\n error={error}\n helperText={node.props.helperText ?? undefined}\n label={node.props.label ?? \"\"}\n name={name}\n required={required}\n >\n <input name={name} type=\"hidden\" value={selected} />\n <SegmentedPills\n ariaLabel={node.props.label ?? undefined}\n autoFocus={node.props.autoFocus ?? undefined}\n disabled={readOnly || disabled}\n name={name}\n onSelect={commit}\n options={options}\n tabIndex={node.props.tabIndex ?? undefined}\n value={selected}\n />\n </FormFieldFrame>\n );\n};\n"],"mappings":";;;;;;;;AAQA,IAAa,mBAAqD,EAAE,WAAW;CAC7E,MAAM,eAAe,gBAAgB,IAAI;CACzC,MAAM,EAAE,MAAM,OAAO,OAAO,QAAQ,UAAU,UAAU,UAAU,WAChE,mBAAmB,IAAI;CACzB,MAAM,UAAU,cACP,aAAa,MAAiC,WAAW,CAAC,GACjE,CAAC,aAAa,KAAK,CACrB;CACA,MAAM,gBAAgB,QAAQ,IAAI,SAAS;CAC3C,MAAM,WAAW,SAAS;CAE1B,eAAe,MAAM,YAAY,KAAA,CAAS;CAE1C,IAAI,UAAU,QAAQ,WAAW,GAC/B,OAAO;CAGT,OACE,qBAAC,gBAAD;EACS;EACP,YAAY,KAAK,MAAM,cAAc,KAAA;EACrC,OAAO,KAAK,MAAM,SAAS;EACrB;EACI;YALZ,CAOE,oBAAC,SAAD;GAAa;GAAM,MAAK;GAAS,OAAO;EAAW,CAAA,GACnD,oBAAC,gBAAD;GACE,WAAW,KAAK,MAAM,SAAS,KAAA;GAC/B,WAAW,KAAK,MAAM,aAAa,KAAA;GACnC,UAAU,YAAY;GAChB;GACN,UAAU;GACD;GACT,UAAU,KAAK,MAAM,YAAY,KAAA;GACjC,OAAO;EACR,CAAA,CACa;;AAEpB"}
@@ -1,20 +1,2 @@
1
- import { RendererComponent } from '../../../../../core/types';
2
- declare module '../../../../../core/types' {
3
- interface ComponentProps {
4
- "form.date-input": {
5
- autoFocus?: boolean;
6
- conditions?: unknown;
7
- disabled?: boolean;
8
- hidden?: boolean;
9
- label?: string;
10
- max?: string;
11
- min?: string;
12
- name?: string;
13
- readonly?: boolean;
14
- required?: boolean;
15
- tabIndex?: number;
16
- value?: string;
17
- };
18
- }
19
- }
1
+ import { RendererComponent } from '../../../core/types';
20
2
  export declare const DateInputComponent: RendererComponent<"form.date-input">;
@@ -1,27 +1,22 @@
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
1
  import { Input } from "../base/input.js";
2
+ import { SimpleField } from "./simple-field.js";
5
3
  import { jsx } from "react/jsx-runtime";
6
4
  //#region resources/js/form/components/fields/date-input.tsx
7
5
  var DateInputComponent = ({ 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
- autoFocus: getBooleanProp(node.props, "autoFocus"),
6
+ const props = node.props;
7
+ return /* @__PURE__ */ jsx(SimpleField, {
8
+ node,
9
+ label: props.label ?? "",
10
+ children: ({ name, value, readOnly, disabled, commit }) => /* @__PURE__ */ jsx(Input, {
11
+ autoFocus: props.autoFocus ?? false,
17
12
  disabled,
18
13
  id: name,
19
- max: getStringProp(node.props, "max") || void 0,
20
- min: getStringProp(node.props, "min") || void 0,
14
+ max: props.max || void 0,
15
+ min: props.min || void 0,
21
16
  name,
22
17
  onChange: (event) => commit(event.target.value),
23
- readOnly: readonly,
24
- tabIndex: getOptionalNumberProp(node.props, "tabIndex"),
18
+ readOnly,
19
+ tabIndex: props.tabIndex ?? void 0,
25
20
  type: "date",
26
21
  value
27
22
  })
@@ -1 +1 @@
1
- {"version":3,"file":"date-input.js","names":[],"sources":["../../../../resources/js/form/components/fields/date-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.date-input\": {\n autoFocus?: boolean;\n conditions?: unknown;\n disabled?: boolean;\n hidden?: boolean;\n label?: string;\n max?: string;\n min?: string;\n name?: string;\n readonly?: boolean;\n required?: boolean;\n tabIndex?: number;\n value?: string;\n };\n }\n}\n\nexport const DateInputComponent: RendererComponent<\"form.date-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 autoFocus={getBooleanProp(node.props, \"autoFocus\")}\n disabled={disabled}\n id={name}\n max={getStringProp(node.props, \"max\") || undefined}\n min={getStringProp(node.props, \"min\") || undefined}\n name={name}\n onChange={(event) => commit(event.target.value)}\n readOnly={readonly}\n tabIndex={getOptionalNumberProp(node.props, \"tabIndex\")}\n type=\"date\"\n value={value}\n />\n </FormFieldFrame>\n );\n};\n"],"mappings":";;;;;;AAyBA,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,WAAW,eAAe,KAAK,OAAO,WAAW;GACvC;GACV,IAAI;GACJ,KAAK,cAAc,KAAK,OAAO,KAAK,KAAK,KAAA;GACzC,KAAK,cAAc,KAAK,OAAO,KAAK,KAAK,KAAA;GACnC;GACN,WAAW,UAAU,OAAO,MAAM,OAAO,KAAK;GAC9C,UAAU;GACV,UAAU,sBAAsB,KAAK,OAAO,UAAU;GACtD,MAAK;GACE;EACR,CAAA;CACa,CAAA;AAEpB"}
1
+ {"version":3,"file":"date-input.js","names":[],"sources":["../../../../resources/js/form/components/fields/date-input.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice/lattice/core/types\";\nimport { Input } from \"../base/input\";\nimport { SimpleField } from \"./simple-field\";\n\nexport const DateInputComponent: RendererComponent<\"form.date-input\"> = ({ node }) => {\n const props = node.props;\n\n return (\n <SimpleField node={node} label={props.label ?? \"\"}>\n {({ name, value, readOnly, disabled, commit }) => (\n <Input\n autoFocus={props.autoFocus ?? false}\n disabled={disabled}\n id={name}\n max={props.max || undefined}\n min={props.min || undefined}\n name={name}\n onChange={(event) => commit(event.target.value)}\n readOnly={readOnly}\n tabIndex={props.tabIndex ?? undefined}\n type=\"date\"\n value={value}\n />\n )}\n </SimpleField>\n );\n};\n"],"mappings":";;;;AAIA,IAAa,sBAA4D,EAAE,WAAW;CACpF,MAAM,QAAQ,KAAK;CAEnB,OACE,oBAAC,aAAD;EAAmB;EAAM,OAAO,MAAM,SAAS;aAC3C,EAAE,MAAM,OAAO,UAAU,UAAU,aACnC,oBAAC,OAAD;GACE,WAAW,MAAM,aAAa;GACpB;GACV,IAAI;GACJ,KAAK,MAAM,OAAO,KAAA;GAClB,KAAK,MAAM,OAAO,KAAA;GACZ;GACN,WAAW,UAAU,OAAO,MAAM,OAAO,KAAK;GACpC;GACV,UAAU,MAAM,YAAY,KAAA;GAC5B,MAAK;GACE;EACR,CAAA;CAEQ,CAAA;AAEjB"}
@@ -1,10 +1,2 @@
1
- import { RendererComponent } from '../../../../../core/types';
2
- declare module '../../../../../core/types' {
3
- interface ComponentProps {
4
- "form.hidden-input": {
5
- name?: string;
6
- value?: string;
7
- };
8
- }
9
- }
1
+ import { RendererComponent } from '../../../core/types';
10
2
  export declare const HiddenInputComponent: RendererComponent<"form.hidden-input">;
@@ -1,9 +1,8 @@
1
- import { getStringProp } from "../../../core/props.js";
2
1
  import { jsx } from "react/jsx-runtime";
3
2
  //#region resources/js/form/components/fields/hidden-input.tsx
4
3
  var HiddenInputComponent = ({ node }) => /* @__PURE__ */ jsx("input", {
5
- defaultValue: getStringProp(node.props, "value"),
6
- name: getStringProp(node.props, "name"),
4
+ defaultValue: typeof node.props.value === "string" ? node.props.value : "",
5
+ name: node.props.name,
7
6
  type: "hidden"
8
7
  });
9
8
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"hidden-input.js","names":[],"sources":["../../../../resources/js/form/components/fields/hidden-input.tsx"],"sourcesContent":["import { getStringProp } from \"@lattice/lattice/core/props\";\nimport type { RendererComponent } from \"@lattice/lattice/core/types\";\n\ndeclare module \"@lattice/lattice/core/types\" {\n interface ComponentProps {\n \"form.hidden-input\": {\n name?: string;\n value?: string;\n };\n }\n}\n\nexport const HiddenInputComponent: RendererComponent<\"form.hidden-input\"> = ({ node }) => (\n <input\n defaultValue={getStringProp(node.props, \"value\")}\n name={getStringProp(node.props, \"name\")}\n type=\"hidden\"\n />\n);\n"],"mappings":";;;AAYA,IAAa,wBAAgE,EAAE,WAC7E,oBAAC,SAAD;CACE,cAAc,cAAc,KAAK,OAAO,OAAO;CAC/C,MAAM,cAAc,KAAK,OAAO,MAAM;CACtC,MAAK;AACN,CAAA"}
1
+ {"version":3,"file":"hidden-input.js","names":[],"sources":["../../../../resources/js/form/components/fields/hidden-input.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice/lattice/core/types\";\n\nexport const HiddenInputComponent: RendererComponent<\"form.hidden-input\"> = ({ node }) => (\n <input\n defaultValue={typeof node.props.value === \"string\" ? node.props.value : \"\"}\n name={node.props.name}\n type=\"hidden\"\n />\n);\n"],"mappings":";;AAEA,IAAa,wBAAgE,EAAE,WAC7E,oBAAC,SAAD;CACE,cAAc,OAAO,KAAK,MAAM,UAAU,WAAW,KAAK,MAAM,QAAQ;CACxE,MAAM,KAAK,MAAM;CACjB,MAAK;AACN,CAAA"}
@@ -1,23 +1,2 @@
1
- import { RendererComponent } from '../../../../../core/types';
2
- declare module '../../../../../core/types' {
3
- interface ComponentProps {
4
- "form.number-input": {
5
- autoFocus?: boolean;
6
- conditions?: unknown;
7
- disabled?: boolean;
8
- hidden?: boolean;
9
- label?: string;
10
- max?: number;
11
- min?: number;
12
- name?: string;
13
- placeholder?: string;
14
- readonly?: boolean;
15
- required?: boolean;
16
- slider?: boolean;
17
- step?: number;
18
- tabIndex?: number;
19
- value?: string;
20
- };
21
- }
22
- }
1
+ import { RendererComponent } from '../../../core/types';
23
2
  export declare const NumberInputComponent: RendererComponent<"form.number-input">;