@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,16 +1,26 @@
1
- import { ensureI18n, i18n } from "./instance.js";
2
- import { Backend } from "../node_modules/i18next-http-backend/esm/index.js";
1
+ import { localeHeader } from "./locale.js";
2
+ import { setConfig } from "./config.js";
3
+ import { ensureI18n, i18n, preloadLanguages } from "./instance.js";
4
+ import HttpBackend from "i18next-http-backend";
3
5
  //#region resources/js/i18n/backend.ts
4
6
  /** laravel-i18next's namespaced routes; an app behind a custom prefix overrides them via {@link BackendOptions}. */
5
7
  var DEFAULT_LOAD_PATH = "/locales/{{lng}}/{{ns}}.json";
6
8
  var DEFAULT_ADD_PATH = "/locales/add/{{lng}}/{{ns}}";
7
9
  /** Apply the i18n config shared from the backend; wires the HTTP backend only when `enabled`. */
8
- async function configureI18n(config) {
10
+ async function configureI18n(config, options = {}) {
11
+ setConfig(config);
9
12
  if (!config?.enabled) {
10
- await ensureI18n();
13
+ await ensureI18n((base) => ({
14
+ ...base,
15
+ ns: options.namespaces ?? base.ns
16
+ }));
11
17
  return;
12
18
  }
13
- await enableBackend({ saveMissing: config.saveMissing });
19
+ await enableBackend({
20
+ saveMissing: config.saveMissing,
21
+ namespaces: options.namespaces
22
+ });
23
+ preloadLanguages(config.preloadLocales);
14
24
  }
15
25
  /**
16
26
  * Load translations from a backend such as bambamboole/laravel-i18next,
@@ -19,16 +29,21 @@ async function configureI18n(config) {
19
29
  * bundle the HTTP backend.
20
30
  */
21
31
  async function enableBackend(options = {}) {
22
- const { loadPath = DEFAULT_LOAD_PATH, addPath = DEFAULT_ADD_PATH, saveMissing = false, customHeaders } = options;
23
- i18n.use(Backend);
32
+ const { namespaces, loadPath = DEFAULT_LOAD_PATH, addPath = DEFAULT_ADD_PATH, saveMissing = false, customHeaders } = options;
33
+ const customHeadersWithLocale = () => ({
34
+ ...localeHeader(),
35
+ ...customHeaders?.()
36
+ });
37
+ i18n.use(HttpBackend);
24
38
  await ensureI18n((base) => ({
25
39
  ...base,
40
+ ns: namespaces ?? base.ns,
26
41
  partialBundledLanguages: true,
27
42
  saveMissing,
28
43
  backend: {
29
44
  loadPath,
30
45
  addPath,
31
- customHeaders,
46
+ customHeaders: customHeadersWithLocale,
32
47
  withCredentials: true
33
48
  }
34
49
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"backend.js","names":[],"sources":["../../resources/js/i18n/backend.ts"],"sourcesContent":["import HttpBackend from \"i18next-http-backend\";\nimport { ensureI18n, i18n } from \"./instance\";\n\n/** laravel-i18next's namespaced routes; an app behind a custom prefix overrides them via {@link BackendOptions}. */\nconst DEFAULT_LOAD_PATH = \"/locales/{{lng}}/{{ns}}.json\";\nconst DEFAULT_ADD_PATH = \"/locales/add/{{lng}}/{{ns}}\";\n\nexport type BackendOptions = {\n /** i18next-http-backend load path. Defaults to laravel-i18next's namespaced route. */\n loadPath?: string;\n /** Path that receives keys reported by saveMissing. */\n addPath?: string;\n /** Report missing keys back to the backend (laravel-i18next persists them). */\n saveMissing?: boolean;\n /** Extra request headers, e.g. the CSRF token for the saveMissing POST. */\n customHeaders?: () => Record<string, string>;\n};\n\n/** The i18n settings the backend shares to the frontend (Inertia `lattice.i18n`). */\nexport type I18nConfig = {\n enabled: boolean;\n saveMissing: boolean;\n};\n\n/** Apply the i18n config shared from the backend; wires the HTTP backend only when `enabled`. */\nexport async function configureI18n(config: I18nConfig | undefined): Promise<void> {\n if (!config?.enabled) {\n await ensureI18n();\n\n return;\n }\n\n await enableBackend({ saveMissing: config.saveMissing });\n}\n\n/**\n * Load translations from a backend such as bambamboole/laravel-i18next,\n * overriding the renderer's inline English defaults. Call before the first\n * render. Importing this module is the opt-in: apps that never call it don't\n * bundle the HTTP backend.\n */\nexport async function enableBackend(options: BackendOptions = {}): Promise<void> {\n const {\n loadPath = DEFAULT_LOAD_PATH,\n addPath = DEFAULT_ADD_PATH,\n saveMissing = false,\n customHeaders,\n } = options;\n\n i18n.use(HttpBackend);\n\n await ensureI18n((base) => ({\n ...base,\n partialBundledLanguages: true,\n saveMissing,\n backend: { loadPath, addPath, customHeaders, withCredentials: true },\n }));\n}\n"],"mappings":";;;;AAIA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;;AAoBzB,eAAsB,cAAc,QAA+C;CACjF,IAAI,CAAC,QAAQ,SAAS;EACpB,MAAM,WAAW;EAEjB;CACF;CAEA,MAAM,cAAc,EAAE,aAAa,OAAO,YAAY,CAAC;AACzD;;;;;;;AAQA,eAAsB,cAAc,UAA0B,CAAC,GAAkB;CAC/E,MAAM,EACJ,WAAW,mBACX,UAAU,kBACV,cAAc,OACd,kBACE;CAEJ,KAAK,IAAI,OAAW;CAEpB,MAAM,YAAY,UAAU;EAC1B,GAAG;EACH,yBAAyB;EACzB;EACA,SAAS;GAAE;GAAU;GAAS;GAAe,iBAAiB;EAAK;CACrE,EAAE;AACJ"}
1
+ {"version":3,"file":"backend.js","names":[],"sources":["../../resources/js/i18n/backend.ts"],"sourcesContent":["import type { I18nConfig } from \"@lattice-php/lattice/types/generated\";\nimport HttpBackend from \"i18next-http-backend\";\nimport { setConfig } from \"./config\";\nimport { ensureI18n, i18n, preloadLanguages } from \"./instance\";\nimport { localeHeader } from \"./locale\";\n\n/** The i18n settings the backend shares to the frontend (Inertia `lattice.i18n`). */\nexport type { I18nConfig };\n\n/** laravel-i18next's namespaced routes; an app behind a custom prefix overrides them via {@link BackendOptions}. */\nconst DEFAULT_LOAD_PATH = \"/locales/{{lng}}/{{ns}}.json\";\nconst DEFAULT_ADD_PATH = \"/locales/add/{{lng}}/{{ns}}\";\n\nexport type BackendOptions = {\n namespaces?: string[];\n /** i18next-http-backend load path. Defaults to laravel-i18next's namespaced route. */\n loadPath?: string;\n /** Path that receives keys reported by saveMissing. */\n addPath?: string;\n /** Report missing keys back to the backend (laravel-i18next persists them). */\n saveMissing?: boolean;\n /** Extra request headers, e.g. the CSRF token for the saveMissing POST. */\n customHeaders?: () => Record<string, string>;\n};\n\nexport type ConfigureI18nOptions = {\n namespaces?: string[];\n};\n/** Apply the i18n config shared from the backend; wires the HTTP backend only when `enabled`. */\nexport async function configureI18n(\n config: I18nConfig | undefined,\n options: ConfigureI18nOptions = {},\n): Promise<void> {\n setConfig(config);\n\n if (!config?.enabled) {\n await ensureI18n((base) => ({\n ...base,\n ns: options.namespaces ?? base.ns,\n }));\n\n return;\n }\n\n await enableBackend({ saveMissing: config.saveMissing, namespaces: options.namespaces });\n\n // Fire-and-forget so warming the other locales never delays the active one.\n void preloadLanguages(config.preloadLocales);\n}\n\n/**\n * Load translations from a backend such as bambamboole/laravel-i18next,\n * overriding the renderer's inline English defaults. Call before the first\n * render. Importing this module is the opt-in: apps that never call it don't\n * bundle the HTTP backend.\n */\nexport async function enableBackend(options: BackendOptions = {}): Promise<void> {\n const {\n namespaces,\n loadPath = DEFAULT_LOAD_PATH,\n addPath = DEFAULT_ADD_PATH,\n saveMissing = false,\n customHeaders,\n } = options;\n\n const customHeadersWithLocale = (): Record<string, string> => ({\n ...localeHeader(),\n ...customHeaders?.(),\n });\n\n i18n.use(HttpBackend);\n\n await ensureI18n((base) => ({\n ...base,\n ns: namespaces ?? base.ns,\n partialBundledLanguages: true,\n saveMissing,\n backend: { loadPath, addPath, customHeaders: customHeadersWithLocale, withCredentials: true },\n }));\n}\n"],"mappings":";;;;;;AAUA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;;AAkBzB,eAAsB,cACpB,QACA,UAAgC,CAAC,GAClB;CACf,UAAU,MAAM;CAEhB,IAAI,CAAC,QAAQ,SAAS;EACpB,MAAM,YAAY,UAAU;GAC1B,GAAG;GACH,IAAI,QAAQ,cAAc,KAAK;EACjC,EAAE;EAEF;CACF;CAEA,MAAM,cAAc;EAAE,aAAa,OAAO;EAAa,YAAY,QAAQ;CAAW,CAAC;CAGvF,iBAAsB,OAAO,cAAc;AAC7C;;;;;;;AAQA,eAAsB,cAAc,UAA0B,CAAC,GAAkB;CAC/E,MAAM,EACJ,YACA,WAAW,mBACX,UAAU,kBACV,cAAc,OACd,kBACE;CAEJ,MAAM,iCAAyD;EAC7D,GAAG,aAAa;EAChB,GAAG,gBAAgB;CACrB;CAEA,KAAK,IAAI,WAAW;CAEpB,MAAM,YAAY,UAAU;EAC1B,GAAG;EACH,IAAI,cAAc,KAAK;EACvB,yBAAyB;EACzB;EACA,SAAS;GAAE;GAAU;GAAS,eAAe;GAAyB,iBAAiB;EAAK;CAC9F,EAAE;AACJ"}
@@ -0,0 +1,6 @@
1
+ import { I18nConfig } from '../types/generated';
2
+ export type Config = {
3
+ readonly locales: readonly string[];
4
+ };
5
+ export declare function setConfig(config: I18nConfig | undefined): void;
6
+ export declare function useConfig(): Config;
@@ -0,0 +1,36 @@
1
+ import { useSyncExternalStore } from "react";
2
+ //#region resources/js/i18n/config.ts
3
+ var fallback = { locales: [] };
4
+ var listeners = /* @__PURE__ */ new Set();
5
+ var active = fallback;
6
+ function normalizeLocales(locales) {
7
+ return Array.from(new Set((locales ?? []).map((locale) => locale.trim()).filter(Boolean)));
8
+ }
9
+ function sameLocales(left, right) {
10
+ return left.length === right.length && left.every((locale, index) => locale === right[index]);
11
+ }
12
+ function snapshot() {
13
+ return active;
14
+ }
15
+ function subscribe(callback) {
16
+ listeners.add(callback);
17
+ return () => {
18
+ listeners.delete(callback);
19
+ };
20
+ }
21
+ function notify() {
22
+ listeners.forEach((listener) => listener());
23
+ }
24
+ function setConfig(config) {
25
+ const locales = normalizeLocales(config?.locales);
26
+ if (sameLocales(active.locales, locales)) return;
27
+ active = { locales };
28
+ notify();
29
+ }
30
+ function useConfig() {
31
+ return useSyncExternalStore(subscribe, snapshot, () => fallback);
32
+ }
33
+ //#endregion
34
+ export { setConfig, useConfig };
35
+
36
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","names":[],"sources":["../../resources/js/i18n/config.ts"],"sourcesContent":["import type { I18nConfig } from \"@lattice-php/lattice/types/generated\";\nimport { useSyncExternalStore } from \"react\";\n\nexport type Config = {\n readonly locales: readonly string[];\n};\n\nconst fallback: Config = { locales: [] };\nconst listeners = new Set<() => void>();\n\nlet active: Config = fallback;\n\nfunction normalizeLocales(locales: readonly string[] | undefined): string[] {\n return Array.from(new Set((locales ?? []).map((locale) => locale.trim()).filter(Boolean)));\n}\n\nfunction sameLocales(left: readonly string[], right: readonly string[]): boolean {\n return left.length === right.length && left.every((locale, index) => locale === right[index]);\n}\n\nfunction snapshot(): Config {\n return active;\n}\n\nfunction subscribe(callback: () => void): () => void {\n listeners.add(callback);\n\n return () => {\n listeners.delete(callback);\n };\n}\n\nfunction notify(): void {\n listeners.forEach((listener) => listener());\n}\n\nexport function setConfig(config: I18nConfig | undefined): void {\n const locales = normalizeLocales(config?.locales);\n\n if (sameLocales(active.locales, locales)) {\n return;\n }\n\n active = { locales };\n notify();\n}\n\nexport function useConfig(): Config {\n return useSyncExternalStore(subscribe, snapshot, () => fallback);\n}\n"],"mappings":";;AAOA,IAAM,WAAmB,EAAE,SAAS,CAAC,EAAE;AACvC,IAAM,4BAAY,IAAI,IAAgB;AAEtC,IAAI,SAAiB;AAErB,SAAS,iBAAiB,SAAkD;CAC1E,OAAO,MAAM,KAAK,IAAI,KAAK,WAAW,CAAC,GAAG,KAAK,WAAW,OAAO,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AAC3F;AAEA,SAAS,YAAY,MAAyB,OAAmC;CAC/E,OAAO,KAAK,WAAW,MAAM,UAAU,KAAK,OAAO,QAAQ,UAAU,WAAW,MAAM,MAAM;AAC9F;AAEA,SAAS,WAAmB;CAC1B,OAAO;AACT;AAEA,SAAS,UAAU,UAAkC;CACnD,UAAU,IAAI,QAAQ;CAEtB,aAAa;EACX,UAAU,OAAO,QAAQ;CAC3B;AACF;AAEA,SAAS,SAAe;CACtB,UAAU,SAAS,aAAa,SAAS,CAAC;AAC5C;AAEA,SAAgB,UAAU,QAAsC;CAC9D,MAAM,UAAU,iBAAiB,QAAQ,OAAO;CAEhD,IAAI,YAAY,OAAO,SAAS,OAAO,GACrC;CAGF,SAAS,EAAE,QAAQ;CACnB,OAAO;AACT;AAEA,SAAgB,YAAoB;CAClC,OAAO,qBAAqB,WAAW,gBAAgB,QAAQ;AACjE"}
@@ -1,3 +1,9 @@
1
1
  export { i18n, useT, translate } from './instance';
2
2
  export { configureI18n, enableBackend } from './backend';
3
- export type { BackendOptions, I18nConfig } from './backend';
3
+ export { currentLocale, localeHeader, setLocale, useLocale } from './locale';
4
+ export { LocaleReload } from './locale-reload';
5
+ export { LocaleSwitcher, useLocaleOptions } from './locale-switcher';
6
+ export { configureI18nFromPageProps, i18nConfigFromPageProps } from './page-props';
7
+ export type { BackendOptions, ConfigureI18nOptions, I18nConfig } from './backend';
8
+ export type { LocaleOption, LocaleSwitcherProps, UseLocaleOptionsOptions, UseLocaleOptionsReturn, } from './locale-switcher';
9
+ export type { UseLocaleReturn } from './locale';
@@ -1,3 +1,7 @@
1
+ import { currentLocale, localeHeader, setLocale, useLocale } from "./locale.js";
1
2
  import { i18n, translate, useT } from "./instance.js";
2
3
  import { configureI18n, enableBackend } from "./backend.js";
3
- export { configureI18n, enableBackend, i18n, translate, useT };
4
+ import { LocaleReload } from "./locale-reload.js";
5
+ import { LocaleSwitcher, useLocaleOptions } from "./locale-switcher.js";
6
+ import { configureI18nFromPageProps, i18nConfigFromPageProps } from "./page-props.js";
7
+ export { LocaleReload, LocaleSwitcher, configureI18n, configureI18nFromPageProps, currentLocale, enableBackend, i18n, i18nConfigFromPageProps, localeHeader, setLocale, translate, useLocale, useLocaleOptions, useT };
@@ -0,0 +1,27 @@
1
+ import { i18n as I18nInstance, InitOptions } from 'i18next';
2
+ type TranslationFunction = (key: string, defaultValue?: string, options?: Record<string, unknown>) => string;
3
+ export type TranslationResult = {
4
+ t: TranslationFunction;
5
+ i18n: I18nInstance;
6
+ locale: string;
7
+ locales: readonly string[];
8
+ ready: boolean;
9
+ setLocale: (locale: string) => void;
10
+ };
11
+ export declare const i18n: I18nInstance;
12
+ /**
13
+ * Initialize the instance exactly once. The first caller wins — a rendered
14
+ * component (inline English, zero config) or `enableBackend()`, which registers
15
+ * its backend first because i18next can only wire a backend during `init`.
16
+ */
17
+ export declare function ensureI18n(extend?: (base: InitOptions) => InitOptions): Promise<unknown>;
18
+ /**
19
+ * Eagerly load the namespaces for the given locales so a later
20
+ * `changeLanguage` resolves them from the store instead of an HTTP round-trip,
21
+ * which would otherwise flash the fallback language on switch. The active
22
+ * locale is already loaded by {@link ensureI18n}, so it is skipped.
23
+ */
24
+ export declare function preloadLanguages(locales: readonly string[]): Promise<void>;
25
+ export declare function useT(namespace: string): TranslationResult;
26
+ export declare function translate(namespace: string, key: string, defaultValue: string, options?: Record<string, unknown>): string;
27
+ export {};
@@ -1,15 +1,33 @@
1
- import { instance } from "../node_modules/i18next/dist/esm/i18next.js";
2
- import { initReactI18next } from "../node_modules/react-i18next/dist/es/initReactI18next.js";
3
- import { useTranslation } from "../node_modules/react-i18next/dist/es/useTranslation.js";
1
+ import { currentLocale, subscribeLocale, useLocale } from "./locale.js";
2
+ import { useConfig } from "./config.js";
3
+ import { useCallback, useSyncExternalStore } from "react";
4
+ import i18next from "i18next";
4
5
  //#region resources/js/i18n/instance.ts
5
6
  var NAMESPACE = "lattice";
6
- function detectLanguage() {
7
- if (typeof document !== "undefined" && document.documentElement.lang) return document.documentElement.lang;
8
- return "en";
9
- }
10
- /** Lattice's own i18next instance, isolated from the host app's. */
11
- var i18n = instance.createInstance().use(initReactI18next);
7
+ var i18n = i18next.createInstance();
12
8
  var initialization;
9
+ var revision = 0;
10
+ function subscribe(onStoreChange) {
11
+ const listener = () => {
12
+ revision += 1;
13
+ onStoreChange();
14
+ };
15
+ i18n.on("initialized", listener);
16
+ i18n.on("loaded", listener);
17
+ i18n.on("languageChanged", listener);
18
+ i18n.store?.on("added", listener);
19
+ i18n.store?.on("removed", listener);
20
+ return () => {
21
+ i18n.off("initialized", listener);
22
+ i18n.off("loaded", listener);
23
+ i18n.off("languageChanged", listener);
24
+ i18n.store?.off("added", listener);
25
+ i18n.store?.off("removed", listener);
26
+ };
27
+ }
28
+ function snapshot() {
29
+ return revision;
30
+ }
13
31
  /**
14
32
  * Initialize the instance exactly once. The first caller wins — a rendered
15
33
  * component (inline English, zero config) or `enableBackend()`, which registers
@@ -18,31 +36,60 @@ var initialization;
18
36
  function ensureI18n(extend) {
19
37
  if (!initialization) {
20
38
  const base = {
21
- lng: detectLanguage(),
39
+ lng: currentLocale(),
22
40
  fallbackLng: "en",
23
41
  ns: [NAMESPACE],
24
42
  defaultNS: NAMESPACE,
25
- interpolation: { escapeValue: false },
26
- react: { useSuspense: false }
43
+ interpolation: { escapeValue: false }
27
44
  };
28
45
  initialization = i18n.init(extend ? extend(base) : base);
29
46
  }
30
47
  return initialization;
31
48
  }
32
- /** Translation hook bound to Lattice's instance. The chrome passes `"lattice"`; consumers pass their own namespace. */
49
+ subscribeLocale((locale) => {
50
+ ensureI18n().then(() => {
51
+ if (i18n.language !== locale) i18n.changeLanguage(locale);
52
+ });
53
+ });
54
+ /**
55
+ * Eagerly load the namespaces for the given locales so a later
56
+ * `changeLanguage` resolves them from the store instead of an HTTP round-trip,
57
+ * which would otherwise flash the fallback language on switch. The active
58
+ * locale is already loaded by {@link ensureI18n}, so it is skipped.
59
+ */
60
+ async function preloadLanguages(locales) {
61
+ const pending = locales.filter((locale) => locale !== currentLocale());
62
+ if (pending.length === 0) return;
63
+ await ensureI18n();
64
+ await i18n.loadLanguages([...pending]);
65
+ }
33
66
  function useT(namespace) {
34
67
  ensureI18n();
35
- return useTranslation(namespace, { i18n });
68
+ useSyncExternalStore(subscribe, snapshot, snapshot);
69
+ const { locales } = useConfig();
70
+ const { locale, setLocale } = useLocale();
71
+ return {
72
+ t: useCallback((key, defaultValue = key, options = {}) => translate(namespace, key, defaultValue, options), [namespace]),
73
+ i18n,
74
+ locale,
75
+ locales,
76
+ ready: i18n.isInitialized,
77
+ setLocale
78
+ };
36
79
  }
37
- /** Translate a key in the given namespace with an inline fallback, outside of a component. */
38
80
  function translate(namespace, key, defaultValue, options) {
39
81
  ensureI18n();
82
+ if (!i18n.isInitialized || !i18n.hasLoadedNamespace(namespace)) return i18n.t(key, defaultValue, {
83
+ ns: namespace,
84
+ ...options,
85
+ saveMissing: false
86
+ });
40
87
  return i18n.t(key, defaultValue, {
41
88
  ns: namespace,
42
89
  ...options
43
90
  });
44
91
  }
45
92
  //#endregion
46
- export { ensureI18n, i18n, translate, useT };
93
+ export { ensureI18n, i18n, preloadLanguages, translate, useT };
47
94
 
48
95
  //# sourceMappingURL=instance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instance.js","names":[],"sources":["../../resources/js/i18n/instance.ts"],"sourcesContent":["import i18next, { type InitOptions } from \"i18next\";\nimport { initReactI18next, useTranslation } from \"react-i18next\";\n\nconst NAMESPACE = \"lattice\";\n\nfunction detectLanguage(): string {\n if (typeof document !== \"undefined\" && document.documentElement.lang) {\n return document.documentElement.lang;\n }\n\n return \"en\";\n}\n\n/** Lattice's own i18next instance, isolated from the host app's. */\nexport const i18n = i18next.createInstance().use(initReactI18next);\n\nlet initialization: Promise<unknown> | undefined;\n\n/**\n * Initialize the instance exactly once. The first caller wins — a rendered\n * component (inline English, zero config) or `enableBackend()`, which registers\n * its backend first because i18next can only wire a backend during `init`.\n */\nexport function ensureI18n(extend?: (base: InitOptions) => InitOptions): Promise<unknown> {\n if (!initialization) {\n const base: InitOptions = {\n lng: detectLanguage(),\n fallbackLng: \"en\",\n ns: [NAMESPACE],\n defaultNS: NAMESPACE,\n interpolation: { escapeValue: false },\n react: { useSuspense: false },\n };\n\n initialization = i18n.init(extend ? extend(base) : base);\n }\n\n return initialization;\n}\n\n/** Translation hook bound to Lattice's instance. The chrome passes `\"lattice\"`; consumers pass their own namespace. */\nexport function useT(namespace: string) {\n ensureI18n();\n\n return useTranslation(namespace, { i18n });\n}\n\n/** Translate a key in the given namespace with an inline fallback, outside of a component. */\nexport function translate(\n namespace: string,\n key: string,\n defaultValue: string,\n options?: Record<string, unknown>,\n): string {\n ensureI18n();\n\n return i18n.t(key, defaultValue, { ns: namespace, ...options });\n}\n"],"mappings":";;;;AAGA,IAAM,YAAY;AAElB,SAAS,iBAAyB;CAChC,IAAI,OAAO,aAAa,eAAe,SAAS,gBAAgB,MAC9D,OAAO,SAAS,gBAAgB;CAGlC,OAAO;AACT;;AAGA,IAAa,OAAO,SAAQ,eAAe,EAAE,IAAI,gBAAgB;AAEjE,IAAI;;;;;;AAOJ,SAAgB,WAAW,QAA+D;CACxF,IAAI,CAAC,gBAAgB;EACnB,MAAM,OAAoB;GACxB,KAAK,eAAe;GACpB,aAAa;GACb,IAAI,CAAC,SAAS;GACd,WAAW;GACX,eAAe,EAAE,aAAa,MAAM;GACpC,OAAO,EAAE,aAAa,MAAM;EAC9B;EAEA,iBAAiB,KAAK,KAAK,SAAS,OAAO,IAAI,IAAI,IAAI;CACzD;CAEA,OAAO;AACT;;AAGA,SAAgB,KAAK,WAAmB;CACtC,WAAW;CAEX,OAAO,eAAe,WAAW,EAAE,KAAK,CAAC;AAC3C;;AAGA,SAAgB,UACd,WACA,KACA,cACA,SACQ;CACR,WAAW;CAEX,OAAO,KAAK,EAAE,KAAK,cAAc;EAAE,IAAI;EAAW,GAAG;CAAQ,CAAC;AAChE"}
1
+ {"version":3,"file":"instance.js","names":[],"sources":["../../resources/js/i18n/instance.ts"],"sourcesContent":["import i18next, { type i18n as I18nInstance, type InitOptions } from \"i18next\";\nimport { useCallback, useSyncExternalStore } from \"react\";\nimport { useConfig } from \"./config\";\nimport { currentLocale, subscribeLocale, useLocale } from \"./locale\";\n\nconst NAMESPACE = \"lattice\";\n\ntype TranslationFunction = (\n key: string,\n defaultValue?: string,\n options?: Record<string, unknown>,\n) => string;\n\nexport type TranslationResult = {\n t: TranslationFunction;\n i18n: I18nInstance;\n locale: string;\n locales: readonly string[];\n ready: boolean;\n setLocale: (locale: string) => void;\n};\n\nexport const i18n: I18nInstance = i18next.createInstance();\n\nlet initialization: Promise<unknown> | undefined;\nlet revision = 0;\n\nfunction subscribe(onStoreChange: () => void): () => void {\n const listener = () => {\n revision += 1;\n onStoreChange();\n };\n\n i18n.on(\"initialized\", listener);\n i18n.on(\"loaded\", listener);\n i18n.on(\"languageChanged\", listener);\n i18n.store?.on(\"added\", listener);\n i18n.store?.on(\"removed\", listener);\n\n return () => {\n i18n.off(\"initialized\", listener);\n i18n.off(\"loaded\", listener);\n i18n.off(\"languageChanged\", listener);\n i18n.store?.off(\"added\", listener);\n i18n.store?.off(\"removed\", listener);\n };\n}\n\nfunction snapshot(): number {\n return revision;\n}\n\n/**\n * Initialize the instance exactly once. The first caller wins — a rendered\n * component (inline English, zero config) or `enableBackend()`, which registers\n * its backend first because i18next can only wire a backend during `init`.\n */\nexport function ensureI18n(extend?: (base: InitOptions) => InitOptions): Promise<unknown> {\n if (!initialization) {\n const base: InitOptions = {\n lng: currentLocale(),\n fallbackLng: \"en\",\n ns: [NAMESPACE],\n defaultNS: NAMESPACE,\n interpolation: { escapeValue: false },\n };\n\n initialization = i18n.init(extend ? extend(base) : base);\n }\n\n return initialization;\n}\n\nsubscribeLocale((locale) => {\n void ensureI18n().then(() => {\n if (i18n.language !== locale) {\n void i18n.changeLanguage(locale);\n }\n });\n});\n\n/**\n * Eagerly load the namespaces for the given locales so a later\n * `changeLanguage` resolves them from the store instead of an HTTP round-trip,\n * which would otherwise flash the fallback language on switch. The active\n * locale is already loaded by {@link ensureI18n}, so it is skipped.\n */\nexport async function preloadLanguages(locales: readonly string[]): Promise<void> {\n const pending = locales.filter((locale) => locale !== currentLocale());\n\n if (pending.length === 0) {\n return;\n }\n\n await ensureI18n();\n await i18n.loadLanguages([...pending]);\n}\n\nexport function useT(namespace: string): TranslationResult {\n ensureI18n();\n useSyncExternalStore(subscribe, snapshot, snapshot);\n const { locales } = useConfig();\n const { locale, setLocale } = useLocale();\n\n const t = useCallback<TranslationFunction>(\n (key, defaultValue = key, options = {}) => translate(namespace, key, defaultValue, options),\n [namespace],\n );\n\n return { t, i18n, locale, locales, ready: i18n.isInitialized, setLocale };\n}\n\nexport function translate(\n namespace: string,\n key: string,\n defaultValue: string,\n options?: Record<string, unknown>,\n): string {\n ensureI18n();\n\n if (!i18n.isInitialized || !i18n.hasLoadedNamespace(namespace)) {\n return i18n.t(key, defaultValue, { ns: namespace, ...options, saveMissing: false });\n }\n\n return i18n.t(key, defaultValue, { ns: namespace, ...options });\n}\n"],"mappings":";;;;;AAKA,IAAM,YAAY;AAiBlB,IAAa,OAAqB,QAAQ,eAAe;AAEzD,IAAI;AACJ,IAAI,WAAW;AAEf,SAAS,UAAU,eAAuC;CACxD,MAAM,iBAAiB;EACrB,YAAY;EACZ,cAAc;CAChB;CAEA,KAAK,GAAG,eAAe,QAAQ;CAC/B,KAAK,GAAG,UAAU,QAAQ;CAC1B,KAAK,GAAG,mBAAmB,QAAQ;CACnC,KAAK,OAAO,GAAG,SAAS,QAAQ;CAChC,KAAK,OAAO,GAAG,WAAW,QAAQ;CAElC,aAAa;EACX,KAAK,IAAI,eAAe,QAAQ;EAChC,KAAK,IAAI,UAAU,QAAQ;EAC3B,KAAK,IAAI,mBAAmB,QAAQ;EACpC,KAAK,OAAO,IAAI,SAAS,QAAQ;EACjC,KAAK,OAAO,IAAI,WAAW,QAAQ;CACrC;AACF;AAEA,SAAS,WAAmB;CAC1B,OAAO;AACT;;;;;;AAOA,SAAgB,WAAW,QAA+D;CACxF,IAAI,CAAC,gBAAgB;EACnB,MAAM,OAAoB;GACxB,KAAK,cAAc;GACnB,aAAa;GACb,IAAI,CAAC,SAAS;GACd,WAAW;GACX,eAAe,EAAE,aAAa,MAAM;EACtC;EAEA,iBAAiB,KAAK,KAAK,SAAS,OAAO,IAAI,IAAI,IAAI;CACzD;CAEA,OAAO;AACT;AAEA,iBAAiB,WAAW;CAC1B,WAAgB,EAAE,WAAW;EAC3B,IAAI,KAAK,aAAa,QACpB,KAAU,eAAe,MAAM;CAEnC,CAAC;AACH,CAAC;;;;;;;AAQD,eAAsB,iBAAiB,SAA2C;CAChF,MAAM,UAAU,QAAQ,QAAQ,WAAW,WAAW,cAAc,CAAC;CAErE,IAAI,QAAQ,WAAW,GACrB;CAGF,MAAM,WAAW;CACjB,MAAM,KAAK,cAAc,CAAC,GAAG,OAAO,CAAC;AACvC;AAEA,SAAgB,KAAK,WAAsC;CACzD,WAAW;CACX,qBAAqB,WAAW,UAAU,QAAQ;CAClD,MAAM,EAAE,YAAY,UAAU;CAC9B,MAAM,EAAE,QAAQ,cAAc,UAAU;CAOxC,OAAO;EAAE,GALC,aACP,KAAK,eAAe,KAAK,UAAU,CAAC,MAAM,UAAU,WAAW,KAAK,cAAc,OAAO,GAC1F,CAAC,SAAS,CAGH;EAAG;EAAM;EAAQ;EAAS,OAAO,KAAK;EAAe;CAAU;AAC1E;AAEA,SAAgB,UACd,WACA,KACA,cACA,SACQ;CACR,WAAW;CAEX,IAAI,CAAC,KAAK,iBAAiB,CAAC,KAAK,mBAAmB,SAAS,GAC3D,OAAO,KAAK,EAAE,KAAK,cAAc;EAAE,IAAI;EAAW,GAAG;EAAS,aAAa;CAAM,CAAC;CAGpF,OAAO,KAAK,EAAE,KAAK,cAAc;EAAE,IAAI;EAAW,GAAG;CAAQ,CAAC;AAChE"}
@@ -0,0 +1,3 @@
1
+ import { VisitOptions } from '@inertiajs/core';
2
+ export type LocaleReloadProps = Pick<VisitOptions, "preserveScroll" | "preserveState">;
3
+ export declare function LocaleReload({ preserveScroll, preserveState }: LocaleReloadProps): import("react").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import { EventBridge } from "../events/event-bridge.js";
2
+ import { useCallback } from "react";
3
+ import { router } from "@inertiajs/react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region resources/js/i18n/locale-reload.tsx
6
+ function LocaleReload({ preserveScroll = true, preserveState = true }) {
7
+ return /* @__PURE__ */ jsx(EventBridge, { onLocaleChange: useCallback(() => {
8
+ router.visit(window.location.href, {
9
+ preserveScroll,
10
+ preserveState
11
+ });
12
+ }, [preserveScroll, preserveState]) });
13
+ }
14
+ //#endregion
15
+ export { LocaleReload };
16
+
17
+ //# sourceMappingURL=locale-reload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale-reload.js","names":[],"sources":["../../resources/js/i18n/locale-reload.tsx"],"sourcesContent":["import type { VisitOptions } from \"@inertiajs/core\";\nimport { router } from \"@inertiajs/react\";\nimport { useCallback } from \"react\";\nimport { EventBridge } from \"../events/event-bridge\";\n\nexport type LocaleReloadProps = Pick<VisitOptions, \"preserveScroll\" | \"preserveState\">;\n\n// preserveState by default: the visit only re-fetches the re-localized props,\n// so keeping the page mounted avoids remounting the whole tree (and losing\n// table sort/filter, form input, focus) on every locale switch.\nexport function LocaleReload({ preserveScroll = true, preserveState = true }: LocaleReloadProps) {\n const reload = useCallback(() => {\n router.visit(window.location.href, { preserveScroll, preserveState });\n }, [preserveScroll, preserveState]);\n\n return <EventBridge onLocaleChange={reload} />;\n}\n"],"mappings":";;;;;AAUA,SAAgB,aAAa,EAAE,iBAAiB,MAAM,gBAAgB,QAA2B;CAK/F,OAAO,oBAAC,aAAD,EAAa,gBAJL,kBAAkB;EAC/B,OAAO,MAAM,OAAO,SAAS,MAAM;GAAE;GAAgB;EAAc,CAAC;CACtE,GAAG,CAAC,gBAAgB,aAAa,CAEG,EAAS,CAAA;AAC/C"}
@@ -0,0 +1,21 @@
1
+ import { ReactNode } from 'react';
2
+ export type LocaleOption = {
3
+ readonly value: string;
4
+ readonly label: string;
5
+ readonly active: boolean;
6
+ };
7
+ export type UseLocaleOptionsOptions = {
8
+ readonly namespace?: string;
9
+ readonly label?: (locale: string) => string;
10
+ };
11
+ export type UseLocaleOptionsReturn = {
12
+ readonly locale: string;
13
+ readonly locales: readonly string[];
14
+ readonly options: readonly LocaleOption[];
15
+ readonly setLocale: (locale: string) => void;
16
+ };
17
+ export type LocaleSwitcherProps = UseLocaleOptionsOptions & {
18
+ readonly children: (state: UseLocaleOptionsReturn) => ReactNode;
19
+ };
20
+ export declare function useLocaleOptions({ namespace, label, }?: UseLocaleOptionsOptions): UseLocaleOptionsReturn;
21
+ export declare function LocaleSwitcher({ children, ...options }: LocaleSwitcherProps): import("react").JSX.Element;
@@ -0,0 +1,25 @@
1
+ import { useT } from "./instance.js";
2
+ import { Fragment, jsx } from "react/jsx-runtime";
3
+ //#region resources/js/i18n/locale-switcher.tsx
4
+ function useLocaleOptions({ namespace = "lattice", label } = {}) {
5
+ const { t, locale, locales, setLocale } = useT(namespace);
6
+ const values = locales.length > 0 ? locales : [locale];
7
+ const labelFor = label ?? ((value) => t(`language.${value}`, value));
8
+ return {
9
+ locale,
10
+ locales: values,
11
+ options: values.map((value) => ({
12
+ value,
13
+ label: labelFor(value),
14
+ active: value === locale
15
+ })),
16
+ setLocale
17
+ };
18
+ }
19
+ function LocaleSwitcher({ children, ...options }) {
20
+ return /* @__PURE__ */ jsx(Fragment, { children: children(useLocaleOptions(options)) });
21
+ }
22
+ //#endregion
23
+ export { LocaleSwitcher, useLocaleOptions };
24
+
25
+ //# sourceMappingURL=locale-switcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale-switcher.js","names":[],"sources":["../../resources/js/i18n/locale-switcher.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { useT } from \"./instance\";\n\nexport type LocaleOption = {\n readonly value: string;\n readonly label: string;\n readonly active: boolean;\n};\n\nexport type UseLocaleOptionsOptions = {\n readonly namespace?: string;\n readonly label?: (locale: string) => string;\n};\n\nexport type UseLocaleOptionsReturn = {\n readonly locale: string;\n readonly locales: readonly string[];\n readonly options: readonly LocaleOption[];\n readonly setLocale: (locale: string) => void;\n};\n\nexport type LocaleSwitcherProps = UseLocaleOptionsOptions & {\n readonly children: (state: UseLocaleOptionsReturn) => ReactNode;\n};\n\nexport function useLocaleOptions({\n namespace = \"lattice\",\n label,\n}: UseLocaleOptionsOptions = {}): UseLocaleOptionsReturn {\n const { t, locale, locales, setLocale } = useT(namespace);\n const values = locales.length > 0 ? locales : [locale];\n const labelFor = label ?? ((value: string): string => t(`language.${value}`, value));\n\n return {\n locale,\n locales: values,\n options: values.map((value) => ({\n value,\n label: labelFor(value),\n active: value === locale,\n })),\n setLocale,\n };\n}\n\nexport function LocaleSwitcher({ children, ...options }: LocaleSwitcherProps) {\n return <>{children(useLocaleOptions(options))}</>;\n}\n"],"mappings":";;;AAyBA,SAAgB,iBAAiB,EAC/B,YAAY,WACZ,UAC2B,CAAC,GAA2B;CACvD,MAAM,EAAE,GAAG,QAAQ,SAAS,cAAc,KAAK,SAAS;CACxD,MAAM,SAAS,QAAQ,SAAS,IAAI,UAAU,CAAC,MAAM;CACrD,MAAM,WAAW,WAAW,UAA0B,EAAE,YAAY,SAAS,KAAK;CAElF,OAAO;EACL;EACA,SAAS;EACT,SAAS,OAAO,KAAK,WAAW;GAC9B;GACA,OAAO,SAAS,KAAK;GACrB,QAAQ,UAAU;EACpB,EAAE;EACF;CACF;AACF;AAEA,SAAgB,eAAe,EAAE,UAAU,GAAG,WAAgC;CAC5E,OAAO,oBAAA,UAAA,EAAA,UAAG,SAAS,iBAAiB,OAAO,CAAC,EAAI,CAAA;AAClD"}
@@ -0,0 +1,9 @@
1
+ export type UseLocaleReturn = {
2
+ readonly locale: string;
3
+ readonly setLocale: (locale: string) => void;
4
+ };
5
+ export declare function currentLocale(): string;
6
+ export declare function localeHeader(): Record<string, string>;
7
+ export declare function subscribeLocale(callback: (locale: string) => void): () => void;
8
+ export declare function setLocale(locale: string): void;
9
+ export declare function useLocale(): UseLocaleReturn;
@@ -0,0 +1,93 @@
1
+ import { LATTICE_EVENT } from "../events/event-names.js";
2
+ import { useSyncExternalStore } from "react";
3
+ //#region resources/js/i18n/locale.ts
4
+ var key = "locale";
5
+ var fallback = "en";
6
+ var maxAge = 365 * 24 * 60 * 60;
7
+ var listeners = /* @__PURE__ */ new Set();
8
+ var active;
9
+ function normalize(value) {
10
+ const next = value.trim();
11
+ return next === "" ? fallback : next;
12
+ }
13
+ function storedValue() {
14
+ if (typeof window === "undefined") return null;
15
+ try {
16
+ return localStorage.getItem(key);
17
+ } catch {
18
+ return null;
19
+ }
20
+ }
21
+ function cookieValue() {
22
+ if (typeof document === "undefined") return null;
23
+ const item = document.cookie.split(";").map((cookie) => cookie.trim()).find((cookie) => cookie.startsWith(`${key}=`));
24
+ if (!item) return null;
25
+ try {
26
+ return decodeURIComponent(item.slice(7));
27
+ } catch {
28
+ return null;
29
+ }
30
+ }
31
+ function documentValue() {
32
+ if (typeof document === "undefined") return null;
33
+ return document.documentElement.lang || null;
34
+ }
35
+ function detectedLocale() {
36
+ return normalize(storedValue() ?? cookieValue() ?? documentValue() ?? fallback);
37
+ }
38
+ function persist(locale) {
39
+ if (typeof document !== "undefined") {
40
+ document.cookie = `${key}=${encodeURIComponent(locale)};path=/;max-age=${maxAge};SameSite=Lax`;
41
+ document.documentElement.lang = locale;
42
+ }
43
+ if (typeof window !== "undefined") try {
44
+ localStorage.setItem(key, locale);
45
+ } catch {
46
+ return;
47
+ }
48
+ }
49
+ function snapshot() {
50
+ active ??= detectedLocale();
51
+ return active;
52
+ }
53
+ function subscribe(callback) {
54
+ listeners.add(callback);
55
+ return () => {
56
+ listeners.delete(callback);
57
+ };
58
+ }
59
+ function notify() {
60
+ listeners.forEach((listener) => listener());
61
+ }
62
+ function dispatch(locale) {
63
+ if (typeof window === "undefined") return;
64
+ window.dispatchEvent(new CustomEvent(LATTICE_EVENT.localeChange, { detail: { locale } }));
65
+ }
66
+ function currentLocale() {
67
+ return snapshot();
68
+ }
69
+ function localeHeader() {
70
+ return { "Accept-Language": currentLocale() };
71
+ }
72
+ function subscribeLocale(callback) {
73
+ return subscribe(() => callback(currentLocale()));
74
+ }
75
+ function setLocale(locale) {
76
+ const previous = currentLocale();
77
+ const next = normalize(locale);
78
+ active = next;
79
+ persist(next);
80
+ if (next === previous) return;
81
+ notify();
82
+ dispatch(next);
83
+ }
84
+ function useLocale() {
85
+ return {
86
+ locale: useSyncExternalStore(subscribe, snapshot, () => fallback),
87
+ setLocale
88
+ };
89
+ }
90
+ //#endregion
91
+ export { currentLocale, localeHeader, setLocale, subscribeLocale, useLocale };
92
+
93
+ //# sourceMappingURL=locale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locale.js","names":[],"sources":["../../resources/js/i18n/locale.ts"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { LATTICE_EVENT } from \"../events/event-names\";\n\nexport type UseLocaleReturn = {\n readonly locale: string;\n readonly setLocale: (locale: string) => void;\n};\n\nconst key = \"locale\";\nconst fallback = \"en\";\nconst maxAge = 365 * 24 * 60 * 60;\nconst listeners = new Set<() => void>();\n\nlet active: string | undefined;\n\nfunction normalize(value: string): string {\n const next = value.trim();\n\n return next === \"\" ? fallback : next;\n}\n\nfunction storedValue(): string | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction cookieValue(): string | null {\n if (typeof document === \"undefined\") {\n return null;\n }\n\n const item = document.cookie\n .split(\";\")\n .map((cookie) => cookie.trim())\n .find((cookie) => cookie.startsWith(`${key}=`));\n\n if (!item) {\n return null;\n }\n\n try {\n return decodeURIComponent(item.slice(key.length + 1));\n } catch {\n return null;\n }\n}\n\nfunction documentValue(): string | null {\n if (typeof document === \"undefined\") {\n return null;\n }\n\n return document.documentElement.lang || null;\n}\n\nfunction detectedLocale(): string {\n return normalize(storedValue() ?? cookieValue() ?? documentValue() ?? fallback);\n}\n\nfunction persist(locale: string): void {\n if (typeof document !== \"undefined\") {\n document.cookie = `${key}=${encodeURIComponent(locale)};path=/;max-age=${maxAge};SameSite=Lax`;\n document.documentElement.lang = locale;\n }\n\n if (typeof window !== \"undefined\") {\n try {\n localStorage.setItem(key, locale);\n } catch {\n return;\n }\n }\n}\n\nfunction snapshot(): string {\n active ??= detectedLocale();\n\n return active;\n}\n\nfunction subscribe(callback: () => void): () => void {\n listeners.add(callback);\n\n return () => {\n listeners.delete(callback);\n };\n}\n\nfunction notify(): void {\n listeners.forEach((listener) => listener());\n}\n\nfunction dispatch(locale: string): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.dispatchEvent(new CustomEvent(LATTICE_EVENT.localeChange, { detail: { locale } }));\n}\n\nexport function currentLocale(): string {\n return snapshot();\n}\n\nexport function localeHeader(): Record<string, string> {\n return { \"Accept-Language\": currentLocale() };\n}\n\nexport function subscribeLocale(callback: (locale: string) => void): () => void {\n return subscribe(() => callback(currentLocale()));\n}\n\nexport function setLocale(locale: string): void {\n const previous = currentLocale();\n const next = normalize(locale);\n\n active = next;\n persist(next);\n\n if (next === previous) {\n return;\n }\n\n notify();\n dispatch(next);\n}\n\nexport function useLocale(): UseLocaleReturn {\n const locale = useSyncExternalStore(subscribe, snapshot, () => fallback);\n\n return { locale, setLocale } as const;\n}\n"],"mappings":";;;AAQA,IAAM,MAAM;AACZ,IAAM,WAAW;AACjB,IAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,IAAM,4BAAY,IAAI,IAAgB;AAEtC,IAAI;AAEJ,SAAS,UAAU,OAAuB;CACxC,MAAM,OAAO,MAAM,KAAK;CAExB,OAAO,SAAS,KAAK,WAAW;AAClC;AAEA,SAAS,cAA6B;CACpC,IAAI,OAAO,WAAW,aACpB,OAAO;CAGT,IAAI;EACF,OAAO,aAAa,QAAQ,GAAG;CACjC,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,cAA6B;CACpC,IAAI,OAAO,aAAa,aACtB,OAAO;CAGT,MAAM,OAAO,SAAS,OACnB,MAAM,GAAG,EACT,KAAK,WAAW,OAAO,KAAK,CAAC,EAC7B,MAAM,WAAW,OAAO,WAAW,GAAG,IAAI,EAAE,CAAC;CAEhD,IAAI,CAAC,MACH,OAAO;CAGT,IAAI;EACF,OAAO,mBAAmB,KAAK,MAAM,CAAc,CAAC;CACtD,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,gBAA+B;CACtC,IAAI,OAAO,aAAa,aACtB,OAAO;CAGT,OAAO,SAAS,gBAAgB,QAAQ;AAC1C;AAEA,SAAS,iBAAyB;CAChC,OAAO,UAAU,YAAY,KAAK,YAAY,KAAK,cAAc,KAAK,QAAQ;AAChF;AAEA,SAAS,QAAQ,QAAsB;CACrC,IAAI,OAAO,aAAa,aAAa;EACnC,SAAS,SAAS,GAAG,IAAI,GAAG,mBAAmB,MAAM,EAAE,kBAAkB,OAAO;EAChF,SAAS,gBAAgB,OAAO;CAClC;CAEA,IAAI,OAAO,WAAW,aACpB,IAAI;EACF,aAAa,QAAQ,KAAK,MAAM;CAClC,QAAQ;EACN;CACF;AAEJ;AAEA,SAAS,WAAmB;CAC1B,WAAW,eAAe;CAE1B,OAAO;AACT;AAEA,SAAS,UAAU,UAAkC;CACnD,UAAU,IAAI,QAAQ;CAEtB,aAAa;EACX,UAAU,OAAO,QAAQ;CAC3B;AACF;AAEA,SAAS,SAAe;CACtB,UAAU,SAAS,aAAa,SAAS,CAAC;AAC5C;AAEA,SAAS,SAAS,QAAsB;CACtC,IAAI,OAAO,WAAW,aACpB;CAGF,OAAO,cAAc,IAAI,YAAY,cAAc,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC1F;AAEA,SAAgB,gBAAwB;CACtC,OAAO,SAAS;AAClB;AAEA,SAAgB,eAAuC;CACrD,OAAO,EAAE,mBAAmB,cAAc,EAAE;AAC9C;AAEA,SAAgB,gBAAgB,UAAgD;CAC9E,OAAO,gBAAgB,SAAS,cAAc,CAAC,CAAC;AAClD;AAEA,SAAgB,UAAU,QAAsB;CAC9C,MAAM,WAAW,cAAc;CAC/B,MAAM,OAAO,UAAU,MAAM;CAE7B,SAAS;CACT,QAAQ,IAAI;CAEZ,IAAI,SAAS,UACX;CAGF,OAAO;CACP,SAAS,IAAI;AACf;AAEA,SAAgB,YAA6B;CAG3C,OAAO;EAAE,QAFM,qBAAqB,WAAW,gBAAgB,QAEtD;EAAQ;CAAU;AAC7B"}
@@ -0,0 +1,3 @@
1
+ import { ConfigureI18nOptions, I18nConfig } from './backend';
2
+ export declare function i18nConfigFromPageProps(props: unknown): I18nConfig | undefined;
3
+ export declare function configureI18nFromPageProps(props: unknown, options?: ConfigureI18nOptions): Promise<void>;
@@ -0,0 +1,24 @@
1
+ import { configureI18n } from "./backend.js";
2
+ //#region resources/js/i18n/page-props.ts
3
+ function isRecord(value) {
4
+ return typeof value === "object" && value !== null;
5
+ }
6
+ function isStringArray(value) {
7
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
8
+ }
9
+ function isI18nConfig(value) {
10
+ return isRecord(value) && typeof value.enabled === "boolean" && typeof value.saveMissing === "boolean" && isStringArray(value.locales) && isStringArray(value.preloadLocales);
11
+ }
12
+ function i18nConfigFromPageProps(props) {
13
+ if (!isRecord(props)) return;
14
+ const shared = props.lattice;
15
+ const config = isRecord(shared) ? shared.i18n : void 0;
16
+ return isI18nConfig(config) ? config : void 0;
17
+ }
18
+ function configureI18nFromPageProps(props, options = {}) {
19
+ return configureI18n(i18nConfigFromPageProps(props), options);
20
+ }
21
+ //#endregion
22
+ export { configureI18nFromPageProps, i18nConfigFromPageProps };
23
+
24
+ //# sourceMappingURL=page-props.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-props.js","names":[],"sources":["../../resources/js/i18n/page-props.ts"],"sourcesContent":["import { configureI18n, type ConfigureI18nOptions, type I18nConfig } from \"./backend\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction isI18nConfig(value: unknown): value is I18nConfig {\n return (\n isRecord(value) &&\n typeof value.enabled === \"boolean\" &&\n typeof value.saveMissing === \"boolean\" &&\n isStringArray(value.locales) &&\n isStringArray(value.preloadLocales)\n );\n}\n\nexport function i18nConfigFromPageProps(props: unknown): I18nConfig | undefined {\n if (!isRecord(props)) {\n return undefined;\n }\n\n const shared = props.lattice;\n const config = isRecord(shared) ? shared.i18n : undefined;\n\n return isI18nConfig(config) ? config : undefined;\n}\n\nexport function configureI18nFromPageProps(\n props: unknown,\n options: ConfigureI18nOptions = {},\n): Promise<void> {\n return configureI18n(i18nConfigFromPageProps(props), options);\n}\n"],"mappings":";;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,cAAc,OAAmC;CACxD,OAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,OAAO,SAAS,OAAO,SAAS,QAAQ;AAC/E;AAEA,SAAS,aAAa,OAAqC;CACzD,OACE,SAAS,KAAK,KACd,OAAO,MAAM,YAAY,aACzB,OAAO,MAAM,gBAAgB,aAC7B,cAAc,MAAM,OAAO,KAC3B,cAAc,MAAM,cAAc;AAEtC;AAEA,SAAgB,wBAAwB,OAAwC;CAC9E,IAAI,CAAC,SAAS,KAAK,GACjB;CAGF,MAAM,SAAS,MAAM;CACrB,MAAM,SAAS,SAAS,MAAM,IAAI,OAAO,OAAO,KAAA;CAEhD,OAAO,aAAa,MAAM,IAAI,SAAS,KAAA;AACzC;AAEA,SAAgB,2BACd,OACA,UAAgC,CAAC,GAClB;CACf,OAAO,cAAc,wBAAwB,KAAK,GAAG,OAAO;AAC9D"}
@@ -0,0 +1,4 @@
1
+ import { Translatable } from '../types/generated';
2
+ export type Translate = (key: string, defaultValue?: string, options?: Record<string, unknown>) => string;
3
+ export declare function isTranslatable(value: unknown): value is Translatable;
4
+ export declare function resolveTranslatable(value: Translatable, payload: Record<string, unknown>, t: Translate): string;
@@ -0,0 +1,24 @@
1
+ //#region resources/js/i18n/translatable.ts
2
+ function isTranslatable(value) {
3
+ return typeof value === "object" && value !== null && typeof value.key === "string";
4
+ }
5
+ function readPath(payload, path) {
6
+ return path.split(".").reduce((node, segment) => {
7
+ if (typeof node === "object" && node !== null) return node[segment];
8
+ }, payload);
9
+ }
10
+ function resolveTranslatable(value, payload, t) {
11
+ const fromPayload = {};
12
+ for (const [name, path] of Object.entries(value.payload)) {
13
+ const read = readPath(payload, path);
14
+ fromPayload[name] = read === void 0 ? "" : read;
15
+ }
16
+ return t(value.key, value.key, {
17
+ ...value.replacements,
18
+ ...fromPayload
19
+ });
20
+ }
21
+ //#endregion
22
+ export { isTranslatable, resolveTranslatable };
23
+
24
+ //# sourceMappingURL=translatable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translatable.js","names":[],"sources":["../../resources/js/i18n/translatable.ts"],"sourcesContent":["import type { Translatable } from \"@lattice-php/lattice/types/generated\";\n\nexport type Translate = (\n key: string,\n defaultValue?: string,\n options?: Record<string, unknown>,\n) => string;\n\nexport function isTranslatable(value: unknown): value is Translatable {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { key?: unknown }).key === \"string\"\n );\n}\n\nfunction readPath(payload: Record<string, unknown>, path: string): unknown {\n return path.split(\".\").reduce<unknown>((node, segment) => {\n if (typeof node === \"object\" && node !== null) {\n return (node as Record<string, unknown>)[segment];\n }\n\n return undefined;\n }, payload);\n}\n\nexport function resolveTranslatable(\n value: Translatable,\n payload: Record<string, unknown>,\n t: Translate,\n): string {\n const fromPayload: Record<string, unknown> = {};\n\n for (const [name, path] of Object.entries(value.payload)) {\n const read = readPath(payload, path);\n fromPayload[name] = read === undefined ? \"\" : read;\n }\n\n return t(value.key, value.key, { ...value.replacements, ...fromPayload });\n}\n"],"mappings":";AAQA,SAAgB,eAAe,OAAuC;CACpE,OACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAQ,MAA4B,QAAQ;AAEhD;AAEA,SAAS,SAAS,SAAkC,MAAuB;CACzE,OAAO,KAAK,MAAM,GAAG,EAAE,QAAiB,MAAM,YAAY;EACxD,IAAI,OAAO,SAAS,YAAY,SAAS,MACvC,OAAQ,KAAiC;CAI7C,GAAG,OAAO;AACZ;AAEA,SAAgB,oBACd,OACA,SACA,GACQ;CACR,MAAM,cAAuC,CAAC;CAE9C,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,MAAM,OAAO,GAAG;EACxD,MAAM,OAAO,SAAS,SAAS,IAAI;EACnC,YAAY,QAAQ,SAAS,KAAA,IAAY,KAAK;CAChD;CAEA,OAAO,EAAE,MAAM,KAAK,MAAM,KAAK;EAAE,GAAG,MAAM;EAAc,GAAG;CAAY,CAAC;AAC1E"}