@lattice-php/lattice 0.20.0 → 0.21.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 (199) hide show
  1. package/dist/action/components/action-form.d.ts +6 -1
  2. package/dist/action/components/action-form.js +34 -49
  3. package/dist/action/components/action-form.js.map +1 -1
  4. package/dist/action/components/action-trigger-provider.d.ts +1 -1
  5. package/dist/action/components/action-trigger-provider.js.map +1 -1
  6. package/dist/action/hooks/use-action.d.ts +1 -1
  7. package/dist/action/hooks/use-action.js +3 -1
  8. package/dist/action/hooks/use-action.js.map +1 -1
  9. package/dist/action/index.d.ts +0 -2
  10. package/dist/action/index.js +1 -2
  11. package/dist/chat/plugin.d.ts +0 -1
  12. package/dist/chat/plugin.js.map +1 -1
  13. package/dist/clipboard/index.d.ts +0 -4
  14. package/dist/clipboard/index.js +1 -15
  15. package/dist/{events → core}/event-names.js +1 -1
  16. package/dist/core/event-names.js.map +1 -0
  17. package/dist/core/hooks/use-window-event.d.ts +8 -0
  18. package/dist/core/hooks/use-window-event.js +22 -0
  19. package/dist/core/hooks/use-window-event.js.map +1 -0
  20. package/dist/core/index.js +3 -3
  21. package/dist/core/types.d.ts +8 -73
  22. package/dist/create-app.js +1 -1
  23. package/dist/effects/dispatch.js +1 -1
  24. package/dist/effects/dispatch.js.map +1 -1
  25. package/dist/effects/registry.d.ts +2 -18
  26. package/dist/effects/registry.js +4 -8
  27. package/dist/effects/registry.js.map +1 -1
  28. package/dist/event-bridge.js +10 -23
  29. package/dist/event-bridge.js.map +1 -1
  30. package/dist/form/components/fields/date-picker-field.js +1 -1
  31. package/dist/form/components/fields/file-upload.js +4 -6
  32. package/dist/form/components/fields/file-upload.js.map +1 -1
  33. package/dist/form/components/fields/select.js +2 -2
  34. package/dist/form/components/fields/select.js.map +1 -1
  35. package/dist/form/components/fields/table-rows.js +3 -15
  36. package/dist/form/components/fields/table-rows.js.map +1 -1
  37. package/dist/form/components/form.js +8 -23
  38. package/dist/form/components/form.js.map +1 -1
  39. package/dist/form/embed.d.ts +4 -0
  40. package/dist/form/embed.js +3 -1
  41. package/dist/form/lib/collect-fields.d.ts +7 -0
  42. package/dist/form/lib/collect-fields.js +19 -0
  43. package/dist/form/lib/collect-fields.js.map +1 -0
  44. package/dist/form/lib/field-errors.d.ts +3 -0
  45. package/dist/form/lib/field-errors.js +11 -0
  46. package/dist/form/lib/field-errors.js.map +1 -0
  47. package/dist/format/format-context.d.ts +6 -0
  48. package/dist/format/format-context.js +17 -0
  49. package/dist/format/format-context.js.map +1 -0
  50. package/dist/i18n/backend.js +1 -1
  51. package/dist/i18n/index.js +2 -2
  52. package/dist/i18n/instance.js +1 -1
  53. package/dist/i18n/locale-reload.d.ts +1 -1
  54. package/dist/i18n/locale-reload.js +7 -6
  55. package/dist/i18n/locale-reload.js.map +1 -1
  56. package/dist/i18n/locale.js +1 -1
  57. package/dist/i18n/locale.js.map +1 -1
  58. package/dist/i18n/page-props.js +1 -1
  59. package/dist/i18n/shared-props.js +1 -3
  60. package/dist/i18n/shared-props.js.map +1 -1
  61. package/dist/i18n/timezone.js +1 -1
  62. package/dist/i18n/timezone.js.map +1 -1
  63. package/dist/index.d.ts +6 -7
  64. package/dist/index.js +7 -8
  65. package/dist/lattice.css +105 -0
  66. package/dist/layout/components/callouts.js +1 -1
  67. package/dist/layout/components/sidebar.js +15 -48
  68. package/dist/layout/components/sidebar.js.map +1 -1
  69. package/dist/layout/plugin.d.ts +0 -1
  70. package/dist/layout/plugin.js.map +1 -1
  71. package/dist/lib/is-truthy.d.ts +2 -0
  72. package/dist/lib/is-truthy.js +9 -0
  73. package/dist/lib/is-truthy.js.map +1 -0
  74. package/dist/lib/use-debounced-callback.d.ts +10 -0
  75. package/dist/lib/use-debounced-callback.js +34 -0
  76. package/dist/lib/use-debounced-callback.js.map +1 -0
  77. package/dist/lib/use-media-query.d.ts +5 -0
  78. package/dist/lib/use-media-query.js +26 -0
  79. package/dist/lib/use-media-query.js.map +1 -0
  80. package/dist/lib/use-persistent-state.d.ts +13 -0
  81. package/dist/lib/use-persistent-state.js +62 -0
  82. package/dist/lib/use-persistent-state.js.map +1 -0
  83. package/dist/notifications/components/notifications.js +3 -1
  84. package/dist/notifications/components/notifications.js.map +1 -1
  85. package/dist/notifications/plugin.d.ts +0 -1
  86. package/dist/notifications/plugin.js.map +1 -1
  87. package/dist/provider-base.js +1 -1
  88. package/dist/realtime/listeners.d.ts +1 -1
  89. package/dist/realtime/listeners.js +1 -1
  90. package/dist/realtime/listeners.js.map +1 -1
  91. package/dist/registry.d.ts +5 -0
  92. package/dist/registry.js.map +1 -1
  93. package/dist/remote/components/data-list.js +1 -1
  94. package/dist/remote/plugin.d.ts +0 -1
  95. package/dist/remote/plugin.js.map +1 -1
  96. package/dist/table/components/bulk-bar.js +4 -2
  97. package/dist/table/components/bulk-bar.js.map +1 -1
  98. package/dist/table/components/cells/boolean-cell.js +1 -3
  99. package/dist/table/components/cells/boolean-cell.js.map +1 -1
  100. package/dist/table/components/cells/copyable-cell.d.ts +9 -0
  101. package/dist/table/components/cells/copyable-cell.js +17 -0
  102. package/dist/table/components/cells/copyable-cell.js.map +1 -0
  103. package/dist/table/components/cells/money-cell.js +7 -18
  104. package/dist/table/components/cells/money-cell.js.map +1 -1
  105. package/dist/table/components/cells/number-cell.js +14 -27
  106. package/dist/table/components/cells/number-cell.js.map +1 -1
  107. package/dist/table/components/cells/numeric-cell.d.ts +10 -0
  108. package/dist/table/components/cells/numeric-cell.js +25 -0
  109. package/dist/table/components/cells/numeric-cell.js.map +1 -0
  110. package/dist/table/components/cells/stack-cell.js +1 -1
  111. package/dist/table/components/cells/text-cell.js +4 -5
  112. package/dist/table/components/cells/text-cell.js.map +1 -1
  113. package/dist/table/components/filter-controls.js +1 -3
  114. package/dist/table/components/filter-controls.js.map +1 -1
  115. package/dist/table/components/table-cell.js.map +1 -1
  116. package/dist/table/components/table-search.js +4 -7
  117. package/dist/table/components/table-search.js.map +1 -1
  118. package/dist/table/components/table.js +2 -3
  119. package/dist/table/components/table.js.map +1 -1
  120. package/dist/table/hooks/use-column-visibility.js +29 -58
  121. package/dist/table/hooks/use-column-visibility.js.map +1 -1
  122. package/dist/table/hooks/use-table.js +5 -13
  123. package/dist/table/hooks/use-table.js.map +1 -1
  124. package/dist/table/lib/bulk.d.ts +2 -0
  125. package/dist/table/lib/bulk.js +3 -1
  126. package/dist/table/lib/bulk.js.map +1 -1
  127. package/dist/table/lib/query.js +1 -1
  128. package/dist/table/lib/query.js.map +1 -1
  129. package/dist/table/plugin.d.ts +0 -1
  130. package/dist/table/plugin.js.map +1 -1
  131. package/dist/table/types.d.ts +4 -57
  132. package/dist/toast/callout.js +1 -1
  133. package/dist/toast/callout.js.map +1 -1
  134. package/dist/toast/index.d.ts +1 -1
  135. package/dist/toast/index.js +2 -2
  136. package/dist/toast/toast.d.ts +0 -2
  137. package/dist/toast/toast.js +3 -10
  138. package/dist/toast/toast.js.map +1 -1
  139. package/dist/toast/toaster.js +2 -2
  140. package/dist/types/generated.d.ts +224 -80
  141. package/dist/types/index.d.ts +1 -1
  142. package/dist/ui/button.d.ts +2 -2
  143. package/dist/ui/chart-view.js +7 -30
  144. package/dist/ui/chart-view.js.map +1 -1
  145. package/dist/ui/click-behavior.d.ts +4 -4
  146. package/dist/ui/click-behavior.js.map +1 -1
  147. package/dist/ui/collapsible.js +3 -15
  148. package/dist/ui/collapsible.js.map +1 -1
  149. package/dist/ui/combobox.js +6 -3
  150. package/dist/ui/combobox.js.map +1 -1
  151. package/dist/ui/confirm-dialog.js +1 -1
  152. package/dist/ui/confirm-dialog.js.map +1 -1
  153. package/dist/ui/control.d.ts +1 -1
  154. package/dist/ui/dialog.d.ts +6 -2
  155. package/dist/ui/dialog.js +29 -5
  156. package/dist/ui/dialog.js.map +1 -1
  157. package/dist/ui/fragment.js +1 -1
  158. package/dist/ui/fragment.js.map +1 -1
  159. package/dist/ui/icon-button.d.ts +1 -1
  160. package/dist/ui/image-preview.js +1 -1
  161. package/dist/ui/image-preview.js.map +1 -1
  162. package/dist/ui/modal.js +3 -2
  163. package/dist/ui/modal.js.map +1 -1
  164. package/dist/ui/pill.d.ts +2 -0
  165. package/dist/ui/pill.js +10 -0
  166. package/dist/ui/pill.js.map +1 -0
  167. package/dist/ui/plugin.js.map +1 -1
  168. package/dist/ui/progress.js +1 -1
  169. package/dist/ui/section.js +2 -15
  170. package/dist/ui/section.js.map +1 -1
  171. package/dist/ui/segmented-pills.js +2 -1
  172. package/dist/ui/segmented-pills.js.map +1 -1
  173. package/dist/ui/tabs.js +12 -10
  174. package/dist/ui/tabs.js.map +1 -1
  175. package/dist/ui/tree-context.js +11 -13
  176. package/dist/ui/tree-context.js.map +1 -1
  177. package/dist/ui/tree.js +1 -1
  178. package/dist/ui/tree.js.map +1 -1
  179. package/dist/ui/use-collapsible-state.d.ts +7 -0
  180. package/dist/ui/use-collapsible-state.js +21 -0
  181. package/dist/ui/use-collapsible-state.js.map +1 -0
  182. package/dist-standalone/chunks/chart-view-C6R5iPra.js +36 -0
  183. package/dist-standalone/chunks/{date-picker-field-VbH9xrQO.js → date-picker-field-DhhEB-Mh.js} +1 -1
  184. package/dist-standalone/chunks/{page-props-AIa5UR6n.js → page-props-DOfg30l5.js} +1 -1
  185. package/dist-standalone/chunks/{rich-editor-field-DLQTyt36.js → rich-editor-field-DORXTHPw.js} +2 -2
  186. package/dist-standalone/chunks/{subscriptions-DY2tj9Im.js → subscriptions-B_ISgA7V.js} +1 -1
  187. package/dist-standalone/chunks/use-effect-dispatcher-D1wPPwHj.js +97 -0
  188. package/dist-standalone/lattice.css +1 -1
  189. package/dist-standalone/lattice.js +15 -15
  190. package/dist-standalone/manifest.json +8 -8
  191. package/package.json +1 -1
  192. package/dist/clipboard/index.js.map +0 -1
  193. package/dist/events/event-names.js.map +0 -1
  194. package/dist/table/components/table-action-node.d.ts +0 -4
  195. package/dist/table/components/table-action-node.js +0 -24
  196. package/dist/table/components/table-action-node.js.map +0 -1
  197. package/dist-standalone/chunks/chart-view-wJmnVu7L.js +0 -36
  198. package/dist-standalone/chunks/use-effect-dispatcher-feEs0GCP.js +0 -97
  199. /package/dist/{events → core}/event-names.d.ts +0 -0
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Track a CSS media query. `fallback` is the SSR / no-`matchMedia` value and the
3
+ * initial state before the effect subscribes.
4
+ */
5
+ export declare function useMediaQuery(query: string, fallback?: boolean): boolean;
@@ -0,0 +1,26 @@
1
+ import { useEffect, useState } from "react";
2
+ //#region resources/js/lib/use-media-query.ts
3
+ function matches(query, fallback) {
4
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return fallback;
5
+ return window.matchMedia(query).matches;
6
+ }
7
+ /**
8
+ * Track a CSS media query. `fallback` is the SSR / no-`matchMedia` value and the
9
+ * initial state before the effect subscribes.
10
+ */
11
+ function useMediaQuery(query, fallback = false) {
12
+ const [state, setState] = useState(() => matches(query, fallback));
13
+ useEffect(() => {
14
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
15
+ const media = window.matchMedia(query);
16
+ const update = () => setState(media.matches);
17
+ update();
18
+ media.addEventListener("change", update);
19
+ return () => media.removeEventListener("change", update);
20
+ }, [query]);
21
+ return state;
22
+ }
23
+ //#endregion
24
+ export { useMediaQuery };
25
+
26
+ //# sourceMappingURL=use-media-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-media-query.js","names":[],"sources":["../../resources/js/lib/use-media-query.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\nfunction matches(query: string, fallback: boolean): boolean {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return fallback;\n }\n\n return window.matchMedia(query).matches;\n}\n\n/**\n * Track a CSS media query. `fallback` is the SSR / no-`matchMedia` value and the\n * initial state before the effect subscribes.\n */\nexport function useMediaQuery(query: string, fallback = false): boolean {\n const [state, setState] = useState(() => matches(query, fallback));\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return;\n }\n\n const media = window.matchMedia(query);\n const update = (): void => setState(media.matches);\n\n update();\n media.addEventListener(\"change\", update);\n\n return () => media.removeEventListener(\"change\", update);\n }, [query]);\n\n return state;\n}\n"],"mappings":";;AAEA,SAAS,QAAQ,OAAe,UAA4B;CAC1D,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAChE,OAAO;CAGT,OAAO,OAAO,WAAW,KAAK,EAAE;AAClC;;;;;AAMA,SAAgB,cAAc,OAAe,WAAW,OAAgB;CACtE,MAAM,CAAC,OAAO,YAAY,eAAe,QAAQ,OAAO,QAAQ,CAAC;CAEjE,gBAAgB;EACd,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,eAAe,YAChE;EAGF,MAAM,QAAQ,OAAO,WAAW,KAAK;EACrC,MAAM,eAAqB,SAAS,MAAM,OAAO;EAEjD,OAAO;EACP,MAAM,iBAAiB,UAAU,MAAM;EAEvC,aAAa,MAAM,oBAAoB,UAAU,MAAM;CACzD,GAAG,CAAC,KAAK,CAAC;CAEV,OAAO;AACT"}
@@ -0,0 +1,13 @@
1
+ import { Dispatch, SetStateAction } from 'react';
2
+ export type PersistentStateOptions<T> = {
3
+ enabled?: boolean;
4
+ parse?: (raw: string) => T;
5
+ serialize?: (value: T) => string | null;
6
+ };
7
+ /**
8
+ * `useState` backed by `localStorage`. The SSR guard and read/write `try/catch`
9
+ * live here once; `parse`/`serialize` default to JSON. Persistence happens in
10
+ * the setter (not inside the state updater), so a StrictMode double-invoke never
11
+ * double-writes, and a `serialize` returning `null` removes the key.
12
+ */
13
+ export declare function usePersistentState<T>(key: string, fallback: T | (() => T), options?: PersistentStateOptions<T>): [T, Dispatch<SetStateAction<T>>];
@@ -0,0 +1,62 @@
1
+ import { useCallback, useRef, useState } from "react";
2
+ //#region resources/js/lib/use-persistent-state.ts
3
+ /**
4
+ * `useState` backed by `localStorage`. The SSR guard and read/write `try/catch`
5
+ * live here once; `parse`/`serialize` default to JSON. Persistence happens in
6
+ * the setter (not inside the state updater), so a StrictMode double-invoke never
7
+ * double-writes, and a `serialize` returning `null` removes the key.
8
+ */
9
+ function usePersistentState(key, fallback, options = {}) {
10
+ const { enabled = true, parse, serialize } = options;
11
+ const resolveFallback = () => typeof fallback === "function" ? fallback() : fallback;
12
+ const [value, setValue] = useState(() => {
13
+ if (!enabled || typeof window === "undefined") return resolveFallback();
14
+ let raw;
15
+ try {
16
+ raw = window.localStorage.getItem(key);
17
+ } catch {
18
+ return resolveFallback();
19
+ }
20
+ if (raw === null) return resolveFallback();
21
+ try {
22
+ return parse ? parse(raw) : JSON.parse(raw);
23
+ } catch {
24
+ try {
25
+ window.localStorage.removeItem(key);
26
+ } catch {
27
+ return resolveFallback();
28
+ }
29
+ return resolveFallback();
30
+ }
31
+ });
32
+ const valueRef = useRef(value);
33
+ valueRef.current = value;
34
+ const persistRef = useRef({
35
+ enabled,
36
+ key,
37
+ serialize
38
+ });
39
+ persistRef.current = {
40
+ enabled,
41
+ key,
42
+ serialize
43
+ };
44
+ return [value, useCallback((action) => {
45
+ const next = typeof action === "function" ? action(valueRef.current) : action;
46
+ valueRef.current = next;
47
+ setValue(next);
48
+ const { enabled: on, key: storageKey, serialize: encode } = persistRef.current;
49
+ if (!on || typeof window === "undefined") return;
50
+ try {
51
+ const encoded = encode ? encode(next) : JSON.stringify(next);
52
+ if (encoded === null) window.localStorage.removeItem(storageKey);
53
+ else window.localStorage.setItem(storageKey, encoded);
54
+ } catch {
55
+ return;
56
+ }
57
+ }, [])];
58
+ }
59
+ //#endregion
60
+ export { usePersistentState };
61
+
62
+ //# sourceMappingURL=use-persistent-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-persistent-state.js","names":[],"sources":["../../resources/js/lib/use-persistent-state.ts"],"sourcesContent":["import type { Dispatch, SetStateAction } from \"react\";\nimport { useCallback, useRef, useState } from \"react\";\n\nexport type PersistentStateOptions<T> = {\n enabled?: boolean;\n parse?: (raw: string) => T;\n serialize?: (value: T) => string | null;\n};\n\n/**\n * `useState` backed by `localStorage`. The SSR guard and read/write `try/catch`\n * live here once; `parse`/`serialize` default to JSON. Persistence happens in\n * the setter (not inside the state updater), so a StrictMode double-invoke never\n * double-writes, and a `serialize` returning `null` removes the key.\n */\nexport function usePersistentState<T>(\n key: string,\n fallback: T | (() => T),\n options: PersistentStateOptions<T> = {},\n): [T, Dispatch<SetStateAction<T>>] {\n const { enabled = true, parse, serialize } = options;\n\n const resolveFallback = (): T =>\n typeof fallback === \"function\" ? (fallback as () => T)() : fallback;\n\n const [value, setValue] = useState<T>(() => {\n if (!enabled || typeof window === \"undefined\") {\n return resolveFallback();\n }\n\n let raw: string | null;\n try {\n raw = window.localStorage.getItem(key);\n } catch {\n return resolveFallback();\n }\n\n if (raw === null) {\n return resolveFallback();\n }\n\n try {\n return parse ? parse(raw) : (JSON.parse(raw) as T);\n } catch {\n // Drop corrupt data so it cannot resurface on the next read.\n try {\n window.localStorage.removeItem(key);\n } catch {\n return resolveFallback();\n }\n\n return resolveFallback();\n }\n });\n\n const valueRef = useRef(value);\n valueRef.current = value;\n\n const persistRef = useRef({ enabled, key, serialize });\n persistRef.current = { enabled, key, serialize };\n\n const setPersistentValue = useCallback<Dispatch<SetStateAction<T>>>((action) => {\n const next =\n typeof action === \"function\" ? (action as (prev: T) => T)(valueRef.current) : action;\n\n valueRef.current = next;\n setValue(next);\n\n const { enabled: on, key: storageKey, serialize: encode } = persistRef.current;\n\n if (!on || typeof window === \"undefined\") {\n return;\n }\n\n try {\n const encoded = encode ? encode(next) : JSON.stringify(next);\n\n if (encoded === null) {\n window.localStorage.removeItem(storageKey);\n } else {\n window.localStorage.setItem(storageKey, encoded);\n }\n } catch {\n return;\n }\n }, []);\n\n return [value, setPersistentValue];\n}\n"],"mappings":";;;;;;;;AAeA,SAAgB,mBACd,KACA,UACA,UAAqC,CAAC,GACJ;CAClC,MAAM,EAAE,UAAU,MAAM,OAAO,cAAc;CAE7C,MAAM,wBACJ,OAAO,aAAa,aAAc,SAAqB,IAAI;CAE7D,MAAM,CAAC,OAAO,YAAY,eAAkB;EAC1C,IAAI,CAAC,WAAW,OAAO,WAAW,aAChC,OAAO,gBAAgB;EAGzB,IAAI;EACJ,IAAI;GACF,MAAM,OAAO,aAAa,QAAQ,GAAG;EACvC,QAAQ;GACN,OAAO,gBAAgB;EACzB;EAEA,IAAI,QAAQ,MACV,OAAO,gBAAgB;EAGzB,IAAI;GACF,OAAO,QAAQ,MAAM,GAAG,IAAK,KAAK,MAAM,GAAG;EAC7C,QAAQ;GAEN,IAAI;IACF,OAAO,aAAa,WAAW,GAAG;GACpC,QAAQ;IACN,OAAO,gBAAgB;GACzB;GAEA,OAAO,gBAAgB;EACzB;CACF,CAAC;CAED,MAAM,WAAW,OAAO,KAAK;CAC7B,SAAS,UAAU;CAEnB,MAAM,aAAa,OAAO;EAAE;EAAS;EAAK;CAAU,CAAC;CACrD,WAAW,UAAU;EAAE;EAAS;EAAK;CAAU;CA4B/C,OAAO,CAAC,OA1BmB,aAA0C,WAAW;EAC9E,MAAM,OACJ,OAAO,WAAW,aAAc,OAA0B,SAAS,OAAO,IAAI;EAEhF,SAAS,UAAU;EACnB,SAAS,IAAI;EAEb,MAAM,EAAE,SAAS,IAAI,KAAK,YAAY,WAAW,WAAW,WAAW;EAEvE,IAAI,CAAC,MAAM,OAAO,WAAW,aAC3B;EAGF,IAAI;GACF,MAAM,UAAU,SAAS,OAAO,IAAI,IAAI,KAAK,UAAU,IAAI;GAE3D,IAAI,YAAY,MACd,OAAO,aAAa,WAAW,UAAU;QAEzC,OAAO,aAAa,QAAQ,YAAY,OAAO;EAEnD,QAAQ;GACN;EACF;CACF,GAAG,CAAC,CAEW,CAAkB;AACnC"}
@@ -79,7 +79,9 @@ var NotificationsComponent = ({ node }) => {
79
79
  open: store.open,
80
80
  onOpenChange: store.setOpen,
81
81
  children: /* @__PURE__ */ jsxs(DialogContent, {
82
- className: "fixed left-auto right-0 top-0 h-full w-96 max-w-full translate-x-0 translate-y-0 overflow-y-auto p-0",
82
+ className: "p-0",
83
+ placement: "end",
84
+ width: "sm",
83
85
  children: [/* @__PURE__ */ jsx(DialogTitle, {
84
86
  className: "sr-only",
85
87
  children: label
@@ -1 +1 @@
1
- {"version":3,"file":"notifications.js","names":[],"sources":["../../../resources/js/notifications/components/notifications.tsx"],"sourcesContent":["import { Component, lazy, Suspense, type ReactNode } from \"react\";\nimport { Badge } from \"@lattice-php/lattice/ui/badge\";\nimport { Dialog, DialogContent, DialogTitle } from \"@lattice-php/lattice/ui/dialog\";\nimport {\n Popover as PopoverRoot,\n PopoverContent,\n PopoverTrigger,\n} from \"@lattice-php/lattice/ui/popover\";\nimport { Icon } from \"@lattice-php/lattice/icons\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { useNotifications } from \"@lattice-php/lattice/notifications/store\";\nimport type { NotificationItem } from \"@lattice-php/lattice/notifications/types\";\nimport { NotificationList } from \"./notification-list\";\n\nconst NotificationsEcho = lazy(() =>\n import(\"./notifications-echo\").then((m) => ({ default: m.NotificationsEcho })),\n);\n\nclass EchoBoundary extends Component<{ children: ReactNode }, { failed: boolean }> {\n state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n componentDidCatch(): void {\n console.warn(\n \"[lattice] The notifications bell declares a realtime channel but Echo is unavailable. Install @laravel/echo-react and call configureEcho().\",\n );\n }\n\n render(): ReactNode {\n return this.state.failed ? null : this.props.children;\n }\n}\n\nconst NotificationsComponent: RendererComponent<\"notifications\"> = ({ node }) => {\n const { t } = useT(\"lattice\");\n const store = useNotifications({\n endpoint: node.props.endpoint,\n pollingInterval: node.props.pollingInterval,\n });\n\n const label = t(\"notifications.label\", \"Notifications\");\n\n const trigger = (\n <span className=\"relative inline-flex items-center justify-center rounded-lt-sm p-2 hover:bg-lt-muted\">\n <Icon name=\"bell\" className=\"size-lt-icon-md\" />\n {store.unreadCount > 0 ? (\n <Badge\n variant=\"destructive\"\n data-test=\"notifications-badge\"\n className=\"absolute -right-0.5 -top-0.5 min-w-4 px-1 py-0 text-[10px]\"\n >\n {store.unreadCount}\n </Badge>\n ) : null}\n </span>\n );\n\n const panel = (\n <div className=\"w-80\" data-test=\"notifications-panel\">\n <div className=\"flex items-center justify-between border-b border-lt-border px-3 py-2\">\n <span className=\"text-sm font-medium\">{t(\"notifications.heading\", \"Notifications\")}</span>\n {store.unreadCount > 0 ? (\n <button\n type=\"button\"\n className=\"text-xs text-lt-muted-fg hover:text-lt-fg\"\n onClick={store.markAllRead}\n >\n {t(\"notifications.mark-all-read\", \"Mark all read\")}\n </button>\n ) : null}\n </div>\n <NotificationList\n notifications={store.notifications}\n status={store.status}\n hasMore={store.hasMore}\n onMarkRead={store.markRead}\n onDismiss={store.dismiss}\n onLoadMore={store.loadMore}\n />\n </div>\n );\n\n return (\n <>\n {node.props.channel ? (\n <EchoBoundary>\n <Suspense fallback={null}>\n <NotificationsEcho\n channel={node.props.channel}\n onReceive={(item: NotificationItem) => store.receive(item)}\n />\n </Suspense>\n </EchoBoundary>\n ) : null}\n\n {node.props.slideOut ? (\n <>\n <button\n type=\"button\"\n aria-label={label}\n data-test=\"notifications-trigger\"\n onClick={() => store.setOpen(true)}\n >\n {trigger}\n </button>\n <Dialog open={store.open} onOpenChange={store.setOpen}>\n <DialogContent className=\"fixed left-auto right-0 top-0 h-full w-96 max-w-full translate-x-0 translate-y-0 overflow-y-auto p-0\">\n <DialogTitle className=\"sr-only\">{label}</DialogTitle>\n {panel}\n </DialogContent>\n </Dialog>\n </>\n ) : (\n <PopoverRoot open={store.open} onOpenChange={store.setOpen}>\n <PopoverTrigger asChild>\n <button type=\"button\" aria-label={label} data-test=\"notifications-trigger\">\n {trigger}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"p-0\">\n {panel}\n </PopoverContent>\n </PopoverRoot>\n )}\n </>\n );\n};\n\nexport default NotificationsComponent;\n"],"mappings":";;;;;;;;;;AAeA,IAAM,oBAAoB,WACxB,OAAO,2BAAwB,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC/E;AAEA,IAAM,eAAN,cAA2B,UAAwD;CACjF,QAAQ,EAAE,QAAQ,MAAM;CAExB,OAAO,2BAAgD;EACrD,OAAO,EAAE,QAAQ,KAAK;CACxB;CAEA,oBAA0B;EACxB,QAAQ,KACN,6IACF;CACF;CAEA,SAAoB;EAClB,OAAO,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM;CAC/C;AACF;AAEA,IAAM,0BAA8D,EAAE,WAAW;CAC/E,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,QAAQ,iBAAiB;EAC7B,UAAU,KAAK,MAAM;EACrB,iBAAiB,KAAK,MAAM;CAC9B,CAAC;CAED,MAAM,QAAQ,EAAE,uBAAuB,eAAe;CAEtD,MAAM,UACJ,qBAAC,QAAD;EAAM,WAAU;YAAhB,CACE,oBAAC,MAAD;GAAM,MAAK;GAAO,WAAU;EAAmB,CAAA,GAC9C,MAAM,cAAc,IACnB,oBAAC,OAAD;GACE,SAAQ;GACR,aAAU;GACV,WAAU;aAET,MAAM;EACF,CAAA,IACL,IACA;;CAGR,MAAM,QACJ,qBAAC,OAAD;EAAK,WAAU;EAAO,aAAU;YAAhC,CACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,QAAD;IAAM,WAAU;cAAuB,EAAE,yBAAyB,eAAe;GAAQ,CAAA,GACxF,MAAM,cAAc,IACnB,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,SAAS,MAAM;cAEd,EAAE,+BAA+B,eAAe;GAC3C,CAAA,IACN,IACD;MACL,oBAAC,kBAAD;GACE,eAAe,MAAM;GACrB,QAAQ,MAAM;GACd,SAAS,MAAM;GACf,YAAY,MAAM;GAClB,WAAW,MAAM;GACjB,YAAY,MAAM;EACnB,CAAA,CACE;;CAGP,OACE,qBAAA,YAAA,EAAA,UAAA,CACG,KAAK,MAAM,UACV,oBAAC,cAAD,EAAA,UACE,oBAAC,UAAD;EAAU,UAAU;YAClB,oBAAC,mBAAD;GACE,SAAS,KAAK,MAAM;GACpB,YAAY,SAA2B,MAAM,QAAQ,IAAI;EAC1D,CAAA;CACO,CAAA,EACE,CAAA,IACZ,MAEH,KAAK,MAAM,WACV,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,UAAD;EACE,MAAK;EACL,cAAY;EACZ,aAAU;EACV,eAAe,MAAM,QAAQ,IAAI;YAEhC;CACK,CAAA,GACR,oBAAC,QAAD;EAAQ,MAAM,MAAM;EAAM,cAAc,MAAM;YAC5C,qBAAC,eAAD;GAAe,WAAU;aAAzB,CACE,oBAAC,aAAD;IAAa,WAAU;cAAW;GAAmB,CAAA,GACpD,KACY;;CACT,CAAA,CACR,EAAA,CAAA,IAEF,qBAAC,SAAD;EAAa,MAAM,MAAM;EAAM,cAAc,MAAM;YAAnD,CACE,oBAAC,gBAAD;GAAgB,SAAA;aACd,oBAAC,UAAD;IAAQ,MAAK;IAAS,cAAY;IAAO,aAAU;cAChD;GACK,CAAA;EACM,CAAA,GAChB,oBAAC,gBAAD;GAAgB,OAAM;GAAM,WAAU;aACnC;EACa,CAAA,CACL;GAEf,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"notifications.js","names":[],"sources":["../../../resources/js/notifications/components/notifications.tsx"],"sourcesContent":["import { Component, lazy, Suspense, type ReactNode } from \"react\";\nimport { Badge } from \"@lattice-php/lattice/ui/badge\";\nimport { Dialog, DialogContent, DialogTitle } from \"@lattice-php/lattice/ui/dialog\";\nimport {\n Popover as PopoverRoot,\n PopoverContent,\n PopoverTrigger,\n} from \"@lattice-php/lattice/ui/popover\";\nimport { Icon } from \"@lattice-php/lattice/icons\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport { useNotifications } from \"@lattice-php/lattice/notifications/store\";\nimport type { NotificationItem } from \"@lattice-php/lattice/notifications/types\";\nimport { NotificationList } from \"./notification-list\";\n\nconst NotificationsEcho = lazy(() =>\n import(\"./notifications-echo\").then((m) => ({ default: m.NotificationsEcho })),\n);\n\nclass EchoBoundary extends Component<{ children: ReactNode }, { failed: boolean }> {\n state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n componentDidCatch(): void {\n console.warn(\n \"[lattice] The notifications bell declares a realtime channel but Echo is unavailable. Install @laravel/echo-react and call configureEcho().\",\n );\n }\n\n render(): ReactNode {\n return this.state.failed ? null : this.props.children;\n }\n}\n\nconst NotificationsComponent: RendererComponent<\"notifications\"> = ({ node }) => {\n const { t } = useT(\"lattice\");\n const store = useNotifications({\n endpoint: node.props.endpoint,\n pollingInterval: node.props.pollingInterval,\n });\n\n const label = t(\"notifications.label\", \"Notifications\");\n\n const trigger = (\n <span className=\"relative inline-flex items-center justify-center rounded-lt-sm p-2 hover:bg-lt-muted\">\n <Icon name=\"bell\" className=\"size-lt-icon-md\" />\n {store.unreadCount > 0 ? (\n <Badge\n variant=\"destructive\"\n data-test=\"notifications-badge\"\n className=\"absolute -right-0.5 -top-0.5 min-w-4 px-1 py-0 text-[10px]\"\n >\n {store.unreadCount}\n </Badge>\n ) : null}\n </span>\n );\n\n const panel = (\n <div className=\"w-80\" data-test=\"notifications-panel\">\n <div className=\"flex items-center justify-between border-b border-lt-border px-3 py-2\">\n <span className=\"text-sm font-medium\">{t(\"notifications.heading\", \"Notifications\")}</span>\n {store.unreadCount > 0 ? (\n <button\n type=\"button\"\n className=\"text-xs text-lt-muted-fg hover:text-lt-fg\"\n onClick={store.markAllRead}\n >\n {t(\"notifications.mark-all-read\", \"Mark all read\")}\n </button>\n ) : null}\n </div>\n <NotificationList\n notifications={store.notifications}\n status={store.status}\n hasMore={store.hasMore}\n onMarkRead={store.markRead}\n onDismiss={store.dismiss}\n onLoadMore={store.loadMore}\n />\n </div>\n );\n\n return (\n <>\n {node.props.channel ? (\n <EchoBoundary>\n <Suspense fallback={null}>\n <NotificationsEcho\n channel={node.props.channel}\n onReceive={(item: NotificationItem) => store.receive(item)}\n />\n </Suspense>\n </EchoBoundary>\n ) : null}\n\n {node.props.slideOut ? (\n <>\n <button\n type=\"button\"\n aria-label={label}\n data-test=\"notifications-trigger\"\n onClick={() => store.setOpen(true)}\n >\n {trigger}\n </button>\n <Dialog open={store.open} onOpenChange={store.setOpen}>\n <DialogContent className=\"p-0\" placement=\"end\" width=\"sm\">\n <DialogTitle className=\"sr-only\">{label}</DialogTitle>\n {panel}\n </DialogContent>\n </Dialog>\n </>\n ) : (\n <PopoverRoot open={store.open} onOpenChange={store.setOpen}>\n <PopoverTrigger asChild>\n <button type=\"button\" aria-label={label} data-test=\"notifications-trigger\">\n {trigger}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"p-0\">\n {panel}\n </PopoverContent>\n </PopoverRoot>\n )}\n </>\n );\n};\n\nexport default NotificationsComponent;\n"],"mappings":";;;;;;;;;;AAeA,IAAM,oBAAoB,WACxB,OAAO,2BAAwB,MAAM,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAC/E;AAEA,IAAM,eAAN,cAA2B,UAAwD;CACjF,QAAQ,EAAE,QAAQ,MAAM;CAExB,OAAO,2BAAgD;EACrD,OAAO,EAAE,QAAQ,KAAK;CACxB;CAEA,oBAA0B;EACxB,QAAQ,KACN,6IACF;CACF;CAEA,SAAoB;EAClB,OAAO,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM;CAC/C;AACF;AAEA,IAAM,0BAA8D,EAAE,WAAW;CAC/E,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,QAAQ,iBAAiB;EAC7B,UAAU,KAAK,MAAM;EACrB,iBAAiB,KAAK,MAAM;CAC9B,CAAC;CAED,MAAM,QAAQ,EAAE,uBAAuB,eAAe;CAEtD,MAAM,UACJ,qBAAC,QAAD;EAAM,WAAU;YAAhB,CACE,oBAAC,MAAD;GAAM,MAAK;GAAO,WAAU;EAAmB,CAAA,GAC9C,MAAM,cAAc,IACnB,oBAAC,OAAD;GACE,SAAQ;GACR,aAAU;GACV,WAAU;aAET,MAAM;EACF,CAAA,IACL,IACA;;CAGR,MAAM,QACJ,qBAAC,OAAD;EAAK,WAAU;EAAO,aAAU;YAAhC,CACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,QAAD;IAAM,WAAU;cAAuB,EAAE,yBAAyB,eAAe;GAAQ,CAAA,GACxF,MAAM,cAAc,IACnB,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,SAAS,MAAM;cAEd,EAAE,+BAA+B,eAAe;GAC3C,CAAA,IACN,IACD;MACL,oBAAC,kBAAD;GACE,eAAe,MAAM;GACrB,QAAQ,MAAM;GACd,SAAS,MAAM;GACf,YAAY,MAAM;GAClB,WAAW,MAAM;GACjB,YAAY,MAAM;EACnB,CAAA,CACE;;CAGP,OACE,qBAAA,YAAA,EAAA,UAAA,CACG,KAAK,MAAM,UACV,oBAAC,cAAD,EAAA,UACE,oBAAC,UAAD;EAAU,UAAU;YAClB,oBAAC,mBAAD;GACE,SAAS,KAAK,MAAM;GACpB,YAAY,SAA2B,MAAM,QAAQ,IAAI;EAC1D,CAAA;CACO,CAAA,EACE,CAAA,IACZ,MAEH,KAAK,MAAM,WACV,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,UAAD;EACE,MAAK;EACL,cAAY;EACZ,aAAU;EACV,eAAe,MAAM,QAAQ,IAAI;YAEhC;CACK,CAAA,GACR,oBAAC,QAAD;EAAQ,MAAM,MAAM;EAAM,cAAc,MAAM;YAC5C,qBAAC,eAAD;GAAe,WAAU;GAAM,WAAU;GAAM,OAAM;aAArD,CACE,oBAAC,aAAD;IAAa,WAAU;cAAW;GAAmB,CAAA,GACpD,KACY;;CACT,CAAA,CACR,EAAA,CAAA,IAEF,qBAAC,SAAD;EAAa,MAAM,MAAM;EAAM,cAAc,MAAM;YAAnD,CACE,oBAAC,gBAAD;GAAgB,SAAA;aACd,oBAAC,UAAD;IAAQ,MAAK;IAAS,cAAY;IAAO,aAAU;cAChD;GACK,CAAA;EACM,CAAA,GAChB,oBAAC,gBAAD;GAAgB,OAAM;GAAM,WAAU;aACnC;EACa,CAAA,CACL;GAEf,EAAA,CAAA;AAEN"}
@@ -1,2 +1 @@
1
- export type NotificationsComponentType = "notifications";
2
1
  export declare const notificationsComponents: import('../core/registry.js').Plugin;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","names":[],"sources":["../../resources/js/notifications/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n eagerComponent,\n type ComponentRegistryFor,\n} from \"@lattice-php/lattice/core/registry\";\nimport NotificationsComponent from \"./components/notifications\";\n\nexport type NotificationsComponentType = \"notifications\";\n\nexport const notificationsComponents = createPlugin({\n name: \"lattice/notifications\",\n components: {\n notifications: eagerComponent(NotificationsComponent),\n } satisfies ComponentRegistryFor<NotificationsComponentType>,\n});\n"],"mappings":";;;AASA,IAAa,0BAA0B,aAAa;CAClD,MAAM;CACN,YAAY,EACV,eAAe,eAAe,sBAAsB,EACtD;AACF,CAAC"}
1
+ {"version":3,"file":"plugin.js","names":[],"sources":["../../resources/js/notifications/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n eagerComponent,\n type ComponentRegistryFor,\n} from \"@lattice-php/lattice/core/registry\";\nimport type { NotificationNodeType } from \"@lattice-php/lattice/types/generated\";\nimport NotificationsComponent from \"./components/notifications\";\n\nexport const notificationsComponents = createPlugin({\n name: \"lattice/notifications\",\n components: {\n notifications: eagerComponent(NotificationsComponent),\n } satisfies ComponentRegistryFor<NotificationNodeType>,\n});\n"],"mappings":";;;AAQA,IAAa,0BAA0B,aAAa;CAClD,MAAM;CACN,YAAY,EACV,eAAe,eAAe,sBAAsB,EACtD;AACF,CAAC"}
@@ -2,9 +2,9 @@ import { updateAppearance } from "./appearance/index.js";
2
2
  import { RegistryContext } from "./core/registry-context.js";
3
3
  import { SpriteProvider } from "./icons/sprite.js";
4
4
  import { Toaster } from "./toast/toaster.js";
5
- import { EventBridge } from "./event-bridge.js";
6
5
  import { ActionInteractionProvider } from "./action/components/action-trigger-provider.js";
7
6
  import { useFlashEffects } from "./effects/use-flash-effects.js";
7
+ import { EventBridge } from "./event-bridge.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region resources/js/provider-base.tsx
10
10
  var defaultSprite = { href: "" };
@@ -4,5 +4,5 @@ import { Listen } from '../types/generated.js';
4
4
  * is only fetched where it is actually needed.
5
5
  */
6
6
  export declare function RealtimeListeners({ listeners }: {
7
- listeners?: Listen[];
7
+ listeners: Listen[];
8
8
  }): import("react").JSX.Element | null;
@@ -19,7 +19,7 @@ var EchoBoundary = class extends Component {
19
19
  * is only fetched where it is actually needed.
20
20
  */
21
21
  function RealtimeListeners({ listeners }) {
22
- if (listeners === void 0 || listeners.length === 0) return null;
22
+ if (listeners.length === 0) return null;
23
23
  return /* @__PURE__ */ jsx(EchoBoundary, { children: /* @__PURE__ */ jsx(Suspense, {
24
24
  fallback: null,
25
25
  children: /* @__PURE__ */ jsx(Subscriptions, { listeners })
@@ -1 +1 @@
1
- {"version":3,"file":"listeners.js","names":[],"sources":["../../resources/js/realtime/listeners.tsx"],"sourcesContent":["import { Component, lazy, Suspense } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { Listen } from \"@lattice-php/lattice/types/generated\";\n\nconst Subscriptions = lazy(() => import(\"./subscriptions\"));\n\nclass EchoBoundary extends Component<{ children: ReactNode }, { failed: boolean }> {\n state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n componentDidCatch(): void {\n console.warn(\n \"[lattice] Real-time listeners are declared but Echo is unavailable. Install @laravel/echo-react and call configureEcho().\",\n );\n }\n\n render(): ReactNode {\n return this.state.failed ? null : this.props.children;\n }\n}\n\n/**\n * Renders nothing when a page declares no listeners, so the echo-react chunk\n * is only fetched where it is actually needed.\n */\nexport function RealtimeListeners({ listeners }: { listeners?: Listen[] }) {\n if (listeners === undefined || listeners.length === 0) {\n return null;\n }\n\n return (\n <EchoBoundary>\n <Suspense fallback={null}>\n <Subscriptions listeners={listeners} />\n </Suspense>\n </EchoBoundary>\n );\n}\n"],"mappings":";;;AAIA,IAAM,gBAAgB,WAAW,OAAO,qBAAkB;AAE1D,IAAM,eAAN,cAA2B,UAAwD;CACjF,QAAQ,EAAE,QAAQ,MAAM;CAExB,OAAO,2BAAgD;EACrD,OAAO,EAAE,QAAQ,KAAK;CACxB;CAEA,oBAA0B;EACxB,QAAQ,KACN,2HACF;CACF;CAEA,SAAoB;EAClB,OAAO,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM;CAC/C;AACF;;;;;AAMA,SAAgB,kBAAkB,EAAE,aAAuC;CACzE,IAAI,cAAc,KAAA,KAAa,UAAU,WAAW,GAClD,OAAO;CAGT,OACE,oBAAC,cAAD,EAAA,UACE,oBAAC,UAAD;EAAU,UAAU;YAClB,oBAAC,eAAD,EAA0B,UAAY,CAAA;CAC9B,CAAA,EACE,CAAA;AAElB"}
1
+ {"version":3,"file":"listeners.js","names":[],"sources":["../../resources/js/realtime/listeners.tsx"],"sourcesContent":["import { Component, lazy, Suspense } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { Listen } from \"@lattice-php/lattice/types/generated\";\n\nconst Subscriptions = lazy(() => import(\"./subscriptions\"));\n\nclass EchoBoundary extends Component<{ children: ReactNode }, { failed: boolean }> {\n state = { failed: false };\n\n static getDerivedStateFromError(): { failed: boolean } {\n return { failed: true };\n }\n\n componentDidCatch(): void {\n console.warn(\n \"[lattice] Real-time listeners are declared but Echo is unavailable. Install @laravel/echo-react and call configureEcho().\",\n );\n }\n\n render(): ReactNode {\n return this.state.failed ? null : this.props.children;\n }\n}\n\n/**\n * Renders nothing when a page declares no listeners, so the echo-react chunk\n * is only fetched where it is actually needed.\n */\nexport function RealtimeListeners({ listeners }: { listeners: Listen[] }) {\n if (listeners.length === 0) {\n return null;\n }\n\n return (\n <EchoBoundary>\n <Suspense fallback={null}>\n <Subscriptions listeners={listeners} />\n </Suspense>\n </EchoBoundary>\n );\n}\n"],"mappings":";;;AAIA,IAAM,gBAAgB,WAAW,OAAO,qBAAkB;AAE1D,IAAM,eAAN,cAA2B,UAAwD;CACjF,QAAQ,EAAE,QAAQ,MAAM;CAExB,OAAO,2BAAgD;EACrD,OAAO,EAAE,QAAQ,KAAK;CACxB;CAEA,oBAA0B;EACxB,QAAQ,KACN,2HACF;CACF;CAEA,SAAoB;EAClB,OAAO,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM;CAC/C;AACF;;;;;AAMA,SAAgB,kBAAkB,EAAE,aAAsC;CACxE,IAAI,UAAU,WAAW,GACvB,OAAO;CAGT,OACE,oBAAC,cAAD,EAAA,UACE,oBAAC,UAAD;EAAU,UAAU;YAClB,oBAAC,eAAD,EAA0B,UAAY,CAAA;CAC9B,CAAA,EACE,CAAA;AAElB"}
@@ -1 +1,6 @@
1
+ import { ActionNodeType, ChatNodeType, FormNodeType, FragmentNodeType, LayoutNodeType, NodeType, NotificationNodeType, RemoteNodeType, TableNodeType, UiNodeType } from './types/generated.js';
2
+ type RegisteredNodeType = ActionNodeType | ChatNodeType | FormNodeType | FragmentNodeType | LayoutNodeType | NotificationNodeType | RemoteNodeType | TableNodeType | UiNodeType;
3
+ type Assert<T extends true> = T;
4
+ export type AllNodeTypesRegistered = Assert<Exclude<NodeType, RegisteredNodeType> extends never ? true : false>;
1
5
  export declare const registry: import('./core/registry.js').Registry;
6
+ export {};
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","names":[],"sources":["../resources/js/registry.ts"],"sourcesContent":["import { createRegistry } from \"@lattice-php/lattice/core/registry\";\nimport { actionComponents } from \"./action/plugin\";\nimport { chatComponents } from \"./chat/plugin\";\nimport { uiComponents } from \"./ui/plugin\";\nimport { formComponents } from \"./form/plugin\";\nimport { layoutComponents } from \"./layout/plugin\";\nimport { notificationsComponents } from \"./notifications/plugin\";\nimport { remoteComponents } from \"./remote/plugin\";\nimport { tableComponents } from \"./table/plugin\";\n\nexport const registry = createRegistry(\n uiComponents,\n actionComponents,\n formComponents,\n layoutComponents,\n tableComponents,\n chatComponents,\n notificationsComponents,\n remoteComponents,\n);\n"],"mappings":";;;;;;;;;;AAUA,IAAa,WAAW,eACtB,cACA,kBACA,gBACA,kBACA,iBACA,gBACA,yBACA,gBACF"}
1
+ {"version":3,"file":"registry.js","names":[],"sources":["../resources/js/registry.ts"],"sourcesContent":["import { createRegistry } from \"@lattice-php/lattice/core/registry\";\nimport type {\n ActionNodeType,\n ChatNodeType,\n FormNodeType,\n FragmentNodeType,\n LayoutNodeType,\n NodeType,\n NotificationNodeType,\n RemoteNodeType,\n TableNodeType,\n UiNodeType,\n} from \"@lattice-php/lattice/types/generated\";\nimport { actionComponents } from \"./action/plugin\";\nimport { chatComponents } from \"./chat/plugin\";\nimport { uiComponents } from \"./ui/plugin\";\nimport { formComponents } from \"./form/plugin\";\nimport { layoutComponents } from \"./layout/plugin\";\nimport { notificationsComponents } from \"./notifications/plugin\";\nimport { remoteComponents } from \"./remote/plugin\";\nimport { tableComponents } from \"./table/plugin\";\n\n// Compile-time totality: every generated NodeType must belong to a registered\n// plugin's union. A new PHP domain fails here until its plugin exists.\ntype RegisteredNodeType =\n | ActionNodeType\n | ChatNodeType\n | FormNodeType\n | FragmentNodeType\n | LayoutNodeType\n | NotificationNodeType\n | RemoteNodeType\n | TableNodeType\n | UiNodeType;\ntype Assert<T extends true> = T;\nexport type AllNodeTypesRegistered = Assert<\n Exclude<NodeType, RegisteredNodeType> extends never ? true : false\n>;\n\nexport const registry = createRegistry(\n uiComponents,\n actionComponents,\n formComponents,\n layoutComponents,\n tableComponents,\n chatComponents,\n notificationsComponents,\n remoteComponents,\n);\n"],"mappings":";;;;;;;;;;AAuCA,IAAa,WAAW,eACtB,cACA,kBACA,gBACA,kBACA,iBACA,gBACA,yBACA,gBACF"}
@@ -1,7 +1,7 @@
1
+ import { materializeSchema } from "../../core/materialize.js";
1
2
  import { Renderer } from "../../core/renderer.js";
2
3
  import { useT } from "../../i18n/instance.js";
3
4
  import { remoteJson } from "../../core/api.js";
4
- import { materializeSchema } from "../../core/materialize.js";
5
5
  import { useEffect, useState } from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  //#region resources/js/remote/components/data-list.tsx
@@ -1,2 +1 @@
1
- export type RemoteComponentType = "remote.data-list";
2
1
  export declare const remoteComponents: import('../core/registry.js').Plugin;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","names":[],"sources":["../../resources/js/remote/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n eagerComponent,\n type ComponentRegistryFor,\n} from \"@lattice-php/lattice/core/registry\";\nimport DataListComponent from \"./components/data-list\";\n\nexport type RemoteComponentType = \"remote.data-list\";\n\nexport const remoteComponents = createPlugin({\n components: {\n \"remote.data-list\": eagerComponent(DataListComponent),\n } satisfies ComponentRegistryFor<RemoteComponentType>,\n name: \"lattice/remote\",\n});\n"],"mappings":";;;AASA,IAAa,mBAAmB,aAAa;CAC3C,YAAY,EACV,oBAAoB,eAAe,QAAiB,EACtD;CACA,MAAM;AACR,CAAC"}
1
+ {"version":3,"file":"plugin.js","names":[],"sources":["../../resources/js/remote/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n eagerComponent,\n type ComponentRegistryFor,\n} from \"@lattice-php/lattice/core/registry\";\nimport type { RemoteNodeType } from \"@lattice-php/lattice/types/generated\";\nimport DataListComponent from \"./components/data-list\";\n\nexport const remoteComponents = createPlugin({\n components: {\n \"remote.data-list\": eagerComponent(DataListComponent),\n } satisfies ComponentRegistryFor<RemoteNodeType>,\n name: \"lattice/remote\",\n});\n"],"mappings":";;;AAQA,IAAa,mBAAmB,aAAa;CAC3C,YAAY,EACV,oBAAoB,eAAe,QAAiB,EACtD;CACA,MAAM;AACR,CAAC"}
@@ -1,5 +1,5 @@
1
- import { useT } from "../../i18n/instance.js";
2
1
  import { withHeaders } from "../../core/headers.js";
2
+ import { useT } from "../../i18n/instance.js";
3
3
  import { prefixedTestId } from "../../core/test-id.js";
4
4
  import { getActionEffects } from "../../effects/dispatch.js";
5
5
  import { useEffectDispatcher } from "../../effects/use-effect-dispatcher.js";
@@ -93,8 +93,10 @@ function BulkBar({ actions, selectedKeys, allMatching, total, query, canSelectAl
93
93
  setFilling(null);
94
94
  onCompleted();
95
95
  },
96
+ placement: filling.modalSide ?? "center",
96
97
  submitLabel: filling.confirmation?.confirmLabel ?? filling.label,
97
- title: filling.confirmation?.title ?? filling.label
98
+ title: filling.confirmation?.title ?? filling.label,
99
+ width: filling.modalWidth ?? void 0
98
100
  })
99
101
  ]
100
102
  });
