@lattice-php/lattice 0.12.0 → 0.14.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 (63) hide show
  1. package/dist/core/components/card.js +9 -2
  2. package/dist/core/components/card.js.map +1 -1
  3. package/dist/core/components/collapsible.d.ts +3 -0
  4. package/dist/core/components/collapsible.js +67 -0
  5. package/dist/core/components/collapsible.js.map +1 -0
  6. package/dist/core/components/eager.d.ts +1 -0
  7. package/dist/core/components/eager.js +50 -0
  8. package/dist/core/components/eager.js.map +1 -0
  9. package/dist/core/components/heading.js +10 -8
  10. package/dist/core/components/heading.js.map +1 -1
  11. package/dist/core/components/index.js +5 -1
  12. package/dist/core/components/index.js.map +1 -1
  13. package/dist/core/components/section.js +14 -7
  14. package/dist/core/components/section.js.map +1 -1
  15. package/dist/core/components/tooltip.d.ts +3 -0
  16. package/dist/core/components/tooltip.js +25 -0
  17. package/dist/core/components/tooltip.js.map +1 -0
  18. package/dist/core/renderer.js +1 -1
  19. package/dist/core/use-column-resizing.js +1 -5
  20. package/dist/core/use-column-resizing.js.map +1 -1
  21. package/dist/core/use-column-visibility.d.ts +18 -0
  22. package/dist/core/use-column-visibility.js +91 -0
  23. package/dist/core/use-column-visibility.js.map +1 -0
  24. package/dist/create-app.js +7 -3
  25. package/dist/create-app.js.map +1 -1
  26. package/dist/form/components/base/field.js +1 -1
  27. package/dist/form/components/fields/checkbox.js +2 -2
  28. package/dist/form/components/fields/select.js +3 -2
  29. package/dist/form/components/fields/select.js.map +1 -1
  30. package/dist/form/components/fields/toggle.js +1 -1
  31. package/dist/form/components/index.js +1 -1
  32. package/dist/form/eager.d.ts +1 -0
  33. package/dist/form/eager.js +47 -0
  34. package/dist/form/eager.js.map +1 -0
  35. package/dist/index.d.ts +1 -1
  36. package/dist/index.js +5 -5
  37. package/dist/provider-base.d.ts +10 -0
  38. package/dist/provider-base.js +27 -0
  39. package/dist/provider-base.js.map +1 -0
  40. package/dist/provider.d.ts +4 -7
  41. package/dist/provider.js +9 -22
  42. package/dist/provider.js.map +1 -1
  43. package/dist/registry/eager.d.ts +1 -0
  44. package/dist/registry/eager.js +14 -0
  45. package/dist/registry/eager.js.map +1 -0
  46. package/dist/registry/lazy.d.ts +1 -0
  47. package/dist/registry/lazy.js +14 -0
  48. package/dist/registry/lazy.js.map +1 -0
  49. package/dist/registry.d.ts +1 -1
  50. package/dist/registry.js +2 -14
  51. package/dist/table/components/column-visibility-menu.d.ts +10 -0
  52. package/dist/table/components/column-visibility-menu.js +53 -0
  53. package/dist/table/components/column-visibility-menu.js.map +1 -0
  54. package/dist/table/components/filter-controls.js +1 -1
  55. package/dist/table/components/table.js +37 -18
  56. package/dist/table/components/table.js.map +1 -1
  57. package/dist/table/eager.d.ts +1 -0
  58. package/dist/table/eager.js +11 -0
  59. package/dist/table/eager.js.map +1 -0
  60. package/dist/table/use-table.js +1 -1
  61. package/dist/types/generated.d.ts +24 -0
  62. package/package.json +9 -1
  63. package/dist/registry.js.map +0 -1
