@lattice-php/lattice 0.18.0 → 0.20.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 (255) hide show
  1. package/README.md +1 -1
  2. package/dist/core/index.js +3 -3
  3. package/dist/core/nodes.d.ts +5 -0
  4. package/dist/core/nodes.js +8 -1
  5. package/dist/core/nodes.js.map +1 -1
  6. package/dist/core/renderer.js +1 -3
  7. package/dist/core/renderer.js.map +1 -1
  8. package/dist/core/types.d.ts +16 -4
  9. package/dist/create-app.d.ts +31 -3
  10. package/dist/create-app.js +48 -10
  11. package/dist/create-app.js.map +1 -1
  12. package/dist/effects/registry.d.ts +3 -3
  13. package/dist/effects/registry.js +4 -4
  14. package/dist/effects/registry.js.map +1 -1
  15. package/dist/events/event-names.d.ts +0 -3
  16. package/dist/events/event-names.js +0 -3
  17. package/dist/events/event-names.js.map +1 -1
  18. package/dist/form/components/base/field.d.ts +2 -2
  19. package/dist/form/components/base/field.js +2 -2
  20. package/dist/form/components/base/field.js.map +1 -1
  21. package/dist/form/components/fields/color-picker-field.d.ts +2 -0
  22. package/dist/form/components/fields/color-picker-field.js +57 -0
  23. package/dist/form/components/fields/color-picker-field.js.map +1 -0
  24. package/dist/form/components/fields/date-input.js +1 -1
  25. package/dist/form/components/fields/date-picker-field.js +1 -1
  26. package/dist/form/components/fields/date-time-input.js +1 -1
  27. package/dist/form/components/fields/file-upload.js +7 -12
  28. package/dist/form/components/fields/file-upload.js.map +1 -1
  29. package/dist/form/components/fields/number-input.js +1 -1
  30. package/dist/form/components/fields/rich-editor-field.js +36 -275
  31. package/dist/form/components/fields/rich-editor-field.js.map +1 -1
  32. package/dist/form/components/fields/row-action-menu.js +2 -2
  33. package/dist/form/components/fields/row-action-menu.js.map +1 -1
  34. package/dist/form/components/fields/row-actions.js +3 -1
  35. package/dist/form/components/fields/row-actions.js.map +1 -1
  36. package/dist/form/components/fields/row-item.js +2 -1
  37. package/dist/form/components/fields/row-item.js.map +1 -1
  38. package/dist/form/components/fields/select.js +59 -16
  39. package/dist/form/components/fields/select.js.map +1 -1
  40. package/dist/form/components/fields/table-rows.js +5 -4
  41. package/dist/form/components/fields/table-rows.js.map +1 -1
  42. package/dist/form/components/fields/text-input.js +8 -1
  43. package/dist/form/components/fields/text-input.js.map +1 -1
  44. package/dist/form/components/fields/time-input.js +1 -1
  45. package/dist/form/components/index.d.ts +1 -0
  46. package/dist/form/components/index.js +2 -1
  47. package/dist/form/embed.d.ts +1 -0
  48. package/dist/form/embed.js +2 -1
  49. package/dist/form/hooks/use-form-resolver.js.map +1 -1
  50. package/dist/form/index.js +2 -1
  51. package/dist/form/lib/conditions.d.ts +4 -10
  52. package/dist/form/lib/conditions.js.map +1 -1
  53. package/dist/form/lib/field-props.d.ts +4 -18
  54. package/dist/form/lib/field-props.js.map +1 -1
  55. package/dist/form/plugin.js +2 -0
  56. package/dist/form/plugin.js.map +1 -1
  57. package/dist/form/rich-editor/builtins.d.ts +6 -0
  58. package/dist/form/rich-editor/builtins.js +400 -0
  59. package/dist/form/rich-editor/builtins.js.map +1 -0
  60. package/dist/form/rich-editor/index.d.ts +7 -0
  61. package/dist/form/rich-editor/index.js +3 -0
  62. package/dist/form/rich-editor/registry.d.ts +67 -0
  63. package/dist/form/rich-editor/registry.js +79 -0
  64. package/dist/form/rich-editor/registry.js.map +1 -0
  65. package/dist/form/rich-editor/toolbar-button.d.ts +12 -0
  66. package/dist/form/rich-editor/toolbar-button.js +28 -0
  67. package/dist/form/rich-editor/toolbar-button.js.map +1 -0
  68. package/dist/form/types.d.ts +1 -6
  69. package/dist/format/date-time.d.ts +3 -2
  70. package/dist/format/date-time.js.map +1 -1
  71. package/dist/i18n/backend.js +1 -1
  72. package/dist/i18n/date-time.d.ts +3 -2
  73. package/dist/i18n/date-time.js.map +1 -1
  74. package/dist/i18n/index.js +3 -2
  75. package/dist/i18n/instance.js +1 -1
  76. package/dist/i18n/page-props.d.ts +3 -2
  77. package/dist/i18n/page-props.js +1 -15
  78. package/dist/i18n/page-props.js.map +1 -1
  79. package/dist/i18n/shared-props.d.ts +7 -0
  80. package/dist/i18n/shared-props.js +25 -0
  81. package/dist/i18n/shared-props.js.map +1 -0
  82. package/dist/icons/icon-renderer.js.map +1 -1
  83. package/dist/index.d.ts +5 -3
  84. package/dist/index.js +7 -6
  85. package/dist/lattice.css +119 -57
  86. package/dist/layout/components/breadcrumbs.js +3 -1
  87. package/dist/layout/components/breadcrumbs.js.map +1 -1
  88. package/dist/layout/components/callouts.js +1 -1
  89. package/dist/lib/color.d.ts +9 -0
  90. package/dist/lib/color.js +48 -0
  91. package/dist/lib/color.js.map +1 -0
  92. package/dist/notifications/api.d.ts +6 -6
  93. package/dist/notifications/api.js.map +1 -1
  94. package/dist/notifications/types.d.ts +2 -10
  95. package/dist/provider-base.js +1 -1
  96. package/dist/realtime/build-effects.js +5 -5
  97. package/dist/realtime/build-effects.js.map +1 -1
  98. package/dist/realtime/listeners.d.ts +2 -2
  99. package/dist/realtime/listeners.js.map +1 -1
  100. package/dist/realtime/subscriptions.d.ts +2 -2
  101. package/dist/realtime/subscriptions.js.map +1 -1
  102. package/dist/registry.js.map +1 -1
  103. package/dist/table/components/bulk-bar.js +5 -5
  104. package/dist/table/components/bulk-bar.js.map +1 -1
  105. package/dist/table/components/cells/badge-cell.js +4 -1
  106. package/dist/table/components/cells/badge-cell.js.map +1 -1
  107. package/dist/table/components/cells/boolean-cell.js +3 -1
  108. package/dist/table/components/cells/boolean-cell.js.map +1 -1
  109. package/dist/table/components/cells/icon-cell.js +5 -2
  110. package/dist/table/components/cells/icon-cell.js.map +1 -1
  111. package/dist/table/components/cells/image-cell.js +8 -9
  112. package/dist/table/components/cells/image-cell.js.map +1 -1
  113. package/dist/table/components/cells/money-cell.js +9 -1
  114. package/dist/table/components/cells/money-cell.js.map +1 -1
  115. package/dist/table/components/cells/number-cell.js +9 -1
  116. package/dist/table/components/cells/number-cell.js.map +1 -1
  117. package/dist/table/components/cells/text-cell.js +4 -1
  118. package/dist/table/components/cells/text-cell.js.map +1 -1
  119. package/dist/table/components/column-filter-control.js +25 -32
  120. package/dist/table/components/column-filter-control.js.map +1 -1
  121. package/dist/table/components/column-header.d.ts +3 -3
  122. package/dist/table/components/column-header.js +5 -3
  123. package/dist/table/components/column-header.js.map +1 -1
  124. package/dist/table/components/column-visibility-menu.js +6 -11
  125. package/dist/table/components/column-visibility-menu.js.map +1 -1
  126. package/dist/table/components/filter-bar.d.ts +2 -2
  127. package/dist/table/components/filter-bar.js +13 -22
  128. package/dist/table/components/filter-bar.js.map +1 -1
  129. package/dist/table/components/filter-controls.d.ts +2 -1
  130. package/dist/table/components/filter-controls.js +36 -35
  131. package/dist/table/components/filter-controls.js.map +1 -1
  132. package/dist/table/components/filter-value-input.d.ts +0 -1
  133. package/dist/table/components/filter-value-input.js +21 -20
  134. package/dist/table/components/filter-value-input.js.map +1 -1
  135. package/dist/table/components/pagination.js +16 -20
  136. package/dist/table/components/pagination.js.map +1 -1
  137. package/dist/table/components/sort-bar.d.ts +3 -3
  138. package/dist/table/components/sort-bar.js +11 -12
  139. package/dist/table/components/sort-bar.js.map +1 -1
  140. package/dist/table/components/table-search.d.ts +9 -0
  141. package/dist/table/components/table-search.js +75 -0
  142. package/dist/table/components/table-search.js.map +1 -0
  143. package/dist/table/components/table.js +72 -19
  144. package/dist/table/components/table.js.map +1 -1
  145. package/dist/table/hooks/use-expanded-rows.d.ts +8 -0
  146. package/dist/table/hooks/use-expanded-rows.js +24 -0
  147. package/dist/table/hooks/use-expanded-rows.js.map +1 -0
  148. package/dist/table/hooks/use-table.d.ts +5 -3
  149. package/dist/table/hooks/use-table.js +56 -44
  150. package/dist/table/hooks/use-table.js.map +1 -1
  151. package/dist/table/lib/payload.d.ts +3 -2
  152. package/dist/table/lib/payload.js +16 -10
  153. package/dist/table/lib/payload.js.map +1 -1
  154. package/dist/table/lib/query.d.ts +5 -5
  155. package/dist/table/lib/query.js +20 -18
  156. package/dist/table/lib/query.js.map +1 -1
  157. package/dist/table/types.d.ts +3 -26
  158. package/dist/toast/callout.js +1 -3
  159. package/dist/toast/callout.js.map +1 -1
  160. package/dist/toast/toast.d.ts +1 -5
  161. package/dist/toast/toast.js +2 -7
  162. package/dist/toast/toast.js.map +1 -1
  163. package/dist/toast/toaster.js +2 -2
  164. package/dist/toast/toaster.js.map +1 -1
  165. package/dist/types/generated.d.ts +263 -188
  166. package/dist/ui/affix-group.d.ts +2 -1
  167. package/dist/ui/affix-group.js +9 -7
  168. package/dist/ui/affix-group.js.map +1 -1
  169. package/dist/ui/avatar.d.ts +3 -0
  170. package/dist/ui/avatar.js +52 -0
  171. package/dist/ui/avatar.js.map +1 -0
  172. package/dist/ui/button.d.ts +3 -1
  173. package/dist/ui/button.js +10 -3
  174. package/dist/ui/button.js.map +1 -1
  175. package/dist/ui/chart-view.js +161 -11
  176. package/dist/ui/chart-view.js.map +1 -1
  177. package/dist/ui/click-behavior.d.ts +1 -1
  178. package/dist/ui/click-behavior.js.map +1 -1
  179. package/dist/ui/collapsible.js +1 -1
  180. package/dist/ui/color-picker.d.ts +8 -0
  181. package/dist/ui/color-picker.js +59 -0
  182. package/dist/ui/color-picker.js.map +1 -0
  183. package/dist/ui/combobox.d.ts +11 -2
  184. package/dist/ui/combobox.js +51 -8
  185. package/dist/ui/combobox.js.map +1 -1
  186. package/dist/ui/copyable-text.d.ts +7 -0
  187. package/dist/ui/copyable-text.js +21 -13
  188. package/dist/ui/copyable-text.js.map +1 -1
  189. package/dist/ui/fragment.js +1 -1
  190. package/dist/ui/fragment.js.map +1 -1
  191. package/dist/ui/heading.js +39 -21
  192. package/dist/ui/heading.js.map +1 -1
  193. package/dist/ui/icon-button.d.ts +22 -0
  194. package/dist/ui/icon-button.js +51 -0
  195. package/dist/ui/icon-button.js.map +1 -0
  196. package/dist/ui/icon.js +10 -11
  197. package/dist/ui/icon.js.map +1 -1
  198. package/dist/ui/image-preview.d.ts +12 -0
  199. package/dist/ui/image-preview.js +65 -0
  200. package/dist/ui/image-preview.js.map +1 -0
  201. package/dist/ui/image.d.ts +3 -0
  202. package/dist/ui/image.js +21 -0
  203. package/dist/ui/image.js.map +1 -0
  204. package/dist/ui/index.d.ts +2 -1
  205. package/dist/ui/index.js +4 -3
  206. package/dist/ui/info-tooltip.js +1 -1
  207. package/dist/ui/info-tooltip.js.map +1 -1
  208. package/dist/ui/input.d.ts +3 -1
  209. package/dist/ui/input.js +2 -2
  210. package/dist/ui/input.js.map +1 -1
  211. package/dist/ui/modal.js +14 -2
  212. package/dist/ui/modal.js.map +1 -1
  213. package/dist/ui/native-select.d.ts +10 -0
  214. package/dist/ui/native-select.js +23 -0
  215. package/dist/ui/native-select.js.map +1 -0
  216. package/dist/ui/plugin.js +11 -1
  217. package/dist/ui/plugin.js.map +1 -1
  218. package/dist/ui/progress.d.ts +3 -0
  219. package/dist/ui/progress.js +114 -0
  220. package/dist/ui/progress.js.map +1 -0
  221. package/dist/ui/section.js +1 -1
  222. package/dist/ui/separator.d.ts +3 -0
  223. package/dist/ui/separator.js +15 -0
  224. package/dist/ui/separator.js.map +1 -0
  225. package/dist/ui/text.js +5 -10
  226. package/dist/ui/text.js.map +1 -1
  227. package/dist/ui/tooltip.js +1 -1
  228. package/dist/ui/tree-context.d.ts +33 -0
  229. package/dist/ui/tree-context.js +137 -0
  230. package/dist/ui/tree-context.js.map +1 -0
  231. package/dist/ui/tree.d.ts +19 -0
  232. package/dist/ui/tree.js +187 -0
  233. package/dist/ui/tree.js.map +1 -0
  234. package/dist-standalone/chunks/chart-view-wJmnVu7L.js +36 -0
  235. package/dist-standalone/chunks/date-picker-field-VbH9xrQO.js +1 -0
  236. package/dist-standalone/chunks/dist-PaT1gYi_.js +2 -0
  237. package/dist-standalone/chunks/jsx-runtime-Drll_-DD.js +1 -0
  238. package/dist-standalone/chunks/locale-CXqr7LPR.js +1 -0
  239. package/dist-standalone/chunks/notifications-echo-DsfNc4Ge.js +1 -0
  240. package/dist-standalone/chunks/page-props-AIa5UR6n.js +1 -0
  241. package/dist-standalone/chunks/react-B8IZ02wI.js +1 -0
  242. package/dist-standalone/chunks/rich-editor-field-DLQTyt36.js +154 -0
  243. package/dist-standalone/chunks/subscriptions-DY2tj9Im.js +1 -0
  244. package/dist-standalone/chunks/test-id-Dh3L6Gfh.js +1 -0
  245. package/dist-standalone/chunks/use-effect-dispatcher-feEs0GCP.js +97 -0
  246. package/dist-standalone/chunks/with-selector-BwDoCrJJ.js +1 -0
  247. package/dist-standalone/lattice.css +3 -0
  248. package/dist-standalone/lattice.js +66 -0
  249. package/dist-standalone/manifest.json +20 -0
  250. package/dist-standalone/sprite.svg +1 -0
  251. package/package.json +11 -2
  252. package/resources/icons/code-xml.svg +17 -0
  253. package/resources/icons/heading.svg +17 -0
  254. package/dist/action/hooks/use-click-behavior.d.ts +0 -3
  255. package/dist/action/hooks/use-click-behavior.js +0 -3
