@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,4 +1,6 @@
1
+ import { CollapsedContext, useCollapsed } from "../core/collapsed-context.js";
2
+ import Callouts from "./callouts.js";
1
3
  import { OutletContext } from "./context.js";
2
4
  import { layoutComponents } from "./components.js";
3
5
  import SchemaLayout from "./schema-layout.js";
4
- export { OutletContext, SchemaLayout, layoutComponents };
6
+ export { Callouts, OutletContext, SchemaLayout, CollapsedContext as SidebarCollapsedContext, layoutComponents, useCollapsed as useSidebarCollapsed };
@@ -1,57 +1,81 @@
1
1
  import { cn } from "../lib/utils.js";
2
+ import { prefixedNodeTestId } from "../core/test-id.js";
2
3
  import { Icon } from "../icons/sprite.js";
3
4
  import { IconRenderer } from "../icons/icon-renderer.js";
4
- import { useT } from "../i18n/instance.js";
5
- import { SidebarCollapsedContext, useSidebarCollapsed } from "./context.js";
6
- import { useEffect, useRef, useState } from "react";
5
+ import { useCollapsed } from "../core/collapsed-context.js";
6
+ import { Popover } from "./popover.js";
7
+ import { useState } from "react";
7
8
  import { Link, usePage } from "@inertiajs/react";
8
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
- import { createPortal } from "react-dom";
9
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
10
  //#region resources/js/layout/menu-item.tsx
11
- var rowClass = "flex items-center gap-2 rounded-md px-3 py-2 text-sm text-lt-fg transition-colors hover:bg-lt-muted";
11
+ var rowClass = "flex items-center gap-2 rounded-lt-sm px-3 py-2 text-base font-medium text-lt-fg transition-colors hover:bg-lt-muted";
12
+ function MenuAffix({ affix, className }) {
13
+ if (affix.icon) return /* @__PURE__ */ jsx(IconRenderer, {
14
+ className: cn("size-lt-icon-md shrink-0", className),
15
+ icon: affix.icon
16
+ });
17
+ return /* @__PURE__ */ jsx("span", {
18
+ className: cn("shrink-0 text-sm text-lt-muted-fg", className),
19
+ children: affix.text
20
+ });
21
+ }
12
22
  function schemaContainsPath(schema, path) {
13
23
  return (schema ?? []).some((child) => child.props?.href === path || schemaContainsPath(child.schema, path));
14
24
  }
15
25
  var MenuItemComponent = ({ children, node }) => {
16
- const collapsed = useSidebarCollapsed();
26
+ const collapsed = useCollapsed();
17
27
  const icon = node.props.icon;
18
28
  const label = node.props.label;
29
+ const prefix = node.props.prefix;
30
+ const suffix = node.props.suffix;
31
+ const iconOnly = Boolean(icon);
32
+ const flyoutIcon = icon ?? prefix?.icon ?? null;
19
33
  const href = node.props.href ?? "";
20
34
  const currentPath = usePage().url.split("?")[0];
21
- const slug = label.toLowerCase().replace(/\s+/g, "-");
22
- const content = /* @__PURE__ */ jsxs(Fragment, { children: [icon ? /* @__PURE__ */ jsx(IconRenderer, {
35
+ const testId = prefixedNodeTestId("menu", node);
36
+ const content = icon ? /* @__PURE__ */ jsx(IconRenderer, {
23
37
  className: "size-lt-icon-md shrink-0",
24
38
  icon
25
- }) : null, /* @__PURE__ */ jsx("span", {
26
- className: cn(collapsed && "sr-only"),
27
- children: label
28
- })] });
39
+ }) : /* @__PURE__ */ jsxs(Fragment$1, { children: [
40
+ prefix ? /* @__PURE__ */ jsx(MenuAffix, { affix: prefix }) : null,
41
+ collapsed ? /* @__PURE__ */ jsx("span", {
42
+ className: "pointer-events-none absolute top-1/2 left-full z-50 ml-2 hidden -translate-y-1/2 rounded-lt-sm border border-lt-border bg-lt-popover px-2 py-1 text-sm whitespace-nowrap text-lt-popover-fg shadow-lt-md group-hover:block",
43
+ role: "tooltip",
44
+ children: label
45
+ }) : /* @__PURE__ */ jsx("span", { children: label }),
46
+ suffix ? /* @__PURE__ */ jsx(MenuAffix, {
47
+ affix: suffix,
48
+ className: "ml-auto"
49
+ }) : null
50
+ ] });
29
51
  if (href === "") {
30
52
  if (!children) return collapsed ? null : /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("span", {
31
53
  className: "flex items-center gap-2 px-3 py-2 text-xs font-semibold tracking-wide text-lt-muted-fg uppercase",
32
54
  children: content
33
55
  }) });
34
56
  if (collapsed) return /* @__PURE__ */ jsx(FlyoutGroup, {
35
- icon,
57
+ icon: flyoutIcon,
36
58
  label,
37
- testId: `menu-${slug}`,
59
+ testId,
38
60
  children
39
61
  });
40
62
  return /* @__PURE__ */ jsx(CollapsibleItem, {
41
63
  content,
42
64
  defaultOpen: schemaContainsPath(node.schema, currentPath),
43
- testId: `menu-${slug}`,
65
+ testId,
44
66
  children
45
67
  });
46
68
  }
47
69
  const active = currentPath === href;
70
+ const method = node.props.method ?? "get";
48
71
  return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Link, {
49
72
  "aria-current": active ? "page" : void 0,
50
- className: cn(rowClass, collapsed && "justify-center", active && "bg-lt-muted font-medium"),
51
- "data-test": `menu-${slug}`,
73
+ "aria-label": collapsed || iconOnly ? label : void 0,
74
+ as: method === "get" ? void 0 : "button",
75
+ className: cn(rowClass, "w-full", collapsed && "group relative justify-center", iconOnly && "justify-center", active && "bg-lt-muted font-medium"),
76
+ "data-test": testId,
52
77
  href,
53
- method: node.props.method ?? "get",
54
- title: collapsed ? label : void 0,
78
+ method,
55
79
  children: content
56
80
  }) });
57
81
  };
@@ -73,56 +97,24 @@ function CollapsibleItem({ children, content, defaultOpen, testId }) {
73
97
  }) : null] });
74
98
  }
75
99
  function FlyoutGroup({ children, icon, label, testId }) {
76
- const { t } = useT("lattice");
77
- const [open, setOpen] = useState(false);
78
- const [position, setPosition] = useState({
79
- left: 0,
80
- top: 0
81
- });
82
- const triggerRef = useRef(null);
83
- const url = usePage().url;
84
- useEffect(() => setOpen(false), [url]);
85
- function toggle() {
86
- const rect = triggerRef.current?.getBoundingClientRect();
87
- if (rect) setPosition({
88
- left: rect.right + 4,
89
- top: rect.top
90
- });
91
- setOpen((value) => !value);
92
- }
93
- return /* @__PURE__ */ jsxs("li", { children: [/* @__PURE__ */ jsx("button", {
94
- "aria-expanded": open,
95
- "aria-label": label,
96
- className: cn(rowClass, "w-full justify-center"),
97
- "data-test": testId,
98
- onClick: toggle,
99
- ref: triggerRef,
100
- title: label,
101
- type: "button",
102
- children: icon ? /* @__PURE__ */ jsx(IconRenderer, {
100
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Popover, {
101
+ className: "min-w-48",
102
+ placement: "right",
103
+ testId,
104
+ trigger: icon ? /* @__PURE__ */ jsx(IconRenderer, {
103
105
  className: "size-lt-icon-md shrink-0",
104
106
  icon
105
- }) : /* @__PURE__ */ jsx("span", { children: label })
106
- }), open ? createPortal(/* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("button", {
107
- "aria-label": t("a11y.closeMenu", "Close menu"),
108
- className: "fixed inset-0 z-40 cursor-default",
109
- "data-test": `${testId}-close`,
110
- onClick: () => setOpen(false),
111
- type: "button"
112
- }), /* @__PURE__ */ jsx(SidebarCollapsedContext.Provider, {
113
- value: false,
107
+ }) : /* @__PURE__ */ jsx("span", { children: label }),
108
+ triggerClassName: cn(rowClass, "justify-center"),
109
+ triggerLabel: label,
114
110
  children: /* @__PURE__ */ jsxs("ul", {
115
- className: "fixed z-50 min-w-48 rounded-md border border-lt-border bg-lt-popover p-1 text-lt-popover-fg shadow-lg",
116
- style: {
117
- left: position.left,
118
- top: position.top
119
- },
111
+ className: "flex flex-col gap-1",
120
112
  children: [/* @__PURE__ */ jsx("li", {
121
113
  className: "px-3 py-1.5 text-xs font-semibold tracking-wide text-lt-muted-fg uppercase",
122
114
  children: label
123
115
  }), children]
124
116
  })
125
- })] }), document.body) : null] });
117
+ }) });
126
118
  }