@@ -1 +1 @@
1
- {"version":3,"file":"bulk-bar.js","names":[],"sources":["../../../resources/js/table/components/bulk-bar.tsx"],"sourcesContent":["import { useHttp } from \"@inertiajs/react\";\nimport { useState } from \"react\";\nimport { ActionForm, runAction } from \"@lattice-php/lattice/action\";\nimport { getActionEffects } from \"@lattice-php/lattice/effects/dispatch\";\nimport type { ActionResponse } from \"@lattice-php/lattice/effects/dispatch\";\nimport { useEffectDispatcher } from \"@lattice-php/lattice/effects/use-effect-dispatcher\";\nimport { withHeaders } from \"@lattice-php/lattice/core/headers\";\nimport { Button } from \"@lattice-php/lattice/ui/button\";\nimport { ConfirmDialog } from \"@lattice-php/lattice/ui/confirm-dialog\";\nimport { Spinner } from \"@lattice-php/lattice/ui/spinner\";\nimport { prefixedTestId } from \"@lattice-php/lattice/core/test-id\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { BulkAction } from \"@lattice-php/lattice/table/lib/bulk\";\n\ntype BulkData = {\n allMatching?: boolean;\n selected?: string[];\n};\n\nexport function BulkBar({\n actions,\n selectedKeys,\n allMatching,\n total,\n query,\n canSelectAllMatching,\n onSelectAllMatching,\n onCompleted,\n}: {\n actions: BulkAction[];\n selectedKeys: string[];\n allMatching: boolean;\n total?: number;\n query: Record<string, unknown>;\n canSelectAllMatching: boolean;\n onSelectAllMatching: () => void;\n onCompleted: () => void;\n}) {\n const { t } = useT(\"lattice\");\n const http = useHttp<BulkData, ActionResponse>({});\n const dispatch = useEffectDispatcher();\n const [confirming, setConfirming] = useState<BulkAction | null>(null);\n const [filling, setFilling] = useState<BulkAction | null>(null);\n\n const selectionPayload = (): Record<string, unknown> =>\n allMatching ? { allMatching: true, ...query } : { selected: selectedKeys };\n\n async function submit(action: BulkAction): Promise<void> {\n http.transform((data) => ({ ...data, ...selectionPayload() }));\n\n const ok = await runAction(\n () => http[action.method](action.endpoint, { headers: withHeaders(action.ref ?? \"\") }),\n dispatch,\n );\n\n if (ok) {\n setConfirming(null);\n onCompleted();\n }\n }\n\n function run(action: BulkAction): void {\n if (action.form) {\n setFilling(action);\n\n return;\n }\n\n if (action.confirmation) {\n setConfirming(action);\n\n return;\n }\n\n void submit(action);\n }\n\n const count = allMatching ? (total ?? selectedKeys.length) : selectedKeys.length;\n\n return (\n <div className=\"flex flex-wrap items-center gap-3 border-b border-lt-border bg-lt-muted/50 p-4 text-sm\">\n <span className=\"font-medium\">\n {allMatching\n ? t(\"table.bulk.all-selected\", \"All {{count}} selected\", { count })\n : t(\"table.bulk.selected\", \"{{count}} selected\", { count })}\n </span>\n {canSelectAllMatching && (\n <button\n type=\"button\"\n data-test=\"bulk-select-all-matching\"\n className=\"font-medium text-lt-primary underline underline-offset-2\"\n onClick={onSelectAllMatching}\n >\n {t(\"table.bulk.select-all-matching\", \"Select all {{total}} matching\", { total })}\n </button>\n )}\n <div className=\"flex flex-wrap items-center gap-2\">\n {actions.map((action) => (\n <Button\n key={action.id}\n type=\"button\"\n data-test={prefixedTestId(\"bulk-action\", action.id)}\n variant={action.variant}\n disabled={http.processing}\n onClick={() => run(action)}\n >\n {http.processing && <Spinner />}\n {action.label}\n </Button>\n ))}\n </div>\n\n {confirming?.confirmation && (\n <ConfirmDialog\n title={confirming.confirmation.title ?? confirming.label}\n description={confirming.confirmation.description ?? undefined}\n confirmLabel={confirming.confirmation.confirmLabel ?? confirming.label}\n cancelLabel={confirming.confirmation.cancelLabel ?? t(\"common.cancel\", \"Cancel\")}\n confirmVariant={confirming.variant}\n processing={http.processing}\n onConfirm={() => void submit(confirming)}\n onCancel={() => setConfirming(null)}\n />\n )}\n\n {filling?.form && (\n <ActionForm\n cancelLabel={filling.confirmation?.cancelLabel ?? t(\"common.cancel\", \"Cancel\")}\n componentRef={filling.ref}\n description={filling.confirmation?.description ?? undefined}\n endpoint={filling.endpoint}\n extraData={selectionPayload()}\n formNode={filling.form}\n method={filling.method}\n onClose={() => setFilling(null)}\n onSuccess={(response) => {\n dispatch(getActionEffects(response.effects));\n setFilling(null);\n onCompleted();\n }}\n submitLabel={filling.confirmation?.confirmLabel ?? filling.label}\n title={filling.confirmation?.title ?? filling.label}\n />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAmBA,SAAgB,QAAQ,EACtB,SACA,cACA,aACA,OACA,OACA,sBACA,qBACA,eAUC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,OAAO,QAAkC,CAAC,CAAC;CACjD,MAAM,WAAW,oBAAoB;CACrC,MAAM,CAAC,YAAY,iBAAiB,SAA4B,IAAI;CACpE,MAAM,CAAC,SAAS,cAAc,SAA4B,IAAI;CAE9D,MAAM,yBACJ,cAAc;EAAE,aAAa;EAAM,GAAG;CAAM,IAAI,EAAE,UAAU,aAAa;CAE3E,eAAe,OAAO,QAAmC;EACvD,KAAK,WAAW,UAAU;GAAE,GAAG;GAAM,GAAG,iBAAiB;EAAE,EAAE;EAO7D,IAAI,MALa,gBACT,KAAK,OAAO,QAAQ,OAAO,UAAU,EAAE,SAAS,YAAY,OAAO,OAAO,EAAE,EAAE,CAAC,GACrF,QACF,GAEQ;GACN,cAAc,IAAI;GAClB,YAAY;EACd;CACF;CAEA,SAAS,IAAI,QAA0B;EACrC,IAAI,OAAO,MAAM;GACf,WAAW,MAAM;GAEjB;EACF;EAEA,IAAI,OAAO,cAAc;GACvB,cAAc,MAAM;GAEpB;EACF;EAEA,OAAY,MAAM;CACpB;CAEA,MAAM,QAAQ,cAAe,SAAS,aAAa,SAAU,aAAa;CAE1E,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,QAAD;IAAM,WAAU;cACb,cACG,EAAE,2BAA2B,0BAA0B,EAAE,MAAM,CAAC,IAChE,EAAE,uBAAuB,sBAAsB,EAAE,MAAM,CAAC;GACxD,CAAA;GACL,wBACC,oBAAC,UAAD;IACE,MAAK;IACL,aAAU;IACV,WAAU;IACV,SAAS;cAER,EAAE,kCAAkC,iCAAiC,EAAE,MAAM,CAAC;GACzE,CAAA;GAEV,oBAAC,OAAD;IAAK,WAAU;cACZ,QAAQ,KAAK,WACZ,qBAAC,QAAD;KAEE,MAAK;KACL,aAAW,eAAe,eAAe,OAAO,EAAE;KAClD,SAAS,OAAO;KAChB,UAAU,KAAK;KACf,eAAe,IAAI,MAAM;eAN3B,CAQG,KAAK,cAAc,oBAAC,SAAD,CAAU,CAAA,GAC7B,OAAO,KACF;OATD,OAAO,EASN,CACT;GACE,CAAA;GAEJ,YAAY,gBACX,oBAAC,eAAD;IACE,OAAO,WAAW,aAAa,SAAS,WAAW;IACnD,aAAa,WAAW,aAAa,eAAe,KAAA;IACpD,cAAc,WAAW,aAAa,gBAAgB,WAAW;IACjE,aAAa,WAAW,aAAa,eAAe,EAAE,iBAAiB,QAAQ;IAC/E,gBAAgB,WAAW;IAC3B,YAAY,KAAK;IACjB,iBAAiB,KAAK,OAAO,UAAU;IACvC,gBAAgB,cAAc,IAAI;GACnC,CAAA;GAGF,SAAS,QACR,oBAAC,YAAD;IACE,aAAa,QAAQ,cAAc,eAAe,EAAE,iBAAiB,QAAQ;IAC7E,cAAc,QAAQ;IACtB,aAAa,QAAQ,cAAc,eAAe,KAAA;IAClD,UAAU,QAAQ;IAClB,WAAW,iBAAiB;IAC5B,UAAU,QAAQ;IAClB,QAAQ,QAAQ;IAChB,eAAe,WAAW,IAAI;IAC9B,YAAY,aAAa;KACvB,SAAS,iBAAiB,SAAS,OAAO,CAAC;KAC3C,WAAW,IAAI;KACf,YAAY;IACd;IACA,aAAa,QAAQ,cAAc,gBAAgB,QAAQ;IAC3D,OAAO,QAAQ,cAAc,SAAS,QAAQ;GAC/C,CAAA;EAEA;;AAET"}
1
+ {"version":3,"file":"bulk-bar.js","names":[],"sources":["../../../resources/js/table/components/bulk-bar.tsx"],"sourcesContent":["import { useHttp } from \"@inertiajs/react\";\nimport { useState } from \"react\";\nimport { ActionForm, runAction } from \"@lattice-php/lattice/action\";\nimport { getActionEffects } from \"@lattice-php/lattice/effects/dispatch\";\nimport type { ActionResponse } from \"@lattice-php/lattice/effects/dispatch\";\nimport { useEffectDispatcher } from \"@lattice-php/lattice/effects/use-effect-dispatcher\";\nimport { withHeaders } from \"@lattice-php/lattice/core/headers\";\nimport { Button } from \"@lattice-php/lattice/ui/button\";\nimport { ConfirmDialog } from \"@lattice-php/lattice/ui/confirm-dialog\";\nimport { Spinner } from \"@lattice-php/lattice/ui/spinner\";\nimport { prefixedTestId } from \"@lattice-php/lattice/core/test-id\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { BulkAction } from \"@lattice-php/lattice/table/lib/bulk\";\n\ntype BulkData = {\n allMatching?: boolean;\n selected?: string[];\n};\n\nexport function BulkBar({\n actions,\n selectedKeys,\n allMatching,\n total,\n query,\n canSelectAllMatching,\n onSelectAllMatching,\n onCompleted,\n}: {\n actions: BulkAction[];\n selectedKeys: string[];\n allMatching: boolean;\n total?: number;\n query: Record<string, unknown>;\n canSelectAllMatching: boolean;\n onSelectAllMatching: () => void;\n onCompleted: () => void;\n}) {\n const { t } = useT(\"lattice\");\n const http = useHttp<BulkData, ActionResponse>({});\n const dispatch = useEffectDispatcher();\n const [confirming, setConfirming] = useState<BulkAction | null>(null);\n const [filling, setFilling] = useState<BulkAction | null>(null);\n\n const selectionPayload = (): Record<string, unknown> =>\n allMatching ? { allMatching: true, ...query } : { selected: selectedKeys };\n\n async function submit(action: BulkAction): Promise<void> {\n http.transform((data) => ({ ...data, ...selectionPayload() }));\n\n const ok = await runAction(\n () => http[action.method](action.endpoint, { headers: withHeaders(action.ref ?? \"\") }),\n dispatch,\n );\n\n if (ok) {\n setConfirming(null);\n onCompleted();\n }\n }\n\n function run(action: BulkAction): void {\n if (action.form) {\n setFilling(action);\n\n return;\n }\n\n if (action.confirmation) {\n setConfirming(action);\n\n return;\n }\n\n void submit(action);\n }\n\n const count = allMatching ? (total ?? selectedKeys.length) : selectedKeys.length;\n\n return (\n <div className=\"flex flex-wrap items-center gap-3 border-b border-lt-border bg-lt-muted/50 p-4 text-sm\">\n <span className=\"font-medium\">\n {allMatching\n ? t(\"table.bulk.all-selected\", \"All {{count}} selected\", { count })\n : t(\"table.bulk.selected\", \"{{count}} selected\", { count })}\n </span>\n {canSelectAllMatching && (\n <button\n type=\"button\"\n data-test=\"bulk-select-all-matching\"\n className=\"font-medium text-lt-primary underline underline-offset-2\"\n onClick={onSelectAllMatching}\n >\n {t(\"table.bulk.select-all-matching\", \"Select all {{total}} matching\", { total })}\n </button>\n )}\n <div className=\"flex flex-wrap items-center gap-2\">\n {actions.map((action) => (\n <Button\n key={action.id}\n type=\"button\"\n data-test={prefixedTestId(\"bulk-action\", action.id)}\n variant={action.variant}\n disabled={http.processing}\n onClick={() => run(action)}\n >\n {http.processing && <Spinner />}\n {action.label}\n </Button>\n ))}\n </div>\n\n {confirming?.confirmation && (\n <ConfirmDialog\n title={confirming.confirmation.title ?? confirming.label}\n description={confirming.confirmation.description ?? undefined}\n confirmLabel={confirming.confirmation.confirmLabel ?? confirming.label}\n cancelLabel={confirming.confirmation.cancelLabel ?? t(\"common.cancel\", \"Cancel\")}\n confirmVariant={confirming.variant}\n processing={http.processing}\n onConfirm={() => void submit(confirming)}\n onCancel={() => setConfirming(null)}\n />\n )}\n\n {filling?.form && (\n <ActionForm\n cancelLabel={filling.confirmation?.cancelLabel ?? t(\"common.cancel\", \"Cancel\")}\n componentRef={filling.ref}\n description={filling.confirmation?.description ?? undefined}\n endpoint={filling.endpoint}\n extraData={selectionPayload()}\n formNode={filling.form}\n method={filling.method}\n onClose={() => setFilling(null)}\n onSuccess={(response) => {\n dispatch(getActionEffects(response.effects));\n setFilling(null);\n onCompleted();\n }}\n placement={filling.modalSide ?? \"center\"}\n submitLabel={filling.confirmation?.confirmLabel ?? filling.label}\n title={filling.confirmation?.title ?? filling.label}\n width={filling.modalWidth ?? undefined}\n />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAmBA,SAAgB,QAAQ,EACtB,SACA,cACA,aACA,OACA,OACA,sBACA,qBACA,eAUC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,OAAO,QAAkC,CAAC,CAAC;CACjD,MAAM,WAAW,oBAAoB;CACrC,MAAM,CAAC,YAAY,iBAAiB,SAA4B,IAAI;CACpE,MAAM,CAAC,SAAS,cAAc,SAA4B,IAAI;CAE9D,MAAM,yBACJ,cAAc;EAAE,aAAa;EAAM,GAAG;CAAM,IAAI,EAAE,UAAU,aAAa;CAE3E,eAAe,OAAO,QAAmC;EACvD,KAAK,WAAW,UAAU;GAAE,GAAG;GAAM,GAAG,iBAAiB;EAAE,EAAE;EAO7D,IAAI,MALa,gBACT,KAAK,OAAO,QAAQ,OAAO,UAAU,EAAE,SAAS,YAAY,OAAO,OAAO,EAAE,EAAE,CAAC,GACrF,QACF,GAEQ;GACN,cAAc,IAAI;GAClB,YAAY;EACd;CACF;CAEA,SAAS,IAAI,QAA0B;EACrC,IAAI,OAAO,MAAM;GACf,WAAW,MAAM;GAEjB;EACF;EAEA,IAAI,OAAO,cAAc;GACvB,cAAc,MAAM;GAEpB;EACF;EAEA,OAAY,MAAM;CACpB;CAEA,MAAM,QAAQ,cAAe,SAAS,aAAa,SAAU,aAAa;CAE1E,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,QAAD;IAAM,WAAU;cACb,cACG,EAAE,2BAA2B,0BAA0B,EAAE,MAAM,CAAC,IAChE,EAAE,uBAAuB,sBAAsB,EAAE,MAAM,CAAC;GACxD,CAAA;GACL,wBACC,oBAAC,UAAD;IACE,MAAK;IACL,aAAU;IACV,WAAU;IACV,SAAS;cAER,EAAE,kCAAkC,iCAAiC,EAAE,MAAM,CAAC;GACzE,CAAA;GAEV,oBAAC,OAAD;IAAK,WAAU;cACZ,QAAQ,KAAK,WACZ,qBAAC,QAAD;KAEE,MAAK;KACL,aAAW,eAAe,eAAe,OAAO,EAAE;KAClD,SAAS,OAAO;KAChB,UAAU,KAAK;KACf,eAAe,IAAI,MAAM;eAN3B,CAQG,KAAK,cAAc,oBAAC,SAAD,CAAU,CAAA,GAC7B,OAAO,KACF;OATD,OAAO,EASN,CACT;GACE,CAAA;GAEJ,YAAY,gBACX,oBAAC,eAAD;IACE,OAAO,WAAW,aAAa,SAAS,WAAW;IACnD,aAAa,WAAW,aAAa,eAAe,KAAA;IACpD,cAAc,WAAW,aAAa,gBAAgB,WAAW;IACjE,aAAa,WAAW,aAAa,eAAe,EAAE,iBAAiB,QAAQ;IAC/E,gBAAgB,WAAW;IAC3B,YAAY,KAAK;IACjB,iBAAiB,KAAK,OAAO,UAAU;IACvC,gBAAgB,cAAc,IAAI;GACnC,CAAA;GAGF,SAAS,QACR,oBAAC,YAAD;IACE,aAAa,QAAQ,cAAc,eAAe,EAAE,iBAAiB,QAAQ;IAC7E,cAAc,QAAQ;IACtB,aAAa,QAAQ,cAAc,eAAe,KAAA;IAClD,UAAU,QAAQ;IAClB,WAAW,iBAAiB;IAC5B,UAAU,QAAQ;IAClB,QAAQ,QAAQ;IAChB,eAAe,WAAW,IAAI;IAC9B,YAAY,aAAa;KACvB,SAAS,iBAAiB,SAAS,OAAO,CAAC;KAC3C,WAAW,IAAI;KACf,YAAY;IACd;IACA,WAAW,QAAQ,aAAa;IAChC,aAAa,QAAQ,cAAc,gBAAgB,QAAQ;IAC3D,OAAO,QAAQ,cAAc,SAAS,QAAQ;IAC9C,OAAO,QAAQ,cAAc,KAAA;GAC9B,CAAA;EAEA;;AAET"}
@@ -1,11 +1,9 @@
1
1
  import { cn } from "../../../lib/utils.js";
2
2
  import { Icon } from "../../../icons/sprite.js";
3
3
  import { useT } from "../../../i18n/instance.js";
4
+ import { isTruthy } from "../../../lib/is-truthy.js";
4
5
  import { jsx } from "react/jsx-runtime";
5
6
  //#region resources/js/table/components/cells/boolean-cell.tsx
6
- function isTruthy(value) {
7
- return value === true || value === 1 || value === "1" || value === "true";
8
- }
9
7
  var BooleanCell = ({ value }) => {
10
8
  const { t } = useT("lattice");
11
9
  const truthy = isTruthy(value);
@@ -1 +1 @@
1
- {"version":3,"file":"boolean-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/boolean-cell.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\n\nfunction isTruthy(value: unknown): boolean {\n return value === true || value === 1 || value === \"1\" || value === \"true\";\n}\n\nexport const BooleanCell: ColumnCellComponent<\"column.boolean\"> = ({ value }) => {\n const { t } = useT(\"lattice\");\n const truthy = isTruthy(value);\n\n return (\n <span aria-label={truthy ? t(\"common.yes\", \"Yes\") : t(\"common.no\", \"No\")} role=\"img\">\n <Icon\n name={truthy ? \"check\" : \"x\"}\n className={cn(\"size-lt-icon-md\", truthy ? \"text-lt-success\" : \"text-lt-muted-fg\")}\n />\n </span>\n );\n};\n"],"mappings":";;;;;AAKA,SAAS,SAAS,OAAyB;CACzC,OAAO,UAAU,QAAQ,UAAU,KAAK,UAAU,OAAO,UAAU;AACrE;AAEA,IAAa,eAAsD,EAAE,YAAY;CAC/E,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,SAAS,SAAS,KAAK;CAE7B,OACE,oBAAC,QAAD;EAAM,cAAY,SAAS,EAAE,cAAc,KAAK,IAAI,EAAE,aAAa,IAAI;EAAG,MAAK;YAC7E,oBAAC,MAAD;GACE,MAAM,SAAS,UAAU;GACzB,WAAW,GAAG,mBAAmB,SAAS,oBAAoB,kBAAkB;EACjF,CAAA;CACG,CAAA;AAEV"}
1
+ {"version":3,"file":"boolean-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/boolean-cell.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { isTruthy } from \"@lattice-php/lattice/lib/is-truthy\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\n\nexport const BooleanCell: ColumnCellComponent<\"column.boolean\"> = ({ value }) => {\n const { t } = useT(\"lattice\");\n const truthy = isTruthy(value);\n\n return (\n <span aria-label={truthy ? t(\"common.yes\", \"Yes\") : t(\"common.no\", \"No\")} role=\"img\">\n <Icon\n name={truthy ? \"check\" : \"x\"}\n className={cn(\"size-lt-icon-md\", truthy ? \"text-lt-success\" : \"text-lt-muted-fg\")}\n />\n </span>\n );\n};\n"],"mappings":";;;;;;AAMA,IAAa,eAAsD,EAAE,YAAY;CAC/E,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,SAAS,SAAS,KAAK;CAE7B,OACE,oBAAC,QAAD;EAAM,cAAY,SAAS,EAAE,cAAc,KAAK,IAAI,EAAE,aAAa,IAAI;EAAG,MAAK;YAC7E,oBAAC,MAAD;GACE,MAAM,SAAS,UAAU;GACzB,WAAW,GAAG,mBAAmB,SAAS,oBAAoB,kBAAkB;EACjF,CAAA;CACG,CAAA;AAEV"}
@@ -0,0 +1,9 @@
1
+ import { ReactNode } from 'react';
2
+ import { TableColumn } from '../../types.js';
3
+ /** Wrap cell content in a copy-to-clipboard affordance when `copyable` is set. */
4
+ export declare function CopyableCell({ children, column, copyable, value, }: {
5
+ children: ReactNode;
6
+ column: TableColumn;
7
+ copyable?: boolean | null;
8
+ value: string;
9
+ }): ReactNode;
@@ -0,0 +1,17 @@
1
+ import { CopyableText } from "../../../ui/copyable-text.js";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region resources/js/table/components/cells/copyable-cell.tsx
4
+ /** Wrap cell content in a copy-to-clipboard affordance when `copyable` is set. */
5
+ function CopyableCell({ children, column, copyable, value }) {
6
+ if (!copyable) return children;
7
+ return /* @__PURE__ */ jsx(CopyableText, {
8
+ value,
9
+ label: column.props.label ?? column.key,
10
+ testId: `copy-${column.key}`,
11
+ children
12
+ });
13
+ }
14
+ //#endregion
15
+ export { CopyableCell };
16
+
17
+ //# sourceMappingURL=copyable-cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copyable-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/copyable-cell.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { CopyableText } from \"@lattice-php/lattice/ui/copyable-text\";\nimport type { TableColumn } from \"@lattice-php/lattice/table/types\";\n\n/** Wrap cell content in a copy-to-clipboard affordance when `copyable` is set. */\nexport function CopyableCell({\n children,\n column,\n copyable,\n value,\n}: {\n children: ReactNode;\n column: TableColumn;\n copyable?: boolean | null;\n value: string;\n}): ReactNode {\n if (!copyable) {\n return children;\n }\n\n return (\n <CopyableText\n value={value}\n label={column.props.label ?? column.key}\n testId={`copy-${column.key}`}\n >\n {children}\n </CopyableText>\n );\n}\n"],"mappings":";;;;AAKA,SAAgB,aAAa,EAC3B,UACA,QACA,UACA,SAMY;CACZ,IAAI,CAAC,UACH,OAAO;CAGT,OACE,oBAAC,cAAD;EACS;EACP,OAAO,OAAO,MAAM,SAAS,OAAO;EACpC,QAAQ,QAAQ,OAAO;EAEtB;CACW,CAAA;AAElB"}
@@ -1,32 +1,21 @@
1
- import { useLocale } from "../../../i18n/locale.js";
2
- import { CopyableText } from "../../../ui/copyable-text.js";
3
- import { formatCell } from "../../lib/format.js";
4
- import { numericValue } from "../../../format/numeric.js";
5
- import { formatNumber } from "../../../format/number.js";
1
+ import { NumericCell } from "./numeric-cell.js";
6
2
  import { jsx } from "react/jsx-runtime";
7
3
  //#region resources/js/table/components/cells/money-cell.tsx
8
4
  var MoneyCell = ({ column, props, row, value }) => {
9
- const { locale } = useLocale();
10
- if (numericValue(value) === null) return /* @__PURE__ */ jsx("span", { children: formatCell(value, column) });
11
5
  const rawCode = props.currencyField ? row[props.currencyField] : void 0;
12
6
  const code = props.currency ?? (typeof rawCode === "string" ? rawCode : null);
13
- const content = /* @__PURE__ */ jsx("span", {
14
- className: "tabular-nums",
15
- children: formatNumber(value, {
7
+ return /* @__PURE__ */ jsx(NumericCell, {
8
+ column,
9
+ copyable: props.copyable,
10
+ value,
11
+ format: {
16
12
  kind: "number",
17
13
  notation: "standard",
18
14
  minimumFractionDigits: props.minimumFractionDigits,
19
15
  maximumFractionDigits: props.maximumFractionDigits,
20
16
  currency: code,
21
17
  unit: null
22
- }, locale)
23
- });
24
- if (!props.copyable) return content;
25
- return /* @__PURE__ */ jsx(CopyableText, {
26
- value: String(value),
27
- label: column.props.label ?? column.key,
28
- testId: `copy-${column.key}`,
29
- children: content
18
+ }
30
19
  });
31
20
  };
32
21
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"money-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/money-cell.tsx"],"sourcesContent":["import { useLocale } from \"@lattice-php/lattice/i18n\";\nimport { formatNumber } from \"@lattice-php/lattice/format/number\";\nimport { numericValue } from \"@lattice-php/lattice/format/numeric\";\nimport { formatCell } from \"@lattice-php/lattice/table/lib/format\";\nimport type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\nimport { CopyableText } from \"@lattice-php/lattice/ui/copyable-text\";\n\nexport const MoneyCell: ColumnCellComponent<\"column.money\"> = ({ column, props, row, value }) => {\n const { locale } = useLocale();\n\n if (numericValue(value) === null) {\n return <span>{formatCell(value, column)}</span>;\n }\n\n const rawCode = props.currencyField ? row[props.currencyField] : undefined;\n const code = props.currency ?? (typeof rawCode === \"string\" ? rawCode : null);\n\n const text = formatNumber(\n value,\n {\n kind: \"number\",\n notation: \"standard\",\n minimumFractionDigits: props.minimumFractionDigits,\n maximumFractionDigits: props.maximumFractionDigits,\n currency: code,\n unit: null,\n },\n locale,\n );\n\n const content = <span className=\"tabular-nums\">{text}</span>;\n\n if (!props.copyable) {\n return content;\n }\n\n return (\n <CopyableText\n value={String(value)}\n label={column.props.label ?? column.key}\n testId={`copy-${column.key}`}\n >\n {content}\n </CopyableText>\n );\n};\n"],"mappings":";;;;;;;AAOA,IAAa,aAAkD,EAAE,QAAQ,OAAO,KAAK,YAAY;CAC/F,MAAM,EAAE,WAAW,UAAU;CAE7B,IAAI,aAAa,KAAK,MAAM,MAC1B,OAAO,oBAAC,QAAD,EAAA,UAAO,WAAW,OAAO,MAAM,EAAQ,CAAA;CAGhD,MAAM,UAAU,MAAM,gBAAgB,IAAI,MAAM,iBAAiB,KAAA;CACjE,MAAM,OAAO,MAAM,aAAa,OAAO,YAAY,WAAW,UAAU;CAexE,MAAM,UAAU,oBAAC,QAAD;EAAM,WAAU;YAbnB,aACX,OACA;GACE,MAAM;GACN,UAAU;GACV,uBAAuB,MAAM;GAC7B,uBAAuB,MAAM;GAC7B,UAAU;GACV,MAAM;EACR,GACA,MAG8C;CAAW,CAAA;CAE3D,IAAI,CAAC,MAAM,UACT,OAAO;CAGT,OACE,oBAAC,cAAD;EACE,OAAO,OAAO,KAAK;EACnB,OAAO,OAAO,MAAM,SAAS,OAAO;EACpC,QAAQ,QAAQ,OAAO;YAEtB;CACW,CAAA;AAElB"}
1
+ {"version":3,"file":"money-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/money-cell.tsx"],"sourcesContent":["import type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\nimport { NumericCell } from \"./numeric-cell\";\n\nexport const MoneyCell: ColumnCellComponent<\"column.money\"> = ({ column, props, row, value }) => {\n const rawCode = props.currencyField ? row[props.currencyField] : undefined;\n const code = props.currency ?? (typeof rawCode === \"string\" ? rawCode : null);\n\n return (\n <NumericCell\n column={column}\n copyable={props.copyable}\n value={value}\n format={{\n kind: \"number\",\n notation: \"standard\",\n minimumFractionDigits: props.minimumFractionDigits,\n maximumFractionDigits: props.maximumFractionDigits,\n currency: code,\n unit: null,\n }}\n />\n );\n};\n"],"mappings":";;;AAGA,IAAa,aAAkD,EAAE,QAAQ,OAAO,KAAK,YAAY;CAC/F,MAAM,UAAU,MAAM,gBAAgB,IAAI,MAAM,iBAAiB,KAAA;CACjE,MAAM,OAAO,MAAM,aAAa,OAAO,YAAY,WAAW,UAAU;CAExE,OACE,oBAAC,aAAD;EACU;EACR,UAAU,MAAM;EACT;EACP,QAAQ;GACN,MAAM;GACN,UAAU;GACV,uBAAuB,MAAM;GAC7B,uBAAuB,MAAM;GAC7B,UAAU;GACV,MAAM;EACR;CACD,CAAA;AAEL"}
@@ -1,32 +1,19 @@
1
- import { useLocale } from "../../../i18n/locale.js";
2
- import { CopyableText } from "../../../ui/copyable-text.js";
3
- import { formatCell } from "../../lib/format.js";
4
- import { numericValue } from "../../../format/numeric.js";
5
- import { formatNumber } from "../../../format/number.js";
1
+ import { NumericCell } from "./numeric-cell.js";
6
2
  import { jsx } from "react/jsx-runtime";