@@ -0,0 +1,91 @@
1
+ import { useCallback, useMemo, useState } from "react";
2
+ //#region resources/js/core/use-column-visibility.ts
3
+ function useColumnVisibility({ columns, storageKey }) {
4
+ const toggleableColumns = useMemo(() => columns.filter((column) => column.toggleable === true), [columns]);
5
+ const toggleableKeys = useMemo(() => toggleableColumns.map((column) => column.key), [toggleableColumns]);
6
+ const [overrides, setOverrides] = useState(() => readStoredVisibility(storageKey, toggleableKeys));
7
+ const isVisible = useCallback((column) => {
8
+ if (column.toggleable !== true) return true;
9
+ return overrides[column.key] ?? column.hiddenByDefault !== true;
10
+ }, [overrides]);
11
+ const visibleColumns = useMemo(() => columns.filter((column) => isVisible(column)), [columns, isVisible]);
12
+ const setColumnVisible = useCallback((key, visible) => {
13
+ setOverrides((current) => {
14
+ const next = {
15
+ ...current,
16
+ [key]: visible
17
+ };
18
+ writeStoredVisibility(storageKey, toggleableKeys, next);
19
+ return next;
20
+ });
21
+ }, [storageKey, toggleableKeys]);
22
+ const resetVisibility = useCallback(() => {
23
+ setOverrides({});
24
+ writeStoredVisibility(storageKey, toggleableKeys, {});
25
+ }, [storageKey, toggleableKeys]);
26
+ const hasToggleableColumns = toggleableColumns.length > 0;
27
+ return {
28
+ hasHidden: toggleableColumns.some((column) => !isVisible(column)),
29
+ hasToggleableColumns,
30
+ isVisible,
31
+ resetVisibility,
32
+ setColumnVisible,
33
+ toggleableColumns,
34
+ visibleColumns
35
+ };
36
+ }
37
+ function readStoredVisibility(storageKey, toggleableKeys) {
38
+ if (!storageKey || typeof window === "undefined") return {};
39
+ try {
40
+ const raw = window.localStorage.getItem(storageKey);
41
+ if (raw === null) return {};
42
+ const stored = JSON.parse(raw);
43
+ if (!isStoredColumnVisibility(stored)) {
44
+ removeStoredVisibility(storageKey);
45
+ return {};
46
+ }
47
+ const known = new Set(toggleableKeys);
48
+ const overrides = {};
49
+ for (const [key, value] of Object.entries(stored.overrides)) if (known.has(key) && typeof value === "boolean") overrides[key] = value;
50
+ if (Object.keys(overrides).length === 0) removeStoredVisibility(storageKey);
51
+ return overrides;
52
+ } catch {
53
+ removeStoredVisibility(storageKey);
54
+ return {};
55
+ }
56
+ }
57
+ function writeStoredVisibility(storageKey, toggleableKeys, overrides) {
58
+ if (!storageKey || typeof window === "undefined") return;
59
+ const known = new Set(toggleableKeys);
60
+ const stored = {};
61
+ for (const [key, value] of Object.entries(overrides)) if (known.has(key) && typeof value === "boolean") stored[key] = value;
62
+ if (Object.keys(stored).length === 0) {
63
+ removeStoredVisibility(storageKey);
64
+ return;
65
+ }
66
+ try {
67
+ window.localStorage.setItem(storageKey, JSON.stringify({
68
+ columns: toggleableKeys,
69
+ overrides: stored
70
+ }));
71
+ } catch {
72
+ return;
73
+ }
74
+ }
75
+ function removeStoredVisibility(storageKey) {
76
+ if (typeof window === "undefined") return;
77
+ try {
78
+ window.localStorage.removeItem(storageKey);
79
+ } catch {
80
+ return;
81
+ }
82
+ }
83
+ function isStoredColumnVisibility(value) {
84
+ if (typeof value !== "object" || value === null) return false;
85
+ const record = value;
86
+ return Array.isArray(record.columns) && record.columns.every((column) => typeof column === "string") && typeof record.overrides === "object" && record.overrides !== null && !Array.isArray(record.overrides);
87
+ }
88
+ //#endregion
89
+ export { useColumnVisibility };
90
+
91
+ //# sourceMappingURL=use-column-visibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-column-visibility.js","names":[],"sources":["../../resources/js/core/use-column-visibility.ts"],"sourcesContent":["import { useCallback, useMemo, useState } from \"react\";\n\nexport type ToggleableColumn = {\n key: string;\n label?: string;\n toggleable?: boolean | null;\n hiddenByDefault?: boolean | null;\n};\n\ntype StoredColumnVisibility = {\n columns: string[];\n overrides: Record<string, boolean>;\n};\n\nexport function useColumnVisibility<TColumn extends ToggleableColumn>({\n columns,\n storageKey,\n}: {\n columns: TColumn[];\n storageKey?: string;\n}) {\n const toggleableColumns = useMemo(\n () => columns.filter((column) => column.toggleable === true),\n [columns],\n );\n const toggleableKeys = useMemo(\n () => toggleableColumns.map((column) => column.key),\n [toggleableColumns],\n );\n\n const [overrides, setOverrides] = useState<Record<string, boolean>>(() =>\n readStoredVisibility(storageKey, toggleableKeys),\n );\n\n const isVisible = useCallback(\n (column: ToggleableColumn): boolean => {\n if (column.toggleable !== true) {\n return true;\n }\n\n return overrides[column.key] ?? column.hiddenByDefault !== true;\n },\n [overrides],\n );\n\n const visibleColumns = useMemo(\n () => columns.filter((column) => isVisible(column)),\n [columns, isVisible],\n );\n\n const setColumnVisible = useCallback(\n (key: string, visible: boolean) => {\n setOverrides((current) => {\n const next = { ...current, [key]: visible };\n writeStoredVisibility(storageKey, toggleableKeys, next);\n\n return next;\n });\n },\n [storageKey, toggleableKeys],\n );\n\n const resetVisibility = useCallback(() => {\n setOverrides({});\n writeStoredVisibility(storageKey, toggleableKeys, {});\n }, [storageKey, toggleableKeys]);\n\n const hasToggleableColumns = toggleableColumns.length > 0;\n const hasHidden = toggleableColumns.some((column) => !isVisible(column));\n\n return {\n hasHidden,\n hasToggleableColumns,\n isVisible,\n resetVisibility,\n setColumnVisible,\n toggleableColumns,\n visibleColumns,\n };\n}\n\nfunction readStoredVisibility(\n storageKey: string | undefined,\n toggleableKeys: string[],\n): Record<string, boolean> {\n if (!storageKey || typeof window === \"undefined\") {\n return {};\n }\n\n try {\n const raw = window.localStorage.getItem(storageKey);\n\n if (raw === null) {\n return {};\n }\n\n const stored = JSON.parse(raw) as unknown;\n\n if (!isStoredColumnVisibility(stored)) {\n removeStoredVisibility(storageKey);\n\n return {};\n }\n\n const known = new Set(toggleableKeys);\n const overrides: Record<string, boolean> = {};\n\n for (const [key, value] of Object.entries(stored.overrides)) {\n if (known.has(key) && typeof value === \"boolean\") {\n overrides[key] = value;\n }\n }\n\n if (Object.keys(overrides).length === 0) {\n removeStoredVisibility(storageKey);\n }\n\n return overrides;\n } catch {\n removeStoredVisibility(storageKey);\n\n return {};\n }\n}\n\nfunction writeStoredVisibility(\n storageKey: string | undefined,\n toggleableKeys: string[],\n overrides: Record<string, boolean>,\n): void {\n if (!storageKey || typeof window === \"undefined\") {\n return;\n }\n\n const known = new Set(toggleableKeys);\n const stored: Record<string, boolean> = {};\n\n for (const [key, value] of Object.entries(overrides)) {\n if (known.has(key) && typeof value === \"boolean\") {\n stored[key] = value;\n }\n }\n\n if (Object.keys(stored).length === 0) {\n removeStoredVisibility(storageKey);\n\n return;\n }\n\n try {\n window.localStorage.setItem(\n storageKey,\n JSON.stringify({ columns: toggleableKeys, overrides: stored }),\n );\n } catch {\n return;\n }\n}\n\nfunction removeStoredVisibility(storageKey: string): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n try {\n window.localStorage.removeItem(storageKey);\n } catch {\n return;\n }\n}\n\nfunction isStoredColumnVisibility(value: unknown): value is StoredColumnVisibility {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const record = value as Record<string, unknown>;\n\n return (\n Array.isArray(record.columns) &&\n record.columns.every((column) => typeof column === \"string\") &&\n typeof record.overrides === \"object\" &&\n record.overrides !== null &&\n !Array.isArray(record.overrides)\n );\n}\n"],"mappings":";;AAcA,SAAgB,oBAAsD,EACpE,SACA,cAIC;CACD,MAAM,oBAAoB,cAClB,QAAQ,QAAQ,WAAW,OAAO,eAAe,IAAI,GAC3D,CAAC,OAAO,CACV;CACA,MAAM,iBAAiB,cACf,kBAAkB,KAAK,WAAW,OAAO,GAAG,GAClD,CAAC,iBAAiB,CACpB;CAEA,MAAM,CAAC,WAAW,gBAAgB,eAChC,qBAAqB,YAAY,cAAc,CACjD;CAEA,MAAM,YAAY,aACf,WAAsC;EACrC,IAAI,OAAO,eAAe,MACxB,OAAO;EAGT,OAAO,UAAU,OAAO,QAAQ,OAAO,oBAAoB;CAC7D,GACA,CAAC,SAAS,CACZ;CAEA,MAAM,iBAAiB,cACf,QAAQ,QAAQ,WAAW,UAAU,MAAM,CAAC,GAClD,CAAC,SAAS,SAAS,CACrB;CAEA,MAAM,mBAAmB,aACtB,KAAa,YAAqB;EACjC,cAAc,YAAY;GACxB,MAAM,OAAO;IAAE,GAAG;KAAU,MAAM;GAAQ;GAC1C,sBAAsB,YAAY,gBAAgB,IAAI;GAEtD,OAAO;EACT,CAAC;CACH,GACA,CAAC,YAAY,cAAc,CAC7B;CAEA,MAAM,kBAAkB,kBAAkB;EACxC,aAAa,CAAC,CAAC;EACf,sBAAsB,YAAY,gBAAgB,CAAC,CAAC;CACtD,GAAG,CAAC,YAAY,cAAc,CAAC;CAE/B,MAAM,uBAAuB,kBAAkB,SAAS;CAGxD,OAAO;EACL,WAHgB,kBAAkB,MAAM,WAAW,CAAC,UAAU,MAAM,CAGpE;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;AAEA,SAAS,qBACP,YACA,gBACyB;CACzB,IAAI,CAAC,cAAc,OAAO,WAAW,aACnC,OAAO,CAAC;CAGV,IAAI;EACF,MAAM,MAAM,OAAO,aAAa,QAAQ,UAAU;EAElD,IAAI,QAAQ,MACV,OAAO,CAAC;EAGV,MAAM,SAAS,KAAK,MAAM,GAAG;EAE7B,IAAI,CAAC,yBAAyB,MAAM,GAAG;GACrC,uBAAuB,UAAU;GAEjC,OAAO,CAAC;EACV;EAEA,MAAM,QAAQ,IAAI,IAAI,cAAc;EACpC,MAAM,YAAqC,CAAC;EAE5C,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,SAAS,GACxD,IAAI,MAAM,IAAI,GAAG,KAAK,OAAO,UAAU,WACrC,UAAU,OAAO;EAIrB,IAAI,OAAO,KAAK,SAAS,EAAE,WAAW,GACpC,uBAAuB,UAAU;EAGnC,OAAO;CACT,QAAQ;EACN,uBAAuB,UAAU;EAEjC,OAAO,CAAC;CACV;AACF;AAEA,SAAS,sBACP,YACA,gBACA,WACM;CACN,IAAI,CAAC,cAAc,OAAO,WAAW,aACnC;CAGF,MAAM,QAAQ,IAAI,IAAI,cAAc;CACpC,MAAM,SAAkC,CAAC;CAEzC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,GACjD,IAAI,MAAM,IAAI,GAAG,KAAK,OAAO,UAAU,WACrC,OAAO,OAAO;CAIlB,IAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;EACpC,uBAAuB,UAAU;EAEjC;CACF;CAEA,IAAI;EACF,OAAO,aAAa,QAClB,YACA,KAAK,UAAU;GAAE,SAAS;GAAgB,WAAW;EAAO,CAAC,CAC/D;CACF,QAAQ;EACN;CACF;AACF;AAEA,SAAS,uBAAuB,YAA0B;CACxD,IAAI,OAAO,WAAW,aACpB;CAGF,IAAI;EACF,OAAO,aAAa,WAAW,UAAU;CAC3C,QAAQ;EACN;CACF;AACF;AAEA,SAAS,yBAAyB,OAAiD;CACjF,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,SAAS;CAEf,OACE,MAAM,QAAQ,OAAO,OAAO,KAC5B,OAAO,QAAQ,OAAO,WAAW,OAAO,WAAW,QAAQ,KAC3D,OAAO,OAAO,cAAc,YAC5B,OAAO,cAAc,QACrB,CAAC,MAAM,QAAQ,OAAO,SAAS;AAEnC"}
@@ -1,6 +1,8 @@
1
1
  import { initializeTheme } from "./appearance/index.js";