127
119
  //#endregion
128
120
  export { MenuItemComponent as default };
@@ -1 +1 @@
1
- {"version":3,"file":"menu-item.js","names":[],"sources":["../../resources/js/layout/menu-item.tsx"],"sourcesContent":["import { Link, usePage } from \"@inertiajs/react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { RendererComponent, Schema } from \"@lattice/lattice/core/types\";\nimport { Icon, IconRenderer } from \"@lattice/lattice/icons\";\nimport { cn } from \"@lattice/lattice/lib/utils\";\nimport { useT } from \"@lattice/lattice/i18n\";\nimport { SidebarCollapsedContext, useSidebarCollapsed } from \"./context\";\n\nconst rowClass =\n \"flex items-center gap-2 rounded-md px-3 py-2 text-sm text-lt-fg transition-colors hover:bg-lt-muted\";\n\nfunction schemaContainsPath(schema: Schema | undefined, path: string): boolean {\n return (schema ?? []).some(\n (child) => child.props?.href === path || schemaContainsPath(child.schema, path),\n );\n}\n\nconst MenuItemComponent: RendererComponent<\"menu-item\"> = ({ children, node }) => {\n const collapsed = useSidebarCollapsed();\n const icon = node.props.icon;\n const label = node.props.label;\n const href = node.props.href ?? \"\";\n const currentPath = usePage().url.split(\"?\")[0];\n const slug = label.toLowerCase().replace(/\\s+/g, \"-\");\n\n const content = (\n <>\n {icon ? <IconRenderer className=\"size-lt-icon-md shrink-0\" icon={icon} /> : null}\n <span className={cn(collapsed && \"sr-only\")}>{label}</span>\n </>\n );\n\n if (href === \"\") {\n if (!children) {\n return collapsed ? null : (\n <li>\n <span className=\"flex items-center gap-2 px-3 py-2 text-xs font-semibold tracking-wide text-lt-muted-fg uppercase\">\n {content}\n </span>\n </li>\n );\n }\n\n if (collapsed) {\n return (\n <FlyoutGroup icon={icon} label={label} testId={`menu-${slug}`}>\n {children}\n </FlyoutGroup>\n );\n }\n\n return (\n <CollapsibleItem\n content={content}\n defaultOpen={schemaContainsPath(node.schema, currentPath)}\n testId={`menu-${slug}`}\n >\n {children}\n </CollapsibleItem>\n );\n }\n\n const active = currentPath === href;\n\n return (\n <li>\n <Link\n aria-current={active ? \"page\" : undefined}\n className={cn(rowClass, collapsed && \"justify-center\", active && \"bg-lt-muted font-medium\")}\n data-test={`menu-${slug}`}\n href={href}\n method={node.props.method ?? \"get\"}\n title={collapsed ? label : undefined}\n >\n {content}\n </Link>\n </li>\n );\n};\n\nfunction CollapsibleItem({\n children,\n content,\n defaultOpen,\n testId,\n}: {\n children: ReactNode;\n content: ReactNode;\n defaultOpen: boolean;\n testId: string;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <li>\n <button\n aria-expanded={open}\n className={cn(rowClass, \"w-full\")}\n data-test={testId}\n onClick={() => setOpen((value) => !value)}\n type=\"button\"\n >\n {content}\n <Icon\n name=\"chevron-right\"\n className={cn(\n \"ml-auto size-lt-icon-md shrink-0 transition-transform\",\n open && \"rotate-90\",\n )}\n />\n </button>\n {open ? <ul className=\"mt-1 flex flex-col gap-1 pl-3\">{children}</ul> : null}\n </li>\n );\n}\n\nfunction FlyoutGroup({\n children,\n icon,\n label,\n testId,\n}: {\n children: ReactNode;\n icon?: string | null;\n label: string;\n testId: string;\n}) {\n const { t } = useT(\"lattice\");\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState({ left: 0, top: 0 });\n const triggerRef = useRef<HTMLButtonElement>(null);\n const url = usePage().url;\n\n useEffect(() => setOpen(false), [url]);\n\n function toggle(): void {\n const rect = triggerRef.current?.getBoundingClientRect();\n\n if (rect) {\n setPosition({ left: rect.right + 4, top: rect.top });\n }\n\n setOpen((value) => !value);\n }\n\n return (\n <li>\n <button\n aria-expanded={open}\n aria-label={label}\n className={cn(rowClass, \"w-full justify-center\")}\n data-test={testId}\n onClick={toggle}\n ref={triggerRef}\n title={label}\n type=\"button\"\n >\n {icon ? (\n <IconRenderer className=\"size-lt-icon-md shrink-0\" icon={icon} />\n ) : (\n <span>{label}</span>\n )}\n </button>\n {open\n ? createPortal(\n <>\n <button\n aria-label={t(\"a11y.closeMenu\", \"Close menu\")}\n className=\"fixed inset-0 z-40 cursor-default\"\n data-test={`${testId}-close`}\n onClick={() => setOpen(false)}\n type=\"button\"\n />\n <SidebarCollapsedContext.Provider value={false}>\n <ul\n className=\"fixed z-50 min-w-48 rounded-md border border-lt-border bg-lt-popover p-1 text-lt-popover-fg shadow-lg\"\n style={{ left: position.left, top: position.top }}\n >\n <li className=\"px-3 py-1.5 text-xs font-semibold tracking-wide text-lt-muted-fg uppercase\">\n {label}\n </li>\n {children}\n </ul>\n </SidebarCollapsedContext.Provider>\n </>,\n document.body,\n )\n : null}\n </li>\n );\n}\n\nexport default MenuItemComponent;\n"],"mappings":"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"}
1
+ {"version":3,"file":"menu-item.js","names":[],"sources":["../../resources/js/layout/menu-item.tsx"],"sourcesContent":["import { Link, usePage } from \"@inertiajs/react\";\nimport { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { prefixedNodeTestId } from \"@lattice-php/lattice/core/test-id\";\nimport type { RendererComponent, Schema } from \"@lattice-php/lattice/core/types\";\nimport { Icon, IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { Affix } from \"@lattice-php/lattice/types/generated\";\nimport { useSidebarCollapsed } from \"./context\";\nimport { Popover } from \"./popover\";\n\nconst rowClass =\n \"flex items-center gap-2 rounded-lt-sm px-3 py-2 text-base font-medium text-lt-fg transition-colors hover:bg-lt-muted\";\n\nfunction MenuAffix({ affix, className }: { affix: Affix; className?: string }) {\n if (affix.icon) {\n return <IconRenderer className={cn(\"size-lt-icon-md shrink-0\", className)} icon={affix.icon} />;\n }\n\n return <span className={cn(\"shrink-0 text-sm text-lt-muted-fg\", className)}>{affix.text}</span>;\n}\n\nfunction schemaContainsPath(schema: Schema | undefined, path: string): boolean {\n return (schema ?? []).some(\n (child) => child.props?.href === path || schemaContainsPath(child.schema, path),\n );\n}\n\nconst MenuItemComponent: RendererComponent<\"menu-item\"> = ({ children, node }) => {\n const collapsed = useSidebarCollapsed();\n const icon = node.props.icon;\n const label = node.props.label;\n const prefix = node.props.prefix;\n const suffix = node.props.suffix;\n const iconOnly = Boolean(icon);\n const flyoutIcon = icon ?? prefix?.icon ?? null;\n const href = node.props.href ?? \"\";\n const currentPath = usePage().url.split(\"?\")[0];\n const testId = prefixedNodeTestId(\"menu\", node);\n\n const content = icon ? (\n <IconRenderer className=\"size-lt-icon-md shrink-0\" icon={icon} />\n ) : (\n <>\n {prefix ? <MenuAffix affix={prefix} /> : null}\n {collapsed ? (\n <span\n className=\"pointer-events-none absolute top-1/2 left-full z-50 ml-2 hidden -translate-y-1/2 rounded-lt-sm border border-lt-border bg-lt-popover px-2 py-1 text-sm whitespace-nowrap text-lt-popover-fg shadow-lt-md group-hover:block\"\n role=\"tooltip\"\n >\n {label}\n </span>\n ) : (\n <span>{label}</span>\n )}\n {suffix ? <MenuAffix affix={suffix} className=\"ml-auto\" /> : null}\n </>\n );\n\n if (href === \"\") {\n if (!children) {\n return collapsed ? null : (\n <li>\n <span className=\"flex items-center gap-2 px-3 py-2 text-xs font-semibold tracking-wide text-lt-muted-fg uppercase\">\n {content}\n </span>\n </li>\n );\n }\n\n if (collapsed) {\n return (\n <FlyoutGroup icon={flyoutIcon} label={label} testId={testId}>\n {children}\n </FlyoutGroup>\n );\n }\n\n return (\n <CollapsibleItem\n content={content}\n defaultOpen={schemaContainsPath(node.schema, currentPath)}\n testId={testId}\n >\n {children}\n </CollapsibleItem>\n );\n }\n\n const active = currentPath === href;\n const method = node.props.method ?? \"get\";\n\n return (\n <li>\n <Link\n aria-current={active ? \"page\" : undefined}\n aria-label={collapsed || iconOnly ? label : undefined}\n as={method === \"get\" ? undefined : \"button\"}\n className={cn(\n rowClass,\n \"w-full\",\n collapsed && \"group relative justify-center\",\n iconOnly && \"justify-center\",\n active && \"bg-lt-muted font-medium\",\n )}\n data-test={testId}\n href={href}\n method={method}\n >\n {content}\n </Link>\n </li>\n );\n};\n\nfunction CollapsibleItem({\n children,\n content,\n defaultOpen,\n testId,\n}: {\n children: ReactNode;\n content: ReactNode;\n defaultOpen: boolean;\n testId?: string;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <li>\n <button\n aria-expanded={open}\n className={cn(rowClass, \"w-full\")}\n data-test={testId}\n onClick={() => setOpen((value) => !value)}\n type=\"button\"\n >\n {content}\n <Icon\n name=\"chevron-right\"\n className={cn(\n \"ml-auto size-lt-icon-md shrink-0 transition-transform\",\n open && \"rotate-90\",\n )}\n />\n </button>\n {open ? <ul className=\"mt-1 flex flex-col gap-1 pl-3\">{children}</ul> : null}\n </li>\n );\n}\n\nfunction FlyoutGroup({\n children,\n icon,\n label,\n testId,\n}: {\n children: ReactNode;\n icon?: string | null;\n label: string;\n testId?: string;\n}) {\n return (\n <li>\n <Popover\n className=\"min-w-48\"\n placement=\"right\"\n testId={testId}\n trigger={\n icon ? (\n <IconRenderer className=\"size-lt-icon-md shrink-0\" icon={icon} />\n ) : (\n <span>{label}</span>\n )\n }\n triggerClassName={cn(rowClass, \"justify-center\")}\n triggerLabel={label}\n >\n <ul className=\"flex flex-col gap-1\">\n <li className=\"px-3 py-1.5 text-xs font-semibold tracking-wide text-lt-muted-fg uppercase\">\n {label}\n </li>\n {children}\n </ul>\n </Popover>\n </li>\n );\n}\n\nexport default MenuItemComponent;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"menu.js","names":[],"sources":["../../resources/js/layout/menu.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice/lattice/core/types\";\n\nconst MenuComponent: RendererComponent<\"menu\"> = ({ children, node }) => (\n <nav data-lattice-component={node.id}>\n <ul className=\"flex flex-col gap-1\">{children}</ul>\n </nav>\n);\n\nexport default MenuComponent;\n"],"mappings":";;AAEA,IAAM,iBAA4C,EAAE,UAAU,WAC5D,oBAAC,OAAD;CAAK,0BAAwB,KAAK;WAChC,oBAAC,MAAD;EAAI,WAAU;EAAuB;CAAa,CAAA;AAC/C,CAAA"}
1
+ {"version":3,"file":"menu.js","names":[],"sources":["../../resources/js/layout/menu.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice-php/lattice/core/types\";\n\nconst MenuComponent: RendererComponent<\"menu\"> = ({ children, node }) => (\n <nav data-lattice-component={node.id}>\n <ul className=\"flex flex-col gap-1\">{children}</ul>\n </nav>\n);\n\nexport default MenuComponent;\n"],"mappings":";;AAEA,IAAM,iBAA4C,EAAE,UAAU,WAC5D,oBAAC,OAAD;CAAK,0BAAwB,KAAK;WAChC,oBAAC,MAAD;EAAI,WAAU;EAAuB;CAAa,CAAA;AAC/C,CAAA"}
@@ -1,12 +1,12 @@
1
1
  import { OutletContext } from "./context.js";