7
3
  //#region resources/js/table/components/cells/number-cell.tsx
8
- var NumberCell = ({ column, props, value }) => {
9
- const { locale } = useLocale();
10
- if (numericValue(value) === null) return /* @__PURE__ */ jsx("span", { children: formatCell(value, column) });
11
- const content = /* @__PURE__ */ jsx("span", {
12
- className: "tabular-nums",
13
- children: formatNumber(value, {
14
- kind: "number",
15
- notation: props.compact ? "compact" : "standard",
16
- minimumFractionDigits: props.minimumFractionDigits,
17
- maximumFractionDigits: props.maximumFractionDigits,
18
- currency: null,
19
- unit: props.unit
20
- }, locale)
21
- });
22
- if (!props.copyable) return content;
23
- return /* @__PURE__ */ jsx(CopyableText, {
24
- value: String(value),
25
- label: column.props.label ?? column.key,
26
- testId: `copy-${column.key}`,
27
- children: content
28
- });
29
- };
4
+ var NumberCell = ({ column, props, value }) => /* @__PURE__ */ jsx(NumericCell, {
5
+ column,
6
+ copyable: props.copyable,
7
+ value,
8
+ format: {
9
+ kind: "number",
10
+ notation: props.compact ? "compact" : "standard",
11
+ minimumFractionDigits: props.minimumFractionDigits,
12
+ maximumFractionDigits: props.maximumFractionDigits,
13
+ currency: null,
14
+ unit: props.unit
15
+ }
16
+ });
30
17
  //#endregion
