@lattice-php/lattice 0.17.2 → 0.19.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 (748) hide show
  1. package/README.md +1 -1
  2. package/dist/action/components/action-form.d.ts +2 -2
  3. package/dist/action/components/action-form.js +11 -11
  4. package/dist/action/components/action-form.js.map +1 -1
  5. package/dist/action/components/action-group.d.ts +1 -1
  6. package/dist/action/components/action-group.js +6 -4
  7. package/dist/action/components/action-group.js.map +1 -1
  8. package/dist/action/components/action-trigger-provider.d.ts +10 -0
  9. package/dist/action/components/action-trigger-provider.js +24 -0
  10. package/dist/action/components/action-trigger-provider.js.map +1 -0
  11. package/dist/action/components/action.d.ts +1 -1
  12. package/dist/action/components/action.js +4 -4
  13. package/dist/action/components/action.js.map +1 -1
  14. package/dist/action/{use-action.d.ts → hooks/use-action.d.ts} +1 -1
  15. package/dist/action/{use-action.js → hooks/use-action.js} +7 -7
  16. package/dist/action/hooks/use-action.js.map +1 -0
  17. package/dist/action/index.d.ts +10 -1
  18. package/dist/action/index.js +8 -13
  19. package/dist/action/{run-action.d.ts → lib/run-action.d.ts} +1 -1
  20. package/dist/action/{run-action.js → lib/run-action.js} +2 -2
  21. package/dist/action/lib/run-action.js.map +1 -0
  22. package/dist/action/plugin.d.ts +1 -0
  23. package/dist/action/plugin.js +15 -0
  24. package/dist/action/plugin.js.map +1 -0
  25. package/dist/appearance/index.d.ts +4 -1
  26. package/dist/appearance/index.js +11 -2
  27. package/dist/appearance/index.js.map +1 -1
  28. package/dist/chat/components/chat-box.d.ts +1 -1
  29. package/dist/chat/components/chat-box.js +2 -2
  30. package/dist/chat/components/chat-box.js.map +1 -1
  31. package/dist/chat/components/message-list.d.ts +1 -1
  32. package/dist/chat/components/message-list.js.map +1 -1
  33. package/dist/chat/components/message.d.ts +1 -1
  34. package/dist/chat/components/message.js.map +1 -1
  35. package/dist/chat/components/prompt-input.js +1 -1
  36. package/dist/chat/components/prompt-input.js.map +1 -1
  37. package/dist/chat/{use-chat.d.ts → hooks/use-chat.d.ts} +1 -1
  38. package/dist/chat/{use-chat.js → hooks/use-chat.js} +2 -2
  39. package/dist/chat/hooks/use-chat.js.map +1 -0
  40. package/dist/chat/index.d.ts +4 -1
  41. package/dist/chat/index.js +3 -17
  42. package/dist/chat/{transport.d.ts → lib/transport.d.ts} +2 -2
  43. package/dist/chat/{transport.js → lib/transport.js} +2 -2
  44. package/dist/chat/lib/transport.js.map +1 -0
  45. package/dist/chat/parts/text.d.ts +1 -1
  46. package/dist/chat/parts/tool-call.d.ts +1 -1
  47. package/dist/chat/plugin.d.ts +2 -0
  48. package/dist/chat/plugin.js +17 -0
  49. package/dist/chat/plugin.js.map +1 -0
  50. package/dist/chat/types.d.ts +2 -2
  51. package/dist/clipboard/index.d.ts +1 -2
  52. package/dist/clipboard/index.js +1 -10
  53. package/dist/clipboard/index.js.map +1 -1
  54. package/dist/core/api.d.ts +1 -1
  55. package/dist/core/api.js.map +1 -1
  56. package/dist/core/headers.js.map +1 -1
  57. package/dist/core/{column-sizing.d.ts → hooks/column-sizing.d.ts} +2 -2
  58. package/dist/core/{column-sizing.js → hooks/column-sizing.js} +1 -1
  59. package/dist/core/hooks/column-sizing.js.map +1 -0
  60. package/dist/core/{use-column-resizing.d.ts → hooks/use-column-resizing.d.ts} +2 -1
  61. package/dist/core/{use-column-resizing.js → hooks/use-column-resizing.js} +59 -31
  62. package/dist/core/hooks/use-column-resizing.js.map +1 -0
  63. package/dist/core/index.d.ts +13 -0
  64. package/dist/core/index.js +10 -0
  65. package/dist/core/materialize.d.ts +9 -0
  66. package/dist/core/materialize.js +39 -0
  67. package/dist/core/materialize.js.map +1 -0
  68. package/dist/core/nodes.d.ts +6 -1
  69. package/dist/core/nodes.js +8 -1
  70. package/dist/core/nodes.js.map +1 -1
  71. package/dist/core/registry-context.d.ts +3 -3
  72. package/dist/core/registry-context.js.map +1 -1
  73. package/dist/core/registry.d.ts +5 -3
  74. package/dist/core/registry.js.map +1 -1
  75. package/dist/core/renderer.d.ts +1 -1
  76. package/dist/core/renderer.js +4 -6
  77. package/dist/core/renderer.js.map +1 -1
  78. package/dist/core/test-id.d.ts +1 -1
  79. package/dist/core/types.d.ts +1 -1
  80. package/dist/create-app.d.ts +3 -3
  81. package/dist/effects/dispatch.d.ts +2 -2
  82. package/dist/effects/registry.d.ts +4 -3
  83. package/dist/effects/registry.js +7 -7
  84. package/dist/effects/registry.js.map +1 -1
  85. package/dist/effects/use-effect-dispatcher.d.ts +1 -1
  86. package/dist/{events/event-bridge.d.ts → event-bridge.d.ts} +2 -3
  87. package/dist/{events/event-bridge.js → event-bridge.js} +4 -11
  88. package/dist/event-bridge.js.map +1 -0
  89. package/dist/events/event-names.d.ts +0 -3
  90. package/dist/events/event-names.js +0 -3
  91. package/dist/events/event-names.js.map +1 -1
  92. package/dist/form/components/base/field.d.ts +1 -1
  93. package/dist/form/components/base/field.js +5 -5
  94. package/dist/form/components/base/field.js.map +1 -1
  95. package/dist/form/components/base/submit-button.d.ts +1 -1
  96. package/dist/form/components/base/submit-button.js +3 -3
  97. package/dist/form/components/base/submit-button.js.map +1 -1
  98. package/dist/form/components/fields/{block-add-menu.d.ts → add-row-menu.d.ts} +3 -3
  99. package/dist/form/components/fields/{block-add-menu.js → add-row-menu.js} +10 -10
  100. package/dist/form/components/fields/add-row-menu.js.map +1 -0
  101. package/dist/form/components/fields/builder.d.ts +1 -1
  102. package/dist/form/components/fields/builder.js +80 -75
  103. package/dist/form/components/fields/builder.js.map +1 -1
  104. package/dist/form/components/fields/checkbox.d.ts +1 -1
  105. package/dist/form/components/fields/checkbox.js +12 -9
  106. package/dist/form/components/fields/checkbox.js.map +1 -1
  107. package/dist/form/components/fields/choice.d.ts +1 -1
  108. package/dist/form/components/fields/choice.js +4 -4
  109. package/dist/form/components/fields/choice.js.map +1 -1
  110. package/dist/form/components/fields/date-input.d.ts +1 -1
  111. package/dist/form/components/fields/date-picker-field.js +2 -2
  112. package/dist/form/components/fields/date-picker-field.js.map +1 -1
  113. package/dist/form/components/fields/date-picker.d.ts +1 -1
  114. package/dist/form/components/fields/date-time-input.d.ts +1 -1
  115. package/dist/form/components/fields/file-upload.d.ts +1 -1
  116. package/dist/form/components/fields/file-upload.js +4 -4
  117. package/dist/form/components/fields/file-upload.js.map +1 -1
  118. package/dist/form/components/fields/hidden-input.d.ts +1 -1
  119. package/dist/form/components/fields/hidden-input.js +1 -1
  120. package/dist/form/components/fields/hidden-input.js.map +1 -1
  121. package/dist/form/components/fields/number-input.d.ts +1 -1
  122. package/dist/form/components/fields/number-input.js +2 -2
  123. package/dist/form/components/fields/number-input.js.map +1 -1
  124. package/dist/form/components/fields/otp-input.d.ts +1 -1
  125. package/dist/form/components/fields/otp-input.js +1 -1
  126. package/dist/form/components/fields/otp-input.js.map +1 -1
  127. package/dist/form/components/fields/password-input.d.ts +1 -1
  128. package/dist/form/components/fields/password-input.js +6 -6
  129. package/dist/form/components/fields/password-input.js.map +1 -1
  130. package/dist/form/components/fields/repeater-rows.d.ts +6 -1
  131. package/dist/form/components/fields/repeater-rows.js +9 -5
  132. package/dist/form/components/fields/repeater-rows.js.map +1 -1
  133. package/dist/form/components/fields/repeater.d.ts +1 -1
  134. package/dist/form/components/fields/repeater.js +57 -48
  135. package/dist/form/components/fields/repeater.js.map +1 -1
  136. package/dist/form/components/fields/rich-editor-field.d.ts +1 -1
  137. package/dist/form/components/fields/rich-editor-field.js +8 -6
  138. package/dist/form/components/fields/rich-editor-field.js.map +1 -1
  139. package/dist/form/components/fields/rich-editor.d.ts +1 -1
  140. package/dist/form/components/fields/row-action-menu.d.ts +2 -2
  141. package/dist/form/components/fields/row-actions.js +1 -1
  142. package/dist/form/components/fields/row-actions.js.map +1 -1
  143. package/dist/form/components/fields/row-item.d.ts +3 -3
  144. package/dist/form/components/fields/row-item.js +3 -2
  145. package/dist/form/components/fields/row-item.js.map +1 -1
  146. package/dist/form/components/fields/row-key-inputs.d.ts +7 -0
  147. package/dist/form/components/fields/row-key-inputs.js +16 -0
  148. package/dist/form/components/fields/row-key-inputs.js.map +1 -0
  149. package/dist/form/components/fields/row-templates.d.ts +9 -0
  150. package/dist/form/components/fields/row-templates.js +14 -0
  151. package/dist/form/components/fields/row-templates.js.map +1 -0
  152. package/dist/form/components/fields/select.d.ts +1 -1
  153. package/dist/form/components/fields/select.js +23 -13
  154. package/dist/form/components/fields/select.js.map +1 -1
  155. package/dist/form/components/fields/simple-field.d.ts +2 -2
  156. package/dist/form/components/fields/simple-field.js +2 -2
  157. package/dist/form/components/fields/simple-field.js.map +1 -1
  158. package/dist/form/components/fields/table-rows.d.ts +3 -3
  159. package/dist/form/components/fields/table-rows.js +13 -13
  160. package/dist/form/components/fields/table-rows.js.map +1 -1
  161. package/dist/form/components/fields/text-input.d.ts +1 -1
  162. package/dist/form/components/fields/text-input.js +2 -2
  163. package/dist/form/components/fields/text-input.js.map +1 -1
  164. package/dist/form/components/fields/textarea.d.ts +1 -1
  165. package/dist/form/components/fields/textarea.js +1 -1
  166. package/dist/form/components/fields/textarea.js.map +1 -1
  167. package/dist/form/components/fields/time-input.d.ts +1 -1
  168. package/dist/form/components/fields/time-input.js +3 -3
  169. package/dist/form/components/fields/time-input.js.map +1 -1
  170. package/dist/form/components/fields/time-picker.d.ts +1 -1
  171. package/dist/form/components/fields/toggle.d.ts +1 -1
  172. package/dist/form/components/fields/toggle.js +10 -9
  173. package/dist/form/components/fields/toggle.js.map +1 -1
  174. package/dist/form/components/fields/use-row-collection.d.ts +1 -1
  175. package/dist/form/components/fields/use-row-collection.js +2 -2
  176. package/dist/form/components/fields/use-row-collection.js.map +1 -1
  177. package/dist/form/components/form.d.ts +1 -1
  178. package/dist/form/components/form.js +6 -6
  179. package/dist/form/components/form.js.map +1 -1
  180. package/dist/form/components/index.d.ts +17 -17
  181. package/dist/form/embed.d.ts +17 -0
  182. package/dist/form/embed.js +10 -0
  183. package/dist/form/{components → hooks}/context.d.ts +3 -0
  184. package/dist/form/{components → hooks}/context.js +2 -1
  185. package/dist/form/hooks/context.js.map +1 -0
  186. package/dist/form/{components → hooks}/field-scope.js +3 -3
  187. package/dist/form/hooks/field-scope.js.map +1 -0
  188. package/dist/form/{components → hooks}/prefill-context.js +1 -1
  189. package/dist/form/hooks/prefill-context.js.map +1 -0
  190. package/dist/form/{components → hooks}/resolved-nodes.d.ts +1 -1
  191. package/dist/form/{components → hooks}/resolved-nodes.js +2 -2
  192. package/dist/form/hooks/resolved-nodes.js.map +1 -0
  193. package/dist/form/{components → hooks}/row-layout-context.js +1 -1
  194. package/dist/form/hooks/row-layout-context.js.map +1 -0
  195. package/dist/form/{components → hooks}/use-controlled-field.d.ts +2 -2
  196. package/dist/form/{components → hooks}/use-controlled-field.js +6 -5
  197. package/dist/form/hooks/use-controlled-field.js.map +1 -0
  198. package/dist/form/hooks/use-dependent-field.d.ts +3 -0
  199. package/dist/form/{components → hooks}/use-dependent-field.js +6 -6
  200. package/dist/form/hooks/use-dependent-field.js.map +1 -0
  201. package/dist/form/{components → hooks}/use-field-commit.d.ts +5 -0
  202. package/dist/form/{components → hooks}/use-field-commit.js +9 -2
  203. package/dist/form/hooks/use-field-commit.js.map +1 -0
  204. package/dist/form/{components → hooks}/use-form-resolver.d.ts +2 -2
  205. package/dist/form/{components → hooks}/use-form-resolver.js +5 -5
  206. package/dist/form/hooks/use-form-resolver.js.map +1 -0
  207. package/dist/form/{components → hooks}/use-seed-default.js +1 -1
  208. package/dist/form/hooks/use-seed-default.js.map +1 -0
  209. package/dist/form/{components → hooks}/values.d.ts +3 -1
  210. package/dist/form/hooks/values.js +136 -0
  211. package/dist/form/hooks/values.js.map +1 -0
  212. package/dist/form/index.d.ts +4 -1
  213. package/dist/form/index.js +3 -30
  214. package/dist/form/{components → lib}/conditions.d.ts +2 -1
  215. package/dist/form/{components → lib}/conditions.js +12 -2
  216. package/dist/form/lib/conditions.js.map +1 -0
  217. package/dist/form/lib/field-dom-name.d.ts +1 -0
  218. package/dist/form/lib/field-dom-name.js +10 -0
  219. package/dist/form/lib/field-dom-name.js.map +1 -0
  220. package/dist/form/{components → lib}/field-props.d.ts +2 -3
  221. package/dist/form/{components → lib}/field-props.js +1 -1
  222. package/dist/form/lib/field-props.js.map +1 -0
  223. package/dist/form/{components → lib}/form-path.js +1 -1
  224. package/dist/form/lib/form-path.js.map +1 -0
  225. package/dist/form/{components → lib}/form-transport.d.ts +1 -1
  226. package/dist/form/lib/form-transport.js +21 -0
  227. package/dist/form/lib/form-transport.js.map +1 -0
  228. package/dist/form/lib/override-keys.js +12 -0
  229. package/dist/form/lib/override-keys.js.map +1 -0
  230. package/dist/form/{components → lib}/prefill-targets.d.ts +2 -2
  231. package/dist/form/{components → lib}/prefill-targets.js +4 -5
  232. package/dist/form/lib/prefill-targets.js.map +1 -0
  233. package/dist/form/plugin.d.ts +1 -0
  234. package/dist/form/plugin.js +47 -0
  235. package/dist/form/plugin.js.map +1 -0
  236. package/dist/form/toolkit.d.ts +17 -0
  237. package/dist/form/toolkit.js +14 -0
  238. package/dist/form/{components/types.d.ts → types.d.ts} +3 -3
  239. package/dist/format/number.d.ts +1 -1
  240. package/dist/format/value.d.ts +1 -1
  241. package/dist/i18n/backend.d.ts +1 -1
  242. package/dist/i18n/config.d.ts +1 -1
  243. package/dist/i18n/index.d.ts +13 -13
  244. package/dist/i18n/locale-reload.js +1 -1
  245. package/dist/i18n/locale-reload.js.map +1 -1
  246. package/dist/i18n/locale.js.map +1 -1
  247. package/dist/i18n/page-props.d.ts +1 -1
  248. package/dist/i18n/timezone.js.map +1 -1
  249. package/dist/i18n/translatable.d.ts +1 -1
  250. package/dist/icons/icon-renderer.js.map +1 -1
  251. package/dist/icons/index.d.ts +4 -4
  252. package/dist/icons/sprite.js.map +1 -1
  253. package/dist/index.d.ts +37 -38
  254. package/dist/index.js +10 -9
  255. package/dist/inertia.js +1 -1
  256. package/dist/lattice.css +12 -10
  257. package/dist/layout/{breadcrumbs.d.ts → components/breadcrumbs.d.ts} +1 -1
  258. package/dist/layout/{breadcrumbs.js → components/breadcrumbs.js} +2 -2
  259. package/dist/layout/components/breadcrumbs.js.map +1 -0
  260. package/dist/layout/{callouts.d.ts → components/callouts.d.ts} +1 -1
  261. package/dist/layout/{callouts.js → components/callouts.js} +7 -7
  262. package/dist/layout/components/callouts.js.map +1 -0
  263. package/dist/layout/{dropdown.d.ts → components/dropdown.d.ts} +1 -1
  264. package/dist/layout/{dropdown.js → components/dropdown.js} +2 -2
  265. package/dist/layout/components/dropdown.js.map +1 -0
  266. package/dist/layout/{menu-item.d.ts → components/menu-item.d.ts} +1 -1
  267. package/dist/layout/{menu-item.js → components/menu-item.js} +9 -8
  268. package/dist/layout/components/menu-item.js.map +1 -0
  269. package/dist/layout/{menu.d.ts → components/menu.d.ts} +1 -1
  270. package/dist/layout/{menu.js → components/menu.js} +2 -2
  271. package/dist/layout/components/menu.js.map +1 -0
  272. package/dist/layout/{outlet.d.ts → components/outlet.d.ts} +1 -1
  273. package/dist/layout/{outlet.js → components/outlet.js} +2 -2
  274. package/dist/layout/components/outlet.js.map +1 -0
  275. package/dist/layout/{popover.js → components/popover.js} +4 -4
  276. package/dist/layout/components/popover.js.map +1 -0
  277. package/dist/layout/{schema-layout.js → components/schema-layout.js} +3 -3
  278. package/dist/layout/components/schema-layout.js.map +1 -0
  279. package/dist/layout/{sidebar.d.ts → components/sidebar.d.ts} +1 -1
  280. package/dist/layout/{sidebar.js → components/sidebar.js} +5 -5
  281. package/dist/layout/components/sidebar.js.map +1 -0
  282. package/dist/layout/{topbar.d.ts → components/topbar.d.ts} +1 -1
  283. package/dist/layout/{topbar.js → components/topbar.js} +3 -3
  284. package/dist/layout/components/topbar.js.map +1 -0
  285. package/dist/layout/{context.d.ts → hooks/context.d.ts} +1 -1
  286. package/dist/layout/{context.js → hooks/context.js} +2 -2
  287. package/dist/layout/hooks/context.js.map +1 -0
  288. package/dist/layout/index.d.ts +4 -4
  289. package/dist/layout/index.js +4 -4
  290. package/dist/layout/plugin.d.ts +2 -0
  291. package/dist/layout/{components.js → plugin.js} +10 -10
  292. package/dist/layout/plugin.js.map +1 -0
  293. package/dist/notifications/api.d.ts +1 -1
  294. package/dist/notifications/components/notification-item.d.ts +1 -1
  295. package/dist/notifications/components/notification-item.js.map +1 -1
  296. package/dist/notifications/components/notification-list.d.ts +2 -2
  297. package/dist/notifications/components/notification-list.js +1 -1
  298. package/dist/notifications/components/notification-list.js.map +1 -1
  299. package/dist/notifications/components/notifications-echo.d.ts +1 -1
  300. package/dist/notifications/components/notifications-echo.js.map +1 -1
  301. package/dist/notifications/components/notifications.d.ts +1 -1
  302. package/dist/notifications/components/notifications.js +3 -3
  303. package/dist/notifications/components/notifications.js.map +1 -1
  304. package/dist/notifications/index.d.ts +2 -1
  305. package/dist/notifications/index.js +1 -10
  306. package/dist/notifications/plugin.d.ts +2 -0
  307. package/dist/notifications/plugin.js +11 -0
  308. package/dist/notifications/plugin.js.map +1 -0
  309. package/dist/notifications/store.d.ts +1 -1
  310. package/dist/notifications/types.d.ts +1 -1
  311. package/dist/page.d.ts +1 -1
  312. package/dist/provider-base.d.ts +2 -2
  313. package/dist/provider-base.js +5 -4
  314. package/dist/provider-base.js.map +1 -1
  315. package/dist/provider.d.ts +3 -3
  316. package/dist/realtime/build-effects.d.ts +2 -2
  317. package/dist/realtime/listeners.d.ts +1 -1
  318. package/dist/realtime/subscriptions.d.ts +1 -1
  319. package/dist/registry.d.ts +1 -1
  320. package/dist/registry.js +9 -9
  321. package/dist/registry.js.map +1 -1
  322. package/dist/remote/components/data-list.d.ts +2 -2
  323. package/dist/remote/components/data-list.js +1 -34
  324. package/dist/remote/components/data-list.js.map +1 -1
  325. package/dist/remote/index.d.ts +1 -1
  326. package/dist/remote/index.js +1 -10
  327. package/dist/remote/plugin.d.ts +2 -0
  328. package/dist/remote/plugin.js +11 -0
  329. package/dist/remote/plugin.js.map +1 -0
  330. package/dist/table/components/bulk-bar.d.ts +1 -1
  331. package/dist/table/components/bulk-bar.js +4 -4
  332. package/dist/table/components/bulk-bar.js.map +1 -1
  333. package/dist/table/components/cells/badge-cell.d.ts +1 -1
  334. package/dist/table/components/cells/badge-cell.js +1 -1
  335. package/dist/table/components/cells/badge-cell.js.map +1 -1
  336. package/dist/table/components/cells/boolean-cell.d.ts +1 -1
  337. package/dist/table/components/cells/boolean-cell.js.map +1 -1
  338. package/dist/table/components/cells/icon-cell.d.ts +1 -1
  339. package/dist/table/components/cells/icon-cell.js.map +1 -1
  340. package/dist/table/components/cells/image-cell.d.ts +1 -1
  341. package/dist/table/components/cells/image-cell.js +1 -1
  342. package/dist/table/components/cells/image-cell.js.map +1 -1
  343. package/dist/table/components/cells/money-cell.d.ts +1 -1
  344. package/dist/table/components/cells/money-cell.js +1 -1
  345. package/dist/table/components/cells/money-cell.js.map +1 -1
  346. package/dist/table/components/cells/number-cell.d.ts +1 -1
  347. package/dist/table/components/cells/number-cell.js +1 -1
  348. package/dist/table/components/cells/number-cell.js.map +1 -1
  349. package/dist/table/components/cells/stack-cell.d.ts +1 -1
  350. package/dist/table/components/cells/stack-cell.js +3 -7
  351. package/dist/table/components/cells/stack-cell.js.map +1 -1
  352. package/dist/table/components/cells/text-cell.d.ts +1 -1
  353. package/dist/table/components/cells/text-cell.js +4 -4
  354. package/dist/table/components/cells/text-cell.js.map +1 -1
  355. package/dist/table/components/column-filter-control.d.ts +3 -3
  356. package/dist/table/components/column-filter-control.js +34 -19
  357. package/dist/table/components/column-filter-control.js.map +1 -1
  358. package/dist/table/components/column-header.d.ts +1 -1
  359. package/dist/table/components/column-header.js +7 -7
  360. package/dist/table/components/column-header.js.map +1 -1
  361. package/dist/table/components/column-visibility-menu.d.ts +1 -1
  362. package/dist/table/components/column-visibility-menu.js +3 -3
  363. package/dist/table/components/column-visibility-menu.js.map +1 -1
  364. package/dist/table/components/filter-bar.d.ts +9 -7
  365. package/dist/table/components/filter-bar.js +62 -52
  366. package/dist/table/components/filter-bar.js.map +1 -1
  367. package/dist/table/components/filter-controls.d.ts +5 -9
  368. package/dist/table/components/filter-controls.js +96 -224
  369. package/dist/table/components/filter-controls.js.map +1 -1
  370. package/dist/table/components/filter-value-input.d.ts +1 -1
  371. package/dist/table/components/filter-value-input.js +1 -1
  372. package/dist/table/components/filter-value-input.js.map +1 -1
  373. package/dist/table/components/pagination.d.ts +2 -2
  374. package/dist/table/components/pagination.js.map +1 -1
  375. package/dist/table/components/sort-bar.d.ts +1 -1
  376. package/dist/table/components/sort-bar.js +2 -2
  377. package/dist/table/components/sort-bar.js.map +1 -1
  378. package/dist/table/components/table-action-node.d.ts +1 -1
  379. package/dist/table/components/table-action-node.js +1 -1
  380. package/dist/table/components/table-action-node.js.map +1 -1
  381. package/dist/table/components/table-cell.d.ts +1 -1
  382. package/dist/table/components/table-cell.js +2 -2
  383. package/dist/table/components/table-cell.js.map +1 -1
  384. package/dist/table/components/table.d.ts +1 -1
  385. package/dist/table/components/table.js +23 -31
  386. package/dist/table/components/table.js.map +1 -1
  387. package/dist/{core → table/hooks}/use-column-visibility.d.ts +5 -3
  388. package/dist/{core → table/hooks}/use-column-visibility.js +4 -4
  389. package/dist/table/hooks/use-column-visibility.js.map +1 -0
  390. package/dist/table/{use-table-selection.js → hooks/use-table-selection.js} +1 -1
  391. package/dist/table/hooks/use-table-selection.js.map +1 -0
  392. package/dist/table/{use-table.d.ts → hooks/use-table.d.ts} +7 -7
  393. package/dist/table/{use-table.js → hooks/use-table.js} +12 -9
  394. package/dist/table/hooks/use-table.js.map +1 -0
  395. package/dist/table/index.d.ts +6 -1
  396. package/dist/table/index.js +5 -11
  397. package/dist/table/{align.d.ts → lib/align.d.ts} +1 -1
  398. package/dist/table/{align.js → lib/align.js} +1 -1
  399. package/dist/table/lib/align.js.map +1 -0
  400. package/dist/table/{bulk.d.ts → lib/bulk.d.ts} +3 -3
  401. package/dist/table/{bulk.js → lib/bulk.js} +1 -1
  402. package/dist/table/lib/bulk.js.map +1 -0
  403. package/dist/table/{filter-values.d.ts → lib/filter-values.d.ts} +10 -3
  404. package/dist/table/{filter-values.js → lib/filter-values.js} +14 -4
  405. package/dist/table/lib/filter-values.js.map +1 -0
  406. package/dist/table/{format.d.ts → lib/format.d.ts} +2 -2
  407. package/dist/table/{format.js → lib/format.js} +3 -3
  408. package/dist/table/lib/format.js.map +1 -0
  409. package/dist/table/{payload.d.ts → lib/payload.d.ts} +2 -3
  410. package/dist/table/{payload.js → lib/payload.js} +12 -9
  411. package/dist/table/lib/payload.js.map +1 -0
  412. package/dist/table/{query.d.ts → lib/query.d.ts} +3 -3
  413. package/dist/table/{query.js → lib/query.js} +27 -27
  414. package/dist/table/lib/query.js.map +1 -0
  415. package/dist/table/plugin.d.ts +2 -0
  416. package/dist/table/plugin.js +11 -0
  417. package/dist/table/plugin.js.map +1 -0
  418. package/dist/table/registry.d.ts +3 -1
  419. package/dist/table/registry.js.map +1 -1
  420. package/dist/table/types.d.ts +57 -7
  421. package/dist/toast/callout.d.ts +1 -1
  422. package/dist/toast/callout.js.map +1 -1
  423. package/dist/toast/index.d.ts +6 -5
  424. package/dist/toast/index.js +2 -1
  425. package/dist/toast/toast.d.ts +1 -1
  426. package/dist/toast/toaster.js.map +1 -1
  427. package/dist/toast/variant-styles.d.ts +1 -1
  428. package/dist/types/generated.d.ts +118 -64
  429. package/dist/types/index.d.ts +1 -1
  430. package/dist/{action/components → ui}/action-menu-context.js +1 -1
  431. package/dist/ui/action-menu-context.js.map +1 -0
  432. package/dist/{form/components/base → ui}/affix-group.d.ts +1 -1
  433. package/dist/{form/components/base → ui}/affix-group.js +3 -3
  434. package/dist/ui/affix-group.js.map +1 -0
  435. package/dist/{core/components → ui}/badge.d.ts +1 -1
  436. package/dist/{core/components → ui}/badge.js +2 -2
  437. package/dist/ui/badge.js.map +1 -0
  438. package/dist/{core/components → ui}/button.d.ts +2 -2
  439. package/dist/{core/components → ui}/button.js +5 -5
  440. package/dist/ui/button.js.map +1 -0
  441. package/dist/{core/components → ui}/card.d.ts +1 -1
  442. package/dist/{core/components → ui}/card.js +3 -3
  443. package/dist/ui/card.js.map +1 -0
  444. package/dist/{core/components → ui}/chart-view.d.ts +1 -1
  445. package/dist/{core/components → ui}/chart-view.js +5 -5
  446. package/dist/ui/chart-view.js.map +1 -0
  447. package/dist/{core/components → ui}/chart.d.ts +1 -1
  448. package/dist/{core/components → ui}/chart.js +1 -1
  449. package/dist/ui/chart.js.map +1 -0
  450. package/dist/{core/components → ui}/checkbox.js +3 -3
  451. package/dist/ui/checkbox.js.map +1 -0
  452. package/dist/{core/use-click-behavior.d.ts → ui/click-behavior.d.ts} +17 -19
  453. package/dist/ui/click-behavior.js +46 -0
  454. package/dist/ui/click-behavior.js.map +1 -0
  455. package/dist/{core/components → ui}/collapsible.d.ts +1 -1
  456. package/dist/{core/components → ui}/collapsible.js +6 -6
  457. package/dist/ui/collapsible.js.map +1 -0
  458. package/dist/{core/components → ui}/combobox.d.ts +1 -1
  459. package/dist/{core/components → ui}/combobox.js +4 -4
  460. package/dist/ui/combobox.js.map +1 -0
  461. package/dist/{core/components → ui}/confirm-dialog.d.ts +1 -1
  462. package/dist/{core/components → ui}/confirm-dialog.js +1 -1
  463. package/dist/ui/confirm-dialog.js.map +1 -0
  464. package/dist/{core/components → ui}/control.d.ts +1 -1
  465. package/dist/{core/components → ui}/control.js +1 -1
  466. package/dist/ui/control.js.map +1 -0
  467. package/dist/{clipboard → ui}/copyable-text.d.ts +1 -0
  468. package/dist/{clipboard → ui}/copyable-text.js +11 -3
  469. package/dist/ui/copyable-text.js.map +1 -0
  470. package/dist/{core/components → ui}/dialog.js +3 -3
  471. package/dist/ui/dialog.js.map +1 -0
  472. package/dist/{core/components → ui}/dropdown-menu.d.ts +1 -1
  473. package/dist/{core/components → ui}/dropdown-menu.js +3 -3
  474. package/dist/ui/dropdown-menu.js.map +1 -0
  475. package/dist/{core/components → ui}/floating-panel.d.ts +1 -1
  476. package/dist/{core/components → ui}/floating-panel.js +4 -4
  477. package/dist/ui/floating-panel.js.map +1 -0
  478. package/dist/{core/components → ui}/fragment.d.ts +1 -1
  479. package/dist/{core/components → ui}/fragment.js +5 -5
  480. package/dist/ui/fragment.js.map +1 -0
  481. package/dist/{core/components → ui}/grid.d.ts +1 -1
  482. package/dist/{core/components → ui}/grid.js +3 -3
  483. package/dist/ui/grid.js.map +1 -0
  484. package/dist/{core/components → ui}/heading.d.ts +1 -1
  485. package/dist/{core/components → ui}/heading.js +2 -2
  486. package/dist/ui/heading.js.map +1 -0
  487. package/dist/{core/components → ui}/icon.d.ts +1 -1
  488. package/dist/{core/components → ui}/icon.js +3 -3
  489. package/dist/ui/icon.js.map +1 -0
  490. package/dist/ui/index.d.ts +27 -0
  491. package/dist/ui/index.js +26 -0
  492. package/dist/{core/components → ui}/info-tooltip.js +3 -3
  493. package/dist/ui/info-tooltip.js.map +1 -0
  494. package/dist/{form/components/base → ui}/input-error.js +2 -2
  495. package/dist/ui/input-error.js.map +1 -0
  496. package/dist/{form/components/base → ui}/input-otp.js +2 -2
  497. package/dist/ui/input-otp.js.map +1 -0
  498. package/dist/{form/components/base → ui}/input.js +3 -3
  499. package/dist/ui/input.js.map +1 -0
  500. package/dist/{form/components/base → ui}/label.js +2 -2
  501. package/dist/ui/label.js.map +1 -0
  502. package/dist/{core/components → ui}/link.d.ts +1 -1
  503. package/dist/{core/components → ui}/link.js +8 -7
  504. package/dist/ui/link.js.map +1 -0
  505. package/dist/{core/components → ui}/modal.d.ts +1 -1
  506. package/dist/{core/components → ui}/modal.js +2 -2
  507. package/dist/ui/modal.js.map +1 -0
  508. package/dist/{form/components/base → ui}/password-input.js +3 -3
  509. package/dist/ui/password-input.js.map +1 -0
  510. package/dist/ui/plugin.d.ts +1 -0
  511. package/dist/{core/components/index.js → ui/plugin.js} +6 -6
  512. package/dist/ui/plugin.js.map +1 -0
  513. package/dist/{core/components → ui}/popover.js +2 -2
  514. package/dist/ui/popover.js.map +1 -0
  515. package/dist/{core/components → ui}/raw-block.d.ts +1 -1
  516. package/dist/{core/components → ui}/raw-block.js +1 -1
  517. package/dist/ui/raw-block.js.map +1 -0
  518. package/dist/{core/components → ui}/section.d.ts +1 -1
  519. package/dist/{core/components → ui}/section.js +6 -6
  520. package/dist/ui/section.js.map +1 -0
  521. package/dist/{core/components → ui}/segmented-control.d.ts +1 -1
  522. package/dist/{core/components → ui}/segmented-control.js +1 -1
  523. package/dist/ui/segmented-control.js.map +1 -0
  524. package/dist/{core/components → ui}/segmented-pills.d.ts +1 -1
  525. package/dist/{core/components → ui}/segmented-pills.js +2 -2
  526. package/dist/ui/segmented-pills.js.map +1 -0
  527. package/dist/{core/components → ui}/skeleton.js +2 -2
  528. package/dist/ui/skeleton.js.map +1 -0
  529. package/dist/{core/components → ui}/spinner.js +4 -4
  530. package/dist/ui/spinner.js.map +1 -0
  531. package/dist/{core/components → ui}/stack.d.ts +1 -1
  532. package/dist/{core/components → ui}/stack.js +3 -3
  533. package/dist/ui/stack.js.map +1 -0
  534. package/dist/{core/components → ui}/tabs.d.ts +1 -1
  535. package/dist/{core/components → ui}/tabs.js +3 -3
  536. package/dist/ui/tabs.js.map +1 -0
  537. package/dist/{core/components → ui}/text.d.ts +1 -1
  538. package/dist/{core/components → ui}/text.js +4 -4
  539. package/dist/ui/text.js.map +1 -0
  540. package/dist/{form/components/base → ui}/textarea.js +3 -3
  541. package/dist/ui/textarea.js.map +1 -0
  542. package/dist/{core/components → ui}/tooltip.d.ts +1 -1
  543. package/dist/{core/components → ui}/tooltip.js +3 -3
  544. package/dist/ui/tooltip.js.map +1 -0
  545. package/dist/vite.js +2 -2
  546. package/dist/vite.js.map +1 -1
  547. package/dist-standalone/chunks/chart-view-CK5fKIkR.js +36 -0
  548. package/dist-standalone/chunks/date-picker-field-BlCPFhZd.js +1 -0
  549. package/dist-standalone/chunks/dist-PaT1gYi_.js +2 -0
  550. package/dist-standalone/chunks/jsx-runtime-CJ_btYLc.js +1 -0
  551. package/dist-standalone/chunks/notifications-echo-DsfNc4Ge.js +1 -0
  552. package/dist-standalone/chunks/react-B8IZ02wI.js +1 -0
  553. package/dist-standalone/chunks/rich-editor-field-DH5dS5c1.js +154 -0
  554. package/dist-standalone/chunks/subscriptions-B3UuDBmx.js +1 -0
  555. package/dist-standalone/chunks/test-id-Dh3L6Gfh.js +1 -0
  556. package/dist-standalone/chunks/use-effect-dispatcher-k98Nzf9M.js +97 -0
  557. package/dist-standalone/chunks/with-selector-BwDoCrJJ.js +1 -0
  558. package/dist-standalone/lattice.css +3 -0
  559. package/dist-standalone/lattice.js +66 -0
  560. package/dist-standalone/manifest.json +18 -0
  561. package/dist-standalone/sprite.svg +1 -0
  562. package/package.json +33 -95
  563. package/resources/icons/align-center.svg +1 -1
  564. package/resources/icons/align-justify.svg +1 -1
  565. package/resources/icons/align-left.svg +1 -1
  566. package/resources/icons/align-right.svg +1 -1
  567. package/resources/icons/arrow-down.svg +1 -1
  568. package/resources/icons/arrow-up.svg +1 -1
  569. package/resources/icons/bell.svg +1 -1
  570. package/resources/icons/bold.svg +1 -1
  571. package/resources/icons/calendar.svg +1 -1
  572. package/resources/icons/check.svg +1 -1
  573. package/resources/icons/chevron-down.svg +1 -1
  574. package/resources/icons/chevron-left.svg +1 -1
  575. package/resources/icons/chevron-right.svg +1 -1
  576. package/resources/icons/chevrons-up-down.svg +1 -1
  577. package/resources/icons/circle-alert.svg +1 -1
  578. package/resources/icons/circle-check.svg +1 -1
  579. package/resources/icons/circle-help.svg +1 -1
  580. package/resources/icons/circle-x.svg +1 -1
  581. package/resources/icons/clock.svg +1 -1
  582. package/resources/icons/code.svg +1 -1
  583. package/resources/icons/columns-3.svg +1 -1
  584. package/resources/icons/copy.svg +1 -1
  585. package/resources/icons/external-link.svg +1 -1
  586. package/resources/icons/eye-off.svg +1 -1
  587. package/resources/icons/eye.svg +1 -1
  588. package/resources/icons/filter.svg +1 -1
  589. package/resources/icons/heading-1.svg +1 -1
  590. package/resources/icons/heading-2.svg +1 -1
  591. package/resources/icons/heading-3.svg +1 -1
  592. package/resources/icons/highlighter.svg +1 -1
  593. package/resources/icons/info.svg +1 -1
  594. package/resources/icons/italic.svg +1 -1
  595. package/resources/icons/layout-dashboard.svg +1 -1
  596. package/resources/icons/link.svg +1 -1
  597. package/resources/icons/list-ordered.svg +1 -1
  598. package/resources/icons/list.svg +1 -1
  599. package/resources/icons/loader-2.svg +1 -1
  600. package/resources/icons/minus.svg +1 -1
  601. package/resources/icons/more-horizontal.svg +1 -1
  602. package/resources/icons/panel-left.svg +1 -1
  603. package/resources/icons/pencil-line.svg +1 -1
  604. package/resources/icons/pencil.svg +1 -1
  605. package/resources/icons/plus.svg +1 -1
  606. package/resources/icons/quote.svg +1 -1
  607. package/resources/icons/rotate-ccw.svg +1 -1
  608. package/resources/icons/rows-3.svg +1 -1
  609. package/resources/icons/search.svg +1 -1
  610. package/resources/icons/send.svg +1 -1
  611. package/resources/icons/settings.svg +1 -1
  612. package/resources/icons/smile.svg +1 -1
  613. package/resources/icons/strikethrough.svg +1 -1
  614. package/resources/icons/table.svg +1 -1
  615. package/resources/icons/trash-2.svg +1 -1
  616. package/resources/icons/underline.svg +1 -1
  617. package/resources/icons/x.svg +1 -1
  618. package/dist/action/components/action-menu-context.js.map +0 -1
  619. package/dist/action/index.js.map +0 -1
  620. package/dist/action/run-action.js.map +0 -1
  621. package/dist/action/use-action.js.map +0 -1
  622. package/dist/chat/index.js.map +0 -1
  623. package/dist/chat/transport.js.map +0 -1
  624. package/dist/chat/use-chat.js.map +0 -1
  625. package/dist/clipboard/copyable-text.js.map +0 -1
  626. package/dist/core/column-sizing.js.map +0 -1
  627. package/dist/core/components/badge.js.map +0 -1
  628. package/dist/core/components/button.js.map +0 -1
  629. package/dist/core/components/card.js.map +0 -1
  630. package/dist/core/components/chart-view.js.map +0 -1
  631. package/dist/core/components/chart.js.map +0 -1
  632. package/dist/core/components/checkbox.js.map +0 -1
  633. package/dist/core/components/collapsible.js.map +0 -1
  634. package/dist/core/components/combobox.js.map +0 -1
  635. package/dist/core/components/confirm-dialog.js.map +0 -1
  636. package/dist/core/components/control.js.map +0 -1
  637. package/dist/core/components/dialog.js.map +0 -1
  638. package/dist/core/components/dropdown-menu.js.map +0 -1
  639. package/dist/core/components/floating-panel.js.map +0 -1
  640. package/dist/core/components/fragment.js.map +0 -1
  641. package/dist/core/components/grid.js.map +0 -1
  642. package/dist/core/components/heading.js.map +0 -1
  643. package/dist/core/components/icon.js.map +0 -1
  644. package/dist/core/components/index.d.ts +0 -1
  645. package/dist/core/components/index.js.map +0 -1
  646. package/dist/core/components/info-tooltip.js.map +0 -1
  647. package/dist/core/components/link.js.map +0 -1
  648. package/dist/core/components/modal.js.map +0 -1
  649. package/dist/core/components/popover.js.map +0 -1
  650. package/dist/core/components/raw-block.js.map +0 -1
  651. package/dist/core/components/section.js.map +0 -1
  652. package/dist/core/components/segmented-control.js.map +0 -1
  653. package/dist/core/components/segmented-pills.js.map +0 -1
  654. package/dist/core/components/skeleton.js.map +0 -1
  655. package/dist/core/components/spinner.js.map +0 -1
  656. package/dist/core/components/stack.js.map +0 -1
  657. package/dist/core/components/tabs.js.map +0 -1
  658. package/dist/core/components/text.js.map +0 -1
  659. package/dist/core/components/tooltip.js.map +0 -1
  660. package/dist/core/use-click-behavior.js +0 -46
  661. package/dist/core/use-click-behavior.js.map +0 -1
  662. package/dist/core/use-column-resizing.js.map +0 -1
  663. package/dist/core/use-column-visibility.js.map +0 -1
  664. package/dist/events/event-bridge.js.map +0 -1
  665. package/dist/form/components/base/affix-group.js.map +0 -1
  666. package/dist/form/components/base/input-error.js.map +0 -1
  667. package/dist/form/components/base/input-otp.js.map +0 -1
  668. package/dist/form/components/base/input.js.map +0 -1
  669. package/dist/form/components/base/label.js.map +0 -1
  670. package/dist/form/components/base/password-input.js.map +0 -1
  671. package/dist/form/components/base/textarea.js.map +0 -1
  672. package/dist/form/components/conditions.js.map +0 -1
  673. package/dist/form/components/context.js.map +0 -1
  674. package/dist/form/components/field-props.js.map +0 -1
  675. package/dist/form/components/field-scope.js.map +0 -1
  676. package/dist/form/components/fields/block-add-menu.js.map +0 -1
  677. package/dist/form/components/form-path.js.map +0 -1
  678. package/dist/form/components/form-transport.js +0 -30
  679. package/dist/form/components/form-transport.js.map +0 -1
  680. package/dist/form/components/override-keys.js +0 -12
  681. package/dist/form/components/override-keys.js.map +0 -1
  682. package/dist/form/components/prefill-context.js.map +0 -1
  683. package/dist/form/components/prefill-targets.js.map +0 -1
  684. package/dist/form/components/resolved-nodes.js.map +0 -1
  685. package/dist/form/components/row-layout-context.js.map +0 -1
  686. package/dist/form/components/use-controlled-field.js.map +0 -1
  687. package/dist/form/components/use-dependent-field.d.ts +0 -3
  688. package/dist/form/components/use-dependent-field.js.map +0 -1
  689. package/dist/form/components/use-field-commit.js.map +0 -1
  690. package/dist/form/components/use-form-resolver.js.map +0 -1
  691. package/dist/form/components/use-seed-default.js.map +0 -1
  692. package/dist/form/components/values.js +0 -52
  693. package/dist/form/components/values.js.map +0 -1
  694. package/dist/form/index.js.map +0 -1
  695. package/dist/layout/breadcrumbs.js.map +0 -1
  696. package/dist/layout/callouts.js.map +0 -1
  697. package/dist/layout/components.d.ts +0 -1
  698. package/dist/layout/components.js.map +0 -1
  699. package/dist/layout/context.js.map +0 -1
  700. package/dist/layout/dropdown.js.map +0 -1
  701. package/dist/layout/menu-item.js.map +0 -1
  702. package/dist/layout/menu.js.map +0 -1
  703. package/dist/layout/outlet.js.map +0 -1
  704. package/dist/layout/popover.js.map +0 -1
  705. package/dist/layout/schema-layout.js.map +0 -1
  706. package/dist/layout/sidebar.js.map +0 -1
  707. package/dist/layout/topbar.js.map +0 -1
  708. package/dist/notifications/index.js.map +0 -1
  709. package/dist/remote/index.js.map +0 -1
  710. package/dist/svg-sprite-client/index.d.ts +0 -1
  711. package/dist/svg-sprite-client/index.js +0 -0
  712. package/dist/table/align.js.map +0 -1
  713. package/dist/table/bulk.js.map +0 -1
  714. package/dist/table/components/filter-stack-bar.d.ts +0 -7
  715. package/dist/table/components/filter-stack-bar.js +0 -38
  716. package/dist/table/components/filter-stack-bar.js.map +0 -1
  717. package/dist/table/filter-values.js.map +0 -1
  718. package/dist/table/format.js.map +0 -1
  719. package/dist/table/index.js.map +0 -1
  720. package/dist/table/payload.js.map +0 -1
  721. package/dist/table/query.js.map +0 -1
  722. package/dist/table/use-table-selection.js.map +0 -1
  723. package/dist/table/use-table.js.map +0 -1
  724. package/dist/types/generated.js +0 -0
  725. package/dist/types/index.js +0 -0
  726. /package/dist/form/{components → hooks}/field-scope.d.ts +0 -0
  727. /package/dist/form/{components → hooks}/prefill-context.d.ts +0 -0
  728. /package/dist/form/{components → hooks}/row-layout-context.d.ts +0 -0
  729. /package/dist/form/{components → hooks}/use-seed-default.d.ts +0 -0
  730. /package/dist/form/{components → lib}/form-path.d.ts +0 -0
  731. /package/dist/form/{components → lib}/override-keys.d.ts +0 -0
  732. /package/dist/form/{components/types.js → types.js} +0 -0
  733. /package/dist/layout/{popover.d.ts → components/popover.d.ts} +0 -0
  734. /package/dist/layout/{schema-layout.d.ts → components/schema-layout.d.ts} +0 -0
  735. /package/dist/table/{use-table-selection.d.ts → hooks/use-table-selection.d.ts} +0 -0
  736. /package/dist/{action/components → ui}/action-menu-context.d.ts +0 -0
  737. /package/dist/{core/components → ui}/checkbox.d.ts +0 -0
  738. /package/dist/{core/components → ui}/dialog.d.ts +0 -0
  739. /package/dist/{core/components → ui}/info-tooltip.d.ts +0 -0
  740. /package/dist/{form/components/base → ui}/input-error.d.ts +0 -0
  741. /package/dist/{form/components/base → ui}/input-otp.d.ts +0 -0
  742. /package/dist/{form/components/base → ui}/input.d.ts +0 -0
  743. /package/dist/{form/components/base → ui}/label.d.ts +0 -0
  744. /package/dist/{form/components/base → ui}/password-input.d.ts +0 -0
  745. /package/dist/{core/components → ui}/popover.d.ts +0 -0
  746. /package/dist/{core/components → ui}/skeleton.d.ts +0 -0
  747. /package/dist/{core/components → ui}/spinner.d.ts +0 -0
  748. /package/dist/{form/components/base → ui}/textarea.d.ts +0 -0
