@lattice-php/lattice 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +8 -0
  2. package/dist/action/components/action-form.d.ts +24 -0
  3. package/dist/action/components/action-form.js +270 -0
  4. package/dist/action/components/action-form.js.map +1 -0
  5. package/dist/action/components/action-group.d.ts +1 -8
  6. package/dist/action/components/action-group.js +24 -66
  7. package/dist/action/components/action-group.js.map +1 -1
  8. package/dist/action/components/action.d.ts +1 -24
  9. package/dist/action/components/action.js +61 -46
  10. package/dist/action/components/action.js.map +1 -1
  11. package/dist/action/effects.d.ts +6 -25
  12. package/dist/action/effects.js +2 -2
  13. package/dist/action/effects.js.map +1 -1
  14. package/dist/action/index.d.ts +1 -1
  15. package/dist/core/components/badge.d.ts +1 -8
  16. package/dist/core/components/badge.js +2 -3
  17. package/dist/core/components/badge.js.map +1 -1
  18. package/dist/core/components/button.d.ts +4 -12
  19. package/dist/core/components/button.js +6 -9
  20. package/dist/core/components/button.js.map +1 -1
  21. package/dist/core/components/card.d.ts +1 -9
  22. package/dist/core/components/card.js +1 -3
  23. package/dist/core/components/card.js.map +1 -1
  24. package/dist/core/components/confirm-dialog.d.ts +2 -3
  25. package/dist/core/components/confirm-dialog.js +19 -13
  26. package/dist/core/components/confirm-dialog.js.map +1 -1
  27. package/dist/core/components/fragment.d.ts +1 -10
  28. package/dist/core/components/fragment.js +5 -6
  29. package/dist/core/components/fragment.js.map +1 -1
  30. package/dist/core/components/grid.d.ts +1 -8
  31. package/dist/core/components/grid.js +1 -2
  32. package/dist/core/components/grid.js.map +1 -1
  33. package/dist/core/components/heading.d.ts +1 -9
  34. package/dist/core/components/heading.js +2 -3
  35. package/dist/core/components/heading.js.map +1 -1
  36. package/dist/core/components/icon.d.ts +3 -0
  37. package/dist/core/components/icon.js +30 -0
  38. package/dist/core/components/icon.js.map +1 -0
  39. package/dist/core/components/index.d.ts +1 -1
  40. package/dist/core/components/index.js +4 -0
  41. package/dist/core/components/index.js.map +1 -1
  42. package/dist/core/components/link.d.ts +1 -12
  43. package/dist/core/components/link.js +4 -9
  44. package/dist/core/components/link.js.map +1 -1
  45. package/dist/core/components/modal.d.ts +1 -11
  46. package/dist/core/components/modal.js +27 -31
  47. package/dist/core/components/modal.js.map +1 -1
  48. package/dist/core/components/section.d.ts +3 -0
  49. package/dist/core/components/section.js +79 -0
  50. package/dist/core/components/section.js.map +1 -0
  51. package/dist/core/components/segmented-control.d.ts +1 -14
  52. package/dist/core/components/segmented-control.js +4 -7
  53. package/dist/core/components/segmented-control.js.map +1 -1
  54. package/dist/core/components/segmented-pills.d.ts +4 -2
  55. package/dist/core/components/segmented-pills.js +10 -1
  56. package/dist/core/components/segmented-pills.js.map +1 -1
  57. package/dist/core/components/spinner.js +8 -4
  58. package/dist/core/components/spinner.js.map +1 -1
  59. package/dist/core/components/stack.d.ts +1 -11
  60. package/dist/core/components/stack.js +5 -5
  61. package/dist/core/components/stack.js.map +1 -1
  62. package/dist/core/components/tabs.d.ts +1 -19
  63. package/dist/core/components/tabs.js +45 -21
  64. package/dist/core/components/tabs.js.map +1 -1
  65. package/dist/core/components/text.d.ts +1 -9
  66. package/dist/core/components/text.js +2 -3
  67. package/dist/core/components/text.js.map +1 -1
  68. package/dist/core/registry.d.ts +9 -3
  69. package/dist/core/registry.js +21 -5
  70. package/dist/core/registry.js.map +1 -1
  71. package/dist/core/renderer.js +7 -13
  72. package/dist/core/renderer.js.map +1 -1
  73. package/dist/core/types.d.ts +54 -26
  74. package/dist/form/components/base/checkbox.js +5 -2
  75. package/dist/form/components/base/checkbox.js.map +1 -1
  76. package/dist/form/components/base/field.d.ts +2 -1
  77. package/dist/form/components/base/field.js +5 -1
  78. package/dist/form/components/base/field.js.map +1 -1
  79. package/dist/form/components/base/password-input.js +9 -2
  80. package/dist/form/components/base/password-input.js.map +1 -1
  81. package/dist/form/components/base/submit-button.d.ts +4 -4
  82. package/dist/form/components/base/submit-button.js +2 -2
  83. package/dist/form/components/base/submit-button.js.map +1 -1
  84. package/dist/form/components/conditions.d.ts +6 -9
  85. package/dist/form/components/conditions.js +10 -2
  86. package/dist/form/components/conditions.js.map +1 -1
  87. package/dist/form/components/context.d.ts +0 -4
  88. package/dist/form/components/context.js +1 -5
  89. package/dist/form/components/context.js.map +1 -1
  90. package/dist/form/components/field-props.d.ts +24 -0
  91. package/dist/form/components/field-props.js +15 -0
  92. package/dist/form/components/field-props.js.map +1 -0
  93. package/dist/form/components/fields/checkbox.d.ts +1 -15
  94. package/dist/form/components/fields/checkbox.js +16 -21
  95. package/dist/form/components/fields/checkbox.js.map +1 -1
  96. package/dist/form/components/fields/choice.d.ts +1 -13
  97. package/dist/form/components/fields/choice.js +13 -20
  98. package/dist/form/components/fields/choice.js.map +1 -1
  99. package/dist/form/components/fields/date-input.d.ts +1 -19
  100. package/dist/form/components/fields/date-input.js +11 -16
  101. package/dist/form/components/fields/date-input.js.map +1 -1
  102. package/dist/form/components/fields/hidden-input.d.ts +1 -9
  103. package/dist/form/components/fields/hidden-input.js +2 -3
  104. package/dist/form/components/fields/hidden-input.js.map +1 -1
  105. package/dist/form/components/fields/number-input.d.ts +1 -22
  106. package/dist/form/components/fields/number-input.js +38 -41
  107. package/dist/form/components/fields/number-input.js.map +1 -1
  108. package/dist/form/components/fields/password-input.d.ts +1 -28
  109. package/dist/form/components/fields/password-input.js +15 -24
  110. package/dist/form/components/fields/password-input.js.map +1 -1
  111. package/dist/form/components/fields/rich-editor.d.ts +1 -16
  112. package/dist/form/components/fields/rich-editor.js +57 -47
  113. package/dist/form/components/fields/rich-editor.js.map +1 -1
  114. package/dist/form/components/fields/select.d.ts +1 -22
  115. package/dist/form/components/fields/select.js +85 -74
  116. package/dist/form/components/fields/select.js.map +1 -1
  117. package/dist/form/components/fields/simple-field.d.ts +9 -0
  118. package/dist/form/components/fields/simple-field.js +22 -0
  119. package/dist/form/components/fields/simple-field.js.map +1 -0
  120. package/dist/form/components/fields/text-input.d.ts +1 -20
  121. package/dist/form/components/fields/text-input.js +12 -17
  122. package/dist/form/components/fields/text-input.js.map +1 -1
  123. package/dist/form/components/fields/textarea.d.ts +1 -19
  124. package/dist/form/components/fields/textarea.js +11 -16
  125. package/dist/form/components/fields/textarea.js.map +1 -1
  126. package/dist/form/components/form.d.ts +1 -20
  127. package/dist/form/components/form.js +29 -36
  128. package/dist/form/components/form.js.map +1 -1
  129. package/dist/form/components/index.d.ts +0 -1
  130. package/dist/form/components/index.js +1 -2
  131. package/dist/form/components/resolved-nodes.d.ts +1 -1
  132. package/dist/form/components/resolved-nodes.js +2 -2
  133. package/dist/form/components/resolved-nodes.js.map +1 -1
  134. package/dist/form/components/types.d.ts +1 -0
  135. package/dist/form/components/use-controlled-field.d.ts +3 -9
  136. package/dist/form/components/use-controlled-field.js +5 -9
  137. package/dist/form/components/use-controlled-field.js.map +1 -1
  138. package/dist/form/components/use-dependent-field.d.ts +1 -1
  139. package/dist/form/components/use-dependent-field.js +8 -8
  140. package/dist/form/components/use-dependent-field.js.map +1 -1
  141. package/dist/form/components/use-form-resolver.d.ts +1 -1
  142. package/dist/form/components/use-form-resolver.js +8 -13
  143. package/dist/form/components/use-form-resolver.js.map +1 -1
  144. package/dist/form/components/use-seed-default.d.ts +5 -0
  145. package/dist/form/components/use-seed-default.js +23 -0
  146. package/dist/form/components/use-seed-default.js.map +1 -0
  147. package/dist/form/index.d.ts +1 -1
  148. package/dist/form/index.js +0 -1
  149. package/dist/form/index.js.map +1 -1
  150. package/dist/form/skeleton.d.ts +1 -1
  151. package/dist/form/skeleton.js +1 -1
  152. package/dist/form/skeleton.js.map +1 -1
  153. package/dist/i18n/backend.d.ts +24 -0
  154. package/dist/i18n/backend.js +39 -0
  155. package/dist/i18n/backend.js.map +1 -0
  156. package/dist/i18n/index.d.ts +3 -0
  157. package/dist/i18n/index.js +3 -0
  158. package/dist/i18n/instance.js +48 -0
  159. package/dist/i18n/instance.js.map +1 -0
  160. package/dist/icons/icon-renderer.js +30 -5
  161. package/dist/icons/icon-renderer.js.map +1 -1
  162. package/dist/icons/index.d.ts +2 -0
  163. package/dist/icons/index.js +2 -1
  164. package/dist/icons/sprite.d.ts +30 -0
  165. package/dist/icons/sprite.js +40 -0
  166. package/dist/icons/sprite.js.map +1 -0
  167. package/dist/index.d.ts +9 -5
  168. package/dist/index.js +7 -3
  169. package/dist/inertia.d.ts +1 -6
  170. package/dist/inertia.js +4 -8
  171. package/dist/inertia.js.map +1 -1
  172. package/dist/lattice.css +129 -5
  173. package/dist/layout/components.d.ts +1 -0
  174. package/dist/layout/components.js +19 -0
  175. package/dist/layout/components.js.map +1 -0
  176. package/dist/layout/context.d.ts +12 -0
  177. package/dist/layout/context.js +19 -0
  178. package/dist/layout/context.js.map +1 -0
  179. package/dist/layout/index.d.ts +3 -0
  180. package/dist/layout/index.js +4 -0
  181. package/dist/layout/menu-item.d.ts +3 -0
  182. package/dist/layout/menu-item.js +130 -0
  183. package/dist/layout/menu-item.js.map +1 -0
  184. package/dist/layout/menu.d.ts +3 -0
  185. package/dist/layout/menu.js +13 -0
  186. package/dist/layout/menu.js.map +1 -0
  187. package/dist/layout/outlet.d.ts +6 -0
  188. package/dist/layout/outlet.js +14 -0
  189. package/dist/layout/outlet.js.map +1 -0
  190. package/dist/layout/schema-layout.d.ts +10 -0
  191. package/dist/layout/schema-layout.js +30 -0
  192. package/dist/layout/schema-layout.js.map +1 -0
  193. package/dist/layout/sidebar.d.ts +3 -0
  194. package/dist/layout/sidebar.js +48 -0
  195. package/dist/layout/sidebar.js.map +1 -0
  196. package/dist/lib/utils.d.ts +0 -2
  197. package/dist/lib/utils.js +1 -4
  198. package/dist/lib/utils.js.map +1 -1
  199. package/dist/node_modules/i18next/dist/esm/i18next.js +1982 -0
  200. package/dist/node_modules/i18next/dist/esm/i18next.js.map +1 -0
  201. package/dist/node_modules/i18next-http-backend/esm/index.js +352 -0
  202. package/dist/node_modules/i18next-http-backend/esm/index.js.map +1 -0
  203. package/dist/node_modules/react-i18next/dist/es/context.js +23 -0
  204. package/dist/node_modules/react-i18next/dist/es/context.js.map +1 -0
  205. package/dist/node_modules/react-i18next/dist/es/defaults.js +29 -0
  206. package/dist/node_modules/react-i18next/dist/es/defaults.js.map +1 -0
  207. package/dist/node_modules/react-i18next/dist/es/i18nInstance.js +10 -0
  208. package/dist/node_modules/react-i18next/dist/es/i18nInstance.js.map +1 -0
  209. package/dist/node_modules/react-i18next/dist/es/initReactI18next.js +14 -0
  210. package/dist/node_modules/react-i18next/dist/es/initReactI18next.js.map +1 -0
  211. package/dist/node_modules/react-i18next/dist/es/unescape.js +30 -0
  212. package/dist/node_modules/react-i18next/dist/es/unescape.js.map +1 -0
  213. package/dist/node_modules/react-i18next/dist/es/useTranslation.js +157 -0
  214. package/dist/node_modules/react-i18next/dist/es/useTranslation.js.map +1 -0
  215. package/dist/node_modules/react-i18next/dist/es/utils.js +58 -0
  216. package/dist/node_modules/react-i18next/dist/es/utils.js.map +1 -0
  217. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +70 -0
  218. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +1 -0
  219. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +61 -0
  220. package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +1 -0
  221. package/dist/node_modules/use-sync-external-store/shim/index.js +13 -0
  222. package/dist/node_modules/use-sync-external-store/shim/index.js.map +1 -0
  223. package/dist/page.d.ts +1 -1
  224. package/dist/page.js +2 -2
  225. package/dist/page.js.map +1 -1
  226. package/dist/provider.d.ts +8 -3
  227. package/dist/provider.js +17 -9
  228. package/dist/provider.js.map +1 -1
  229. package/dist/registry.d.ts +1 -1
  230. package/dist/registry.js +2 -1
  231. package/dist/registry.js.map +1 -1
  232. package/dist/table/bulk.d.ts +6 -10
  233. package/dist/table/bulk.js +13 -35
  234. package/dist/table/bulk.js.map +1 -1
  235. package/dist/table/column-registry.d.ts +9 -0
  236. package/dist/table/components/bulk-bar.js +34 -3
  237. package/dist/table/components/bulk-bar.js.map +1 -1
  238. package/dist/table/components/cells/badge-cell.d.ts +5 -0
  239. package/dist/table/components/cells/badge-cell.js +16 -0
  240. package/dist/table/components/cells/badge-cell.js.map +1 -0
  241. package/dist/table/components/cells/icon-cell.d.ts +5 -0
  242. package/dist/table/components/cells/icon-cell.js +22 -0
  243. package/dist/table/components/cells/icon-cell.js.map +1 -0
  244. package/dist/table/components/cells/image-cell.d.ts +5 -0
  245. package/dist/table/components/cells/image-cell.js +24 -0
  246. package/dist/table/components/cells/image-cell.js.map +1 -0
  247. package/dist/table/components/cells/text-cell.d.ts +6 -0
  248. package/dist/table/components/cells/text-cell.js +50 -0
  249. package/dist/table/components/cells/text-cell.js.map +1 -0
  250. package/dist/table/components/column-filter-control.js +59 -96
  251. package/dist/table/components/column-filter-control.js.map +1 -1
  252. package/dist/table/components/column-header.js +22 -11
  253. package/dist/table/components/column-header.js.map +1 -1
  254. package/dist/table/components/filter-stack-bar.d.ts +2 -2
  255. package/dist/table/components/filter-stack-bar.js +10 -8
  256. package/dist/table/components/filter-stack-bar.js.map +1 -1
  257. package/dist/table/components/filter-value-input.d.ts +5 -3
  258. package/dist/table/components/filter-value-input.js +25 -16
  259. package/dist/table/components/filter-value-input.js.map +1 -1
  260. package/dist/table/components/pagination.d.ts +1 -1
  261. package/dist/table/components/pagination.js +20 -8
  262. package/dist/table/components/pagination.js.map +1 -1
  263. package/dist/table/components/sort-bar.d.ts +2 -2
  264. package/dist/table/components/sort-bar.js +12 -10
  265. package/dist/table/components/sort-bar.js.map +1 -1
  266. package/dist/table/components/table-action-node.d.ts +1 -1
  267. package/dist/table/components/table-action-node.js +1 -1
  268. package/dist/table/components/table-action-node.js.map +1 -1
  269. package/dist/table/components/table-cell.d.ts +1 -1
  270. package/dist/table/components/table-cell.js +24 -43
  271. package/dist/table/components/table-cell.js.map +1 -1
  272. package/dist/table/components/table.d.ts +6 -2
  273. package/dist/table/components/table.js +40 -17
  274. package/dist/table/components/table.js.map +1 -1
  275. package/dist/table/format.js +5 -3
  276. package/dist/table/format.js.map +1 -1
  277. package/dist/table/index.d.ts +1 -1
  278. package/dist/table/index.js.map +1 -1
  279. package/dist/table/payload.d.ts +1 -1
  280. package/dist/table/query.d.ts +0 -1
  281. package/dist/table/query.js +8 -9
  282. package/dist/table/query.js.map +1 -1
  283. package/dist/table/types.d.ts +38 -42
  284. package/dist/table/use-table.d.ts +3 -4
  285. package/dist/table/use-table.js +12 -23
  286. package/dist/table/use-table.js.map +1 -1
  287. package/dist/test-support.d.ts +14 -0
  288. package/dist/test-support.js +14 -0
  289. package/dist/test-support.js.map +1 -0
  290. package/dist/toast/index.d.ts +1 -0
  291. package/dist/toast/index.js +2 -0
  292. package/dist/toast/toaster.d.ts +3 -0
  293. package/dist/toast/toaster.js +126 -0
  294. package/dist/toast/toaster.js.map +1 -0
  295. package/dist/types/generated.d.ts +677 -0
  296. package/dist/types/generated.js +0 -0
  297. package/dist/types/index.d.ts +1 -1
  298. package/package.json +18 -3
  299. package/resources/icons/align-center.svg +17 -0
  300. package/resources/icons/align-justify.svg +17 -0
  301. package/resources/icons/align-left.svg +17 -0
  302. package/resources/icons/align-right.svg +17 -0
  303. package/resources/icons/arrow-down.svg +16 -0
  304. package/resources/icons/arrow-up.svg +16 -0
  305. package/resources/icons/bold.svg +15 -0
  306. package/resources/icons/check.svg +15 -0
  307. package/resources/icons/chevron-down.svg +15 -0
  308. package/resources/icons/chevron-right.svg +15 -0
  309. package/resources/icons/chevrons-up-down.svg +16 -0
  310. package/resources/icons/circle-alert.svg +17 -0
  311. package/resources/icons/circle-check.svg +16 -0
  312. package/resources/icons/circle-help.svg +17 -0
  313. package/resources/icons/circle-x.svg +17 -0
  314. package/resources/icons/code.svg +16 -0
  315. package/resources/icons/columns-3.svg +17 -0
  316. package/resources/icons/copy.svg +16 -0
  317. package/resources/icons/external-link.svg +17 -0
  318. package/resources/icons/eye-off.svg +18 -0
  319. package/resources/icons/eye.svg +16 -0
  320. package/resources/icons/filter.svg +15 -0
  321. package/resources/icons/heading-1.svg +18 -0
  322. package/resources/icons/heading-2.svg +18 -0
  323. package/resources/icons/heading-3.svg +19 -0
  324. package/resources/icons/highlighter.svg +16 -0
  325. package/resources/icons/info.svg +17 -0
  326. package/resources/icons/italic.svg +17 -0
  327. package/resources/icons/layout-dashboard.svg +18 -0
  328. package/resources/icons/link.svg +16 -0
  329. package/resources/icons/list-ordered.svg +20 -0
  330. package/resources/icons/list.svg +20 -0
  331. package/resources/icons/loader-2.svg +15 -0
  332. package/resources/icons/minus.svg +15 -0
  333. package/resources/icons/more-horizontal.svg +17 -0
  334. package/resources/icons/panel-left.svg +16 -0
  335. package/resources/icons/pencil-line.svg +17 -0
  336. package/resources/icons/pencil.svg +16 -0
  337. package/resources/icons/plus.svg +16 -0
  338. package/resources/icons/quote.svg +16 -0
  339. package/resources/icons/rows-3.svg +17 -0
  340. package/resources/icons/search.svg +16 -0
  341. package/resources/icons/send.svg +16 -0
  342. package/resources/icons/settings.svg +16 -0
  343. package/resources/icons/smile.svg +18 -0
  344. package/resources/icons/strikethrough.svg +17 -0
  345. package/resources/icons/table.svg +18 -0
  346. package/resources/icons/trash-2.svg +19 -0
  347. package/resources/icons/underline.svg +16 -0
  348. package/resources/icons/x.svg +16 -0
  349. package/dist/core/props.d.ts +0 -14
  350. package/dist/core/props.js +0 -30
  351. package/dist/core/props.js.map +0 -1
  352. package/dist/form/components/fields/submit-button.d.ts +0 -10
  353. package/dist/form/components/fields/submit-button.js +0 -14
  354. package/dist/form/components/fields/submit-button.js.map +0 -1
  355. package/dist/generated/types.d.ts +0 -17
  356. package/dist/icons/default-icons.d.ts +0 -3
  357. package/dist/icons/default-icons.js +0 -44
  358. package/dist/icons/default-icons.js.map +0 -1
  359. package/dist/icons/dynamic-lucide-renderer.d.ts +0 -2
  360. package/dist/icons/dynamic-lucide-renderer.js +0 -18
  361. package/dist/icons/dynamic-lucide-renderer.js.map +0 -1
  362. package/dist/menu/index.d.ts +0 -1
  363. package/dist/menu/index.js +0 -2
  364. package/dist/menu/use-menu.d.ts +0 -2
  365. package/dist/menu/use-menu.js +0 -9
  366. package/dist/menu/use-menu.js.map +0 -1
  367. /package/dist/{generated/types.js → table/column-registry.js} +0 -0