2
+ import { setDefaultRegistry } from "./core/registry-context.js";
2
3
  import { createLayoutResolver, createPageResolver } from "./inertia.js";
3
- import { Provider } from "./provider.js";
4
+ import { ProviderBase } from "./provider-base.js";
5
+ import { lazyRegistry } from "./registry/lazy.js";
4
6
  import { createInertiaApp } from "@inertiajs/react";
5
7
  import { jsx } from "react/jsx-runtime";
6
8
  //#region resources/js/create-app.tsx
@@ -11,13 +13,15 @@ import { jsx } from "react/jsx-runtime";
11
13
  * initialization. Forwards any other createInertiaApp option.
12
14
  */
13
15
  function createLatticeApp({ registry, sprite, pages = {}, defaultLayout, strictMode = true, ...inertiaOptions } = {}) {
16
+ const activeRegistry = registry ?? lazyRegistry;
17
+ setDefaultRegistry(activeRegistry);
14
18
  const app = createInertiaApp({
15
19
  ...inertiaOptions,
16
20
  strictMode,
17
21
  resolve: createPageResolver(pages),
18
22
  layout: createLayoutResolver({ defaultLayout }),
19
- withApp: (node) => /* @__PURE__ */ jsx(Provider, {
20
- registry,
23
+ withApp: (node) => /* @__PURE__ */ jsx(ProviderBase, {
24
+ registry: activeRegistry,
21
25
  sprite,
22
26
  children: node
23
27
  })
@@ -1 +1 @@
1
- {"version":3,"file":"create-app.js","names":[],"sources":["../resources/js/create-app.tsx"],"sourcesContent":["import { createInertiaApp } from \"@inertiajs/react\";\nimport type { ReactElement } from \"react\";\nimport { initializeTheme } from \"./appearance\";\nimport type { Registry } from \"./core/registry\";\nimport type { SpriteValue } from \"./icons/sprite\";\nimport {\n createLayoutResolver,\n createPageResolver,\n type CreateLayoutResolverOptions,\n type PageModules,\n} from \"./inertia\";\nimport { Provider } from \"./provider\";\n\ntype InertiaAppOptions = NonNullable<Parameters<typeof createInertiaApp>[0]>;\n\nexport type CreateLatticeAppOptions = Omit<\n InertiaAppOptions,\n \"resolve\" | \"layout\" | \"setup\" | \"withApp\" | \"pages\"\n> & {\n registry?: Registry;\n sprite?: SpriteValue;\n /** Normal Inertia page modules, e.g. `import.meta.glob('./pages/**\\/*.tsx')`. */\n pages?: PageModules;\n defaultLayout?: CreateLayoutResolverOptions[\"defaultLayout\"];\n};\n\n/**\n * Bootstrap an Inertia app with the Lattice shell: the page/layout resolvers\n * (server-driven Lattice pages and normal Inertia pages alike), the Provider —\n * registry, sprite, flash toasts via Lattice's own Toaster — and theme\n * initialization. Forwards any other createInertiaApp option.\n */\nexport function createLatticeApp({\n registry,\n sprite,\n pages = {},\n defaultLayout,\n strictMode = true,\n ...inertiaOptions\n}: CreateLatticeAppOptions = {}) {\n const app = createInertiaApp({\n ...inertiaOptions,\n strictMode,\n resolve: createPageResolver(pages),\n layout: createLayoutResolver({ defaultLayout }),\n withApp: (node: ReactElement): ReactElement => (\n <Provider registry={registry} sprite={sprite}>\n {node}\n </Provider>\n ),\n });\n\n initializeTheme();\n\n return app;\n}\n"],"mappings":";;;;;;;;;;;;AAgCA,SAAgB,iBAAiB,EAC/B,UACA,QACA,QAAQ,CAAC,GACT,eACA,aAAa,MACb,GAAG,mBACwB,CAAC,GAAG;CAC/B,MAAM,MAAM,iBAAiB;EAC3B,GAAG;EACH;EACA,SAAS,mBAAmB,KAAK;EACjC,QAAQ,qBAAqB,EAAE,cAAc,CAAC;EAC9C,UAAU,SACR,oBAAC,UAAD;GAAoB;GAAkB;aACnC;EACO,CAAA;CAEd,CAAC;CAED,gBAAgB;CAEhB,OAAO;AACT"}
1
+ {"version":3,"file":"create-app.js","names":[],"sources":["../resources/js/create-app.tsx"],"sourcesContent":["import { createInertiaApp } from \"@inertiajs/react\";\nimport type { ReactElement } from \"react\";\nimport { initializeTheme } from \"./appearance\";\nimport type { Registry } from \"./core/registry\";\nimport { setDefaultRegistry } from \"./core/registry-context\";\nimport type { SpriteValue } from \"./icons/sprite\";\nimport {\n createLayoutResolver,\n createPageResolver,\n type CreateLayoutResolverOptions,\n type PageModules,\n} from \"./inertia\";\nimport { ProviderBase } from \"./provider-base\";\nimport { registry as defaultRegistry } from \"./registry\";\n\ntype InertiaAppOptions = NonNullable<Parameters<typeof createInertiaApp>[0]>;\n\nexport type CreateLatticeAppOptions = Omit<\n InertiaAppOptions,\n \"resolve\" | \"layout\" | \"setup\" | \"withApp\" | \"pages\"\n> & {\n registry?: Registry;\n sprite?: SpriteValue;\n /** Normal Inertia page modules, e.g. `import.meta.glob('./pages/**\\/*.tsx')`. */\n pages?: PageModules;\n defaultLayout?: CreateLayoutResolverOptions[\"defaultLayout\"];\n};\n\n/**\n * Bootstrap an Inertia app with the Lattice shell: the page/layout resolvers\n * (server-driven Lattice pages and normal Inertia pages alike), the Provider —\n * registry, sprite, flash toasts via Lattice's own Toaster — and theme\n * initialization. Forwards any other createInertiaApp option.\n */\nexport function createLatticeApp({\n registry,\n sprite,\n pages = {},\n defaultLayout,\n strictMode = true,\n ...inertiaOptions\n}: CreateLatticeAppOptions = {}) {\n const activeRegistry = registry ?? defaultRegistry;\n\n setDefaultRegistry(activeRegistry);\n\n const app = createInertiaApp({\n ...inertiaOptions,\n strictMode,\n resolve: createPageResolver(pages),\n layout: createLayoutResolver({ defaultLayout }),\n withApp: (node: ReactElement): ReactElement => (\n <ProviderBase registry={activeRegistry} sprite={sprite}>\n {node}\n </ProviderBase>\n ),\n });\n\n initializeTheme();\n\n return app;\n}\n"],"mappings":";;;;;;;;;;;;;;AAkCA,SAAgB,iBAAiB,EAC/B,UACA,QACA,QAAQ,CAAC,GACT,eACA,aAAa,MACb,GAAG,mBACwB,CAAC,GAAG;CAC/B,MAAM,iBAAiB,YAAY;CAEnC,mBAAmB,cAAc;CAEjC,MAAM,MAAM,iBAAiB;EAC3B,GAAG;EACH;EACA,SAAS,mBAAmB,KAAK;EACjC,QAAQ,qBAAqB,EAAE,cAAc,CAAC;EAC9C,UAAU,SACR,oBAAC,cAAD;GAAc,UAAU;GAAwB;aAC7C;EACW,CAAA;CAElB,CAAC;CAED,gBAAgB;CAEhB,OAAO;AACT"}
@@ -1,5 +1,5 @@
1
- import { TextLink } from "../../../core/components/link.js";
2
1
  import { InfoTooltip } from "../../../core/components/info-tooltip.js";
2
+ import { TextLink } from "../../../core/components/link.js";
3
3
  import InputError from "./input-error.js";
4
4
  import { Label } from "./label.js";
5
5
  import { useInTableCell } from "../row-layout-context.js";
@@ -1,10 +1,10 @@
1
1
  import { testIdentity } from "../../../core/test-id.js";
2
2
  import { useFieldScope } from "../field-scope.js";
3
3
  import { useFormValue } from "../values.js";
4
- import { Checkbox } from "../../../core/components/checkbox.js";
5
- import { toBoolean } from "../conditions.js";
6
4
  import { Label } from "../base/label.js";
5
+ import { toBoolean } from "../conditions.js";
7
6
  import { useDependentField } from "../use-dependent-field.js";
7
+ import { Checkbox } from "../../../core/components/checkbox.js";
8
8
  import { useFieldCommit } from "../use-field-commit.js";
9
9
  import { useSeedDefault } from "../use-seed-default.js";
10
10
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -6,11 +6,11 @@ import { postFormAction } from "../form-transport.js";
6
6
  import { useFieldScope } from "../field-scope.js";
7
7
  import { useResolvedNode } from "../resolved-nodes.js";
8
8
  import { useFormValue, useFormValues } from "../values.js";
9
- import { Combobox } from "../../../core/components/combobox.js";
10
- import { controlSurface } from "../../../core/components/control.js";
11
9
  import { FormFieldFrame } from "../base/field.js";
12
10
  import { useDependentField } from "../use-dependent-field.js";
13
11
  import { useFieldCommit } from "../use-field-commit.js";
12
+ import { controlSurface } from "../../../core/components/control.js";
13
+ import { Combobox } from "../../../core/components/combobox.js";
14
14
  import { useCallback, useMemo, useRef, useState } from "react";
15
15
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
16
16
  //#region resources/js/form/components/fields/select.tsx
@@ -132,6 +132,7 @@ var SelectComponent = ({ node }) => {
132
132
  },
133
133
  options,
134
134
  searchPlaceholder: props.searchPlaceholder ?? void 0,
135
+ showSearch: Boolean(searchable),
135
136
  selected,
136
137
  testId: `select-${name}`,
137
138
  trigger: /* @__PURE__ */ jsxs(Fragment$1, { children: [!multiple && selected.length > 0 ? /* @__PURE__ */ jsx("span", { children: labelFor(selected[0]) }) : /* @__PURE__ */ jsx("span", {
@@ -1 +1 @@
1
- {"version":3,"file":"select.js","names":[],"sources":["../../../../resources/js/form/components/fields/select.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { Combobox } from \"@lattice-php/lattice/core/components/combobox\";\nimport { controlSurface } from \"@lattice-php/lattice/core/components/control\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { Option, RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { FormFieldFrame } from \"../base/field\";\nimport { useFormContext } from \"../context\";\nimport { postFormAction } from \"../form-transport\";\nimport { useResolvedNode } from \"../resolved-nodes\";\nimport { useDependentField } from \"../use-dependent-field\";\nimport { useFieldCommit } from \"../use-field-commit\";\nimport { useFieldScope } from \"../field-scope\";\nimport { useFormValue, useFormValues } from \"../values\";\n\nfunction toValues(stored: unknown, fallback: unknown): string[] {\n const source = stored ?? fallback;\n\n if (Array.isArray(source)) {\n return source.map(String);\n }\n\n if (source === undefined || source === null || source === \"\") {\n return [];\n }\n\n return [String(source)];\n}\n\nexport const SelectComponent: RendererComponent<\"field.select\"> = ({ node }) => {\n const { t } = useT(\"lattice\");\n const props = node.props;\n const { action, componentRef, errors } = useFormContext();\n const { hidden, required, readOnly, disabled } = useDependentField(node);\n const { change, blur } = useFieldCommit();\n const resolvedNode = useResolvedNode(node);\n const name = props.name;\n const scope = useFieldScope();\n const domName = scope ? scope.scopedName(name) : name;\n const errorKey = scope ? scope.errorKey(name) : name;\n const searchKey = scope ? scope.errorKey(name) : name;\n const placeholder = props.placeholder || \"Select…\";\n const multiple = props.multiple;\n const searchable = props.searchable;\n const staticOptions = useMemo(\n () => (resolvedNode.props as { options?: Option[] }).options ?? [],\n [resolvedNode.props],\n );\n\n const globalValue = useFormValue(name);\n const values = useFormValues();\n const valuesRef = useRef(values);\n valuesRef.current = values;\n const storedValue = scope ? scope.getValue(name) : globalValue;\n const selected = useMemo(() => toValues(storedValue, props.value), [storedValue, props.value]);\n\n const [open, setOpen] = useState(false);\n const [results, setResults] = useState<Option[] | null>(null);\n const [loading, setLoading] = useState(false);\n const searchAbort = useRef<AbortController | null>(null);\n\n const labels = useMemo(() => {\n const map = new Map<string, string>();\n for (const option of [...staticOptions, ...(results ?? [])]) {\n map.set(option.value, option.label);\n }\n return map;\n }, [staticOptions, results]);\n const labelFor = (value: string) => labels.get(value) ?? value;\n\n const locked = readOnly || disabled;\n\n const search = useCallback(\n (query: string) => {\n searchAbort.current?.abort();\n\n if (query.trim() === \"\") {\n setResults(null);\n setLoading(false);\n\n return;\n }\n\n const controller = new AbortController();\n searchAbort.current = controller;\n setLoading(true);\n\n void postFormAction<{ options?: Option[] }>(\n action,\n componentRef,\n { ...valuesRef.current, _search: searchKey, q: query },\n controller.signal,\n )\n .then((response) => {\n setResults(response?.options ?? []);\n setLoading(false);\n })\n .catch(() => {});\n },\n [action, componentRef, searchKey],\n );\n\n function commit(next: string[]): void {\n change(name, multiple ? next : (next[0] ?? \"\"));\n }\n\n function select(value: string): void {\n if (multiple) {\n commit(\n selected.includes(value) ? selected.filter((item) => item !== value) : [...selected, value],\n );\n\n return;\n }\n\n commit([value]);\n }\n\n function remove(value: string): void {\n commit(selected.filter((item) => item !== value));\n }\n\n if (hidden) {\n return null;\n }\n\n const options = searchable ? (results ?? staticOptions) : staticOptions;\n\n return (\n <FormFieldFrame\n error={errors[errorKey]}\n helperText={props.helperText ?? undefined}\n tooltip={props.tooltip ?? undefined}\n label={props.label ?? \"\"}\n name={name}\n required={required}\n >\n {multiple ? (\n selected.map((value) => (\n <input key={value} name={`${domName}[]`} type=\"hidden\" value={value} />\n ))\n ) : (\n <input name={domName} type=\"hidden\" value={selected[0] ?? \"\"} />\n )}\n\n <div>\n {multiple && selected.length > 0 && (\n <div className=\"mb-1.5 flex flex-wrap gap-1\">\n {selected.map((value) => (\n <span\n className=\"inline-flex items-center gap-1 rounded-lt-sm bg-lt-muted px-2 py-0.5 text-xs\"\n key={value}\n >\n {labelFor(value)}\n {!locked && (\n <button\n aria-label={t(\"form.removeOption\", \"Remove {{label}}\", {\n label: labelFor(value),\n })}\n data-test={`select-${name}-remove-${value}`}\n className=\"text-lt-muted-fg hover:text-lt-fg [&_svg]:size-lt-icon-xs\"\n onClick={() => remove(value)}\n type=\"button\"\n >\n <Icon name=\"x\" />\n </button>\n )}\n </span>\n ))}\n </div>\n )}\n\n <Combobox\n emptyLabel={props.emptyLabel ?? undefined}\n loading={loading}\n multiple={multiple}\n onSearch={searchable ? search : undefined}\n onSelect={select}\n open={open && !locked}\n onOpenChange={(next) => {\n setOpen(next);\n\n if (!next) {\n blur(name);\n }\n }}\n options={options}\n searchPlaceholder={props.searchPlaceholder ?? undefined}\n selected={selected}\n testId={`select-${name}`}\n trigger={\n <>\n {!multiple && selected.length > 0 ? (\n <span>{labelFor(selected[0])}</span>\n ) : (\n <span className=\"text-lt-muted-fg\">{placeholder}</span>\n )}\n <Icon name=\"chevrons-up-down\" className=\"size-lt-icon-md shrink-0 text-lt-muted-fg\" />\n </>\n }\n triggerClassName={cn(\n controlSurface(),\n \"flex items-center justify-between gap-2 text-left\",\n locked && \"cursor-not-allowed opacity-60\",\n )}\n triggerProps={{\n \"aria-haspopup\": \"listbox\",\n autoFocus: props.autoFocus ?? undefined,\n \"data-test\": `select-${name}`,\n disabled: locked,\n tabIndex: props.tabIndex ?? undefined,\n }}\n />\n </div>\n </FormFieldFrame>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"select.js","names":[],"sources":["../../../../resources/js/form/components/fields/select.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport { Combobox } from \"@lattice-php/lattice/core/components/combobox\";\nimport { controlSurface } from \"@lattice-php/lattice/core/components/control\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { Option, RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { FormFieldFrame } from \"../base/field\";\nimport { useFormContext } from \"../context\";\nimport { postFormAction } from \"../form-transport\";\nimport { useResolvedNode } from \"../resolved-nodes\";\nimport { useDependentField } from \"../use-dependent-field\";\nimport { useFieldCommit } from \"../use-field-commit\";\nimport { useFieldScope } from \"../field-scope\";\nimport { useFormValue, useFormValues } from \"../values\";\n\nfunction toValues(stored: unknown, fallback: unknown): string[] {\n const source = stored ?? fallback;\n\n if (Array.isArray(source)) {\n return source.map(String);\n }\n\n if (source === undefined || source === null || source === \"\") {\n return [];\n }\n\n return [String(source)];\n}\n\nexport const SelectComponent: RendererComponent<\"field.select\"> = ({ node }) => {\n const { t } = useT(\"lattice\");\n const props = node.props;\n const { action, componentRef, errors } = useFormContext();\n const { hidden, required, readOnly, disabled } = useDependentField(node);\n const { change, blur } = useFieldCommit();\n const resolvedNode = useResolvedNode(node);\n const name = props.name;\n const scope = useFieldScope();\n const domName = scope ? scope.scopedName(name) : name;\n const errorKey = scope ? scope.errorKey(name) : name;\n const searchKey = scope ? scope.errorKey(name) : name;\n const placeholder = props.placeholder || \"Select…\";\n const multiple = props.multiple;\n const searchable = props.searchable;\n const staticOptions = useMemo(\n () => (resolvedNode.props as { options?: Option[] }).options ?? [],\n [resolvedNode.props],\n );\n\n const globalValue = useFormValue(name);\n const values = useFormValues();\n const valuesRef = useRef(values);\n valuesRef.current = values;\n const storedValue = scope ? scope.getValue(name) : globalValue;\n const selected = useMemo(() => toValues(storedValue, props.value), [storedValue, props.value]);\n\n const [open, setOpen] = useState(false);\n const [results, setResults] = useState<Option[] | null>(null);\n const [loading, setLoading] = useState(false);\n const searchAbort = useRef<AbortController | null>(null);\n\n const labels = useMemo(() => {\n const map = new Map<string, string>();\n for (const option of [...staticOptions, ...(results ?? [])]) {\n map.set(option.value, option.label);\n }\n return map;\n }, [staticOptions, results]);\n const labelFor = (value: string) => labels.get(value) ?? value;\n\n const locked = readOnly || disabled;\n\n const search = useCallback(\n (query: string) => {\n searchAbort.current?.abort();\n\n if (query.trim() === \"\") {\n setResults(null);\n setLoading(false);\n\n return;\n }\n\n const controller = new AbortController();\n searchAbort.current = controller;\n setLoading(true);\n\n void postFormAction<{ options?: Option[] }>(\n action,\n componentRef,\n { ...valuesRef.current, _search: searchKey, q: query },\n controller.signal,\n )\n .then((response) => {\n setResults(response?.options ?? []);\n setLoading(false);\n })\n .catch(() => {});\n },\n [action, componentRef, searchKey],\n );\n\n function commit(next: string[]): void {\n change(name, multiple ? next : (next[0] ?? \"\"));\n }\n\n function select(value: string): void {\n if (multiple) {\n commit(\n selected.includes(value) ? selected.filter((item) => item !== value) : [...selected, value],\n );\n\n return;\n }\n\n commit([value]);\n }\n\n function remove(value: string): void {\n commit(selected.filter((item) => item !== value));\n }\n\n if (hidden) {\n return null;\n }\n\n const options = searchable ? (results ?? staticOptions) : staticOptions;\n\n return (\n <FormFieldFrame\n error={errors[errorKey]}\n helperText={props.helperText ?? undefined}\n tooltip={props.tooltip ?? undefined}\n label={props.label ?? \"\"}\n name={name}\n required={required}\n >\n {multiple ? (\n selected.map((value) => (\n <input key={value} name={`${domName}[]`} type=\"hidden\" value={value} />\n ))\n ) : (\n <input name={domName} type=\"hidden\" value={selected[0] ?? \"\"} />\n )}\n\n <div>\n {multiple && selected.length > 0 && (\n <div className=\"mb-1.5 flex flex-wrap gap-1\">\n {selected.map((value) => (\n <span\n className=\"inline-flex items-center gap-1 rounded-lt-sm bg-lt-muted px-2 py-0.5 text-xs\"\n key={value}\n >\n {labelFor(value)}\n {!locked && (\n <button\n aria-label={t(\"form.removeOption\", \"Remove {{label}}\", {\n label: labelFor(value),\n })}\n data-test={`select-${name}-remove-${value}`}\n className=\"text-lt-muted-fg hover:text-lt-fg [&_svg]:size-lt-icon-xs\"\n onClick={() => remove(value)}\n type=\"button\"\n >\n <Icon name=\"x\" />\n </button>\n )}\n </span>\n ))}\n </div>\n )}\n\n <Combobox\n emptyLabel={props.emptyLabel ?? undefined}\n loading={loading}\n multiple={multiple}\n onSearch={searchable ? search : undefined}\n onSelect={select}\n open={open && !locked}\n onOpenChange={(next) => {\n setOpen(next);\n\n if (!next) {\n blur(name);\n }\n }}\n options={options}\n searchPlaceholder={props.searchPlaceholder ?? undefined}\n showSearch={Boolean(searchable)}\n selected={selected}\n testId={`select-${name}`}\n trigger={\n <>\n {!multiple && selected.length > 0 ? (\n <span>{labelFor(selected[0])}</span>\n ) : (\n <span className=\"text-lt-muted-fg\">{placeholder}</span>\n )}\n <Icon name=\"chevrons-up-down\" className=\"size-lt-icon-md shrink-0 text-lt-muted-fg\" />\n </>\n }\n triggerClassName={cn(\n controlSurface(),\n \"flex items-center justify-between gap-2 text-left\",\n locked && \"cursor-not-allowed opacity-60\",\n )}\n triggerProps={{\n \"aria-haspopup\": \"listbox\",\n autoFocus: props.autoFocus ?? undefined,\n \"data-test\": `select-${name}`,\n disabled: locked,\n tabIndex: props.tabIndex ?? undefined,\n }}\n />\n </div>\n </FormFieldFrame>\n );\n};\n"],"mappings":"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"}
@@ -3,8 +3,8 @@ import { testIdentity } from "../../../core/test-id.js";
3
3
  import { useFormContext } from "../context.js";
4
4
  import { useFieldScope } from "../field-scope.js";
5
5
  import { useFormValue } from "../values.js";
6
- import { toBoolean } from "../conditions.js";
7
6
  import { FormFieldFrame } from "../base/field.js";
7
+ import { toBoolean } from "../conditions.js";
8
8
  import { useDependentField } from "../use-dependent-field.js";
9
9
  import { useFieldCommit } from "../use-field-commit.js";
10
10
  import { useSeedDefault } from "../use-seed-default.js";
@@ -1,10 +1,10 @@
1
- import { FormComponent } from "./form.js";
2
1
  import { BuilderComponent } from "./fields/builder.js";
3
2
  import { CheckboxComponent } from "./fields/checkbox.js";
4
3
  import { ChoiceComponent } from "./fields/choice.js";
5
4
  import { DateInputComponent } from "./fields/date-input.js";
6
5
  import { DateTimeInputComponent } from "./fields/date-time-input.js";
7
6
  import { FileUploadComponent } from "./fields/file-upload.js";
7
+ import { FormComponent } from "./form.js";
8
8
  import { HiddenInputComponent } from "./fields/hidden-input.js";
9
9
  import { NumberInputComponent } from "./fields/number-input.js";
10
10
  import { OtpInputComponent } from "./fields/otp-input.js";
@@ -0,0 +1 @@
1
+ export declare const eagerFormComponents: import('../core/registry').Plugin;
@@ -0,0 +1,47 @@
1
+ import { createPlugin, eagerComponent } from "../core/registry.js";
2
+ import { BuilderComponent } from "./components/fields/builder.js";
3
+ import { CheckboxComponent } from "./components/fields/checkbox.js";
4
+ import { ChoiceComponent } from "./components/fields/choice.js";
5
+ import { DateInputComponent } from "./components/fields/date-input.js";
6
+ import { DateTimeInputComponent } from "./components/fields/date-time-input.js";
7
+ import { FileUploadComponent } from "./components/fields/file-upload.js";
8
+ import { FormComponent } from "./components/form.js";
9
+ import { HiddenInputComponent } from "./components/fields/hidden-input.js";
10
+ import { NumberInputComponent } from "./components/fields/number-input.js";
11
+ import { OtpInputComponent } from "./components/fields/otp-input.js";
12
+ import { PasswordInputComponent } from "./components/fields/password-input.js";
13
+ import { RepeaterComponent } from "./components/fields/repeater.js";
14
+ import { SelectComponent } from "./components/fields/select.js";
15
+ import { TextareaComponent } from "./components/fields/textarea.js";
16
+ import { TextInputComponent } from "./components/fields/text-input.js";
17
+ import { TimeInputComponent } from "./components/fields/time-input.js";
18
+ import { ToggleComponent } from "./components/fields/toggle.js";
19
+ import { RichEditorComponent } from "./components/fields/rich-editor.js";
20
+ //#region resources/js/form/eager.ts
21
+ var eagerFormComponents = createPlugin({
22
+ components: {
23
+ form: eagerComponent(FormComponent),
24
+ "field.builder": eagerComponent(BuilderComponent),
25
+ "field.checkbox": eagerComponent(CheckboxComponent),
26
+ "field.choice": eagerComponent(ChoiceComponent),
27
+ "field.date-input": eagerComponent(DateInputComponent),
28
+ "field.date-time-input": eagerComponent(DateTimeInputComponent),
29
+ "field.file-upload": eagerComponent(FileUploadComponent),
30
+ "field.hidden-input": eagerComponent(HiddenInputComponent),
31
+ "field.number-input": eagerComponent(NumberInputComponent),
32
+ "field.otp": eagerComponent(OtpInputComponent),
33
+ "field.password-input": eagerComponent(PasswordInputComponent),
34
+ "field.repeater": eagerComponent(RepeaterComponent),
35
+ "field.rich-editor": eagerComponent(RichEditorComponent),
36
+ "field.select": eagerComponent(SelectComponent),
37
+ "field.textarea": eagerComponent(TextareaComponent),
38
+ "field.text-input": eagerComponent(TextInputComponent),
39
+ "field.time-input": eagerComponent(TimeInputComponent),
40
+ "field.toggle": eagerComponent(ToggleComponent)
41
+ },
42
+ name: "lattice/form"
43
+ });
44
+ //#endregion
45
+ export { eagerFormComponents };
46
+
47
+ //# sourceMappingURL=eager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eager.js","names":[],"sources":["../../resources/js/form/eager.ts"],"sourcesContent":["import { createPlugin, eagerComponent } from \"@lattice-php/lattice/core/registry\";\nimport {\n BuilderComponent,\n CheckboxComponent,\n ChoiceComponent,\n DateInputComponent,\n DateTimeInputComponent,\n FileUploadComponent,\n FormComponent,\n HiddenInputComponent,\n NumberInputComponent,\n OtpInputComponent,\n PasswordInputComponent,\n RepeaterComponent,\n SelectComponent,\n TextareaComponent,\n TextInputComponent,\n TimeInputComponent,\n ToggleComponent,\n} from \"./components\";\nimport { RichEditorComponent } from \"./components/fields/rich-editor\";\n\nexport const eagerFormComponents = createPlugin({\n components: {\n form: eagerComponent(FormComponent),\n \"field.builder\": eagerComponent(BuilderComponent),\n \"field.checkbox\": eagerComponent(CheckboxComponent),\n \"field.choice\": eagerComponent(ChoiceComponent),\n \"field.date-input\": eagerComponent(DateInputComponent),\n \"field.date-time-input\": eagerComponent(DateTimeInputComponent),\n \"field.file-upload\": eagerComponent(FileUploadComponent),\n \"field.hidden-input\": eagerComponent(HiddenInputComponent),\n \"field.number-input\": eagerComponent(NumberInputComponent),\n \"field.otp\": eagerComponent(OtpInputComponent),\n \"field.password-input\": eagerComponent(PasswordInputComponent),\n \"field.repeater\": eagerComponent(RepeaterComponent),\n \"field.rich-editor\": eagerComponent(RichEditorComponent),\n \"field.select\": eagerComponent(SelectComponent),\n \"field.textarea\": eagerComponent(TextareaComponent),\n \"field.text-input\": eagerComponent(TextInputComponent),\n \"field.time-input\": eagerComponent(TimeInputComponent),\n \"field.toggle\": eagerComponent(ToggleComponent),\n },\n name: \"lattice/form\",\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAsBA,IAAa,sBAAsB,aAAa;CAC9C,YAAY;EACV,MAAM,eAAe,aAAa;EAClC,iBAAiB,eAAe,gBAAgB;EAChD,kBAAkB,eAAe,iBAAiB;EAClD,gBAAgB,eAAe,eAAe;EAC9C,oBAAoB,eAAe,kBAAkB;EACrD,yBAAyB,eAAe,sBAAsB;EAC9D,qBAAqB,eAAe,mBAAmB;EACvD,sBAAsB,eAAe,oBAAoB;EACzD,sBAAsB,eAAe,oBAAoB;EACzD,aAAa,eAAe,iBAAiB;EAC7C,wBAAwB,eAAe,sBAAsB;EAC7D,kBAAkB,eAAe,iBAAiB;EAClD,qBAAqB,eAAe,mBAAmB;EACvD,gBAAgB,eAAe,eAAe;EAC9C,kBAAkB,eAAe,iBAAiB;EAClD,oBAAoB,eAAe,kBAAkB;EACrD,oBAAoB,eAAe,kBAAkB;EACrD,gBAAgB,eAAe,eAAe;CAChD;CACA,MAAM;AACR,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { registry } from './registry';
1
+ export { lazyRegistry, registry } from './registry';
2
2
  export { useChat } from './chat/use-chat';
3
3
  export { chatPlugin } from './chat';
4
4
  export { getActionEffects, isActionEffect, dispatchEffects, dispatchActionError, } from './effects/dispatch';
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { initializeTheme, updateAppearance, useAppearance } from "./appearance/index.js";
2
+ import { useColumnRegistry, useComponentRegistry } from "./core/registry-context.js";
2
3
  import { LATTICE_EVENT } from "./events/event-names.js";
3
4
  import { LATTICE_REF_HEADER, withRefHeader } from "./core/component-ref.js";
4
5
  import { withHeaders } from "./core/headers.js";
5
6
  import { Icon, SpriteProvider } from "./icons/sprite.js";
6
7
  import { IconRenderer, IconRendererProvider } from "./icons/icon-renderer.js";
7
8
  import { CollapsedContext, useCollapsed } from "./core/collapsed-context.js";
8
- import { useColumnRegistry, useComponentRegistry } from "./core/registry-context.js";
9
9
  import { Renderer } from "./core/renderer.js";
10
10
  import { onToast, showToast } from "./toast/toast.js";
11
11
  import { onCallout } from "./toast/callout.js";
@@ -20,12 +20,12 @@ import { layoutComponents } from "./layout/components.js";
20
20
  import SchemaLayout from "./layout/schema-layout.js";
21
21
  import { RealtimeListeners } from "./realtime/listeners.js";
22
22
  import { createLayoutResolver, createPageResolver, pageComponentName, withVisitHeaders } from "./inertia.js";
23
+ import { Toaster } from "./toast/toaster.js";
23
24
  import { useChat } from "./chat/use-chat.js";
24
25
  import { chatPlugin } from "./chat/index.js";
25
26
  import { copyToClipboard, useClipboard } from "./clipboard/index.js";
26
- import { registry } from "./registry.js";
27
- import { Toaster } from "./toast/toaster.js";
28
- import { Provider } from "./provider.js";
27
+ import { lazyRegistry } from "./registry/lazy.js";
29
28
  import { createLatticeApp } from "./create-app.js";
29
+ import { Provider } from "./provider.js";
30
30
  import { columnCell } from "./table/registry.js";
31
- export { Callouts, EventBridge, Icon, IconRenderer, IconRendererProvider, LATTICE_EVENT, LATTICE_REF_HEADER, OutletContext, Provider, RealtimeListeners, Renderer, SchemaLayout, CollapsedContext as SidebarCollapsedContext, SpriteProvider, Toaster, builtinEffectHandlers, chatPlugin, columnCell, copyToClipboard, createLatticeApp, createLayoutResolver, createPageResolver, createPlugin, createRegistry, dispatchActionError, dispatchEffects, eagerComponent, effectHandler, extendRegistry, getActionEffects, initializeTheme, isActionEffect, layoutComponents, lazyComponent, mergeEffectHandlers, onCallout, onToast, pageComponentName, registry, showToast, updateAppearance, useAppearance, useChat, useClipboard, useColumnRegistry, useComponentRegistry, useEffectDispatcher, useCollapsed as useSidebarCollapsed, withHeaders, withRefHeader, withVisitHeaders };
31
+ export { Callouts, EventBridge, Icon, IconRenderer, IconRendererProvider, LATTICE_EVENT, LATTICE_REF_HEADER, OutletContext, Provider, RealtimeListeners, Renderer, SchemaLayout, CollapsedContext as SidebarCollapsedContext, SpriteProvider, Toaster, builtinEffectHandlers, chatPlugin, columnCell, copyToClipboard, createLatticeApp, createLayoutResolver, createPageResolver, createPlugin, createRegistry, dispatchActionError, dispatchEffects, eagerComponent, effectHandler, extendRegistry, getActionEffects, initializeTheme, isActionEffect, layoutComponents, lazyComponent, lazyRegistry, mergeEffectHandlers, onCallout, onToast, pageComponentName, lazyRegistry as registry, showToast, updateAppearance, useAppearance, useChat, useClipboard, useColumnRegistry, useComponentRegistry, useEffectDispatcher, useCollapsed as useSidebarCollapsed, withHeaders, withRefHeader, withVisitHeaders };
@@ -0,0 +1,10 @@
1
+ import { ReactNode } from 'react';
2
+ import { Registry } from './core/registry';
3
+ import { SpriteValue } from './icons/sprite';
4
+ export type ProviderBaseProps = {
5
+ children: ReactNode;
6
+ registry: Registry;
7
+ sprite?: SpriteValue;
8
+ toaster?: boolean;
9
+ };
10
+ export declare function ProviderBase({ children, registry, sprite, toaster, }: ProviderBaseProps): import("react").JSX.Element;
@@ -0,0 +1,27 @@
1
+ import { updateAppearance } from "./appearance/index.js";
2
+ import { RegistryContext } from "./core/registry-context.js";
3
+ import { SpriteProvider } from "./icons/sprite.js";
4
+ import { EventBridge } from "./events/event-bridge.js";
5
+ import { useFlashEffects } from "./effects/use-flash-effects.js";
6
+ import { Toaster } from "./toast/toaster.js";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ //#region resources/js/provider-base.tsx
9
+ var defaultSprite = { href: "" };
10
+ function ProviderBase({ children, registry, sprite = defaultSprite, toaster = true }) {
11
+ useFlashEffects();
12
+ return /* @__PURE__ */ jsx(RegistryContext.Provider, {
13
+ value: registry,
14
+ children: /* @__PURE__ */ jsxs(SpriteProvider, {
15
+ sprite,
16
+ children: [
17
+ children,
18
+ /* @__PURE__ */ jsx(EventBridge, { onAppearanceChange: updateAppearance }),
19
+ toaster ? /* @__PURE__ */ jsx(Toaster, {}) : null
20
+ ]
21
+ })
22
+ });
23
+ }
24
+ //#endregion
25
+ export { ProviderBase };
26
+
27
+ //# sourceMappingURL=provider-base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-base.js","names":[],"sources":["../resources/js/provider-base.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { Registry } from \"./core/registry\";\nimport { RegistryContext } from \"./core/registry-context\";\nimport { useFlashEffects } from \"./effects/use-flash-effects\";\nimport { EventBridge } from \"./events/event-bridge\";\nimport type { SpriteValue } from \"./icons/sprite\";\nimport { SpriteProvider } from \"./icons/sprite\";\nimport { Toaster } from \"./toast\";\nimport { updateAppearance } from \"./appearance\";\n\nconst defaultSprite: SpriteValue = { href: \"\" };\n\nexport type ProviderBaseProps = {\n children: ReactNode;\n registry: Registry;\n sprite?: SpriteValue;\n toaster?: boolean;\n};\n\nexport function ProviderBase({\n children,\n registry,\n sprite = defaultSprite,\n toaster = true,\n}: ProviderBaseProps) {\n useFlashEffects();\n\n return (\n <RegistryContext.Provider value={registry}>\n <SpriteProvider sprite={sprite}>\n {children}\n <EventBridge onAppearanceChange={updateAppearance} />\n {toaster ? <Toaster /> : null}\n </SpriteProvider>\n </RegistryContext.Provider>\n );\n}\n"],"mappings":";;;;;;;;AAUA,IAAM,gBAA6B,EAAE,MAAM,GAAG;AAS9C,SAAgB,aAAa,EAC3B,UACA,UACA,SAAS,eACT,UAAU,QACU;CACpB,gBAAgB;CAEhB,OACE,oBAAC,gBAAgB,UAAjB;EAA0B,OAAO;YAC/B,qBAAC,gBAAD;GAAwB;aAAxB;IACG;IACD,oBAAC,aAAD,EAAa,oBAAoB,iBAAmB,CAAA;IACnD,UAAU,oBAAC,SAAD,CAAU,CAAA,IAAI;GACX;;CACQ,CAAA;AAE9B"}
@@ -1,10 +1,7 @@
1
- import { ReactNode } from 'react';
2
- import { SpriteValue } from './icons/sprite';
3
1
  import { Registry } from './core/registry';
4
- export declare function Provider({ children, registry, sprite, toaster, }: {
5
- children: ReactNode;
2
+ import { ProviderBaseProps } from './provider-base';
3
+ type ProviderProps = Omit<ProviderBaseProps, "registry"> & {
6
4
  registry?: Registry;
7
- sprite?: SpriteValue;
8
- toaster?: boolean;
9
- }): import("react").JSX.Element;
5
+ };
6
+ export declare function Provider({ registry, ...props }: ProviderProps): import("react").JSX.Element;
10
7
  export { useComponentRegistry, useColumnRegistry, useEffectHandlerRegistry, } from './core/registry-context';
package/dist/provider.js CHANGED
@@ -1,26 +1,13 @@
1
- import { updateAppearance } from "./appearance/index.js";
2
- import { SpriteProvider } from "./icons/sprite.js";
3
- import { RegistryContext, setDefaultRegistry, useColumnRegistry, useComponentRegistry, useEffectHandlerRegistry } from "./core/registry-context.js";
4
- import { EventBridge } from "./events/event-bridge.js";
5
- import { registry } from "./registry.js";
6
- import { Toaster } from "./toast/toaster.js";
7
- import { useFlashEffects } from "./effects/use-flash-effects.js";
8
- import { jsx, jsxs } from "react/jsx-runtime";
1
+ import { setDefaultRegistry, useColumnRegistry, useComponentRegistry, useEffectHandlerRegistry } from "./core/registry-context.js";
2
+ import { ProviderBase } from "./provider-base.js";
3
+ import { lazyRegistry } from "./registry/lazy.js";
4
+ import { jsx } from "react/jsx-runtime";
9
5
  //#region resources/js/provider.tsx
10
- setDefaultRegistry(registry);
11
- var defaultSprite = { href: "" };
12
- function Provider({ children, registry: registry$1 = registry, sprite = defaultSprite, toaster = true }) {
13
- useFlashEffects();
14
- return /* @__PURE__ */ jsx(RegistryContext.Provider, {
15
- value: registry$1,
16
- children: /* @__PURE__ */ jsxs(SpriteProvider, {
17
- sprite,
18
- children: [
19
- children,
20
- /* @__PURE__ */ jsx(EventBridge, { onAppearanceChange: updateAppearance }),
21
- toaster ? /* @__PURE__ */ jsx(Toaster, {}) : null
22
- ]
23
- })
6
+ setDefaultRegistry(lazyRegistry);
7
+ function Provider({ registry = lazyRegistry, ...props }) {
8
+ return /* @__PURE__ */ jsx(ProviderBase, {
9
+ ...props,
10
+ registry
24
11
  });
25
12
  }
26
13
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","names":[],"sources":["../resources/js/provider.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type { SpriteValue } from \"./icons/sprite\";\nimport { SpriteProvider } from \"./icons/sprite\";\nimport { registry as defaultRegistry } from \"./registry\";\nimport type { Registry } from \"./core/registry\";\nimport { RegistryContext, setDefaultRegistry } from \"./core/registry-context\";\nimport { Toaster } from \"./toast\";\nimport { updateAppearance } from \"./appearance\";\nimport { EventBridge } from \"./events/event-bridge\";\nimport { useFlashEffects } from \"./effects/use-flash-effects\";\n\n// Register the default registry so selectors work outside <Provider>.\n// This module is always loaded after registry.ts finishes, so defaultRegistry\n// is guaranteed to be defined here.\nsetDefaultRegistry(defaultRegistry);\n\nconst defaultSprite: SpriteValue = { href: \"\" };\n\nexport function Provider({\n children,\n registry = defaultRegistry,\n sprite = defaultSprite,\n toaster = true,\n}: {\n children: ReactNode;\n registry?: Registry;\n sprite?: SpriteValue;\n toaster?: boolean;\n}) {\n useFlashEffects();\n\n return (\n <RegistryContext.Provider value={registry}>\n <SpriteProvider sprite={sprite}>\n {children}\n <EventBridge onAppearanceChange={updateAppearance} />\n {toaster ? <Toaster /> : null}\n </SpriteProvider>\n </RegistryContext.Provider>\n );\n}\n\nexport {\n useComponentRegistry,\n useColumnRegistry,\n useEffectHandlerRegistry,\n} from \"./core/registry-context\";\n"],"mappings":";;;;;;;;;AAcA,mBAAmB,QAAe;AAElC,IAAM,gBAA6B,EAAE,MAAM,GAAG;AAE9C,SAAgB,SAAS,EACvB,UACA,UAAA,aAAW,UACX,SAAS,eACT,UAAU,QAMT;CACD,gBAAgB;CAEhB,OACE,oBAAC,gBAAgB,UAAjB;EAA0B,OAAO;YAC/B,qBAAC,gBAAD;GAAwB;aAAxB;IACG;IACD,oBAAC,aAAD,EAAa,oBAAoB,iBAAmB,CAAA;IACnD,UAAU,oBAAC,SAAD,CAAU,CAAA,IAAI;GACX;;CACQ,CAAA;AAE9B"}
1
+ {"version":3,"file":"provider.js","names":[],"sources":["../resources/js/provider.tsx"],"sourcesContent":["import { registry as defaultRegistry } from \"./registry\";\nimport type { Registry } from \"./core/registry\";\nimport { setDefaultRegistry } from \"./core/registry-context\";\nimport { ProviderBase, type ProviderBaseProps } from \"./provider-base\";\n\n// Register the default registry so selectors work outside <Provider>.\n// This module is always loaded after registry.ts finishes, so defaultRegistry\n// is guaranteed to be defined here.\nsetDefaultRegistry(defaultRegistry);\n\ntype ProviderProps = Omit<ProviderBaseProps, \"registry\"> & {\n registry?: Registry;\n};\n\nexport function Provider({ registry = defaultRegistry, ...props }: ProviderProps) {\n return <ProviderBase {...props} registry={registry} />;\n}\n\nexport {\n useComponentRegistry,\n useColumnRegistry,\n useEffectHandlerRegistry,\n} from \"./core/registry-context\";\n"],"mappings":";;;;;AAQA,mBAAmB,YAAe;AAMlC,SAAgB,SAAS,EAAE,WAAW,cAAiB,GAAG,SAAwB;CAChF,OAAO,oBAAC,cAAD;EAAc,GAAI;EAAiB;CAAW,CAAA;AACvD"}
@@ -0,0 +1 @@
1
+ export declare const eagerRegistry: import('../core/registry').Registry;
@@ -0,0 +1,14 @@
1
+ import { createRegistry } from "../core/registry.js";
2
+ import { layoutComponents } from "../layout/components.js";
3
+ import { actionComponents } from "../action/index.js";
4
+ import { chatPlugin } from "../chat/index.js";
5
+ import { remoteComponents } from "../remote/index.js";
6
+ import { eagerFormComponents } from "../form/eager.js";
7
+ import { eagerCoreComponents } from "../core/components/eager.js";
8
+ import { eagerTableComponents } from "../table/eager.js";
9
+ //#region resources/js/registry/eager.ts
10
+ var eagerRegistry = createRegistry(eagerCoreComponents, actionComponents, eagerFormComponents, layoutComponents, eagerTableComponents, chatPlugin, remoteComponents);
11
+ //#endregion
12
+ export { eagerRegistry };
13
+
14
+ //# sourceMappingURL=eager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eager.js","names":[],"sources":["../../resources/js/registry/eager.ts"],"sourcesContent":["import { createRegistry } from \"@lattice-php/lattice/core/registry\";\nimport { actionComponents } from \"../action\";\nimport { chatPlugin } from \"../chat\";\nimport { eagerCoreComponents } from \"../core/components/eager\";\nimport { eagerFormComponents } from \"../form/eager\";\nimport { layoutComponents } from \"../layout/components\";\nimport { remoteComponents } from \"../remote\";\nimport { eagerTableComponents } from \"../table/eager\";\n\nexport const eagerRegistry = createRegistry(\n eagerCoreComponents,\n actionComponents,\n eagerFormComponents,\n layoutComponents,\n eagerTableComponents,\n chatPlugin,\n remoteComponents,\n);\n"],"mappings":";;;;;;;;;AASA,IAAa,gBAAgB,eAC3B,qBACA,kBACA,qBACA,kBACA,sBACA,YACA,gBACF"}
@@ -0,0 +1 @@
1
+ export declare const lazyRegistry: import('../core/registry').Registry;
@@ -0,0 +1,14 @@
1
+ import { createRegistry } from "../core/registry.js";
2
+ import { layoutComponents } from "../layout/components.js";
3
+ import { actionComponents } from "../action/index.js";
4
+ import { chatPlugin } from "../chat/index.js";
5
+ import { coreComponents } from "../core/components/index.js";
6
+ import { formComponents } from "../form/index.js";
7
+ import { remoteComponents } from "../remote/index.js";
8
+ import { tableComponents } from "../table/index.js";
9
+ //#region resources/js/registry/lazy.ts
10
+ var lazyRegistry = createRegistry(coreComponents, actionComponents, formComponents, layoutComponents, tableComponents, chatPlugin, remoteComponents);
11
+ //#endregion
12
+ export { lazyRegistry };
13
+
14
+ //# sourceMappingURL=lazy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.js","names":[],"sources":["../../resources/js/registry/lazy.ts"],"sourcesContent":["import { createRegistry } from \"@lattice-php/lattice/core/registry\";\nimport { actionComponents } from \"../action\";\nimport { chatPlugin } from \"../chat\";\nimport { coreComponents } from \"../core/components\";\nimport { formComponents } from \"../form\";\nimport { layoutComponents } from \"../layout/components\";\nimport { remoteComponents } from \"../remote\";\nimport { tableComponents } from \"../table\";\n\nexport const lazyRegistry = createRegistry(\n coreComponents,\n actionComponents,\n formComponents,\n layoutComponents,\n tableComponents,\n chatPlugin,\n remoteComponents,\n);\n"],"mappings":";;;;;;;;;AASA,IAAa,eAAe,eAC1B,gBACA,kBACA,gBACA,kBACA,iBACA,YACA,gBACF"}
@@ -1 +1 @@
1
- export declare const registry: import('./core/registry').Registry;
1
+ export { lazyRegistry, lazyRegistry as registry } from './registry/lazy';
package/dist/registry.js CHANGED
@@ -1,14 +1,2 @@
1
- import { createRegistry } from "./core/registry.js";
2
- import { layoutComponents } from "./layout/components.js";
3
- import { actionComponents } from "./action/index.js";
4
- import { chatPlugin } from "./chat/index.js";
5
- import { coreComponents } from "./core/components/index.js";
6
- import { formComponents } from "./form/index.js";
7
- import { remoteComponents } from "./remote/index.js";
8
- import { tableComponents } from "./table/index.js";
9
- //#region resources/js/registry.ts
10
- var registry = createRegistry(coreComponents, actionComponents, formComponents, layoutComponents, tableComponents, chatPlugin, remoteComponents);
11
- //#endregion
12
- export { registry };
13
-
14
- //# sourceMappingURL=registry.js.map
1
+ import { lazyRegistry } from "./registry/lazy.js";
2
+ export { lazyRegistry, lazyRegistry as registry };
@@ -0,0 +1,10 @@
1
+ import { ToggleableColumn } from '../../core/use-column-visibility';
2
+ export declare function ColumnVisibilityMenu({ columns, hasHidden, isVisible, onReset, onToggle, processing, visibleColumnCount, }: {
3
+ columns: ToggleableColumn[];
4
+ hasHidden: boolean;
5
+ isVisible: (column: ToggleableColumn) => boolean;
6
+ onReset: () => void;
7
+ onToggle: (key: string, visible: boolean) => void;
8
+ processing: boolean;
9
+ visibleColumnCount: number;
10
+ }): import("react").JSX.Element;