2
2
  import { useContext } from "react";
3
- import { Fragment, jsx } from "react/jsx-runtime";
3
+ import { Fragment as Fragment$1, jsx } from "react/jsx-runtime";
4
4
  //#region resources/js/layout/outlet.tsx
5
5
  /**
6
6
  * Renders the active page at the position the layout schema places it.
7
7
  */
8
8
  var OutletComponent = () => {
9
- return /* @__PURE__ */ jsx(Fragment, { children: useContext(OutletContext) });
9
+ return /* @__PURE__ */ jsx(Fragment$1, { children: useContext(OutletContext) });
10
10
  };
11
11
  //#endregion
12
12
  export { OutletComponent as default };
@@ -1 +1 @@
1
- {"version":3,"file":"outlet.js","names":[],"sources":["../../resources/js/layout/outlet.tsx"],"sourcesContent":["import { useContext } from \"react\";\nimport type { RendererComponent } from \"@lattice/lattice/core/types\";\nimport { OutletContext } from \"./context\";\n\n/**\n * Renders the active page at the position the layout schema places it.\n */\nconst OutletComponent: RendererComponent<\"outlet\"> = () => {\n return <>{useContext(OutletContext)}</>;\n};\n\nexport default OutletComponent;\n"],"mappings":";;;;;;;AAOA,IAAM,wBAAqD;CACzD,OAAO,oBAAA,UAAA,EAAA,UAAG,WAAW,aAAa,EAAI,CAAA;AACxC"}
1
+ {"version":3,"file":"outlet.js","names":[],"sources":["../../resources/js/layout/outlet.tsx"],"sourcesContent":["import { useContext } from \"react\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { OutletContext } from \"./context\";\n\n/**\n * Renders the active page at the position the layout schema places it.\n */\nconst OutletComponent: RendererComponent<\"outlet\"> = () => {\n return <>{useContext(OutletContext)}</>;\n};\n\nexport default OutletComponent;\n"],"mappings":";;;;;;;AAOA,IAAM,wBAAqD;CACzD,OAAO,oBAAA,YAAA,EAAA,UAAG,WAAW,aAAa,EAAI,CAAA;AACxC"}
@@ -0,0 +1,17 @@
1
+ import { ReactNode } from 'react';
2
+ /**
3
+ * A navigation-aware popover for the sidebar: it wraps the shared popover
4
+ * primitive (so positioning and dismissal stay consistent with the rest of the
5
+ * app) and closes itself on every Inertia navigation. Items render expanded
6
+ * regardless of the sidebar's collapsed state.
7
+ */
8
+ export declare function Popover({ align, children, className, placement, testId, trigger, triggerClassName, triggerLabel, }: {
9
+ align?: "start" | "end";
10
+ children: ReactNode;
11
+ className?: string;
12
+ placement?: "bottom" | "right" | "top";
13
+ testId?: string;
14
+ trigger: ReactNode;
15
+ triggerClassName?: string;
16
+ triggerLabel?: string;
17
+ }): import("react").JSX.Element;
@@ -0,0 +1,46 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { CollapsedContext } from "../core/collapsed-context.js";
3
+ import { Popover as Popover$1, PopoverContent, PopoverTrigger } from "../core/components/popover.js";
4
+ import { useEffect, useState } from "react";
5
+ import { usePage } from "@inertiajs/react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region resources/js/layout/popover.tsx
8
+ /**
9
+ * A navigation-aware popover for the sidebar: it wraps the shared popover
10
+ * primitive (so positioning and dismissal stay consistent with the rest of the
11
+ * app) and closes itself on every Inertia navigation. Items render expanded
12
+ * regardless of the sidebar's collapsed state.
13
+ */
14
+ function Popover({ align = "start", children, className, placement = "bottom", testId, trigger, triggerClassName, triggerLabel }) {
15
+ const [open, setOpen] = useState(false);
16
+ const url = usePage().url;
17
+ useEffect(() => setOpen(false), [url]);
18
+ return /* @__PURE__ */ jsxs(Popover$1, {
19
+ open,
20
+ onOpenChange: setOpen,
21
+ children: [/* @__PURE__ */ jsx(PopoverTrigger, {
22
+ asChild: true,
23
+ children: /* @__PURE__ */ jsx("button", {
24
+ "aria-label": triggerLabel,
25
+ className: cn("w-full", triggerClassName),
26
+ "data-test": testId,
27
+ title: triggerLabel,
28
+ type: "button",
29
+ children: trigger
30
+ })
31
+ }), /* @__PURE__ */ jsx(PopoverContent, {
32
+ align,
33
+ className: cn("min-w-56 p-1", className),
34
+ role: "menu",
35
+ side: placement,
36
+ children: /* @__PURE__ */ jsx(CollapsedContext.Provider, {
37
+ value: false,
38
+ children
39
+ })
40
+ })]
41
+ });
42
+ }
43
+ //#endregion
44
+ export { Popover };
45
+
46
+ //# sourceMappingURL=popover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popover.js","names":[],"sources":["../../resources/js/layout/popover.tsx"],"sourcesContent":["import { usePage } from \"@inertiajs/react\";\nimport { useEffect, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n Popover as PopoverRoot,\n PopoverContent,\n PopoverTrigger,\n} from \"@lattice-php/lattice/core/components/popover\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { CollapsedContext } from \"../core/collapsed-context\";\n\n/**\n * A navigation-aware popover for the sidebar: it wraps the shared popover\n * primitive (so positioning and dismissal stay consistent with the rest of the\n * app) and closes itself on every Inertia navigation. Items render expanded\n * regardless of the sidebar's collapsed state.\n */\nexport function Popover({\n align = \"start\",\n children,\n className,\n placement = \"bottom\",\n testId,\n trigger,\n triggerClassName,\n triggerLabel,\n}: {\n align?: \"start\" | \"end\";\n children: ReactNode;\n className?: string;\n placement?: \"bottom\" | \"right\" | \"top\";\n testId?: string;\n trigger: ReactNode;\n triggerClassName?: string;\n triggerLabel?: string;\n}) {\n const [open, setOpen] = useState(false);\n const url = usePage().url;\n\n useEffect(() => setOpen(false), [url]);\n\n return (\n <PopoverRoot open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n aria-label={triggerLabel}\n className={cn(\"w-full\", triggerClassName)}\n data-test={testId}\n title={triggerLabel}\n type=\"button\"\n >\n {trigger}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align={align}\n className={cn(\"min-w-56 p-1\", className)}\n role=\"menu\"\n side={placement}\n >\n <CollapsedContext.Provider value={false}>{children}</CollapsedContext.Provider>\n </PopoverContent>\n </PopoverRoot>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAiBA,SAAgB,QAAQ,EACtB,QAAQ,SACR,UACA,WACA,YAAY,UACZ,QACA,SACA,kBACA,gBAUC;CACD,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,MAAM,QAAQ,EAAE;CAEtB,gBAAgB,QAAQ,KAAK,GAAG,CAAC,GAAG,CAAC;CAErC,OACE,qBAAC,WAAD;EAAmB;EAAM,cAAc;YAAvC,CACE,oBAAC,gBAAD;GAAgB,SAAA;aACd,oBAAC,UAAD;IACE,cAAY;IACZ,WAAW,GAAG,UAAU,gBAAgB;IACxC,aAAW;IACX,OAAO;IACP,MAAK;cAEJ;GACK,CAAA;EACM,CAAA,GAChB,oBAAC,gBAAD;GACS;GACP,WAAW,GAAG,gBAAgB,SAAS;GACvC,MAAK;GACL,MAAM;aAEN,oBAAC,iBAAiB,UAAlB;IAA2B,OAAO;IAAQ;GAAoC,CAAA;EAChE,CAAA,CACL;;AAEjB"}
@@ -1,6 +1,5 @@
1
1
  import { Renderer } from "../core/renderer.js";