@@ -1,2 +1,2 @@
1
- import { ColumnCellComponent } from '../../registry';
1
+ import { ColumnCellComponent } from '../../registry.js';
2
2
  export declare const BooleanCell: ColumnCellComponent<"column.boolean">;
@@ -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 \"../../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 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,2 +1,2 @@
1
- import { ColumnCellComponent } from '../../registry';
1
+ import { ColumnCellComponent } from '../../registry.js';
2
2
  export declare const IconCell: ColumnCellComponent<"column.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 \"../../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 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,2 +1,2 @@
1
- import { ColumnCellComponent } from '../../registry';
1
+ import { ColumnCellComponent } from '../../registry.js';
2
2
  export declare const ImageCell: ColumnCellComponent<"column.image">;
@@ -6,7 +6,7 @@ var ImageCell = ({ column, props, value }) => {
6
6
  if (url === "") return null;
7
7
  const size = props.size ?? 32;
8
8
  return /* @__PURE__ */ jsx("img", {
9
- alt: column.label,
9
+ alt: column.props.label ?? void 0,
10
10
  src: url,
11
11
  width: size,
12
12
  height: size,
@@ -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 \"../../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.label}\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;EACZ,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\";\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,2 +1,2 @@
1
- import { ColumnCellComponent } from '../../registry';
1
+ import { ColumnCellComponent } from '../../registry.js';
2
2
  export declare const MoneyCell: ColumnCellComponent<"column.money">;
@@ -1,5 +1,5 @@
1
1
  import { useLocale } from "../../../i18n/locale.js";
2
- import { formatCell } from "../../format.js";
2
+ import { formatCell } from "../../lib/format.js";
3
3
  import { numericValue } from "../../../format/numeric.js";
4
4
  import { formatNumber } from "../../../format/number.js";
5
5
  import { jsx } from "react/jsx-runtime";
@@ -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 \"../../../format/number\";\nimport { numericValue } from \"../../../format/numeric\";\nimport { formatCell } from \"../../format\";\nimport type { ColumnCellComponent } from \"../../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\";\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,2 +1,2 @@
1
- import { ColumnCellComponent } from '../../registry';
1
+ import { ColumnCellComponent } from '../../registry.js';
2
2
  export declare const NumberCell: ColumnCellComponent<"column.number">;
@@ -1,5 +1,5 @@
1
1
  import { useLocale } from "../../../i18n/locale.js";
2
- import { formatCell } from "../../format.js";
2
+ import { formatCell } from "../../lib/format.js";
3
3
  import { numericValue } from "../../../format/numeric.js";
4
4
  import { formatNumber } from "../../../format/number.js";
5
5
  import { jsx } from "react/jsx-runtime";
@@ -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 \"../../../format/number\";\nimport { numericValue } from \"../../../format/numeric\";\nimport { formatCell } from \"../../format\";\nimport type { ColumnCellComponent } from \"../../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\";\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,2 +1,2 @@
1
- import { ColumnCellComponent } from '../../registry';
1
+ import { ColumnCellComponent } from '../../registry.js';
2
2
  export declare const StackCell: ColumnCellComponent<"column.stack">;
@@ -1,14 +1,10 @@
1
- import { TextCell } from "./text-cell.js";
1
+ import { Renderer } from "../../../core/renderer.js";
2
+ import { materializeSchema } from "../../../core/materialize.js";
2
3
  import { jsx } from "react/jsx-runtime";
3
4
  //#region resources/js/table/components/cells/stack-cell.tsx
4
5
  var StackCell = ({ column, row }) => /* @__PURE__ */ jsx("div", {
5
6
  className: "grid gap-1",
6
- children: (column.columns ?? []).map((stackedColumn) => /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(TextCell, {
7
- column: stackedColumn,
8
- props: stackedColumn.props ?? {},
9
- row,
10
- value: row[stackedColumn.key]
11
- }) }, stackedColumn.key))
7
+ children: /* @__PURE__ */ jsx(Renderer, { nodes: materializeSchema(column.schema, row) })
12
8
  });
13
9
  //#endregion
14
10
  export { StackCell };
@@ -1 +1 @@
1
- {"version":3,"file":"stack-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/stack-cell.tsx"],"sourcesContent":["import type { ColumnCellComponent } from \"../../registry\";\nimport type { ColumnPropsOf } from \"../../types\";\nimport { TextCell } from \"./text-cell\";\n\nexport const StackCell: ColumnCellComponent<\"column.stack\"> = ({ column, row }) => (\n <div className=\"grid gap-1\">\n {(column.columns ?? []).map((stackedColumn) => (\n <span key={stackedColumn.key}>\n <TextCell\n column={stackedColumn}\n props={(stackedColumn.props ?? {}) as ColumnPropsOf<\"column.text\">}\n row={row}\n value={row[stackedColumn.key]}\n />\n </span>\n ))}\n </div>\n);\n"],"mappings":";;;AAIA,IAAa,aAAkD,EAAE,QAAQ,UACvE,oBAAC,OAAD;CAAK,WAAU;YACX,OAAO,WAAW,CAAC,GAAG,KAAK,kBAC3B,oBAAC,QAAD,EAAA,UACE,oBAAC,UAAD;EACE,QAAQ;EACR,OAAQ,cAAc,SAAS,CAAC;EAC3B;EACL,OAAO,IAAI,cAAc;CAC1B,CAAA,EACG,GAPK,cAAc,GAOnB,CACP;AACE,CAAA"}
1
+ {"version":3,"file":"stack-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/stack-cell.tsx"],"sourcesContent":["import { Renderer } from \"@lattice-php/lattice/core/renderer\";\nimport { materializeSchema } from \"@lattice-php/lattice/core/materialize\";\nimport type { ColumnCellComponent } from \"@lattice-php/lattice/table/registry\";\n\nexport const StackCell: ColumnCellComponent<\"column.stack\"> = ({ column, row }) => (\n <div className=\"grid gap-1\">\n <Renderer nodes={materializeSchema(column.schema, row)} />\n </div>\n);\n"],"mappings":";;;;AAIA,IAAa,aAAkD,EAAE,QAAQ,UACvE,oBAAC,OAAD;CAAK,WAAU;WACb,oBAAC,UAAD,EAAU,OAAO,kBAAkB,OAAO,QAAQ,GAAG,EAAI,CAAA;AACtD,CAAA"}
@@ -1,2 +1,2 @@
1
- import { ColumnCellComponent } from '../../registry';
1
+ import { ColumnCellComponent } from '../../registry.js';
2
2
  export declare const TextCell: ColumnCellComponent<"column.text">;
