@lattice-php/lattice 0.2.0 → 0.3.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 (476) hide show
  1. package/README.md +3 -1
  2. package/dist/action/components/action-form.d.ts +2 -2
  3. package/dist/action/components/action-form.js +35 -67
  4. package/dist/action/components/action-form.js.map +1 -1
  5. package/dist/action/components/action-group.js +18 -6
  6. package/dist/action/components/action-group.js.map +1 -1
  7. package/dist/action/components/action-menu-context.d.ts +6 -0
  8. package/dist/action/components/action-menu-context.js +18 -0
  9. package/dist/action/components/action-menu-context.js.map +1 -0
  10. package/dist/action/components/action.js +20 -13
  11. package/dist/action/components/action.js.map +1 -1
  12. package/dist/action/index.js.map +1 -1
  13. package/dist/appearance/index.js +7 -2
  14. package/dist/appearance/index.js.map +1 -1
  15. package/dist/chat/components/chat-box.d.ts +3 -0
  16. package/dist/chat/components/chat-box.js +53 -0
  17. package/dist/chat/components/chat-box.js.map +1 -0
  18. package/dist/chat/components/message-list.d.ts +5 -0
  19. package/dist/chat/components/message-list.js +22 -0
  20. package/dist/chat/components/message-list.js.map +1 -0
  21. package/dist/chat/components/message.d.ts +5 -0
  22. package/dist/chat/components/message.js +20 -0
  23. package/dist/chat/components/message.js.map +1 -0
  24. package/dist/chat/components/prompt-input.d.ts +8 -0
  25. package/dist/chat/components/prompt-input.js +49 -0
  26. package/dist/chat/components/prompt-input.js.map +1 -0
  27. package/dist/chat/index.d.ts +1 -0
  28. package/dist/chat/index.js +15 -0
  29. package/dist/chat/index.js.map +1 -0
  30. package/dist/chat/parts/text.d.ts +3 -0
  31. package/dist/chat/parts/text.js +12 -0
  32. package/dist/chat/parts/text.js.map +1 -0
  33. package/dist/chat/parts/tool-call.d.ts +3 -0
  34. package/dist/chat/parts/tool-call.js +20 -0
  35. package/dist/chat/parts/tool-call.js.map +1 -0
  36. package/dist/chat/transport.d.ts +2 -0
  37. package/dist/chat/transport.js +47 -0
  38. package/dist/chat/transport.js.map +1 -0
  39. package/dist/chat/types.d.ts +39 -0
  40. package/dist/chat/use-chat.d.ts +15 -0
  41. package/dist/chat/use-chat.js +161 -0
  42. package/dist/chat/use-chat.js.map +1 -0
  43. package/dist/core/api.d.ts +18 -0
  44. package/dist/core/api.js +51 -0
  45. package/dist/core/api.js.map +1 -0
  46. package/dist/core/collapsed-context.d.ts +2 -0
  47. package/dist/core/collapsed-context.js +10 -0
  48. package/dist/core/collapsed-context.js.map +1 -0
  49. package/dist/core/column-sizing.d.ts +17 -0
  50. package/dist/core/column-sizing.js +61 -0
  51. package/dist/core/column-sizing.js.map +1 -0
  52. package/dist/core/components/badge.js.map +1 -1
  53. package/dist/core/components/button.d.ts +1 -1
  54. package/dist/core/components/button.js +4 -0
  55. package/dist/core/components/button.js.map +1 -1
  56. package/dist/core/components/card.js.map +1 -1
  57. package/dist/core/components/chart.d.ts +3 -0
  58. package/dist/core/components/chart.js +175 -0
  59. package/dist/core/components/chart.js.map +1 -0
  60. package/dist/{form/components/base → core/components}/checkbox.js +3 -3
  61. package/dist/{form/components/base → core/components}/checkbox.js.map +1 -1
  62. package/dist/core/components/combobox.d.ts +33 -0
  63. package/dist/core/components/combobox.js +99 -0
  64. package/dist/core/components/combobox.js.map +1 -0
  65. package/dist/core/components/confirm-dialog.js +6 -12
  66. package/dist/core/components/confirm-dialog.js.map +1 -1
  67. package/dist/core/components/control.d.ts +13 -0
  68. package/dist/core/components/control.js +27 -0
  69. package/dist/core/components/control.js.map +1 -0
  70. package/dist/core/components/dialog.d.ts +19 -0
  71. package/dist/core/components/dialog.js +75 -0
  72. package/dist/core/components/dialog.js.map +1 -0
  73. package/dist/core/components/dropdown-menu.d.ts +14 -0
  74. package/dist/core/components/dropdown-menu.js +42 -0
  75. package/dist/core/components/dropdown-menu.js.map +1 -0
  76. package/dist/core/components/floating-panel.d.ts +3 -0
  77. package/dist/core/components/floating-panel.js +65 -0
  78. package/dist/core/components/floating-panel.js.map +1 -0
  79. package/dist/core/components/fragment.js +25 -13
  80. package/dist/core/components/fragment.js.map +1 -1
  81. package/dist/core/components/grid.js.map +1 -1
  82. package/dist/core/components/heading.js.map +1 -1
  83. package/dist/core/components/icon.js +1 -0
  84. package/dist/core/components/icon.js.map +1 -1
  85. package/dist/core/components/index.js +8 -1
  86. package/dist/core/components/index.js.map +1 -1
  87. package/dist/core/components/info-tooltip.d.ts +3 -0
  88. package/dist/core/components/info-tooltip.js +26 -0
  89. package/dist/core/components/info-tooltip.js.map +1 -0
  90. package/dist/core/components/link.js +12 -6
  91. package/dist/core/components/link.js.map +1 -1
  92. package/dist/core/components/modal.js +9 -31
  93. package/dist/core/components/modal.js.map +1 -1
  94. package/dist/core/components/popover.d.ts +8 -0
  95. package/dist/core/components/popover.js +37 -0
  96. package/dist/core/components/popover.js.map +1 -0
  97. package/dist/core/components/raw-block.d.ts +3 -0
  98. package/dist/core/components/raw-block.js +10 -0
  99. package/dist/core/components/raw-block.js.map +1 -0
  100. package/dist/core/components/section.js +6 -10
  101. package/dist/core/components/section.js.map +1 -1
  102. package/dist/core/components/segmented-control.js.map +1 -1
  103. package/dist/core/components/segmented-pills.js.map +1 -1
  104. package/dist/core/components/skeleton.d.ts +3 -0
  105. package/dist/core/components/skeleton.js +16 -0
  106. package/dist/core/components/skeleton.js.map +1 -0
  107. package/dist/core/components/spinner.js.map +1 -1
  108. package/dist/core/components/stack.js +19 -8
  109. package/dist/core/components/stack.js.map +1 -1
  110. package/dist/core/components/tabs.js.map +1 -1
  111. package/dist/core/components/text.js +17 -1
  112. package/dist/core/components/text.js.map +1 -1
  113. package/dist/core/headers.d.ts +1 -0
  114. package/dist/core/headers.js +14 -0
  115. package/dist/core/headers.js.map +1 -0
  116. package/dist/core/registry-context.d.ts +21 -0
  117. package/dist/core/registry-context.js +40 -0
  118. package/dist/core/registry-context.js.map +1 -0
  119. package/dist/core/registry.d.ts +4 -1
  120. package/dist/core/registry.js +10 -1
  121. package/dist/core/registry.js.map +1 -1
  122. package/dist/core/renderer.d.ts +8 -14
  123. package/dist/core/renderer.js +17 -27
  124. package/dist/core/renderer.js.map +1 -1
  125. package/dist/core/test-id.d.ts +8 -0
  126. package/dist/core/test-id.js +21 -0
  127. package/dist/core/test-id.js.map +1 -0
  128. package/dist/core/types.d.ts +22 -8
  129. package/dist/core/use-column-resizing.d.ts +27 -0
  130. package/dist/core/use-column-resizing.js +228 -0
  131. package/dist/core/use-column-resizing.js.map +1 -0
  132. package/dist/effects/dispatch.d.ts +20 -0
  133. package/dist/effects/dispatch.js +39 -0
  134. package/dist/effects/dispatch.js.map +1 -0
  135. package/dist/effects/registry.d.ts +38 -0
  136. package/dist/effects/registry.js +51 -0
  137. package/dist/effects/registry.js.map +1 -0
  138. package/dist/effects/use-effect-dispatcher.d.ts +8 -0
  139. package/dist/effects/use-effect-dispatcher.js +20 -0
  140. package/dist/effects/use-effect-dispatcher.js.map +1 -0
  141. package/dist/effects/use-flash-effects.d.ts +5 -0
  142. package/dist/effects/use-flash-effects.js +22 -0
  143. package/dist/effects/use-flash-effects.js.map +1 -0
  144. package/dist/events/event-bridge.d.ts +3 -7
  145. package/dist/events/event-bridge.js +17 -47
  146. package/dist/events/event-bridge.js.map +1 -1
  147. package/dist/events/event-names.d.ts +3 -1
  148. package/dist/events/event-names.js +3 -1
  149. package/dist/events/event-names.js.map +1 -1
  150. package/dist/form/components/base/field.d.ts +2 -1
  151. package/dist/form/components/base/field.js +17 -2
  152. package/dist/form/components/base/field.js.map +1 -1
  153. package/dist/form/components/base/input-error.js +1 -1
  154. package/dist/form/components/base/input-error.js.map +1 -1
  155. package/dist/form/components/base/input.js +2 -1
  156. package/dist/form/components/base/input.js.map +1 -1
  157. package/dist/form/components/base/label.js.map +1 -1
  158. package/dist/form/components/base/password-input.js.map +1 -1
  159. package/dist/form/components/base/submit-button.js +3 -1
  160. package/dist/form/components/base/submit-button.js.map +1 -1
  161. package/dist/form/components/base/textarea.js +2 -1
  162. package/dist/form/components/base/textarea.js.map +1 -1
  163. package/dist/form/components/conditions.js.map +1 -1
  164. package/dist/form/components/context.d.ts +1 -0
  165. package/dist/form/components/context.js +1 -0
  166. package/dist/form/components/context.js.map +1 -1
  167. package/dist/form/components/field-props.d.ts +4 -0
  168. package/dist/form/components/field-props.js.map +1 -1
  169. package/dist/form/components/field-scope.d.ts +21 -0
  170. package/dist/form/components/field-scope.js +54 -0
  171. package/dist/form/components/field-scope.js.map +1 -0
  172. package/dist/form/components/fields/block-add-menu.d.ts +9 -0
  173. package/dist/form/components/fields/block-add-menu.js +27 -0
  174. package/dist/form/components/fields/block-add-menu.js.map +1 -0
  175. package/dist/form/components/fields/builder.d.ts +2 -0
  176. package/dist/form/components/fields/builder.js +124 -0
  177. package/dist/form/components/fields/builder.js.map +1 -0
  178. package/dist/form/components/fields/checkbox.d.ts +1 -1
  179. package/dist/form/components/fields/checkbox.js +14 -11
  180. package/dist/form/components/fields/checkbox.js.map +1 -1
  181. package/dist/form/components/fields/choice.d.ts +1 -1
  182. package/dist/form/components/fields/choice.js +5 -4
  183. package/dist/form/components/fields/choice.js.map +1 -1
  184. package/dist/form/components/fields/date-input.d.ts +1 -1
  185. package/dist/form/components/fields/date-input.js +2 -1
  186. package/dist/form/components/fields/date-input.js.map +1 -1
  187. package/dist/form/components/fields/file-upload.d.ts +2 -0
  188. package/dist/form/components/fields/file-upload.js +250 -0
  189. package/dist/form/components/fields/file-upload.js.map +1 -0
  190. package/dist/form/components/fields/hidden-input.d.ts +1 -1
  191. package/dist/form/components/fields/hidden-input.js +11 -5
  192. package/dist/form/components/fields/hidden-input.js.map +1 -1
  193. package/dist/form/components/fields/number-input.d.ts +1 -1
  194. package/dist/form/components/fields/number-input.js +3 -1
  195. package/dist/form/components/fields/number-input.js.map +1 -1
  196. package/dist/form/components/fields/password-input.d.ts +1 -1
  197. package/dist/form/components/fields/password-input.js +31 -22
  198. package/dist/form/components/fields/password-input.js.map +1 -1
  199. package/dist/form/components/fields/repeater-rows.d.ts +12 -0
  200. package/dist/form/components/fields/repeater-rows.js +46 -0
  201. package/dist/form/components/fields/repeater-rows.js.map +1 -0
  202. package/dist/form/components/fields/repeater.d.ts +2 -0
  203. package/dist/form/components/fields/repeater.js +97 -0
  204. package/dist/form/components/fields/repeater.js.map +1 -0
  205. package/dist/form/components/fields/rich-editor.d.ts +1 -1
  206. package/dist/form/components/fields/rich-editor.js +37 -9
  207. package/dist/form/components/fields/rich-editor.js.map +1 -1
  208. package/dist/form/components/fields/row-action-menu.d.ts +17 -0
  209. package/dist/form/components/fields/row-action-menu.js +61 -0
  210. package/dist/form/components/fields/row-action-menu.js.map +1 -0
  211. package/dist/form/components/fields/row-actions.d.ts +10 -0
  212. package/dist/form/components/fields/row-actions.js +45 -0
  213. package/dist/form/components/fields/row-actions.js.map +1 -0
  214. package/dist/form/components/fields/row-item.d.ts +27 -0
  215. package/dist/form/components/fields/row-item.js +69 -0
  216. package/dist/form/components/fields/row-item.js.map +1 -0
  217. package/dist/form/components/fields/select.d.ts +1 -1
  218. package/dist/form/components/fields/select.js +69 -104
  219. package/dist/form/components/fields/select.js.map +1 -1
  220. package/dist/form/components/fields/simple-field.js +1 -0
  221. package/dist/form/components/fields/simple-field.js.map +1 -1
  222. package/dist/form/components/fields/table-rows.d.ts +32 -0
  223. package/dist/form/components/fields/table-rows.js +188 -0
  224. package/dist/form/components/fields/table-rows.js.map +1 -0
  225. package/dist/form/components/fields/text-input.d.ts +1 -1
  226. package/dist/form/components/fields/text-input.js +2 -1
  227. package/dist/form/components/fields/text-input.js.map +1 -1
  228. package/dist/form/components/fields/textarea.d.ts +1 -1
  229. package/dist/form/components/fields/textarea.js +2 -1
  230. package/dist/form/components/fields/textarea.js.map +1 -1
  231. package/dist/form/components/fields/use-flip-reorder.d.ts +6 -0
  232. package/dist/form/components/fields/use-flip-reorder.js +51 -0
  233. package/dist/form/components/fields/use-flip-reorder.js.map +1 -0
  234. package/dist/form/components/fields/use-row-collection.d.ts +11 -0
  235. package/dist/form/components/fields/use-row-collection.js +44 -0
  236. package/dist/form/components/fields/use-row-collection.js.map +1 -0
  237. package/dist/form/components/form-path.d.ts +5 -0
  238. package/dist/form/components/form-path.js +40 -0
  239. package/dist/form/components/form-path.js.map +1 -0
  240. package/dist/form/components/form-transport.d.ts +3 -4
  241. package/dist/form/components/form-transport.js +17 -18
  242. package/dist/form/components/form-transport.js.map +1 -1
  243. package/dist/form/components/form.js +24 -18
  244. package/dist/form/components/form.js.map +1 -1
  245. package/dist/form/components/index.d.ts +3 -0
  246. package/dist/form/components/index.js +4 -1
  247. package/dist/form/components/override-keys.d.ts +2 -0
  248. package/dist/form/components/override-keys.js +12 -0
  249. package/dist/form/components/override-keys.js.map +1 -0
  250. package/dist/form/components/prefill-context.d.ts +5 -0
  251. package/dist/form/components/prefill-context.js +11 -0
  252. package/dist/form/components/prefill-context.js.map +1 -0
  253. package/dist/form/components/prefill-targets.d.ts +17 -0
  254. package/dist/form/components/prefill-targets.js +73 -0
  255. package/dist/form/components/prefill-targets.js.map +1 -0
  256. package/dist/form/components/resolved-nodes.js +4 -1
  257. package/dist/form/components/resolved-nodes.js.map +1 -1
  258. package/dist/form/components/row-layout-context.d.ts +5 -0
  259. package/dist/form/components/row-layout-context.js +18 -0
  260. package/dist/form/components/row-layout-context.js.map +1 -0
  261. package/dist/form/components/use-controlled-field.d.ts +2 -0
  262. package/dist/form/components/use-controlled-field.js +13 -5
  263. package/dist/form/components/use-controlled-field.js.map +1 -1
  264. package/dist/form/components/use-dependent-field.js +7 -1
  265. package/dist/form/components/use-dependent-field.js.map +1 -1
  266. package/dist/form/components/use-field-commit.d.ts +4 -0
  267. package/dist/form/components/use-field-commit.js +21 -7
  268. package/dist/form/components/use-field-commit.js.map +1 -1
  269. package/dist/form/components/use-form-resolver.d.ts +6 -1
  270. package/dist/form/components/use-form-resolver.js +50 -5
  271. package/dist/form/components/use-form-resolver.js.map +1 -1
  272. package/dist/form/components/use-seed-default.js +8 -3
  273. package/dist/form/components/use-seed-default.js.map +1 -1
  274. package/dist/form/components/values.js +20 -5
  275. package/dist/form/components/values.js.map +1 -1
  276. package/dist/form/index.js +13 -10
  277. package/dist/form/index.js.map +1 -1
  278. package/dist/form/skeleton.js +5 -4
  279. package/dist/form/skeleton.js.map +1 -1
  280. package/dist/i18n/backend.d.ts +7 -5
  281. package/dist/i18n/backend.js +23 -8
  282. package/dist/i18n/backend.js.map +1 -1
  283. package/dist/i18n/config.d.ts +6 -0
  284. package/dist/i18n/config.js +36 -0
  285. package/dist/i18n/config.js.map +1 -0
  286. package/dist/i18n/index.d.ts +7 -1
  287. package/dist/i18n/index.js +5 -1
  288. package/dist/i18n/instance.d.ts +27 -0
  289. package/dist/i18n/instance.js +63 -16
  290. package/dist/i18n/instance.js.map +1 -1
  291. package/dist/i18n/locale-reload.d.ts +3 -0
  292. package/dist/i18n/locale-reload.js +17 -0
  293. package/dist/i18n/locale-reload.js.map +1 -0
  294. package/dist/i18n/locale-switcher.d.ts +21 -0
  295. package/dist/i18n/locale-switcher.js +25 -0
  296. package/dist/i18n/locale-switcher.js.map +1 -0
  297. package/dist/i18n/locale.d.ts +9 -0
  298. package/dist/i18n/locale.js +93 -0
  299. package/dist/i18n/locale.js.map +1 -0
  300. package/dist/i18n/page-props.d.ts +3 -0
  301. package/dist/i18n/page-props.js +24 -0
  302. package/dist/i18n/page-props.js.map +1 -0
  303. package/dist/index.d.ts +18 -8
  304. package/dist/index.js +18 -7
  305. package/dist/inertia.d.ts +2 -1
  306. package/dist/inertia.js +9 -2
  307. package/dist/inertia.js.map +1 -1
  308. package/dist/lattice.css +49 -16
  309. package/dist/layout/breadcrumbs.d.ts +3 -0
  310. package/dist/layout/breadcrumbs.js +34 -0
  311. package/dist/layout/breadcrumbs.js.map +1 -0
  312. package/dist/layout/callouts.d.ts +3 -0
  313. package/dist/layout/callouts.js +67 -0
  314. package/dist/layout/callouts.js.map +1 -0
  315. package/dist/layout/components.js +6 -0
  316. package/dist/layout/components.js.map +1 -1
  317. package/dist/layout/context.d.ts +2 -10
  318. package/dist/layout/context.js +3 -14
  319. package/dist/layout/context.js.map +1 -1
  320. package/dist/layout/dropdown.d.ts +3 -0
  321. package/dist/layout/dropdown.js +23 -0
  322. package/dist/layout/dropdown.js.map +1 -0
  323. package/dist/layout/index.d.ts +2 -1
  324. package/dist/layout/index.js +3 -1
  325. package/dist/layout/menu-item.js +30 -59
  326. package/dist/layout/menu-item.js.map +1 -1
  327. package/dist/layout/menu.js.map +1 -1
  328. package/dist/layout/outlet.js +2 -2
  329. package/dist/layout/outlet.js.map +1 -1
  330. package/dist/layout/popover.d.ts +17 -0
  331. package/dist/layout/popover.js +46 -0
  332. package/dist/layout/popover.js.map +1 -0
  333. package/dist/layout/schema-layout.js +2 -9
  334. package/dist/layout/schema-layout.js.map +1 -1
  335. package/dist/layout/sidebar.js +3 -3
  336. package/dist/layout/sidebar.js.map +1 -1
  337. package/dist/page.js +3 -9
  338. package/dist/page.js.map +1 -1
  339. package/dist/provider.d.ts +2 -4
  340. package/dist/provider.js +5 -9
  341. package/dist/provider.js.map +1 -1
  342. package/dist/registry.js +2 -1
  343. package/dist/registry.js.map +1 -1
  344. package/dist/svg-sprite-client/index.d.ts +1 -0
  345. package/dist/svg-sprite-client/index.js +0 -0
  346. package/dist/svg-sprite-client.d.ts +1 -0
  347. package/dist/table/align.d.ts +4 -0
  348. package/dist/table/align.js +23 -0
  349. package/dist/table/align.js.map +1 -0
  350. package/dist/table/bulk.js +1 -1
  351. package/dist/table/bulk.js.map +1 -1
  352. package/dist/table/components/bulk-bar.js +8 -5
  353. package/dist/table/components/bulk-bar.js.map +1 -1
  354. package/dist/table/components/cells/badge-cell.d.ts +2 -5
  355. package/dist/table/components/cells/badge-cell.js +3 -3
  356. package/dist/table/components/cells/badge-cell.js.map +1 -1
  357. package/dist/table/components/cells/boolean-cell.d.ts +3 -0
  358. package/dist/table/components/cells/boolean-cell.js +23 -0
  359. package/dist/table/components/cells/boolean-cell.js.map +1 -0
  360. package/dist/table/components/cells/icon-cell.d.ts +2 -5
  361. package/dist/table/components/cells/icon-cell.js +4 -5
  362. package/dist/table/components/cells/icon-cell.js.map +1 -1
  363. package/dist/table/components/cells/image-cell.d.ts +2 -5
  364. package/dist/table/components/cells/image-cell.js +4 -5
  365. package/dist/table/components/cells/image-cell.js.map +1 -1
  366. package/dist/table/components/cells/money-cell.d.ts +2 -0
  367. package/dist/table/components/cells/money-cell.js +28 -0
  368. package/dist/table/components/cells/money-cell.js.map +1 -0
  369. package/dist/table/components/cells/number-cell.d.ts +2 -0
  370. package/dist/table/components/cells/number-cell.js +25 -0
  371. package/dist/table/components/cells/number-cell.js.map +1 -0
  372. package/dist/table/components/cells/numeric.d.ts +2 -0
  373. package/dist/table/components/cells/numeric.js +10 -0
  374. package/dist/table/components/cells/numeric.js.map +1 -0
  375. package/dist/table/components/cells/stack-cell.d.ts +3 -0
  376. package/dist/table/components/cells/stack-cell.js +17 -0
  377. package/dist/table/components/cells/stack-cell.js.map +1 -0
  378. package/dist/table/components/cells/text-cell.d.ts +2 -6
  379. package/dist/table/components/cells/text-cell.js +5 -6
  380. package/dist/table/components/cells/text-cell.js.map +1 -1
  381. package/dist/table/components/column-filter-control.d.ts +3 -1
  382. package/dist/table/components/column-filter-control.js +73 -11
  383. package/dist/table/components/column-filter-control.js.map +1 -1
  384. package/dist/table/components/column-header.d.ts +3 -1
  385. package/dist/table/components/column-header.js +11 -8
  386. package/dist/table/components/column-header.js.map +1 -1
  387. package/dist/table/components/filter-bar.d.ts +15 -0
  388. package/dist/table/components/filter-bar.js +81 -0
  389. package/dist/table/components/filter-bar.js.map +1 -0
  390. package/dist/table/components/filter-controls.d.ts +18 -0
  391. package/dist/table/components/filter-controls.js +256 -0
  392. package/dist/table/components/filter-controls.js.map +1 -0
  393. package/dist/table/components/filter-stack-bar.js.map +1 -1
  394. package/dist/table/components/filter-value-input.d.ts +1 -0
  395. package/dist/table/components/filter-value-input.js +6 -5
  396. package/dist/table/components/filter-value-input.js.map +1 -1
  397. package/dist/table/components/pagination.js +1 -1
  398. package/dist/table/components/pagination.js.map +1 -1
  399. package/dist/table/components/sort-bar.js.map +1 -1
  400. package/dist/table/components/table-action-node.js.map +1 -1
  401. package/dist/table/components/table-cell.d.ts +1 -1
  402. package/dist/table/components/table-cell.js +18 -28
  403. package/dist/table/components/table-cell.js.map +1 -1
  404. package/dist/table/components/table.js +191 -152
  405. package/dist/table/components/table.js.map +1 -1
  406. package/dist/table/filter-values.d.ts +13 -0
  407. package/dist/table/filter-values.js +30 -0
  408. package/dist/table/filter-values.js.map +1 -0
  409. package/dist/table/format.js.map +1 -1
  410. package/dist/table/index.js.map +1 -1
  411. package/dist/table/payload.js +24 -3
  412. package/dist/table/payload.js.map +1 -1
  413. package/dist/table/query.d.ts +10 -1
  414. package/dist/table/query.js +60 -6
  415. package/dist/table/query.js.map +1 -1
  416. package/dist/table/registry.d.ts +19 -0
  417. package/dist/table/registry.js +14 -0
  418. package/dist/table/registry.js.map +1 -0
  419. package/dist/table/types.d.ts +9 -19
  420. package/dist/table/use-table.d.ts +7 -2
  421. package/dist/table/use-table.js +57 -7
  422. package/dist/table/use-table.js.map +1 -1
  423. package/dist/toast/callout.d.ts +6 -0
  424. package/dist/toast/callout.js +31 -0
  425. package/dist/toast/callout.js.map +1 -0
  426. package/dist/toast/index.d.ts +4 -0
  427. package/dist/toast/index.js +3 -1
  428. package/dist/toast/toast.d.ts +14 -0
  429. package/dist/toast/toast.js +51 -0
  430. package/dist/toast/toast.js.map +1 -0
  431. package/dist/toast/toaster.js +10 -74
  432. package/dist/toast/toaster.js.map +1 -1
  433. package/dist/toast/variant-styles.d.ts +6 -0
  434. package/dist/toast/variant-styles.js +37 -0
  435. package/dist/toast/variant-styles.js.map +1 -0
  436. package/dist/types/generated.d.ts +461 -101
  437. package/dist/types/vite-env.d.ts +1 -0
  438. package/dist/vite.d.ts +25 -0
  439. package/dist/vite.js +72 -0
  440. package/dist/vite.js.map +1 -0
  441. package/package.json +111 -13
  442. package/resources/icons/rotate-ccw.svg +16 -0
  443. package/dist/_virtual/_rolldown/runtime.js +0 -8
  444. package/dist/action/effects.d.ts +0 -11
  445. package/dist/action/effects.js +0 -44
  446. package/dist/action/effects.js.map +0 -1
  447. package/dist/node_modules/i18next/dist/esm/i18next.js +0 -1982
  448. package/dist/node_modules/i18next/dist/esm/i18next.js.map +0 -1
  449. package/dist/node_modules/i18next-http-backend/esm/index.js +0 -352
  450. package/dist/node_modules/i18next-http-backend/esm/index.js.map +0 -1
  451. package/dist/node_modules/react-i18next/dist/es/context.js +0 -23
  452. package/dist/node_modules/react-i18next/dist/es/context.js.map +0 -1
  453. package/dist/node_modules/react-i18next/dist/es/defaults.js +0 -29
  454. package/dist/node_modules/react-i18next/dist/es/defaults.js.map +0 -1
  455. package/dist/node_modules/react-i18next/dist/es/i18nInstance.js +0 -10
  456. package/dist/node_modules/react-i18next/dist/es/i18nInstance.js.map +0 -1
  457. package/dist/node_modules/react-i18next/dist/es/initReactI18next.js +0 -14
  458. package/dist/node_modules/react-i18next/dist/es/initReactI18next.js.map +0 -1
  459. package/dist/node_modules/react-i18next/dist/es/unescape.js +0 -30
  460. package/dist/node_modules/react-i18next/dist/es/unescape.js.map +0 -1
  461. package/dist/node_modules/react-i18next/dist/es/useTranslation.js +0 -157
  462. package/dist/node_modules/react-i18next/dist/es/useTranslation.js.map +0 -1
  463. package/dist/node_modules/react-i18next/dist/es/utils.js +0 -58
  464. package/dist/node_modules/react-i18next/dist/es/utils.js.map +0 -1
  465. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -70
  466. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +0 -1
  467. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +0 -61
  468. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +0 -1
  469. package/dist/node_modules/use-sync-external-store/shim/index.js +0 -13
  470. package/dist/node_modules/use-sync-external-store/shim/index.js.map +0 -1
  471. package/dist/table/column-registry.d.ts +0 -9
  472. package/dist/test-support.d.ts +0 -14
  473. package/dist/test-support.js +0 -14
  474. package/dist/test-support.js.map +0 -1
  475. /package/dist/{table/column-registry.js → chat/types.js} +0 -0
  476. /package/dist/{form/components/base → core/components}/checkbox.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"use-table.js","names":[],"sources":["../../resources/js/table/use-table.ts"],"sourcesContent":["import { withRefHeader } from \"@lattice/lattice/core/component-ref\";\nimport { LATTICE_EVENT, type ReloadComponentEvent } from \"@lattice/lattice/events/event-names\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { getColumns, getPagination, getRows, getState } from \"./payload\";\nimport { buildEndpoint, nextSort } from \"./query\";\nimport type {\n FilterClause,\n TableColumn,\n TableNode,\n TableResponse,\n TableSort,\n TableState,\n} from \"./types\";\n\nexport function useTable(node: TableNode) {\n const columns = useMemo(() => getColumns(node.props?.columns), [node.props?.columns]);\n const endpoint = typeof node.props?.endpoint === \"string\" ? node.props.endpoint : null;\n const componentRef = typeof node.props?.ref === \"string\" ? node.props.ref : \"\";\n const isLazy = node.props?.lazy === true;\n const initialState = useMemo(() => getState(node.props?.state), [node.props?.state]);\n const [rows, setRows] = useState(() => getRows(node.props?.data));\n const [pagination, setPagination] = useState(() => getPagination(node.props?.pagination));\n const [state, setState] = useState(initialState);\n const [processing, setProcessing] = useState(isLazy);\n const [hasLoaded, setHasLoaded] = useState(!isLazy);\n const infiniteLoaderRef = useRef<HTMLDivElement | null>(null);\n const currentPage = pagination.currentPage ?? state.page;\n const isInfinite = (pagination.mode ?? \"table\") === \"infinite\";\n\n const load = useCallback(\n async (nextState: TableState, append = false): Promise<void> => {\n if (!endpoint) {\n return;\n }\n\n setProcessing(true);\n\n try {\n const response = await fetch(buildEndpoint(endpoint, nextState), {\n headers: {\n Accept: \"application/json\",\n ...withRefHeader(componentRef),\n },\n });\n const result = (await response.json()) as TableResponse;\n const resultState = getState(result.state);\n const resultRows = getRows(result.data);\n\n setRows((currentRows) => (append ? [...currentRows, ...resultRows] : resultRows));\n setPagination(getPagination(result.pagination));\n setState(resultState);\n setHasLoaded(true);\n } finally {\n setProcessing(false);\n }\n },\n [endpoint, componentRef],\n );\n\n function sort(column: TableColumn): void {\n void load({\n ...state,\n page: 1,\n sorts: nextSort(state.sorts, column),\n });\n }\n\n function clearSort(sort: TableSort): void {\n void load({\n ...state,\n page: 1,\n sorts: state.sorts.filter((currentSort) => currentSort.key !== sort.key),\n });\n }\n\n function applyFilters(next: FilterClause[]): void {\n const nextState = { ...state, filters: next, page: 1 };\n\n setState(nextState);\n void load(nextState);\n }\n\n function addFilter(clause: FilterClause): void {\n applyFilters([...state.filters, clause]);\n }\n\n function updateFilter(index: number, clause: FilterClause): void {\n applyFilters(state.filters.map((current, position) => (position === index ? clause : current)));\n }\n\n function removeFilter(index: number): void {\n applyFilters(state.filters.filter((_, current) => current !== index));\n }\n\n function goToPage(page: number): void {\n void load({\n ...state,\n page,\n });\n }\n\n const loadMore = useCallback((): void => {\n if (processing || !pagination.hasMore) {\n return;\n }\n\n void load(\n {\n ...state,\n page: pagination.nextPage ?? currentPage + 1,\n },\n true,\n );\n }, [currentPage, load, pagination.hasMore, pagination.nextPage, processing, state]);\n\n useEffect(() => {\n if (!isLazy || hasLoaded) {\n return;\n }\n\n void load(state);\n }, [hasLoaded, isLazy, load, state]);\n\n useEffect(() => {\n function reload(event: Event): void {\n const detail = (event as ReloadComponentEvent).detail;\n\n if (detail?.component !== node.id) {\n return;\n }\n\n void load(state);\n }\n\n window.addEventListener(LATTICE_EVENT.reloadComponent, reload);\n\n return () => window.removeEventListener(LATTICE_EVENT.reloadComponent, reload);\n }, [load, node.id, state]);\n\n useEffect(() => {\n if (\n !isInfinite ||\n !pagination.hasMore ||\n processing ||\n !infiniteLoaderRef.current ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n loadMore();\n }\n },\n {\n rootMargin: \"240px\",\n },\n );\n\n observer.observe(infiniteLoaderRef.current);\n\n return () => observer.disconnect();\n }, [isInfinite, loadMore, pagination.hasMore, processing]);\n\n return {\n columns,\n rows,\n pagination,\n state,\n filters: state.filters,\n addFilter,\n updateFilter,\n removeFilter,\n processing,\n hasLoaded,\n infiniteLoaderRef,\n sort,\n clearSort,\n goToPage,\n loadMore,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-table.js","names":[],"sources":["../../resources/js/table/use-table.ts"],"sourcesContent":["import { apiFetch, apiJson } from \"@lattice-php/lattice/core/api\";\nimport { LATTICE_EVENT, type ReloadComponentEvent } from \"@lattice-php/lattice/events/event-names\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { Option } from \"@lattice-php/lattice/types/generated\";\nimport { isEmptyFilterValue } from \"./filter-values\";\nimport { getColumns, getPagination, getRows, getState } from \"./payload\";\nimport { buildEndpoint, nextSort } from \"./query\";\nimport type {\n FilterClause,\n TableColumn,\n TableNode,\n TableResponse,\n TableSort,\n TableState,\n} from \"./types\";\n\nexport function useTable(node: TableNode) {\n const columns = useMemo(() => getColumns(node.props?.columns), [node.props?.columns]);\n const endpoint = typeof node.props?.endpoint === \"string\" ? node.props.endpoint : null;\n const componentRef = typeof node.props?.ref === \"string\" ? node.props.ref : \"\";\n const isLazy = node.props?.lazy === true;\n const initialState = useMemo(() => getState(node.props?.state), [node.props?.state]);\n const initialRows = useMemo(() => getRows(node.props?.data), [node.props?.data]);\n const initialPagination = useMemo(\n () => getPagination(node.props?.pagination),\n [node.props?.pagination],\n );\n const [rows, setRows] = useState(initialRows);\n const [pagination, setPagination] = useState(initialPagination);\n const [state, setState] = useState(initialState);\n const [processing, setProcessing] = useState(isLazy);\n const [hasLoaded, setHasLoaded] = useState(!isLazy);\n const infiniteLoaderRef = useRef<HTMLDivElement | null>(null);\n const currentPage = pagination.currentPage ?? state.page;\n const isInfinite = (pagination.mode ?? \"table\") === \"infinite\";\n\n const load = useCallback(\n async (nextState: TableState, append = false): Promise<void> => {\n if (!endpoint) {\n return;\n }\n\n setProcessing(true);\n\n try {\n const result = await apiJson<TableResponse>(buildEndpoint(endpoint, nextState), {\n ref: componentRef,\n });\n const resultState = getState(result.state);\n const resultRows = getRows(result.data);\n\n setRows((currentRows) => (append ? [...currentRows, ...resultRows] : resultRows));\n setPagination(getPagination(result.pagination));\n setState(resultState);\n setHasLoaded(true);\n } finally {\n setProcessing(false);\n }\n },\n [endpoint, componentRef],\n );\n\n function sort(column: TableColumn): void {\n void load({\n ...state,\n page: 1,\n sorts: nextSort(state.sorts, column),\n });\n }\n\n function clearSort(sort: TableSort): void {\n void load({\n ...state,\n page: 1,\n sorts: state.sorts.filter((currentSort) => currentSort.key !== sort.key),\n });\n }\n\n function applyFilters(next: FilterClause[]): void {\n const nextState = { ...state, filters: next, page: 1 };\n\n setState(nextState);\n void load(nextState);\n }\n\n function addFilter(clause: FilterClause): void {\n applyFilters([...state.filters, clause]);\n }\n\n function updateFilter(index: number, clause: FilterClause): void {\n applyFilters(state.filters.map((current, position) => (position === index ? clause : current)));\n }\n\n function removeFilter(index: number): void {\n applyFilters(state.filters.filter((_, current) => current !== index));\n }\n\n function setTableFilter(key: string, value: unknown): void {\n const next = { ...state.tableFilters };\n\n if (isEmptyFilterValue(value)) {\n delete next[key];\n } else {\n next[key] = value;\n }\n\n const nextState = { ...state, tableFilters: next, page: 1 };\n\n setState(nextState);\n void load(nextState);\n }\n\n function resetFilters(): void {\n const nextState = { ...state, filters: [], tableFilters: {}, page: 1 };\n\n setState(nextState);\n void load(nextState);\n }\n\n const searchFilterOptions = useCallback(\n async (filterKey: string, query: string): Promise<Option[]> => {\n if (!endpoint) {\n return [];\n }\n\n const url = new URL(endpoint, window.location.origin);\n url.searchParams.set(\"_search\", filterKey);\n url.searchParams.set(\"q\", query);\n\n const response = await apiFetch(`${url.pathname}${url.search}`, {\n ref: componentRef,\n throwOnError: false,\n });\n\n if (!response.ok) {\n return [];\n }\n\n const result = (await response.json()) as { options?: Option[] };\n\n return result.options ?? [];\n },\n [endpoint, componentRef],\n );\n\n function goToPage(page: number): void {\n void load({\n ...state,\n page,\n });\n }\n\n const loadMore = useCallback((): void => {\n if (processing || !pagination.hasMore) {\n return;\n }\n\n void load(\n {\n ...state,\n page: pagination.nextPage ?? currentPage + 1,\n },\n true,\n );\n }, [currentPage, load, pagination.hasMore, pagination.nextPage, processing, state]);\n\n useEffect(() => {\n setRows(initialRows);\n setPagination(initialPagination);\n setState(initialState);\n setProcessing(isLazy);\n setHasLoaded(!isLazy);\n }, [initialRows, initialPagination, initialState, isLazy]);\n\n useEffect(() => {\n if (!isLazy || hasLoaded) {\n return;\n }\n\n void load(state);\n }, [hasLoaded, isLazy, load, state]);\n\n useEffect(() => {\n function reload(event: Event): void {\n const detail = (event as ReloadComponentEvent).detail;\n\n if (detail?.component !== node.id) {\n return;\n }\n\n void load(state);\n }\n\n window.addEventListener(LATTICE_EVENT.reloadComponent, reload);\n\n return () => window.removeEventListener(LATTICE_EVENT.reloadComponent, reload);\n }, [load, node.id, state]);\n\n useEffect(() => {\n if (\n !isInfinite ||\n !pagination.hasMore ||\n processing ||\n !infiniteLoaderRef.current ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n loadMore();\n }\n },\n {\n rootMargin: \"240px\",\n },\n );\n\n observer.observe(infiniteLoaderRef.current);\n\n return () => observer.disconnect();\n }, [isInfinite, loadMore, pagination.hasMore, processing]);\n\n return {\n columns,\n rows,\n pagination,\n state,\n filters: state.filters,\n tableFilters: state.tableFilters,\n addFilter,\n updateFilter,\n removeFilter,\n setTableFilter,\n resetFilters,\n searchFilterOptions,\n processing,\n hasLoaded,\n infiniteLoaderRef,\n sort,\n clearSort,\n goToPage,\n loadMore,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Callout } from '../types/generated';
2
+ export type { Callout };
3
+ /** Coerce a raw callout value (effect detail `{ callout: {...} }`) into a Callout. */
4
+ export declare function normalizeCallout(detail: unknown): Callout | null;
5
+ /** Subscribe to the `lattice:callout` bus. Returns an unsubscribe function. */
6
+ export declare function onCallout(callback: (callout: Callout) => void): () => void;
@@ -0,0 +1,31 @@
1
+ import { LATTICE_EVENT } from "../events/event-names.js";
2
+ import { isVariant } from "./toast.js";
3
+ //#region resources/js/toast/callout.ts
4
+ /** Coerce a raw callout value (effect detail `{ callout: {...} }`) into a Callout. */
5
+ function normalizeCallout(detail) {
6
+ if (typeof detail !== "object" || detail === null) return null;
7
+ const value = detail.callout;
8
+ if (typeof value !== "object" || value === null) return null;
9
+ const callout = value;
10
+ if (typeof callout.message !== "string" || callout.message === "") return null;
11
+ return {
12
+ action: callout.action ?? null,
13
+ dismissible: callout.dismissible !== false,
14
+ message: callout.message,
15
+ title: typeof callout.title === "string" ? callout.title : null,
16
+ variant: isVariant(callout.variant) ? callout.variant : "info"
17
+ };
18
+ }
19
+ /** Subscribe to the `lattice:callout` bus. Returns an unsubscribe function. */
20
+ function onCallout(callback) {
21
+ const listener = (event) => {
22
+ const callout = normalizeCallout(event.detail);
23
+ if (callout) callback(callout);
24
+ };
25
+ window.addEventListener(LATTICE_EVENT.callout, listener);
26
+ return () => window.removeEventListener(LATTICE_EVENT.callout, listener);
27
+ }
28
+ //#endregion
29
+ export { normalizeCallout, onCallout };
30
+
31
+ //# sourceMappingURL=callout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callout.js","names":[],"sources":["../../resources/js/toast/callout.ts"],"sourcesContent":["import type { Callout } from \"@lattice-php/lattice/types/generated\";\nimport { LATTICE_EVENT } from \"@lattice-php/lattice/events/event-names\";\nimport { isVariant } from \"@lattice-php/lattice/toast/toast\";\n\nexport type { Callout };\n\n/** Coerce a raw callout value (effect detail `{ callout: {...} }`) into a Callout. */\nexport function normalizeCallout(detail: unknown): Callout | null {\n if (typeof detail !== \"object\" || detail === null) {\n return null;\n }\n\n const value = (detail as { callout?: unknown }).callout;\n\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const callout = value as Record<string, unknown>;\n\n if (typeof callout.message !== \"string\" || callout.message === \"\") {\n return null;\n }\n\n return {\n action: (callout.action as Callout[\"action\"]) ?? null,\n dismissible: callout.dismissible !== false,\n message: callout.message,\n title: typeof callout.title === \"string\" ? callout.title : null,\n variant: isVariant(callout.variant) ? callout.variant : \"info\",\n };\n}\n\n/** Subscribe to the `lattice:callout` bus. Returns an unsubscribe function. */\nexport function onCallout(callback: (callout: Callout) => void): () => void {\n const listener = (event: Event): void => {\n const callout = normalizeCallout((event as CustomEvent).detail);\n\n if (callout) {\n callback(callout);\n }\n };\n\n window.addEventListener(LATTICE_EVENT.callout, listener);\n\n return () => window.removeEventListener(LATTICE_EVENT.callout, listener);\n}\n"],"mappings":";;;;AAOA,SAAgB,iBAAiB,QAAiC;CAChE,IAAI,OAAO,WAAW,YAAY,WAAW,MAC3C,OAAO;CAGT,MAAM,QAAS,OAAiC;CAEhD,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,UAAU;CAEhB,IAAI,OAAO,QAAQ,YAAY,YAAY,QAAQ,YAAY,IAC7D,OAAO;CAGT,OAAO;EACL,QAAS,QAAQ,UAAgC;EACjD,aAAa,QAAQ,gBAAgB;EACrC,SAAS,QAAQ;EACjB,OAAO,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;EAC3D,SAAS,UAAU,QAAQ,OAAO,IAAI,QAAQ,UAAU;CAC1D;AACF;;AAGA,SAAgB,UAAU,UAAkD;CAC1E,MAAM,YAAY,UAAuB;EACvC,MAAM,UAAU,iBAAkB,MAAsB,MAAM;EAE9D,IAAI,SACF,SAAS,OAAO;CAEpB;CAEA,OAAO,iBAAiB,cAAc,SAAS,QAAQ;CAEvD,aAAa,OAAO,oBAAoB,cAAc,SAAS,QAAQ;AACzE"}
@@ -1 +1,5 @@
1
+ export { normalizeCallout, onCallout } from './callout';
2
+ export type { Callout } from './callout';
1
3
  export { Toaster } from './toaster';
4
+ export { isVariant, normalizeToast, normalizeToastMessage, onToast, showToast } from './toast';
5
+ export type { ToastMessage, Variant } from './toast';
@@ -1,2 +1,4 @@
1
+ import { isVariant, normalizeToast, normalizeToastMessage, onToast, showToast } from "./toast.js";
2
+ import { normalizeCallout, onCallout } from "./callout.js";
1
3
  import { Toaster } from "./toaster.js";
2
- export { Toaster };
4
+ export { Toaster, isVariant, normalizeCallout, normalizeToast, normalizeToastMessage, onCallout, onToast, showToast };
@@ -0,0 +1,14 @@
1
+ import { ToastMessage, Variant } from '../types/generated';
2
+ export type { ToastMessage, Variant };
3
+ export declare function isVariant(value: unknown): value is Variant;
4
+ /**
5
+ * Coerce a raw toast value (server flash payload or event detail) into a
6
+ * ToastMessage, defaulting optional fields, or null when it is malformed.
7
+ */
8
+ export declare function normalizeToastMessage(value: unknown): ToastMessage | null;
9
+ /** Coerce a `lattice:toast` event detail (`{ toast: {...} }`) into a ToastMessage. */
10
+ export declare function normalizeToast(detail: unknown): ToastMessage | null;
11
+ /** Emit a toast onto the shared `lattice:toast` bus. */
12
+ export declare function showToast(toast: ToastMessage): void;
13
+ /** Subscribe to the shared toast bus. Returns an unsubscribe function. */
14
+ export declare function onToast(callback: (toast: ToastMessage) => void): () => void;
@@ -0,0 +1,51 @@
1
+ import { LATTICE_EVENT } from "../events/event-names.js";
2
+ //#region resources/js/toast/toast.ts
3
+ var variants = [
4
+ "success",
5
+ "info",
6
+ "warning",
7
+ "error"
8
+ ];
9
+ function isVariant(value) {
10
+ return variants.some((variant) => variant === value);
11
+ }
12
+ /**
13
+ * Coerce a raw toast value (server flash payload or event detail) into a
14
+ * ToastMessage, defaulting optional fields, or null when it is malformed.
15
+ */
16
+ function normalizeToastMessage(value) {
17
+ if (typeof value !== "object" || value === null) return null;
18
+ const toast = value;
19
+ if (typeof toast.message !== "string" || toast.message === "") return null;
20
+ return {
21
+ action: toast.action ?? null,
22
+ dismissible: toast.dismissible !== false,
23
+ duration: typeof toast.duration === "number" ? toast.duration : null,
24
+ message: toast.message,
25
+ persistent: toast.persistent === true,
26
+ variant: isVariant(toast.variant) ? toast.variant : "success"
27
+ };
28
+ }
29
+ /** Coerce a `lattice:toast` event detail (`{ toast: {...} }`) into a ToastMessage. */
30
+ function normalizeToast(detail) {
31
+ if (typeof detail !== "object" || detail === null) return null;
32
+ return normalizeToastMessage(detail.toast);
33
+ }
34
+ /** Emit a toast onto the shared `lattice:toast` bus. */
35
+ function showToast(toast) {
36
+ if (typeof window === "undefined") return;
37
+ window.dispatchEvent(new CustomEvent(LATTICE_EVENT.toast, { detail: { toast } }));
38
+ }
39
+ /** Subscribe to the shared toast bus. Returns an unsubscribe function. */
40
+ function onToast(callback) {
41
+ const listener = (event) => {
42
+ const toast = normalizeToast(event.detail);
43
+ if (toast) callback(toast);
44
+ };
45
+ window.addEventListener(LATTICE_EVENT.toast, listener);
46
+ return () => window.removeEventListener(LATTICE_EVENT.toast, listener);
47
+ }
48
+ //#endregion
49
+ export { isVariant, normalizeToast, normalizeToastMessage, onToast, showToast };
50
+
51
+ //# sourceMappingURL=toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toast.js","names":[],"sources":["../../resources/js/toast/toast.ts"],"sourcesContent":["import type { ToastMessage, Variant } from \"@lattice-php/lattice/types/generated\";\nimport { LATTICE_EVENT } from \"@lattice-php/lattice/events/event-names\";\n\nexport type { ToastMessage, Variant };\n\nconst variants = [\"success\", \"info\", \"warning\", \"error\"] as const satisfies readonly Variant[];\n\nexport function isVariant(value: unknown): value is Variant {\n return variants.some((variant) => variant === value);\n}\n\n/**\n * Coerce a raw toast value (server flash payload or event detail) into a\n * ToastMessage, defaulting optional fields, or null when it is malformed.\n */\nexport function normalizeToastMessage(value: unknown): ToastMessage | null {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const toast = value as Record<string, unknown>;\n\n if (typeof toast.message !== \"string\" || toast.message === \"\") {\n return null;\n }\n\n return {\n action: (toast.action as ToastMessage[\"action\"]) ?? null,\n dismissible: toast.dismissible !== false,\n duration: typeof toast.duration === \"number\" ? toast.duration : null,\n message: toast.message,\n persistent: toast.persistent === true,\n variant: isVariant(toast.variant) ? toast.variant : \"success\",\n };\n}\n\n/** Coerce a `lattice:toast` event detail (`{ toast: {...} }`) into a ToastMessage. */\nexport function normalizeToast(detail: unknown): ToastMessage | null {\n if (typeof detail !== \"object\" || detail === null) {\n return null;\n }\n\n return normalizeToastMessage((detail as { toast?: unknown }).toast);\n}\n\n/** Emit a toast onto the shared `lattice:toast` bus. */\nexport function showToast(toast: ToastMessage): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.dispatchEvent(new CustomEvent(LATTICE_EVENT.toast, { detail: { toast } }));\n}\n\n/** Subscribe to the shared toast bus. Returns an unsubscribe function. */\nexport function onToast(callback: (toast: ToastMessage) => void): () => void {\n const listener = (event: Event): void => {\n const toast = normalizeToast((event as CustomEvent).detail);\n\n if (toast) {\n callback(toast);\n }\n };\n\n window.addEventListener(LATTICE_EVENT.toast, listener);\n\n return () => window.removeEventListener(LATTICE_EVENT.toast, listener);\n}\n"],"mappings":";;AAKA,IAAM,WAAW;CAAC;CAAW;CAAQ;CAAW;AAAO;AAEvD,SAAgB,UAAU,OAAkC;CAC1D,OAAO,SAAS,MAAM,YAAY,YAAY,KAAK;AACrD;;;;;AAMA,SAAgB,sBAAsB,OAAqC;CACzE,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,QAAQ;CAEd,IAAI,OAAO,MAAM,YAAY,YAAY,MAAM,YAAY,IACzD,OAAO;CAGT,OAAO;EACL,QAAS,MAAM,UAAqC;EACpD,aAAa,MAAM,gBAAgB;EACnC,UAAU,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;EAChE,SAAS,MAAM;EACf,YAAY,MAAM,eAAe;EACjC,SAAS,UAAU,MAAM,OAAO,IAAI,MAAM,UAAU;CACtD;AACF;;AAGA,SAAgB,eAAe,QAAsC;CACnE,IAAI,OAAO,WAAW,YAAY,WAAW,MAC3C,OAAO;CAGT,OAAO,sBAAuB,OAA+B,KAAK;AACpE;;AAGA,SAAgB,UAAU,OAA2B;CACnD,IAAI,OAAO,WAAW,aACpB;CAGF,OAAO,cAAc,IAAI,YAAY,cAAc,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AAClF;;AAGA,SAAgB,QAAQ,UAAqD;CAC3E,MAAM,YAAY,UAAuB;EACvC,MAAM,QAAQ,eAAgB,MAAsB,MAAM;EAE1D,IAAI,OACF,SAAS,KAAK;CAElB;CAEA,OAAO,iBAAiB,cAAc,OAAO,QAAQ;CAErD,aAAa,OAAO,oBAAoB,cAAc,OAAO,QAAQ;AACvE"}
@@ -1,87 +1,26 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import { Icon } from "../icons/sprite.js";
3
3
  import { useT } from "../i18n/instance.js";
4
- import { LATTICE_EVENT } from "../events/event-names.js";
5
- import { Renderer } from "../core/renderer.js";
6
- import { useRegistry } from "../provider.js";
4
+ import { onToast } from "./toast.js";
5
+ import { RenderNode } from "../core/renderer.js";
6
+ import { variantStyles } from "./variant-styles.js";
7
7
  import { useEffect, useState } from "react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import * as Toast from "@radix-ui/react-toast";
10
10
  //#region resources/js/toast/toaster.tsx
11
- var variants = [
12
- "success",
13
- "info",
14
- "warning",
15
- "error"
16
- ];
17
- var variantStyles = {
18
- success: {
19
- accent: "border-l-lt-success",
20
- icon: /* @__PURE__ */ jsx(Icon, {
21
- name: "circle-check",
22
- className: "size-lt-icon-lg shrink-0 text-lt-success"
23
- })
24
- },
25
- info: {
26
- accent: "border-l-lt-info",
27
- icon: /* @__PURE__ */ jsx(Icon, {
28
- name: "info",
29
- className: "size-lt-icon-lg shrink-0 text-lt-info"
30
- })
31
- },
32
- warning: {
33
- accent: "border-l-lt-warning",
34
- icon: /* @__PURE__ */ jsx(Icon, {
35
- name: "circle-alert",
36
- className: "size-lt-icon-lg shrink-0 text-lt-warning"
37
- })
38
- },
39
- error: {
40
- accent: "border-l-lt-danger",
41
- icon: /* @__PURE__ */ jsx(Icon, {
42
- name: "circle-x",
43
- className: "size-lt-icon-lg shrink-0 text-lt-danger"
44
- })
45
- }
46
- };
47
- function isVariant(value) {
48
- return variants.some((variant) => variant === value);
49
- }
50
11
  var nextId = 0;
51
- function normalize(detail) {
52
- if (typeof detail !== "object" || detail === null) return null;
53
- const data = detail.toast;
54
- if (typeof data !== "object" || data === null) return null;
55
- const toast = data;
56
- if (typeof toast.message !== "string" || toast.message === "") return null;
57
- return {
58
- action: toast.action ?? null,
59
- dismissible: toast.dismissible !== false,
60
- duration: typeof toast.duration === "number" ? toast.duration : null,
61
- message: toast.message,
62
- persistent: toast.persistent === true,
63
- variant: isVariant(toast.variant) ? toast.variant : "success"
64
- };
65
- }
66
12
  function Toaster({ duration = 4e3 }) {
67
13
  const { t } = useT("lattice");
68
- const registry = useRegistry();
69
14
  const [toasts, setToasts] = useState([]);
70
- function push(detail) {
71
- const item = normalize(detail);
72
- if (item) setToasts((current) => [...current, {
73
- ...item,
74
- id: nextId++
75
- }]);
76
- }
77
15
  function dismiss(id) {
78
16
  setToasts((current) => current.filter((toast) => toast.id !== id));
79
17
  }
80
- useEffect(() => {
81
- const listener = (event) => push(event.detail);
82
- window.addEventListener(LATTICE_EVENT.toast, listener);
83
- return () => window.removeEventListener(LATTICE_EVENT.toast, listener);
84
- }, []);
18
+ useEffect(() => onToast((toast) => {
19
+ setToasts((current) => [...current, {
20
+ ...toast,
21
+ id: nextId++
22
+ }]);
23
+ }), []);
85
24
  return /* @__PURE__ */ jsxs(Toast.Provider, {
86
25
  duration,
87
26
  swipeDirection: "down",
@@ -101,10 +40,7 @@ function Toaster({ duration = 4e3 }) {
101
40
  children: toast.message
102
41
  }), toast.action ? /* @__PURE__ */ jsx("div", {
103
42
  className: "flex flex-wrap gap-2",
104
- children: /* @__PURE__ */ jsx(Renderer, {
105
- nodes: [toast.action],
106
- registry
107
- })
43
+ children: /* @__PURE__ */ jsx(RenderNode, { node: toast.action })
108
44
  }) : null]
109
45
  }),
110
46
  toast.dismissible ? /* @__PURE__ */ jsx(Toast.Close, {
@@ -1 +1 @@
1
- {"version":3,"file":"toaster.js","names":[],"sources":["../../resources/js/toast/toaster.tsx"],"sourcesContent":["import { Icon } from \"@lattice/lattice/icons\";\nimport * as Toast from \"@radix-ui/react-toast\";\nimport { useEffect, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { Renderer } from \"@lattice/lattice/core/renderer\";\nimport type { ToastMessage, ToastVariant } from \"@lattice/lattice/types/generated\";\nimport { LATTICE_EVENT } from \"@lattice/lattice/events/event-names\";\nimport { cn } from \"@lattice/lattice/lib/utils\";\nimport { useT } from \"@lattice/lattice/i18n\";\nimport { useRegistry } from \"@lattice/lattice/provider\";\n\nconst variants = [\"success\", \"info\", \"warning\", \"error\"] as const satisfies readonly ToastVariant[];\n\ntype ToastItem = ToastMessage & { id: number };\n\nconst variantStyles: Record<ToastVariant, { accent: string; icon: ReactNode }> = {\n success: {\n accent: \"border-l-lt-success\",\n icon: <Icon name=\"circle-check\" className=\"size-lt-icon-lg shrink-0 text-lt-success\" />,\n },\n info: {\n accent: \"border-l-lt-info\",\n icon: <Icon name=\"info\" className=\"size-lt-icon-lg shrink-0 text-lt-info\" />,\n },\n warning: {\n accent: \"border-l-lt-warning\",\n icon: <Icon name=\"circle-alert\" className=\"size-lt-icon-lg shrink-0 text-lt-warning\" />,\n },\n error: {\n accent: \"border-l-lt-danger\",\n icon: <Icon name=\"circle-x\" className=\"size-lt-icon-lg shrink-0 text-lt-danger\" />,\n },\n};\n\nfunction isVariant(value: unknown): value is ToastVariant {\n return variants.some((variant) => variant === value);\n}\n\nlet nextId = 0;\n\nfunction normalize(detail: unknown): ToastMessage | null {\n if (typeof detail !== \"object\" || detail === null) {\n return null;\n }\n\n const data = (detail as { toast?: unknown }).toast;\n\n if (typeof data !== \"object\" || data === null) {\n return null;\n }\n\n const toast = data as Record<string, unknown>;\n\n if (typeof toast.message !== \"string\" || toast.message === \"\") {\n return null;\n }\n\n return {\n action: (toast.action as ToastMessage[\"action\"]) ?? null,\n dismissible: toast.dismissible !== false,\n duration: typeof toast.duration === \"number\" ? toast.duration : null,\n message: toast.message,\n persistent: toast.persistent === true,\n variant: isVariant(toast.variant) ? toast.variant : \"success\",\n };\n}\n\nexport function Toaster({ duration = 4000 }: { duration?: number }) {\n const { t } = useT(\"lattice\");\n const registry = useRegistry();\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n\n function push(detail: unknown): void {\n const item = normalize(detail);\n\n if (item) {\n setToasts((current) => [...current, { ...item, id: nextId++ }]);\n }\n }\n\n function dismiss(id: number): void {\n setToasts((current) => current.filter((toast) => toast.id !== id));\n }\n\n useEffect(() => {\n const listener = (event: Event): void => push((event as CustomEvent).detail);\n\n window.addEventListener(LATTICE_EVENT.toast, listener);\n\n return () => window.removeEventListener(LATTICE_EVENT.toast, listener);\n }, []);\n\n return (\n <Toast.Provider duration={duration} swipeDirection=\"down\">\n {toasts.map((toast) => (\n <Toast.Root\n key={toast.id}\n className={cn(\n \"flex items-start gap-3 rounded-lt border border-l-4 border-lt-border bg-lt-popover p-4 text-lt-popover-fg shadow-lg\",\n variantStyles[toast.variant].accent,\n \"data-[state=open]:animate-lt-toast-in data-[state=closed]:animate-lt-toast-out\",\n \"data-[swipe=move]:translate-y-[var(--radix-toast-swipe-move-y)] data-[swipe=cancel]:translate-y-0 data-[swipe=cancel]:transition-transform\",\n )}\n data-test={`toast-${toast.variant}`}\n duration={toast.persistent ? Infinity : (toast.duration ?? duration)}\n onOpenChange={(open) => {\n if (!open) {\n dismiss(toast.id);\n }\n }}\n >\n {variantStyles[toast.variant].icon}\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <Toast.Title className=\"text-sm text-lt-fg\">{toast.message}</Toast.Title>\n {toast.action ? (\n <div className=\"flex flex-wrap gap-2\">\n <Renderer nodes={[toast.action]} registry={registry} />\n </div>\n ) : null}\n </div>\n {toast.dismissible ? (\n <Toast.Close\n aria-label={t(\"a11y.dismiss\", \"Dismiss\")}\n className=\"shrink-0 rounded-md p-1 text-lt-muted-fg transition-colors hover:bg-lt-muted hover:text-lt-fg\"\n data-test=\"toast-dismiss\"\n >\n <Icon name=\"x\" className=\"size-lt-icon-md\" />\n </Toast.Close>\n ) : null}\n </Toast.Root>\n ))}\n <Toast.Viewport className=\"fixed inset-x-0 bottom-0 z-[100] mx-auto flex w-full max-w-sm flex-col gap-2 p-4 outline-none\" />\n </Toast.Provider>\n );\n}\n"],"mappings":";;;;;;;;;;AAWA,IAAM,WAAW;CAAC;CAAW;CAAQ;CAAW;AAAO;AAIvD,IAAM,gBAA2E;CAC/E,SAAS;EACP,QAAQ;EACR,MAAM,oBAAC,MAAD;GAAM,MAAK;GAAe,WAAU;EAA4C,CAAA;CACxF;CACA,MAAM;EACJ,QAAQ;EACR,MAAM,oBAAC,MAAD;GAAM,MAAK;GAAO,WAAU;EAAyC,CAAA;CAC7E;CACA,SAAS;EACP,QAAQ;EACR,MAAM,oBAAC,MAAD;GAAM,MAAK;GAAe,WAAU;EAA4C,CAAA;CACxF;CACA,OAAO;EACL,QAAQ;EACR,MAAM,oBAAC,MAAD;GAAM,MAAK;GAAW,WAAU;EAA2C,CAAA;CACnF;AACF;AAEA,SAAS,UAAU,OAAuC;CACxD,OAAO,SAAS,MAAM,YAAY,YAAY,KAAK;AACrD;AAEA,IAAI,SAAS;AAEb,SAAS,UAAU,QAAsC;CACvD,IAAI,OAAO,WAAW,YAAY,WAAW,MAC3C,OAAO;CAGT,MAAM,OAAQ,OAA+B;CAE7C,IAAI,OAAO,SAAS,YAAY,SAAS,MACvC,OAAO;CAGT,MAAM,QAAQ;CAEd,IAAI,OAAO,MAAM,YAAY,YAAY,MAAM,YAAY,IACzD,OAAO;CAGT,OAAO;EACL,QAAS,MAAM,UAAqC;EACpD,aAAa,MAAM,gBAAgB;EACnC,UAAU,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;EAChE,SAAS,MAAM;EACf,YAAY,MAAM,eAAe;EACjC,SAAS,UAAU,MAAM,OAAO,IAAI,MAAM,UAAU;CACtD;AACF;AAEA,SAAgB,QAAQ,EAAE,WAAW,OAA+B;CAClE,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,WAAW,YAAY;CAC7B,MAAM,CAAC,QAAQ,aAAa,SAAsB,CAAC,CAAC;CAEpD,SAAS,KAAK,QAAuB;EACnC,MAAM,OAAO,UAAU,MAAM;EAE7B,IAAI,MACF,WAAW,YAAY,CAAC,GAAG,SAAS;GAAE,GAAG;GAAM,IAAI;EAAS,CAAC,CAAC;CAElE;CAEA,SAAS,QAAQ,IAAkB;EACjC,WAAW,YAAY,QAAQ,QAAQ,UAAU,MAAM,OAAO,EAAE,CAAC;CACnE;CAEA,gBAAgB;EACd,MAAM,YAAY,UAAuB,KAAM,MAAsB,MAAM;EAE3E,OAAO,iBAAiB,cAAc,OAAO,QAAQ;EAErD,aAAa,OAAO,oBAAoB,cAAc,OAAO,QAAQ;CACvE,GAAG,CAAC,CAAC;CAEL,OACE,qBAAC,MAAM,UAAP;EAA0B;EAAU,gBAAe;YAAnD,CACG,OAAO,KAAK,UACX,qBAAC,MAAM,MAAP;GAEE,WAAW,GACT,uHACA,cAAc,MAAM,SAAS,QAC7B,kFACA,4IACF;GACA,aAAW,SAAS,MAAM;GAC1B,UAAU,MAAM,aAAa,WAAY,MAAM,YAAY;GAC3D,eAAe,SAAS;IACtB,IAAI,CAAC,MACH,QAAQ,MAAM,EAAE;GAEpB;aAdF;IAgBG,cAAc,MAAM,SAAS;IAC9B,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAM,OAAP;MAAa,WAAU;gBAAsB,MAAM;KAAqB,CAAA,GACvE,MAAM,SACL,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,UAAD;OAAU,OAAO,CAAC,MAAM,MAAM;OAAa;MAAW,CAAA;KACnD,CAAA,IACH,IACD;;IACJ,MAAM,cACL,oBAAC,MAAM,OAAP;KACE,cAAY,EAAE,gBAAgB,SAAS;KACvC,WAAU;KACV,aAAU;eAEV,oBAAC,MAAD;MAAM,MAAK;MAAI,WAAU;KAAmB,CAAA;IACjC,CAAA,IACX;GACM;KAjCL,MAAM,EAiCD,CACb,GACD,oBAAC,MAAM,UAAP,EAAgB,WAAU,gGAAiG,CAAA,CAC7G;;AAEpB"}
1
+ {"version":3,"file":"toaster.js","names":[],"sources":["../../resources/js/toast/toaster.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport * as Toast from \"@radix-ui/react-toast\";\nimport { useEffect, useState } from \"react\";\nimport { RenderNode } from \"@lattice-php/lattice/core/renderer\";\nimport type { ToastMessage } from \"@lattice-php/lattice/types/generated\";\nimport { onToast } from \"@lattice-php/lattice/toast/toast\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { variantStyles } from \"@lattice-php/lattice/toast/variant-styles\";\n\ntype ToastItem = ToastMessage & { id: number };\n\nlet nextId = 0;\n\nexport function Toaster({ duration = 4000 }: { duration?: number }) {\n const { t } = useT(\"lattice\");\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n\n function dismiss(id: number): void {\n setToasts((current) => current.filter((toast) => toast.id !== id));\n }\n\n useEffect(\n () =>\n onToast((toast) => {\n setToasts((current) => [...current, { ...toast, id: nextId++ }]);\n }),\n [],\n );\n\n return (\n <Toast.Provider duration={duration} swipeDirection=\"down\">\n {toasts.map((toast) => (\n <Toast.Root\n key={toast.id}\n className={cn(\n \"flex items-start gap-3 rounded-lt border border-l-4 border-lt-border bg-lt-popover p-4 text-lt-popover-fg shadow-lg\",\n variantStyles[toast.variant].accent,\n \"data-[state=open]:animate-lt-toast-in data-[state=closed]:animate-lt-toast-out\",\n \"data-[swipe=move]:translate-y-[var(--radix-toast-swipe-move-y)] data-[swipe=cancel]:translate-y-0 data-[swipe=cancel]:transition-transform\",\n )}\n data-test={`toast-${toast.variant}`}\n duration={toast.persistent ? Infinity : (toast.duration ?? duration)}\n onOpenChange={(open) => {\n if (!open) {\n dismiss(toast.id);\n }\n }}\n >\n {variantStyles[toast.variant].icon}\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <Toast.Title className=\"text-sm text-lt-fg\">{toast.message}</Toast.Title>\n {toast.action ? (\n <div className=\"flex flex-wrap gap-2\">\n <RenderNode node={toast.action} />\n </div>\n ) : null}\n </div>\n {toast.dismissible ? (\n <Toast.Close\n aria-label={t(\"a11y.dismiss\", \"Dismiss\")}\n className=\"shrink-0 rounded-md p-1 text-lt-muted-fg transition-colors hover:bg-lt-muted hover:text-lt-fg\"\n data-test=\"toast-dismiss\"\n >\n <Icon name=\"x\" className=\"size-lt-icon-md\" />\n </Toast.Close>\n ) : null}\n </Toast.Root>\n ))}\n <Toast.Viewport className=\"fixed inset-x-0 bottom-0 z-[100] mx-auto flex w-full max-w-sm flex-col gap-2 p-4 outline-none\" />\n </Toast.Provider>\n );\n}\n"],"mappings":";;;;;;;;;;AAYA,IAAI,SAAS;AAEb,SAAgB,QAAQ,EAAE,WAAW,OAA+B;CAClE,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,CAAC,QAAQ,aAAa,SAAsB,CAAC,CAAC;CAEpD,SAAS,QAAQ,IAAkB;EACjC,WAAW,YAAY,QAAQ,QAAQ,UAAU,MAAM,OAAO,EAAE,CAAC;CACnE;CAEA,gBAEI,SAAS,UAAU;EACjB,WAAW,YAAY,CAAC,GAAG,SAAS;GAAE,GAAG;GAAO,IAAI;EAAS,CAAC,CAAC;CACjE,CAAC,GACH,CAAC,CACH;CAEA,OACE,qBAAC,MAAM,UAAP;EAA0B;EAAU,gBAAe;YAAnD,CACG,OAAO,KAAK,UACX,qBAAC,MAAM,MAAP;GAEE,WAAW,GACT,uHACA,cAAc,MAAM,SAAS,QAC7B,kFACA,4IACF;GACA,aAAW,SAAS,MAAM;GAC1B,UAAU,MAAM,aAAa,WAAY,MAAM,YAAY;GAC3D,eAAe,SAAS;IACtB,IAAI,CAAC,MACH,QAAQ,MAAM,EAAE;GAEpB;aAdF;IAgBG,cAAc,MAAM,SAAS;IAC9B,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,MAAM,OAAP;MAAa,WAAU;gBAAsB,MAAM;KAAqB,CAAA,GACvE,MAAM,SACL,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,YAAD,EAAY,MAAM,MAAM,OAAS,CAAA;KAC9B,CAAA,IACH,IACD;;IACJ,MAAM,cACL,oBAAC,MAAM,OAAP;KACE,cAAY,EAAE,gBAAgB,SAAS;KACvC,WAAU;KACV,aAAU;eAEV,oBAAC,MAAD;MAAM,MAAK;MAAI,WAAU;KAAmB,CAAA;IACjC,CAAA,IACX;GACM;KAjCL,MAAM,EAiCD,CACb,GACD,oBAAC,MAAM,UAAP,EAAgB,WAAU,gGAAiG,CAAA,CAC7G;;AAEpB"}
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from 'react';
2
+ import { Variant } from '../types/generated';
3
+ export declare const variantStyles: Record<Variant, {
4
+ accent: string;
5
+ icon: ReactNode;
6
+ }>;
@@ -0,0 +1,37 @@
1
+ import { Icon } from "../icons/sprite.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region resources/js/toast/variant-styles.tsx
4
+ var variantStyles = {
5
+ success: {
6
+ accent: "border-l-lt-success",
7
+ icon: /* @__PURE__ */ jsx(Icon, {
8
+ name: "circle-check",
9
+ className: "size-lt-icon-lg shrink-0 text-lt-success"
10
+ })
11
+ },
12
+ info: {
13
+ accent: "border-l-lt-info",
14
+ icon: /* @__PURE__ */ jsx(Icon, {
15
+ name: "info",
16
+ className: "size-lt-icon-lg shrink-0 text-lt-info"
17
+ })
18
+ },
19
+ warning: {
20
+ accent: "border-l-lt-warning",
21
+ icon: /* @__PURE__ */ jsx(Icon, {
22
+ name: "circle-alert",
23
+ className: "size-lt-icon-lg shrink-0 text-lt-warning"
24
+ })
25
+ },
26
+ error: {
27
+ accent: "border-l-lt-danger",
28
+ icon: /* @__PURE__ */ jsx(Icon, {
29
+ name: "circle-x",
30
+ className: "size-lt-icon-lg shrink-0 text-lt-danger"
31
+ })
32
+ }
33
+ };
34
+ //#endregion
35
+ export { variantStyles };
36
+
37
+ //# sourceMappingURL=variant-styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variant-styles.js","names":[],"sources":["../../resources/js/toast/variant-styles.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport type { ReactNode } from \"react\";\nimport type { Variant } from \"@lattice-php/lattice/types/generated\";\n\nexport const variantStyles: Record<Variant, { accent: string; icon: ReactNode }> = {\n success: {\n accent: \"border-l-lt-success\",\n icon: <Icon name=\"circle-check\" className=\"size-lt-icon-lg shrink-0 text-lt-success\" />,\n },\n info: {\n accent: \"border-l-lt-info\",\n icon: <Icon name=\"info\" className=\"size-lt-icon-lg shrink-0 text-lt-info\" />,\n },\n warning: {\n accent: \"border-l-lt-warning\",\n icon: <Icon name=\"circle-alert\" className=\"size-lt-icon-lg shrink-0 text-lt-warning\" />,\n },\n error: {\n accent: \"border-l-lt-danger\",\n icon: <Icon name=\"circle-x\" className=\"size-lt-icon-lg shrink-0 text-lt-danger\" />,\n },\n};\n"],"mappings":";;;AAIA,IAAa,gBAAsE;CACjF,SAAS;EACP,QAAQ;EACR,MAAM,oBAAC,MAAD;GAAM,MAAK;GAAe,WAAU;EAA4C,CAAA;CACxF;CACA,MAAM;EACJ,QAAQ;EACR,MAAM,oBAAC,MAAD;GAAM,MAAK;GAAO,WAAU;EAAyC,CAAA;CAC7E;CACA,SAAS;EACP,QAAQ;EACR,MAAM,oBAAC,MAAD;GAAM,MAAK;GAAe,WAAU;EAA4C,CAAA;CACxF;CACA,OAAO;EACL,QAAQ;EACR,MAAM,oBAAC,MAAD;GAAM,MAAK;GAAW,WAAU;EAA2C,CAAA;CACnF;AACF"}