2
2
  import { OutletContext } from "./context.js";
3
- import { useRegistry } from "../provider.js";
4
3
  import { usePage } from "@inertiajs/react";
5
4
  import { Fragment, jsx } from "react/jsx-runtime";
6
5
  //#region resources/js/layout/schema-layout.tsx
@@ -11,17 +10,11 @@ import { Fragment, jsx } from "react/jsx-runtime";
11
10
  * shell state (open sidebar, scroll position) survives page visits.
12
11
  */
13
12
  function SchemaLayout({ children }) {
14
- const lattice = usePage().props.lattice;
15
- const registry = useRegistry();
16
- const layout = lattice.layout;
13
+ const layout = usePage().props.lattice.layout;
17
14
  if (!layout) return /* @__PURE__ */ jsx(Fragment, { children });
18
15
  return /* @__PURE__ */ jsx(OutletContext.Provider, {
19
16
  value: children,
20
- children: /* @__PURE__ */ jsx(Renderer, {
21
- fallback: null,
22
- nodes: layout.schema,
23
- registry
24
- })
17
+ children: /* @__PURE__ */ jsx(Renderer, { nodes: layout.schema })
25
18
  });
26
19
  }
27
20
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"schema-layout.js","names":[],"sources":["../../resources/js/layout/schema-layout.tsx"],"sourcesContent":["import { usePage } from \"@inertiajs/react\";\nimport type { ReactNode } from \"react\";\nimport { Renderer } from \"@lattice/lattice/core/renderer\";\nimport type { PagePayload } from \"@lattice/lattice/core/types\";\nimport { useRegistry } from \"@lattice/lattice/provider\";\nimport { OutletContext } from \"./context\";\n\n/**\n * Persistent Inertia layout that renders a server-composed layout schema and\n * exposes the active page (`children`) to the Outlet via context. The same\n * component instance is reused across navigations that share a layout, so\n * shell state (open sidebar, scroll position) survives page visits.\n */\nexport default function SchemaLayout({ children }: { children: ReactNode }) {\n const lattice = usePage().props.lattice as PagePayload;\n const registry = useRegistry();\n const layout = lattice.layout;\n\n if (!layout) {\n return <>{children}</>;\n }\n\n return (\n <OutletContext.Provider value={children}>\n <Renderer fallback={null} nodes={layout.schema} registry={registry} />\n </OutletContext.Provider>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAaA,SAAwB,aAAa,EAAE,YAAqC;CAC1E,MAAM,UAAU,QAAQ,EAAE,MAAM;CAChC,MAAM,WAAW,YAAY;CAC7B,MAAM,SAAS,QAAQ;CAEvB,IAAI,CAAC,QACH,OAAO,oBAAA,UAAA,EAAG,SAAW,CAAA;CAGvB,OACE,oBAAC,cAAc,UAAf;EAAwB,OAAO;YAC7B,oBAAC,UAAD;GAAU,UAAU;GAAM,OAAO,OAAO;GAAkB;EAAW,CAAA;CAC/C,CAAA;AAE5B"}
1
+ {"version":3,"file":"schema-layout.js","names":[],"sources":["../../resources/js/layout/schema-layout.tsx"],"sourcesContent":["import { usePage } from \"@inertiajs/react\";\nimport type { ReactNode } from \"react\";\nimport { Renderer } from \"@lattice-php/lattice/core/renderer\";\nimport type { PagePayload } from \"@lattice-php/lattice/core/types\";\nimport { OutletContext } from \"./context\";\n\n/**\n * Persistent Inertia layout that renders a server-composed layout schema and\n * exposes the active page (`children`) to the Outlet via context. The same\n * component instance is reused across navigations that share a layout, so\n * shell state (open sidebar, scroll position) survives page visits.\n */\nexport default function SchemaLayout({ children }: { children: ReactNode }) {\n const lattice = usePage().props.lattice as PagePayload;\n const layout = lattice.layout;\n\n if (!layout) {\n return <>{children}</>;\n }\n\n return (\n <OutletContext.Provider value={children}>\n <Renderer nodes={layout.schema} />\n </OutletContext.Provider>\n );\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAwB,aAAa,EAAE,YAAqC;CAE1E,MAAM,SADU,QAAQ,EAAE,MAAM,QACT;CAEvB,IAAI,CAAC,QACH,OAAO,oBAAA,UAAA,EAAG,SAAW,CAAA;CAGvB,OACE,oBAAC,cAAc,UAAf;EAAwB,OAAO;YAC7B,oBAAC,UAAD,EAAU,OAAO,OAAO,OAAS,CAAA;CACX,CAAA;AAE5B"}
@@ -1,6 +1,6 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import { Icon } from "../icons/sprite.js";
3
- import { SidebarCollapsedContext } from "./context.js";
3
+ import { CollapsedContext } from "../core/collapsed-context.js";
4
4
  import { useState } from "react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region resources/js/layout/sidebar.tsx
@@ -21,16 +21,16 @@ var SidebarComponent = ({ children, node }) => {
21
21
  });