@@ -0,0 +1,3 @@
1
+ import { i18n, translate, useT } from "./instance.js";
2
+ import { configureI18n, enableBackend } from "./backend.js";
3
+ export { configureI18n, enableBackend, i18n, translate, useT };
@@ -0,0 +1,48 @@
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";
4
+ //#region resources/js/i18n/instance.ts
5
+ 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);
12
+ var initialization;
13
+ /**
14
+ * Initialize the instance exactly once. The first caller wins — a rendered
15
+ * component (inline English, zero config) or `enableBackend()`, which registers
16
+ * its backend first because i18next can only wire a backend during `init`.
17
+ */
18
+ function ensureI18n(extend) {
19
+ if (!initialization) {
20
+ const base = {
21
+ lng: detectLanguage(),
22
+ fallbackLng: "en",
23
+ ns: [NAMESPACE],
24
+ defaultNS: NAMESPACE,
25
+ interpolation: { escapeValue: false },
26
+ react: { useSuspense: false }
27
+ };
28
+ initialization = i18n.init(extend ? extend(base) : base);
29
+ }
30
+ return initialization;
31
+ }
32
+ /** Translation hook bound to Lattice's instance. The chrome passes `"lattice"`; consumers pass their own namespace. */
33
+ function useT(namespace) {
34
+ ensureI18n();
35
+ return useTranslation(namespace, { i18n });
36
+ }
37
+ /** Translate a key in the given namespace with an inline fallback, outside of a component. */
38
+ function translate(namespace, key, defaultValue, options) {
39
+ ensureI18n();
40
+ return i18n.t(key, defaultValue, {
41
+ ns: namespace,
42
+ ...options
43
+ });
44
+ }
45
+ //#endregion
46
+ export { ensureI18n, i18n, translate, useT };
47
+
48
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +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,8 +1,9 @@
1
- import { renderBundledIcon, renderMissingIcon } from "./default-icons.js";
1
+ import { cn } from "../lib/utils.js";
2
+ import { Icon, useSprite } from "./sprite.js";
2
3
  import { createContext, useContext, useMemo } from "react";