@@ -1,7 +1,7 @@
1
1
  import { cn } from "../../../lib/utils.js";
2
2
  import { DateTime } from "../../../i18n/date-time.js";
3
- import { CopyableText } from "../../../clipboard/copyable-text.js";
4
- import { formatCell, resolveLink } from "../../format.js";
3
+ import { CopyableText } from "../../../ui/copyable-text.js";
4
+ import { formatCell, resolveLink } from "../../lib/format.js";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region resources/js/table/components/cells/text-cell.tsx
7
7
  var TextCell = (args) => {
@@ -39,7 +39,7 @@ function SingleBadgeCell({ column, props, row, value }) {
39
39
  });
40
40
  }
41
41
  function PlainTextCell({ column, props, row, value }) {
42
- const dateProps = column.props?.date;
42
+ const dateProps = column.props.date;
43
43
  const href = resolveLink(column, row, value);
44
44
  const text = formatCell(value, column);
45
45
  const content = href ? /* @__PURE__ */ jsx("a", {
@@ -57,7 +57,7 @@ function PlainTextCell({ column, props, row, value }) {
57
57
  if (!props.copyable) return content;
58
58
  return /* @__PURE__ */ jsx(CopyableText, {
59
59
  value: text,
60
- label: column.label,
60
+ label: column.props.label ?? column.key,
61
61
  testId: `copy-${column.key}`,
62
62
  children: content
63
63
  });
@@ -1 +1 @@
1
- {"version":3,"file":"text-cell.js","names":[],"sources":["../../../../resources/js/table/components/cells/text-cell.tsx"],"sourcesContent":["import { CopyableText } from \"@lattice-php/lattice/clipboard\";\nimport { DateTime } from \"@lattice-php/lattice/i18n\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { ReactNode } from \"react\";\nimport { formatCell, resolveLink } from \"../../format\";\nimport type { ColumnCellArgs, ColumnCellComponent } from \"../../registry\";\nimport type { ColumnPropsOf } from \"../../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\"> | null)?.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 value={text} label={column.label} testId={`copy-${column.key}`}>\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,OAA+C;CACzE,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;EAAc,OAAO;EAAM,OAAO,OAAO;EAAO,QAAQ,QAAQ,OAAO;YACpE;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 { 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,5 +1,5 @@
1
- import { FilterClause, TableColumn } from '../types';
2
- import { FilterOptionSearch } from './filter-controls';
1
+ import { Option } from '../../types/generated.js';
2
+ import { FilterClause, TableColumn } from '../types.js';
3
3
  type ColumnClause = {
4
4
  clause: FilterClause;
5
5
  index: number;
@@ -12,6 +12,6 @@ export declare function ColumnFilterControl({ column, clauses, processing, onAdd
12
12
  onUpdate: (index: number, clause: FilterClause) => void;
13
13
  onRemove: (index: number) => void;
14
14
  onReplace: (field: string, clauses: FilterClause[]) => void;
15
- onSearch?: FilterOptionSearch;
15
+ onSearch?: (query: string, signal?: AbortSignal) => Promise<Option[]>;
16
16
  }): import("react").JSX.Element | null;
17
17
  export {};
@@ -1,18 +1,20 @@
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 { Popover, PopoverContent, PopoverTrigger } from "../../core/components/popover.js";
5
- import { VALUELESS_FILTER_OPERATORS, operatorLabel } from "../query.js";
6
- import { FilterValueInput, fieldClass } from "./filter-value-input.js";
4
+ import { Popover, PopoverContent, PopoverTrigger } from "../../ui/popover.js";
5
+ import { filterValue } from "../lib/filter-values.js";
6
+ import { VALUELESS_FILTER_OPERATORS, operatorLabel } from "../lib/query.js";
7
7
  import { TableFilterControl } from "./filter-controls.js";
8
+ import { FilterValueInput, fieldClass } from "./filter-value-input.js";
8
9
  import { useState } from "react";
9
10
  import { jsx, jsxs } from "react/jsx-runtime";
10
11
  //#region resources/js/table/components/column-filter-control.tsx
11
12
  function ColumnFilterControl({ column, clauses, processing, onAdd, onUpdate, onRemove, onReplace, onSearch }) {
12
13
  const { t } = useT("lattice");
13
- const filter = column.filter;
14
+ const { filter, label: rawLabel } = column.props;
15
+ const label = rawLabel ?? column.key;
14
16
  if (!filter) return null;
15
- if (filter.control === "select") return /* @__PURE__ */ jsx(ColumnSelectFilter, {
17
+ if (filter.control === "filter.select") return /* @__PURE__ */ jsx(ColumnSelectFilter, {
16
18
  column,
17
19
  clauses,
18
20
  processing,
@@ -44,7 +46,7 @@ function ColumnFilterControl({ column, clauses, processing, onAdd, onUpdate, onR
44
46
  className: "min-w-0 flex-1",
45
47
  children: /* @__PURE__ */ jsx(FilterValueInput, {
46
48
  type,
47
- label: column.label,
49
+ label,
48
50
  value: primary?.clause.value ?? "",
49
51
  processing,
50
52
  withSearchIcon: type === "text" || type === "number",
@@ -57,7 +59,7 @@ function ColumnFilterControl({ column, clauses, processing, onAdd, onUpdate, onR
57
59
  asChild: true,
58
60
  children: /* @__PURE__ */ jsxs("button", {
59
61
  type: "button",
60
- "aria-label": t("table.filter.columnFilters", "{{label}} filters", { label: column.label }),
62
+ "aria-label": t("table.filter.columnFilters", "{{label}} filters", { label }),
61
63
  "data-test": `filter-${column.key}`,
62
64
  className: "relative -ml-px inline-flex size-lt-control-md shrink-0 items-center justify-center rounded-r-lt-sm border border-lt-input disabled:opacity-50 data-[state=open]:z-10 data-[state=open]:border-lt-primary",
63
65
  disabled: processing,
@@ -91,7 +93,7 @@ function serializeColumnValue(value) {
91
93
  return typeof value === "string" ? value : "";
92
94
  }
93
95
  function ColumnSelectFilter({ column, clauses, processing, onReplace, onSearch }) {
94
- const filter = column.filter;
96
+ const { filter, label } = column.props;
95
97
  if (!filter) return null;
96
98
  const multiple = filter.multiple;
97
99
  const operator = filter.defaultOperator;
@@ -101,17 +103,29 @@ function ColumnSelectFilter({ column, clauses, processing, onReplace, onSearch }
101
103
  const value = activeClauseOption ? activeClauseOption.value : multiple ? active?.clause.value ? active.clause.value.split(",") : [] : active?.clause.value ?? "";
102
104
  const data = {
103
105
  key: column.key,
104
- label: column.label,
105
- type: "select",
106
+ type: "filter.select",
106
107
  props: {
108
+ label,
107
109
  options: filter.options,
108
110
  multiple,
109
111
  searchable: filter.searchable,
110
112
  placeholder: null
111
- }
113
+ },
114
+ schema: [{
115
+ type: "field.select",
116
+ key: column.key,
117
+ props: {
118
+ name: "value",
119
+ label,
120
+ options: filter.options,
121
+ multiple,
122
+ searchable: filter.searchable,
123
+ placeholder: null
124
+ }
125
+ }]
112
126
  };
113
127
  function change(next) {
114
- const serialized = serializeColumnValue(next);
128
+ const serialized = serializeColumnValue(filterValue(next).value);
115
129
  if (serialized === "") {
116
130
  onReplace(column.key, []);
117
131
  return;
@@ -129,10 +143,10 @@ function ColumnSelectFilter({ column, clauses, processing, onReplace, onSearch }
129
143
  }
130
144
  return /* @__PURE__ */ jsx(TableFilterControl, {
131
145
  filter: data,
132
- value,
146
+ value: { value },
133
147
  processing,
134
148
  onChange: change,
135
- onSearch
149
+ onSearch: onSearch ? (_field, query, signal) => onSearch(query, signal) : void 0
136
150
  });
137
151
  }
138
152
  function clausesForOption(field, option) {
@@ -151,7 +165,7 @@ function clausesMatch(active, expected) {
151
165
  }
152
166
  function FilterClauseList({ column, clauses, operators, defaultOperator, processing, onAdd, onUpdate, onRemove }) {
153
167
  const { t } = useT("lattice");
154
- const type = column.filter?.type ?? "text";
168
+ const type = column.props.filter?.type ?? "text";
155
169
  const [draftOperator, setDraftOperator] = useState(defaultOperator);
156
170
  const [adding, setAdding] = useState(clauses.length === 0);
157
171
  return /* @__PURE__ */ jsxs("div", {
@@ -229,13 +243,14 @@ function FilterClauseList({ column, clauses, operators, defaultOperator, process
229
243
  }
230
244
  function FilterClauseRow({ column, type, operators, clause, processing, onOperator, onValue, onRemove }) {
231
245
  const { t } = useT("lattice");
246
+ const label = column.props.label ?? column.key;
232
247
  const valueless = VALUELESS_FILTER_OPERATORS.has(clause.operator);
233
248
  return /* @__PURE__ */ jsxs("div", {
234
249
  className: "grid gap-2",
235
250
  children: [/* @__PURE__ */ jsxs("div", {
236
251
  className: "flex items-center gap-2",
237
252
  children: [operators.length > 1 ? /* @__PURE__ */ jsx("select", {
238
- "aria-label": t("table.filter.operator", "{{label}} operator", { label: column.label }),
253
+ "aria-label": t("table.filter.operator", "{{label}} operator", { label }),
239
254
  "data-test": `filter-${column.key}-operator`,
240
255
  className: cn(fieldClass, "flex-1"),
241
256
  disabled: processing,
@@ -250,7 +265,7 @@ function FilterClauseRow({ column, type, operators, clause, processing, onOperat
250
265
  children: operatorLabel(clause.operator)
251
266
  }), /* @__PURE__ */ jsx("button", {
252
267
  type: "button",
253
- "aria-label": t("table.filter.remove", "Remove {{label}} filter", { label: column.label }),
268
+ "aria-label": t("table.filter.remove", "Remove {{label}} filter", { label }),
254
269
  "data-test": `filter-${column.key}-remove`,
255
270
  className: "inline-flex size-lt-control-md items-center justify-center rounded-lt-sm border border-lt-border hover:bg-lt-muted disabled:opacity-50",
256
271
  disabled: processing,
@@ -263,8 +278,8 @@ function FilterClauseRow({ column, type, operators, clause, processing, onOperat
263
278
  })]
264
279
  }), !valueless && /* @__PURE__ */ jsx(FilterValueInput, {
265
280
  type,
266
- label: column.label,
267
- ariaLabel: t("table.filter.value", "{{label}} filter value", { label: column.label }),
281
+ label,
282
+ ariaLabel: t("table.filter.value", "{{label}} filter value", { label }),
268
283
  value: clause.value,
269
284
  processing,
270
285
  onCommit: onValue,
@@ -1 +1 @@
1
- {"version":3,"file":"column-filter-control.js","names":[],"sources":["../../../resources/js/table/components/column-filter-control.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { useState } from \"react\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@lattice-php/lattice/core/components/popover\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type {\n ColumnFilterOption,\n FilterData,\n FilterType,\n Op,\n} from \"@lattice-php/lattice/types/generated\";\nimport { operatorLabel, VALUELESS_FILTER_OPERATORS } from \"../query\";\nimport type { FilterClause, TableColumn } from \"../types\";\nimport { type FilterOptionSearch, TableFilterControl } from \"./filter-controls\";\nimport { fieldClass, FilterValueInput } from \"./filter-value-input\";\n\ntype ColumnClause = { clause: FilterClause; index: number };\n\nexport function ColumnFilterControl({\n column,\n clauses,\n processing,\n onAdd,\n onUpdate,\n onRemove,\n onReplace,\n onSearch,\n}: {\n column: TableColumn;\n clauses: ColumnClause[];\n processing: boolean;\n onAdd: (clause: FilterClause) => void;\n onUpdate: (index: number, clause: FilterClause) => void;\n onRemove: (index: number) => void;\n onReplace: (field: string, clauses: FilterClause[]) => void;\n onSearch?: FilterOptionSearch;\n}) {\n const { t } = useT(\"lattice\");\n const filter = column.filter;\n\n if (!filter) {\n return null;\n }\n\n if (filter.control === \"select\") {\n return (\n <ColumnSelectFilter\n column={column}\n clauses={clauses}\n processing={processing}\n onReplace={onReplace}\n onSearch={onSearch}\n />\n );\n }\n\n const type = filter.type ?? \"text\";\n const operators = filter.operators ?? [];\n const defaultOperator = filter.defaultOperator ?? operators[0] ?? \"eq\";\n const primary = clauses.find((entry) => entry.clause.operator === defaultOperator) ?? clauses[0];\n\n function commitPrimary(value: string): void {\n if (value === \"\") {\n if (primary) {\n onRemove(primary.index);\n }\n\n return;\n }\n\n if (primary) {\n onUpdate(primary.index, { ...primary.clause, value });\n } else {\n onAdd({ field: column.key, operator: defaultOperator, value });\n }\n }\n\n return (\n <div className=\"flex min-w-0 max-w-80 items-stretch\">\n <div className=\"min-w-0 flex-1\">\n <FilterValueInput\n type={type}\n label={column.label}\n value={primary?.clause.value ?? \"\"}\n processing={processing}\n withSearchIcon={type === \"text\" || type === \"number\"}\n grouped\n testId={`filter-${column.key}-value`}\n onCommit={commitPrimary}\n onClear={primary ? () => onRemove(primary.index) : undefined}\n />\n </div>\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={t(\"table.filter.columnFilters\", \"{{label}} filters\", {\n label: column.label,\n })}\n data-test={`filter-${column.key}`}\n className=\"relative -ml-px inline-flex size-lt-control-md shrink-0 items-center justify-center rounded-r-lt-sm border border-lt-input disabled:opacity-50 data-[state=open]:z-10 data-[state=open]:border-lt-primary\"\n disabled={processing}\n >\n <Icon name=\"filter\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n {clauses.length > 0 && (\n <span className=\"absolute -right-1.5 -top-1.5 inline-flex size-4 items-center justify-center rounded-full bg-lt-primary text-xs font-medium text-lt-primary-fg\">\n {clauses.length}\n </span>\n )}\n </button>\n </PopoverTrigger>\n\n <PopoverContent align=\"start\" className=\"w-80 p-4\">\n <FilterClauseList\n column={column}\n clauses={clauses}\n operators={operators}\n defaultOperator={defaultOperator}\n processing={processing}\n onAdd={onAdd}\n onUpdate={onUpdate}\n onRemove={onRemove}\n />\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n\nfunction serializeColumnValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value.join(\",\");\n }\n\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction ColumnSelectFilter({\n column,\n clauses,\n processing,\n onReplace,\n onSearch,\n}: {\n column: TableColumn;\n clauses: ColumnClause[];\n processing: boolean;\n onReplace: (field: string, clauses: FilterClause[]) => void;\n onSearch?: FilterOptionSearch;\n}) {\n const filter = column.filter;\n\n if (!filter) {\n return null;\n }\n\n const multiple = filter.multiple;\n const operator = filter.defaultOperator;\n const clauseOptions = filter.clauseOptions ?? [];\n const activeClauseOption = findActiveClauseOption(\n clauses.map((entry) => entry.clause),\n clauseOptions,\n );\n const active = clauses.find((entry) => entry.clause.operator === operator) ?? clauses[0];\n const value: unknown = activeClauseOption\n ? activeClauseOption.value\n : multiple\n ? active?.clause.value\n ? active.clause.value.split(\",\")\n : []\n : (active?.clause.value ?? \"\");\n\n const data: FilterData = {\n key: column.key,\n label: column.label,\n type: \"select\",\n props: { options: filter.options, multiple, searchable: filter.searchable, placeholder: null },\n };\n\n function change(next: unknown): void {\n const serialized = serializeColumnValue(next);\n\n if (serialized === \"\") {\n onReplace(column.key, []);\n\n return;\n }\n\n const clauseOption = clauseOptions.find((option) => option.value === serialized);\n\n if (clauseOption) {\n onReplace(column.key, clausesForOption(column.key, clauseOption));\n\n return;\n }\n\n onReplace(column.key, [{ field: column.key, operator, value: serialized }]);\n }\n\n return (\n <TableFilterControl\n filter={data}\n value={value}\n processing={processing}\n onChange={change}\n onSearch={onSearch}\n />\n );\n}\n\nfunction clausesForOption(field: string, option: ColumnFilterOption): FilterClause[] {\n return option.clauses.map((clause) => ({\n field,\n operator: clause.operator,\n value: clause.value,\n }));\n}\n\nfunction findActiveClauseOption(\n clauses: FilterClause[],\n options: ColumnFilterOption[],\n): ColumnFilterOption | undefined {\n return options.find((option) => clausesMatch(clauses, clausesForOption(\"\", option)));\n}\n\nfunction clausesMatch(active: FilterClause[], expected: FilterClause[]): boolean {\n if (active.length !== expected.length) {\n return false;\n }\n\n return expected.every((clause) =>\n active.some(\n (current) => current.operator === clause.operator && current.value === clause.value,\n ),\n );\n}\n\nfunction FilterClauseList({\n column,\n clauses,\n operators,\n defaultOperator,\n processing,\n onAdd,\n onUpdate,\n onRemove,\n}: {\n column: TableColumn;\n clauses: ColumnClause[];\n operators: Op[];\n defaultOperator: Op;\n processing: boolean;\n onAdd: (clause: FilterClause) => void;\n onUpdate: (index: number, clause: FilterClause) => void;\n onRemove: (index: number) => void;\n}) {\n const { t } = useT(\"lattice\");\n const type = column.filter?.type ?? \"text\";\n const [draftOperator, setDraftOperator] = useState(defaultOperator);\n const [adding, setAdding] = useState(clauses.length === 0);\n\n return (\n <div className=\"grid gap-3\">\n {clauses.map((entry) => (\n <FilterClauseRow\n key={entry.index}\n column={column}\n type={type}\n operators={operators}\n clause={entry.clause}\n processing={processing}\n onOperator={(operator) => onUpdate(entry.index, { ...entry.clause, operator })}\n onValue={(value) =>\n value === \"\" ? onRemove(entry.index) : onUpdate(entry.index, { ...entry.clause, value })\n }\n onRemove={() => onRemove(entry.index)}\n />\n ))}\n\n {adding && (\n <FilterClauseRow\n column={column}\n type={type}\n operators={operators}\n clause={{ field: column.key, operator: draftOperator, value: \"\" }}\n processing={processing}\n onOperator={(operator) => {\n if (VALUELESS_FILTER_OPERATORS.has(operator)) {\n onAdd({ field: column.key, operator, value: \"\" });\n setDraftOperator(defaultOperator);\n setAdding(false);\n return;\n }\n setDraftOperator(operator);\n }}\n onValue={(value) => {\n if (value !== \"\") {\n onAdd({ field: column.key, operator: draftOperator, value });\n setDraftOperator(defaultOperator);\n setAdding(false);\n }\n }}\n onRemove={() => setAdding(false)}\n />\n )}\n\n <div className=\"border-t border-lt-border pt-3\">\n <button\n type=\"button\"\n data-test={`filter-${column.key}-add`}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lt-sm bg-lt-muted px-3 py-2 text-sm font-medium hover:bg-lt-muted/70 disabled:opacity-50\"\n disabled={processing}\n onClick={() => setAdding(true)}\n >\n <Icon name=\"plus\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n {t(\"table.filter.add\", \"Add filter\")}\n </button>\n </div>\n </div>\n );\n}\n\nfunction FilterClauseRow({\n column,\n type,\n operators,\n clause,\n processing,\n onOperator,\n onValue,\n onRemove,\n}: {\n column: TableColumn;\n type: FilterType;\n operators: Op[];\n clause: FilterClause;\n processing: boolean;\n onOperator: (operator: Op) => void;\n onValue: (value: string) => void;\n onRemove: () => void;\n}) {\n const { t } = useT(\"lattice\");\n const valueless = VALUELESS_FILTER_OPERATORS.has(clause.operator);\n\n return (\n <div className=\"grid gap-2\">\n <div className=\"flex items-center gap-2\">\n {operators.length > 1 ? (\n <select\n aria-label={t(\"table.filter.operator\", \"{{label}} operator\", { label: column.label })}\n data-test={`filter-${column.key}-operator`}\n className={cn(fieldClass, \"flex-1\")}\n disabled={processing}\n value={clause.operator}\n onChange={(event) => onOperator(event.target.value as Op)}\n >\n {operators.map((operator) => (\n <option key={operator} value={operator}>\n {operatorLabel(operator)}\n </option>\n ))}\n </select>\n ) : (\n <span className=\"flex-1 text-sm font-medium\">{operatorLabel(clause.operator)}</span>\n )}\n <button\n type=\"button\"\n aria-label={t(\"table.filter.remove\", \"Remove {{label}} filter\", { label: column.label })}\n data-test={`filter-${column.key}-remove`}\n className=\"inline-flex size-lt-control-md items-center justify-center rounded-lt-sm border border-lt-border hover:bg-lt-muted disabled:opacity-50\"\n disabled={processing}\n onClick={onRemove}\n >\n <Icon name=\"trash-2\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n </button>\n </div>\n {!valueless && (\n <FilterValueInput\n type={type}\n label={column.label}\n ariaLabel={t(\"table.filter.value\", \"{{label}} filter value\", { label: column.label })}\n value={clause.value}\n processing={processing}\n onCommit={onValue}\n onClear={() => onValue(\"\")}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"column-filter-control.js","names":[],"sources":["../../../resources/js/table/components/column-filter-control.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { useState } from \"react\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@lattice-php/lattice/ui/popover\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type {\n ColumnFilterOption,\n FilterType,\n Option,\n Op,\n} from \"@lattice-php/lattice/types/generated\";\nimport { filterValue } from \"@lattice-php/lattice/table/lib/filter-values\";\nimport { operatorLabel, VALUELESS_FILTER_OPERATORS } from \"@lattice-php/lattice/table/lib/query\";\nimport type { FilterClause, FilterNode, TableColumn } from \"@lattice-php/lattice/table/types\";\nimport { TableFilterControl } from \"./filter-controls\";\nimport { fieldClass, FilterValueInput } from \"./filter-value-input\";\n\ntype ColumnClause = { clause: FilterClause; index: number };\n\nexport function ColumnFilterControl({\n column,\n clauses,\n processing,\n onAdd,\n onUpdate,\n onRemove,\n onReplace,\n onSearch,\n}: {\n column: TableColumn;\n clauses: ColumnClause[];\n processing: boolean;\n onAdd: (clause: FilterClause) => void;\n onUpdate: (index: number, clause: FilterClause) => void;\n onRemove: (index: number) => void;\n onReplace: (field: string, clauses: FilterClause[]) => void;\n onSearch?: (query: string, signal?: AbortSignal) => Promise<Option[]>;\n}) {\n const { t } = useT(\"lattice\");\n const { filter, label: rawLabel } = column.props;\n const label = rawLabel ?? column.key;\n\n if (!filter) {\n return null;\n }\n\n if (filter.control === \"filter.select\") {\n return (\n <ColumnSelectFilter\n column={column}\n clauses={clauses}\n processing={processing}\n onReplace={onReplace}\n onSearch={onSearch}\n />\n );\n }\n\n const type = filter.type ?? \"text\";\n const operators = filter.operators ?? [];\n const defaultOperator = filter.defaultOperator ?? operators[0] ?? \"eq\";\n const primary = clauses.find((entry) => entry.clause.operator === defaultOperator) ?? clauses[0];\n\n function commitPrimary(value: string): void {\n if (value === \"\") {\n if (primary) {\n onRemove(primary.index);\n }\n\n return;\n }\n\n if (primary) {\n onUpdate(primary.index, { ...primary.clause, value });\n } else {\n onAdd({ field: column.key, operator: defaultOperator, value });\n }\n }\n\n return (\n <div className=\"flex min-w-0 max-w-80 items-stretch\">\n <div className=\"min-w-0 flex-1\">\n <FilterValueInput\n type={type}\n label={label}\n value={primary?.clause.value ?? \"\"}\n processing={processing}\n withSearchIcon={type === \"text\" || type === \"number\"}\n grouped\n testId={`filter-${column.key}-value`}\n onCommit={commitPrimary}\n onClear={primary ? () => onRemove(primary.index) : undefined}\n />\n </div>\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={t(\"table.filter.columnFilters\", \"{{label}} filters\", {\n label,\n })}\n data-test={`filter-${column.key}`}\n className=\"relative -ml-px inline-flex size-lt-control-md shrink-0 items-center justify-center rounded-r-lt-sm border border-lt-input disabled:opacity-50 data-[state=open]:z-10 data-[state=open]:border-lt-primary\"\n disabled={processing}\n >\n <Icon name=\"filter\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n {clauses.length > 0 && (\n <span className=\"absolute -right-1.5 -top-1.5 inline-flex size-4 items-center justify-center rounded-full bg-lt-primary text-xs font-medium text-lt-primary-fg\">\n {clauses.length}\n </span>\n )}\n </button>\n </PopoverTrigger>\n\n <PopoverContent align=\"start\" className=\"w-80 p-4\">\n <FilterClauseList\n column={column}\n clauses={clauses}\n operators={operators}\n defaultOperator={defaultOperator}\n processing={processing}\n onAdd={onAdd}\n onUpdate={onUpdate}\n onRemove={onRemove}\n />\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n\nfunction serializeColumnValue(value: unknown): string {\n if (Array.isArray(value)) {\n return value.join(\",\");\n }\n\n return typeof value === \"string\" ? value : \"\";\n}\n\nfunction ColumnSelectFilter({\n column,\n clauses,\n processing,\n onReplace,\n onSearch,\n}: {\n column: TableColumn;\n clauses: ColumnClause[];\n processing: boolean;\n onReplace: (field: string, clauses: FilterClause[]) => void;\n onSearch?: (query: string, signal?: AbortSignal) => Promise<Option[]>;\n}) {\n const { filter, label } = column.props;\n\n if (!filter) {\n return null;\n }\n\n const multiple = filter.multiple;\n const operator = filter.defaultOperator;\n const clauseOptions = filter.clauseOptions ?? [];\n const activeClauseOption = findActiveClauseOption(\n clauses.map((entry) => entry.clause),\n clauseOptions,\n );\n const active = clauses.find((entry) => entry.clause.operator === operator) ?? clauses[0];\n const value: unknown = activeClauseOption\n ? activeClauseOption.value\n : multiple\n ? active?.clause.value\n ? active.clause.value.split(\",\")\n : []\n : (active?.clause.value ?? \"\");\n\n const data: FilterNode<\"filter.select\"> = {\n key: column.key,\n type: \"filter.select\",\n props: {\n label,\n options: filter.options,\n multiple,\n searchable: filter.searchable,\n placeholder: null,\n },\n schema: [\n {\n type: \"field.select\",\n key: column.key,\n props: {\n name: \"value\",\n label,\n options: filter.options,\n multiple,\n searchable: filter.searchable,\n placeholder: null,\n },\n },\n ],\n };\n\n function change(next: unknown): void {\n const serialized = serializeColumnValue(filterValue(next).value);\n\n if (serialized === \"\") {\n onReplace(column.key, []);\n\n return;\n }\n\n const clauseOption = clauseOptions.find((option) => option.value === serialized);\n\n if (clauseOption) {\n onReplace(column.key, clausesForOption(column.key, clauseOption));\n\n return;\n }\n\n onReplace(column.key, [{ field: column.key, operator, value: serialized }]);\n }\n\n return (\n <TableFilterControl\n filter={data}\n value={{ value }}\n processing={processing}\n onChange={change}\n onSearch={onSearch ? (_field, query, signal) => onSearch(query, signal) : undefined}\n />\n );\n}\n\nfunction clausesForOption(field: string, option: ColumnFilterOption): FilterClause[] {\n return option.clauses.map((clause) => ({\n field,\n operator: clause.operator,\n value: clause.value,\n }));\n}\n\nfunction findActiveClauseOption(\n clauses: FilterClause[],\n options: ColumnFilterOption[],\n): ColumnFilterOption | undefined {\n return options.find((option) => clausesMatch(clauses, clausesForOption(\"\", option)));\n}\n\nfunction clausesMatch(active: FilterClause[], expected: FilterClause[]): boolean {\n if (active.length !== expected.length) {\n return false;\n }\n\n return expected.every((clause) =>\n active.some(\n (current) => current.operator === clause.operator && current.value === clause.value,\n ),\n );\n}\n\nfunction FilterClauseList({\n column,\n clauses,\n operators,\n defaultOperator,\n processing,\n onAdd,\n onUpdate,\n onRemove,\n}: {\n column: TableColumn;\n clauses: ColumnClause[];\n operators: Op[];\n defaultOperator: Op;\n processing: boolean;\n onAdd: (clause: FilterClause) => void;\n onUpdate: (index: number, clause: FilterClause) => void;\n onRemove: (index: number) => void;\n}) {\n const { t } = useT(\"lattice\");\n const type = column.props.filter?.type ?? \"text\";\n const [draftOperator, setDraftOperator] = useState(defaultOperator);\n const [adding, setAdding] = useState(clauses.length === 0);\n\n return (\n <div className=\"grid gap-3\">\n {clauses.map((entry) => (\n <FilterClauseRow\n key={entry.index}\n column={column}\n type={type}\n operators={operators}\n clause={entry.clause}\n processing={processing}\n onOperator={(operator) => onUpdate(entry.index, { ...entry.clause, operator })}\n onValue={(value) =>\n value === \"\" ? onRemove(entry.index) : onUpdate(entry.index, { ...entry.clause, value })\n }\n onRemove={() => onRemove(entry.index)}\n />\n ))}\n\n {adding && (\n <FilterClauseRow\n column={column}\n type={type}\n operators={operators}\n clause={{ field: column.key, operator: draftOperator, value: \"\" }}\n processing={processing}\n onOperator={(operator) => {\n if (VALUELESS_FILTER_OPERATORS.has(operator)) {\n onAdd({ field: column.key, operator, value: \"\" });\n setDraftOperator(defaultOperator);\n setAdding(false);\n return;\n }\n setDraftOperator(operator);\n }}\n onValue={(value) => {\n if (value !== \"\") {\n onAdd({ field: column.key, operator: draftOperator, value });\n setDraftOperator(defaultOperator);\n setAdding(false);\n }\n }}\n onRemove={() => setAdding(false)}\n />\n )}\n\n <div className=\"border-t border-lt-border pt-3\">\n <button\n type=\"button\"\n data-test={`filter-${column.key}-add`}\n className=\"inline-flex w-full items-center justify-center gap-2 rounded-lt-sm bg-lt-muted px-3 py-2 text-sm font-medium hover:bg-lt-muted/70 disabled:opacity-50\"\n disabled={processing}\n onClick={() => setAdding(true)}\n >\n <Icon name=\"plus\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n {t(\"table.filter.add\", \"Add filter\")}\n </button>\n </div>\n </div>\n );\n}\n\nfunction FilterClauseRow({\n column,\n type,\n operators,\n clause,\n processing,\n onOperator,\n onValue,\n onRemove,\n}: {\n column: TableColumn;\n type: FilterType;\n operators: Op[];\n clause: FilterClause;\n processing: boolean;\n onOperator: (operator: Op) => void;\n onValue: (value: string) => void;\n onRemove: () => void;\n}) {\n const { t } = useT(\"lattice\");\n const label = column.props.label ?? column.key;\n const valueless = VALUELESS_FILTER_OPERATORS.has(clause.operator);\n\n return (\n <div className=\"grid gap-2\">\n <div className=\"flex items-center gap-2\">\n {operators.length > 1 ? (\n <select\n aria-label={t(\"table.filter.operator\", \"{{label}} operator\", { label })}\n data-test={`filter-${column.key}-operator`}\n className={cn(fieldClass, \"flex-1\")}\n disabled={processing}\n value={clause.operator}\n onChange={(event) => onOperator(event.target.value as Op)}\n >\n {operators.map((operator) => (\n <option key={operator} value={operator}>\n {operatorLabel(operator)}\n </option>\n ))}\n </select>\n ) : (\n <span className=\"flex-1 text-sm font-medium\">{operatorLabel(clause.operator)}</span>\n )}\n <button\n type=\"button\"\n aria-label={t(\"table.filter.remove\", \"Remove {{label}} filter\", { label })}\n data-test={`filter-${column.key}-remove`}\n className=\"inline-flex size-lt-control-md items-center justify-center rounded-lt-sm border border-lt-border hover:bg-lt-muted disabled:opacity-50\"\n disabled={processing}\n onClick={onRemove}\n >\n <Icon name=\"trash-2\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n </button>\n </div>\n {!valueless && (\n <FilterValueInput\n type={type}\n label={label}\n ariaLabel={t(\"table.filter.value\", \"{{label}} filter value\", { label })}\n value={clause.value}\n processing={processing}\n onCommit={onValue}\n onClear={() => onValue(\"\")}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { HTMLAttributes } from 'react';
2
- import { TableColumn, TableState } from '../types';
2
+ import { TableColumn, TableState } from '../types.js';
3
3
  export declare function ColumnHeader({ column, processing, resizeHandleProps, sort, state, }: {
4
4
  column: TableColumn;
5
5
  processing: boolean;
@@ -1,7 +1,7 @@
1
1
  import { cn } from "../../lib/utils.js";
2
2
  import { Icon } from "../../icons/sprite.js";
3
- import { alignJustify, alignText } from "../align.js";
4
- import { getColumnAriaSort, getColumnSort } from "../query.js";
3
+ import { alignJustify, alignText } from "../lib/align.js";
4
+ import { getColumnAriaSort, getColumnSort } from "../lib/query.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region resources/js/table/components/column-header.tsx
7
7
  function SortIndicator({ sort }) {
@@ -23,25 +23,25 @@ function SortIndicator({ sort }) {
23
23
  }
24
24
  function ColumnHeader({ column, processing, resizeHandleProps, sort, state }) {
25
25
  const columnSort = getColumnSort(state, column);
26
- const align = column.align;
26
+ const { align, label, sortable } = column.props;
27
27
  return /* @__PURE__ */ jsxs("div", {
28
28
  "aria-sort": getColumnAriaSort(columnSort),
29
29
  className: cn("relative min-w-0 px-4 py-3 pr-5 align-middle font-semibold text-lt-fg", alignText(align)),
30
30
  role: "columnheader",
31
- children: [column.sortable ? /* @__PURE__ */ jsxs("button", {
31
+ children: [sortable ? /* @__PURE__ */ jsxs("button", {
32
32
  type: "button",
33
- "aria-label": `Sort ${column.label}`,
33
+ "aria-label": `Sort ${label}`,
34
34
  className: cn("flex w-full items-center gap-1.5 font-semibold", alignJustify(align)),
35
35
  "data-test": `sort-${column.key}`,
36
36
  disabled: processing,
37
37
  onClick: () => sort(column),
38
38
  children: [/* @__PURE__ */ jsx("span", {
39
39
  className: cn("min-w-0 flex-1 truncate", alignText(align)),
40
- children: column.label
40
+ children: label
41
41
  }), /* @__PURE__ */ jsx(SortIndicator, { sort: columnSort })]
42
42
  }) : /* @__PURE__ */ jsx("span", {
43
43
  className: cn("block truncate", alignText(align)),
44
- children: column.label
44
+ children: label
45
45
  }), resizeHandleProps && /* @__PURE__ */ jsx("div", { ...resizeHandleProps })]
46
46
  });
47
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"column-header.js","names":[],"sources":["../../../resources/js/table/components/column-header.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { HTMLAttributes } from \"react\";\nimport { alignJustify, alignText } from \"../align\";\nimport { getColumnAriaSort, getColumnSort } from \"../query\";\nimport type { TableColumn, TableSort, TableState } from \"../types\";\n\nfunction SortIndicator({ sort }: { sort: TableSort | undefined }) {\n if (sort?.direction === \"asc\") {\n return <Icon name=\"arrow-up\" aria-hidden=\"true\" className=\"size-lt-icon-sm shrink-0\" />;\n }\n\n if (sort?.direction === \"desc\") {\n return <Icon name=\"arrow-down\" aria-hidden=\"true\" className=\"size-lt-icon-sm shrink-0\" />;\n }\n\n return (\n <Icon\n name=\"chevrons-up-down\"\n aria-hidden=\"true\"\n className=\"size-lt-icon-sm shrink-0 opacity-50\"\n />\n );\n}\n\nexport function ColumnHeader({\n column,\n processing,\n resizeHandleProps,\n sort,\n state,\n}: {\n column: TableColumn;\n processing: boolean;\n resizeHandleProps?: HTMLAttributes<HTMLDivElement>;\n sort: (column: TableColumn) => void;\n state: TableState;\n}) {\n const columnSort = getColumnSort(state, column);\n const align = column.align;\n\n return (\n <div\n aria-sort={getColumnAriaSort(columnSort)}\n className={cn(\n \"relative min-w-0 px-4 py-3 pr-5 align-middle font-semibold text-lt-fg\",\n alignText(align),\n )}\n role=\"columnheader\"\n >\n {column.sortable ? (\n <button\n type=\"button\"\n aria-label={`Sort ${column.label}`}\n className={cn(\"flex w-full items-center gap-1.5 font-semibold\", alignJustify(align))}\n data-test={`sort-${column.key}`}\n disabled={processing}\n onClick={() => sort(column)}\n >\n <span className={cn(\"min-w-0 flex-1 truncate\", alignText(align))}>{column.label}</span>\n <SortIndicator sort={columnSort} />\n </button>\n ) : (\n <span className={cn(\"block truncate\", alignText(align))}>{column.label}</span>\n )}\n {resizeHandleProps && <div {...resizeHandleProps} />}\n </div>\n );\n}\n"],"mappings":";;;;;;AAOA,SAAS,cAAc,EAAE,QAAyC;CAChE,IAAI,MAAM,cAAc,OACtB,OAAO,oBAAC,MAAD;EAAM,MAAK;EAAW,eAAY;EAAO,WAAU;CAA4B,CAAA;CAGxF,IAAI,MAAM,cAAc,QACtB,OAAO,oBAAC,MAAD;EAAM,MAAK;EAAa,eAAY;EAAO,WAAU;CAA4B,CAAA;CAG1F,OACE,oBAAC,MAAD;EACE,MAAK;EACL,eAAY;EACZ,WAAU;CACX,CAAA;AAEL;AAEA,SAAgB,aAAa,EAC3B,QACA,YACA,mBACA,MACA,SAOC;CACD,MAAM,aAAa,cAAc,OAAO,MAAM;CAC9C,MAAM,QAAQ,OAAO;CAErB,OACE,qBAAC,OAAD;EACE,aAAW,kBAAkB,UAAU;EACvC,WAAW,GACT,yEACA,UAAU,KAAK,CACjB;EACA,MAAK;YANP,CAQG,OAAO,WACN,qBAAC,UAAD;GACE,MAAK;GACL,cAAY,QAAQ,OAAO;GAC3B,WAAW,GAAG,kDAAkD,aAAa,KAAK,CAAC;GACnF,aAAW,QAAQ,OAAO;GAC1B,UAAU;GACV,eAAe,KAAK,MAAM;aAN5B,CAQE,oBAAC,QAAD;IAAM,WAAW,GAAG,2BAA2B,UAAU,KAAK,CAAC;cAAI,OAAO;GAAY,CAAA,GACtF,oBAAC,eAAD,EAAe,MAAM,WAAa,CAAA,CAC5B;OAER,oBAAC,QAAD;GAAM,WAAW,GAAG,kBAAkB,UAAU,KAAK,CAAC;aAAI,OAAO;EAAY,CAAA,GAE9E,qBAAqB,oBAAC,OAAD,EAAK,GAAI,kBAAoB,CAAA,CAChD;;AAET"}
1
+ {"version":3,"file":"column-header.js","names":[],"sources":["../../../resources/js/table/components/column-header.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { HTMLAttributes } from \"react\";\nimport { alignJustify, alignText } from \"@lattice-php/lattice/table/lib/align\";\nimport { getColumnAriaSort, getColumnSort } from \"@lattice-php/lattice/table/lib/query\";\nimport type { TableColumn, TableSort, TableState } from \"@lattice-php/lattice/table/types\";\n\nfunction SortIndicator({ sort }: { sort: TableSort | undefined }) {\n if (sort?.direction === \"asc\") {\n return <Icon name=\"arrow-up\" aria-hidden=\"true\" className=\"size-lt-icon-sm shrink-0\" />;\n }\n\n if (sort?.direction === \"desc\") {\n return <Icon name=\"arrow-down\" aria-hidden=\"true\" className=\"size-lt-icon-sm shrink-0\" />;\n }\n\n return (\n <Icon\n name=\"chevrons-up-down\"\n aria-hidden=\"true\"\n className=\"size-lt-icon-sm shrink-0 opacity-50\"\n />\n );\n}\n\nexport function ColumnHeader({\n column,\n processing,\n resizeHandleProps,\n sort,\n state,\n}: {\n column: TableColumn;\n processing: boolean;\n resizeHandleProps?: HTMLAttributes<HTMLDivElement>;\n sort: (column: TableColumn) => void;\n state: TableState;\n}) {\n const columnSort = getColumnSort(state, column);\n const { align, label, sortable } = column.props;\n\n return (\n <div\n aria-sort={getColumnAriaSort(columnSort)}\n className={cn(\n \"relative min-w-0 px-4 py-3 pr-5 align-middle font-semibold text-lt-fg\",\n alignText(align),\n )}\n role=\"columnheader\"\n >\n {sortable ? (\n <button\n type=\"button\"\n aria-label={`Sort ${label}`}\n className={cn(\"flex w-full items-center gap-1.5 font-semibold\", alignJustify(align))}\n data-test={`sort-${column.key}`}\n disabled={processing}\n onClick={() => sort(column)}\n >\n <span className={cn(\"min-w-0 flex-1 truncate\", alignText(align))}>{label}</span>\n <SortIndicator sort={columnSort} />\n </button>\n ) : (\n <span className={cn(\"block truncate\", alignText(align))}>{label}</span>\n )}\n {resizeHandleProps && <div {...resizeHandleProps} />}\n </div>\n );\n}\n"],"mappings":";;;;;;AAOA,SAAS,cAAc,EAAE,QAAyC;CAChE,IAAI,MAAM,cAAc,OACtB,OAAO,oBAAC,MAAD;EAAM,MAAK;EAAW,eAAY;EAAO,WAAU;CAA4B,CAAA;CAGxF,IAAI,MAAM,cAAc,QACtB,OAAO,oBAAC,MAAD;EAAM,MAAK;EAAa,eAAY;EAAO,WAAU;CAA4B,CAAA;CAG1F,OACE,oBAAC,MAAD;EACE,MAAK;EACL,eAAY;EACZ,WAAU;CACX,CAAA;AAEL;AAEA,SAAgB,aAAa,EAC3B,QACA,YACA,mBACA,MACA,SAOC;CACD,MAAM,aAAa,cAAc,OAAO,MAAM;CAC9C,MAAM,EAAE,OAAO,OAAO,aAAa,OAAO;CAE1C,OACE,qBAAC,OAAD;EACE,aAAW,kBAAkB,UAAU;EACvC,WAAW,GACT,yEACA,UAAU,KAAK,CACjB;EACA,MAAK;YANP,CAQG,WACC,qBAAC,UAAD;GACE,MAAK;GACL,cAAY,QAAQ;GACpB,WAAW,GAAG,kDAAkD,aAAa,KAAK,CAAC;GACnF,aAAW,QAAQ,OAAO;GAC1B,UAAU;GACV,eAAe,KAAK,MAAM;aAN5B,CAQE,oBAAC,QAAD;IAAM,WAAW,GAAG,2BAA2B,UAAU,KAAK,CAAC;cAAI;GAAY,CAAA,GAC/E,oBAAC,eAAD,EAAe,MAAM,WAAa,CAAA,CAC5B;OAER,oBAAC,QAAD;GAAM,WAAW,GAAG,kBAAkB,UAAU,KAAK,CAAC;aAAI;EAAY,CAAA,GAEvE,qBAAqB,oBAAC,OAAD,EAAK,GAAI,kBAAoB,CAAA,CAChD;;AAET"}
@@ -1,4 +1,4 @@
1
- import { ToggleableColumn } from '../../core/use-column-visibility';
1
+ import { ToggleableColumn } from '../hooks/use-column-visibility.js';
2
2
  export declare function ColumnVisibilityMenu({ columns, hasHidden, isVisible, onReset, onToggle, processing, visibleColumnCount, }: {
3
3
  columns: ToggleableColumn[];
4
4
  hasHidden: boolean;
@@ -1,7 +1,7 @@
1
1
  import { Icon } from "../../icons/sprite.js";
2
2
  import { useT } from "../../i18n/instance.js";
3
- import { Popover, PopoverContent, PopoverTrigger } from "../../core/components/popover.js";
4
- import { Checkbox } from "../../core/components/checkbox.js";
3
+ import { Popover, PopoverContent, PopoverTrigger } from "../../ui/popover.js";
4
+ import { Checkbox } from "../../ui/checkbox.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region resources/js/table/components/column-visibility-menu.tsx
7
7
  function ColumnVisibilityMenu({ columns, hasHidden, isVisible, onReset, onToggle, processing, visibleColumnCount }) {
@@ -35,7 +35,7 @@ function ColumnVisibilityMenu({ columns, hasHidden, isVisible, onReset, onToggle
35
35
  checked: visible,
36
36
  disabled: lockedLast,
37
37
  onCheckedChange: (next) => onToggle(column.key, next === true)
38
- }), /* @__PURE__ */ jsx("span", { children: column.label ?? column.key })]
38
+ }), /* @__PURE__ */ jsx("span", { children: column.props.label ?? column.key })]
39
39
  }, column.key);
40
40
  }), hasHidden && /* @__PURE__ */ jsx("button", {
41
41
  type: "button",
@@ -1 +1 @@
1
- {"version":3,"file":"column-visibility-menu.js","names":[],"sources":["../../../resources/js/table/components/column-visibility-menu.tsx"],"sourcesContent":["import { Checkbox } from \"@lattice-php/lattice/core/components/checkbox\";\nimport type { ToggleableColumn } from \"@lattice-php/lattice/core/use-column-visibility\";\nimport { Icon } from \"@lattice-php/lattice/icons\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@lattice-php/lattice/core/components/popover\";\n\nexport function ColumnVisibilityMenu({\n columns,\n hasHidden,\n isVisible,\n onReset,\n onToggle,\n processing,\n visibleColumnCount,\n}: {\n columns: ToggleableColumn[];\n hasHidden: boolean;\n isVisible: (column: ToggleableColumn) => boolean;\n onReset: () => void;\n onToggle: (key: string, visible: boolean) => void;\n processing: boolean;\n visibleColumnCount: number;\n}) {\n const { t } = useT(\"lattice\");\n const columnsLabel = t(\"table.columns.label\", \"Columns\");\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={columnsLabel}\n data-test=\"table-columns-menu\"\n className=\"relative inline-flex size-7 shrink-0 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-muted hover:text-lt-fg disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-lt-ring/50 data-[state=open]:bg-lt-muted data-[state=open]:text-lt-fg\"\n disabled={processing}\n >\n <Icon name=\"columns-3\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-64 p-4\">\n <div className=\"grid gap-3\">\n {columns.map((column) => {\n const visible = isVisible(column);\n const lockedLast = visible && visibleColumnCount <= 1;\n\n return (\n <label key={column.key} className=\"flex items-center gap-2 text-base text-lt-fg\">\n <Checkbox\n data-test={`table-column-toggle-${column.key}`}\n checked={visible}\n disabled={lockedLast}\n onCheckedChange={(next) => onToggle(column.key, next === true)}\n />\n <span>{column.label ?? column.key}</span>\n </label>\n );\n })}\n {hasHidden && (\n <button\n type=\"button\"\n data-test=\"table-columns-reset\"\n className=\"mt-1 justify-self-start text-sm text-lt-muted-fg hover:text-lt-fg\"\n onClick={onReset}\n >\n {t(\"table.columns.reset\", \"Reset\")}\n </button>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":";;;;;;AAUA,SAAgB,qBAAqB,EACnC,SACA,WACA,WACA,SACA,UACA,YACA,sBASC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAG5B,OACE,qBAAC,SAAD,EAAA,UAAA,CACE,oBAAC,gBAAD;EAAgB,SAAA;YACd,oBAAC,UAAD;GACE,MAAK;GACL,cAPa,EAAE,uBAAuB,SAO1B;GACZ,aAAU;GACV,WAAU;GACV,UAAU;aAEV,oBAAC,MAAD;IAAM,MAAK;IAAY,eAAY;IAAO,WAAU;GAAmB,CAAA;EACjE,CAAA;CACM,CAAA,GAChB,oBAAC,gBAAD;EAAgB,OAAM;EAAM,WAAU;YACpC,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,QAAQ,KAAK,WAAW;IACvB,MAAM,UAAU,UAAU,MAAM;IAChC,MAAM,aAAa,WAAW,sBAAsB;IAEpD,OACE,qBAAC,SAAD;KAAwB,WAAU;eAAlC,CACE,oBAAC,UAAD;MACE,aAAW,uBAAuB,OAAO;MACzC,SAAS;MACT,UAAU;MACV,kBAAkB,SAAS,SAAS,OAAO,KAAK,SAAS,IAAI;KAC9D,CAAA,GACD,oBAAC,QAAD,EAAA,UAAO,OAAO,SAAS,OAAO,IAAU,CAAA,CACnC;OARK,OAAO,GAQZ;GAEX,CAAC,GACA,aACC,oBAAC,UAAD;IACE,MAAK;IACL,aAAU;IACV,WAAU;IACV,SAAS;cAER,EAAE,uBAAuB,OAAO;GAC3B,CAAA,CAEP;;CACS,CAAA,CACT,EAAA,CAAA;AAEb"}
1
+ {"version":3,"file":"column-visibility-menu.js","names":[],"sources":["../../../resources/js/table/components/column-visibility-menu.tsx"],"sourcesContent":["import { Checkbox } from \"@lattice-php/lattice/ui/checkbox\";\nimport type { ToggleableColumn } from \"@lattice-php/lattice/table/hooks/use-column-visibility\";\nimport { Icon } from \"@lattice-php/lattice/icons\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@lattice-php/lattice/ui/popover\";\n\nexport function ColumnVisibilityMenu({\n columns,\n hasHidden,\n isVisible,\n onReset,\n onToggle,\n processing,\n visibleColumnCount,\n}: {\n columns: ToggleableColumn[];\n hasHidden: boolean;\n isVisible: (column: ToggleableColumn) => boolean;\n onReset: () => void;\n onToggle: (key: string, visible: boolean) => void;\n processing: boolean;\n visibleColumnCount: number;\n}) {\n const { t } = useT(\"lattice\");\n const columnsLabel = t(\"table.columns.label\", \"Columns\");\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={columnsLabel}\n data-test=\"table-columns-menu\"\n className=\"relative inline-flex size-7 shrink-0 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-muted hover:text-lt-fg disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-lt-ring/50 data-[state=open]:bg-lt-muted data-[state=open]:text-lt-fg\"\n disabled={processing}\n >\n <Icon name=\"columns-3\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-64 p-4\">\n <div className=\"grid gap-3\">\n {columns.map((column) => {\n const visible = isVisible(column);\n const lockedLast = visible && visibleColumnCount <= 1;\n\n return (\n <label key={column.key} className=\"flex items-center gap-2 text-base text-lt-fg\">\n <Checkbox\n data-test={`table-column-toggle-${column.key}`}\n checked={visible}\n disabled={lockedLast}\n onCheckedChange={(next) => onToggle(column.key, next === true)}\n />\n <span>{column.props.label ?? column.key}</span>\n </label>\n );\n })}\n {hasHidden && (\n <button\n type=\"button\"\n data-test=\"table-columns-reset\"\n className=\"mt-1 justify-self-start text-sm text-lt-muted-fg hover:text-lt-fg\"\n onClick={onReset}\n >\n {t(\"table.columns.reset\", \"Reset\")}\n </button>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":";;;;;;AAMA,SAAgB,qBAAqB,EACnC,SACA,WACA,WACA,SACA,UACA,YACA,sBASC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAG5B,OACE,qBAAC,SAAD,EAAA,UAAA,CACE,oBAAC,gBAAD;EAAgB,SAAA;YACd,oBAAC,UAAD;GACE,MAAK;GACL,cAPa,EAAE,uBAAuB,SAO1B;GACZ,aAAU;GACV,WAAU;GACV,UAAU;aAEV,oBAAC,MAAD;IAAM,MAAK;IAAY,eAAY;IAAO,WAAU;GAAmB,CAAA;EACjE,CAAA;CACM,CAAA,GAChB,oBAAC,gBAAD;EAAgB,OAAM;EAAM,WAAU;YACpC,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,QAAQ,KAAK,WAAW;IACvB,MAAM,UAAU,UAAU,MAAM;IAChC,MAAM,aAAa,WAAW,sBAAsB;IAEpD,OACE,qBAAC,SAAD;KAAwB,WAAU;eAAlC,CACE,oBAAC,UAAD;MACE,aAAW,uBAAuB,OAAO;MACzC,SAAS;MACT,UAAU;MACV,kBAAkB,SAAS,SAAS,OAAO,KAAK,SAAS,IAAI;KAC9D,CAAA,GACD,oBAAC,QAAD,EAAA,UAAO,OAAO,MAAM,SAAS,OAAO,IAAU,CAAA,CACzC;OARK,OAAO,GAQZ;GAEX,CAAC,GACA,aACC,oBAAC,UAAD;IACE,MAAK;IACL,aAAU;IACV,WAAU;IACV,SAAS;cAER,EAAE,uBAAuB,OAAO;GAC3B,CAAA,CAEP;;CACS,CAAA,CACT,EAAA,CAAA;AAEb"}
@@ -1,16 +1,18 @@
1
- import { FilterData, Option } from '../../types/generated';
2
- export declare function FilterBar({ filters, values, processing, hasActiveFilters, onChange, onReset, }: {
3
- filters: FilterData[];
4
- values: Record<string, unknown>;
1
+ import { Option } from '../../types/generated.js';
2
+ import { FilterClause, FilterNode, TableColumn, TableFilterIndicator } from '../types.js';
3
+ export declare function FilterBar({ clauses, columnsByKey, indicators, processing, onRemoveClause, onChange, onReset, }: {
4
+ clauses: FilterClause[];
5
+ columnsByKey: Map<string, TableColumn>;
6
+ indicators: TableFilterIndicator[];
5
7
  processing: boolean;
6
- hasActiveFilters: boolean;
8
+ onRemoveClause: (index: number) => void;
7
9
  onChange: (key: string, value: unknown) => void;
8
10
  onReset: () => void;
9
11
  }): import("react").JSX.Element | null;
10
12
  export declare function FilterMenu({ filters, values, processing, onChange, onSearch, }: {
11
- filters: FilterData[];
13
+ filters: FilterNode[];
12
14
  values: Record<string, unknown>;
13
15
  processing: boolean;
14
16
  onChange: (key: string, value: unknown) => void;
15
- onSearch?: (filterKey: string, query: string) => Promise<Option[]>;
17
+ onSearch?: (searchKey: string, query: string, signal?: AbortSignal) => Promise<Option[]>;
16
18
  }): import("react").JSX.Element;