@@ -0,0 +1,48 @@
1
+ //#region resources/js/lib/color.ts
2
+ var names = new Set([
3
+ "default",
4
+ "muted",
5
+ "primary",
6
+ "success",
7
+ "info",
8
+ "warning",
9
+ "danger",
10
+ "gray",
11
+ "red",
12
+ "orange",
13
+ "yellow",
14
+ "green",
15
+ "blue",
16
+ "purple"
17
+ ]);
18
+ function namedColor(value) {
19
+ return {
20
+ kind: "named",
21
+ value,
22
+ dark: null
23
+ };
24
+ }
25
+ function coerceColor(value) {
26
+ if (typeof value === "string" && value !== "") return names.has(value) ? namedColor(value) : {
27
+ kind: "css",
28
+ value,
29
+ dark: null
30
+ };
31
+ if (typeof value === "object" && value !== null && "kind" in value && "value" in value) return value;
32
+ }
33
+ function colorValue(color) {
34
+ if (color.kind === "named") return `var(--lt-color-${color.value})`;
35
+ return color.dark === null ? color.value : `light-dark(${color.value}, ${color.dark})`;
36
+ }
37
+ function toneProps(color) {
38
+ if (color.kind === "named") return { className: `lt-tone-${color.value}` };
39
+ const paint = colorValue(color);
40
+ return { style: {
41
+ "--lt-tone-bg": `color-mix(in oklab, ${paint} 12%, transparent)`,
42
+ "--lt-tone-fg": paint
43
+ } };
44
+ }
45
+ //#endregion
46
+ export { coerceColor, colorValue, namedColor, toneProps };
47
+
48
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","names":[],"sources":["../../resources/js/lib/color.ts"],"sourcesContent":["import type { CSSProperties } from \"react\";\nimport type { Color, ColorName } from \"@lattice-php/lattice/types/generated\";\n\nconst names: ReadonlySet<string> = new Set([\n \"default\",\n \"muted\",\n \"primary\",\n \"success\",\n \"info\",\n \"warning\",\n \"danger\",\n \"gray\",\n \"red\",\n \"orange\",\n \"yellow\",\n \"green\",\n \"blue\",\n \"purple\",\n] satisfies ColorName[]);\n\nexport function namedColor(value: ColorName): Color {\n return { kind: \"named\", value, dark: null };\n}\n\nexport function coerceColor(value: unknown): Color | undefined {\n if (typeof value === \"string\" && value !== \"\") {\n return names.has(value) ? namedColor(value as ColorName) : { kind: \"css\", value, dark: null };\n }\n\n if (typeof value === \"object\" && value !== null && \"kind\" in value && \"value\" in value) {\n return value as Color;\n }\n\n return undefined;\n}\n\nexport function colorValue(color: Color): string {\n if (color.kind === \"named\") {\n return `var(--lt-color-${color.value})`;\n }\n\n return color.dark === null ? color.value : `light-dark(${color.value}, ${color.dark})`;\n}\n\nexport function toneProps(color: Color): { className?: string; style?: CSSProperties } {\n if (color.kind === \"named\") {\n return { className: `lt-tone-${color.value}` };\n }\n\n const paint = colorValue(color);\n\n return {\n style: {\n \"--lt-tone-bg\": `color-mix(in oklab, ${paint} 12%, transparent)`,\n \"--lt-tone-fg\": paint,\n } as CSSProperties,\n };\n}\n"],"mappings":";AAGA,IAAM,QAA6B,IAAI,IAAI;CACzC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAuB;AAEvB,SAAgB,WAAW,OAAyB;CAClD,OAAO;EAAE,MAAM;EAAS;EAAO,MAAM;CAAK;AAC5C;AAEA,SAAgB,YAAY,OAAmC;CAC7D,IAAI,OAAO,UAAU,YAAY,UAAU,IACzC,OAAO,MAAM,IAAI,KAAK,IAAI,WAAW,KAAkB,IAAI;EAAE,MAAM;EAAO;EAAO,MAAM;CAAK;CAG9F,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,SAAS,WAAW,OAC/E,OAAO;AAIX;AAEA,SAAgB,WAAW,OAAsB;CAC/C,IAAI,MAAM,SAAS,SACjB,OAAO,kBAAkB,MAAM,MAAM;CAGvC,OAAO,MAAM,SAAS,OAAO,MAAM,QAAQ,cAAc,MAAM,MAAM,IAAI,MAAM,KAAK;AACtF;AAEA,SAAgB,UAAU,OAA6D;CACrF,IAAI,MAAM,SAAS,SACjB,OAAO,EAAE,WAAW,WAAW,MAAM,QAAQ;CAG/C,MAAM,QAAQ,WAAW,KAAK;CAE9B,OAAO,EACL,OAAO;EACL,gBAAgB,uBAAuB,MAAM;EAC7C,gBAAgB;CAClB,EACF;AACF"}
@@ -1,6 +1,6 @@
1
- import { NotificationsResponse, UnreadCountResponse } from './types.js';
2
- export declare function fetchNotifications(endpoint: string, page?: number): Promise<NotificationsResponse>;
3
- export declare function markRead(endpoint: string, id: string): Promise<UnreadCountResponse>;
4
- export declare function markAllRead(endpoint: string): Promise<UnreadCountResponse>;
5
- export declare function dismiss(endpoint: string, id: string): Promise<UnreadCountResponse>;
6
- export declare function clearAll(endpoint: string): Promise<UnreadCountResponse>;
1
+ import { NotificationList, UnreadCount } from './types.js';
2
+ export declare function fetchNotifications(endpoint: string, page?: number): Promise<NotificationList>;
3
+ export declare function markRead(endpoint: string, id: string): Promise<UnreadCount>;
4
+ export declare function markAllRead(endpoint: string): Promise<UnreadCount>;
5
+ export declare function dismiss(endpoint: string, id: string): Promise<UnreadCount>;
6
+ export declare function clearAll(endpoint: string): Promise<UnreadCount>;
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","names":[],"sources":["../../resources/js/notifications/api.ts"],"sourcesContent":["import { apiJson } from \"@lattice-php/lattice/core/api\";\nimport type { NotificationsResponse, UnreadCountResponse } from \"./types\";\n\nexport function fetchNotifications(endpoint: string, page = 1): Promise<NotificationsResponse> {\n return apiJson<NotificationsResponse>(`${endpoint}?page=${page}`);\n}\n\nexport function markRead(endpoint: string, id: string): Promise<UnreadCountResponse> {\n return apiJson<UnreadCountResponse>(`${endpoint}/${id}/read`, { method: \"PATCH\" });\n}\n\nexport function markAllRead(endpoint: string): Promise<UnreadCountResponse> {\n return apiJson<UnreadCountResponse>(`${endpoint}/read-all`, { method: \"POST\" });\n}\n\nexport function dismiss(endpoint: string, id: string): Promise<UnreadCountResponse> {\n return apiJson<UnreadCountResponse>(`${endpoint}/${id}`, { method: \"DELETE\" });\n}\n\nexport function clearAll(endpoint: string): Promise<UnreadCountResponse> {\n return apiJson<UnreadCountResponse>(endpoint, { method: \"DELETE\" });\n}\n"],"mappings":";;AAGA,SAAgB,mBAAmB,UAAkB,OAAO,GAAmC;CAC7F,OAAO,QAA+B,GAAG,SAAS,QAAQ,MAAM;AAClE;AAEA,SAAgB,SAAS,UAAkB,IAA0C;CACnF,OAAO,QAA6B,GAAG,SAAS,GAAG,GAAG,QAAQ,EAAE,QAAQ,QAAQ,CAAC;AACnF;AAEA,SAAgB,YAAY,UAAgD;CAC1E,OAAO,QAA6B,GAAG,SAAS,YAAY,EAAE,QAAQ,OAAO,CAAC;AAChF;AAEA,SAAgB,QAAQ,UAAkB,IAA0C;CAClF,OAAO,QAA6B,GAAG,SAAS,GAAG,MAAM,EAAE,QAAQ,SAAS,CAAC;AAC/E;AAEA,SAAgB,SAAS,UAAgD;CACvE,OAAO,QAA6B,UAAU,EAAE,QAAQ,SAAS,CAAC;AACpE"}
1
+ {"version":3,"file":"api.js","names":[],"sources":["../../resources/js/notifications/api.ts"],"sourcesContent":["import { apiJson } from \"@lattice-php/lattice/core/api\";\nimport type { NotificationList, UnreadCount } from \"./types\";\n\nexport function fetchNotifications(endpoint: string, page = 1): Promise<NotificationList> {\n return apiJson<NotificationList>(`${endpoint}?page=${page}`);\n}\n\nexport function markRead(endpoint: string, id: string): Promise<UnreadCount> {\n return apiJson<UnreadCount>(`${endpoint}/${id}/read`, { method: \"PATCH\" });\n}\n\nexport function markAllRead(endpoint: string): Promise<UnreadCount> {\n return apiJson<UnreadCount>(`${endpoint}/read-all`, { method: \"POST\" });\n}\n\nexport function dismiss(endpoint: string, id: string): Promise<UnreadCount> {\n return apiJson<UnreadCount>(`${endpoint}/${id}`, { method: \"DELETE\" });\n}\n\nexport function clearAll(endpoint: string): Promise<UnreadCount> {\n return apiJson<UnreadCount>(endpoint, { method: \"DELETE\" });\n}\n"],"mappings":";;AAGA,SAAgB,mBAAmB,UAAkB,OAAO,GAA8B;CACxF,OAAO,QAA0B,GAAG,SAAS,QAAQ,MAAM;AAC7D;AAEA,SAAgB,SAAS,UAAkB,IAAkC;CAC3E,OAAO,QAAqB,GAAG,SAAS,GAAG,GAAG,QAAQ,EAAE,QAAQ,QAAQ,CAAC;AAC3E;AAEA,SAAgB,YAAY,UAAwC;CAClE,OAAO,QAAqB,GAAG,SAAS,YAAY,EAAE,QAAQ,OAAO,CAAC;AACxE;AAEA,SAAgB,QAAQ,UAAkB,IAAkC;CAC1E,OAAO,QAAqB,GAAG,SAAS,GAAG,MAAM,EAAE,QAAQ,SAAS,CAAC;AACvE;AAEA,SAAgB,SAAS,UAAwC;CAC/D,OAAO,QAAqB,UAAU,EAAE,QAAQ,SAAS,CAAC;AAC5D"}
@@ -1,10 +1,2 @@
1
- import { NotificationItem } from '../types/generated.js';
2
- export type { NotificationItem };
3
- export type NotificationsResponse = {
4
- notifications: NotificationItem[];
5
- unreadCount: number;
6
- hasMore: boolean;
7
- };
8
- export type UnreadCountResponse = {
9
- unreadCount: number;
10
- };
1
+ import { NotificationItem, NotificationList, UnreadCount } from '../types/generated.js';
2
+ export type { NotificationItem, NotificationList, UnreadCount };
@@ -1,8 +1,8 @@
1
1
  import { updateAppearance } from "./appearance/index.js";