3
- import { jsx } from "react/jsx-runtime";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
4
5
  //#region resources/js/icons/icon-renderer.tsx
5
- var IconRenderersContext = createContext([renderBundledIcon]);
6
+ var IconRenderersContext = createContext([]);
6
7
  function IconRendererProvider({ children, mode = "stack", renderer }) {
7
8
  const parentRenderers = useContext(IconRenderersContext);
8
9
  const renderers = useMemo(() => mode === "replace" ? [renderer] : [renderer, ...parentRenderers], [
@@ -17,6 +18,7 @@ function IconRendererProvider({ children, mode = "stack", renderer }) {
17
18
  }
18
19
  function IconRenderer({ className, icon }) {
19
20
  const renderers = useContext(IconRenderersContext);
21
+ const { ids } = useSprite();
20
22
  for (const renderer of renderers) {
21
23
  const rendered = renderer({
22
24
  className,
@@ -24,9 +26,32 @@ function IconRenderer({ className, icon }) {
24
26
  });
25
27
  if (rendered !== null && rendered !== void 0 && rendered !== false) return rendered;
26
28
  }
27
- return renderMissingIcon({
29
+ if (ids && !ids.includes(icon)) return /* @__PURE__ */ jsx(MissingIcon, { className });
30
+ return /* @__PURE__ */ jsx(Icon, {
28
31
  className,
29
- icon
32
+ name: icon
33
+ });
34
+ }
35
+ function MissingIcon({ className }) {
36
+ return /* @__PURE__ */ jsxs("svg", {
37
+ "aria-hidden": "true",
38
+ className: cn("size-lt-icon-md text-lt-muted-fg", className),
39
+ "data-lattice-missing-icon": "",
40
+ fill: "none",
41
+ stroke: "currentColor",
42
+ strokeLinecap: "round",
43
+ strokeLinejoin: "round",
44
+ strokeWidth: "2",
45
+ viewBox: "0 0 24 24",
46
+ children: [
47
+ /* @__PURE__ */ jsx("circle", {
48
+ cx: "12",
49
+ cy: "12",
50
+ r: "10"
51
+ }),
52
+ /* @__PURE__ */ jsx("path", { d: "M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" }),
53
+ /* @__PURE__ */ jsx("path", { d: "M12 17h.01" })
54
+ ]
30
55
  });
31
56
  }
32
57
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"icon-renderer.js","names":[],"sources":["../../resources/js/icons/icon-renderer.tsx"],"sourcesContent":["import { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { renderBundledIcon, renderMissingIcon } from \"./default-icons\";\n\nexport type IconRendererProps = {\n className?: string;\n icon: string;\n};\n\nexport type IconRendererFunction = (props: IconRendererProps) => ReactNode;\n\ntype IconRendererProviderProps = {\n children: ReactNode;\n mode?: \"replace\" | \"stack\";\n renderer: IconRendererFunction;\n};\n\nconst IconRenderersContext = createContext<IconRendererFunction[]>([renderBundledIcon]);\nconst loggedMissingIcons = new Set<string>();\n\nexport function IconRendererProvider({\n children,\n mode = \"stack\",\n renderer,\n}: IconRendererProviderProps) {\n const parentRenderers = useContext(IconRenderersContext);\n const renderers = useMemo(\n () => (mode === \"replace\" ? [renderer] : [renderer, ...parentRenderers]),\n [mode, parentRenderers, renderer],\n );\n\n return (\n <IconRenderersContext.Provider value={renderers}>{children}</IconRenderersContext.Provider>\n );\n}\n\nexport function IconRenderer({ className, icon }: IconRendererProps) {\n const renderers = useContext(IconRenderersContext);\n\n for (const renderer of renderers) {\n const rendered = renderer({ className, icon });\n\n if (rendered !== null && rendered !== undefined && rendered !== false) {\n return rendered;\n }\n }\n\n logMissingIcon(icon);\n\n return renderMissingIcon({ className, icon });\n}\n\nfunction logMissingIcon(icon: string): void {\n if (!import.meta.env.DEV || loggedMissingIcons.has(icon)) {\n return;\n }\n\n loggedMissingIcons.add(icon);\n console.log(`[Lattice] Missing icon renderer for \"${icon}\".`);\n}\n"],"mappings":";;;;AAiBA,IAAM,uBAAuB,cAAsC,CAAC,iBAAiB,CAAC;AAGtF,SAAgB,qBAAqB,EACnC,UACA,OAAO,SACP,YAC4B;CAC5B,MAAM,kBAAkB,WAAW,oBAAoB;CACvD,MAAM,YAAY,cACT,SAAS,YAAY,CAAC,QAAQ,IAAI,CAAC,UAAU,GAAG,eAAe,GACtE;EAAC;EAAM;EAAiB;CAAQ,CAClC;CAEA,OACE,oBAAC,qBAAqB,UAAtB;EAA+B,OAAO;EAAY;CAAwC,CAAA;AAE9F;AAEA,SAAgB,aAAa,EAAE,WAAW,QAA2B;CACnE,MAAM,YAAY,WAAW,oBAAoB;CAEjD,KAAK,MAAM,YAAY,WAAW;EAChC,MAAM,WAAW,SAAS;GAAE;GAAW;EAAK,CAAC;EAE7C,IAAI,aAAa,QAAQ,aAAa,KAAA,KAAa,aAAa,OAC9D,OAAO;CAEX;CAIA,OAAO,kBAAkB;EAAE;EAAW;CAAK,CAAC;AAC9C"}
1
+ {"version":3,"file":"icon-renderer.js","names":[],"sources":["../../resources/js/icons/icon-renderer.tsx"],"sourcesContent":["import { createContext, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, useSprite } from \"./sprite\";\n\nexport type IconRendererProps = {\n className?: string;\n icon: string;\n};\n\nexport type IconRendererFunction = (props: IconRendererProps) => ReactNode;\n\ntype IconRendererProviderProps = {\n children: ReactNode;\n mode?: \"replace\" | \"stack\";\n renderer: IconRendererFunction;\n};\n\nconst IconRenderersContext = createContext<IconRendererFunction[]>([]);\nconst loggedMissingIcons = new Set<string>();\n\nexport function IconRendererProvider({\n children,\n mode = \"stack\",\n renderer,\n}: IconRendererProviderProps) {\n const parentRenderers = useContext(IconRenderersContext);\n const renderers = useMemo(\n () => (mode === \"replace\" ? [renderer] : [renderer, ...parentRenderers]),\n [mode, parentRenderers, renderer],\n );\n\n return (\n <IconRenderersContext.Provider value={renderers}>{children}</IconRenderersContext.Provider>\n );\n}\n\nexport function IconRenderer({ className, icon }: IconRendererProps) {\n const renderers = useContext(IconRenderersContext);\n const { ids } = useSprite();\n\n // Custom renderers (the override stack) take precedence over the sprite.\n for (const renderer of renderers) {\n const rendered = renderer({ className, icon });\n\n if (rendered !== null && rendered !== undefined && rendered !== false) {\n return rendered;\n }\n }\n\n // When the sprite is wired and the icon is genuinely absent, show a visible\n // marker. When `ids` is unknown (not yet wired), optimistically emit the\n // sprite reference rather than crying wolf.\n if (ids && !ids.includes(icon)) {\n logMissingIcon(icon);\n return <MissingIcon className={className} />;\n }\n\n return <Icon className={className} name={icon} />;\n}\n\nfunction MissingIcon({ className }: { className?: string }) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(\"size-lt-icon-md text-lt-muted-fg\", className)}\n data-lattice-missing-icon=\"\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n}\n\nfunction logMissingIcon(icon: string): void {\n if (!import.meta.env.DEV || loggedMissingIcons.has(icon)) {\n return;\n }\n\n loggedMissingIcons.add(icon);\n console.log(`[Lattice] Missing icon renderer for \"${icon}\".`);\n}\n"],"mappings":";;;;;AAkBA,IAAM,uBAAuB,cAAsC,CAAC,CAAC;AAGrE,SAAgB,qBAAqB,EACnC,UACA,OAAO,SACP,YAC4B;CAC5B,MAAM,kBAAkB,WAAW,oBAAoB;CACvD,MAAM,YAAY,cACT,SAAS,YAAY,CAAC,QAAQ,IAAI,CAAC,UAAU,GAAG,eAAe,GACtE;EAAC;EAAM;EAAiB;CAAQ,CAClC;CAEA,OACE,oBAAC,qBAAqB,UAAtB;EAA+B,OAAO;EAAY;CAAwC,CAAA;AAE9F;AAEA,SAAgB,aAAa,EAAE,WAAW,QAA2B;CACnE,MAAM,YAAY,WAAW,oBAAoB;CACjD,MAAM,EAAE,QAAQ,UAAU;CAG1B,KAAK,MAAM,YAAY,WAAW;EAChC,MAAM,WAAW,SAAS;GAAE;GAAW;EAAK,CAAC;EAE7C,IAAI,aAAa,QAAQ,aAAa,KAAA,KAAa,aAAa,OAC9D,OAAO;CAEX;CAKA,IAAI,OAAO,CAAC,IAAI,SAAS,IAAI,GAE3B,OAAO,oBAAC,aAAD,EAAwB,UAAY,CAAA;CAG7C,OAAO,oBAAC,MAAD;EAAiB;EAAW,MAAM;CAAO,CAAA;AAClD;AAEA,SAAS,YAAY,EAAE,aAAqC;CAC1D,OACE,qBAAC,OAAD;EACE,eAAY;EACZ,WAAW,GAAG,oCAAoC,SAAS;EAC3D,6BAA0B;EAC1B,MAAK;EACL,QAAO;EACP,eAAc;EACd,gBAAe;EACf,aAAY;EACZ,SAAQ;YATV;GAWE,oBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;GAAM,CAAA;GAChC,oBAAC,QAAD,EAAM,GAAE,uCAAwC,CAAA;GAChD,oBAAC,QAAD,EAAM,GAAE,aAAc,CAAA;EACnB;;AAET"}
@@ -1,2 +1,4 @@
1
+ export { Icon, SpriteProvider, useSprite } from './sprite';
2
+ export type { IconName, KnownIcons, SpriteValue } from './sprite';
1
3
  export { IconRenderer, IconRendererProvider } from './icon-renderer';
2
4
  export type { IconRendererFunction, IconRendererProps } from './icon-renderer';
@@ -1,2 +1,3 @@
1
+ import { Icon, SpriteProvider, useSprite } from "./sprite.js";
1
2
  import { IconRenderer, IconRendererProvider } from "./icon-renderer.js";
2
- export { IconRenderer, IconRendererProvider };
3
+ export { Icon, IconRenderer, IconRendererProvider, SpriteProvider, useSprite };
@@ -0,0 +1,30 @@
1
+ import { ReactNode } from 'react';
2
+ export interface KnownIcons {
3
+ }
4
+ export type IconName = keyof KnownIcons | (string & {});
5
+ export type SpriteValue = {
6
+ /** The sprite URL. Empty when the sprite is inlined into the document (dev). */
7
+ href: string;
8
+ /** Every symbol id in the sprite, or undefined when not yet wired/known. */
9
+ ids?: readonly string[];
10
+ /** Inline sprite markup to inject once (dev); empty/omitted in builds. */
11
+ source?: string;
12
+ };
13
+ /**
14
+ * Seeds the icon sprite for everything below it. When `sprite.source` is set
15
+ * (dev), it's injected once so same-document `<use href="#id">` references
16
+ * resolve; in builds `href` points at the emitted sprite asset instead.
17
+ */
18
+ export declare function SpriteProvider({ children, sprite }: {
19
+ children: ReactNode;
20
+ sprite: SpriteValue;
21
+ }): import("react").JSX.Element;
22
+ export declare function useSprite(): SpriteValue;
23
+ /**
24
+ * Renders a single sprite symbol by name. Used for Lattice's own UI chrome and
25
+ * as the resolved default for server-driven icons. Extra `<svg>` props are
26
+ * forwarded, so callers can override `aria-hidden`, set a `role`, etc.
27
+ */
28
+ export declare function Icon({ className, name, ...props }: {
29
+ name: IconName;
30
+ } & React.ComponentProps<"svg">): import("react").JSX.Element;
@@ -0,0 +1,40 @@
1
+ import { cn } from "../lib/utils.js";
2
+ import { createContext, useContext } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ //#region resources/js/icons/sprite.tsx
5
+ var SpriteContext = createContext({ href: "" });
6
+ /**
7
+ * Seeds the icon sprite for everything below it. When `sprite.source` is set
8
+ * (dev), it's injected once so same-document `<use href="#id">` references
9
+ * resolve; in builds `href` points at the emitted sprite asset instead.
10
+ */
11
+ function SpriteProvider({ children, sprite }) {
12
+ return /* @__PURE__ */ jsxs(SpriteContext.Provider, {
13
+ value: sprite,
14
+ children: [sprite.source ? /* @__PURE__ */ jsx("div", {
15
+ hidden: true,
16
+ dangerouslySetInnerHTML: { __html: sprite.source }
17
+ }) : null, children]
18
+ });
19
+ }
20
+ function useSprite() {
21
+ return useContext(SpriteContext);
22
+ }
23
+ /**
24
+ * Renders a single sprite symbol by name. Used for Lattice's own UI chrome and
25
+ * as the resolved default for server-driven icons. Extra `<svg>` props are
26
+ * forwarded, so callers can override `aria-hidden`, set a `role`, etc.
27
+ */
28
+ function Icon({ className, name, ...props }) {
29
+ const { href, ids } = useSprite();
30
+ return /* @__PURE__ */ jsx("svg", {
31
+ "aria-hidden": "true",
32
+ ...props,
33
+ className: cn("size-lt-icon-md", className),
34
+ children: /* @__PURE__ */ jsx("use", { href: `${href}#${name}` })
35
+ });
36
+ }
37
+ //#endregion
38
+ export { Icon, SpriteProvider, useSprite };
39
+
40
+ //# sourceMappingURL=sprite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprite.js","names":[],"sources":["../../resources/js/icons/sprite.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\n\n// Augmentable registry of icon names. The sprite plugin can generate a\n// `declare module \"@lattice-php/lattice\" { interface KnownIcons { … } }` block\n// from the built sprite, which turns `IconName` into the real set for\n// autocomplete. Unaugmented it falls back to `string`, so any name still works.\nexport interface KnownIcons {}\nexport type IconName = keyof KnownIcons | (string & {});\n\nexport type SpriteValue = {\n /** The sprite URL. Empty when the sprite is inlined into the document (dev). */\n href: string;\n /** Every symbol id in the sprite, or undefined when not yet wired/known. */\n ids?: readonly string[];\n /** Inline sprite markup to inject once (dev); empty/omitted in builds. */\n source?: string;\n};\n\nconst SpriteContext = createContext<SpriteValue>({ href: \"\" });\n\n/**\n * Seeds the icon sprite for everything below it. When `sprite.source` is set\n * (dev), it's injected once so same-document `<use href=\"#id\">` references\n * resolve; in builds `href` points at the emitted sprite asset instead.\n */\nexport function SpriteProvider({ children, sprite }: { children: ReactNode; sprite: SpriteValue }) {\n return (\n <SpriteContext.Provider value={sprite}>\n {sprite.source ? <div hidden dangerouslySetInnerHTML={{ __html: sprite.source }} /> : null}\n {children}\n </SpriteContext.Provider>\n );\n}\n\nexport function useSprite(): SpriteValue {\n return useContext(SpriteContext);\n}\n\nconst warnedIcons = new Set<string>();\n\n/**\n * Renders a single sprite symbol by name. Used for Lattice's own UI chrome and\n * as the resolved default for server-driven icons. Extra `<svg>` props are\n * forwarded, so callers can override `aria-hidden`, set a `role`, etc.\n */\nexport function Icon({\n className,\n name,\n ...props\n}: { name: IconName } & React.ComponentProps<\"svg\">) {\n const { href, ids } = useSprite();\n\n if (import.meta.env.DEV && ids && !ids.includes(name) && !warnedIcons.has(name)) {\n warnedIcons.add(name);\n console.warn(`[Lattice] Icon \"${name}\" is not in the sprite.`);\n }\n\n return (\n <svg aria-hidden=\"true\" {...props} className={cn(\"size-lt-icon-md\", className)}>\n <use href={`${href}#${name}`} />\n </svg>\n );\n}\n"],"mappings":";;;;AAoBA,IAAM,gBAAgB,cAA2B,EAAE,MAAM,GAAG,CAAC;;;;;;AAO7D,SAAgB,eAAe,EAAE,UAAU,UAAwD;CACjG,OACE,qBAAC,cAAc,UAAf;EAAwB,OAAO;YAA/B,CACG,OAAO,SAAS,oBAAC,OAAD;GAAK,QAAA;GAAO,yBAAyB,EAAE,QAAQ,OAAO,OAAO;EAAI,CAAA,IAAI,MACrF,QACqB;;AAE5B;AAEA,SAAgB,YAAyB;CACvC,OAAO,WAAW,aAAa;AACjC;;;;;;AASA,SAAgB,KAAK,EACnB,WACA,MACA,GAAG,SACgD;CACnD,MAAM,EAAE,MAAM,QAAQ,UAAU;CAOhC,OACE,oBAAC,OAAD;EAAK,eAAY;EAAO,GAAI;EAAO,WAAW,GAAG,mBAAmB,SAAS;YAC3E,oBAAC,OAAD,EAAK,MAAM,GAAG,KAAK,GAAG,OAAS,CAAA;CAC5B,CAAA;AAET"}
package/dist/index.d.ts CHANGED
@@ -3,20 +3,24 @@ export { dispatchActionEffects, dispatchActionError, getActionEffects, isActionE
3
3
  export { initializeTheme, useAppearance } from './appearance';
4
4
  export { copyToClipboard, useClipboard } from './clipboard';
5
5
  export { EventBridge } from './events/event-bridge';
6
- export { IconRenderer, IconRendererProvider } from './icons';
6
+ export { Icon, IconRenderer, IconRendererProvider, SpriteProvider } from './icons';
7
7
  export { createLayoutResolver, createPageResolver, pageComponentName } from './inertia';
8
- export { useMenu } from './menu';
9
- export { Provider, useRegistry } from './provider';
8
+ export { layoutComponents, OutletContext, SchemaLayout } from './layout';
9
+ export { Provider, useColumnRegistry, useRegistry } from './provider';
10
+ export { Toaster } from './toast';
10
11
  export { createPlugin, createRegistry, eagerComponent, extendRegistry, lazyComponent, } from './core/registry';
12
+ export type { Plugin, Registry } from './core/registry';
11
13
  export { Renderer } from './core/renderer';
12
14
  export { LATTICE_REF_HEADER, withRefHeader } from './core/component-ref';
13
15
  export { LATTICE_EVENT } from './events/event-names';
14
16
  export type { ButtonVariant } from './core/components/button';
15
17
  export type { ReloadComponentEvent } from './events/event-names';
16
- export type { ComponentProps, ComponentType, KnownPageContainer, MenuGroup, MenuItem, MenuPayload, Node, NodeProps, PageContainer, PageBreadcrumb, PagePayload, RendererComponent, RendererComponentModule, RendererComponentProps, UnknownComponent, } from './core/types';
18
+ export type { ComponentProps, KnownPageContainer, LayoutPayload, Node, NodeOfType, NodeProps, NodeType, PageContainer, PageBreadcrumb, PagePayload, PropsOf, RendererComponent, RendererComponentModule, RendererComponentProps, Schema, UnknownComponent, WireNode, } from './core/types';
19
+ export type { ColumnCellArgs, ColumnCellComponent, ColumnRegistry } from './table/column-registry';
20
+ export type { ColumnProps, ColumnPropsOf } from './table/types';
17
21
  export type { Method } from '@inertiajs/core';
18
22
  export type { ActionEffect } from './action/effects';
19
23
  export type { ResolvedAppearance, UseAppearanceReturn } from './appearance';
20
24
  export type { CopiedValue, CopyFn, UseClipboardReturn } from './clipboard';
21
25
  export type { Appearance, ToastMessage, ToastVariant } from './events/event-bridge';
22
- export type { IconRendererFunction, IconRendererProps } from './icons';
26
+ export type { IconName, IconRendererFunction, IconRendererProps, KnownIcons, SpriteValue, } from './icons';
package/dist/index.js CHANGED
@@ -1,14 +1,18 @@
1
1
  import { createPlugin, createRegistry, eagerComponent, extendRegistry, lazyComponent } from "./core/registry.js";
2
2
  import { LATTICE_REF_HEADER, withRefHeader } from "./core/component-ref.js";
3
+ import { Icon, SpriteProvider } from "./icons/sprite.js";
3
4
  import { IconRenderer, IconRendererProvider } from "./icons/icon-renderer.js";
4
5
  import { LATTICE_EVENT } from "./events/event-names.js";
5
6
  import { dispatchActionEffects, dispatchActionError, getActionEffects, isActionEffect } from "./action/effects.js";
6
7
  import { Renderer } from "./core/renderer.js";
8
+ import { OutletContext } from "./layout/context.js";
9
+ import { layoutComponents } from "./layout/components.js";
7
10
  import { registry } from "./registry.js";
8
11
  import { initializeTheme, useAppearance } from "./appearance/index.js";
9
12
  import { copyToClipboard, useClipboard } from "./clipboard/index.js";
10
13
  import { EventBridge } from "./events/event-bridge.js";
11
- import { Provider, useRegistry } from "./provider.js";
14
+ import { Toaster } from "./toast/toaster.js";
15
+ import { Provider, useColumnRegistry, useRegistry } from "./provider.js";
16
+ import SchemaLayout from "./layout/schema-layout.js";
12
17
  import { createLayoutResolver, createPageResolver, pageComponentName } from "./inertia.js";
13
- import { useMenu } from "./menu/use-menu.js";
14
- export { EventBridge, IconRenderer, IconRendererProvider, LATTICE_EVENT, LATTICE_REF_HEADER, Provider, Renderer, copyToClipboard, createLayoutResolver, createPageResolver, createPlugin, createRegistry, dispatchActionEffects, dispatchActionError, eagerComponent, extendRegistry, getActionEffects, initializeTheme, isActionEffect, lazyComponent, pageComponentName, registry, useAppearance, useClipboard, useMenu, useRegistry, withRefHeader };
18
+ export { EventBridge, Icon, IconRenderer, IconRendererProvider, LATTICE_EVENT, LATTICE_REF_HEADER, OutletContext, Provider, Renderer, SchemaLayout, SpriteProvider, Toaster, copyToClipboard, createLayoutResolver, createPageResolver, createPlugin, createRegistry, dispatchActionEffects, dispatchActionError, eagerComponent, extendRegistry, getActionEffects, initializeTheme, isActionEffect, layoutComponents, lazyComponent, pageComponentName, registry, useAppearance, useClipboard, useColumnRegistry, useRegistry, withRefHeader };
package/dist/inertia.d.ts CHANGED
@@ -5,13 +5,8 @@ export type ResolvedPage = ResolvedComponent | Promise<ResolvedComponent> | {
5
5
  default: ResolvedComponent;
6
6
  };
7
7
  export type PageModules = Record<string, () => Promise<ResolvedComponent>>;
8
- export type Layouts = {
9
- app: unknown;
10
- auth: unknown;
11
- };
12
8
  export type CreateLayoutResolverOptions = {
13
9
  defaultLayout?: (name: string, page: InertiaPage) => unknown;
14
- layouts: Layouts;
15
10
  };
16
11
  export declare function createPageResolver(pages: PageModules): (name: string) => ResolvedPage;
17
- export declare function createLayoutResolver({ defaultLayout, layouts }: CreateLayoutResolverOptions): (name: string, page: InertiaPage) => unknown;
12
+ export declare function createLayoutResolver({ defaultLayout }?: CreateLayoutResolverOptions): (name: string, page: InertiaPage) => unknown;
package/dist/inertia.js CHANGED
@@ -1,3 +1,4 @@
1
+ import SchemaLayout from "./layout/schema-layout.js";
1
2
  import Page from "./page.js";
2
3
  //#region resources/js/inertia.ts
3
4
  var pageComponentName = "lattice/page";
@@ -9,15 +10,10 @@ function createPageResolver(pages) {
9
10
  throw new Error(`Page not found: ${name}`);
10
11
  };
11
12
  }
12
- function createLayoutResolver({ defaultLayout, layouts }) {
13
+ function createLayoutResolver({ defaultLayout } = {}) {
13
14
  return (name, page) => {
14
- if (name === "lattice/page") {
15
- const lattice = page.props.lattice;
16
- if (lattice?.layout === "app") return [layouts.app, { breadcrumbs: lattice.breadcrumbs }];
17
- if (lattice?.layout === "auth") return layouts.auth;
18
- return null;
19
- }
20
- return defaultLayout?.(name, page) ?? layouts.app;
15
+ if (name === "lattice/page") return page.props.lattice?.layout ? SchemaLayout : null;
16
+ return defaultLayout?.(name, page) ?? null;
21
17
  };
22
18
  }
23
19
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"inertia.js","names":[],"sources":["../resources/js/inertia.ts"],"sourcesContent":["import type { Page as InertiaPage } from \"@inertiajs/core\";\nimport type { ResolvedComponent } from \"@inertiajs/react\";\nimport Page from \"./page\";\nimport type { PagePayload } from \"./core/types\";\n\nexport const pageComponentName = \"lattice/page\";\n\nexport type ResolvedPage =\n | ResolvedComponent\n | Promise<ResolvedComponent>\n | { default: ResolvedComponent };\nexport type PageModules = Record<string, () => Promise<ResolvedComponent>>;\n\nexport type Layouts = {\n app: unknown;\n auth: unknown;\n};\n\nexport type CreateLayoutResolverOptions = {\n defaultLayout?: (name: string, page: InertiaPage) => unknown;\n layouts: Layouts;\n};\n\nexport function createPageResolver(pages: PageModules) {\n return (name: string): ResolvedPage => {\n if (name === pageComponentName) {\n return { default: Page };\n }\n\n const resolvedPage = pages[`./pages/${name}.tsx`];\n\n if (resolvedPage) {\n return resolvedPage();\n }\n\n throw new Error(`Page not found: ${name}`);\n };\n}\n\nexport function createLayoutResolver({ defaultLayout, layouts }: CreateLayoutResolverOptions) {\n return (name: string, page: InertiaPage): unknown => {\n if (name === pageComponentName) {\n const lattice = page.props.lattice as PagePayload | undefined;\n\n if (lattice?.layout === \"app\") {\n return [layouts.app, { breadcrumbs: lattice.breadcrumbs }];\n }\n\n if (lattice?.layout === \"auth\") {\n return layouts.auth;\n }\n\n return null;\n }\n\n return defaultLayout?.(name, page) ?? layouts.app;\n };\n}\n"],"mappings":";;AAKA,IAAa,oBAAoB;AAkBjC,SAAgB,mBAAmB,OAAoB;CACrD,QAAQ,SAA+B;EACrC,IAAI,SAAA,gBACF,OAAO,EAAE,SAAS,KAAK;EAGzB,MAAM,eAAe,MAAM,WAAW,KAAK;EAE3C,IAAI,cACF,OAAO,aAAa;EAGtB,MAAM,IAAI,MAAM,mBAAmB,MAAM;CAC3C;AACF;AAEA,SAAgB,qBAAqB,EAAE,eAAe,WAAwC;CAC5F,QAAQ,MAAc,SAA+B;EACnD,IAAI,SAAA,gBAA4B;GAC9B,MAAM,UAAU,KAAK,MAAM;GAE3B,IAAI,SAAS,WAAW,OACtB,OAAO,CAAC,QAAQ,KAAK,EAAE,aAAa,QAAQ,YAAY,CAAC;GAG3D,IAAI,SAAS,WAAW,QACtB,OAAO,QAAQ;GAGjB,OAAO;EACT;EAEA,OAAO,gBAAgB,MAAM,IAAI,KAAK,QAAQ;CAChD;AACF"}
1
+ {"version":3,"file":"inertia.js","names":[],"sources":["../resources/js/inertia.ts"],"sourcesContent":["import type { Page as InertiaPage } from \"@inertiajs/core\";\nimport type { ResolvedComponent } from \"@inertiajs/react\";\nimport { SchemaLayout } from \"./layout\";\nimport Page from \"./page\";\nimport type { PagePayload } from \"./core/types\";\n\nexport const pageComponentName = \"lattice/page\";\n\nexport type ResolvedPage =\n | ResolvedComponent\n | Promise<ResolvedComponent>\n | { default: ResolvedComponent };\nexport type PageModules = Record<string, () => Promise<ResolvedComponent>>;\n\nexport type CreateLayoutResolverOptions = {\n defaultLayout?: (name: string, page: InertiaPage) => unknown;\n};\n\nexport function createPageResolver(pages: PageModules) {\n return (name: string): ResolvedPage => {\n if (name === pageComponentName) {\n return { default: Page };\n }\n\n const resolvedPage = pages[`./pages/${name}.tsx`];\n\n if (resolvedPage) {\n return resolvedPage();\n }\n\n throw new Error(`Page not found: ${name}`);\n };\n}\n\nexport function createLayoutResolver({ defaultLayout }: CreateLayoutResolverOptions = {}) {\n return (name: string, page: InertiaPage): unknown => {\n if (name === pageComponentName) {\n const lattice = page.props.lattice as PagePayload | undefined;\n\n return lattice?.layout ? SchemaLayout : null;\n }\n\n return defaultLayout?.(name, page) ?? null;\n };\n}\n"],"mappings":";;;AAMA,IAAa,oBAAoB;AAYjC,SAAgB,mBAAmB,OAAoB;CACrD,QAAQ,SAA+B;EACrC,IAAI,SAAA,gBACF,OAAO,EAAE,SAAS,KAAK;EAGzB,MAAM,eAAe,MAAM,WAAW,KAAK;EAE3C,IAAI,cACF,OAAO,aAAa;EAGtB,MAAM,IAAI,MAAM,mBAAmB,MAAM;CAC3C;AACF;AAEA,SAAgB,qBAAqB,EAAE,kBAA+C,CAAC,GAAG;CACxF,QAAQ,MAAc,SAA+B;EACnD,IAAI,SAAA,gBAGF,OAFgB,KAAK,MAAM,SAEX,SAAS,eAAe;EAG1C,OAAO,gBAAgB,MAAM,IAAI,KAAK;CACxC;AACF"}
package/dist/lattice.css CHANGED
@@ -1,8 +1,3 @@
1
- /*
2
- * Register Lattice's component sources with Tailwind. Consumers import this
3
- * stylesheet from the Composer-installed package, so the path resolves into
4
- * vendor and Tailwind generates the utilities the components use.
5
- */
6
1
  @source "./**/*.js";
7
2
 
8
3
  :root,
@@ -26,10 +21,21 @@
26
21
  --lt-border: var(--border, oklch(0.922 0 0));
27
22
  --lt-input: var(--input, oklch(0.922 0 0));
28
23
  --lt-ring: var(--ring, oklch(0.87 0 0));
24
+ --lt-warning: var(--warning, oklch(0.852 0.156 91));
25
+ --lt-success: var(--success, oklch(0.596 0.145 163));
26
+ --lt-success-fg: var(--success-foreground, oklch(0.985 0 0));
27
+ --lt-info: var(--info, oklch(0.588 0.158 241));
28
+ --lt-info-fg: var(--info-foreground, oklch(0.985 0 0));
29
29
  --lt-radius: var(--radius, 0.625rem);
30
30
  --lt-radius-sm: calc(var(--lt-radius) - 2px);
31
31
  --lt-radius-xs: calc(var(--lt-radius) - 4px);
32
32
 
33
+ --lt-icon-xs: 0.75rem;
34
+ --lt-icon-sm: 0.875rem;
35
+ --lt-icon-md: 1rem;
36
+ --lt-icon-lg: 1.25rem;
37
+ --lt-icon-xl: 1.5rem;
38
+
33
39
  color-scheme: light;
34
40
  }
35
41
 
@@ -54,6 +60,11 @@
54
60
  --lt-border: var(--border, oklch(0.269 0 0));
55
61
  --lt-input: var(--input, oklch(0.269 0 0));
56
62
  --lt-ring: var(--ring, oklch(0.439 0 0));
63
+ --lt-warning: var(--warning, oklch(0.68 0.14 75));
64
+ --lt-success: var(--success, oklch(0.696 0.17 162));
65
+ --lt-success-fg: var(--success-foreground, oklch(0.205 0 0));
66
+ --lt-info: var(--info, oklch(0.685 0.15 238));
67
+ --lt-info-fg: var(--info-foreground, oklch(0.205 0 0));
57
68
 
58
69
  color-scheme: dark;
59
70
  }
@@ -78,9 +89,122 @@
78
89
  --color-lt-border: var(--lt-border);
79
90
  --color-lt-input: var(--lt-input);
80
91
  --color-lt-ring: var(--lt-ring);
92
+ --color-lt-warning: var(--lt-warning);
93
+ --color-lt-success: var(--lt-success);
94
+ --color-lt-success-fg: var(--lt-success-fg);
95
+ --color-lt-info: var(--lt-info);
96
+ --color-lt-info-fg: var(--lt-info-fg);
81
97
  --radius-lt: var(--lt-radius);
82
98
  --radius-lt-sm: var(--lt-radius-sm);
83
99
  --radius-lt-xs: var(--lt-radius-xs);
100
+ --spacing-lt-icon-xs: var(--lt-icon-xs);
101
+ --spacing-lt-icon-sm: var(--lt-icon-sm);
102
+ --spacing-lt-icon-md: var(--lt-icon-md);
103
+ --spacing-lt-icon-lg: var(--lt-icon-lg);
104
+ --spacing-lt-icon-xl: var(--lt-icon-xl);
105
+ --animate-lt-toast-in: lt-toast-in 160ms ease-out;
106
+ --animate-lt-toast-out: lt-toast-out 120ms ease-in;
107
+ }
108
+
109
+ @keyframes lt-toast-in {
110
+ from {
111
+ opacity: 0;
112
+ transform: translateY(0.75rem);
113
+ }
114
+ to {
115
+ opacity: 1;
116
+ transform: translateY(0);
117
+ }
118
+ }
119
+
120
+ @keyframes lt-toast-out {
121
+ from {
122
+ opacity: 1;
123
+ transform: translateY(0);
124
+ }
125
+ to {
126
+ opacity: 0;
127
+ transform: translateY(0.75rem);
128
+ }
129
+ }
130
+
131
+ /*
132
+ * Status colours for Badge and Icon table cells. Each tone sets a soft
133
+ * background and a readable foreground in oklch; the `.dark` block swaps them.
134
+ * Defined here (not as utility strings in the renderer) so the palette lives
135
+ * with the theme and can be overridden, and so the cells can pick a tone by
136
+ * name without Tailwind needing to see every class. Gray follows the muted token.
137
+ */
138
+ .lt-cell-badge {
139
+ display: inline-flex;
140
+ align-items: center;
141
+ gap: 0.25rem;
142
+ border-radius: var(--lt-radius-sm);
143
+ padding: 0.125rem 0.5rem;
144
+ font-size: 0.75rem;
145
+ line-height: 1rem;
146
+ font-weight: 500;
147
+ background-color: var(--lt-cell-bg, var(--lt-muted));
148
+ color: var(--lt-cell-fg, var(--lt-muted-fg));
149
+ }
150
+
151
+ .lt-cell-icon {
152
+ display: inline-flex;
153
+ color: var(--lt-cell-fg, var(--lt-fg));
154
+ }
155
+
156
+ .lt-cell-tone-gray {
157
+ --lt-cell-bg: var(--lt-muted);
158
+ --lt-cell-fg: var(--lt-muted-fg);
159
+ }
160
+ .lt-cell-tone-red {
161
+ --lt-cell-bg: oklch(0.94 0.03 25);
162
+ --lt-cell-fg: oklch(0.51 0.19 27);
163
+ }
164
+ .lt-cell-tone-orange {
165
+ --lt-cell-bg: oklch(0.95 0.04 65);
166
+ --lt-cell-fg: oklch(0.55 0.14 55);
167
+ }
168
+ .lt-cell-tone-yellow {
169
+ --lt-cell-bg: oklch(0.96 0.05 100);
170
+ --lt-cell-fg: oklch(0.52 0.1 85);
171
+ }
172
+ .lt-cell-tone-green {
173
+ --lt-cell-bg: oklch(0.95 0.05 155);
174
+ --lt-cell-fg: oklch(0.52 0.13 152);
175
+ }
176
+ .lt-cell-tone-blue {
177
+ --lt-cell-bg: oklch(0.95 0.03 245);
178
+ --lt-cell-fg: oklch(0.54 0.17 252);
179
+ }
180
+ .lt-cell-tone-purple {
181
+ --lt-cell-bg: oklch(0.95 0.03 305);
182
+ --lt-cell-fg: oklch(0.53 0.19 305);
183
+ }
184
+
185
+ .dark .lt-cell-tone-red {
186
+ --lt-cell-bg: oklch(0.29 0.08 27);
187
+ --lt-cell-fg: oklch(0.83 0.11 27);
188
+ }
189
+ .dark .lt-cell-tone-orange {
190
+ --lt-cell-bg: oklch(0.3 0.07 65);
191
+ --lt-cell-fg: oklch(0.84 0.1 65);
192
+ }
193
+ .dark .lt-cell-tone-yellow {
194
+ --lt-cell-bg: oklch(0.31 0.06 100);
195
+ --lt-cell-fg: oklch(0.87 0.11 100);
196
+ }
197
+ .dark .lt-cell-tone-green {
198
+ --lt-cell-bg: oklch(0.3 0.07 155);
199
+ --lt-cell-fg: oklch(0.85 0.13 155);
200
+ }
201
+ .dark .lt-cell-tone-blue {
202
+ --lt-cell-bg: oklch(0.3 0.07 245);
203
+ --lt-cell-fg: oklch(0.84 0.11 250);
204
+ }
205
+ .dark .lt-cell-tone-purple {
206
+ --lt-cell-bg: oklch(0.3 0.07 305);
207
+ --lt-cell-fg: oklch(0.85 0.11 305);
84
208
  }
85
209
 
86
210
  /*
@@ -0,0 +1 @@
1
+ export declare const layoutComponents: import('../core/registry').Plugin;
@@ -0,0 +1,19 @@
1
+ import { createPlugin, eagerComponent } from "../core/registry.js";
2
+ import MenuComponent from "./menu.js";
3
+ import MenuItemComponent from "./menu-item.js";
4
+ import OutletComponent from "./outlet.js";
5
+ import SidebarComponent from "./sidebar.js";
6
+ //#region resources/js/layout/components.ts
7
+ var layoutComponents = createPlugin({
8
+ components: {
9
+ menu: eagerComponent(MenuComponent),
10
+ "menu-item": eagerComponent(MenuItemComponent),
11
+ outlet: eagerComponent(OutletComponent),
12
+ sidebar: eagerComponent(SidebarComponent)
13
+ },
14
+ name: "lattice/layout"
15
+ });
16
+ //#endregion
17
+ export { layoutComponents };
18
+
19
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","names":[],"sources":["../../resources/js/layout/components.ts"],"sourcesContent":["import { createPlugin, eagerComponent } from \"@lattice/lattice/core/registry\";\nimport MenuComponent from \"./menu\";\nimport MenuItemComponent from \"./menu-item\";\nimport OutletComponent from \"./outlet\";\nimport SidebarComponent from \"./sidebar\";\n\nexport const layoutComponents = createPlugin({\n components: {\n menu: eagerComponent(MenuComponent),\n \"menu-item\": eagerComponent(MenuItemComponent),\n outlet: eagerComponent(OutletComponent),\n sidebar: eagerComponent(SidebarComponent),\n },\n name: \"lattice/layout\",\n});\n"],"mappings":";;;;;;AAMA,IAAa,mBAAmB,aAAa;CAC3C,YAAY;EACV,MAAM,eAAe,aAAa;EAClC,aAAa,eAAe,iBAAiB;EAC7C,QAAQ,eAAe,eAAe;EACtC,SAAS,eAAe,gBAAgB;CAC1C;CACA,MAAM;AACR,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { ReactNode } from 'react';
2
+ /**
3
+ * Carries the active page element down through a server-composed layout schema
4
+ * so the Outlet component can render it wherever the layout places it.
5
+ */
6
+ export declare const OutletContext: import('react').Context<ReactNode>;
7
+ /**
8
+ * Whether the enclosing Sidebar is collapsed to its icon rail. Menu items read
9
+ * this to render icon-only and surface their submenu as a flyout instead.
10
+ */
11
+ export declare const SidebarCollapsedContext: import('react').Context<boolean>;
12
+ export declare function useSidebarCollapsed(): boolean;
@@ -0,0 +1,19 @@
1
+ import { createContext, useContext } from "react";
2
+ //#region resources/js/layout/context.ts
3
+ /**
4
+ * Carries the active page element down through a server-composed layout schema
5
+ * so the Outlet component can render it wherever the layout places it.
6
+ */
7
+ var OutletContext = createContext(null);
8
+ /**
9
+ * Whether the enclosing Sidebar is collapsed to its icon rail. Menu items read
10
+ * this to render icon-only and surface their submenu as a flyout instead.
11
+ */
12
+ var SidebarCollapsedContext = createContext(false);
13
+ function useSidebarCollapsed() {
14
+ return useContext(SidebarCollapsedContext);
15
+ }
16
+ //#endregion
17
+ export { OutletContext, SidebarCollapsedContext, useSidebarCollapsed };
18
+
19
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../resources/js/layout/context.ts"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ReactNode } from \"react\";\n\n/**\n * Carries the active page element down through a server-composed layout schema\n * so the Outlet component can render it wherever the layout places it.\n */\nexport const OutletContext = createContext<ReactNode>(null);\n\n/**\n * Whether the enclosing Sidebar is collapsed to its icon rail. Menu items read\n * this to render icon-only and surface their submenu as a flyout instead.\n */\nexport const SidebarCollapsedContext = createContext(false);\n\nexport function useSidebarCollapsed(): boolean {\n return useContext(SidebarCollapsedContext);\n}\n"],"mappings":";;;;;;AAOA,IAAa,gBAAgB,cAAyB,IAAI;;;;;AAM1D,IAAa,0BAA0B,cAAc,KAAK;AAE1D,SAAgB,sBAA+B;CAC7C,OAAO,WAAW,uBAAuB;AAC3C"}
@@ -0,0 +1,3 @@
1
+ export { layoutComponents } from './components';
2
+ export { OutletContext } from './context';
3
+ export { default as SchemaLayout } from './schema-layout';
@@ -0,0 +1,4 @@
1
+ import { OutletContext } from "./context.js";
2
+ import { layoutComponents } from "./components.js";
3
+ import SchemaLayout from "./schema-layout.js";
4
+ export { OutletContext, SchemaLayout, layoutComponents };
@@ -0,0 +1,3 @@
1
+ import { RendererComponent } from '../core/types';
2
+ declare const MenuItemComponent: RendererComponent<"menu-item">;
3
+ export default MenuItemComponent;