31
18
  export { NumberCell };
32
19
 
@@ -1 +1 @@
1
- {"version":3,"file":"number-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/number-cell.tsx"],"sourcesContent":["import { useLocale } from \"@lattice-php/lattice/i18n\";\nimport { formatNumber } from \"@lattice-php/lattice/format/number\";\nimport { numericValue } from \"@lattice-php/lattice/format/numeric\";\nimport { formatCell } from \"@lattice-php/lattice/table/lib/format\";\nimport type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\nimport { CopyableText } from \"@lattice-php/lattice/ui/copyable-text\";\n\nexport const NumberCell: ColumnCellComponent<\"column.number\"> = ({ column, props, value }) => {\n const { locale } = useLocale();\n\n if (numericValue(value) === null) {\n return <span>{formatCell(value, column)}</span>;\n }\n\n const text = formatNumber(\n value,\n {\n kind: \"number\",\n notation: props.compact ? \"compact\" : \"standard\",\n minimumFractionDigits: props.minimumFractionDigits,\n maximumFractionDigits: props.maximumFractionDigits,\n currency: null,\n unit: props.unit,\n },\n locale,\n );\n\n const content = <span className=\"tabular-nums\">{text}</span>;\n\n if (!props.copyable) {\n return content;\n }\n\n return (\n <CopyableText\n value={String(value)}\n label={column.props.label ?? column.key}\n testId={`copy-${column.key}`}\n >\n {content}\n </CopyableText>\n );\n};\n"],"mappings":";;;;;;;AAOA,IAAa,cAAoD,EAAE,QAAQ,OAAO,YAAY;CAC5F,MAAM,EAAE,WAAW,UAAU;CAE7B,IAAI,aAAa,KAAK,MAAM,MAC1B,OAAO,oBAAC,QAAD,EAAA,UAAO,WAAW,OAAO,MAAM,EAAQ,CAAA;CAgBhD,MAAM,UAAU,oBAAC,QAAD;EAAM,WAAU;YAbnB,aACX,OACA;GACE,MAAM;GACN,UAAU,MAAM,UAAU,YAAY;GACtC,uBAAuB,MAAM;GAC7B,uBAAuB,MAAM;GAC7B,UAAU;GACV,MAAM,MAAM;EACd,GACA,MAG8C;CAAW,CAAA;CAE3D,IAAI,CAAC,MAAM,UACT,OAAO;CAGT,OACE,oBAAC,cAAD;EACE,OAAO,OAAO,KAAK;EACnB,OAAO,OAAO,MAAM,SAAS,OAAO;EACpC,QAAQ,QAAQ,OAAO;YAEtB;CACW,CAAA;AAElB"}
1
+ {"version":3,"file":"number-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/number-cell.tsx"],"sourcesContent":["import type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\nimport { NumericCell } from \"./numeric-cell\";\n\nexport const NumberCell: ColumnCellComponent<\"column.number\"> = ({ column, props, value }) => (\n <NumericCell\n column={column}\n copyable={props.copyable}\n value={value}\n format={{\n kind: \"number\",\n notation: props.compact ? \"compact\" : \"standard\",\n minimumFractionDigits: props.minimumFractionDigits,\n maximumFractionDigits: props.maximumFractionDigits,\n currency: null,\n unit: props.unit,\n }}\n />\n);\n"],"mappings":";;;AAGA,IAAa,cAAoD,EAAE,QAAQ,OAAO,YAChF,oBAAC,aAAD;CACU;CACR,UAAU,MAAM;CACT;CACP,QAAQ;EACN,MAAM;EACN,UAAU,MAAM,UAAU,YAAY;EACtC,uBAAuB,MAAM;EAC7B,uBAAuB,MAAM;EAC7B,UAAU;EACV,MAAM,MAAM;CACd;AACD,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { ReactNode } from 'react';
2
+ import { NumberFormat } from '../../../types/index.js';
3
+ import { TableColumn } from '../../types.js';
4
+ /** Shared numeric cell body for the money and number columns. */
5
+ export declare function NumericCell({ column, copyable, format, value, }: {
6
+ column: TableColumn;
7
+ copyable?: boolean | null;
8
+ format: NumberFormat;
9
+ value: unknown;
10
+ }): ReactNode;
@@ -0,0 +1,25 @@
1
+ import { useLocale } from "../../../i18n/locale.js";
2
+ import { formatCell } from "../../lib/format.js";
3
+ import { numericValue } from "../../../format/numeric.js";
4
+ import { formatNumber } from "../../../format/number.js";
5
+ import { CopyableCell } from "./copyable-cell.js";
6
+ import { jsx } from "react/jsx-runtime";
7
+ //#region resources/js/table/components/cells/numeric-cell.tsx
8
+ /** Shared numeric cell body for the money and number columns. */
9
+ function NumericCell({ column, copyable, format, value }) {
10
+ const { locale } = useLocale();
11
+ if (numericValue(value) === null) return /* @__PURE__ */ jsx("span", { children: formatCell(value, column) });
12
+ return /* @__PURE__ */ jsx(CopyableCell, {
13
+ column,
14
+ copyable,
15
+ value: String(value),
16
+ children: /* @__PURE__ */ jsx("span", {
17
+ className: "tabular-nums",
18
+ children: formatNumber(value, format, locale)
19
+ })
20
+ });
21
+ }
22
+ //#endregion
23
+ export { NumericCell };
24
+
25
+ //# sourceMappingURL=numeric-cell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numeric-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/numeric-cell.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { useLocale } from \"@lattice-php/lattice/i18n\";\nimport type { NumberFormat } from \"@lattice-php/lattice/types\";\nimport { formatNumber } from \"@lattice-php/lattice/format/number\";\nimport { numericValue } from \"@lattice-php/lattice/format/numeric\";\nimport { formatCell } from \"@lattice-php/lattice/table/lib/format\";\nimport type { TableColumn } from \"@lattice-php/lattice/table/types\";\nimport { CopyableCell } from \"./copyable-cell\";\n\n/** Shared numeric cell body for the money and number columns. */\nexport function NumericCell({\n column,\n copyable,\n format,\n value,\n}: {\n column: TableColumn;\n copyable?: boolean | null;\n format: NumberFormat;\n value: unknown;\n}): ReactNode {\n const { locale } = useLocale();\n\n if (numericValue(value) === null) {\n return <span>{formatCell(value, column)}</span>;\n }\n\n return (\n <CopyableCell column={column} copyable={copyable} value={String(value)}>\n <span className=\"tabular-nums\">{formatNumber(value, format, locale)}</span>\n </CopyableCell>\n );\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,YAAY,EAC1B,QACA,UACA,QACA,SAMY;CACZ,MAAM,EAAE,WAAW,UAAU;CAE7B,IAAI,aAAa,KAAK,MAAM,MAC1B,OAAO,oBAAC,QAAD,EAAA,UAAO,WAAW,OAAO,MAAM,EAAQ,CAAA;CAGhD,OACE,oBAAC,cAAD;EAAsB;EAAkB;EAAU,OAAO,OAAO,KAAK;YACnE,oBAAC,QAAD;GAAM,WAAU;aAAgB,aAAa,OAAO,QAAQ,MAAM;EAAQ,CAAA;CAC9D,CAAA;AAElB"}
@@ -1,5 +1,5 @@
1
- import { Renderer } from "../../../core/renderer.js";
2
1
  import { materializeSchema } from "../../../core/materialize.js";
