@lattice-php/lattice 0.2.0 → 0.4.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 (512) 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 +4 -0
  37. package/dist/chat/transport.js +67 -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 +25 -0
  44. package/dist/core/api.js +127 -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 +3 -3
  53. package/dist/core/components/badge.js.map +1 -1
  54. package/dist/core/components/button.d.ts +1 -1
  55. package/dist/core/components/button.js +19 -15
  56. package/dist/core/components/button.js.map +1 -1
  57. package/dist/core/components/card.js +1 -1
  58. package/dist/core/components/card.js.map +1 -1
  59. package/dist/core/components/chart.d.ts +3 -0
  60. package/dist/core/components/chart.js +175 -0
  61. package/dist/core/components/chart.js.map +1 -0
  62. package/dist/{form/components/base → core/components}/checkbox.js +4 -4
  63. package/dist/core/components/checkbox.js.map +1 -0
  64. package/dist/core/components/combobox.d.ts +33 -0
  65. package/dist/core/components/combobox.js +99 -0
  66. package/dist/core/components/combobox.js.map +1 -0
  67. package/dist/core/components/confirm-dialog.js +6 -12
  68. package/dist/core/components/confirm-dialog.js.map +1 -1
  69. package/dist/core/components/control.d.ts +13 -0
  70. package/dist/core/components/control.js +27 -0
  71. package/dist/core/components/control.js.map +1 -0
  72. package/dist/core/components/dialog.d.ts +19 -0
  73. package/dist/core/components/dialog.js +76 -0
  74. package/dist/core/components/dialog.js.map +1 -0
  75. package/dist/core/components/dropdown-menu.d.ts +14 -0
  76. package/dist/core/components/dropdown-menu.js +42 -0
  77. package/dist/core/components/dropdown-menu.js.map +1 -0
  78. package/dist/core/components/floating-panel.d.ts +3 -0
  79. package/dist/core/components/floating-panel.js +65 -0
  80. package/dist/core/components/floating-panel.js.map +1 -0
  81. package/dist/core/components/fragment.js +25 -13
  82. package/dist/core/components/fragment.js.map +1 -1
  83. package/dist/core/components/grid.js.map +1 -1
  84. package/dist/core/components/heading.js +1 -1
  85. package/dist/core/components/heading.js.map +1 -1
  86. package/dist/core/components/icon.js +1 -0
  87. package/dist/core/components/icon.js.map +1 -1
  88. package/dist/core/components/index.js +8 -1
  89. package/dist/core/components/index.js.map +1 -1
  90. package/dist/core/components/info-tooltip.d.ts +3 -0
  91. package/dist/core/components/info-tooltip.js +26 -0
  92. package/dist/core/components/info-tooltip.js.map +1 -0
  93. package/dist/core/components/link.js +12 -6
  94. package/dist/core/components/link.js.map +1 -1
  95. package/dist/core/components/modal.js +9 -31
  96. package/dist/core/components/modal.js.map +1 -1
  97. package/dist/core/components/popover.d.ts +8 -0
  98. package/dist/core/components/popover.js +37 -0
  99. package/dist/core/components/popover.js.map +1 -0
  100. package/dist/core/components/raw-block.d.ts +3 -0
  101. package/dist/core/components/raw-block.js +10 -0
  102. package/dist/core/components/raw-block.js.map +1 -0
  103. package/dist/core/components/section.js +8 -12
  104. package/dist/core/components/section.js.map +1 -1
  105. package/dist/core/components/segmented-control.js.map +1 -1
  106. package/dist/core/components/segmented-pills.js +1 -1
  107. package/dist/core/components/segmented-pills.js.map +1 -1
  108. package/dist/core/components/skeleton.d.ts +3 -0
  109. package/dist/core/components/skeleton.js +16 -0
  110. package/dist/core/components/skeleton.js.map +1 -0
  111. package/dist/core/components/spinner.js.map +1 -1
  112. package/dist/core/components/stack.js +25 -8
  113. package/dist/core/components/stack.js.map +1 -1
  114. package/dist/core/components/tabs.js +1 -1
  115. package/dist/core/components/tabs.js.map +1 -1
  116. package/dist/core/components/text.js +17 -1
  117. package/dist/core/components/text.js.map +1 -1
  118. package/dist/core/headers.d.ts +1 -0
  119. package/dist/core/headers.js +14 -0
  120. package/dist/core/headers.js.map +1 -0
  121. package/dist/core/registry-context.d.ts +21 -0
  122. package/dist/core/registry-context.js +40 -0
  123. package/dist/core/registry-context.js.map +1 -0
  124. package/dist/core/registry.d.ts +4 -1
  125. package/dist/core/registry.js +10 -1
  126. package/dist/core/registry.js.map +1 -1
  127. package/dist/core/renderer.d.ts +8 -14
  128. package/dist/core/renderer.js +17 -27
  129. package/dist/core/renderer.js.map +1 -1
  130. package/dist/core/test-id.d.ts +8 -0
  131. package/dist/core/test-id.js +21 -0
  132. package/dist/core/test-id.js.map +1 -0
  133. package/dist/core/types.d.ts +25 -9
  134. package/dist/core/use-column-resizing.d.ts +27 -0
  135. package/dist/core/use-column-resizing.js +228 -0
  136. package/dist/core/use-column-resizing.js.map +1 -0
  137. package/dist/effects/dispatch.d.ts +20 -0
  138. package/dist/effects/dispatch.js +39 -0
  139. package/dist/effects/dispatch.js.map +1 -0
  140. package/dist/effects/registry.d.ts +38 -0
  141. package/dist/effects/registry.js +51 -0
  142. package/dist/effects/registry.js.map +1 -0
  143. package/dist/effects/use-effect-dispatcher.d.ts +8 -0
  144. package/dist/effects/use-effect-dispatcher.js +20 -0
  145. package/dist/effects/use-effect-dispatcher.js.map +1 -0
  146. package/dist/effects/use-flash-effects.d.ts +5 -0
  147. package/dist/effects/use-flash-effects.js +22 -0
  148. package/dist/effects/use-flash-effects.js.map +1 -0
  149. package/dist/events/event-bridge.d.ts +3 -7
  150. package/dist/events/event-bridge.js +17 -47
  151. package/dist/events/event-bridge.js.map +1 -1
  152. package/dist/events/event-names.d.ts +3 -1
  153. package/dist/events/event-names.js +3 -1
  154. package/dist/events/event-names.js.map +1 -1
  155. package/dist/form/components/base/affix-group.d.ts +17 -0
  156. package/dist/form/components/base/affix-group.js +49 -0
  157. package/dist/form/components/base/affix-group.js.map +1 -0
  158. package/dist/form/components/base/field.d.ts +2 -1
  159. package/dist/form/components/base/field.js +17 -2
  160. package/dist/form/components/base/field.js.map +1 -1
  161. package/dist/form/components/base/input-error.js +1 -1
  162. package/dist/form/components/base/input-error.js.map +1 -1
  163. package/dist/form/components/base/input.js +2 -1
  164. package/dist/form/components/base/input.js.map +1 -1
  165. package/dist/form/components/base/label.js +1 -1
  166. package/dist/form/components/base/label.js.map +1 -1
  167. package/dist/form/components/base/password-input.js.map +1 -1
  168. package/dist/form/components/base/submit-button.js +4 -2
  169. package/dist/form/components/base/submit-button.js.map +1 -1
  170. package/dist/form/components/base/textarea.js +2 -1
  171. package/dist/form/components/base/textarea.js.map +1 -1
  172. package/dist/form/components/conditions.js.map +1 -1
  173. package/dist/form/components/context.d.ts +1 -0
  174. package/dist/form/components/context.js +1 -0
  175. package/dist/form/components/context.js.map +1 -1
  176. package/dist/form/components/field-props.d.ts +4 -0
  177. package/dist/form/components/field-props.js.map +1 -1
  178. package/dist/form/components/field-scope.d.ts +21 -0
  179. package/dist/form/components/field-scope.js +54 -0
  180. package/dist/form/components/field-scope.js.map +1 -0
  181. package/dist/form/components/fields/block-add-menu.d.ts +9 -0
  182. package/dist/form/components/fields/block-add-menu.js +27 -0
  183. package/dist/form/components/fields/block-add-menu.js.map +1 -0
  184. package/dist/form/components/fields/builder.d.ts +2 -0
  185. package/dist/form/components/fields/builder.js +124 -0
  186. package/dist/form/components/fields/builder.js.map +1 -0
  187. package/dist/form/components/fields/checkbox.d.ts +1 -1
  188. package/dist/form/components/fields/checkbox.js +14 -11
  189. package/dist/form/components/fields/checkbox.js.map +1 -1
  190. package/dist/form/components/fields/choice.d.ts +1 -1
  191. package/dist/form/components/fields/choice.js +5 -4
  192. package/dist/form/components/fields/choice.js.map +1 -1
  193. package/dist/form/components/fields/date-input.d.ts +1 -1
  194. package/dist/form/components/fields/date-input.js +2 -1
  195. package/dist/form/components/fields/date-input.js.map +1 -1
  196. package/dist/form/components/fields/file-upload.d.ts +2 -0
  197. package/dist/form/components/fields/file-upload.js +282 -0
  198. package/dist/form/components/fields/file-upload.js.map +1 -0
  199. package/dist/form/components/fields/hidden-input.d.ts +1 -1
  200. package/dist/form/components/fields/hidden-input.js +11 -5
  201. package/dist/form/components/fields/hidden-input.js.map +1 -1
  202. package/dist/form/components/fields/number-input.d.ts +1 -1
  203. package/dist/form/components/fields/number-input.js +23 -15
  204. package/dist/form/components/fields/number-input.js.map +1 -1
  205. package/dist/form/components/fields/password-input.d.ts +1 -1
  206. package/dist/form/components/fields/password-input.js +42 -27
  207. package/dist/form/components/fields/password-input.js.map +1 -1
  208. package/dist/form/components/fields/repeater-rows.d.ts +12 -0
  209. package/dist/form/components/fields/repeater-rows.js +46 -0
  210. package/dist/form/components/fields/repeater-rows.js.map +1 -0
  211. package/dist/form/components/fields/repeater.d.ts +2 -0
  212. package/dist/form/components/fields/repeater.js +97 -0
  213. package/dist/form/components/fields/repeater.js.map +1 -0
  214. package/dist/form/components/fields/rich-editor.d.ts +1 -1
  215. package/dist/form/components/fields/rich-editor.js +39 -11
  216. package/dist/form/components/fields/rich-editor.js.map +1 -1
  217. package/dist/form/components/fields/row-action-menu.d.ts +17 -0
  218. package/dist/form/components/fields/row-action-menu.js +61 -0
  219. package/dist/form/components/fields/row-action-menu.js.map +1 -0
  220. package/dist/form/components/fields/row-actions.d.ts +10 -0
  221. package/dist/form/components/fields/row-actions.js +45 -0
  222. package/dist/form/components/fields/row-actions.js.map +1 -0
  223. package/dist/form/components/fields/row-item.d.ts +27 -0
  224. package/dist/form/components/fields/row-item.js +69 -0
  225. package/dist/form/components/fields/row-item.js.map +1 -0
  226. package/dist/form/components/fields/select.d.ts +1 -1
  227. package/dist/form/components/fields/select.js +69 -104
  228. package/dist/form/components/fields/select.js.map +1 -1
  229. package/dist/form/components/fields/simple-field.js +1 -0
  230. package/dist/form/components/fields/simple-field.js.map +1 -1
  231. package/dist/form/components/fields/table-rows.d.ts +32 -0
  232. package/dist/form/components/fields/table-rows.js +188 -0
  233. package/dist/form/components/fields/table-rows.js.map +1 -0
  234. package/dist/form/components/fields/text-input.d.ts +1 -1
  235. package/dist/form/components/fields/text-input.js +19 -12
  236. package/dist/form/components/fields/text-input.js.map +1 -1
  237. package/dist/form/components/fields/textarea.d.ts +1 -1
  238. package/dist/form/components/fields/textarea.js +2 -1
  239. package/dist/form/components/fields/textarea.js.map +1 -1
  240. package/dist/form/components/fields/use-flip-reorder.d.ts +6 -0
  241. package/dist/form/components/fields/use-flip-reorder.js +51 -0
  242. package/dist/form/components/fields/use-flip-reorder.js.map +1 -0
  243. package/dist/form/components/fields/use-row-collection.d.ts +11 -0
  244. package/dist/form/components/fields/use-row-collection.js +44 -0
  245. package/dist/form/components/fields/use-row-collection.js.map +1 -0
  246. package/dist/form/components/form-path.d.ts +5 -0
  247. package/dist/form/components/form-path.js +40 -0
  248. package/dist/form/components/form-path.js.map +1 -0
  249. package/dist/form/components/form-transport.d.ts +3 -4
  250. package/dist/form/components/form-transport.js +17 -18
  251. package/dist/form/components/form-transport.js.map +1 -1
  252. package/dist/form/components/form.js +24 -18
  253. package/dist/form/components/form.js.map +1 -1
  254. package/dist/form/components/index.d.ts +3 -0
  255. package/dist/form/components/index.js +4 -1
  256. package/dist/form/components/override-keys.d.ts +2 -0
  257. package/dist/form/components/override-keys.js +12 -0
  258. package/dist/form/components/override-keys.js.map +1 -0
  259. package/dist/form/components/prefill-context.d.ts +5 -0
  260. package/dist/form/components/prefill-context.js +11 -0
  261. package/dist/form/components/prefill-context.js.map +1 -0
  262. package/dist/form/components/prefill-targets.d.ts +17 -0
  263. package/dist/form/components/prefill-targets.js +73 -0
  264. package/dist/form/components/prefill-targets.js.map +1 -0
  265. package/dist/form/components/resolved-nodes.js +4 -1
  266. package/dist/form/components/resolved-nodes.js.map +1 -1
  267. package/dist/form/components/row-layout-context.d.ts +5 -0
  268. package/dist/form/components/row-layout-context.js +18 -0
  269. package/dist/form/components/row-layout-context.js.map +1 -0
  270. package/dist/form/components/use-controlled-field.d.ts +2 -0
  271. package/dist/form/components/use-controlled-field.js +13 -5
  272. package/dist/form/components/use-controlled-field.js.map +1 -1
  273. package/dist/form/components/use-dependent-field.js +7 -1
  274. package/dist/form/components/use-dependent-field.js.map +1 -1
  275. package/dist/form/components/use-field-commit.d.ts +4 -0
  276. package/dist/form/components/use-field-commit.js +21 -7
  277. package/dist/form/components/use-field-commit.js.map +1 -1
  278. package/dist/form/components/use-form-resolver.d.ts +6 -1
  279. package/dist/form/components/use-form-resolver.js +50 -5
  280. package/dist/form/components/use-form-resolver.js.map +1 -1
  281. package/dist/form/components/use-seed-default.js +8 -3
  282. package/dist/form/components/use-seed-default.js.map +1 -1
  283. package/dist/form/components/values.js +20 -5
  284. package/dist/form/components/values.js.map +1 -1
  285. package/dist/form/index.js +13 -10
  286. package/dist/form/index.js.map +1 -1
  287. package/dist/form/skeleton.js +5 -4
  288. package/dist/form/skeleton.js.map +1 -1
  289. package/dist/i18n/backend.d.ts +7 -5
  290. package/dist/i18n/backend.js +23 -8
  291. package/dist/i18n/backend.js.map +1 -1
  292. package/dist/i18n/config.d.ts +6 -0
  293. package/dist/i18n/config.js +36 -0
  294. package/dist/i18n/config.js.map +1 -0
  295. package/dist/i18n/index.d.ts +7 -1
  296. package/dist/i18n/index.js +5 -1
  297. package/dist/i18n/instance.d.ts +27 -0
  298. package/dist/i18n/instance.js +63 -16
  299. package/dist/i18n/instance.js.map +1 -1
  300. package/dist/i18n/locale-reload.d.ts +3 -0
  301. package/dist/i18n/locale-reload.js +17 -0
  302. package/dist/i18n/locale-reload.js.map +1 -0
  303. package/dist/i18n/locale-switcher.d.ts +21 -0
  304. package/dist/i18n/locale-switcher.js +25 -0
  305. package/dist/i18n/locale-switcher.js.map +1 -0
  306. package/dist/i18n/locale.d.ts +9 -0
  307. package/dist/i18n/locale.js +93 -0
  308. package/dist/i18n/locale.js.map +1 -0
  309. package/dist/i18n/page-props.d.ts +3 -0
  310. package/dist/i18n/page-props.js +24 -0
  311. package/dist/i18n/page-props.js.map +1 -0
  312. package/dist/i18n/translatable.d.ts +4 -0
  313. package/dist/i18n/translatable.js +24 -0
  314. package/dist/i18n/translatable.js.map +1 -0
  315. package/dist/index.d.ts +20 -8
  316. package/dist/index.js +19 -7
  317. package/dist/inertia.d.ts +2 -1
  318. package/dist/inertia.js +9 -2
  319. package/dist/inertia.js.map +1 -1
  320. package/dist/lattice.css +148 -22
  321. package/dist/layout/breadcrumbs.d.ts +3 -0
  322. package/dist/layout/breadcrumbs.js +34 -0
  323. package/dist/layout/breadcrumbs.js.map +1 -0
  324. package/dist/layout/callouts.d.ts +3 -0
  325. package/dist/layout/callouts.js +67 -0
  326. package/dist/layout/callouts.js.map +1 -0
  327. package/dist/layout/components.js +9 -1
  328. package/dist/layout/components.js.map +1 -1
  329. package/dist/layout/context.d.ts +2 -10
  330. package/dist/layout/context.js +3 -14
  331. package/dist/layout/context.js.map +1 -1
  332. package/dist/layout/dropdown.d.ts +3 -0
  333. package/dist/layout/dropdown.js +24 -0
  334. package/dist/layout/dropdown.js.map +1 -0
  335. package/dist/layout/index.d.ts +2 -1
  336. package/dist/layout/index.js +3 -1
  337. package/dist/layout/menu-item.js +54 -62
  338. package/dist/layout/menu-item.js.map +1 -1
  339. package/dist/layout/menu.js.map +1 -1
  340. package/dist/layout/outlet.js +2 -2
  341. package/dist/layout/outlet.js.map +1 -1
  342. package/dist/layout/popover.d.ts +17 -0
  343. package/dist/layout/popover.js +46 -0
  344. package/dist/layout/popover.js.map +1 -0
  345. package/dist/layout/schema-layout.js +2 -9
  346. package/dist/layout/schema-layout.js.map +1 -1
  347. package/dist/layout/sidebar.js +4 -4
  348. package/dist/layout/sidebar.js.map +1 -1
  349. package/dist/layout/topbar.d.ts +3 -0
  350. package/dist/layout/topbar.js +15 -0
  351. package/dist/layout/topbar.js.map +1 -0
  352. package/dist/page.js +16 -17
  353. package/dist/page.js.map +1 -1
  354. package/dist/provider.d.ts +2 -4
  355. package/dist/provider.js +5 -9
  356. package/dist/provider.js.map +1 -1
  357. package/dist/realtime/build-effects.d.ts +4 -0
  358. package/dist/realtime/build-effects.js +23 -0
  359. package/dist/realtime/build-effects.js.map +1 -0
  360. package/dist/realtime/listeners.d.ts +8 -0
  361. package/dist/realtime/listeners.js +31 -0
  362. package/dist/realtime/listeners.js.map +1 -0
  363. package/dist/realtime/subscriptions.d.ts +4 -0
  364. package/dist/realtime/subscriptions.js +45 -0
  365. package/dist/realtime/subscriptions.js.map +1 -0
  366. package/dist/registry.js +3 -1
  367. package/dist/registry.js.map +1 -1
  368. package/dist/remote/components/chat-box.d.ts +3 -0
  369. package/dist/remote/components/chat-box.js +65 -0
  370. package/dist/remote/components/chat-box.js.map +1 -0
  371. package/dist/remote/components/data-list.d.ts +10 -0
  372. package/dist/remote/components/data-list.js +106 -0
  373. package/dist/remote/components/data-list.js.map +1 -0
  374. package/dist/remote/index.d.ts +1 -0
  375. package/dist/remote/index.js +15 -0
  376. package/dist/remote/index.js.map +1 -0
  377. package/dist/svg-sprite-client/index.d.ts +1 -0
  378. package/dist/svg-sprite-client/index.js +0 -0
  379. package/dist/svg-sprite-client.d.ts +1 -0
  380. package/dist/table/align.d.ts +4 -0
  381. package/dist/table/align.js +23 -0
  382. package/dist/table/align.js.map +1 -0
  383. package/dist/table/bulk.js +1 -1
  384. package/dist/table/bulk.js.map +1 -1
  385. package/dist/table/components/bulk-bar.js +8 -5
  386. package/dist/table/components/bulk-bar.js.map +1 -1
  387. package/dist/table/components/cells/badge-cell.d.ts +2 -5
  388. package/dist/table/components/cells/badge-cell.js +3 -3
  389. package/dist/table/components/cells/badge-cell.js.map +1 -1
  390. package/dist/table/components/cells/boolean-cell.d.ts +3 -0
  391. package/dist/table/components/cells/boolean-cell.js +23 -0
  392. package/dist/table/components/cells/boolean-cell.js.map +1 -0
  393. package/dist/table/components/cells/icon-cell.d.ts +2 -5
  394. package/dist/table/components/cells/icon-cell.js +4 -5
  395. package/dist/table/components/cells/icon-cell.js.map +1 -1
  396. package/dist/table/components/cells/image-cell.d.ts +2 -5
  397. package/dist/table/components/cells/image-cell.js +4 -5
  398. package/dist/table/components/cells/image-cell.js.map +1 -1
  399. package/dist/table/components/cells/money-cell.d.ts +2 -0
  400. package/dist/table/components/cells/money-cell.js +28 -0
  401. package/dist/table/components/cells/money-cell.js.map +1 -0
  402. package/dist/table/components/cells/number-cell.d.ts +2 -0
  403. package/dist/table/components/cells/number-cell.js +25 -0
  404. package/dist/table/components/cells/number-cell.js.map +1 -0
  405. package/dist/table/components/cells/numeric.d.ts +2 -0
  406. package/dist/table/components/cells/numeric.js +10 -0
  407. package/dist/table/components/cells/numeric.js.map +1 -0
  408. package/dist/table/components/cells/stack-cell.d.ts +3 -0
  409. package/dist/table/components/cells/stack-cell.js +17 -0
  410. package/dist/table/components/cells/stack-cell.js.map +1 -0
  411. package/dist/table/components/cells/text-cell.d.ts +2 -6
  412. package/dist/table/components/cells/text-cell.js +6 -7
  413. package/dist/table/components/cells/text-cell.js.map +1 -1
  414. package/dist/table/components/column-filter-control.d.ts +4 -1
  415. package/dist/table/components/column-filter-control.js +82 -11
  416. package/dist/table/components/column-filter-control.js.map +1 -1
  417. package/dist/table/components/column-header.d.ts +3 -1
  418. package/dist/table/components/column-header.js +11 -8
  419. package/dist/table/components/column-header.js.map +1 -1
  420. package/dist/table/components/filter-bar.d.ts +16 -0
  421. package/dist/table/components/filter-bar.js +104 -0
  422. package/dist/table/components/filter-bar.js.map +1 -0
  423. package/dist/table/components/filter-controls.d.ts +18 -0
  424. package/dist/table/components/filter-controls.js +256 -0
  425. package/dist/table/components/filter-controls.js.map +1 -0
  426. package/dist/table/components/filter-stack-bar.js +4 -3
  427. package/dist/table/components/filter-stack-bar.js.map +1 -1
  428. package/dist/table/components/filter-value-input.d.ts +1 -0
  429. package/dist/table/components/filter-value-input.js +7 -6
  430. package/dist/table/components/filter-value-input.js.map +1 -1
  431. package/dist/table/components/pagination.js +1 -1
  432. package/dist/table/components/pagination.js.map +1 -1
  433. package/dist/table/components/sort-bar.js +1 -1
  434. package/dist/table/components/sort-bar.js.map +1 -1
  435. package/dist/table/components/table-action-node.js.map +1 -1
  436. package/dist/table/components/table-cell.d.ts +1 -1
  437. package/dist/table/components/table-cell.js +18 -28
  438. package/dist/table/components/table-cell.js.map +1 -1
  439. package/dist/table/components/table.js +200 -152
  440. package/dist/table/components/table.js.map +1 -1
  441. package/dist/table/filter-values.d.ts +13 -0
  442. package/dist/table/filter-values.js +30 -0
  443. package/dist/table/filter-values.js.map +1 -0
  444. package/dist/table/format.js.map +1 -1
  445. package/dist/table/index.js.map +1 -1
  446. package/dist/table/payload.js +24 -3
  447. package/dist/table/payload.js.map +1 -1
  448. package/dist/table/query.d.ts +10 -1
  449. package/dist/table/query.js +60 -6
  450. package/dist/table/query.js.map +1 -1
  451. package/dist/table/registry.d.ts +19 -0
  452. package/dist/table/registry.js +14 -0
  453. package/dist/table/registry.js.map +1 -0
  454. package/dist/table/types.d.ts +9 -19
  455. package/dist/table/use-table.d.ts +8 -2
  456. package/dist/table/use-table.js +61 -7
  457. package/dist/table/use-table.js.map +1 -1
  458. package/dist/toast/callout.d.ts +6 -0
  459. package/dist/toast/callout.js +31 -0
  460. package/dist/toast/callout.js.map +1 -0
  461. package/dist/toast/index.d.ts +4 -0
  462. package/dist/toast/index.js +3 -1
  463. package/dist/toast/toast.d.ts +14 -0
  464. package/dist/toast/toast.js +54 -0
  465. package/dist/toast/toast.js.map +1 -0
  466. package/dist/toast/toaster.js +14 -77
  467. package/dist/toast/toaster.js.map +1 -1
  468. package/dist/toast/variant-styles.d.ts +6 -0
  469. package/dist/toast/variant-styles.js +37 -0
  470. package/dist/toast/variant-styles.js.map +1 -0
  471. package/dist/types/generated.d.ts +547 -103
  472. package/dist/types/vite-env.d.ts +1 -0
  473. package/dist/vite.d.ts +25 -0
  474. package/dist/vite.js +72 -0
  475. package/dist/vite.js.map +1 -0
  476. package/package.json +130 -13
  477. package/resources/icons/rotate-ccw.svg +16 -0
  478. package/dist/_virtual/_rolldown/runtime.js +0 -8
  479. package/dist/action/effects.d.ts +0 -11
  480. package/dist/action/effects.js +0 -44
  481. package/dist/action/effects.js.map +0 -1
  482. package/dist/form/components/base/checkbox.js.map +0 -1
  483. package/dist/node_modules/i18next/dist/esm/i18next.js +0 -1982
  484. package/dist/node_modules/i18next/dist/esm/i18next.js.map +0 -1
  485. package/dist/node_modules/i18next-http-backend/esm/index.js +0 -352
  486. package/dist/node_modules/i18next-http-backend/esm/index.js.map +0 -1
  487. package/dist/node_modules/react-i18next/dist/es/context.js +0 -23
  488. package/dist/node_modules/react-i18next/dist/es/context.js.map +0 -1
  489. package/dist/node_modules/react-i18next/dist/es/defaults.js +0 -29
  490. package/dist/node_modules/react-i18next/dist/es/defaults.js.map +0 -1
  491. package/dist/node_modules/react-i18next/dist/es/i18nInstance.js +0 -10
  492. package/dist/node_modules/react-i18next/dist/es/i18nInstance.js.map +0 -1
  493. package/dist/node_modules/react-i18next/dist/es/initReactI18next.js +0 -14
  494. package/dist/node_modules/react-i18next/dist/es/initReactI18next.js.map +0 -1
  495. package/dist/node_modules/react-i18next/dist/es/unescape.js +0 -30
  496. package/dist/node_modules/react-i18next/dist/es/unescape.js.map +0 -1
  497. package/dist/node_modules/react-i18next/dist/es/useTranslation.js +0 -157
  498. package/dist/node_modules/react-i18next/dist/es/useTranslation.js.map +0 -1
  499. package/dist/node_modules/react-i18next/dist/es/utils.js +0 -58
  500. package/dist/node_modules/react-i18next/dist/es/utils.js.map +0 -1
  501. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -70
  502. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +0 -1
  503. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +0 -61
  504. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +0 -1
  505. package/dist/node_modules/use-sync-external-store/shim/index.js +0 -13
  506. package/dist/node_modules/use-sync-external-store/shim/index.js.map +0 -1
  507. package/dist/table/column-registry.d.ts +0 -9
  508. package/dist/test-support.d.ts +0 -14
  509. package/dist/test-support.js +0 -14
  510. package/dist/test-support.js.map +0 -1
  511. /package/dist/{table/column-registry.js → chat/types.js} +0 -0
  512. /package/dist/{form/components/base → core/components}/checkbox.d.ts +0 -0