2
2
  import { RegistryContext } from "./core/registry-context.js";
3
3
  import { SpriteProvider } from "./icons/sprite.js";
4
- import { EventBridge } from "./event-bridge.js";
5
4
  import { Toaster } from "./toast/toaster.js";
5
+ import { EventBridge } from "./event-bridge.js";
6
6
  import { ActionInteractionProvider } from "./action/components/action-trigger-provider.js";
7
7
  import { useFlashEffects } from "./effects/use-flash-effects.js";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -5,14 +5,14 @@ function buildEffects(effects, payload, t) {
5
5
  }
6
6
  function resolveEffect(effect, payload, t) {
7
7
  if (effect.type !== "toast") return effect;
8
- const toast = effect.toast;
9
- if (typeof toast !== "object" || toast === null) return effect;
10
- const message = toast.message;
8
+ const props = effect.props;
9
+ if (typeof props !== "object" || props === null) return effect;
10
+ const message = props.message;
11
11
  if (!isTranslatable(message)) return effect;
12
12
  return {
13
13
  ...effect,
14
- toast: {
15
- ...toast,
14
+ props: {
15
+ ...props,
16
16
  message: resolveTranslatable(message, payload, t)
17
17
  }
18
18
  };
@@ -1 +1 @@
1
- {"version":3,"file":"build-effects.js","names":[],"sources":["../../resources/js/realtime/build-effects.ts"],"sourcesContent":["import type { Effect } from \"@lattice-php/lattice/types/generated\";\nimport { isTranslatable, resolveTranslatable } from \"@lattice-php/lattice/i18n/translatable\";\nimport type { Translate } from \"@lattice-php/lattice/i18n/translatable\";\n\ntype RawEffect = Record<string, unknown>;\n\nexport function buildEffects(\n effects: readonly RawEffect[],\n payload: Record<string, unknown>,\n t: Translate,\n): Effect[] {\n return effects.map((effect) => resolveEffect(effect, payload, t)) as Effect[];\n}\n\nfunction resolveEffect(\n effect: RawEffect,\n payload: Record<string, unknown>,\n t: Translate,\n): RawEffect {\n if (effect.type !== \"toast\") {\n return effect;\n }\n\n const toast = effect.toast;\n\n if (typeof toast !== \"object\" || toast === null) {\n return effect;\n }\n\n const message = (toast as Record<string, unknown>).message;\n\n if (!isTranslatable(message)) {\n return effect;\n }\n\n return {\n ...effect,\n toast: {\n ...(toast as Record<string, unknown>),\n message: resolveTranslatable(message, payload, t),\n },\n };\n}\n"],"mappings":";;AAMA,SAAgB,aACd,SACA,SACA,GACU;CACV,OAAO,QAAQ,KAAK,WAAW,cAAc,QAAQ,SAAS,CAAC,CAAC;AAClE;AAEA,SAAS,cACP,QACA,SACA,GACW;CACX,IAAI,OAAO,SAAS,SAClB,OAAO;CAGT,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,UAAW,MAAkC;CAEnD,IAAI,CAAC,eAAe,OAAO,GACzB,OAAO;CAGT,OAAO;EACL,GAAG;EACH,OAAO;GACL,GAAI;GACJ,SAAS,oBAAoB,SAAS,SAAS,CAAC;EAClD;CACF;AACF"}
1
+ {"version":3,"file":"build-effects.js","names":[],"sources":["../../resources/js/realtime/build-effects.ts"],"sourcesContent":["import type { Effect } from \"@lattice-php/lattice/types/generated\";\nimport { isTranslatable, resolveTranslatable } from \"@lattice-php/lattice/i18n/translatable\";\nimport type { Translate } from \"@lattice-php/lattice/i18n/translatable\";\n\ntype RawEffect = Record<string, unknown>;\n\nexport function buildEffects(\n effects: readonly RawEffect[],\n payload: Record<string, unknown>,\n t: Translate,\n): Effect[] {\n return effects.map((effect) => resolveEffect(effect, payload, t)) as Effect[];\n}\n\nfunction resolveEffect(\n effect: RawEffect,\n payload: Record<string, unknown>,\n t: Translate,\n): RawEffect {\n if (effect.type !== \"toast\") {\n return effect;\n }\n\n const props = effect.props;\n\n if (typeof props !== \"object\" || props === null) {\n return effect;\n }\n\n const message = (props as Record<string, unknown>).message;\n\n if (!isTranslatable(message)) {\n return effect;\n }\n\n return {\n ...effect,\n props: {\n ...(props as Record<string, unknown>),\n message: resolveTranslatable(message, payload, t),\n },\n };\n}\n"],"mappings":";;AAMA,SAAgB,aACd,SACA,SACA,GACU;CACV,OAAO,QAAQ,KAAK,WAAW,cAAc,QAAQ,SAAS,CAAC,CAAC;AAClE;AAEA,SAAS,cACP,QACA,SACA,GACW;CACX,IAAI,OAAO,SAAS,SAClB,OAAO;CAGT,MAAM,QAAQ,OAAO;CAErB,IAAI,OAAO,UAAU,YAAY,UAAU,MACzC,OAAO;CAGT,MAAM,UAAW,MAAkC;CAEnD,IAAI,CAAC,eAAe,OAAO,GACzB,OAAO;CAGT,OAAO;EACL,GAAG;EACH,OAAO;GACL,GAAI;GACJ,SAAS,oBAAoB,SAAS,SAAS,CAAC;EAClD;CACF;AACF"}
@@ -1,8 +1,8 @@
1
- import { ListenerPayload } from '../types/generated.js';
1
+ import { Listen } from '../types/generated.js';
2
2
  /**
3
3
  * Renders nothing when a page declares no listeners, so the echo-react chunk
4
4
  * is only fetched where it is actually needed.
5
5
  */
6
6
  export declare function RealtimeListeners({ listeners }: {
7
- listeners?: ListenerPayload[];
7
+ listeners?: Listen[];
8
8
  }): import("react").JSX.Element | null;
@@ -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 { ListenerPayload } 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?: ListenerPayload[] }) {\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,aAAgD;CAClF,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 === 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,4 +1,4 @@
1
- import { ListenerPayload } from '../types/generated.js';
1
+ import { Listen } from '../types/generated.js';
2
2
  export default function Subscriptions({ listeners }: {
3
- listeners: ListenerPayload[];
3
+ listeners: Listen[];
4
4
  }): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"subscriptions.js","names":[],"sources":["../../resources/js/realtime/subscriptions.tsx"],"sourcesContent":["import { useEcho, useEchoPresence, useEchoPublic } from \"@laravel/echo-react\";\nimport { useCallback } from \"react\";\nimport { useEffectDispatcher } from \"@lattice-php/lattice/effects/use-effect-dispatcher\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { buildEffects } from \"./build-effects\";\nimport type { ListenerPayload } from \"@lattice-php/lattice/types/generated\";\n\nfunction useListenerHandler(listener: ListenerPayload): (payload: unknown) => void {\n const { t } = useT(\"lattice\");\n const dispatch = useEffectDispatcher();\n\n return useCallback(\n (payload: unknown) => {\n const data = (typeof payload === \"object\" && payload !== null ? payload : {}) as Record<\n string,\n unknown\n >;\n dispatch(buildEffects(listener.effects, data, t));\n },\n [dispatch, listener, t],\n );\n}\n\nfunction PublicListener({ listener }: { listener: ListenerPayload }) {\n useEchoPublic(listener.channel, listener.events, useListenerHandler(listener));\n return null;\n}\n\nfunction PrivateListener({ listener }: { listener: ListenerPayload }) {\n useEcho(listener.channel, listener.events, useListenerHandler(listener));\n return null;\n}\n\nfunction PresenceListener({ listener }: { listener: ListenerPayload }) {\n useEchoPresence(listener.channel, listener.events, useListenerHandler(listener));\n return null;\n}\n\nfunction Listener({ listener }: { listener: ListenerPayload }) {\n switch (listener.visibility) {\n case \"private\":\n return <PrivateListener listener={listener} />;\n case \"presence\":\n return <PresenceListener listener={listener} />;\n default:\n return <PublicListener listener={listener} />;\n }\n}\n\nexport default function Subscriptions({ listeners }: { listeners: ListenerPayload[] }) {\n return (\n <>\n {listeners.map((listener, index) => (\n <Listener key={`${listener.visibility}:${listener.channel}:${index}`} listener={listener} />\n ))}\n </>\n );\n}\n"],"mappings":";;;;;;;AAOA,SAAS,mBAAmB,UAAuD;CACjF,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,WAAW,oBAAoB;CAErC,OAAO,aACJ,YAAqB;EACpB,MAAM,OAAQ,OAAO,YAAY,YAAY,YAAY,OAAO,UAAU,CAAC;EAI3E,SAAS,aAAa,SAAS,SAAS,MAAM,CAAC,CAAC;CAClD,GACA;EAAC;EAAU;EAAU;CAAC,CACxB;AACF;AAEA,SAAS,eAAe,EAAE,YAA2C;CACnE,cAAc,SAAS,SAAS,SAAS,QAAQ,mBAAmB,QAAQ,CAAC;CAC7E,OAAO;AACT;AAEA,SAAS,gBAAgB,EAAE,YAA2C;CACpE,QAAQ,SAAS,SAAS,SAAS,QAAQ,mBAAmB,QAAQ,CAAC;CACvE,OAAO;AACT;AAEA,SAAS,iBAAiB,EAAE,YAA2C;CACrE,gBAAgB,SAAS,SAAS,SAAS,QAAQ,mBAAmB,QAAQ,CAAC;CAC/E,OAAO;AACT;AAEA,SAAS,SAAS,EAAE,YAA2C;CAC7D,QAAQ,SAAS,YAAjB;EACE,KAAK,WACH,OAAO,oBAAC,iBAAD,EAA2B,SAAW,CAAA;EAC/C,KAAK,YACH,OAAO,oBAAC,kBAAD,EAA4B,SAAW,CAAA;EAChD,SACE,OAAO,oBAAC,gBAAD,EAA0B,SAAW,CAAA;CAChD;AACF;AAEA,SAAwB,cAAc,EAAE,aAA+C;CACrF,OACE,oBAAA,YAAA,EAAA,UACG,UAAU,KAAK,UAAU,UACxB,oBAAC,UAAD,EAAgF,SAAW,GAA5E,GAAG,SAAS,WAAW,GAAG,SAAS,QAAQ,GAAG,OAA8B,CAC5F,EACD,CAAA;AAEN"}