2
+ import { Renderer } from "../../../core/renderer.js";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  //#region resources/js/table/components/cells/stack-cell.tsx
5
5
  var StackCell = ({ column, row }) => /* @__PURE__ */ jsx("div", {
@@ -1,8 +1,8 @@
1
1
  import { cn } from "../../../lib/utils.js";
2
2
  import { DateTime } from "../../../i18n/date-time.js";
3
- import { CopyableText } from "../../../ui/copyable-text.js";
4
3
  import { coerceColor, namedColor, toneProps } from "../../../lib/color.js";
5
4
  import { formatCell, resolveLink } from "../../lib/format.js";
5
+ import { CopyableCell } from "./copyable-cell.js";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  //#region resources/js/table/components/cells/text-cell.tsx
8
8
  var TextCell = (args) => {
@@ -57,11 +57,10 @@ function PlainTextCell({ column, props, row, value }) {
57
57
  dateStyle: dateProps.dateStyle,
58
58
  timeStyle: dateProps.timeStyle
59
59
  });
60
- if (!props.copyable) return content;
61
- return /* @__PURE__ */ jsx(CopyableText, {
60
+ return /* @__PURE__ */ jsx(CopyableCell, {
61
+ column,
62
+ copyable: props.copyable,
62
63
  value: text,
63
- label: column.props.label ?? column.key,
64
- testId: `copy-${column.key}`,
65
64
  children: content
66
65
  });
67
66
  }