@@ -1,13 +1,13 @@
1
- import { cn } from "../../../lib/utils.js";
2
- import { Icon } from "../../../icons/sprite.js";
1
+ import { cn } from "../../lib/utils.js";
2
+ import { Icon } from "../../icons/sprite.js";
3
3
  import "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
6
- //#region resources/js/form/components/base/checkbox.tsx
6
+ //#region resources/js/core/components/checkbox.tsx
7
7
  function Checkbox({ className, ...props }) {
8
8
  return /* @__PURE__ */ jsx(CheckboxPrimitive.Root, {
9
9
  "data-slot": "checkbox",
10
- className: cn("peer border-lt-input data-[state=checked]:bg-lt-primary data-[state=checked]:text-lt-primary-fg data-[state=checked]:border-lt-primary focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger size-4 shrink-0 rounded-lt-xs border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className),
10
+ className: cn("peer border-lt-input data-[state=checked]:bg-lt-primary data-[state=checked]:text-lt-primary-fg data-[state=checked]:border-lt-primary focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger size-4 shrink-0 rounded-lt-xs border shadow-lt-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className),
11
11
  ...props,
12
12
  children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, {
13
13
  "data-slot": "checkbox-indicator",
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.js","names":[],"sources":["../../../resources/js/core/components/checkbox.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as React from \"react\";\n\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer border-lt-input data-[state=checked]:bg-lt-primary data-[state=checked]:text-lt-primary-fg data-[state=checked]:border-lt-primary focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger size-4 shrink-0 rounded-lt-xs border shadow-lt-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current transition-none\"\n >\n <Icon name=\"check\" className=\"size-lt-icon-sm\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox };\n"],"mappings":";;;;;;AAMA,SAAS,SAAS,EAAE,WAAW,GAAG,SAA8D;CAC9F,OACE,oBAAC,kBAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,gcACA,SACF;EACA,GAAI;YAEJ,oBAAC,kBAAkB,WAAnB;GACE,aAAU;GACV,WAAU;aAEV,oBAAC,MAAD;IAAM,MAAK;IAAQ,WAAU;GAAmB,CAAA;EACrB,CAAA;CACP,CAAA;AAE5B"}
@@ -0,0 +1,33 @@
1
+ import { Option } from '../types';
2
+ import * as React from "react";
3
+ /**
4
+ * A popover select list with an optional search box and single/multi selection.
5
+ *
6
+ * Selection state is controlled by the consumer (`selected` + `onSelect`); the
7
+ * consumer also owns option fetching. Pass `onSearch` for remote search (the
8
+ * combobox debounces the query and renders `options` as given); omit it to
9
+ * filter the provided `options` locally by label. The combobox closes itself
10
+ * after a single-select.
11
+ */
12
+ declare function Combobox({ contentClassName, emptyLabel, loading, multiple, onSearch, onSelect, open, onOpenChange, options, searchLabel, searchPlaceholder, selected, showSearch, testId, trigger, triggerClassName, triggerProps, }: {
13
+ contentClassName?: string;
14
+ emptyLabel?: string;
15
+ loading?: boolean;
16
+ multiple?: boolean;
17
+ onSearch?: (query: string) => void;
18
+ onSelect: (value: string) => void;
19
+ open: boolean;
20
+ onOpenChange: (open: boolean) => void;
21
+ options: Option[];
22
+ searchLabel?: string;
23
+ searchPlaceholder?: string;
24
+ selected: string[];
25
+ showSearch?: boolean;
26
+ testId?: string;
27
+ trigger: React.ReactNode;
28
+ triggerClassName?: string;
29
+ triggerProps?: React.ComponentProps<"button"> & {
30
+ "data-test"?: string;
31
+ };
32
+ }): React.JSX.Element;
33
+ export { Combobox };
@@ -0,0 +1,99 @@
1
+ import { cn } from "../../lib/utils.js";
2
+ import { Icon } from "../../icons/sprite.js";
3
+ import { useT } from "../../i18n/instance.js";
4
+ import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
5
+ import { useEffect, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region resources/js/core/components/combobox.tsx
8
+ var SEARCH_DEBOUNCE_MS = 250;
9
+ /**
10
+ * A popover select list with an optional search box and single/multi selection.
11
+ *
12
+ * Selection state is controlled by the consumer (`selected` + `onSelect`); the
13
+ * consumer also owns option fetching. Pass `onSearch` for remote search (the
14
+ * combobox debounces the query and renders `options` as given); omit it to
15
+ * filter the provided `options` locally by label. The combobox closes itself
16
+ * after a single-select.
17
+ */
18
+ function Combobox({ contentClassName, emptyLabel, loading = false, multiple = false, onSearch, onSelect, open, onOpenChange, options, searchLabel, searchPlaceholder, selected, showSearch = true, testId, trigger, triggerClassName, triggerProps }) {
19
+ const { t } = useT("lattice");
20
+ const [query, setQuery] = useState("");
21
+ useEffect(() => {
22
+ if (!onSearch || !open) return;
23
+ const timer = window.setTimeout(() => onSearch(query), SEARCH_DEBOUNCE_MS);
24
+ return () => window.clearTimeout(timer);
25
+ }, [
26
+ query,
27
+ onSearch,
28
+ open
29
+ ]);
30
+ const visibleOptions = onSearch ? options : options.filter((option) => option.label.toLowerCase().includes(query.toLowerCase()));
31
+ function close() {
32
+ setQuery("");
33
+ onOpenChange(false);
34
+ }
35
+ function choose(value) {
36
+ onSelect(value);
37
+ if (!multiple) close();
38
+ }
39
+ return /* @__PURE__ */ jsxs(Popover, {
40
+ open,
41
+ onOpenChange: (next) => next ? onOpenChange(true) : close(),
42
+ children: [/* @__PURE__ */ jsx(PopoverTrigger, {
43
+ asChild: true,
44
+ children: /* @__PURE__ */ jsx("button", {
45
+ type: "button",
46
+ className: triggerClassName,
47
+ ...triggerProps,
48
+ children: trigger
49
+ })
50
+ }), /* @__PURE__ */ jsxs(PopoverContent, {
51
+ align: "start",
52
+ className: cn("w-[var(--radix-popover-trigger-width)] overflow-hidden p-0", contentClassName),
53
+ children: [showSearch && /* @__PURE__ */ jsxs("div", {
54
+ className: "flex items-center gap-2 border-b border-lt-border px-3 py-2",
55
+ children: [/* @__PURE__ */ jsx("input", {
56
+ "aria-label": searchLabel ?? t("a11y.searchOptions", "Search options"),
57
+ "data-slot": "combobox-search",
58
+ "data-test": testId ? `${testId}-search` : void 0,
59
+ className: "w-full bg-transparent text-sm outline-none placeholder:text-lt-muted-fg",
60
+ onChange: (event) => setQuery(event.target.value),
61
+ placeholder: searchPlaceholder,
62
+ value: query
63
+ }), loading && /* @__PURE__ */ jsx(Icon, {
64
+ name: "loader-2",
65
+ "aria-hidden": "true",
66
+ className: "size-lt-icon-md shrink-0 animate-spin text-lt-muted-fg"
67
+ })]
68
+ }), /* @__PURE__ */ jsx("div", {
69
+ className: "max-h-60 overflow-y-auto p-1",
70
+ role: "listbox",
71
+ children: visibleOptions.length === 0 ? /* @__PURE__ */ jsx("p", {
72
+ className: "px-3 py-2 text-sm text-lt-muted-fg",
73
+ children: emptyLabel
74
+ }) : visibleOptions.map((option) => {
75
+ const isSelected = selected.includes(option.value);
76
+ return /* @__PURE__ */ jsxs("button", {
77
+ "aria-selected": isSelected,
78
+ className: cn("flex w-full items-center justify-between gap-2 rounded-lt-sm px-3 py-1.5 text-left text-sm transition-colors hover:bg-lt-accent hover:text-lt-accent-fg", isSelected && "bg-lt-accent/60"),
79
+ "data-slot": "combobox-option",
80
+ "data-test": testId ? `${testId}-option-${option.value}` : void 0,
81
+ "data-value": option.value,
82
+ onClick: () => choose(option.value),
83
+ role: "option",
84
+ type: "button",
85
+ children: [option.label, isSelected && /* @__PURE__ */ jsx(Icon, {
86
+ name: "check",
87
+ "aria-hidden": "true",
88
+ className: "size-lt-icon-md shrink-0"
89
+ })]
90
+ }, option.value);
91
+ })
92
+ })]
93
+ })]
94
+ });
95
+ }
96
+ //#endregion
97
+ export { Combobox };
98
+
99
+ //# sourceMappingURL=combobox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combobox.js","names":[],"sources":["../../../resources/js/core/components/combobox.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport * as React from \"react\";\nimport { useEffect, useState } from \"react\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { Option } from \"@lattice-php/lattice/core/types\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\n\nconst SEARCH_DEBOUNCE_MS = 250;\n\n/**\n * A popover select list with an optional search box and single/multi selection.\n *\n * Selection state is controlled by the consumer (`selected` + `onSelect`); the\n * consumer also owns option fetching. Pass `onSearch` for remote search (the\n * combobox debounces the query and renders `options` as given); omit it to\n * filter the provided `options` locally by label. The combobox closes itself\n * after a single-select.\n */\nfunction Combobox({\n contentClassName,\n emptyLabel,\n loading = false,\n multiple = false,\n onSearch,\n onSelect,\n open,\n onOpenChange,\n options,\n searchLabel,\n searchPlaceholder,\n selected,\n showSearch = true,\n testId,\n trigger,\n triggerClassName,\n triggerProps,\n}: {\n contentClassName?: string;\n emptyLabel?: string;\n loading?: boolean;\n multiple?: boolean;\n onSearch?: (query: string) => void;\n onSelect: (value: string) => void;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n options: Option[];\n searchLabel?: string;\n searchPlaceholder?: string;\n selected: string[];\n showSearch?: boolean;\n testId?: string;\n trigger: React.ReactNode;\n triggerClassName?: string;\n triggerProps?: React.ComponentProps<\"button\"> & { \"data-test\"?: string };\n}) {\n const { t } = useT(\"lattice\");\n const [query, setQuery] = useState(\"\");\n\n useEffect(() => {\n if (!onSearch || !open) {\n return;\n }\n\n const timer = window.setTimeout(() => onSearch(query), SEARCH_DEBOUNCE_MS);\n\n return () => window.clearTimeout(timer);\n }, [query, onSearch, open]);\n\n const visibleOptions = onSearch\n ? options\n : options.filter((option) => option.label.toLowerCase().includes(query.toLowerCase()));\n\n function close(): void {\n setQuery(\"\");\n onOpenChange(false);\n }\n\n function choose(value: string): void {\n onSelect(value);\n\n if (!multiple) {\n close();\n }\n }\n\n return (\n <Popover open={open} onOpenChange={(next) => (next ? onOpenChange(true) : close())}>\n <PopoverTrigger asChild>\n <button type=\"button\" className={triggerClassName} {...triggerProps}>\n {trigger}\n </button>\n </PopoverTrigger>\n\n <PopoverContent\n align=\"start\"\n className={cn(\n \"w-[var(--radix-popover-trigger-width)] overflow-hidden p-0\",\n contentClassName,\n )}\n >\n {showSearch && (\n <div className=\"flex items-center gap-2 border-b border-lt-border px-3 py-2\">\n <input\n aria-label={searchLabel ?? t(\"a11y.searchOptions\", \"Search options\")}\n data-slot=\"combobox-search\"\n data-test={testId ? `${testId}-search` : undefined}\n className=\"w-full bg-transparent text-sm outline-none placeholder:text-lt-muted-fg\"\n onChange={(event) => setQuery(event.target.value)}\n placeholder={searchPlaceholder}\n value={query}\n />\n {loading && (\n <Icon\n name=\"loader-2\"\n aria-hidden=\"true\"\n className=\"size-lt-icon-md shrink-0 animate-spin text-lt-muted-fg\"\n />\n )}\n </div>\n )}\n\n <div className=\"max-h-60 overflow-y-auto p-1\" role=\"listbox\">\n {visibleOptions.length === 0 ? (\n <p className=\"px-3 py-2 text-sm text-lt-muted-fg\">{emptyLabel}</p>\n ) : (\n visibleOptions.map((option) => {\n const isSelected = selected.includes(option.value);\n\n return (\n <button\n aria-selected={isSelected}\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded-lt-sm px-3 py-1.5 text-left text-sm transition-colors hover:bg-lt-accent hover:text-lt-accent-fg\",\n isSelected && \"bg-lt-accent/60\",\n )}\n data-slot=\"combobox-option\"\n data-test={testId ? `${testId}-option-${option.value}` : undefined}\n data-value={option.value}\n key={option.value}\n onClick={() => choose(option.value)}\n role=\"option\"\n type=\"button\"\n >\n {option.label}\n {isSelected && (\n <Icon name=\"check\" aria-hidden=\"true\" className=\"size-lt-icon-md shrink-0\" />\n )}\n </button>\n );\n })\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nexport { Combobox };\n"],"mappings":";;;;;;;AAQA,IAAM,qBAAqB;;;;;;;;;;AAW3B,SAAS,SAAS,EAChB,kBACA,YACA,UAAU,OACV,WAAW,OACX,UACA,UACA,MACA,cACA,SACA,aACA,mBACA,UACA,aAAa,MACb,QACA,SACA,kBACA,gBAmBC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CAErC,gBAAgB;EACd,IAAI,CAAC,YAAY,CAAC,MAChB;EAGF,MAAM,QAAQ,OAAO,iBAAiB,SAAS,KAAK,GAAG,kBAAkB;EAEzE,aAAa,OAAO,aAAa,KAAK;CACxC,GAAG;EAAC;EAAO;EAAU;CAAI,CAAC;CAE1B,MAAM,iBAAiB,WACnB,UACA,QAAQ,QAAQ,WAAW,OAAO,MAAM,YAAY,EAAE,SAAS,MAAM,YAAY,CAAC,CAAC;CAEvF,SAAS,QAAc;EACrB,SAAS,EAAE;EACX,aAAa,KAAK;CACpB;CAEA,SAAS,OAAO,OAAqB;EACnC,SAAS,KAAK;EAEd,IAAI,CAAC,UACH,MAAM;CAEV;CAEA,OACE,qBAAC,SAAD;EAAe;EAAM,eAAe,SAAU,OAAO,aAAa,IAAI,IAAI,MAAM;YAAhF,CACE,oBAAC,gBAAD;GAAgB,SAAA;aACd,oBAAC,UAAD;IAAQ,MAAK;IAAS,WAAW;IAAkB,GAAI;cACpD;GACK,CAAA;EACM,CAAA,GAEhB,qBAAC,gBAAD;GACE,OAAM;GACN,WAAW,GACT,8DACA,gBACF;aALF,CAOG,cACC,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,SAAD;KACE,cAAY,eAAe,EAAE,sBAAsB,gBAAgB;KACnE,aAAU;KACV,aAAW,SAAS,GAAG,OAAO,WAAW,KAAA;KACzC,WAAU;KACV,WAAW,UAAU,SAAS,MAAM,OAAO,KAAK;KAChD,aAAa;KACb,OAAO;IACR,CAAA,GACA,WACC,oBAAC,MAAD;KACE,MAAK;KACL,eAAY;KACZ,WAAU;IACX,CAAA,CAEA;OAGP,oBAAC,OAAD;IAAK,WAAU;IAA+B,MAAK;cAChD,eAAe,WAAW,IACzB,oBAAC,KAAD;KAAG,WAAU;eAAsC;IAAc,CAAA,IAEjE,eAAe,KAAK,WAAW;KAC7B,MAAM,aAAa,SAAS,SAAS,OAAO,KAAK;KAEjD,OACE,qBAAC,UAAD;MACE,iBAAe;MACf,WAAW,GACT,2JACA,cAAc,iBAChB;MACA,aAAU;MACV,aAAW,SAAS,GAAG,OAAO,UAAU,OAAO,UAAU,KAAA;MACzD,cAAY,OAAO;MAEnB,eAAe,OAAO,OAAO,KAAK;MAClC,MAAK;MACL,MAAK;gBAZP,CAcG,OAAO,OACP,cACC,oBAAC,MAAD;OAAM,MAAK;OAAQ,eAAY;OAAO,WAAU;MAA4B,CAAA,CAExE;QATD,OAAO,KASN;IAEZ,CAAC;GAEA,CAAA,CACS;IACT;;AAEb"}
@@ -1,31 +1,25 @@
1
1
  import { Button } from "./button.js";
2
+ import { Dialog, DialogContent, DialogDescription, DialogTitle } from "./dialog.js";
2
3
  import { Spinner } from "./spinner.js";
3
4
  import { jsx, jsxs } from "react/jsx-runtime";
4
- import * as Dialog from "@radix-ui/react-dialog";
5
5
  //#region resources/js/core/components/confirm-dialog.tsx
6
6
  function ConfirmDialog({ title, description, confirmLabel, cancelLabel = "Cancel", confirmVariant = "default", processing = false, confirmDisabled = false, onConfirm, onCancel }) {
7
7
  const blockWhileProcessing = (event) => {
8
8
  if (processing) event.preventDefault();
9
9
  };
10
- return /* @__PURE__ */ jsx(Dialog.Root, {
10
+ return /* @__PURE__ */ jsx(Dialog, {
11
11
  open: true,
12
12
  onOpenChange: (open) => {
13
13
  if (!open) onCancel();
14
14
  },
15
- children: /* @__PURE__ */ jsxs(Dialog.Portal, { children: [/* @__PURE__ */ jsx(Dialog.Overlay, { className: "fixed inset-0 z-50 bg-black/50" }), /* @__PURE__ */ jsxs(Dialog.Content, {
15
+ children: /* @__PURE__ */ jsxs(DialogContent, {
16
16
  ...description ? {} : { "aria-describedby": void 0 },
17
- className: "fixed left-1/2 top-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lt border border-lt-border bg-lt-bg p-6 shadow-lg",
17
+ className: "w-full max-w-md",
18
18
  onEscapeKeyDown: blockWhileProcessing,
19
19
  onInteractOutside: blockWhileProcessing,
20
20
  children: [/* @__PURE__ */ jsxs("div", {
21
21
  className: "grid gap-2",
22
- children: [/* @__PURE__ */ jsx(Dialog.Title, {
23
- className: "text-lg font-semibold leading-none tracking-tight",
24
- children: title
25
- }), description && /* @__PURE__ */ jsx(Dialog.Description, {
26
- className: "text-sm text-lt-muted-fg",
27
- children: description
28
- })]
22
+ children: [/* @__PURE__ */ jsx(DialogTitle, { children: title }), description && /* @__PURE__ */ jsx(DialogDescription, { children: description })]
29
23
  }), /* @__PURE__ */ jsxs("div", {
30
24
  className: "mt-6 flex justify-end gap-2",
31
25
  children: [/* @__PURE__ */ jsx(Button, {
@@ -44,7 +38,7 @@ function ConfirmDialog({ title, description, confirmLabel, cancelLabel = "Cancel
44
38
  children: [processing && /* @__PURE__ */ jsx(Spinner, {}), confirmLabel]
45
39
  })]
46
40
  })]
47
- })] })
41
+ })
48
42
  });
49
43
  }
50
44
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"confirm-dialog.js","names":[],"sources":["../../../resources/js/core/components/confirm-dialog.tsx"],"sourcesContent":["import * as Dialog from \"@radix-ui/react-dialog\";\nimport type { ButtonVariant } from \"@lattice/lattice/types/generated\";\nimport { Button } from \"./button\";\nimport { Spinner } from \"./spinner\";\n\nexport function ConfirmDialog({\n title,\n description,\n confirmLabel,\n cancelLabel = \"Cancel\",\n confirmVariant = \"default\",\n processing = false,\n confirmDisabled = false,\n onConfirm,\n onCancel,\n}: {\n title: string;\n description?: string;\n confirmLabel: string;\n cancelLabel?: string;\n confirmVariant?: ButtonVariant;\n processing?: boolean;\n confirmDisabled?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}) {\n const blockWhileProcessing = (event: Event): void => {\n if (processing) {\n event.preventDefault();\n }\n };\n\n return (\n <Dialog.Root\n open\n onOpenChange={(open) => {\n if (!open) {\n onCancel();\n }\n }}\n >\n <Dialog.Portal>\n <Dialog.Overlay className=\"fixed inset-0 z-50 bg-black/50\" />\n <Dialog.Content\n {...(description ? {} : { \"aria-describedby\": undefined })}\n className=\"fixed left-1/2 top-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 rounded-lt border border-lt-border bg-lt-bg p-6 shadow-lg\"\n onEscapeKeyDown={blockWhileProcessing}\n onInteractOutside={blockWhileProcessing}\n >\n <div className=\"grid gap-2\">\n <Dialog.Title className=\"text-lg font-semibold leading-none tracking-tight\">\n {title}\n </Dialog.Title>\n {description && (\n <Dialog.Description className=\"text-sm text-lt-muted-fg\">\n {description}\n </Dialog.Description>\n )}\n </div>\n <div className=\"mt-6 flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n data-test=\"confirm-cancel\"\n disabled={processing}\n onClick={onCancel}\n >\n {cancelLabel}\n </Button>\n <Button\n type=\"button\"\n variant={confirmVariant}\n data-test=\"confirm-accept\"\n disabled={processing || confirmDisabled}\n onClick={onConfirm}\n >\n {processing && <Spinner />}\n {confirmLabel}\n </Button>\n </div>\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,cAAc,EAC5B,OACA,aACA,cACA,cAAc,UACd,iBAAiB,WACjB,aAAa,OACb,kBAAkB,OAClB,WACA,YAWC;CACD,MAAM,wBAAwB,UAAuB;EACnD,IAAI,YACF,MAAM,eAAe;CAEzB;CAEA,OACE,oBAAC,OAAO,MAAR;EACE,MAAA;EACA,eAAe,SAAS;GACtB,IAAI,CAAC,MACH,SAAS;EAEb;YAEA,qBAAC,OAAO,QAAR,EAAA,UAAA,CACE,oBAAC,OAAO,SAAR,EAAgB,WAAU,iCAAkC,CAAA,GAC5D,qBAAC,OAAO,SAAR;GACE,GAAK,cAAc,CAAC,IAAI,EAAE,oBAAoB,KAAA,EAAU;GACxD,WAAU;GACV,iBAAiB;GACjB,mBAAmB;aAJrB,CAME,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,OAAO,OAAR;KAAc,WAAU;eACrB;IACW,CAAA,GACb,eACC,oBAAC,OAAO,aAAR;KAAoB,WAAU;eAC3B;IACiB,CAAA,CAEnB;OACL,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,QAAD;KACE,MAAK;KACL,SAAQ;KACR,aAAU;KACV,UAAU;KACV,SAAS;eAER;IACK,CAAA,GACR,qBAAC,QAAD;KACE,MAAK;KACL,SAAS;KACT,aAAU;KACV,UAAU,cAAc;KACxB,SAAS;eALX,CAOG,cAAc,oBAAC,SAAD,CAAU,CAAA,GACxB,YACK;MACL;KACS;IACH,EAAA,CAAA;CACJ,CAAA;AAEjB"}
1
+ {"version":3,"file":"confirm-dialog.js","names":[],"sources":["../../../resources/js/core/components/confirm-dialog.tsx"],"sourcesContent":["import type { ButtonVariant } from \"@lattice-php/lattice/types/generated\";\nimport { Button } from \"./button\";\nimport { Dialog, DialogContent, DialogDescription, DialogTitle } from \"./dialog\";\nimport { Spinner } from \"./spinner\";\n\nexport function ConfirmDialog({\n title,\n description,\n confirmLabel,\n cancelLabel = \"Cancel\",\n confirmVariant = \"default\",\n processing = false,\n confirmDisabled = false,\n onConfirm,\n onCancel,\n}: {\n title: string;\n description?: string;\n confirmLabel: string;\n cancelLabel?: string;\n confirmVariant?: ButtonVariant;\n processing?: boolean;\n confirmDisabled?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}) {\n const blockWhileProcessing = (event: Event): void => {\n if (processing) {\n event.preventDefault();\n }\n };\n\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open) {\n onCancel();\n }\n }}\n >\n <DialogContent\n {...(description ? {} : { \"aria-describedby\": undefined })}\n className=\"w-full max-w-md\"\n onEscapeKeyDown={blockWhileProcessing}\n onInteractOutside={blockWhileProcessing}\n >\n <div className=\"grid gap-2\">\n <DialogTitle>{title}</DialogTitle>\n {description && <DialogDescription>{description}</DialogDescription>}\n </div>\n <div className=\"mt-6 flex justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n data-test=\"confirm-cancel\"\n disabled={processing}\n onClick={onCancel}\n >\n {cancelLabel}\n </Button>\n <Button\n type=\"button\"\n variant={confirmVariant}\n data-test=\"confirm-accept\"\n disabled={processing || confirmDisabled}\n onClick={onConfirm}\n >\n {processing && <Spinner />}\n {confirmLabel}\n </Button>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,cAAc,EAC5B,OACA,aACA,cACA,cAAc,UACd,iBAAiB,WACjB,aAAa,OACb,kBAAkB,OAClB,WACA,YAWC;CACD,MAAM,wBAAwB,UAAuB;EACnD,IAAI,YACF,MAAM,eAAe;CAEzB;CAEA,OACE,oBAAC,QAAD;EACE,MAAA;EACA,eAAe,SAAS;GACtB,IAAI,CAAC,MACH,SAAS;EAEb;YAEA,qBAAC,eAAD;GACE,GAAK,cAAc,CAAC,IAAI,EAAE,oBAAoB,KAAA,EAAU;GACxD,WAAU;GACV,iBAAiB;GACjB,mBAAmB;aAJrB,CAME,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,aAAD,EAAA,UAAc,MAAmB,CAAA,GAChC,eAAe,oBAAC,mBAAD,EAAA,UAAoB,YAA+B,CAAA,CAChE;OACL,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,QAAD;KACE,MAAK;KACL,SAAQ;KACR,aAAU;KACV,UAAU;KACV,SAAS;eAER;IACK,CAAA,GACR,qBAAC,QAAD;KACE,MAAK;KACL,SAAS;KACT,aAAU;KACV,UAAU,cAAc;KACxB,SAAS;eALX,CAOG,cAAc,oBAAC,SAAD,CAAU,CAAA,GACxB,YACK;MACL;KACQ;;CACT,CAAA;AAEZ"}
@@ -0,0 +1,13 @@
1
+ import { VariantProps } from 'class-variance-authority';
2
+ /** The focus-visible ring shared by every interactive control surface. */
3
+ export declare const FOCUS_RING = "focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px]";
4
+ /**
5
+ * The shared chrome for single-line form/table controls (text inputs, native
6
+ * selects, and the Select/filter trigger buttons). `density` is the only axis
7
+ * that differs between forms (comfortable) and table filters (compact); the
8
+ * border, focus ring, invalid, and disabled treatment are unified.
9
+ */
10
+ export declare const controlSurface: (props?: ({
11
+ density?: "comfortable" | "compact" | null | undefined;
12
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
13
+ export type ControlSurfaceVariants = VariantProps<typeof controlSurface>;
@@ -0,0 +1,27 @@
1
+ import { cva } from "class-variance-authority";
2
+ //#region resources/js/core/components/control.ts
3
+ /** The focus-visible ring shared by every interactive control surface. */
4
+ var FOCUS_RING = "focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px]";
5
+ /**
6
+ * The shared chrome for single-line form/table controls (text inputs, native
7
+ * selects, and the Select/filter trigger buttons). `density` is the only axis
8
+ * that differs between forms (comfortable) and table filters (compact); the
9
+ * border, focus ring, invalid, and disabled treatment are unified.
10
+ */
11
+ var controlSurface = cva([
12
+ "w-full min-w-0 rounded-lt-sm border border-lt-input shadow-lt-xs outline-none transition-[color,box-shadow]",
13
+ "placeholder:text-lt-muted-fg",
14
+ FOCUS_RING,
15
+ "aria-invalid:border-lt-danger aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40",
16
+ "disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-lt-disabled disabled:text-lt-disabled-fg"
17
+ ], {
18
+ variants: { density: {
19
+ comfortable: "h-lt-control-md bg-transparent px-3 py-1 text-base",
20
+ compact: "h-lt-control-md bg-lt-bg px-2 text-sm font-normal"
21
+ } },
22
+ defaultVariants: { density: "comfortable" }
23
+ });
24
+ //#endregion
25
+ export { FOCUS_RING, controlSurface };
26
+
27
+ //# sourceMappingURL=control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","names":[],"sources":["../../../resources/js/core/components/control.ts"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\n\n/** The focus-visible ring shared by every interactive control surface. */\nexport const FOCUS_RING =\n \"focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px]\";\n\n/**\n * The shared chrome for single-line form/table controls (text inputs, native\n * selects, and the Select/filter trigger buttons). `density` is the only axis\n * that differs between forms (comfortable) and table filters (compact); the\n * border, focus ring, invalid, and disabled treatment are unified.\n */\nexport const controlSurface = cva(\n [\n \"w-full min-w-0 rounded-lt-sm border border-lt-input shadow-lt-xs outline-none transition-[color,box-shadow]\",\n \"placeholder:text-lt-muted-fg\",\n FOCUS_RING,\n \"aria-invalid:border-lt-danger aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-lt-disabled disabled:text-lt-disabled-fg\",\n ],\n {\n variants: {\n density: {\n comfortable: \"h-lt-control-md bg-transparent px-3 py-1 text-base\",\n compact: \"h-lt-control-md bg-lt-bg px-2 text-sm font-normal\",\n },\n },\n defaultVariants: { density: \"comfortable\" },\n },\n);\n\nexport type ControlSurfaceVariants = VariantProps<typeof controlSurface>;\n"],"mappings":";;;AAGA,IAAa,aACX;;;;;;;AAQF,IAAa,iBAAiB,IAC5B;CACE;CACA;CACA;CACA;CACA;AACF,GACA;CACE,UAAU,EACR,SAAS;EACP,aAAa;EACb,SAAS;CACX,EACF;CACA,iBAAiB,EAAE,SAAS,cAAc;AAC5C,CACF"}
@@ -0,0 +1,19 @@
1
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
2
+ import * as React from "react";
3
+ export declare const DIALOG_SURFACE = "fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2 rounded-lt border border-lt-border bg-lt-bg p-6 shadow-lt-lg";
4
+ declare function Dialog(props: React.ComponentProps<typeof DialogPrimitive.Root>): React.JSX.Element;
5
+ declare function DialogClose(props: React.ComponentProps<typeof DialogPrimitive.Close>): React.JSX.Element;
6
+ declare function DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>): React.JSX.Element;
7
+ declare function DialogDescription({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Description>): React.JSX.Element;
8
+ declare function DialogContent({ children, className, ...props }: React.ComponentProps<typeof DialogPrimitive.Content>): React.JSX.Element;
9
+ /**
10
+ * The shared dialog header: a title with an optional description and a ghost
11
+ * close button. Pass `description` as `undefined` to suppress the description
12
+ * and the matching `aria-describedby` wiring on the content.
13
+ */
14
+ declare function DialogHeader({ closeLabel, description, title, }: {
15
+ closeLabel?: string;
16
+ description?: React.ReactNode;
17
+ title: React.ReactNode;
18
+ }): React.JSX.Element;
19
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogHeader, DialogTitle };
@@ -0,0 +1,76 @@
1
+ import { cn } from "../../lib/utils.js";
2
+ import { Button } from "./button.js";
3
+ import { Icon } from "../../icons/sprite.js";
4
+ import "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
7
+ //#region resources/js/core/components/dialog.tsx
8
+ var DIALOG_SURFACE = "fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2 rounded-lt border border-lt-border bg-lt-bg p-6 shadow-lt-lg";
9
+ function Dialog(props) {
10
+ return /* @__PURE__ */ jsx(DialogPrimitive.Root, {
11
+ "data-slot": "dialog",
12
+ ...props
13
+ });
14
+ }
15
+ function DialogClose(props) {
16
+ return /* @__PURE__ */ jsx(DialogPrimitive.Close, {
17
+ "data-slot": "dialog-close",
18
+ ...props
19
+ });
20
+ }
21
+ function DialogTitle({ className, ...props }) {
22
+ return /* @__PURE__ */ jsx(DialogPrimitive.Title, {
23
+ className: cn("text-lg font-semibold leading-none tracking-tight", className),
24
+ "data-slot": "dialog-title",
25
+ ...props
26
+ });
27
+ }
28
+ function DialogDescription({ className, ...props }) {
29
+ return /* @__PURE__ */ jsx(DialogPrimitive.Description, {
30
+ className: cn("text-sm text-lt-muted-fg", className),
31
+ "data-slot": "dialog-description",
32
+ ...props
33
+ });
34
+ }
35
+ function DialogContent({ children, className, ...props }) {
36
+ return /* @__PURE__ */ jsxs(DialogPrimitive.Portal, { children: [/* @__PURE__ */ jsx(DialogPrimitive.Overlay, {
37
+ className: "fixed inset-0 z-50 bg-lt-overlay",
38
+ "data-slot": "dialog-overlay"
39
+ }), /* @__PURE__ */ jsx(DialogPrimitive.Content, {
40
+ className: cn(DIALOG_SURFACE, className),
41
+ "data-slot": "dialog-content",
42
+ ...props,
43
+ children
44
+ })] });
45
+ }
46
+ /**
47
+ * The shared dialog header: a title with an optional description and a ghost
48
+ * close button. Pass `description` as `undefined` to suppress the description
49
+ * and the matching `aria-describedby` wiring on the content.
50
+ */
51
+ function DialogHeader({ closeLabel, description, title }) {
52
+ return /* @__PURE__ */ jsxs("div", {
53
+ className: "flex items-start justify-between gap-4",
54
+ children: [/* @__PURE__ */ jsxs("div", {
55
+ className: "grid gap-2",
56
+ children: [/* @__PURE__ */ jsx(DialogTitle, { children: title }), description ? /* @__PURE__ */ jsx(DialogDescription, { children: description }) : null]
57
+ }), /* @__PURE__ */ jsx(DialogClose, {
58
+ asChild: true,
59
+ children: /* @__PURE__ */ jsx(Button, {
60
+ "aria-label": closeLabel,
61
+ "data-test": "dialog-close",
62
+ size: "icon",
63
+ variant: "ghost",
64
+ children: /* @__PURE__ */ jsx(Icon, {
65
+ name: "x",
66
+ "aria-hidden": "true",
67
+ className: "size-lt-icon-md"
68
+ })
69
+ })
70
+ })]
71
+ });
72
+ }
73
+ //#endregion
74
+ export { DIALOG_SURFACE, Dialog, DialogClose, DialogContent, DialogDescription, DialogHeader, DialogTitle };
75
+
76
+ //# sourceMappingURL=dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.js","names":[],"sources":["../../../resources/js/core/components/dialog.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport * as React from \"react\";\nimport { Button } from \"@lattice-php/lattice/core/components/button\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nexport const DIALOG_SURFACE =\n \"fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2 rounded-lt border border-lt-border bg-lt-bg p-6 shadow-lt-lg\";\n\nfunction Dialog(props: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogClose(props: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n data-slot=\"dialog-title\"\n {...props}\n />\n );\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n className={cn(\"text-sm text-lt-muted-fg\", className)}\n data-slot=\"dialog-description\"\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n children,\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content>) {\n return (\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\n className=\"fixed inset-0 z-50 bg-lt-overlay\"\n data-slot=\"dialog-overlay\"\n />\n <DialogPrimitive.Content\n className={cn(DIALOG_SURFACE, className)}\n data-slot=\"dialog-content\"\n {...props}\n >\n {children}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n );\n}\n\n/**\n * The shared dialog header: a title with an optional description and a ghost\n * close button. Pass `description` as `undefined` to suppress the description\n * and the matching `aria-describedby` wiring on the content.\n */\nfunction DialogHeader({\n closeLabel,\n description,\n title,\n}: {\n closeLabel?: string;\n description?: React.ReactNode;\n title: React.ReactNode;\n}) {\n return (\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"grid gap-2\">\n <DialogTitle>{title}</DialogTitle>\n {description ? <DialogDescription>{description}</DialogDescription> : null}\n </div>\n <DialogClose asChild>\n <Button aria-label={closeLabel} data-test=\"dialog-close\" size=\"icon\" variant=\"ghost\">\n <Icon name=\"x\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n </Button>\n </DialogClose>\n </div>\n );\n}\n\nexport { Dialog, DialogClose, DialogContent, DialogDescription, DialogHeader, DialogTitle };\n"],"mappings":";;;;;;;AAMA,IAAa,iBACX;AAEF,SAAS,OAAO,OAA0D;CACxE,OAAO,oBAAC,gBAAgB,MAAjB;EAAsB,aAAU;EAAS,GAAI;CAAQ,CAAA;AAC9D;AAEA,SAAS,YAAY,OAA2D;CAC9E,OAAO,oBAAC,gBAAgB,OAAjB;EAAuB,aAAU;EAAe,GAAI;CAAQ,CAAA;AACrE;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,SAA6D;CAChG,OACE,oBAAC,gBAAgB,OAAjB;EACE,WAAW,GAAG,qDAAqD,SAAS;EAC5E,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,kBAAkB,EACzB,WACA,GAAG,SACwD;CAC3D,OACE,oBAAC,gBAAgB,aAAjB;EACE,WAAW,GAAG,4BAA4B,SAAS;EACnD,aAAU;EACV,GAAI;CACL,CAAA;AAEL;AAEA,SAAS,cAAc,EACrB,UACA,WACA,GAAG,SACoD;CACvD,OACE,qBAAC,gBAAgB,QAAjB,EAAA,UAAA,CACE,oBAAC,gBAAgB,SAAjB;EACE,WAAU;EACV,aAAU;CACX,CAAA,GACD,oBAAC,gBAAgB,SAAjB;EACE,WAAW,GAAG,gBAAgB,SAAS;EACvC,aAAU;EACV,GAAI;EAEH;CACsB,CAAA,CACH,EAAA,CAAA;AAE5B;;;;;;AAOA,SAAS,aAAa,EACpB,YACA,aACA,SAKC;CACD,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,aAAD,EAAA,UAAc,MAAmB,CAAA,GAChC,cAAc,oBAAC,mBAAD,EAAA,UAAoB,YAA+B,CAAA,IAAI,IACnE;MACL,oBAAC,aAAD;GAAa,SAAA;aACX,oBAAC,QAAD;IAAQ,cAAY;IAAY,aAAU;IAAe,MAAK;IAAO,SAAQ;cAC3E,oBAAC,MAAD;KAAM,MAAK;KAAI,eAAY;KAAO,WAAU;IAAmB,CAAA;GACzD,CAAA;EACG,CAAA,CACV;;AAET"}
@@ -0,0 +1,14 @@
1
+ import { Popover, PopoverContent, PopoverTrigger } from './popover';
2
+ import * as React from "react";
3
+ declare function DropdownMenu(props: React.ComponentProps<typeof Popover>): React.JSX.Element;
4
+ declare function DropdownMenuTrigger(props: React.ComponentProps<typeof PopoverTrigger>): React.JSX.Element;
5
+ declare function DropdownMenuContent({ className, ...props }: React.ComponentProps<typeof PopoverContent>): React.JSX.Element;
6
+ /**
7
+ * A menu entry that closes the menu when activated. Wrap the click handler in
8
+ * `onClick`; selecting the item dismisses the popover via `PopoverClose`.
9
+ */
10
+ declare function DropdownMenuItem({ children, className, destructive, icon, ...props }: React.ComponentProps<"button"> & {
11
+ destructive?: boolean;
12
+ icon?: string;
13
+ }): React.JSX.Element;
14
+ export { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger };
@@ -0,0 +1,42 @@
1
+ import { cn } from "../../lib/utils.js";
2
+ import { Icon } from "../../icons/sprite.js";
3
+ import { Popover, PopoverClose, PopoverContent, PopoverTrigger } from "./popover.js";
4
+ import "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region resources/js/core/components/dropdown-menu.tsx
7
+ function DropdownMenu(props) {
8
+ return /* @__PURE__ */ jsx(Popover, { ...props });
9
+ }
10
+ function DropdownMenuTrigger(props) {
11
+ return /* @__PURE__ */ jsx(PopoverTrigger, { ...props });
12
+ }
13
+ function DropdownMenuContent({ className, ...props }) {
14
+ return /* @__PURE__ */ jsx(PopoverContent, {
15
+ className: cn("grid min-w-40 gap-1 p-1", className),
16
+ role: "menu",
17
+ ...props
18
+ });
19
+ }
20
+ /**
21
+ * A menu entry that closes the menu when activated. Wrap the click handler in
22
+ * `onClick`; selecting the item dismisses the popover via `PopoverClose`.
23
+ */
24
+ function DropdownMenuItem({ children, className, destructive = false, icon, ...props }) {
25
+ return /* @__PURE__ */ jsx(PopoverClose, {
26
+ asChild: true,
27
+ children: /* @__PURE__ */ jsxs("button", {
28
+ type: "button",
29
+ role: "menuitem",
30
+ className: cn("flex w-full items-center gap-2 rounded-lt-sm px-3 py-1.5 text-left text-sm [&_svg]:size-lt-icon-sm", destructive ? "text-lt-danger hover:bg-lt-danger/10" : "hover:bg-lt-accent hover:text-lt-accent-fg", className),
31
+ ...props,
32
+ children: [icon ? /* @__PURE__ */ jsx(Icon, {
33
+ name: icon,
34
+ "aria-hidden": "true"
35
+ }) : null, children]
36
+ })
37
+ });
38
+ }
39
+ //#endregion
40
+ export { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger };
41
+
42
+ //# sourceMappingURL=dropdown-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropdown-menu.js","names":[],"sources":["../../../resources/js/core/components/dropdown-menu.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport * as React from \"react\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { Popover, PopoverClose, PopoverContent, PopoverTrigger } from \"./popover\";\n\nfunction DropdownMenu(props: React.ComponentProps<typeof Popover>) {\n return <Popover {...props} />;\n}\n\nfunction DropdownMenuTrigger(props: React.ComponentProps<typeof PopoverTrigger>) {\n return <PopoverTrigger {...props} />;\n}\n\nfunction DropdownMenuContent({ className, ...props }: React.ComponentProps<typeof PopoverContent>) {\n return (\n <PopoverContent className={cn(\"grid min-w-40 gap-1 p-1\", className)} role=\"menu\" {...props} />\n );\n}\n\n/**\n * A menu entry that closes the menu when activated. Wrap the click handler in\n * `onClick`; selecting the item dismisses the popover via `PopoverClose`.\n */\nfunction DropdownMenuItem({\n children,\n className,\n destructive = false,\n icon,\n ...props\n}: React.ComponentProps<\"button\"> & { destructive?: boolean; icon?: string }) {\n return (\n <PopoverClose asChild>\n <button\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n \"flex w-full items-center gap-2 rounded-lt-sm px-3 py-1.5 text-left text-sm [&_svg]:size-lt-icon-sm\",\n destructive\n ? \"text-lt-danger hover:bg-lt-danger/10\"\n : \"hover:bg-lt-accent hover:text-lt-accent-fg\",\n className,\n )}\n {...props}\n >\n {icon ? <Icon name={icon} aria-hidden=\"true\" /> : null}\n {children}\n </button>\n </PopoverClose>\n );\n}\n\nexport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger };\n"],"mappings":";;;;;;AAKA,SAAS,aAAa,OAA6C;CACjE,OAAO,oBAAC,SAAD,EAAS,GAAI,MAAQ,CAAA;AAC9B;AAEA,SAAS,oBAAoB,OAAoD;CAC/E,OAAO,oBAAC,gBAAD,EAAgB,GAAI,MAAQ,CAAA;AACrC;AAEA,SAAS,oBAAoB,EAAE,WAAW,GAAG,SAAsD;CACjG,OACE,oBAAC,gBAAD;EAAgB,WAAW,GAAG,2BAA2B,SAAS;EAAG,MAAK;EAAO,GAAI;CAAQ,CAAA;AAEjG;;;;;AAMA,SAAS,iBAAiB,EACxB,UACA,WACA,cAAc,OACd,MACA,GAAG,SACyE;CAC5E,OACE,oBAAC,cAAD;EAAc,SAAA;YACZ,qBAAC,UAAD;GACE,MAAK;GACL,MAAK;GACL,WAAW,GACT,sGACA,cACI,yCACA,8CACJ,SACF;GACA,GAAI;aAVN,CAYG,OAAO,oBAAC,MAAD;IAAM,MAAM;IAAM,eAAY;GAAQ,CAAA,IAAI,MACjD,QACK;;CACI,CAAA;AAElB"}
@@ -0,0 +1,3 @@
1
+ import { RendererComponent } from '../types';
2
+ declare const FloatingPanelComponent: RendererComponent<"floating-panel">;
3
+ export default FloatingPanelComponent;
@@ -0,0 +1,65 @@
1
+ import { cn } from "../../lib/utils.js";
2
+ import { RenderNode } from "../renderer.js";
3
+ import { useState } from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region resources/js/core/components/floating-panel.tsx
6
+ function placementStyle(placement, offset) {
7
+ if (placement === "top-start") return {
8
+ left: offset,
9
+ top: offset
10
+ };
11
+ if (placement === "top-end") return {
12
+ right: offset,
13
+ top: offset
14
+ };
15
+ if (placement === "bottom-start") return {
16
+ bottom: offset,
17
+ left: offset
18
+ };
19
+ return {
20
+ bottom: offset,
21
+ right: offset
22
+ };
23
+ }
24
+ var FloatingPanelComponent = ({ children, node }) => {
25
+ const label = node.props.label ?? void 0;
26
+ const offset = Math.max(0, node.props.offset ?? 16);
27
+ const placement = node.props.placement ?? "bottom-end";
28
+ const trigger = node.props.trigger ?? [];
29
+ const [open, setOpen] = useState(false);
30
+ if (trigger.length === 0) return /* @__PURE__ */ jsx("div", {
31
+ "aria-label": label,
32
+ className: "fixed z-50 max-w-[calc(100vw-2rem)] rounded-lt border border-lt-border bg-lt-popover p-1 text-lt-popover-fg shadow-lt-md",
33
+ "data-lattice-component": node.id,
34
+ role: label ? "group" : void 0,
35
+ style: placementStyle(placement, offset),
36
+ children
37
+ });
38
+ const expandsUpward = placement === "bottom-start" || placement === "bottom-end";
39
+ const anchorsToStart = placement === "top-start" || placement === "bottom-start";
40
+ return /* @__PURE__ */ jsx("div", {
41
+ "aria-label": label,
42
+ className: "fixed z-50 max-w-[calc(100vw-2rem)]",
43
+ "data-lattice-component": node.id,
44
+ role: label ? "group" : void 0,
45
+ style: placementStyle(placement, offset),
46
+ children: /* @__PURE__ */ jsxs("div", {
47
+ className: cn("flex w-fit gap-2", expandsUpward ? "flex-col-reverse" : "flex-col"),
48
+ children: [/* @__PURE__ */ jsx("button", {
49
+ "aria-expanded": open,
50
+ className: cn("inline-flex items-center gap-2 rounded-lt border border-lt-border bg-lt-popover px-3 py-1.5 text-sm font-medium text-lt-popover-fg shadow-lt-md hover:bg-lt-muted", anchorsToStart ? "self-start" : "self-end"),
51
+ "data-test": node.key ? `${node.key}-trigger` : void 0,
52
+ onClick: () => setOpen((value) => !value),
53
+ type: "button",
54
+ children: trigger.map((triggerNode, index) => /* @__PURE__ */ jsx(RenderNode, { node: triggerNode }, triggerNode.key ?? `${triggerNode.type}-${index}`))
55
+ }), /* @__PURE__ */ jsx("div", {
56
+ className: open ? "block" : "hidden",
57
+ children
58
+ })]
59
+ })
60
+ });
61
+ };
62
+ //#endregion
63
+ export { FloatingPanelComponent as default };
64
+
65
+ //# sourceMappingURL=floating-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floating-panel.js","names":[],"sources":["../../../resources/js/core/components/floating-panel.tsx"],"sourcesContent":["import { type CSSProperties, useState } from \"react\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport type { FloatingPlacement } from \"@lattice-php/lattice/types/generated\";\nimport { RenderNode } from \"@lattice-php/lattice/core/renderer\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nfunction placementStyle(placement: FloatingPlacement, offset: number): CSSProperties {\n if (placement === \"top-start\") {\n return { left: offset, top: offset };\n }\n\n if (placement === \"top-end\") {\n return { right: offset, top: offset };\n }\n\n if (placement === \"bottom-start\") {\n return { bottom: offset, left: offset };\n }\n\n return { bottom: offset, right: offset };\n}\n\nconst FloatingPanelComponent: RendererComponent<\"floating-panel\"> = ({ children, node }) => {\n const label = node.props.label ?? undefined;\n const offset = Math.max(0, node.props.offset ?? 16);\n const placement = node.props.placement ?? \"bottom-end\";\n const trigger = node.props.trigger ?? [];\n const [open, setOpen] = useState(false);\n\n if (trigger.length === 0) {\n return (\n <div\n aria-label={label}\n className=\"fixed z-50 max-w-[calc(100vw-2rem)] rounded-lt border border-lt-border bg-lt-popover p-1 text-lt-popover-fg shadow-lt-md\"\n data-lattice-component={node.id}\n role={label ? \"group\" : undefined}\n style={placementStyle(placement, offset)}\n >\n {children}\n </div>\n );\n }\n\n const expandsUpward = placement === \"bottom-start\" || placement === \"bottom-end\";\n const anchorsToStart = placement === \"top-start\" || placement === \"bottom-start\";\n\n return (\n <div\n aria-label={label}\n className=\"fixed z-50 max-w-[calc(100vw-2rem)]\"\n data-lattice-component={node.id}\n role={label ? \"group\" : undefined}\n style={placementStyle(placement, offset)}\n >\n <div className={cn(\"flex w-fit gap-2\", expandsUpward ? \"flex-col-reverse\" : \"flex-col\")}>\n <button\n aria-expanded={open}\n className={cn(\n \"inline-flex items-center gap-2 rounded-lt border border-lt-border bg-lt-popover px-3 py-1.5 text-sm font-medium text-lt-popover-fg shadow-lt-md hover:bg-lt-muted\",\n anchorsToStart ? \"self-start\" : \"self-end\",\n )}\n data-test={node.key ? `${node.key}-trigger` : undefined}\n onClick={() => setOpen((value) => !value)}\n type=\"button\"\n >\n {trigger.map((triggerNode, index) => (\n <RenderNode\n key={triggerNode.key ?? `${triggerNode.type}-${index}`}\n node={triggerNode}\n />\n ))}\n </button>\n <div className={open ? \"block\" : \"hidden\"}>{children}</div>\n </div>\n </div>\n );\n};\n\nexport default FloatingPanelComponent;\n"],"mappings":";;;;;AAMA,SAAS,eAAe,WAA8B,QAA+B;CACnF,IAAI,cAAc,aAChB,OAAO;EAAE,MAAM;EAAQ,KAAK;CAAO;CAGrC,IAAI,cAAc,WAChB,OAAO;EAAE,OAAO;EAAQ,KAAK;CAAO;CAGtC,IAAI,cAAc,gBAChB,OAAO;EAAE,QAAQ;EAAQ,MAAM;CAAO;CAGxC,OAAO;EAAE,QAAQ;EAAQ,OAAO;CAAO;AACzC;AAEA,IAAM,0BAA+D,EAAE,UAAU,WAAW;CAC1F,MAAM,QAAQ,KAAK,MAAM,SAAS,KAAA;CAClC,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,UAAU,EAAE;CAClD,MAAM,YAAY,KAAK,MAAM,aAAa;CAC1C,MAAM,UAAU,KAAK,MAAM,WAAW,CAAC;CACvC,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CAEtC,IAAI,QAAQ,WAAW,GACrB,OACE,oBAAC,OAAD;EACE,cAAY;EACZ,WAAU;EACV,0BAAwB,KAAK;EAC7B,MAAM,QAAQ,UAAU,KAAA;EACxB,OAAO,eAAe,WAAW,MAAM;EAEtC;CACE,CAAA;CAIT,MAAM,gBAAgB,cAAc,kBAAkB,cAAc;CACpE,MAAM,iBAAiB,cAAc,eAAe,cAAc;CAElE,OACE,oBAAC,OAAD;EACE,cAAY;EACZ,WAAU;EACV,0BAAwB,KAAK;EAC7B,MAAM,QAAQ,UAAU,KAAA;EACxB,OAAO,eAAe,WAAW,MAAM;YAEvC,qBAAC,OAAD;GAAK,WAAW,GAAG,oBAAoB,gBAAgB,qBAAqB,UAAU;aAAtF,CACE,oBAAC,UAAD;IACE,iBAAe;IACf,WAAW,GACT,qKACA,iBAAiB,eAAe,UAClC;IACA,aAAW,KAAK,MAAM,GAAG,KAAK,IAAI,YAAY,KAAA;IAC9C,eAAe,SAAS,UAAU,CAAC,KAAK;IACxC,MAAK;cAEJ,QAAQ,KAAK,aAAa,UACzB,oBAAC,YAAD,EAEE,MAAM,YACP,GAFM,YAAY,OAAO,GAAG,YAAY,KAAK,GAAG,OAEhD,CACF;GACK,CAAA,GACR,oBAAC,OAAD;IAAK,WAAW,OAAO,UAAU;IAAW;GAAc,CAAA,CACvD;;CACF,CAAA;AAET"}
@@ -1,9 +1,17 @@
1
- import { withRefHeader } from "../component-ref.js";
2
1
  import { LATTICE_EVENT } from "../../events/event-names.js";
3
- import { Renderer, useRendererContext } from "../renderer.js";
2
+ import { apiJson } from "../api.js";
3
+ import { Skeleton } from "./skeleton.js";
4
+ import { Renderer } from "../renderer.js";
4
5
  import { useCallback, useEffect, useState } from "react";
5
6
  import { jsx } from "react/jsx-runtime";
6
7
  //#region resources/js/core/components/fragment.tsx
8
+ var fragmentSizeHeights = {
9
+ lg: 320,
10
+ md: 64,
11
+ sm: 40,
12
+ xl: 384,
13
+ xs: 32
14
+ };
7
15
  function getComponents(value) {
8
16
  if (!Array.isArray(value)) return [];
9
17
  return value.filter((node) => typeof node === "object" && node !== null && "type" in node && typeof node.type === "string");
@@ -12,18 +20,15 @@ var FragmentComponent = ({ node }) => {
12
20
  const endpoint = node.props.endpoint ?? "";
13
21
  const isLazy = node.props.lazy === true;
14
22
  const componentRef = node.props.ref ?? "";
23
+ const placeholderHeight = fragmentSizeHeights[node.props.size];
15
24
  const [components, setComponents] = useState(() => node.schema ?? []);
16
25
  const [hasLoaded, setHasLoaded] = useState(!isLazy);
17
26
  const [processing, setProcessing] = useState(isLazy && endpoint !== "");
18
- const { fallback, missingComponent, registry } = useRendererContext();
19
27
  const load = useCallback(async () => {
20
28
  if (!endpoint) return;
21
29
  setProcessing(true);
22
30
  try {
23
- setComponents(getComponents((await (await fetch(endpoint, { headers: {
24
- Accept: "application/json",
25
- ...withRefHeader(componentRef)
26
- } })).json()).schema));
31
+ setComponents(getComponents((await apiJson(endpoint, { ref: componentRef })).schema));
27
32
  setHasLoaded(true);
28
33
  } finally {
29
34
  setProcessing(false);
@@ -45,14 +50,21 @@ var FragmentComponent = ({ node }) => {
45
50
  window.addEventListener(LATTICE_EVENT.reloadComponent, reload);
46
51
  return () => window.removeEventListener(LATTICE_EVENT.reloadComponent, reload);
47
52
  }, [load, node.id]);
53
+ useEffect(() => {
54
+ function reloadOnLocaleChange() {
55
+ if (!hasLoaded) return;
56
+ load();
57
+ }
58
+ window.addEventListener(LATTICE_EVENT.localeChange, reloadOnLocaleChange);
59
+ return () => window.removeEventListener(LATTICE_EVENT.localeChange, reloadOnLocaleChange);
60
+ }, [hasLoaded, load]);
48
61
  return /* @__PURE__ */ jsx("div", {
49
62
  "data-lattice-fragment": node.id,
50
- children: processing && components.length === 0 ? /* @__PURE__ */ jsx("div", { className: "h-16 animate-pulse rounded-lt-sm bg-lt-muted" }) : /* @__PURE__ */ jsx(Renderer, {
51
- fallback,
52
- missingComponent,
53
- nodes: components,
54
- registry
55
- })
63
+ style: processing && components.length === 0 ? { minHeight: placeholderHeight } : void 0,
64
+ children: processing && components.length === 0 ? /* @__PURE__ */ jsx(Skeleton, {
65
+ className: "w-full",
66
+ style: { height: placeholderHeight }
67
+ }) : /* @__PURE__ */ jsx(Renderer, { nodes: components })
56
68
  });
57
69
  };
58
70
  //#endregion