22
22
  }
23
23
  const isCollapsed = collapsible && collapsed;
24
- return /* @__PURE__ */ jsx(SidebarCollapsedContext.Provider, {
24
+ return /* @__PURE__ */ jsx(CollapsedContext.Provider, {
25
25
  value: isCollapsed,
26
26
  children: /* @__PURE__ */ jsxs("aside", {
27
- className: cn("flex shrink-0 flex-col gap-4 overflow-hidden border-r border-lt-border p-4 transition-[width]", isCollapsed ? "w-16" : "w-64"),
27
+ className: cn("sticky top-0 flex h-svh shrink-0 flex-col gap-4 border-r border-lt-border p-4 transition-[width]", isCollapsed ? "w-16 overflow-visible" : "w-64 overflow-x-hidden overflow-y-auto"),
28
28
  "data-lattice-component": node.id,
29
29
  children: [collapsible ? /* @__PURE__ */ jsx("button", {
30
30
  "aria-expanded": !isCollapsed,
31
31
  "aria-label": isCollapsed ? "Expand sidebar" : "Collapse sidebar",
32
32
  "data-test": "sidebar-toggle",
33
- className: cn("inline-flex items-center rounded-md p-2 text-lt-fg transition-colors hover:bg-lt-muted", isCollapsed ? "self-center" : "self-end"),
33
+ className: cn("inline-flex items-center rounded-lt-sm p-2 text-lt-fg transition-colors hover:bg-lt-muted", isCollapsed ? "self-center" : "self-end"),
34
34
  onClick: toggle,
35
35
  type: "button",
36
36
  children: /* @__PURE__ */ jsx(Icon, {
@@ -1 +1 @@
1
- {"version":3,"file":"sidebar.js","names":[],"sources":["../../resources/js/layout/sidebar.tsx"],"sourcesContent":["import { Icon } from \"@lattice/lattice/icons\";\nimport { useState } from \"react\";\nimport type { RendererComponent } from \"@lattice/lattice/core/types\";\nimport { cn } from \"@lattice/lattice/lib/utils\";\nimport { SidebarCollapsedContext } from \"./context\";\n\nfunction readStored(key: string, remember: boolean): boolean {\n if (!remember || typeof window === \"undefined\") {\n return false;\n }\n\n return window.localStorage.getItem(key) === \"true\";\n}\n\nconst SidebarComponent: RendererComponent<\"sidebar\"> = ({ children, node }) => {\n const collapsible = node.props.collapsible;\n const rememberState = node.props.rememberState;\n const storageKey = `lattice:sidebar:${node.id ?? \"default\"}`;\n\n const [collapsed, setCollapsed] = useState(() =>\n readStored(storageKey, collapsible && rememberState),\n );\n\n function toggle(): void {\n setCollapsed((value) => {\n const next = !value;\n\n if (rememberState && typeof window !== \"undefined\") {\n window.localStorage.setItem(storageKey, String(next));\n }\n\n return next;\n });\n }\n\n const isCollapsed = collapsible && collapsed;\n\n return (\n <SidebarCollapsedContext.Provider value={isCollapsed}>\n <aside\n className={cn(\n \"flex shrink-0 flex-col gap-4 overflow-hidden border-r border-lt-border p-4 transition-[width]\",\n isCollapsed ? \"w-16\" : \"w-64\",\n )}\n data-lattice-component={node.id}\n >\n {collapsible ? (\n <button\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n data-test=\"sidebar-toggle\"\n className={cn(\n \"inline-flex items-center rounded-md p-2 text-lt-fg transition-colors hover:bg-lt-muted\",\n isCollapsed ? \"self-center\" : \"self-end\",\n )}\n onClick={toggle}\n type=\"button\"\n >\n <Icon name=\"panel-left\" aria-hidden=\"true\" className=\"size-lt-icon-md shrink-0\" />\n </button>\n ) : null}\n {children}\n </aside>\n </SidebarCollapsedContext.Provider>\n );\n};\n\nexport default SidebarComponent;\n"],"mappings":";;;;;;AAMA,SAAS,WAAW,KAAa,UAA4B;CAC3D,IAAI,CAAC,YAAY,OAAO,WAAW,aACjC,OAAO;CAGT,OAAO,OAAO,aAAa,QAAQ,GAAG,MAAM;AAC9C;AAEA,IAAM,oBAAkD,EAAE,UAAU,WAAW;CAC7E,MAAM,cAAc,KAAK,MAAM;CAC/B,MAAM,gBAAgB,KAAK,MAAM;CACjC,MAAM,aAAa,mBAAmB,KAAK,MAAM;CAEjD,MAAM,CAAC,WAAW,gBAAgB,eAChC,WAAW,YAAY,eAAe,aAAa,CACrD;CAEA,SAAS,SAAe;EACtB,cAAc,UAAU;GACtB,MAAM,OAAO,CAAC;GAEd,IAAI,iBAAiB,OAAO,WAAW,aACrC,OAAO,aAAa,QAAQ,YAAY,OAAO,IAAI,CAAC;GAGtD,OAAO;EACT,CAAC;CACH;CAEA,MAAM,cAAc,eAAe;CAEnC,OACE,oBAAC,wBAAwB,UAAzB;EAAkC,OAAO;YACvC,qBAAC,SAAD;GACE,WAAW,GACT,iGACA,cAAc,SAAS,MACzB;GACA,0BAAwB,KAAK;aAL/B,CAOG,cACC,oBAAC,UAAD;IACE,iBAAe,CAAC;IAChB,cAAY,cAAc,mBAAmB;IAC7C,aAAU;IACV,WAAW,GACT,0FACA,cAAc,gBAAgB,UAChC;IACA,SAAS;IACT,MAAK;cAEL,oBAAC,MAAD;KAAM,MAAK;KAAa,eAAY;KAAO,WAAU;IAA4B,CAAA;GAC3E,CAAA,IACN,MACH,QACI;;CACyB,CAAA;AAEtC"}
1
+ {"version":3,"file":"sidebar.js","names":[],"sources":["../../resources/js/layout/sidebar.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { useState } from \"react\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { CollapsedContext } from \"../core/collapsed-context\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nfunction readStored(key: string, remember: boolean): boolean {\n if (!remember || typeof window === \"undefined\") {\n return false;\n }\n\n return window.localStorage.getItem(key) === \"true\";\n}\n\nconst SidebarComponent: RendererComponent<\"sidebar\"> = ({ children, node }) => {\n const collapsible = node.props.collapsible;\n const rememberState = node.props.rememberState;\n const storageKey = `lattice:sidebar:${node.id ?? \"default\"}`;\n\n const [collapsed, setCollapsed] = useState(() =>\n readStored(storageKey, collapsible && rememberState),\n );\n\n function toggle(): void {\n setCollapsed((value) => {\n const next = !value;\n\n if (rememberState && typeof window !== \"undefined\") {\n window.localStorage.setItem(storageKey, String(next));\n }\n\n return next;\n });\n }\n\n const isCollapsed = collapsible && collapsed;\n\n return (\n <CollapsedContext.Provider value={isCollapsed}>\n <aside\n className={cn(\n \"sticky top-0 flex h-svh shrink-0 flex-col gap-4 border-r border-lt-border p-4 transition-[width]\",\n isCollapsed ? \"w-16 overflow-visible\" : \"w-64 overflow-x-hidden overflow-y-auto\",\n )}\n data-lattice-component={node.id}\n >\n {collapsible ? (\n <button\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n data-test=\"sidebar-toggle\"\n className={cn(\n \"inline-flex items-center rounded-lt-sm p-2 text-lt-fg transition-colors hover:bg-lt-muted\",\n isCollapsed ? \"self-center\" : \"self-end\",\n )}\n onClick={toggle}\n type=\"button\"\n >\n <Icon name=\"panel-left\" aria-hidden=\"true\" className=\"size-lt-icon-md shrink-0\" />\n </button>\n ) : null}\n {children}\n </aside>\n </CollapsedContext.Provider>\n );\n};\n\nexport default SidebarComponent;\n"],"mappings":";;;;;;AAMA,SAAS,WAAW,KAAa,UAA4B;CAC3D,IAAI,CAAC,YAAY,OAAO,WAAW,aACjC,OAAO;CAGT,OAAO,OAAO,aAAa,QAAQ,GAAG,MAAM;AAC9C;AAEA,IAAM,oBAAkD,EAAE,UAAU,WAAW;CAC7E,MAAM,cAAc,KAAK,MAAM;CAC/B,MAAM,gBAAgB,KAAK,MAAM;CACjC,MAAM,aAAa,mBAAmB,KAAK,MAAM;CAEjD,MAAM,CAAC,WAAW,gBAAgB,eAChC,WAAW,YAAY,eAAe,aAAa,CACrD;CAEA,SAAS,SAAe;EACtB,cAAc,UAAU;GACtB,MAAM,OAAO,CAAC;GAEd,IAAI,iBAAiB,OAAO,WAAW,aACrC,OAAO,aAAa,QAAQ,YAAY,OAAO,IAAI,CAAC;GAGtD,OAAO;EACT,CAAC;CACH;CAEA,MAAM,cAAc,eAAe;CAEnC,OACE,oBAAC,iBAAiB,UAAlB;EAA2B,OAAO;YAChC,qBAAC,SAAD;GACE,WAAW,GACT,oGACA,cAAc,0BAA0B,wCAC1C;GACA,0BAAwB,KAAK;aAL/B,CAOG,cACC,oBAAC,UAAD;IACE,iBAAe,CAAC;IAChB,cAAY,cAAc,mBAAmB;IAC7C,aAAU;IACV,WAAW,GACT,6FACA,cAAc,gBAAgB,UAChC;IACA,SAAS;IACT,MAAK;cAEL,oBAAC,MAAD;KAAM,MAAK;KAAa,eAAY;KAAO,WAAU;IAA4B,CAAA;GAC3E,CAAA,IACN,MACH,QACI;;CACkB,CAAA;AAE/B"}
@@ -0,0 +1,3 @@
1
+ import { RendererComponent } from '../core/types';
2
+ declare const TopbarComponent: RendererComponent<"topbar">;
3
+ export default TopbarComponent;
@@ -0,0 +1,15 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region resources/js/layout/topbar.tsx
4
+ var TopbarComponent = ({ children, node }) => {
5
+ const sticky = node.props.sticky;
6
+ return /* @__PURE__ */ jsx("header", {
7
+ "data-lattice-component": node.id,
8
+ className: cn("flex h-14 w-full items-center gap-2 border-b border-lt-border bg-lt-bg px-4 text-lt-fg", sticky && "sticky top-0 z-30"),
9
+ children
10
+ });
11
+ };
12
+ //#endregion
13
+ export { TopbarComponent as default };
14
+
15
+ //# sourceMappingURL=topbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topbar.js","names":[],"sources":["../../resources/js/layout/topbar.tsx"],"sourcesContent":["import type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\n\nconst TopbarComponent: RendererComponent<\"topbar\"> = ({ children, node }) => {\n const sticky = node.props.sticky;\n\n return (\n <header\n data-lattice-component={node.id}\n className={cn(\n \"flex h-14 w-full items-center gap-2 border-b border-lt-border bg-lt-bg px-4 text-lt-fg\",\n sticky && \"sticky top-0 z-30\",\n )}\n >\n {children}\n </header>\n );\n};\n\nexport default TopbarComponent;\n"],"mappings":";;;AAGA,IAAM,mBAAgD,EAAE,UAAU,WAAW;CAC3E,MAAM,SAAS,KAAK,MAAM;CAE1B,OACE,oBAAC,UAAD;EACE,0BAAwB,KAAK;EAC7B,WAAW,GACT,0FACA,UAAU,mBACZ;EAEC;CACK,CAAA;AAEZ"}
package/dist/page.js CHANGED
@@ -1,28 +1,27 @@
1
1
  import { cn } from "./lib/utils.js";
2
2
  import { Renderer } from "./core/renderer.js";
3
- import { useRegistry } from "./provider.js";
3
+ import { RealtimeListeners } from "./realtime/listeners.js";
4
4
  import { Head } from "@inertiajs/react";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region resources/js/page.tsx
7
7
  function Page({ lattice }) {
8
- const registry = useRegistry();
9
- const content = /* @__PURE__ */ jsx(Renderer, {
10
- fallback: null,
11
- nodes: lattice.schema,
12
- registry
13
- });
14
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Head, { title: lattice.title ?? void 0 }), lattice.container === "centered" ? /* @__PURE__ */ jsx("main", {
15
- className: "min-h-svh bg-lt-bg text-lt-fg",
16
- children: /* @__PURE__ */ jsx("div", {
17
- "data-testid": "lattice-centered-container",
18
- className: "mx-auto flex min-h-svh w-full max-w-6xl flex-col justify-center px-6 py-12 sm:px-8 lg:px-10",
8
+ const content = /* @__PURE__ */ jsx(Renderer, { nodes: lattice.schema });
9
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
10
+ /* @__PURE__ */ jsx(Head, { title: lattice.title ?? void 0 }),
11
+ /* @__PURE__ */ jsx(RealtimeListeners, { listeners: lattice.listeners }),
12
+ lattice.container === "centered" ? /* @__PURE__ */ jsx("main", {
13
+ className: "min-h-svh bg-lt-bg text-lt-fg",
14
+ children: /* @__PURE__ */ jsx("div", {
15
+ "data-test": "lattice-centered-container",
16
+ className: "mx-auto flex min-h-svh w-full max-w-6xl flex-col justify-center px-6 py-12 sm:px-8 lg:px-10",
17
+ children: content
18
+ })
19
+ }) : /* @__PURE__ */ jsx("div", {
20
+ "data-test": "lattice-default-container",
21
+ className: cn("w-full", { "px-4 py-6": lattice.layout !== null }),
19
22
  children: content
20
23
  })
21
- }) : /* @__PURE__ */ jsx("div", {
22
- "data-testid": "lattice-default-container",
23
- className: cn("w-full", { "px-4 py-6": lattice.layout !== null }),
24
- children: content
25
- })] });
24
+ ] });
26
25
  }
27
26
  //#endregion
28
27
  export { Page as default };
package/dist/page.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","names":[],"sources":["../resources/js/page.tsx"],"sourcesContent":["import { Head } from \"@inertiajs/react\";\nimport { Renderer } from \"@lattice/lattice/core/renderer\";\nimport { useRegistry } from \"@lattice/lattice/provider\";\nimport type { PagePayload } from \"@lattice/lattice\";\nimport { cn } from \"@lattice/lattice/lib/utils\";\n\ntype Props = {\n lattice: PagePayload;\n};\n\nexport default function Page({ lattice }: Props) {\n const registry = useRegistry();\n const content = <Renderer fallback={null} nodes={lattice.schema} registry={registry} />;\n\n return (\n <>\n <Head title={lattice.title ?? undefined} />\n\n {lattice.container === \"centered\" ? (\n <main className=\"min-h-svh bg-lt-bg text-lt-fg\">\n <div\n data-testid=\"lattice-centered-container\"\n className=\"mx-auto flex min-h-svh w-full max-w-6xl flex-col justify-center px-6 py-12 sm:px-8 lg:px-10\"\n >\n {content}\n </div>\n </main>\n ) : (\n <div\n data-testid=\"lattice-default-container\"\n className={cn(\"w-full\", {\n \"px-4 py-6\": lattice.layout !== null,\n })}\n >\n {content}\n </div>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;AAUA,SAAwB,KAAK,EAAE,WAAkB;CAC/C,MAAM,WAAW,YAAY;CAC7B,MAAM,UAAU,oBAAC,UAAD;EAAU,UAAU;EAAM,OAAO,QAAQ;EAAkB;CAAW,CAAA;CAEtF,OACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,MAAD,EAAM,OAAO,QAAQ,SAAS,KAAA,EAAY,CAAA,GAEzC,QAAQ,cAAc,aACrB,oBAAC,QAAD;EAAM,WAAU;YACd,oBAAC,OAAD;GACE,eAAY;GACZ,WAAU;aAET;EACE,CAAA;CACD,CAAA,IAEN,oBAAC,OAAD;EACE,eAAY;EACZ,WAAW,GAAG,UAAU,EACtB,aAAa,QAAQ,WAAW,KAClC,CAAC;YAEA;CACE,CAAA,CAEP,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"page.js","names":[],"sources":["../resources/js/page.tsx"],"sourcesContent":["import { Head } from \"@inertiajs/react\";\nimport { Renderer } from \"@lattice-php/lattice/core/renderer\";\nimport type { PagePayload } from \"@lattice-php/lattice\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { RealtimeListeners } from \"@lattice-php/lattice/realtime/listeners\";\n\ntype Props = {\n lattice: PagePayload;\n};\n\nexport default function Page({ lattice }: Props) {\n const content = <Renderer nodes={lattice.schema} />;\n\n return (\n <>\n <Head title={lattice.title ?? undefined} />\n\n <RealtimeListeners listeners={lattice.listeners} />\n\n {lattice.container === \"centered\" ? (\n <main className=\"min-h-svh bg-lt-bg text-lt-fg\">\n <div\n data-test=\"lattice-centered-container\"\n className=\"mx-auto flex min-h-svh w-full max-w-6xl flex-col justify-center px-6 py-12 sm:px-8 lg:px-10\"\n >\n {content}\n </div>\n </main>\n ) : (\n <div\n data-test=\"lattice-default-container\"\n className={cn(\"w-full\", {\n \"px-4 py-6\": lattice.layout !== null,\n })}\n >\n {content}\n </div>\n )}\n </>\n );\n}\n"],"mappings":";;;;;;AAUA,SAAwB,KAAK,EAAE,WAAkB;CAC/C,MAAM,UAAU,oBAAC,UAAD,EAAU,OAAO,QAAQ,OAAS,CAAA;CAElD,OACE,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,MAAD,EAAM,OAAO,QAAQ,SAAS,KAAA,EAAY,CAAA;EAE1C,oBAAC,mBAAD,EAAmB,WAAW,QAAQ,UAAY,CAAA;EAEjD,QAAQ,cAAc,aACrB,oBAAC,QAAD;GAAM,WAAU;aACd,oBAAC,OAAD;IACE,aAAU;IACV,WAAU;cAET;GACE,CAAA;EACD,CAAA,IAEN,oBAAC,OAAD;GACE,aAAU;GACV,WAAW,GAAG,UAAU,EACtB,aAAa,QAAQ,WAAW,KAClC,CAAC;aAEA;EACE,CAAA;CAEP,EAAA,CAAA;AAEN"}
@@ -1,12 +1,10 @@
1
1
  import { ReactNode } from 'react';
2
- import { ComponentRegistry, Registry } from './core/registry';
3
2
  import { SpriteValue } from './icons/sprite';
4
- import { ColumnRegistry } from './table/column-registry';
3
+ import { Registry } from './core/registry';
5
4
  export declare function Provider({ children, registry, sprite, toaster, }: {
6
5
  children: ReactNode;
7
6
  registry?: Registry;
8
7
  sprite?: SpriteValue;
9
8
  toaster?: boolean;
10
9
  }): import("react").JSX.Element;
11
- export declare function useRegistry(): ComponentRegistry;
12
- export declare function useColumnRegistry(): ColumnRegistry;
10
+ export { useComponentRegistry, useColumnRegistry, useEffectHandlerRegistry, } from './core/registry-context';
package/dist/provider.js CHANGED
@@ -1,12 +1,14 @@
1
1
  import { SpriteProvider } from "./icons/sprite.js";
2
+ import { RegistryContext, setDefaultRegistry, useColumnRegistry, useComponentRegistry, useEffectHandlerRegistry } from "./core/registry-context.js";
2
3
  import { registry } from "./registry.js";
3
4
  import { Toaster } from "./toast/toaster.js";
4
- import { createContext, useContext } from "react";
5
+ import { useFlashEffects } from "./effects/use-flash-effects.js";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
6
7
  //#region resources/js/provider.tsx
8
+ setDefaultRegistry(registry);
7
9
  var defaultSprite = { href: "" };
8
- var RegistryContext = createContext(registry);
9
10
  function Provider({ children, registry: registry$1 = registry, sprite = defaultSprite, toaster = true }) {
11
+ useFlashEffects();
10
12
  return /* @__PURE__ */ jsx(RegistryContext.Provider, {
11
13
  value: registry$1,
12
14
  children: /* @__PURE__ */ jsxs(SpriteProvider, {
@@ -15,13 +17,7 @@ function Provider({ children, registry: registry$1 = registry, sprite = defaultS
15
17
  })
16
18
  });
17
19
  }
18
- function useRegistry() {
19
- return useContext(RegistryContext).components;
20
- }
21
- function useColumnRegistry() {
22
- return useContext(RegistryContext).columns;
23
- }
24
20
  //#endregion
25
- export { Provider, useColumnRegistry, useRegistry };
21
+ export { Provider, useColumnRegistry, useComponentRegistry, useEffectHandlerRegistry };
26
22
 
27
23
  //# sourceMappingURL=provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","names":[],"sources":["../resources/js/provider.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { ComponentRegistry, Registry } from \"./core/registry\";\nimport { SpriteProvider } from \"./icons/sprite\";\nimport type { SpriteValue } from \"./icons/sprite\";\nimport { registry as defaultRegistry } from \"./registry\";\nimport type { ColumnRegistry } from \"./table/column-registry\";\nimport { Toaster } from \"./toast\";\n\nconst defaultSprite: SpriteValue = { href: \"\" };\n\nconst RegistryContext = createContext<Registry>(defaultRegistry);\n\nexport function Provider({\n children,\n registry = defaultRegistry,\n sprite = defaultSprite,\n toaster = true,\n}: {\n children: ReactNode;\n registry?: Registry;\n sprite?: SpriteValue;\n toaster?: boolean;\n}) {\n return (\n <RegistryContext.Provider value={registry}>\n <SpriteProvider sprite={sprite}>\n {children}\n {toaster ? <Toaster /> : null}\n </SpriteProvider>\n </RegistryContext.Provider>\n );\n}\n\nexport function useRegistry(): ComponentRegistry {\n return useContext(RegistryContext).components;\n}\n\nexport function useColumnRegistry(): ColumnRegistry {\n return useContext(RegistryContext).columns;\n}\n"],"mappings":";;;;;;AASA,IAAM,gBAA6B,EAAE,MAAM,GAAG;AAE9C,IAAM,kBAAkB,cAAwB,QAAe;AAE/D,SAAgB,SAAS,EACvB,UACA,UAAA,aAAW,UACX,SAAS,eACT,UAAU,QAMT;CACD,OACE,oBAAC,gBAAgB,UAAjB;EAA0B,OAAO;YAC/B,qBAAC,gBAAD;GAAwB;aAAxB,CACG,UACA,UAAU,oBAAC,SAAD,CAAU,CAAA,IAAI,IACX;;CACQ,CAAA;AAE9B;AAEA,SAAgB,cAAiC;CAC/C,OAAO,WAAW,eAAe,EAAE;AACrC;AAEA,SAAgB,oBAAoC;CAClD,OAAO,WAAW,eAAe,EAAE;AACrC"}
1
+ {"version":3,"file":"provider.js","names":[],"sources":["../resources/js/provider.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { SpriteValue } from \"./icons/sprite\";\nimport { SpriteProvider } from \"./icons/sprite\";\nimport { registry as defaultRegistry } from \"./registry\";\nimport type { Registry } from \"./core/registry\";\nimport { RegistryContext, setDefaultRegistry } from \"./core/registry-context\";\nimport { Toaster } from \"./toast\";\nimport { useFlashEffects } from \"./effects/use-flash-effects\";\n\n// Register the default registry so selectors work outside <Provider>.\n// This module is always loaded after registry.ts finishes, so defaultRegistry\n// is guaranteed to be defined here.\nsetDefaultRegistry(defaultRegistry);\n\nconst defaultSprite: SpriteValue = { href: \"\" };\n\nexport function Provider({\n children,\n registry = defaultRegistry,\n sprite = defaultSprite,\n toaster = true,\n}: {\n children: ReactNode;\n registry?: Registry;\n sprite?: SpriteValue;\n toaster?: boolean;\n}) {\n useFlashEffects();\n\n return (\n <RegistryContext.Provider value={registry}>\n <SpriteProvider sprite={sprite}>\n {children}\n {toaster ? <Toaster /> : null}\n </SpriteProvider>\n </RegistryContext.Provider>\n );\n}\n\nexport {\n useComponentRegistry,\n useColumnRegistry,\n useEffectHandlerRegistry,\n} from \"./core/registry-context\";\n"],"mappings":";;;;;;;AAYA,mBAAmB,QAAe;AAElC,IAAM,gBAA6B,EAAE,MAAM,GAAG;AAE9C,SAAgB,SAAS,EACvB,UACA,UAAA,aAAW,UACX,SAAS,eACT,UAAU,QAMT;CACD,gBAAgB;CAEhB,OACE,oBAAC,gBAAgB,UAAjB;EAA0B,OAAO;YAC/B,qBAAC,gBAAD;GAAwB;aAAxB,CACG,UACA,UAAU,oBAAC,SAAD,CAAU,CAAA,IAAI,IACX;;CACQ,CAAA;AAE9B"}
@@ -0,0 +1,4 @@
1
+ import { Effect } from '../types/generated';
2
+ import { Translate } from '../i18n/translatable';
3
+ export type RawEffect = Record<string, unknown>;
4
+ export declare function buildEffects(effects: readonly RawEffect[], payload: Record<string, unknown>, t: Translate): Effect[];
@@ -0,0 +1,23 @@
1
+ import { isTranslatable, resolveTranslatable } from "../i18n/translatable.js";
2
+ //#region resources/js/realtime/build-effects.ts
3
+ function buildEffects(effects, payload, t) {
4
+ return effects.map((effect) => resolveEffect(effect, payload, t));
5
+ }
6
+ function resolveEffect(effect, payload, t) {
7
+ if (effect.type !== "toast") return effect;
8
+ const toast = effect.toast;
9
+ if (typeof toast !== "object" || toast === null) return effect;
10
+ const message = toast.message;
11
+ if (!isTranslatable(message)) return effect;
12
+ return {
13
+ ...effect,
14
+ toast: {
15
+ ...toast,
16
+ message: resolveTranslatable(message, payload, t)
17
+ }
18
+ };
19
+ }
20
+ //#endregion
21
+ export { buildEffects };
22
+
23
+ //# sourceMappingURL=build-effects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-effects.js","names":[],"sources":["../../resources/js/realtime/build-effects.ts"],"sourcesContent":["import type { Effect } from \"@lattice-php/lattice/types/generated\";\nimport { isTranslatable, resolveTranslatable } from \"@lattice-php/lattice/i18n/translatable\";\nimport type { Translate } from \"@lattice-php/lattice/i18n/translatable\";\n\nexport type RawEffect = Record<string, unknown>;\n\nexport function buildEffects(\n effects: readonly RawEffect[],\n payload: Record<string, unknown>,\n t: Translate,\n): Effect[] {\n return effects.map((effect) => resolveEffect(effect, payload, t)) as Effect[];\n}\n\nfunction resolveEffect(\n effect: RawEffect,\n payload: Record<string, unknown>,\n t: Translate,\n): RawEffect {\n if (effect.type !== \"toast\") {\n return effect;\n }\n\n const toast = effect.toast;\n\n if (typeof toast !== \"object\" || toast === null) {\n return effect;\n }\n\n const message = (toast as Record<string, unknown>).message;\n\n if (!isTranslatable(message)) {\n return effect;\n }\n\n return {\n ...effect,\n toast: {\n ...(toast as Record<string, unknown>),\n message: resolveTranslatable(message, payload, t),\n },\n };\n}\n"],"mappings":";;AAMA,SAAgB,aACd,SACA,SACA,GACU;CACV,OAAO,QAAQ,KAAK,WAAW,cAAc,QAAQ,SAAS,CAAC,CAAC;AAClE;AAEA,SAAS,cACP,QACA,SACA,GACW;CACX,IAAI,OAAO,SAAS,SAClB,OAAO;CAGT,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,UAAW,MAAkC;CAEnD,IAAI,CAAC,eAAe,OAAO,GACzB,OAAO;CAGT,OAAO;EACL,GAAG;EACH,OAAO;GACL,GAAI;GACJ,SAAS,oBAAoB,SAAS,SAAS,CAAC;EAClD;CACF;AACF"}
@@ -0,0 +1,8 @@
1
+ import { ListenerPayload } from '../types/generated';
2
+ /**
3
+ * Renders nothing when a page declares no listeners, so the echo-react chunk
4
+ * is only fetched where it is actually needed.
5
+ */
6
+ export declare function RealtimeListeners({ listeners }: {
7
+ listeners?: ListenerPayload[];
8
+ }): import("react").JSX.Element | null;