1
+ {"version":3,"file":"subscriptions.js","names":[],"sources":["../../resources/js/realtime/subscriptions.tsx"],"sourcesContent":["import { useEcho, useEchoPresence, useEchoPublic } from \"@laravel/echo-react\";\nimport { useCallback } from \"react\";\nimport { useEffectDispatcher } from \"@lattice-php/lattice/effects/use-effect-dispatcher\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { buildEffects } from \"./build-effects\";\nimport type { Listen } from \"@lattice-php/lattice/types/generated\";\n\nfunction useListenerHandler(listener: Listen): (payload: unknown) => void {\n const { t } = useT(\"lattice\");\n const dispatch = useEffectDispatcher();\n\n return useCallback(\n (payload: unknown) => {\n const data = (typeof payload === \"object\" && payload !== null ? payload : {}) as Record<\n string,\n unknown\n >;\n dispatch(buildEffects(listener.effects, data, t));\n },\n [dispatch, listener, t],\n );\n}\n\nfunction PublicListener({ listener }: { listener: Listen }) {\n useEchoPublic(listener.channel, listener.events, useListenerHandler(listener));\n return null;\n}\n\nfunction PrivateListener({ listener }: { listener: Listen }) {\n useEcho(listener.channel, listener.events, useListenerHandler(listener));\n return null;\n}\n\nfunction PresenceListener({ listener }: { listener: Listen }) {\n useEchoPresence(listener.channel, listener.events, useListenerHandler(listener));\n return null;\n}\n\nfunction Listener({ listener }: { listener: Listen }) {\n switch (listener.visibility) {\n case \"private\":\n return <PrivateListener listener={listener} />;\n case \"presence\":\n return <PresenceListener listener={listener} />;\n default:\n return <PublicListener listener={listener} />;\n }\n}\n\nexport default function Subscriptions({ listeners }: { listeners: Listen[] }) {\n return (\n <>\n {listeners.map((listener, index) => (\n <Listener key={`${listener.visibility}:${listener.channel}:${index}`} listener={listener} />\n ))}\n </>\n );\n}\n"],"mappings":";;;;;;;AAOA,SAAS,mBAAmB,UAA8C;CACxE,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,WAAW,oBAAoB;CAErC,OAAO,aACJ,YAAqB;EACpB,MAAM,OAAQ,OAAO,YAAY,YAAY,YAAY,OAAO,UAAU,CAAC;EAI3E,SAAS,aAAa,SAAS,SAAS,MAAM,CAAC,CAAC;CAClD,GACA;EAAC;EAAU;EAAU;CAAC,CACxB;AACF;AAEA,SAAS,eAAe,EAAE,YAAkC;CAC1D,cAAc,SAAS,SAAS,SAAS,QAAQ,mBAAmB,QAAQ,CAAC;CAC7E,OAAO;AACT;AAEA,SAAS,gBAAgB,EAAE,YAAkC;CAC3D,QAAQ,SAAS,SAAS,SAAS,QAAQ,mBAAmB,QAAQ,CAAC;CACvE,OAAO;AACT;AAEA,SAAS,iBAAiB,EAAE,YAAkC;CAC5D,gBAAgB,SAAS,SAAS,SAAS,QAAQ,mBAAmB,QAAQ,CAAC;CAC/E,OAAO;AACT;AAEA,SAAS,SAAS,EAAE,YAAkC;CACpD,QAAQ,SAAS,YAAjB;EACE,KAAK,WACH,OAAO,oBAAC,iBAAD,EAA2B,SAAW,CAAA;EAC/C,KAAK,YACH,OAAO,oBAAC,kBAAD,EAA4B,SAAW,CAAA;EAChD,SACE,OAAO,oBAAC,gBAAD,EAA0B,SAAW,CAAA;CAChD;AACF;AAEA,SAAwB,cAAc,EAAE,aAAsC;CAC5E,OACE,oBAAA,YAAA,EAAA,UACG,UAAU,KAAK,UAAU,UACxB,oBAAC,UAAD,EAAgF,SAAW,GAA5E,GAAG,SAAS,WAAW,GAAG,SAAS,QAAQ,GAAG,OAA8B,CAC5F,EACD,CAAA;AAEN"}
@@ -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\";\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 { 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,5 +1,5 @@
1
- import { withHeaders } from "../../core/headers.js";
2
1
  import { useT } from "../../i18n/instance.js";
