@lattice-php/lattice 0.1.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 (277) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +39 -0
  3. package/dist/action/components/action-group.d.ts +10 -0
  4. package/dist/action/components/action-group.js +79 -0
  5. package/dist/action/components/action-group.js.map +1 -0
  6. package/dist/action/components/action.d.ts +26 -0
  7. package/dist/action/components/action.js +87 -0
  8. package/dist/action/components/action.js.map +1 -0
  9. package/dist/action/effects.d.ts +30 -0
  10. package/dist/action/effects.js +44 -0
  11. package/dist/action/effects.js.map +1 -0
  12. package/dist/action/index.d.ts +1 -0
  13. package/dist/action/index.js +15 -0
  14. package/dist/action/index.js.map +1 -0
  15. package/dist/appearance/index.d.ts +9 -0
  16. package/dist/appearance/index.js +66 -0
  17. package/dist/appearance/index.js.map +1 -0
  18. package/dist/clipboard/index.d.ts +5 -0
  19. package/dist/clipboard/index.js +24 -0
  20. package/dist/clipboard/index.js.map +1 -0
  21. package/dist/core/component-ref.d.ts +8 -0
  22. package/dist/core/component-ref.js +15 -0
  23. package/dist/core/component-ref.js.map +1 -0
  24. package/dist/core/components/badge.d.ts +19 -0
  25. package/dist/core/components/badge.js +32 -0
  26. package/dist/core/components/badge.js.map +1 -0
  27. package/dist/core/components/button.d.ts +23 -0
  28. package/dist/core/components/button.js +68 -0
  29. package/dist/core/components/button.js.map +1 -0
  30. package/dist/core/components/card.d.ts +19 -0
  31. package/dist/core/components/card.js +62 -0
  32. package/dist/core/components/card.js.map +1 -0
  33. package/dist/core/components/confirm-dialog.d.ts +13 -0
  34. package/dist/core/components/confirm-dialog.js +47 -0
  35. package/dist/core/components/confirm-dialog.js.map +1 -0
  36. package/dist/core/components/fragment.d.ts +12 -0
  37. package/dist/core/components/fragment.js +62 -0
  38. package/dist/core/components/fragment.js.map +1 -0
  39. package/dist/core/components/grid.d.ts +10 -0
  40. package/dist/core/components/grid.js +16 -0
  41. package/dist/core/components/grid.js.map +1 -0
  42. package/dist/core/components/heading.d.ts +11 -0
  43. package/dist/core/components/heading.js +39 -0
  44. package/dist/core/components/heading.js.map +1 -0
  45. package/dist/core/components/index.d.ts +1 -0
  46. package/dist/core/components/index.js +36 -0
  47. package/dist/core/components/index.js.map +1 -0
  48. package/dist/core/components/link.d.ts +18 -0
  49. package/dist/core/components/link.js +26 -0
  50. package/dist/core/components/link.js.map +1 -0
  51. package/dist/core/components/modal.d.ts +13 -0
  52. package/dist/core/components/modal.js +75 -0
  53. package/dist/core/components/modal.js.map +1 -0
  54. package/dist/core/components/segmented-control.d.ts +16 -0
  55. package/dist/core/components/segmented-control.js +30 -0
  56. package/dist/core/components/segmented-control.js.map +1 -0
  57. package/dist/core/components/segmented-pills.d.ts +13 -0
  58. package/dist/core/components/segmented-pills.js +31 -0
  59. package/dist/core/components/segmented-pills.js.map +1 -0
  60. package/dist/core/components/spinner.d.ts +2 -0
  61. package/dist/core/components/spinner.js +16 -0
  62. package/dist/core/components/spinner.js.map +1 -0
  63. package/dist/core/components/stack.d.ts +13 -0
  64. package/dist/core/components/stack.js +47 -0
  65. package/dist/core/components/stack.js.map +1 -0
  66. package/dist/core/components/tabs.d.ts +22 -0
  67. package/dist/core/components/tabs.js +118 -0
  68. package/dist/core/components/tabs.js.map +1 -0
  69. package/dist/core/components/text.d.ts +11 -0
  70. package/dist/core/components/text.js +18 -0
  71. package/dist/core/components/text.js.map +1 -0
  72. package/dist/core/props.d.ts +14 -0
  73. package/dist/core/props.js +30 -0
  74. package/dist/core/props.js.map +1 -0
  75. package/dist/core/registry.d.ts +26 -0
  76. package/dist/core/registry.js +36 -0
  77. package/dist/core/registry.js.map +1 -0
  78. package/dist/core/renderer.d.ts +16 -0
  79. package/dist/core/renderer.js +61 -0
  80. package/dist/core/renderer.js.map +1 -0
  81. package/dist/core/types.d.ts +55 -0
  82. package/dist/core/types.js +0 -0
  83. package/dist/events/event-bridge.d.ts +14 -0
  84. package/dist/events/event-bridge.js +75 -0
  85. package/dist/events/event-bridge.js.map +1 -0
  86. package/dist/events/event-names.d.ts +21 -0
  87. package/dist/events/event-names.js +22 -0
  88. package/dist/events/event-names.js.map +1 -0
  89. package/dist/form/components/base/checkbox.d.ts +4 -0
  90. package/dist/form/components/base/checkbox.js +22 -0
  91. package/dist/form/components/base/checkbox.js.map +1 -0
  92. package/dist/form/components/base/field.d.ts +9 -0
  93. package/dist/form/components/base/field.js +38 -0
  94. package/dist/form/components/base/field.js.map +1 -0
  95. package/dist/form/components/base/input-error.d.ts +4 -0
  96. package/dist/form/components/base/input-error.js +14 -0
  97. package/dist/form/components/base/input-error.js.map +1 -0
  98. package/dist/form/components/base/input.d.ts +3 -0
  99. package/dist/form/components/base/input.js +16 -0
  100. package/dist/form/components/base/input.js.map +1 -0
  101. package/dist/form/components/base/label.d.ts +4 -0
  102. package/dist/form/components/base/label.js +16 -0
  103. package/dist/form/components/base/label.js.map +1 -0
  104. package/dist/form/components/base/password-input.d.ts +7 -0
  105. package/dist/form/components/base/password-input.js +29 -0
  106. package/dist/form/components/base/password-input.js.map +1 -0
  107. package/dist/form/components/base/submit-button.d.ts +6 -0
  108. package/dist/form/components/base/submit-button.js +46 -0
  109. package/dist/form/components/base/submit-button.js.map +1 -0
  110. package/dist/form/components/base/textarea.d.ts +3 -0
  111. package/dist/form/components/base/textarea.js +15 -0
  112. package/dist/form/components/base/textarea.js.map +1 -0
  113. package/dist/form/components/conditions.d.ts +25 -0
  114. package/dist/form/components/conditions.js +62 -0
  115. package/dist/form/components/conditions.js.map +1 -0
  116. package/dist/form/components/context.d.ts +20 -0
  117. package/dist/form/components/context.js +30 -0
  118. package/dist/form/components/context.js.map +1 -0
  119. package/dist/form/components/fields/checkbox.d.ts +16 -0
  120. package/dist/form/components/fields/checkbox.js +51 -0
  121. package/dist/form/components/fields/checkbox.js.map +1 -0
  122. package/dist/form/components/fields/choice.d.ts +14 -0
  123. package/dist/form/components/fields/choice.js +49 -0
  124. package/dist/form/components/fields/choice.js.map +1 -0
  125. package/dist/form/components/fields/date-input.d.ts +20 -0
  126. package/dist/form/components/fields/date-input.js +33 -0
  127. package/dist/form/components/fields/date-input.js.map +1 -0
  128. package/dist/form/components/fields/hidden-input.d.ts +10 -0
  129. package/dist/form/components/fields/hidden-input.js +12 -0
  130. package/dist/form/components/fields/hidden-input.js.map +1 -0
  131. package/dist/form/components/fields/number-input.d.ts +23 -0
  132. package/dist/form/components/fields/number-input.js +55 -0
  133. package/dist/form/components/fields/number-input.js.map +1 -0
  134. package/dist/form/components/fields/password-input.d.ts +29 -0
  135. package/dist/form/components/fields/password-input.js +73 -0
  136. package/dist/form/components/fields/password-input.js.map +1 -0
  137. package/dist/form/components/fields/rich-editor.d.ts +17 -0
  138. package/dist/form/components/fields/rich-editor.js +302 -0
  139. package/dist/form/components/fields/rich-editor.js.map +1 -0
  140. package/dist/form/components/fields/select.d.ts +23 -0
  141. package/dist/form/components/fields/select.js +182 -0
  142. package/dist/form/components/fields/select.js.map +1 -0
  143. package/dist/form/components/fields/submit-button.d.ts +10 -0
  144. package/dist/form/components/fields/submit-button.js +14 -0
  145. package/dist/form/components/fields/submit-button.js.map +1 -0
  146. package/dist/form/components/fields/text-input.d.ts +21 -0
  147. package/dist/form/components/fields/text-input.js +33 -0
  148. package/dist/form/components/fields/text-input.js.map +1 -0
  149. package/dist/form/components/fields/textarea.d.ts +20 -0
  150. package/dist/form/components/fields/textarea.js +32 -0
  151. package/dist/form/components/fields/textarea.js.map +1 -0
  152. package/dist/form/components/form-transport.d.ts +8 -0
  153. package/dist/form/components/form-transport.js +31 -0
  154. package/dist/form/components/form-transport.js.map +1 -0
  155. package/dist/form/components/form.d.ts +21 -0
  156. package/dist/form/components/form.js +126 -0
  157. package/dist/form/components/form.js.map +1 -0
  158. package/dist/form/components/index.d.ts +11 -0
  159. package/dist/form/components/index.js +12 -0
  160. package/dist/form/components/resolved-nodes.d.ts +6 -0
  161. package/dist/form/components/resolved-nodes.js +20 -0
  162. package/dist/form/components/resolved-nodes.js.map +1 -0
  163. package/dist/form/components/types.d.ts +7 -0
  164. package/dist/form/components/types.js +0 -0
  165. package/dist/form/components/use-controlled-field.d.ts +16 -0
  166. package/dist/form/components/use-controlled-field.js +33 -0
  167. package/dist/form/components/use-controlled-field.js.map +1 -0
  168. package/dist/form/components/use-dependent-field.d.ts +3 -0
  169. package/dist/form/components/use-dependent-field.js +18 -0
  170. package/dist/form/components/use-dependent-field.js.map +1 -0
  171. package/dist/form/components/use-field-commit.d.ts +14 -0
  172. package/dist/form/components/use-field-commit.js +30 -0
  173. package/dist/form/components/use-field-commit.js.map +1 -0
  174. package/dist/form/components/use-form-resolver.d.ts +2 -0
  175. package/dist/form/components/use-form-resolver.js +57 -0
  176. package/dist/form/components/use-form-resolver.js.map +1 -0
  177. package/dist/form/components/values.d.ts +7 -0
  178. package/dist/form/components/values.js +37 -0
  179. package/dist/form/components/values.js.map +1 -0
  180. package/dist/form/index.d.ts +1 -0
  181. package/dist/form/index.js +33 -0
  182. package/dist/form/index.js.map +1 -0
  183. package/dist/form/skeleton.d.ts +2 -0
  184. package/dist/form/skeleton.js +21 -0
  185. package/dist/form/skeleton.js.map +1 -0
  186. package/dist/generated/types.d.ts +17 -0
  187. package/dist/generated/types.js +0 -0
  188. package/dist/icons/default-icons.d.ts +3 -0
  189. package/dist/icons/default-icons.js +44 -0
  190. package/dist/icons/default-icons.js.map +1 -0
  191. package/dist/icons/dynamic-lucide-renderer.d.ts +2 -0
  192. package/dist/icons/dynamic-lucide-renderer.js +18 -0
  193. package/dist/icons/dynamic-lucide-renderer.js.map +1 -0
  194. package/dist/icons/icon-renderer.d.ts +14 -0
  195. package/dist/icons/icon-renderer.js +35 -0
  196. package/dist/icons/icon-renderer.js.map +1 -0
  197. package/dist/icons/index.d.ts +2 -0
  198. package/dist/icons/index.js +2 -0
  199. package/dist/index.d.ts +22 -0
  200. package/dist/index.js +14 -0
  201. package/dist/inertia.d.ts +17 -0
  202. package/dist/inertia.js +26 -0
  203. package/dist/inertia.js.map +1 -0
  204. package/dist/lattice.css +247 -0
  205. package/dist/lib/utils.d.ts +4 -0
  206. package/dist/lib/utils.js +13 -0
  207. package/dist/lib/utils.js.map +1 -0
  208. package/dist/menu/index.d.ts +1 -0
  209. package/dist/menu/index.js +2 -0
  210. package/dist/menu/use-menu.d.ts +2 -0
  211. package/dist/menu/use-menu.js +9 -0
  212. package/dist/menu/use-menu.js.map +1 -0
  213. package/dist/page.d.ts +6 -0
  214. package/dist/page.js +30 -0
  215. package/dist/page.js.map +1 -0
  216. package/dist/provider.d.ts +7 -0
  217. package/dist/provider.js +19 -0
  218. package/dist/provider.js.map +1 -0
  219. package/dist/registry.d.ts +1 -0
  220. package/dist/registry.js +11 -0
  221. package/dist/registry.js.map +1 -0
  222. package/dist/table/bulk.d.ts +18 -0
  223. package/dist/table/bulk.js +44 -0
  224. package/dist/table/bulk.js.map +1 -0
  225. package/dist/table/components/bulk-bar.d.ts +11 -0
  226. package/dist/table/components/bulk-bar.js +76 -0
  227. package/dist/table/components/bulk-bar.js.map +1 -0
  228. package/dist/table/components/column-filter-control.d.ts +14 -0
  229. package/dist/table/components/column-filter-control.js +244 -0
  230. package/dist/table/components/column-filter-control.js.map +1 -0
  231. package/dist/table/components/column-header.d.ts +7 -0
  232. package/dist/table/components/column-header.js +37 -0
  233. package/dist/table/components/column-header.js.map +1 -0
  234. package/dist/table/components/filter-stack-bar.d.ts +7 -0
  235. package/dist/table/components/filter-stack-bar.js +35 -0
  236. package/dist/table/components/filter-stack-bar.js.map +1 -0
  237. package/dist/table/components/filter-value-input.d.ts +11 -0
  238. package/dist/table/components/filter-value-input.js +82 -0
  239. package/dist/table/components/filter-value-input.js.map +1 -0
  240. package/dist/table/components/pagination.d.ts +14 -0
  241. package/dist/table/components/pagination.js +67 -0
  242. package/dist/table/components/pagination.js.map +1 -0
  243. package/dist/table/components/sort-bar.d.ts +7 -0
  244. package/dist/table/components/sort-bar.js +43 -0
  245. package/dist/table/components/sort-bar.js.map +1 -0
  246. package/dist/table/components/table-action-node.d.ts +4 -0
  247. package/dist/table/components/table-action-node.js +24 -0
  248. package/dist/table/components/table-action-node.js.map +1 -0
  249. package/dist/table/components/table-cell.d.ts +5 -0
  250. package/dist/table/components/table-cell.js +63 -0
  251. package/dist/table/components/table-cell.js.map +1 -0
  252. package/dist/table/components/table.d.ts +3 -0
  253. package/dist/table/components/table.js +189 -0
  254. package/dist/table/components/table.js.map +1 -0
  255. package/dist/table/format.d.ts +3 -0
  256. package/dist/table/format.js +41 -0
  257. package/dist/table/format.js.map +1 -0
  258. package/dist/table/index.d.ts +1 -0
  259. package/dist/table/index.js +10 -0
  260. package/dist/table/index.js.map +1 -0
  261. package/dist/table/payload.d.ts +9 -0
  262. package/dist/table/payload.js +46 -0
  263. package/dist/table/payload.js.map +1 -0
  264. package/dist/table/query.d.ts +12 -0
  265. package/dist/table/query.js +83 -0
  266. package/dist/table/query.js.map +1 -0
  267. package/dist/table/types.d.ts +67 -0
  268. package/dist/table/types.js +0 -0
  269. package/dist/table/use-table-selection.d.ts +12 -0
  270. package/dist/table/use-table-selection.js +46 -0
  271. package/dist/table/use-table-selection.js.map +1 -0
  272. package/dist/table/use-table.d.ts +19 -0
  273. package/dist/table/use-table.js +157 -0
  274. package/dist/table/use-table.js.map +1 -0
  275. package/dist/types/index.d.ts +2 -0
  276. package/dist/types/index.js +0 -0
  277. package/package.json +151 -0
