@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.
- package/LICENSE.md +21 -0
- package/README.md +39 -0
- package/dist/action/components/action-group.d.ts +10 -0
- package/dist/action/components/action-group.js +79 -0
- package/dist/action/components/action-group.js.map +1 -0
- package/dist/action/components/action.d.ts +26 -0
- package/dist/action/components/action.js +87 -0
- package/dist/action/components/action.js.map +1 -0
- package/dist/action/effects.d.ts +30 -0
- package/dist/action/effects.js +44 -0
- package/dist/action/effects.js.map +1 -0
- package/dist/action/index.d.ts +1 -0
- package/dist/action/index.js +15 -0
- package/dist/action/index.js.map +1 -0
- package/dist/appearance/index.d.ts +9 -0
- package/dist/appearance/index.js +66 -0
- package/dist/appearance/index.js.map +1 -0
- package/dist/clipboard/index.d.ts +5 -0
- package/dist/clipboard/index.js +24 -0
- package/dist/clipboard/index.js.map +1 -0
- package/dist/core/component-ref.d.ts +8 -0
- package/dist/core/component-ref.js +15 -0
- package/dist/core/component-ref.js.map +1 -0
- package/dist/core/components/badge.d.ts +19 -0
- package/dist/core/components/badge.js +32 -0
- package/dist/core/components/badge.js.map +1 -0
- package/dist/core/components/button.d.ts +23 -0
- package/dist/core/components/button.js +68 -0
- package/dist/core/components/button.js.map +1 -0
- package/dist/core/components/card.d.ts +19 -0
- package/dist/core/components/card.js +62 -0
- package/dist/core/components/card.js.map +1 -0
- package/dist/core/components/confirm-dialog.d.ts +13 -0
- package/dist/core/components/confirm-dialog.js +47 -0
- package/dist/core/components/confirm-dialog.js.map +1 -0
- package/dist/core/components/fragment.d.ts +12 -0
- package/dist/core/components/fragment.js +62 -0
- package/dist/core/components/fragment.js.map +1 -0
- package/dist/core/components/grid.d.ts +10 -0
- package/dist/core/components/grid.js +16 -0
- package/dist/core/components/grid.js.map +1 -0
- package/dist/core/components/heading.d.ts +11 -0
- package/dist/core/components/heading.js +39 -0
- package/dist/core/components/heading.js.map +1 -0
- package/dist/core/components/index.d.ts +1 -0
- package/dist/core/components/index.js +36 -0
- package/dist/core/components/index.js.map +1 -0
- package/dist/core/components/link.d.ts +18 -0
- package/dist/core/components/link.js +26 -0
- package/dist/core/components/link.js.map +1 -0
- package/dist/core/components/modal.d.ts +13 -0
- package/dist/core/components/modal.js +75 -0
- package/dist/core/components/modal.js.map +1 -0
- package/dist/core/components/segmented-control.d.ts +16 -0
- package/dist/core/components/segmented-control.js +30 -0
- package/dist/core/components/segmented-control.js.map +1 -0
- package/dist/core/components/segmented-pills.d.ts +13 -0
- package/dist/core/components/segmented-pills.js +31 -0
- package/dist/core/components/segmented-pills.js.map +1 -0
- package/dist/core/components/spinner.d.ts +2 -0
- package/dist/core/components/spinner.js +16 -0
- package/dist/core/components/spinner.js.map +1 -0
- package/dist/core/components/stack.d.ts +13 -0
- package/dist/core/components/stack.js +47 -0
- package/dist/core/components/stack.js.map +1 -0
- package/dist/core/components/tabs.d.ts +22 -0
- package/dist/core/components/tabs.js +118 -0
- package/dist/core/components/tabs.js.map +1 -0
- package/dist/core/components/text.d.ts +11 -0
- package/dist/core/components/text.js +18 -0
- package/dist/core/components/text.js.map +1 -0
- package/dist/core/props.d.ts +14 -0
- package/dist/core/props.js +30 -0
- package/dist/core/props.js.map +1 -0
- package/dist/core/registry.d.ts +26 -0
- package/dist/core/registry.js +36 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/renderer.d.ts +16 -0
- package/dist/core/renderer.js +61 -0
- package/dist/core/renderer.js.map +1 -0
- package/dist/core/types.d.ts +55 -0
- package/dist/core/types.js +0 -0
- package/dist/events/event-bridge.d.ts +14 -0
- package/dist/events/event-bridge.js +75 -0
- package/dist/events/event-bridge.js.map +1 -0
- package/dist/events/event-names.d.ts +21 -0
- package/dist/events/event-names.js +22 -0
- package/dist/events/event-names.js.map +1 -0
- package/dist/form/components/base/checkbox.d.ts +4 -0
- package/dist/form/components/base/checkbox.js +22 -0
- package/dist/form/components/base/checkbox.js.map +1 -0
- package/dist/form/components/base/field.d.ts +9 -0
- package/dist/form/components/base/field.js +38 -0
- package/dist/form/components/base/field.js.map +1 -0
- package/dist/form/components/base/input-error.d.ts +4 -0
- package/dist/form/components/base/input-error.js +14 -0
- package/dist/form/components/base/input-error.js.map +1 -0
- package/dist/form/components/base/input.d.ts +3 -0
- package/dist/form/components/base/input.js +16 -0
- package/dist/form/components/base/input.js.map +1 -0
- package/dist/form/components/base/label.d.ts +4 -0
- package/dist/form/components/base/label.js +16 -0
- package/dist/form/components/base/label.js.map +1 -0
- package/dist/form/components/base/password-input.d.ts +7 -0
- package/dist/form/components/base/password-input.js +29 -0
- package/dist/form/components/base/password-input.js.map +1 -0
- package/dist/form/components/base/submit-button.d.ts +6 -0
- package/dist/form/components/base/submit-button.js +46 -0
- package/dist/form/components/base/submit-button.js.map +1 -0
- package/dist/form/components/base/textarea.d.ts +3 -0
- package/dist/form/components/base/textarea.js +15 -0
- package/dist/form/components/base/textarea.js.map +1 -0
- package/dist/form/components/conditions.d.ts +25 -0
- package/dist/form/components/conditions.js +62 -0
- package/dist/form/components/conditions.js.map +1 -0
- package/dist/form/components/context.d.ts +20 -0
- package/dist/form/components/context.js +30 -0
- package/dist/form/components/context.js.map +1 -0
- package/dist/form/components/fields/checkbox.d.ts +16 -0
- package/dist/form/components/fields/checkbox.js +51 -0
- package/dist/form/components/fields/checkbox.js.map +1 -0
- package/dist/form/components/fields/choice.d.ts +14 -0
- package/dist/form/components/fields/choice.js +49 -0
- package/dist/form/components/fields/choice.js.map +1 -0
- package/dist/form/components/fields/date-input.d.ts +20 -0
- package/dist/form/components/fields/date-input.js +33 -0
- package/dist/form/components/fields/date-input.js.map +1 -0
- package/dist/form/components/fields/hidden-input.d.ts +10 -0
- package/dist/form/components/fields/hidden-input.js +12 -0
- package/dist/form/components/fields/hidden-input.js.map +1 -0
- package/dist/form/components/fields/number-input.d.ts +23 -0
- package/dist/form/components/fields/number-input.js +55 -0
- package/dist/form/components/fields/number-input.js.map +1 -0
- package/dist/form/components/fields/password-input.d.ts +29 -0
- package/dist/form/components/fields/password-input.js +73 -0
- package/dist/form/components/fields/password-input.js.map +1 -0
- package/dist/form/components/fields/rich-editor.d.ts +17 -0
- package/dist/form/components/fields/rich-editor.js +302 -0
- package/dist/form/components/fields/rich-editor.js.map +1 -0
- package/dist/form/components/fields/select.d.ts +23 -0
- package/dist/form/components/fields/select.js +182 -0
- package/dist/form/components/fields/select.js.map +1 -0
- package/dist/form/components/fields/submit-button.d.ts +10 -0
- package/dist/form/components/fields/submit-button.js +14 -0
- package/dist/form/components/fields/submit-button.js.map +1 -0
- package/dist/form/components/fields/text-input.d.ts +21 -0
- package/dist/form/components/fields/text-input.js +33 -0
- package/dist/form/components/fields/text-input.js.map +1 -0
- package/dist/form/components/fields/textarea.d.ts +20 -0
- package/dist/form/components/fields/textarea.js +32 -0
- package/dist/form/components/fields/textarea.js.map +1 -0
- package/dist/form/components/form-transport.d.ts +8 -0
- package/dist/form/components/form-transport.js +31 -0
- package/dist/form/components/form-transport.js.map +1 -0
- package/dist/form/components/form.d.ts +21 -0
- package/dist/form/components/form.js +126 -0
- package/dist/form/components/form.js.map +1 -0
- package/dist/form/components/index.d.ts +11 -0
- package/dist/form/components/index.js +12 -0
- package/dist/form/components/resolved-nodes.d.ts +6 -0
- package/dist/form/components/resolved-nodes.js +20 -0
- package/dist/form/components/resolved-nodes.js.map +1 -0
- package/dist/form/components/types.d.ts +7 -0
- package/dist/form/components/types.js +0 -0
- package/dist/form/components/use-controlled-field.d.ts +16 -0
- package/dist/form/components/use-controlled-field.js +33 -0
- package/dist/form/components/use-controlled-field.js.map +1 -0
- package/dist/form/components/use-dependent-field.d.ts +3 -0
- package/dist/form/components/use-dependent-field.js +18 -0
- package/dist/form/components/use-dependent-field.js.map +1 -0
- package/dist/form/components/use-field-commit.d.ts +14 -0
- package/dist/form/components/use-field-commit.js +30 -0
- package/dist/form/components/use-field-commit.js.map +1 -0
- package/dist/form/components/use-form-resolver.d.ts +2 -0
- package/dist/form/components/use-form-resolver.js +57 -0
- package/dist/form/components/use-form-resolver.js.map +1 -0
- package/dist/form/components/values.d.ts +7 -0
- package/dist/form/components/values.js +37 -0
- package/dist/form/components/values.js.map +1 -0
- package/dist/form/index.d.ts +1 -0
- package/dist/form/index.js +33 -0
- package/dist/form/index.js.map +1 -0
- package/dist/form/skeleton.d.ts +2 -0
- package/dist/form/skeleton.js +21 -0
- package/dist/form/skeleton.js.map +1 -0
- package/dist/generated/types.d.ts +17 -0
- package/dist/generated/types.js +0 -0
- package/dist/icons/default-icons.d.ts +3 -0
- package/dist/icons/default-icons.js +44 -0
- package/dist/icons/default-icons.js.map +1 -0
- package/dist/icons/dynamic-lucide-renderer.d.ts +2 -0
- package/dist/icons/dynamic-lucide-renderer.js +18 -0
- package/dist/icons/dynamic-lucide-renderer.js.map +1 -0
- package/dist/icons/icon-renderer.d.ts +14 -0
- package/dist/icons/icon-renderer.js +35 -0
- package/dist/icons/icon-renderer.js.map +1 -0
- package/dist/icons/index.d.ts +2 -0
- package/dist/icons/index.js +2 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +14 -0
- package/dist/inertia.d.ts +17 -0
- package/dist/inertia.js +26 -0
- package/dist/inertia.js.map +1 -0
- package/dist/lattice.css +247 -0
- package/dist/lib/utils.d.ts +4 -0
- package/dist/lib/utils.js +13 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/menu/index.d.ts +1 -0
- package/dist/menu/index.js +2 -0
- package/dist/menu/use-menu.d.ts +2 -0
- package/dist/menu/use-menu.js +9 -0
- package/dist/menu/use-menu.js.map +1 -0
- package/dist/page.d.ts +6 -0
- package/dist/page.js +30 -0
- package/dist/page.js.map +1 -0
- package/dist/provider.d.ts +7 -0
- package/dist/provider.js +19 -0
- package/dist/provider.js.map +1 -0
- package/dist/registry.d.ts +1 -0
- package/dist/registry.js +11 -0
- package/dist/registry.js.map +1 -0
- package/dist/table/bulk.d.ts +18 -0
- package/dist/table/bulk.js +44 -0
- package/dist/table/bulk.js.map +1 -0
- package/dist/table/components/bulk-bar.d.ts +11 -0
- package/dist/table/components/bulk-bar.js +76 -0
- package/dist/table/components/bulk-bar.js.map +1 -0
- package/dist/table/components/column-filter-control.d.ts +14 -0
- package/dist/table/components/column-filter-control.js +244 -0
- package/dist/table/components/column-filter-control.js.map +1 -0
- package/dist/table/components/column-header.d.ts +7 -0
- package/dist/table/components/column-header.js +37 -0
- package/dist/table/components/column-header.js.map +1 -0
- package/dist/table/components/filter-stack-bar.d.ts +7 -0
- package/dist/table/components/filter-stack-bar.js +35 -0
- package/dist/table/components/filter-stack-bar.js.map +1 -0
- package/dist/table/components/filter-value-input.d.ts +11 -0
- package/dist/table/components/filter-value-input.js +82 -0
- package/dist/table/components/filter-value-input.js.map +1 -0
- package/dist/table/components/pagination.d.ts +14 -0
- package/dist/table/components/pagination.js +67 -0
- package/dist/table/components/pagination.js.map +1 -0
- package/dist/table/components/sort-bar.d.ts +7 -0
- package/dist/table/components/sort-bar.js +43 -0
- package/dist/table/components/sort-bar.js.map +1 -0
- package/dist/table/components/table-action-node.d.ts +4 -0
- package/dist/table/components/table-action-node.js +24 -0
- package/dist/table/components/table-action-node.js.map +1 -0
- package/dist/table/components/table-cell.d.ts +5 -0
- package/dist/table/components/table-cell.js +63 -0
- package/dist/table/components/table-cell.js.map +1 -0
- package/dist/table/components/table.d.ts +3 -0
- package/dist/table/components/table.js +189 -0
- package/dist/table/components/table.js.map +1 -0
- package/dist/table/format.d.ts +3 -0
- package/dist/table/format.js +41 -0
- package/dist/table/format.js.map +1 -0
- package/dist/table/index.d.ts +1 -0
- package/dist/table/index.js +10 -0
- package/dist/table/index.js.map +1 -0
- package/dist/table/payload.d.ts +9 -0
- package/dist/table/payload.js +46 -0
- package/dist/table/payload.js.map +1 -0
- package/dist/table/query.d.ts +12 -0
- package/dist/table/query.js +83 -0
- package/dist/table/query.js.map +1 -0
- package/dist/table/types.d.ts +67 -0
- package/dist/table/types.js +0 -0
- package/dist/table/use-table-selection.d.ts +12 -0
- package/dist/table/use-table-selection.js +46 -0
- package/dist/table/use-table-selection.js.map +1 -0
- package/dist/table/use-table.d.ts +19 -0
- package/dist/table/use-table.js +157 -0
- package/dist/table/use-table.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +0 -0
- 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,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,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,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,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,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,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;
|