2
+ import { withHeaders } from "../../core/headers.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";
@@ -49,14 +49,14 @@ function BulkBar({ actions, selectedKeys, allMatching, total, query, canSelectAl
49
49
  children: [
50
50
  /* @__PURE__ */ jsx("span", {
51
51
  className: "font-medium",
52
- children: allMatching ? t("table.bulk.allSelected", "All {{count}} selected", { count }) : t("table.bulk.selected", "{{count}} selected", { count })
52
+ children: allMatching ? t("table.bulk.all-selected", "All {{count}} selected", { count }) : t("table.bulk.selected", "{{count}} selected", { count })
53
53
  }),
54
54
  canSelectAllMatching && /* @__PURE__ */ jsx("button", {
55
55
  type: "button",
56
56
  "data-test": "bulk-select-all-matching",
57
57
  className: "font-medium text-lt-primary underline underline-offset-2",
58
58
  onClick: onSelectAllMatching,
59
- children: t("table.bulk.selectAllMatching", "Select all {{total}} matching", { total })
59
+ children: t("table.bulk.select-all-matching", "Select all {{total}} matching", { total })
60
60
  }),
61
61
  /* @__PURE__ */ jsx("div", {
62
62
  className: "flex flex-wrap items-center gap-2",
@@ -73,14 +73,14 @@ function BulkBar({ actions, selectedKeys, allMatching, total, query, canSelectAl
73
73
  title: confirming.confirmation.title ?? confirming.label,
74
74
  description: confirming.confirmation.description ?? void 0,
75
75
  confirmLabel: confirming.confirmation.confirmLabel ?? confirming.label,
76
- cancelLabel: confirming.confirmation.cancelLabel ?? "Cancel",
76
+ cancelLabel: confirming.confirmation.cancelLabel ?? t("common.cancel", "Cancel"),
77
77
  confirmVariant: confirming.variant,
78
78
  processing: http.processing,
79
79
  onConfirm: () => void submit(confirming),
80
80
  onCancel: () => setConfirming(null)
81
81
  }),
82
82
  filling?.form && /* @__PURE__ */ jsx(ActionForm, {
83
- cancelLabel: filling.confirmation?.cancelLabel ?? "Cancel",
83
+ cancelLabel: filling.confirmation?.cancelLabel ?? t("common.cancel", "Cancel"),
84
84
  componentRef: filling.ref,
85
85
  description: filling.confirmation?.description ?? void 0,
86
86
  endpoint: filling.endpoint,
@@ -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.allSelected\", \"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.selectAllMatching\", \"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 ?? \"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 ?? \"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,0BAA0B,0BAA0B,EAAE,MAAM,CAAC,IAC/D,EAAE,uBAAuB,sBAAsB,EAAE,MAAM,CAAC;GACxD,CAAA;GACL,wBACC,oBAAC,UAAD;IACE,MAAK;IACL,aAAU;IACV,WAAU;IACV,SAAS;cAER,EAAE,gCAAgC,iCAAiC,EAAE,MAAM,CAAC;GACvE,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;IACpD,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;IAClD,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 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,12 +1,15 @@
1
1
  import { cn } from "../../../lib/utils.js";
2
+ import { coerceColor, namedColor, toneProps } from "../../../lib/color.js";
2
3
  import { formatCell } from "../../lib/format.js";
3
4
  import { jsx } from "react/jsx-runtime";
4
5
  //#region resources/js/table/components/cells/badge-cell.tsx
5
6
  var BadgeCell = ({ column, props, value }) => {
6
7
  const label = formatCell(value, column);
7
8
  if (label === "") return null;
9
+ const tone = toneProps(coerceColor(props.colors?.[String(value)]) ?? namedColor("gray"));
8
10
  return /* @__PURE__ */ jsx("span", {
9
- className: cn("lt-cell-badge", `lt-cell-tone-${props.colors?.[String(value)] ?? "gray"}`),
11
+ className: cn("lt-cell-badge", tone.className),
12
+ style: tone.style,
10
13
  children: label
11
14
  });
12
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"badge-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/badge-cell.tsx"],"sourcesContent":["import { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { formatCell } from \"@lattice-php/lattice/table/lib/format\";\nimport type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\n\nexport const BadgeCell: ColumnCellComponent<\"column.badge\"> = ({ column, props, value }) => {\n const label = formatCell(value, column);\n\n if (label === \"\") {\n return null;\n }\n\n const color = props.colors?.[String(value)] ?? \"gray\";\n\n return <span className={cn(\"lt-cell-badge\", `lt-cell-tone-${color}`)}>{label}</span>;\n};\n"],"mappings":";;;;AAIA,IAAa,aAAkD,EAAE,QAAQ,OAAO,YAAY;CAC1F,MAAM,QAAQ,WAAW,OAAO,MAAM;CAEtC,IAAI,UAAU,IACZ,OAAO;CAKT,OAAO,oBAAC,QAAD;EAAM,WAAW,GAAG,iBAAiB,gBAF9B,MAAM,SAAS,OAAO,KAAK,MAAM,QAEoB;YAAI;CAAY,CAAA;AACrF"}
1
+ {"version":3,"file":"badge-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/badge-cell.tsx"],"sourcesContent":["import { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { coerceColor, namedColor, toneProps } from \"@lattice-php/lattice/lib/color\";\nimport { formatCell } from \"@lattice-php/lattice/table/lib/format\";\nimport type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\n\nexport const BadgeCell: ColumnCellComponent<\"column.badge\"> = ({ column, props, value }) => {\n const label = formatCell(value, column);\n\n if (label === \"\") {\n return null;\n }\n\n const tone = toneProps(coerceColor(props.colors?.[String(value)]) ?? namedColor(\"gray\"));\n\n return (\n <span className={cn(\"lt-cell-badge\", tone.className)} style={tone.style}>\n {label}\n </span>\n );\n};\n"],"mappings":";;;;;AAKA,IAAa,aAAkD,EAAE,QAAQ,OAAO,YAAY;CAC1F,MAAM,QAAQ,WAAW,OAAO,MAAM;CAEtC,IAAI,UAAU,IACZ,OAAO;CAGT,MAAM,OAAO,UAAU,YAAY,MAAM,SAAS,OAAO,KAAK,EAAE,KAAK,WAAW,MAAM,CAAC;CAEvF,OACE,oBAAC,QAAD;EAAM,WAAW,GAAG,iBAAiB,KAAK,SAAS;EAAG,OAAO,KAAK;YAC/D;CACG,CAAA;AAEV"}
@@ -1,14 +1,16 @@
1
1
  import { cn } from "../../../lib/utils.js";
2
2
  import { Icon } from "../../../icons/sprite.js";
3
+ import { useT } from "../../../i18n/instance.js";
3
4
  import { jsx } from "react/jsx-runtime";
4
5
  //#region resources/js/table/components/cells/boolean-cell.tsx
5
6
  function isTruthy(value) {
6
7
  return value === true || value === 1 || value === "1" || value === "true";
7
8
  }
8
9
  var BooleanCell = ({ value }) => {
10
+ const { t } = useT("lattice");
9
11
  const truthy = isTruthy(value);
10
12
  return /* @__PURE__ */ jsx("span", {
11
- "aria-label": String(truthy),
13
+ "aria-label": truthy ? t("common.yes", "Yes") : t("common.no", "No"),
12
14
  role: "img",
13
15
  children: /* @__PURE__ */ jsx(Icon, {
14
16
  name: truthy ? "check" : "x",
@@ -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 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 truthy = isTruthy(value);\n\n return (\n <span aria-label={String(truthy)} 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":";;;;AAIA,SAAS,SAAS,OAAyB;CACzC,OAAO,UAAU,QAAQ,UAAU,KAAK,UAAU,OAAO,UAAU;AACrE;AAEA,IAAa,eAAsD,EAAE,YAAY;CAC/E,MAAM,SAAS,SAAS,KAAK;CAE7B,OACE,oBAAC,QAAD;EAAM,cAAY,OAAO,MAAM;EAAG,MAAK;YACrC,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 { 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,14 +1,17 @@
1
1
  import { cn } from "../../../lib/utils.js";
2
2
  import { IconRenderer } from "../../../icons/icon-renderer.js";
3
+ import { coerceColor, toneProps } from "../../../lib/color.js";
3
4
  import { jsx } from "react/jsx-runtime";
4
5
  //#region resources/js/table/components/cells/icon-cell.tsx
5
6
  var IconCell = ({ props, value }) => {
6
7
  const icon = props.icons?.[String(value)] ?? props.icon ?? void 0;
7
8
  if (!icon) return null;
8
- const color = props.colors?.[String(value)];
9
+ const color = coerceColor(props.colors?.[String(value)]);
10
+ const tone = color ? toneProps(color) : void 0;
9
11
  return /* @__PURE__ */ jsx("span", {
10
12
  "aria-label": String(value),
11
- className: cn("lt-cell-icon", color && `lt-cell-tone-${color}`),
13
+ className: cn("lt-cell-icon", tone?.className),
14
+ style: tone?.style,
12
15
  children: /* @__PURE__ */ jsx(IconRenderer, {
13
16
  className: "size-lt-icon-md",
14
17
  icon
@@ -1 +1 @@
1
- {"version":3,"file":"icon-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/icon-cell.tsx"],"sourcesContent":["import { IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\n\nexport const IconCell: ColumnCellComponent<\"column.icon\"> = ({ props, value }) => {\n const icon = props.icons?.[String(value)] ?? props.icon ?? undefined;\n\n if (!icon) {\n return null;\n }\n\n const color = props.colors?.[String(value)];\n\n return (\n <span\n aria-label={String(value)}\n className={cn(\"lt-cell-icon\", color && `lt-cell-tone-${color}`)}\n >\n <IconRenderer className=\"size-lt-icon-md\" icon={icon} />\n </span>\n );\n};\n"],"mappings":";;;;AAIA,IAAa,YAAgD,EAAE,OAAO,YAAY;CAChF,MAAM,OAAO,MAAM,QAAQ,OAAO,KAAK,MAAM,MAAM,QAAQ,KAAA;CAE3D,IAAI,CAAC,MACH,OAAO;CAGT,MAAM,QAAQ,MAAM,SAAS,OAAO,KAAK;CAEzC,OACE,oBAAC,QAAD;EACE,cAAY,OAAO,KAAK;EACxB,WAAW,GAAG,gBAAgB,SAAS,gBAAgB,OAAO;YAE9D,oBAAC,cAAD;GAAc,WAAU;GAAwB;EAAO,CAAA;CACnD,CAAA;AAEV"}
1
+ {"version":3,"file":"icon-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/icon-cell.tsx"],"sourcesContent":["import { IconRenderer } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { coerceColor, toneProps } from \"@lattice-php/lattice/lib/color\";\nimport type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\n\nexport const IconCell: ColumnCellComponent<\"column.icon\"> = ({ props, value }) => {\n const icon = props.icons?.[String(value)] ?? props.icon ?? undefined;\n\n if (!icon) {\n return null;\n }\n\n const color = coerceColor(props.colors?.[String(value)]);\n const tone = color ? toneProps(color) : undefined;\n\n return (\n <span\n aria-label={String(value)}\n className={cn(\"lt-cell-icon\", tone?.className)}\n style={tone?.style}\n >\n <IconRenderer className=\"size-lt-icon-md\" icon={icon} />\n </span>\n );\n};\n"],"mappings":";;;;;AAKA,IAAa,YAAgD,EAAE,OAAO,YAAY;CAChF,MAAM,OAAO,MAAM,QAAQ,OAAO,KAAK,MAAM,MAAM,QAAQ,KAAA;CAE3D,IAAI,CAAC,MACH,OAAO;CAGT,MAAM,QAAQ,YAAY,MAAM,SAAS,OAAO,KAAK,EAAE;CACvD,MAAM,OAAO,QAAQ,UAAU,KAAK,IAAI,KAAA;CAExC,OACE,oBAAC,QAAD;EACE,cAAY,OAAO,KAAK;EACxB,WAAW,GAAG,gBAAgB,MAAM,SAAS;EAC7C,OAAO,MAAM;YAEb,oBAAC,cAAD;GAAc,WAAU;GAAwB;EAAO,CAAA;CACnD,CAAA;AAEV"}
@@ -1,20 +1,19 @@
1
1
  import { cn } from "../../../lib/utils.js";
2
+ import { PreviewableImage } from "../../../ui/image-preview.js";
2
3
  import { jsx } from "react/jsx-runtime";
3
4
  //#region resources/js/table/components/cells/image-cell.tsx
4
5
  var ImageCell = ({ column, props, value }) => {
5
6
  const url = typeof value === "string" ? value : "";
6
7
  if (url === "") return null;
7
8
  const size = props.size ?? 32;
8
- return /* @__PURE__ */ jsx("img", {
9
- alt: column.props.label ?? void 0,
10
- src: url,
11
- width: size,
12
- height: size,
9
+ return /* @__PURE__ */ jsx(PreviewableImage, {
10
+ alt: column.props.label ?? "",
13
11
  className: cn("object-cover", props.circular ? "rounded-full" : "rounded-lt-sm"),
14
- style: {
15
- width: size,
16
- height: size
17
- }
12
+ height: size,
13
+ previewable: props.previewable,
14
+ src: url,
15
+ testId: `preview-${column.key}`,
16
+ width: size
18
17
  });
19
18
  };
20
19
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"image-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/image-cell.tsx"],"sourcesContent":["import { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\n\nexport const ImageCell: ColumnCellComponent<\"column.image\"> = ({ column, props, value }) => {\n const url = typeof value === \"string\" ? value : \"\";\n\n if (url === \"\") {\n return null;\n }\n\n const size = props.size ?? 32;\n\n return (\n <img\n alt={column.props.label ?? undefined}\n src={url}\n width={size}\n height={size}\n className={cn(\"object-cover\", props.circular ? \"rounded-full\" : \"rounded-lt-sm\")}\n style={{ width: size, height: size }}\n />\n );\n};\n"],"mappings":";;;AAGA,IAAa,aAAkD,EAAE,QAAQ,OAAO,YAAY;CAC1F,MAAM,MAAM,OAAO,UAAU,WAAW,QAAQ;CAEhD,IAAI,QAAQ,IACV,OAAO;CAGT,MAAM,OAAO,MAAM,QAAQ;CAE3B,OACE,oBAAC,OAAD;EACE,KAAK,OAAO,MAAM,SAAS,KAAA;EAC3B,KAAK;EACL,OAAO;EACP,QAAQ;EACR,WAAW,GAAG,gBAAgB,MAAM,WAAW,iBAAiB,eAAe;EAC/E,OAAO;GAAE,OAAO;GAAM,QAAQ;EAAK;CACpC,CAAA;AAEL"}
1
+ {"version":3,"file":"image-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/image-cell.tsx"],"sourcesContent":["import { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\nimport { PreviewableImage } from \"@lattice-php/lattice/ui/image-preview\";\n\nexport const ImageCell: ColumnCellComponent<\"column.image\"> = ({ column, props, value }) => {\n const url = typeof value === \"string\" ? value : \"\";\n\n if (url === \"\") {\n return null;\n }\n\n const size = props.size ?? 32;\n\n return (\n <PreviewableImage\n alt={column.props.label ?? \"\"}\n className={cn(\"object-cover\", props.circular ? \"rounded-full\" : \"rounded-lt-sm\")}\n height={size}\n previewable={props.previewable}\n src={url}\n testId={`preview-${column.key}`}\n width={size}\n />\n );\n};\n"],"mappings":";;;;AAIA,IAAa,aAAkD,EAAE,QAAQ,OAAO,YAAY;CAC1F,MAAM,MAAM,OAAO,UAAU,WAAW,QAAQ;CAEhD,IAAI,QAAQ,IACV,OAAO;CAGT,MAAM,OAAO,MAAM,QAAQ;CAE3B,OACE,oBAAC,kBAAD;EACE,KAAK,OAAO,MAAM,SAAS;EAC3B,WAAW,GAAG,gBAAgB,MAAM,WAAW,iBAAiB,eAAe;EAC/E,QAAQ;EACR,aAAa,MAAM;EACnB,KAAK;EACL,QAAQ,WAAW,OAAO;EAC1B,OAAO;CACR,CAAA;AAEL"}
@@ -1,4 +1,5 @@
1
1
  import { useLocale } from "../../../i18n/locale.js";
2
+ import { CopyableText } from "../../../ui/copyable-text.js";
2
3
  import { formatCell } from "../../lib/format.js";
3
4
  import { numericValue } from "../../../format/numeric.js";
4
5
  import { formatNumber } from "../../../format/number.js";
@@ -9,7 +10,7 @@ var MoneyCell = ({ column, props, row, value }) => {
9
10
  if (numericValue(value) === null) return /* @__PURE__ */ jsx("span", { children: formatCell(value, column) });
10
11
  const rawCode = props.currencyField ? row[props.currencyField] : void 0;
11
12
  const code = props.currency ?? (typeof rawCode === "string" ? rawCode : null);
12
- return /* @__PURE__ */ jsx("span", {
13
+ const content = /* @__PURE__ */ jsx("span", {
13
14
  className: "tabular-nums",
14
15
  children: formatNumber(value, {
15
16
  kind: "number",
@@ -20,6 +21,13 @@ var MoneyCell = ({ column, props, row, value }) => {
20
21
  unit: null
21
22
  }, locale)
22
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
30
+ });
23
31
  };
24
32
  //#endregion
25
33
  export { MoneyCell };
@@ -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\";\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 return <span className=\"tabular-nums\">{text}</span>;\n};\n"],"mappings":";;;;;;AAMA,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,OAAO,oBAAC,QAAD;EAAM,WAAU;YAbV,aACX,OACA;GACE,MAAM;GACN,UAAU;GACV,uBAAuB,MAAM;GAC7B,uBAAuB,MAAM;GAC7B,UAAU;GACV,MAAM;EACR,GACA,MAGqC;CAAW,CAAA;AACpD"}
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,4 +1,5 @@
1
1
  import { useLocale } from "../../../i18n/locale.js";
2
+ import { CopyableText } from "../../../ui/copyable-text.js";
2
3
  import { formatCell } from "../../lib/format.js";
3
4
  import { numericValue } from "../../../format/numeric.js";
4
5
  import { formatNumber } from "../../../format/number.js";
@@ -7,7 +8,7 @@ import { jsx } from "react/jsx-runtime";
7
8
  var NumberCell = ({ column, props, value }) => {
8
9
  const { locale } = useLocale();
9
10
  if (numericValue(value) === null) return /* @__PURE__ */ jsx("span", { children: formatCell(value, column) });
10
- return /* @__PURE__ */ jsx("span", {
11
+ const content = /* @__PURE__ */ jsx("span", {
11
12
  className: "tabular-nums",
12
13
  children: formatNumber(value, {
13
14
  kind: "number",
@@ -18,6 +19,13 @@ var NumberCell = ({ column, props, value }) => {
18
19
  unit: props.unit
19
20
  }, locale)
20
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
+ });
21
29
  };
22
30
  //#endregion
23
31
  export { NumberCell };
@@ -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\";\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 return <span className=\"tabular-nums\">{text}</span>;\n};\n"],"mappings":";;;;;;AAMA,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,OAAO,oBAAC,QAAD;EAAM,WAAU;YAbV,aACX,OACA;GACE,MAAM;GACN,UAAU,MAAM,UAAU,YAAY;GACtC,uBAAuB,MAAM;GAC7B,uBAAuB,MAAM;GAC7B,UAAU;GACV,MAAM,MAAM;EACd,GACA,MAGqC;CAAW,CAAA;AACpD"}
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,6 +1,7 @@
1
1
  import { cn } from "../../../lib/utils.js";
2
2
  import { DateTime } from "../../../i18n/date-time.js";
3
3
  import { CopyableText } from "../../../ui/copyable-text.js";
4
+ import { coerceColor, namedColor, toneProps } from "../../../lib/color.js";
4
5
  import { formatCell, resolveLink } from "../../lib/format.js";
5
6
  import { jsx } from "react/jsx-runtime";
6
7
  //#region resources/js/table/components/cells/text-cell.tsx
@@ -11,8 +12,10 @@ var TextCell = (args) => {
11
12
  };
12
13
  function Badge({ label, color }) {
13
14
  if (label === "") return null;
15
+ const tone = toneProps(coerceColor(color) ?? namedColor("gray"));
14
16
  return /* @__PURE__ */ jsx("span", {
15
- className: cn("lt-cell-badge", `lt-cell-tone-${color || "gray"}`),
17
+ className: cn("lt-cell-badge", tone.className),
18
+ style: tone.style,
16
19
  children: label
17
20
  });
18
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"text-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/text-cell.tsx"],"sourcesContent":["import { DateTime } from \"@lattice-php/lattice/i18n\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { CopyableText } from \"@lattice-php/lattice/ui/copyable-text\";\nimport type { ReactNode } from \"react\";\nimport { formatCell, resolveLink } from \"@lattice-php/lattice/table/lib/format\";\nimport type { ColumnCellArgs, ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\nimport type { ColumnPropsOf } from \"@lattice-php/lattice/table/types\";\n\ntype TextProps = ColumnCellArgs<\"column.text\">[\"props\"];\n\nexport const TextCell: ColumnCellComponent<\"column.text\"> = (args) => {\n if (args.props.multiple) {\n return <MultipleCell {...args} />;\n }\n\n if (args.props.badge) {\n return <SingleBadgeCell {...args} />;\n }\n\n return <PlainTextCell {...args} />;\n};\n\nfunction Badge({ label, color }: { label: string; color?: string | null }): ReactNode {\n if (label === \"\") {\n return null;\n }\n\n return <span className={cn(\"lt-cell-badge\", `lt-cell-tone-${color || \"gray\"}`)}>{label}</span>;\n}\n\nfunction MultipleCell({ column, props, value }: ColumnCellArgs<\"column.text\">): ReactNode {\n const items = Array.isArray(value) ? value : [];\n\n if (items.length === 0) {\n return null;\n }\n\n if (!props.badge) {\n return <span>{items.map((item) => formatCell(item, column)).join(\", \")}</span>;\n }\n\n return (\n <div className=\"flex flex-wrap gap-1\">\n {items.map((item, index) => {\n const chip = item as { value: unknown; color?: string };\n\n return <Badge key={index} label={formatCell(chip.value, column)} color={chip.color} />;\n })}\n </div>\n );\n}\n\nfunction SingleBadgeCell({ column, props, row, value }: ColumnCellArgs<\"column.text\">): ReactNode {\n const colorKey = (props.badge as NonNullable<TextProps[\"badge\"]>).colorKey;\n\n return <Badge label={formatCell(value, column)} color={String(row[colorKey] ?? \"\")} />;\n}\n\nfunction PlainTextCell({ column, props, row, value }: ColumnCellArgs<\"column.text\">): ReactNode {\n const dateProps = (column.props as ColumnPropsOf<\"column.text\">).date;\n const href = resolveLink(column, row, value);\n const text = formatCell(value, column);\n\n const content = href ? (\n <a\n className=\"underline underline-offset-2\"\n href={href}\n rel={props.link?.external ? \"noreferrer\" : undefined}\n target={props.link?.external ? \"_blank\" : undefined}\n >\n {text}\n </a>\n ) : (\n text\n );\n\n if (dateProps && !href && !props.copyable && value !== null && value !== undefined) {\n return (\n <DateTime value={value} dateStyle={dateProps.dateStyle} timeStyle={dateProps.timeStyle} />\n );\n }\n\n if (!props.copyable) {\n return content;\n }\n\n return (\n <CopyableText\n value={text}\n label={column.props.label ?? column.key}\n testId={`copy-${column.key}`}\n >\n {content}\n </CopyableText>\n );\n}\n"],"mappings":";;;;;;AAUA,IAAa,YAAgD,SAAS;CACpE,IAAI,KAAK,MAAM,UACb,OAAO,oBAAC,cAAD,EAAc,GAAI,KAAO,CAAA;CAGlC,IAAI,KAAK,MAAM,OACb,OAAO,oBAAC,iBAAD,EAAiB,GAAI,KAAO,CAAA;CAGrC,OAAO,oBAAC,eAAD,EAAe,GAAI,KAAO,CAAA;AACnC;AAEA,SAAS,MAAM,EAAE,OAAO,SAA8D;CACpF,IAAI,UAAU,IACZ,OAAO;CAGT,OAAO,oBAAC,QAAD;EAAM,WAAW,GAAG,iBAAiB,gBAAgB,SAAS,QAAQ;YAAI;CAAY,CAAA;AAC/F;AAEA,SAAS,aAAa,EAAE,QAAQ,OAAO,SAAmD;CACxF,MAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;CAE9C,IAAI,MAAM,WAAW,GACnB,OAAO;CAGT,IAAI,CAAC,MAAM,OACT,OAAO,oBAAC,QAAD,EAAA,UAAO,MAAM,KAAK,SAAS,WAAW,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI,EAAQ,CAAA;CAG/E,OACE,oBAAC,OAAD;EAAK,WAAU;YACZ,MAAM,KAAK,MAAM,UAAU;GAC1B,MAAM,OAAO;GAEb,OAAO,oBAAC,OAAD;IAAmB,OAAO,WAAW,KAAK,OAAO,MAAM;IAAG,OAAO,KAAK;GAAQ,GAAlE,KAAkE;EACvF,CAAC;CACE,CAAA;AAET;AAEA,SAAS,gBAAgB,EAAE,QAAQ,OAAO,KAAK,SAAmD;CAChG,MAAM,WAAY,MAAM,MAA0C;CAElE,OAAO,oBAAC,OAAD;EAAO,OAAO,WAAW,OAAO,MAAM;EAAG,OAAO,OAAO,IAAI,aAAa,EAAE;CAAI,CAAA;AACvF;AAEA,SAAS,cAAc,EAAE,QAAQ,OAAO,KAAK,SAAmD;CAC9F,MAAM,YAAa,OAAO,MAAuC;CACjE,MAAM,OAAO,YAAY,QAAQ,KAAK,KAAK;CAC3C,MAAM,OAAO,WAAW,OAAO,MAAM;CAErC,MAAM,UAAU,OACd,oBAAC,KAAD;EACE,WAAU;EACJ;EACN,KAAK,MAAM,MAAM,WAAW,eAAe,KAAA;EAC3C,QAAQ,MAAM,MAAM,WAAW,WAAW,KAAA;YAEzC;CACA,CAAA,IAEH;CAGF,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,YAAY,UAAU,QAAQ,UAAU,KAAA,GACvE,OACE,oBAAC,UAAD;EAAiB;EAAO,WAAW,UAAU;EAAW,WAAW,UAAU;CAAY,CAAA;CAI7F,IAAI,CAAC,MAAM,UACT,OAAO;CAGT,OACE,oBAAC,cAAD;EACE,OAAO;EACP,OAAO,OAAO,MAAM,SAAS,OAAO;EACpC,QAAQ,QAAQ,OAAO;YAEtB;CACW,CAAA;AAElB"}
1
+ {"version":3,"file":"text-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/text-cell.tsx"],"sourcesContent":["import { DateTime } from \"@lattice-php/lattice/i18n\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { coerceColor, namedColor, toneProps } from \"@lattice-php/lattice/lib/color\";\nimport { CopyableText } from \"@lattice-php/lattice/ui/copyable-text\";\nimport type { ReactNode } from \"react\";\nimport { formatCell, resolveLink } from \"@lattice-php/lattice/table/lib/format\";\nimport type { ColumnCellArgs, ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\nimport type { ColumnPropsOf } from \"@lattice-php/lattice/table/types\";\n\ntype TextProps = ColumnCellArgs<\"column.text\">[\"props\"];\n\nexport const TextCell: ColumnCellComponent<\"column.text\"> = (args) => {\n if (args.props.multiple) {\n return <MultipleCell {...args} />;\n }\n\n if (args.props.badge) {\n return <SingleBadgeCell {...args} />;\n }\n\n return <PlainTextCell {...args} />;\n};\n\nfunction Badge({ label, color }: { label: string; color?: string | null }): ReactNode {\n if (label === \"\") {\n return null;\n }\n\n const tone = toneProps(coerceColor(color) ?? namedColor(\"gray\"));\n\n return (\n <span className={cn(\"lt-cell-badge\", tone.className)} style={tone.style}>\n {label}\n </span>\n );\n}\n\nfunction MultipleCell({ column, props, value }: ColumnCellArgs<\"column.text\">): ReactNode {\n const items = Array.isArray(value) ? value : [];\n\n if (items.length === 0) {\n return null;\n }\n\n if (!props.badge) {\n return <span>{items.map((item) => formatCell(item, column)).join(\", \")}</span>;\n }\n\n return (\n <div className=\"flex flex-wrap gap-1\">\n {items.map((item, index) => {\n const chip = item as { value: unknown; color?: string };\n\n return <Badge key={index} label={formatCell(chip.value, column)} color={chip.color} />;\n })}\n </div>\n );\n}\n\nfunction SingleBadgeCell({ column, props, row, value }: ColumnCellArgs<\"column.text\">): ReactNode {\n const colorKey = (props.badge as NonNullable<TextProps[\"badge\"]>).colorKey;\n\n return <Badge label={formatCell(value, column)} color={String(row[colorKey] ?? \"\")} />;\n}\n\nfunction PlainTextCell({ column, props, row, value }: ColumnCellArgs<\"column.text\">): ReactNode {\n const dateProps = (column.props as ColumnPropsOf<\"column.text\">).date;\n const href = resolveLink(column, row, value);\n const text = formatCell(value, column);\n\n const content = href ? (\n <a\n className=\"underline underline-offset-2\"\n href={href}\n rel={props.link?.external ? \"noreferrer\" : undefined}\n target={props.link?.external ? \"_blank\" : undefined}\n >\n {text}\n </a>\n ) : (\n text\n );\n\n if (dateProps && !href && !props.copyable && value !== null && value !== undefined) {\n return (\n <DateTime value={value} dateStyle={dateProps.dateStyle} timeStyle={dateProps.timeStyle} />\n );\n }\n\n if (!props.copyable) {\n return content;\n }\n\n return (\n <CopyableText\n value={text}\n label={column.props.label ?? column.key}\n testId={`copy-${column.key}`}\n >\n {content}\n </CopyableText>\n );\n}\n"],"mappings":";;;;;;;AAWA,IAAa,YAAgD,SAAS;CACpE,IAAI,KAAK,MAAM,UACb,OAAO,oBAAC,cAAD,EAAc,GAAI,KAAO,CAAA;CAGlC,IAAI,KAAK,MAAM,OACb,OAAO,oBAAC,iBAAD,EAAiB,GAAI,KAAO,CAAA;CAGrC,OAAO,oBAAC,eAAD,EAAe,GAAI,KAAO,CAAA;AACnC;AAEA,SAAS,MAAM,EAAE,OAAO,SAA8D;CACpF,IAAI,UAAU,IACZ,OAAO;CAGT,MAAM,OAAO,UAAU,YAAY,KAAK,KAAK,WAAW,MAAM,CAAC;CAE/D,OACE,oBAAC,QAAD;EAAM,WAAW,GAAG,iBAAiB,KAAK,SAAS;EAAG,OAAO,KAAK;YAC/D;CACG,CAAA;AAEV;AAEA,SAAS,aAAa,EAAE,QAAQ,OAAO,SAAmD;CACxF,MAAM,QAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC;CAE9C,IAAI,MAAM,WAAW,GACnB,OAAO;CAGT,IAAI,CAAC,MAAM,OACT,OAAO,oBAAC,QAAD,EAAA,UAAO,MAAM,KAAK,SAAS,WAAW,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI,EAAQ,CAAA;CAG/E,OACE,oBAAC,OAAD;EAAK,WAAU;YACZ,MAAM,KAAK,MAAM,UAAU;GAC1B,MAAM,OAAO;GAEb,OAAO,oBAAC,OAAD;IAAmB,OAAO,WAAW,KAAK,OAAO,MAAM;IAAG,OAAO,KAAK;GAAQ,GAAlE,KAAkE;EACvF,CAAC;CACE,CAAA;AAET;AAEA,SAAS,gBAAgB,EAAE,QAAQ,OAAO,KAAK,SAAmD;CAChG,MAAM,WAAY,MAAM,MAA0C;CAElE,OAAO,oBAAC,OAAD;EAAO,OAAO,WAAW,OAAO,MAAM;EAAG,OAAO,OAAO,IAAI,aAAa,EAAE;CAAI,CAAA;AACvF;AAEA,SAAS,cAAc,EAAE,QAAQ,OAAO,KAAK,SAAmD;CAC9F,MAAM,YAAa,OAAO,MAAuC;CACjE,MAAM,OAAO,YAAY,QAAQ,KAAK,KAAK;CAC3C,MAAM,OAAO,WAAW,OAAO,MAAM;CAErC,MAAM,UAAU,OACd,oBAAC,KAAD;EACE,WAAU;EACJ;EACN,KAAK,MAAM,MAAM,WAAW,eAAe,KAAA;EAC3C,QAAQ,MAAM,MAAM,WAAW,WAAW,KAAA;YAEzC;CACA,CAAA,IAEH;CAGF,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,YAAY,UAAU,QAAQ,UAAU,KAAA,GACvE,OACE,oBAAC,UAAD;EAAiB;EAAO,WAAW,UAAU;EAAW,WAAW,UAAU;CAAY,CAAA;CAI7F,IAAI,CAAC,MAAM,UACT,OAAO;CAGT,OACE,oBAAC,cAAD;EACE,OAAO;EACP,OAAO,OAAO,MAAM,SAAS,OAAO;EACpC,QAAQ,QAAQ,OAAO;YAEtB;CACW,CAAA;AAElB"}