@@ -0,0 +1,61 @@
1
+ import { Suspense, createContext, useContext, useMemo } from "react";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region resources/js/core/renderer.tsx
4
+ function MissingComponent({ node }) {
5
+ return null;
6
+ }
7
+ var RendererContext = createContext(null);
8
+ function useRendererContext() {
9
+ const context = useContext(RendererContext);
10
+ if (!context) throw new Error("Renderer context is not available.");
11
+ return context;
12
+ }
13
+ function Renderer({ fallback = null, missingComponent: UnknownComponent = MissingComponent, nodes, registry }) {
14
+ const context = useMemo(() => ({
15
+ fallback,
16
+ missingComponent: UnknownComponent,
17
+ registry
18
+ }), [
19
+ fallback,
20
+ registry,
21
+ UnknownComponent
22
+ ]);
23
+ return /* @__PURE__ */ jsx(RendererContext.Provider, {
24
+ value: context,
25
+ children: nodes.map((node, index) => /* @__PURE__ */ jsx(NodeRenderer, {
26
+ fallback,
27
+ missingComponent: UnknownComponent,
28
+ node,
29
+ registry
30
+ }, node.key ?? node.id ?? `${node.type}-${index}`))
31
+ });
32
+ }
33
+ function NodeRenderer({ fallback, missingComponent: UnknownComponent, node, registry }) {
34
+ const registration = registry[node.type];
35
+ if (!registration) return /* @__PURE__ */ jsx(UnknownComponent, { node });
36
+ const Component = registration.component;
37
+ const renderedComponent = /* @__PURE__ */ jsx(Component, {
38
+ node,
39
+ children: node.children?.length ? /* @__PURE__ */ jsx(Renderer, {
40
+ fallback,
41
+ missingComponent: UnknownComponent,
42
+ nodes: node.children,
43
+ registry
44
+ }) : null
45
+ });
46
+ if (registration.mode === "lazy") {
47
+ const FallbackComponent = registration.fallback;
48
+ return /* @__PURE__ */ jsx(Suspense, {
49
+ fallback: FallbackComponent ? /* @__PURE__ */ jsx(FallbackComponent, {
50
+ node,
51
+ children: null
52
+ }) : fallback,
53
+ children: renderedComponent
54
+ });
55
+ }
56
+ return renderedComponent;
57
+ }
58
+ //#endregion
59
+ export { Renderer, useRendererContext };
60
+
61
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","names":[],"sources":["../../resources/js/core/renderer.tsx"],"sourcesContent":["import { createContext, Suspense, useContext, useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { ComponentRegistry } from \"./registry\";\nimport type { Node, UnknownComponent } from \"./types\";\n\nfunction MissingComponent({ node }: { node: Node }) {\n if (!import.meta.env.DEV) {\n return null;\n }\n\n return <div data-lattice-missing-component={node.type}>Missing component: {node.type}</div>;\n}\n\ntype RendererContextValue = {\n fallback: ReactNode;\n missingComponent: UnknownComponent;\n registry: ComponentRegistry;\n};\n\nconst RendererContext = createContext<RendererContextValue | null>(null);\n\nexport function useRendererContext(): RendererContextValue {\n const context = useContext(RendererContext);\n\n if (!context) {\n throw new Error(\"Renderer context is not available.\");\n }\n\n return context;\n}\n\nexport function Renderer({\n fallback = null,\n missingComponent: UnknownComponent = MissingComponent,\n nodes,\n registry,\n}: {\n fallback?: ReactNode;\n missingComponent?: UnknownComponent;\n nodes: Node[];\n registry: ComponentRegistry;\n}) {\n const context = useMemo(\n () => ({\n fallback,\n missingComponent: UnknownComponent,\n registry,\n }),\n [fallback, registry, UnknownComponent],\n );\n\n return (\n <RendererContext.Provider value={context}>\n {nodes.map((node, index) => (\n <NodeRenderer\n fallback={fallback}\n key={node.key ?? node.id ?? `${node.type}-${index}`}\n missingComponent={UnknownComponent}\n node={node}\n registry={registry}\n />\n ))}\n </RendererContext.Provider>\n );\n}\n\nfunction NodeRenderer({\n fallback,\n missingComponent: UnknownComponent,\n node,\n registry,\n}: {\n fallback: ReactNode;\n missingComponent: UnknownComponent;\n node: Node;\n registry: ComponentRegistry;\n}) {\n const registration = registry[node.type];\n\n if (!registration) {\n return <UnknownComponent node={node} />;\n }\n\n const Component = registration.component;\n const children = node.children?.length ? (\n <Renderer\n fallback={fallback}\n missingComponent={UnknownComponent}\n nodes={node.children}\n registry={registry}\n />\n ) : null;\n\n const renderedComponent = <Component node={node}>{children}</Component>;\n\n if (registration.mode === \"lazy\") {\n const FallbackComponent = registration.fallback;\n const suspenseFallback = FallbackComponent ? (\n <FallbackComponent node={node}>{null}</FallbackComponent>\n ) : (\n fallback\n );\n\n return <Suspense fallback={suspenseFallback}>{renderedComponent}</Suspense>;\n }\n\n return renderedComponent;\n}\n"],"mappings":";;;AAKA,SAAS,iBAAiB,EAAE,QAAwB;CAEhD,OAAO;AAIX;AAQA,IAAM,kBAAkB,cAA2C,IAAI;AAEvE,SAAgB,qBAA2C;CACzD,MAAM,UAAU,WAAW,eAAe;CAE1C,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,oCAAoC;CAGtD,OAAO;AACT;AAEA,SAAgB,SAAS,EACvB,WAAW,MACX,kBAAkB,mBAAmB,kBACrC,OACA,YAMC;CACD,MAAM,UAAU,eACP;EACL;EACA,kBAAkB;EAClB;CACF,IACA;EAAC;EAAU;EAAU;CAAgB,CACvC;CAEA,OACE,oBAAC,gBAAgB,UAAjB;EAA0B,OAAO;YAC9B,MAAM,KAAK,MAAM,UAChB,oBAAC,cAAD;GACY;GAEV,kBAAkB;GACZ;GACI;EACX,GAJM,KAAK,OAAO,KAAK,MAAM,GAAG,KAAK,KAAK,GAAG,OAI7C,CACF;CACuB,CAAA;AAE9B;AAEA,SAAS,aAAa,EACpB,UACA,kBAAkB,kBAClB,MACA,YAMC;CACD,MAAM,eAAe,SAAS,KAAK;CAEnC,IAAI,CAAC,cACH,OAAO,oBAAC,kBAAD,EAAwB,KAAO,CAAA;CAGxC,MAAM,YAAY,aAAa;CAU/B,MAAM,oBAAoB,oBAAC,WAAD;EAAiB;EAAO,UATjC,KAAK,UAAU,SAC9B,oBAAC,UAAD;GACY;GACV,kBAAkB;GAClB,OAAO,KAAK;GACF;EACX,CAAA,IACC;CAEkE,CAAA;CAEtE,IAAI,aAAa,SAAS,QAAQ;EAChC,MAAM,oBAAoB,aAAa;EAOvC,OAAO,oBAAC,UAAD;GAAU,UANQ,oBACvB,oBAAC,mBAAD;IAAyB;cAAO;GAAwB,CAAA,IAExD;aAG4C;EAA4B,CAAA;CAC5E;CAEA,OAAO;AACT"}
@@ -0,0 +1,55 @@
1
+ import { Method } from '@inertiajs/core';
2
+ import { ComponentType as ReactComponentType, ReactNode } from 'react';
3
+ export type NodeProps = Record<string, unknown>;
4
+ export interface ComponentProps {
5
+ [component: string]: NodeProps;
6
+ }
7
+ export type ComponentType = keyof ComponentProps & string;
8
+ export type PropsFor<TType extends string> = TType extends ComponentType ? ComponentProps[TType] & NodeProps : NodeProps;
9
+ export type Node<TType extends string = string> = {
10
+ children?: Node[];
11
+ id?: string;
12
+ key?: string;
13
+ props?: PropsFor<TType>;
14
+ type: TType;
15
+ };
16
+ export type PagePayload = {
17
+ breadcrumbs: PageBreadcrumb[];
18
+ components: Node[];
19
+ container: PageContainer;
20
+ layout: string;
21
+ menus: Record<string, MenuPayload | undefined>;
22
+ title: string | null;
23
+ };
24
+ export type PageBreadcrumb = {
25
+ href: string;
26
+ title: string;
27
+ };
28
+ export type MenuItem = {
29
+ active: boolean;
30
+ href: string;
31
+ icon: string | null;
32
+ key: string;
33
+ label: string;
34
+ method: Method;
35
+ };
36
+ export type MenuGroup = {
37
+ items: MenuItem[];
38
+ label: string | null;
39
+ };
40
+ export type MenuPayload = {
41
+ groups: MenuGroup[];
42
+ };
43
+ export type KnownPageContainer = "centered" | "default";
44
+ export type PageContainer = KnownPageContainer | (string & {});
45
+ export type RendererComponentProps<TType extends string = string> = {
46
+ children: ReactNode;
47
+ node: Node<TType>;
48
+ };
49
+ export type RendererComponent<TType extends string = string> = ReactComponentType<RendererComponentProps<TType>>;
50
+ export type RendererComponentModule<TType extends string = string> = {
51
+ default: RendererComponent<TType>;
52
+ };
53
+ export type UnknownComponent = ReactComponentType<{
54
+ node: Node;
55
+ }>;
File without changes
@@ -0,0 +1,14 @@
1
+ export declare const toastVariants: readonly ["success", "info", "warning", "error"];
2
+ export declare const appearances: readonly ["light", "dark", "system"];
3
+ export type ToastVariant = (typeof toastVariants)[number];
4
+ export type Appearance = (typeof appearances)[number];
5
+ export type ToastMessage = {
6
+ message: string;
7
+ variant: ToastVariant;
8
+ };
9
+ type EventBridgeProps = {
10
+ onAppearanceChange?: (appearance: Appearance) => void;
11
+ onToast?: (toast: ToastMessage) => void;
12
+ };
13
+ export declare function EventBridge({ onAppearanceChange, onToast }: EventBridgeProps): null;
14
+ export {};
@@ -0,0 +1,75 @@
1
+ import { LATTICE_EVENT } from "./event-names.js";
2
+ import { useEffect } from "react";
3
+ import { router } from "@inertiajs/react";
4
+ //#region resources/js/events/event-bridge.tsx
5
+ var toastVariants = [
6
+ "success",
7
+ "info",
8
+ "warning",
9
+ "error"
10
+ ];
11
+ var appearances = [
12
+ "light",
13
+ "dark",
14
+ "system"
15
+ ];
16
+ function isToastVariant(value) {
17
+ return toastVariants.some((variant) => variant === value);
18
+ }
19
+ function isAppearance(value) {
20
+ return appearances.some((appearance) => appearance === value);
21
+ }
22
+ function normalizeFlashToast(value) {
23
+ if (typeof value !== "object" || value === null) return null;
24
+ const candidate = value;
25
+ if (typeof candidate.message !== "string" || !isToastVariant(candidate.variant)) return null;
26
+ return {
27
+ message: candidate.message,
28
+ variant: candidate.variant
29
+ };
30
+ }
31
+ function normalizeLatticeToast(event) {
32
+ const detail = event.detail;
33
+ const message = detail?.message;
34
+ if (typeof message !== "string" || message === "") return null;
35
+ return {
36
+ message,
37
+ variant: isToastVariant(detail.variant) ? detail.variant : "success"
38
+ };
39
+ }
40
+ function EventBridge({ onAppearanceChange, onToast }) {
41
+ useEffect(() => {
42
+ if (!onToast) return;
43
+ return router.on("flash", (event) => {
44
+ const toast = normalizeFlashToast(event.detail?.flash?.toast);
45
+ if (toast) onToast(toast);
46
+ });
47
+ }, [onToast]);
48
+ useEffect(() => {
49
+ if (!onToast) return;
50
+ const listener = (event) => {
51
+ const toast = normalizeLatticeToast(event);
52
+ if (toast) onToast(toast);
53
+ };
54
+ window.addEventListener(LATTICE_EVENT.toast, listener);
55
+ return () => {
56
+ window.removeEventListener(LATTICE_EVENT.toast, listener);
57
+ };
58
+ }, [onToast]);
59
+ useEffect(() => {
60
+ if (!onAppearanceChange) return;
61
+ const listener = (event) => {
62
+ const value = event.detail?.value;
63
+ if (isAppearance(value)) onAppearanceChange(value);
64
+ };
65
+ window.addEventListener(LATTICE_EVENT.appearanceChange, listener);
66
+ return () => {
67
+ window.removeEventListener(LATTICE_EVENT.appearanceChange, listener);
68
+ };
69
+ }, [onAppearanceChange]);
70
+ return null;
71
+ }
72
+ //#endregion
73
+ export { EventBridge, appearances, toastVariants };
74
+
75
+ //# sourceMappingURL=event-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bridge.js","names":[],"sources":["../../resources/js/events/event-bridge.tsx"],"sourcesContent":["import { router } from \"@inertiajs/react\";\nimport { useEffect } from \"react\";\nimport { LATTICE_EVENT } from \"./event-names\";\n\nexport const toastVariants = [\"success\", \"info\", \"warning\", \"error\"] as const;\nexport const appearances = [\"light\", \"dark\", \"system\"] as const;\n\nexport type ToastVariant = (typeof toastVariants)[number];\nexport type Appearance = (typeof appearances)[number];\n\nexport type ToastMessage = {\n message: string;\n variant: ToastVariant;\n};\n\ntype EventBridgeProps = {\n onAppearanceChange?: (appearance: Appearance) => void;\n onToast?: (toast: ToastMessage) => void;\n};\n\ntype ToastEvent = CustomEvent<{\n message?: unknown;\n variant?: unknown;\n}>;\n\ntype AppearanceEvent = CustomEvent<{\n value?: unknown;\n}>;\n\ntype InertiaFlashEvent = CustomEvent<{\n flash?: {\n toast?: unknown;\n };\n}>;\n\nfunction isToastVariant(value: unknown): value is ToastVariant {\n return toastVariants.some((variant) => variant === value);\n}\n\nfunction isAppearance(value: unknown): value is Appearance {\n return appearances.some((appearance) => appearance === value);\n}\n\nfunction normalizeFlashToast(value: unknown): ToastMessage | null {\n if (typeof value !== \"object\" || value === null) {\n return null;\n }\n\n const candidate = value as Partial<ToastMessage>;\n\n if (typeof candidate.message !== \"string\" || !isToastVariant(candidate.variant)) {\n return null;\n }\n\n return {\n message: candidate.message,\n variant: candidate.variant,\n };\n}\n\nfunction normalizeLatticeToast(event: Event): ToastMessage | null {\n const detail = (event as ToastEvent).detail;\n const message = detail?.message;\n\n if (typeof message !== \"string\" || message === \"\") {\n return null;\n }\n\n return {\n message,\n variant: isToastVariant(detail.variant) ? detail.variant : \"success\",\n };\n}\n\nexport function EventBridge({ onAppearanceChange, onToast }: EventBridgeProps) {\n useEffect(() => {\n if (!onToast) {\n return;\n }\n\n return router.on(\"flash\", (event) => {\n const toast = normalizeFlashToast((event as InertiaFlashEvent).detail?.flash?.toast);\n\n if (toast) {\n onToast(toast);\n }\n });\n }, [onToast]);\n\n useEffect(() => {\n if (!onToast) {\n return;\n }\n\n const listener = (event: Event): void => {\n const toast = normalizeLatticeToast(event);\n\n if (toast) {\n onToast(toast);\n }\n };\n\n window.addEventListener(LATTICE_EVENT.toast, listener);\n\n return () => {\n window.removeEventListener(LATTICE_EVENT.toast, listener);\n };\n }, [onToast]);\n\n useEffect(() => {\n if (!onAppearanceChange) {\n return;\n }\n\n const listener = (event: Event): void => {\n const value = (event as AppearanceEvent).detail?.value;\n\n if (isAppearance(value)) {\n onAppearanceChange(value);\n }\n };\n\n window.addEventListener(LATTICE_EVENT.appearanceChange, listener);\n\n return () => {\n window.removeEventListener(LATTICE_EVENT.appearanceChange, listener);\n };\n }, [onAppearanceChange]);\n\n return null;\n}\n"],"mappings":";;;;AAIA,IAAa,gBAAgB;CAAC;CAAW;CAAQ;CAAW;AAAO;AACnE,IAAa,cAAc;CAAC;CAAS;CAAQ;AAAQ;AA8BrD,SAAS,eAAe,OAAuC;CAC7D,OAAO,cAAc,MAAM,YAAY,YAAY,KAAK;AAC1D;AAEA,SAAS,aAAa,OAAqC;CACzD,OAAO,YAAY,MAAM,eAAe,eAAe,KAAK;AAC9D;AAEA,SAAS,oBAAoB,OAAqC;CAChE,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,YAAY;CAElB,IAAI,OAAO,UAAU,YAAY,YAAY,CAAC,eAAe,UAAU,OAAO,GAC5E,OAAO;CAGT,OAAO;EACL,SAAS,UAAU;EACnB,SAAS,UAAU;CACrB;AACF;AAEA,SAAS,sBAAsB,OAAmC;CAChE,MAAM,SAAU,MAAqB;CACrC,MAAM,UAAU,QAAQ;CAExB,IAAI,OAAO,YAAY,YAAY,YAAY,IAC7C,OAAO;CAGT,OAAO;EACL;EACA,SAAS,eAAe,OAAO,OAAO,IAAI,OAAO,UAAU;CAC7D;AACF;AAEA,SAAgB,YAAY,EAAE,oBAAoB,WAA6B;CAC7E,gBAAgB;EACd,IAAI,CAAC,SACH;EAGF,OAAO,OAAO,GAAG,UAAU,UAAU;GACnC,MAAM,QAAQ,oBAAqB,MAA4B,QAAQ,OAAO,KAAK;GAEnF,IAAI,OACF,QAAQ,KAAK;EAEjB,CAAC;CACH,GAAG,CAAC,OAAO,CAAC;CAEZ,gBAAgB;EACd,IAAI,CAAC,SACH;EAGF,MAAM,YAAY,UAAuB;GACvC,MAAM,QAAQ,sBAAsB,KAAK;GAEzC,IAAI,OACF,QAAQ,KAAK;EAEjB;EAEA,OAAO,iBAAiB,cAAc,OAAO,QAAQ;EAErD,aAAa;GACX,OAAO,oBAAoB,cAAc,OAAO,QAAQ;EAC1D;CACF,GAAG,CAAC,OAAO,CAAC;CAEZ,gBAAgB;EACd,IAAI,CAAC,oBACH;EAGF,MAAM,YAAY,UAAuB;GACvC,MAAM,QAAS,MAA0B,QAAQ;GAEjD,IAAI,aAAa,KAAK,GACpB,mBAAmB,KAAK;EAE5B;EAEA,OAAO,iBAAiB,cAAc,kBAAkB,QAAQ;EAEhE,aAAa;GACX,OAAO,oBAAoB,cAAc,kBAAkB,QAAQ;EACrE;CACF,GAAG,CAAC,kBAAkB,CAAC;CAEvB,OAAO;AACT"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Single source of truth for the `lattice:*` DOM events the runtime dispatches
3
+ * and listens for. Effect-driven events are mapped from the generated EffectType
4
+ * in action/effects.ts; the rest are framework events with no PHP counterpart.
5
+ */
6
+ export declare const LATTICE_EVENT: {
7
+ readonly toast: "lattice:toast";
8
+ readonly reloadComponent: "lattice:reload-component";
9
+ readonly reloadPage: "lattice:reload-page";
10
+ readonly redirect: "lattice:redirect";
11
+ readonly download: "lattice:download";
12
+ readonly openModal: "lattice:open-modal";
13
+ readonly closeModal: "lattice:close-modal";
14
+ readonly resetForm: "lattice:reset-form";
15
+ readonly appearanceChange: "lattice:appearance-change";
16
+ readonly actionError: "lattice:action-error";
17
+ };
18
+ export type ReloadComponentEvent = CustomEvent<{
19
+ component?: string;
20
+ type?: string;
21
+ }>;
@@ -0,0 +1,22 @@
1
+ //#region resources/js/events/event-names.ts
2
+ /**
3
+ * Single source of truth for the `lattice:*` DOM events the runtime dispatches
4
+ * and listens for. Effect-driven events are mapped from the generated EffectType
5
+ * in action/effects.ts; the rest are framework events with no PHP counterpart.
6
+ */
7
+ var LATTICE_EVENT = {
8
+ toast: "lattice:toast",
9
+ reloadComponent: "lattice:reload-component",
10
+ reloadPage: "lattice:reload-page",
11
+ redirect: "lattice:redirect",
12
+ download: "lattice:download",
13
+ openModal: "lattice:open-modal",
14
+ closeModal: "lattice:close-modal",
15
+ resetForm: "lattice:reset-form",
16
+ appearanceChange: "lattice:appearance-change",
17
+ actionError: "lattice:action-error"
18
+ };
19
+ //#endregion
20
+ export { LATTICE_EVENT };
21
+
22
+ //# sourceMappingURL=event-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-names.js","names":[],"sources":["../../resources/js/events/event-names.ts"],"sourcesContent":["/**\n * Single source of truth for the `lattice:*` DOM events the runtime dispatches\n * and listens for. Effect-driven events are mapped from the generated EffectType\n * in action/effects.ts; the rest are framework events with no PHP counterpart.\n */\nexport const LATTICE_EVENT = {\n toast: \"lattice:toast\",\n reloadComponent: \"lattice:reload-component\",\n reloadPage: \"lattice:reload-page\",\n redirect: \"lattice:redirect\",\n download: \"lattice:download\",\n openModal: \"lattice:open-modal\",\n closeModal: \"lattice:close-modal\",\n resetForm: \"lattice:reset-form\",\n appearanceChange: \"lattice:appearance-change\",\n actionError: \"lattice:action-error\",\n} as const;\n\nexport type ReloadComponentEvent = CustomEvent<{\n component?: string;\n type?: string;\n}>;\n"],"mappings":";;;;;;AAKA,IAAa,gBAAgB;CAC3B,OAAO;CACP,iBAAiB;CACjB,YAAY;CACZ,UAAU;CACV,UAAU;CACV,WAAW;CACX,YAAY;CACZ,WAAW;CACX,kBAAkB;CAClB,aAAa;AACf"}
@@ -0,0 +1,4 @@
1
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
2
+ import * as React from "react";
3
+ declare function Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>): React.JSX.Element;
4
+ export { Checkbox };
@@ -0,0 +1,22 @@
1
+ import { cn } from "../../../lib/utils.js";
2
+ import "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { CheckIcon } from "lucide-react";
5
+ import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
6
+ //#region resources/js/form/components/base/checkbox.tsx
7
+ function Checkbox({ className, ...props }) {
8
+ return /* @__PURE__ */ jsx(CheckboxPrimitive.Root, {
9
+ "data-slot": "checkbox",
10
+ className: cn("peer border-lt-input data-[state=checked]:bg-lt-primary data-[state=checked]:text-lt-primary-fg data-[state=checked]:border-lt-primary focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger size-4 shrink-0 rounded-lt-xs border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className),
11
+ ...props,
12
+ children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, {
13
+ "data-slot": "checkbox-indicator",
14
+ className: "flex items-center justify-center text-current transition-none",
15
+ children: /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5" })
16
+ })
17
+ });
18
+ }
19
+ //#endregion
20
+ export { Checkbox };
21
+
22
+ //# sourceMappingURL=checkbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkbox.js","names":[],"sources":["../../../../resources/js/form/components/base/checkbox.tsx"],"sourcesContent":["import * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { CheckIcon } from \"lucide-react\";\nimport * as React from \"react\";\n\nimport { cn } from \"@lattice/lattice/lib/utils\";\n\nfunction Checkbox({ className, ...props }: React.ComponentProps<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root\n data-slot=\"checkbox\"\n className={cn(\n \"peer border-lt-input data-[state=checked]:bg-lt-primary data-[state=checked]:text-lt-primary-fg data-[state=checked]:border-lt-primary focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger size-4 shrink-0 rounded-lt-xs border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"flex items-center justify-center text-current transition-none\"\n >\n <CheckIcon className=\"size-3.5\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox };\n"],"mappings":";;;;;;AAMA,SAAS,SAAS,EAAE,WAAW,GAAG,SAA8D;CAC9F,OACE,oBAAC,kBAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,6bACA,SACF;EACA,GAAI;YAEJ,oBAAC,kBAAkB,WAAnB;GACE,aAAU;GACV,WAAU;aAEV,oBAAC,WAAD,EAAW,WAAU,WAAY,CAAA;EACN,CAAA;CACP,CAAA;AAE5B"}
@@ -0,0 +1,9 @@
1
+ import { FormLabelAction } from '../types';
2
+ export declare function FormFieldFrame({ children, error, label, labelAction, name, required, }: {
3
+ children: React.ReactNode;
4
+ error?: string;
5
+ label: string;
6
+ labelAction?: FormLabelAction;
7
+ name: string;
8
+ required?: boolean;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,38 @@
1
+ import { TextLink } from "../../../core/components/link.js";
2
+ import { Label } from "./label.js";
3
+ import InputError from "./input-error.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region resources/js/form/components/base/field.tsx
6
+ function FormFieldFrame({ children, error, label, labelAction, name, required }) {
7
+ return /* @__PURE__ */ jsxs("div", {
8
+ className: "grid gap-2",
9
+ children: [
10
+ /* @__PURE__ */ jsxs("div", {
11
+ className: "flex min-h-5 items-center",
12
+ children: [
13
+ /* @__PURE__ */ jsx(Label, {
14
+ htmlFor: name,
15
+ children: label
16
+ }),
17
+ required && /* @__PURE__ */ jsx("span", {
18
+ "aria-hidden": "true",
19
+ className: "ml-0.5 text-lt-danger",
20
+ children: "*"
21
+ }),
22
+ labelAction && /* @__PURE__ */ jsx(TextLink, {
23
+ href: labelAction.href,
24
+ tabIndex: labelAction.tabIndex,
25
+ className: "ml-auto text-sm",
26
+ children: labelAction.label
27
+ })
28
+ ]
29
+ }),
30
+ children,
31
+ /* @__PURE__ */ jsx(InputError, { message: error })
32
+ ]
33
+ });
34
+ }
35
+ //#endregion
36
+ export { FormFieldFrame };
37
+
38
+ //# sourceMappingURL=field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.js","names":[],"sources":["../../../../resources/js/form/components/base/field.tsx"],"sourcesContent":["import InputError from \"@lattice/lattice/form/components/base/input-error\";\nimport { TextLink } from \"@lattice/lattice/core/components/link\";\nimport { Label } from \"@lattice/lattice/form/components/base/label\";\nimport type { FormLabelAction } from \"../types\";\n\nexport function FormFieldFrame({\n children,\n error,\n label,\n labelAction,\n name,\n required,\n}: {\n children: React.ReactNode;\n error?: string;\n label: string;\n labelAction?: FormLabelAction;\n name: string;\n required?: boolean;\n}) {\n return (\n <div className=\"grid gap-2\">\n <div className=\"flex min-h-5 items-center\">\n <Label htmlFor={name}>{label}</Label>\n {required && (\n <span aria-hidden=\"true\" className=\"ml-0.5 text-lt-danger\">\n *\n </span>\n )}\n {labelAction && (\n <TextLink\n href={labelAction.href}\n tabIndex={labelAction.tabIndex}\n className=\"ml-auto text-sm\"\n >\n {labelAction.label}\n </TextLink>\n )}\n </div>\n\n {children}\n\n <InputError message={error} />\n </div>\n );\n}\n"],"mappings":";;;;;AAKA,SAAgB,eAAe,EAC7B,UACA,OACA,OACA,aACA,MACA,YAQC;CACD,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,oBAAC,OAAD;MAAO,SAAS;gBAAO;KAAa,CAAA;KACnC,YACC,oBAAC,QAAD;MAAM,eAAY;MAAO,WAAU;gBAAwB;KAErD,CAAA;KAEP,eACC,oBAAC,UAAD;MACE,MAAM,YAAY;MAClB,UAAU,YAAY;MACtB,WAAU;gBAET,YAAY;KACL,CAAA;IAET;;GAEJ;GAED,oBAAC,YAAD,EAAY,SAAS,MAAQ,CAAA;EAC1B;;AAET"}
@@ -0,0 +1,4 @@
1
+ import { HTMLAttributes } from 'react';
2
+ export default function InputError({ message, className, ...props }: HTMLAttributes<HTMLParagraphElement> & {
3
+ message?: string;
4
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,14 @@
1
+ import { cn } from "../../../lib/utils.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region resources/js/form/components/base/input-error.tsx
4
+ function InputError({ message, className = "", ...props }) {
5
+ return message ? /* @__PURE__ */ jsx("p", {
6
+ ...props,
7
+ className: cn("text-sm text-red-600 dark:text-red-400", className),
8
+ children: message
9
+ }) : null;
10
+ }
11
+ //#endregion
12
+ export { InputError as default };
13
+
14
+ //# sourceMappingURL=input-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-error.js","names":[],"sources":["../../../../resources/js/form/components/base/input-error.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@lattice/lattice/lib/utils\";\n\nexport default function InputError({\n message,\n className = \"\",\n ...props\n}: HTMLAttributes<HTMLParagraphElement> & { message?: string }) {\n return message ? (\n <p {...props} className={cn(\"text-sm text-red-600 dark:text-red-400\", className)}>\n {message}\n </p>\n ) : null;\n}\n"],"mappings":";;;AAGA,SAAwB,WAAW,EACjC,SACA,YAAY,IACZ,GAAG,SAC2D;CAC9D,OAAO,UACL,oBAAC,KAAD;EAAG,GAAI;EAAO,WAAW,GAAG,0CAA0C,SAAS;YAC5E;CACA,CAAA,IACD;AACN"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ declare function Input({ className, type, ...props }: React.ComponentProps<"input">): React.JSX.Element;
3
+ export { Input };
@@ -0,0 +1,16 @@
1
+ import { cn } from "../../../lib/utils.js";
2
+ import "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region resources/js/form/components/base/input.tsx
5
+ function Input({ className, type, ...props }) {
6
+ return /* @__PURE__ */ jsx("input", {
7
+ type,
8
+ "data-slot": "input",
9
+ className: cn("border-lt-input file:text-lt-fg placeholder:text-lt-muted-fg selection:bg-lt-primary selection:text-lt-primary-fg flex h-9 w-full min-w-0 rounded-lt-sm border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger", className),
10
+ ...props
11
+ });
12
+ }
13
+ //#endregion
14
+ export { Input };
15
+
16
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","names":[],"sources":["../../../../resources/js/form/components/base/input.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@lattice/lattice/lib/utils\";\n\nfunction Input({ className, type, ...props }: React.ComponentProps<\"input\">) {\n return (\n <input\n type={type}\n data-slot=\"input\"\n className={cn(\n \"border-lt-input file:text-lt-fg placeholder:text-lt-muted-fg selection:bg-lt-primary selection:text-lt-primary-fg flex h-9 w-full min-w-0 rounded-lt-sm border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Input };\n"],"mappings":";;;;AAIA,SAAS,MAAM,EAAE,WAAW,MAAM,GAAG,SAAwC;CAC3E,OACE,oBAAC,SAAD;EACQ;EACN,aAAU;EACV,WAAW,GACT,4aACA,uFACA,oGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,4 @@
1
+ import * as LabelPrimitive from "@radix-ui/react-label";
2
+ import * as React from "react";
3
+ declare function Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>): React.JSX.Element;
4
+ export { Label };
@@ -0,0 +1,16 @@
1
+ import { cn } from "../../../lib/utils.js";
2
+ import "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import * as LabelPrimitive from "@radix-ui/react-label";
5
+ //#region resources/js/form/components/base/label.tsx
6
+ function Label({ className, ...props }) {
7
+ return /* @__PURE__ */ jsx(LabelPrimitive.Root, {
8
+ "data-slot": "label",
9
+ className: cn("text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50", className),
10
+ ...props
11
+ });
12
+ }
13
+ //#endregion
14
+ export { Label };
15
+
16
+ //# sourceMappingURL=label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.js","names":[],"sources":["../../../../resources/js/form/components/base/label.tsx"],"sourcesContent":["import * as LabelPrimitive from \"@radix-ui/react-label\";\nimport * as React from \"react\";\n\nimport { cn } from \"@lattice/lattice/lib/utils\";\n\nfunction Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n"],"mappings":";;;;;AAKA,SAAS,MAAM,EAAE,WAAW,GAAG,SAA2D;CACxF,OACE,oBAAC,eAAe,MAAhB;EACE,aAAU;EACV,WAAW,GACT,+LACA,SACF;EACA,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,7 @@
1
+ import { ComponentProps, Ref } from 'react';
2
+ type PasswordInputProps = Omit<ComponentProps<"input">, "type"> & {
3
+ passwordrules?: string;
4
+ ref?: Ref<HTMLInputElement>;
5
+ };
6
+ export default function PasswordInput({ className, ref, ...props }: PasswordInputProps): import("react").JSX.Element;
7
+ export {};
@@ -0,0 +1,29 @@
1
+ import { cn } from "../../../lib/utils.js";
2
+ import { Input } from "./input.js";
3
+ import { useState } from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Eye, EyeOff } from "lucide-react";
6
+ //#region resources/js/form/components/base/password-input.tsx
7
+ function PasswordInput({ className, ref, ...props }) {
8
+ const [showPassword, setShowPassword] = useState(false);
9
+ return /* @__PURE__ */ jsxs("div", {
10
+ className: "relative",
11
+ children: [/* @__PURE__ */ jsx(Input, {
12
+ type: showPassword ? "text" : "password",
13
+ className: cn("pr-10", className),
14
+ ref,
15
+ ...props
16
+ }), /* @__PURE__ */ jsx("button", {
17
+ type: "button",
18
+ onClick: () => setShowPassword((prev) => !prev),
19
+ className: "absolute inset-y-0 right-0 flex items-center rounded-r-lt-sm px-3 text-lt-muted-fg hover:text-lt-fg focus-visible:ring-[3px] focus-visible:ring-lt-ring focus-visible:outline-none",
20
+ "aria-label": showPassword ? "Hide password" : "Show password",
21
+ tabIndex: -1,
22
+ children: showPassword ? /* @__PURE__ */ jsx(EyeOff, { className: "size-4" }) : /* @__PURE__ */ jsx(Eye, { className: "size-4" })
23
+ })]
24
+ });
25
+ }
26
+ //#endregion
27
+ export { PasswordInput as default };
28
+
29
+ //# sourceMappingURL=password-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-input.js","names":[],"sources":["../../../../resources/js/form/components/base/password-input.tsx"],"sourcesContent":["import { Eye, EyeOff } from \"lucide-react\";\nimport type { ComponentProps, Ref } from \"react\";\nimport { useState } from \"react\";\nimport { Input } from \"@lattice/lattice/form/components/base/input\";\nimport { cn } from \"@lattice/lattice/lib/utils\";\n\ntype PasswordInputProps = Omit<ComponentProps<\"input\">, \"type\"> & {\n passwordrules?: string;\n ref?: Ref<HTMLInputElement>;\n};\n\nexport default function PasswordInput({ className, ref, ...props }: PasswordInputProps) {\n const [showPassword, setShowPassword] = useState(false);\n\n return (\n <div className=\"relative\">\n <Input\n type={showPassword ? \"text\" : \"password\"}\n className={cn(\"pr-10\", className)}\n ref={ref}\n {...props}\n />\n <button\n type=\"button\"\n onClick={() => setShowPassword((prev) => !prev)}\n className=\"absolute inset-y-0 right-0 flex items-center rounded-r-lt-sm px-3 text-lt-muted-fg hover:text-lt-fg focus-visible:ring-[3px] focus-visible:ring-lt-ring focus-visible:outline-none\"\n aria-label={showPassword ? \"Hide password\" : \"Show password\"}\n tabIndex={-1}\n >\n {showPassword ? <EyeOff className=\"size-4\" /> : <Eye className=\"size-4\" />}\n </button>\n </div>\n );\n}\n"],"mappings":";;;;;;AAWA,SAAwB,cAAc,EAAE,WAAW,KAAK,GAAG,SAA6B;CACtF,MAAM,CAAC,cAAc,mBAAmB,SAAS,KAAK;CAEtD,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,OAAD;GACE,MAAM,eAAe,SAAS;GAC9B,WAAW,GAAG,SAAS,SAAS;GAC3B;GACL,GAAI;EACL,CAAA,GACD,oBAAC,UAAD;GACE,MAAK;GACL,eAAe,iBAAiB,SAAS,CAAC,IAAI;GAC9C,WAAU;GACV,cAAY,eAAe,kBAAkB;GAC7C,UAAU;aAET,eAAe,oBAAC,QAAD,EAAQ,WAAU,SAAU,CAAA,IAAI,oBAAC,KAAD,EAAK,WAAU,SAAU,CAAA;EACnE,CAAA,CACL;;AAET"}
@@ -0,0 +1,6 @@
1
+ type SubmitButtonVariant = "default" | "destructive" | "ghost" | "link" | "outline" | "secondary";
2
+ export declare function FormSubmitButton({ label, variant, }: {
3
+ label: string;
4
+ variant?: SubmitButtonVariant;
5
+ }): import("react").JSX.Element;
6
+ export {};
@@ -0,0 +1,46 @@
1
+ import { Button } from "../../../core/components/button.js";
2
+ import { Spinner } from "../../../core/components/spinner.js";
3
+ import { useFormContext } from "../context.js";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region resources/js/form/components/base/submit-button.tsx
6
+ function FormSubmitButton({ label, variant = "default" }) {
7
+ const { errors, fieldLabels, processing } = useFormContext();
8
+ const invalidFields = Object.entries(errors).filter(([, message]) => Boolean(message)).map(([name, message]) => ({
9
+ label: fieldLabels[name] ?? name,
10
+ message
11
+ }));
12
+ const hasErrors = invalidFields.length > 0;
13
+ return /* @__PURE__ */ jsxs("span", {
14
+ className: "group relative inline-flex flex-col",
15
+ children: [/* @__PURE__ */ jsxs(Button, {
16
+ disabled: processing || hasErrors,
17
+ type: "submit",
18
+ variant,
19
+ children: [processing && /* @__PURE__ */ jsx(Spinner, {}), label]
20
+ }), hasErrors && /* @__PURE__ */ jsxs("div", {
21
+ className: "pointer-events-none absolute bottom-full left-1/2 z-10 mb-2 w-max max-w-xs -translate-x-1/2 rounded-lt border border-lt-border bg-lt-surface p-3 text-left text-sm opacity-0 shadow-md transition-opacity group-hover:opacity-100",
22
+ role: "tooltip",
23
+ children: [/* @__PURE__ */ jsx("p", {
24
+ className: "mb-1 font-medium text-lt-fg",
25
+ children: "Fix these fields to continue:"
26
+ }), /* @__PURE__ */ jsx("ul", {
27
+ className: "space-y-1",
28
+ children: invalidFields.map((field) => /* @__PURE__ */ jsxs("li", {
29
+ className: "text-lt-muted-fg",
30
+ children: [
31
+ /* @__PURE__ */ jsx("span", {
32
+ className: "font-medium text-lt-fg",
33
+ children: field.label
34
+ }),
35
+ " — ",
36
+ field.message
37
+ ]
38
+ }, field.label))
39
+ })]
40
+ })]
41
+ });
42
+ }
43
+ //#endregion
44
+ export { FormSubmitButton };
45
+
46
+ //# sourceMappingURL=submit-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-button.js","names":[],"sources":["../../../../resources/js/form/components/base/submit-button.tsx"],"sourcesContent":["import { Button } from \"@lattice/lattice/core/components/button\";\nimport { Spinner } from \"@lattice/lattice/core/components/spinner\";\nimport { useFormContext } from \"../context\";\n\ntype SubmitButtonVariant = \"default\" | \"destructive\" | \"ghost\" | \"link\" | \"outline\" | \"secondary\";\n\nexport function FormSubmitButton({\n label,\n variant = \"default\",\n}: {\n label: string;\n variant?: SubmitButtonVariant;\n}) {\n const { errors, fieldLabels, processing } = useFormContext();\n\n const invalidFields = Object.entries(errors)\n .filter(([, message]) => Boolean(message))\n .map(([name, message]) => ({ label: fieldLabels[name] ?? name, message: message as string }));\n const hasErrors = invalidFields.length > 0;\n\n return (\n <span className=\"group relative inline-flex flex-col\">\n <Button disabled={processing || hasErrors} type=\"submit\" variant={variant}>\n {processing && <Spinner />}\n {label}\n </Button>\n\n {hasErrors && (\n <div\n className=\"pointer-events-none absolute bottom-full left-1/2 z-10 mb-2 w-max max-w-xs -translate-x-1/2 rounded-lt border border-lt-border bg-lt-surface p-3 text-left text-sm opacity-0 shadow-md transition-opacity group-hover:opacity-100\"\n role=\"tooltip\"\n >\n <p className=\"mb-1 font-medium text-lt-fg\">Fix these fields to continue:</p>\n <ul className=\"space-y-1\">\n {invalidFields.map((field) => (\n <li className=\"text-lt-muted-fg\" key={field.label}>\n <span className=\"font-medium text-lt-fg\">{field.label}</span> — {field.message}\n </li>\n ))}\n </ul>\n </div>\n )}\n </span>\n );\n}\n"],"mappings":";;;;;AAMA,SAAgB,iBAAiB,EAC/B,OACA,UAAU,aAIT;CACD,MAAM,EAAE,QAAQ,aAAa,eAAe,eAAe;CAE3D,MAAM,gBAAgB,OAAO,QAAQ,MAAM,EACxC,QAAQ,GAAG,aAAa,QAAQ,OAAO,CAAC,EACxC,KAAK,CAAC,MAAM,cAAc;EAAE,OAAO,YAAY,SAAS;EAAe;CAAkB,EAAE;CAC9F,MAAM,YAAY,cAAc,SAAS;CAEzC,OACE,qBAAC,QAAD;EAAM,WAAU;YAAhB,CACE,qBAAC,QAAD;GAAQ,UAAU,cAAc;GAAW,MAAK;GAAkB;aAAlE,CACG,cAAc,oBAAC,SAAD,CAAU,CAAA,GACxB,KACK;MAEP,aACC,qBAAC,OAAD;GACE,WAAU;GACV,MAAK;aAFP,CAIE,oBAAC,KAAD;IAAG,WAAU;cAA8B;GAAgC,CAAA,GAC3E,oBAAC,MAAD;IAAI,WAAU;cACX,cAAc,KAAK,UAClB,qBAAC,MAAD;KAAI,WAAU;eAAd;MACE,oBAAC,QAAD;OAAM,WAAU;iBAA0B,MAAM;MAAY,CAAA;MAAC;MAAI,MAAM;KACrE;OAFkC,MAAM,KAExC,CACL;GACC,CAAA,CACD;IAEH;;AAEV"}
@@ -0,0 +1,3 @@
1
+ import * as React from "react";
2
+ declare function Textarea({ className, ...props }: React.ComponentProps<"textarea">): React.JSX.Element;
3
+ export { Textarea };
@@ -0,0 +1,15 @@
1
+ import { cn } from "../../../lib/utils.js";
2
+ import "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ //#region resources/js/form/components/base/textarea.tsx
5
+ function Textarea({ className, ...props }) {
6
+ return /* @__PURE__ */ jsx("textarea", {
7
+ "data-slot": "textarea",
8
+ className: cn("border-lt-input placeholder:text-lt-muted-fg flex field-sizing-content min-h-16 w-full rounded-lt-sm border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px]", "aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger", className),
9
+ ...props
10
+ });
11
+ }
12
+ //#endregion
13
+ export { Textarea };
14
+
15
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","names":[],"sources":["../../../../resources/js/form/components/base/textarea.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@lattice/lattice/lib/utils\";\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"border-lt-input placeholder:text-lt-muted-fg flex field-sizing-content min-h-16 w-full rounded-lt-sm border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-lt-ring focus-visible:ring-lt-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:ring-lt-danger/20 dark:aria-invalid:ring-lt-danger/40 aria-invalid:border-lt-danger\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n"],"mappings":";;;;AAIA,SAAS,SAAS,EAAE,WAAW,GAAG,SAA2C;CAC3E,OACE,oBAAC,YAAD;EACE,aAAU;EACV,WAAW,GACT,+RACA,uFACA,oGACA,SACF;EACA,GAAI;CACL,CAAA;AAEL"}
@@ -0,0 +1,25 @@
1
+ import { ConditionOperator } from '../../../../generated/types';
2
+ export type Condition = {
3
+ field: string;
4
+ operator: ConditionOperator;
5
+ value: unknown;
6
+ };
7
+ export type FieldConditions = {
8
+ visible?: Condition[];
9
+ required?: Condition[];
10
+ readonly?: Condition[];
11
+ disabled?: Condition[];
12
+ };
13
+ export type FieldFlags = {
14
+ hidden?: boolean;
15
+ required?: boolean;
16
+ readonly?: boolean;
17
+ disabled?: boolean;
18
+ };
19
+ export type FieldState = {
20
+ hidden: boolean;
21
+ required: boolean;
22
+ readonly: boolean;
23
+ disabled: boolean;
24
+ };
25
+ export declare function evaluateConditions(conditions: FieldConditions | undefined, values: Record<string, unknown>, flags: FieldFlags): FieldState;