@lattice-php/lattice 0.17.1 → 0.18.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 (760) hide show
  1. package/dist/action/components/action-form.d.ts +2 -2
  2. package/dist/action/components/action-form.js +11 -11
  3. package/dist/action/components/action-form.js.map +1 -1
  4. package/dist/action/components/action-group.d.ts +1 -1
  5. package/dist/action/components/action-group.js +6 -4
  6. package/dist/action/components/action-group.js.map +1 -1
  7. package/dist/action/components/action-trigger-provider.d.ts +10 -0
  8. package/dist/action/components/action-trigger-provider.js +24 -0
  9. package/dist/action/components/action-trigger-provider.js.map +1 -0
  10. package/dist/action/components/action.d.ts +1 -1
  11. package/dist/action/components/action.js +4 -4
  12. package/dist/action/components/action.js.map +1 -1
  13. package/dist/action/{use-action.d.ts → hooks/use-action.d.ts} +1 -1
  14. package/dist/action/{use-action.js → hooks/use-action.js} +7 -7
  15. package/dist/action/hooks/use-action.js.map +1 -0
  16. package/dist/action/hooks/use-click-behavior.d.ts +3 -0
  17. package/dist/action/hooks/use-click-behavior.js +3 -0
  18. package/dist/action/index.d.ts +10 -1
  19. package/dist/action/index.js +8 -13
  20. package/dist/action/{run-action.d.ts → lib/run-action.d.ts} +1 -1
  21. package/dist/action/{run-action.js → lib/run-action.js} +2 -2
  22. package/dist/action/lib/run-action.js.map +1 -0
  23. package/dist/action/plugin.d.ts +1 -0
  24. package/dist/action/plugin.js +15 -0
  25. package/dist/action/plugin.js.map +1 -0
  26. package/dist/appearance/index.d.ts +4 -1
  27. package/dist/appearance/index.js +11 -2
  28. package/dist/appearance/index.js.map +1 -1
  29. package/dist/chat/components/chat-box.d.ts +1 -1
  30. package/dist/chat/components/chat-box.js +2 -2
  31. package/dist/chat/components/chat-box.js.map +1 -1
  32. package/dist/chat/components/message-list.d.ts +1 -1
  33. package/dist/chat/components/message-list.js.map +1 -1
  34. package/dist/chat/components/message.d.ts +1 -1
  35. package/dist/chat/components/message.js.map +1 -1
  36. package/dist/chat/components/prompt-input.js +1 -1
  37. package/dist/chat/components/prompt-input.js.map +1 -1
  38. package/dist/chat/{use-chat.d.ts → hooks/use-chat.d.ts} +1 -1
  39. package/dist/chat/{use-chat.js → hooks/use-chat.js} +2 -2
  40. package/dist/chat/hooks/use-chat.js.map +1 -0
  41. package/dist/chat/index.d.ts +4 -1
  42. package/dist/chat/index.js +3 -17
  43. package/dist/chat/{transport.d.ts → lib/transport.d.ts} +2 -2
  44. package/dist/chat/{transport.js → lib/transport.js} +2 -2
  45. package/dist/chat/lib/transport.js.map +1 -0
  46. package/dist/chat/parts/text.d.ts +1 -1
  47. package/dist/chat/parts/tool-call.d.ts +1 -1
  48. package/dist/chat/plugin.d.ts +2 -0
  49. package/dist/chat/plugin.js +17 -0
  50. package/dist/chat/plugin.js.map +1 -0
  51. package/dist/chat/types.d.ts +2 -2
  52. package/dist/clipboard/index.d.ts +1 -2
  53. package/dist/clipboard/index.js +1 -10
  54. package/dist/clipboard/index.js.map +1 -1
  55. package/dist/core/api.d.ts +1 -1
  56. package/dist/core/api.js.map +1 -1
  57. package/dist/core/headers.js.map +1 -1
  58. package/dist/core/{column-sizing.d.ts → hooks/column-sizing.d.ts} +2 -2
  59. package/dist/core/{column-sizing.js → hooks/column-sizing.js} +1 -1
  60. package/dist/core/hooks/column-sizing.js.map +1 -0
  61. package/dist/core/{use-column-resizing.d.ts → hooks/use-column-resizing.d.ts} +2 -1
  62. package/dist/core/{use-column-resizing.js → hooks/use-column-resizing.js} +59 -31
  63. package/dist/core/hooks/use-column-resizing.js.map +1 -0
  64. package/dist/core/index.d.ts +13 -0
  65. package/dist/core/index.js +10 -0
  66. package/dist/core/materialize.d.ts +9 -0
  67. package/dist/core/materialize.js +39 -0
  68. package/dist/core/materialize.js.map +1 -0
  69. package/dist/core/nodes.d.ts +1 -1
  70. package/dist/core/registry-context.d.ts +3 -3
  71. package/dist/core/registry-context.js.map +1 -1
  72. package/dist/core/registry.d.ts +5 -3
  73. package/dist/core/registry.js.map +1 -1
  74. package/dist/core/renderer.d.ts +1 -1
  75. package/dist/core/renderer.js +3 -3
  76. package/dist/core/renderer.js.map +1 -1
  77. package/dist/core/test-id.d.ts +1 -1
  78. package/dist/core/types.d.ts +1 -1
  79. package/dist/create-app.d.ts +3 -3
  80. package/dist/create-app.js +3 -3
  81. package/dist/create-app.js.map +1 -1
  82. package/dist/effects/dispatch.d.ts +2 -2
  83. package/dist/effects/registry.d.ts +4 -3
  84. package/dist/effects/registry.js +7 -7
  85. package/dist/effects/registry.js.map +1 -1
  86. package/dist/effects/use-effect-dispatcher.d.ts +1 -1
  87. package/dist/{events/event-bridge.d.ts → event-bridge.d.ts} +2 -3
  88. package/dist/{events/event-bridge.js → event-bridge.js} +4 -11
  89. package/dist/event-bridge.js.map +1 -0
  90. package/dist/form/components/base/field.d.ts +1 -1
  91. package/dist/form/components/base/field.js +5 -5
  92. package/dist/form/components/base/field.js.map +1 -1
  93. package/dist/form/components/base/submit-button.d.ts +1 -1
  94. package/dist/form/components/base/submit-button.js +3 -3
  95. package/dist/form/components/base/submit-button.js.map +1 -1
  96. package/dist/form/components/fields/{block-add-menu.d.ts → add-row-menu.d.ts} +3 -3
  97. package/dist/form/components/fields/{block-add-menu.js → add-row-menu.js} +10 -10
  98. package/dist/form/components/fields/add-row-menu.js.map +1 -0
  99. package/dist/form/components/fields/builder.d.ts +1 -1
  100. package/dist/form/components/fields/builder.js +80 -75
  101. package/dist/form/components/fields/builder.js.map +1 -1
  102. package/dist/form/components/fields/checkbox.d.ts +1 -1
  103. package/dist/form/components/fields/checkbox.js +12 -9
  104. package/dist/form/components/fields/checkbox.js.map +1 -1
  105. package/dist/form/components/fields/choice.d.ts +1 -1
  106. package/dist/form/components/fields/choice.js +4 -4
  107. package/dist/form/components/fields/choice.js.map +1 -1
  108. package/dist/form/components/fields/date-input.d.ts +1 -1
  109. package/dist/form/components/fields/date-input.js +2 -2
  110. package/dist/form/components/fields/date-input.js.map +1 -1
  111. package/dist/form/components/fields/{date-picker-control.d.ts → date-picker-field.d.ts} +2 -2
  112. package/dist/form/components/fields/{date-picker-control.js → date-picker-field.js} +6 -6
  113. package/dist/form/components/fields/date-picker-field.js.map +1 -0
  114. package/dist/form/components/fields/date-picker.d.ts +2 -0
  115. package/dist/form/components/fields/date-picker.js +17 -0
  116. package/dist/form/components/fields/date-picker.js.map +1 -0
  117. package/dist/form/components/fields/date-time-input.d.ts +1 -1
  118. package/dist/form/components/fields/date-time-input.js +2 -2
  119. package/dist/form/components/fields/date-time-input.js.map +1 -1
  120. package/dist/form/components/fields/file-upload.d.ts +1 -1
  121. package/dist/form/components/fields/file-upload.js +4 -4
  122. package/dist/form/components/fields/file-upload.js.map +1 -1
  123. package/dist/form/components/fields/hidden-input.d.ts +1 -1
  124. package/dist/form/components/fields/hidden-input.js +1 -1
  125. package/dist/form/components/fields/hidden-input.js.map +1 -1
  126. package/dist/form/components/fields/number-input.d.ts +1 -1
  127. package/dist/form/components/fields/number-input.js +2 -2
  128. package/dist/form/components/fields/number-input.js.map +1 -1
  129. package/dist/form/components/fields/otp-input.d.ts +1 -1
  130. package/dist/form/components/fields/otp-input.js +1 -1
  131. package/dist/form/components/fields/otp-input.js.map +1 -1
  132. package/dist/form/components/fields/password-input.d.ts +1 -1
  133. package/dist/form/components/fields/password-input.js +6 -6
  134. package/dist/form/components/fields/password-input.js.map +1 -1
  135. package/dist/form/components/fields/repeater-rows.d.ts +6 -1
  136. package/dist/form/components/fields/repeater-rows.js +9 -5
  137. package/dist/form/components/fields/repeater-rows.js.map +1 -1
  138. package/dist/form/components/fields/repeater.d.ts +1 -1
  139. package/dist/form/components/fields/repeater.js +57 -48
  140. package/dist/form/components/fields/repeater.js.map +1 -1
  141. package/dist/form/components/fields/rich-editor-field.d.ts +3 -0
  142. package/dist/form/components/fields/rich-editor-field.js +340 -0
  143. package/dist/form/components/fields/rich-editor-field.js.map +1 -0
  144. package/dist/form/components/fields/rich-editor.d.ts +1 -1
  145. package/dist/form/components/fields/rich-editor.js +10 -335
  146. package/dist/form/components/fields/rich-editor.js.map +1 -1
  147. package/dist/form/components/fields/row-action-menu.d.ts +2 -2
  148. package/dist/form/components/fields/row-actions.js +1 -1
  149. package/dist/form/components/fields/row-actions.js.map +1 -1
  150. package/dist/form/components/fields/row-item.d.ts +3 -3
  151. package/dist/form/components/fields/row-item.js +1 -1
  152. package/dist/form/components/fields/row-item.js.map +1 -1
  153. package/dist/form/components/fields/row-key-inputs.d.ts +7 -0
  154. package/dist/form/components/fields/row-key-inputs.js +16 -0
  155. package/dist/form/components/fields/row-key-inputs.js.map +1 -0
  156. package/dist/form/components/fields/row-templates.d.ts +9 -0
  157. package/dist/form/components/fields/row-templates.js +14 -0
  158. package/dist/form/components/fields/row-templates.js.map +1 -0
  159. package/dist/form/components/fields/select.d.ts +1 -1
  160. package/dist/form/components/fields/select.js +23 -13
  161. package/dist/form/components/fields/select.js.map +1 -1
  162. package/dist/form/components/fields/simple-field.d.ts +2 -2
  163. package/dist/form/components/fields/simple-field.js +2 -2
  164. package/dist/form/components/fields/simple-field.js.map +1 -1
  165. package/dist/form/components/fields/table-rows.d.ts +3 -3
  166. package/dist/form/components/fields/table-rows.js +10 -11
  167. package/dist/form/components/fields/table-rows.js.map +1 -1
  168. package/dist/form/components/fields/text-input.d.ts +1 -1
  169. package/dist/form/components/fields/text-input.js +2 -2
  170. package/dist/form/components/fields/text-input.js.map +1 -1
  171. package/dist/form/components/fields/textarea.d.ts +1 -1
  172. package/dist/form/components/fields/textarea.js +1 -1
  173. package/dist/form/components/fields/textarea.js.map +1 -1
  174. package/dist/form/components/fields/time-input.d.ts +1 -1
  175. package/dist/form/components/fields/time-input.js +3 -3
  176. package/dist/form/components/fields/time-input.js.map +1 -1
  177. package/dist/form/components/fields/time-picker.d.ts +1 -1
  178. package/dist/form/components/fields/toggle.d.ts +1 -1
  179. package/dist/form/components/fields/toggle.js +10 -9
  180. package/dist/form/components/fields/toggle.js.map +1 -1
  181. package/dist/form/components/fields/use-row-collection.d.ts +1 -1
  182. package/dist/form/components/fields/use-row-collection.js +2 -2
  183. package/dist/form/components/fields/use-row-collection.js.map +1 -1
  184. package/dist/form/components/form.d.ts +1 -1
  185. package/dist/form/components/form.js +6 -6
  186. package/dist/form/components/form.js.map +1 -1
  187. package/dist/form/components/index.d.ts +17 -17
  188. package/dist/form/embed.d.ts +17 -0
  189. package/dist/form/embed.js +10 -0
  190. package/dist/form/{components → hooks}/context.d.ts +3 -0
  191. package/dist/form/{components → hooks}/context.js +2 -1
  192. package/dist/form/hooks/context.js.map +1 -0
  193. package/dist/form/{components → hooks}/field-scope.js +3 -3
  194. package/dist/form/hooks/field-scope.js.map +1 -0
  195. package/dist/form/{components → hooks}/prefill-context.js +1 -1
  196. package/dist/form/hooks/prefill-context.js.map +1 -0
  197. package/dist/form/{components → hooks}/resolved-nodes.d.ts +1 -1
  198. package/dist/form/{components → hooks}/resolved-nodes.js +2 -2
  199. package/dist/form/hooks/resolved-nodes.js.map +1 -0
  200. package/dist/form/{components → hooks}/row-layout-context.js +1 -1
  201. package/dist/form/hooks/row-layout-context.js.map +1 -0
  202. package/dist/form/{components → hooks}/use-controlled-field.d.ts +2 -2
  203. package/dist/form/{components → hooks}/use-controlled-field.js +6 -5
  204. package/dist/form/hooks/use-controlled-field.js.map +1 -0
  205. package/dist/form/hooks/use-dependent-field.d.ts +3 -0
  206. package/dist/form/{components → hooks}/use-dependent-field.js +6 -6
  207. package/dist/form/hooks/use-dependent-field.js.map +1 -0
  208. package/dist/form/{components → hooks}/use-field-commit.d.ts +5 -0
  209. package/dist/form/{components → hooks}/use-field-commit.js +9 -2
  210. package/dist/form/hooks/use-field-commit.js.map +1 -0
  211. package/dist/form/{components → hooks}/use-form-resolver.d.ts +2 -2
  212. package/dist/form/{components → hooks}/use-form-resolver.js +5 -5
  213. package/dist/form/hooks/use-form-resolver.js.map +1 -0
  214. package/dist/form/{components → hooks}/use-seed-default.js +1 -1
  215. package/dist/form/hooks/use-seed-default.js.map +1 -0
  216. package/dist/form/{components → hooks}/values.d.ts +3 -1
  217. package/dist/form/hooks/values.js +136 -0
  218. package/dist/form/hooks/values.js.map +1 -0
  219. package/dist/form/index.d.ts +4 -1
  220. package/dist/form/index.js +20 -39
  221. package/dist/form/{components → lib}/conditions.d.ts +2 -1
  222. package/dist/form/{components → lib}/conditions.js +12 -2
  223. package/dist/form/lib/conditions.js.map +1 -0
  224. package/dist/form/lib/field-dom-name.d.ts +1 -0
  225. package/dist/form/lib/field-dom-name.js +10 -0
  226. package/dist/form/lib/field-dom-name.js.map +1 -0
  227. package/dist/form/{components → lib}/field-props.d.ts +2 -3
  228. package/dist/form/{components → lib}/field-props.js +1 -1
  229. package/dist/form/lib/field-props.js.map +1 -0
  230. package/dist/form/{components → lib}/form-path.js +1 -1
  231. package/dist/form/lib/form-path.js.map +1 -0
  232. package/dist/form/{components → lib}/form-transport.d.ts +1 -1
  233. package/dist/form/lib/form-transport.js +21 -0
  234. package/dist/form/lib/form-transport.js.map +1 -0
  235. package/dist/form/lib/override-keys.js +12 -0
  236. package/dist/form/lib/override-keys.js.map +1 -0
  237. package/dist/form/{components → lib}/prefill-targets.d.ts +2 -2
  238. package/dist/form/{components → lib}/prefill-targets.js +4 -5
  239. package/dist/form/lib/prefill-targets.js.map +1 -0
  240. package/dist/form/plugin.d.ts +1 -0
  241. package/dist/form/{eager.js → plugin.js} +4 -4
  242. package/dist/form/plugin.js.map +1 -0
  243. package/dist/form/toolkit.d.ts +17 -0
  244. package/dist/form/toolkit.js +14 -0
  245. package/dist/form/{components/types.d.ts → types.d.ts} +3 -3
  246. package/dist/format/number.d.ts +1 -1
  247. package/dist/format/value.d.ts +1 -1
  248. package/dist/i18n/backend.d.ts +1 -1
  249. package/dist/i18n/config.d.ts +1 -1
  250. package/dist/i18n/index.d.ts +13 -13
  251. package/dist/i18n/locale-reload.js +1 -1
  252. package/dist/i18n/locale-reload.js.map +1 -1
  253. package/dist/i18n/locale.js.map +1 -1
  254. package/dist/i18n/page-props.d.ts +1 -1
  255. package/dist/i18n/timezone.js.map +1 -1
  256. package/dist/i18n/translatable.d.ts +1 -1
  257. package/dist/icons/icon-renderer.js.map +1 -1
  258. package/dist/icons/index.d.ts +4 -4
  259. package/dist/icons/sprite.js.map +1 -1
  260. package/dist/index.d.ts +37 -38
  261. package/dist/index.js +13 -12
  262. package/dist/inertia.js +1 -1
  263. package/dist/layout/{breadcrumbs.d.ts → components/breadcrumbs.d.ts} +1 -1
  264. package/dist/layout/{breadcrumbs.js → components/breadcrumbs.js} +2 -2
  265. package/dist/layout/components/breadcrumbs.js.map +1 -0
  266. package/dist/layout/{callouts.d.ts → components/callouts.d.ts} +1 -1
  267. package/dist/layout/{callouts.js → components/callouts.js} +7 -7
  268. package/dist/layout/components/callouts.js.map +1 -0
  269. package/dist/layout/{dropdown.d.ts → components/dropdown.d.ts} +1 -1
  270. package/dist/layout/{dropdown.js → components/dropdown.js} +2 -2
  271. package/dist/layout/components/dropdown.js.map +1 -0
  272. package/dist/layout/{menu-item.d.ts → components/menu-item.d.ts} +1 -1
  273. package/dist/layout/{menu-item.js → components/menu-item.js} +9 -8
  274. package/dist/layout/components/menu-item.js.map +1 -0
  275. package/dist/layout/{menu.d.ts → components/menu.d.ts} +1 -1
  276. package/dist/layout/{menu.js → components/menu.js} +2 -2
  277. package/dist/layout/components/menu.js.map +1 -0
  278. package/dist/layout/{outlet.d.ts → components/outlet.d.ts} +1 -1
  279. package/dist/layout/{outlet.js → components/outlet.js} +2 -2
  280. package/dist/layout/components/outlet.js.map +1 -0
  281. package/dist/layout/{popover.js → components/popover.js} +4 -4
  282. package/dist/layout/components/popover.js.map +1 -0
  283. package/dist/layout/{schema-layout.js → components/schema-layout.js} +3 -3
  284. package/dist/layout/components/schema-layout.js.map +1 -0
  285. package/dist/layout/{sidebar.d.ts → components/sidebar.d.ts} +1 -1
  286. package/dist/layout/{sidebar.js → components/sidebar.js} +5 -5
  287. package/dist/layout/components/sidebar.js.map +1 -0
  288. package/dist/layout/{topbar.d.ts → components/topbar.d.ts} +1 -1
  289. package/dist/layout/{topbar.js → components/topbar.js} +3 -3
  290. package/dist/layout/components/topbar.js.map +1 -0
  291. package/dist/layout/{context.d.ts → hooks/context.d.ts} +1 -1
  292. package/dist/layout/{context.js → hooks/context.js} +2 -2
  293. package/dist/layout/hooks/context.js.map +1 -0
  294. package/dist/layout/index.d.ts +4 -4
  295. package/dist/layout/index.js +4 -4
  296. package/dist/layout/plugin.d.ts +2 -0
  297. package/dist/layout/{components.js → plugin.js} +10 -10
  298. package/dist/layout/plugin.js.map +1 -0
  299. package/dist/notifications/api.d.ts +1 -1
  300. package/dist/notifications/components/notification-item.d.ts +1 -1
  301. package/dist/notifications/components/notification-item.js.map +1 -1
  302. package/dist/notifications/components/notification-list.d.ts +2 -2
  303. package/dist/notifications/components/notification-list.js +1 -1
  304. package/dist/notifications/components/notification-list.js.map +1 -1
  305. package/dist/notifications/components/notifications-echo.d.ts +1 -1
  306. package/dist/notifications/components/notifications-echo.js.map +1 -1
  307. package/dist/notifications/components/notifications.d.ts +1 -1
  308. package/dist/notifications/components/notifications.js +3 -3
  309. package/dist/notifications/components/notifications.js.map +1 -1
  310. package/dist/notifications/index.d.ts +2 -1
  311. package/dist/notifications/index.js +2 -11
  312. package/dist/notifications/plugin.d.ts +2 -0
  313. package/dist/notifications/plugin.js +11 -0
  314. package/dist/notifications/plugin.js.map +1 -0
  315. package/dist/notifications/store.d.ts +1 -1
  316. package/dist/notifications/types.d.ts +1 -1
  317. package/dist/page.d.ts +1 -1
  318. package/dist/provider-base.d.ts +2 -2
  319. package/dist/provider-base.js +5 -4
  320. package/dist/provider-base.js.map +1 -1
  321. package/dist/provider.d.ts +3 -3
  322. package/dist/provider.js +4 -4
  323. package/dist/provider.js.map +1 -1
  324. package/dist/realtime/build-effects.d.ts +2 -2
  325. package/dist/realtime/listeners.d.ts +1 -1
  326. package/dist/realtime/subscriptions.d.ts +1 -1
  327. package/dist/registry.d.ts +1 -1
  328. package/dist/registry.js +15 -2
  329. package/dist/registry.js.map +1 -0
  330. package/dist/remote/components/data-list.d.ts +2 -2
  331. package/dist/remote/components/data-list.js +1 -34
  332. package/dist/remote/components/data-list.js.map +1 -1
  333. package/dist/remote/index.d.ts +1 -1
  334. package/dist/remote/index.js +1 -10
  335. package/dist/remote/plugin.d.ts +2 -0
  336. package/dist/remote/plugin.js +11 -0
  337. package/dist/remote/plugin.js.map +1 -0
  338. package/dist/table/components/bulk-bar.d.ts +1 -1
  339. package/dist/table/components/bulk-bar.js +4 -4
  340. package/dist/table/components/bulk-bar.js.map +1 -1
  341. package/dist/table/components/cells/badge-cell.d.ts +1 -1
  342. package/dist/table/components/cells/badge-cell.js +1 -1
  343. package/dist/table/components/cells/badge-cell.js.map +1 -1
  344. package/dist/table/components/cells/boolean-cell.d.ts +1 -1
  345. package/dist/table/components/cells/boolean-cell.js.map +1 -1
  346. package/dist/table/components/cells/icon-cell.d.ts +1 -1
  347. package/dist/table/components/cells/icon-cell.js.map +1 -1
  348. package/dist/table/components/cells/image-cell.d.ts +1 -1
  349. package/dist/table/components/cells/image-cell.js +1 -1
  350. package/dist/table/components/cells/image-cell.js.map +1 -1
  351. package/dist/table/components/cells/money-cell.d.ts +1 -1
  352. package/dist/table/components/cells/money-cell.js +1 -1
  353. package/dist/table/components/cells/money-cell.js.map +1 -1
  354. package/dist/table/components/cells/number-cell.d.ts +1 -1
  355. package/dist/table/components/cells/number-cell.js +1 -1
  356. package/dist/table/components/cells/number-cell.js.map +1 -1
  357. package/dist/table/components/cells/stack-cell.d.ts +1 -1
  358. package/dist/table/components/cells/stack-cell.js +3 -7
  359. package/dist/table/components/cells/stack-cell.js.map +1 -1
  360. package/dist/table/components/cells/text-cell.d.ts +1 -1
  361. package/dist/table/components/cells/text-cell.js +4 -4
  362. package/dist/table/components/cells/text-cell.js.map +1 -1
  363. package/dist/table/components/column-filter-control.d.ts +3 -3
  364. package/dist/table/components/column-filter-control.js +34 -19
  365. package/dist/table/components/column-filter-control.js.map +1 -1
  366. package/dist/table/components/column-header.d.ts +1 -1
  367. package/dist/table/components/column-header.js +7 -7
  368. package/dist/table/components/column-header.js.map +1 -1
  369. package/dist/table/components/column-visibility-menu.d.ts +1 -1
  370. package/dist/table/components/column-visibility-menu.js +3 -3
  371. package/dist/table/components/column-visibility-menu.js.map +1 -1
  372. package/dist/table/components/filter-bar.d.ts +9 -7
  373. package/dist/table/components/filter-bar.js +62 -52
  374. package/dist/table/components/filter-bar.js.map +1 -1
  375. package/dist/table/components/filter-controls.d.ts +5 -9
  376. package/dist/table/components/filter-controls.js +96 -224
  377. package/dist/table/components/filter-controls.js.map +1 -1
  378. package/dist/table/components/filter-value-input.d.ts +1 -1
  379. package/dist/table/components/filter-value-input.js +1 -1
  380. package/dist/table/components/filter-value-input.js.map +1 -1
  381. package/dist/table/components/pagination.d.ts +2 -2
  382. package/dist/table/components/pagination.js.map +1 -1
  383. package/dist/table/components/sort-bar.d.ts +1 -1
  384. package/dist/table/components/sort-bar.js +2 -2
  385. package/dist/table/components/sort-bar.js.map +1 -1
  386. package/dist/table/components/table-action-node.d.ts +1 -1
  387. package/dist/table/components/table-action-node.js +1 -1
  388. package/dist/table/components/table-action-node.js.map +1 -1
  389. package/dist/table/components/table-cell.d.ts +1 -1
  390. package/dist/table/components/table-cell.js +2 -2
  391. package/dist/table/components/table-cell.js.map +1 -1
  392. package/dist/table/components/table.d.ts +1 -1
  393. package/dist/table/components/table.js +23 -31
  394. package/dist/table/components/table.js.map +1 -1
  395. package/dist/{core → table/hooks}/use-column-visibility.d.ts +5 -3
  396. package/dist/{core → table/hooks}/use-column-visibility.js +4 -4
  397. package/dist/table/hooks/use-column-visibility.js.map +1 -0
  398. package/dist/table/{use-table-selection.js → hooks/use-table-selection.js} +1 -1
  399. package/dist/table/hooks/use-table-selection.js.map +1 -0
  400. package/dist/table/{use-table.d.ts → hooks/use-table.d.ts} +7 -7
  401. package/dist/table/{use-table.js → hooks/use-table.js} +12 -9
  402. package/dist/table/hooks/use-table.js.map +1 -0
  403. package/dist/table/index.d.ts +6 -1
  404. package/dist/table/index.js +5 -10
  405. package/dist/table/{align.d.ts → lib/align.d.ts} +1 -1
  406. package/dist/table/{align.js → lib/align.js} +1 -1
  407. package/dist/table/lib/align.js.map +1 -0
  408. package/dist/table/{bulk.d.ts → lib/bulk.d.ts} +3 -3
  409. package/dist/table/{bulk.js → lib/bulk.js} +1 -1
  410. package/dist/table/lib/bulk.js.map +1 -0
  411. package/dist/table/{filter-values.d.ts → lib/filter-values.d.ts} +10 -3
  412. package/dist/table/{filter-values.js → lib/filter-values.js} +14 -4
  413. package/dist/table/lib/filter-values.js.map +1 -0
  414. package/dist/table/{format.d.ts → lib/format.d.ts} +2 -2
  415. package/dist/table/{format.js → lib/format.js} +3 -3
  416. package/dist/table/lib/format.js.map +1 -0
  417. package/dist/table/{payload.d.ts → lib/payload.d.ts} +2 -3
  418. package/dist/table/{payload.js → lib/payload.js} +12 -9
  419. package/dist/table/lib/payload.js.map +1 -0
  420. package/dist/table/{query.d.ts → lib/query.d.ts} +3 -3
  421. package/dist/table/{query.js → lib/query.js} +27 -27
  422. package/dist/table/lib/query.js.map +1 -0
  423. package/dist/table/plugin.d.ts +2 -0
  424. package/dist/table/{eager.js → plugin.js} +4 -4
  425. package/dist/table/plugin.js.map +1 -0
  426. package/dist/table/registry.d.ts +3 -1
  427. package/dist/table/registry.js.map +1 -1
  428. package/dist/table/types.d.ts +57 -7
  429. package/dist/toast/callout.d.ts +1 -1
  430. package/dist/toast/callout.js.map +1 -1
  431. package/dist/toast/index.d.ts +6 -5
  432. package/dist/toast/index.js +2 -1
  433. package/dist/toast/toast.d.ts +1 -1
  434. package/dist/toast/toaster.js.map +1 -1
  435. package/dist/toast/variant-styles.d.ts +1 -1
  436. package/dist/types/generated.d.ts +118 -64
  437. package/dist/types/index.d.ts +1 -1
  438. package/dist/{action/components → ui}/action-menu-context.js +1 -1
  439. package/dist/ui/action-menu-context.js.map +1 -0
  440. package/dist/{form/components/base → ui}/affix-group.d.ts +1 -1
  441. package/dist/{form/components/base → ui}/affix-group.js +3 -3
  442. package/dist/ui/affix-group.js.map +1 -0
  443. package/dist/{core/components → ui}/badge.d.ts +1 -1
  444. package/dist/{core/components → ui}/badge.js +2 -2
  445. package/dist/ui/badge.js.map +1 -0
  446. package/dist/{core/components → ui}/button.d.ts +2 -2
  447. package/dist/{core/components → ui}/button.js +5 -5
  448. package/dist/ui/button.js.map +1 -0
  449. package/dist/{core/components → ui}/card.d.ts +1 -1
  450. package/dist/{core/components → ui}/card.js +3 -3
  451. package/dist/ui/card.js.map +1 -0
  452. package/dist/ui/chart-view.d.ts +3 -0
  453. package/dist/{core/components/chart.js → ui/chart-view.js} +8 -8
  454. package/dist/ui/chart-view.js.map +1 -0
  455. package/dist/{core/components → ui}/chart.d.ts +1 -1
  456. package/dist/ui/chart.js +15 -0
  457. package/dist/ui/chart.js.map +1 -0
  458. package/dist/{core/components → ui}/checkbox.js +3 -3
  459. package/dist/ui/checkbox.js.map +1 -0
  460. package/dist/{core/use-click-behavior.d.ts → ui/click-behavior.d.ts} +17 -19
  461. package/dist/ui/click-behavior.js +46 -0
  462. package/dist/ui/click-behavior.js.map +1 -0
  463. package/dist/{core/components → ui}/collapsible.d.ts +1 -1
  464. package/dist/{core/components → ui}/collapsible.js +6 -6
  465. package/dist/ui/collapsible.js.map +1 -0
  466. package/dist/{core/components → ui}/combobox.d.ts +1 -1
  467. package/dist/{core/components → ui}/combobox.js +4 -4
  468. package/dist/ui/combobox.js.map +1 -0
  469. package/dist/{core/components → ui}/confirm-dialog.d.ts +1 -1
  470. package/dist/{core/components → ui}/confirm-dialog.js +1 -1
  471. package/dist/ui/confirm-dialog.js.map +1 -0
  472. package/dist/{core/components → ui}/control.d.ts +1 -1
  473. package/dist/{core/components → ui}/control.js +1 -1
  474. package/dist/ui/control.js.map +1 -0
  475. package/dist/{clipboard → ui}/copyable-text.d.ts +1 -0
  476. package/dist/{clipboard → ui}/copyable-text.js +11 -3
  477. package/dist/ui/copyable-text.js.map +1 -0
  478. package/dist/{core/components → ui}/dialog.js +3 -3
  479. package/dist/ui/dialog.js.map +1 -0
  480. package/dist/{core/components → ui}/dropdown-menu.d.ts +1 -1
  481. package/dist/{core/components → ui}/dropdown-menu.js +3 -3
  482. package/dist/ui/dropdown-menu.js.map +1 -0
  483. package/dist/{core/components → ui}/floating-panel.d.ts +1 -1
  484. package/dist/{core/components → ui}/floating-panel.js +4 -4
  485. package/dist/ui/floating-panel.js.map +1 -0
  486. package/dist/{core/components → ui}/fragment.d.ts +1 -1
  487. package/dist/{core/components → ui}/fragment.js +5 -5
  488. package/dist/ui/fragment.js.map +1 -0
  489. package/dist/{core/components → ui}/grid.d.ts +1 -1
  490. package/dist/{core/components → ui}/grid.js +3 -3
  491. package/dist/ui/grid.js.map +1 -0
  492. package/dist/{core/components → ui}/heading.d.ts +1 -1
  493. package/dist/{core/components → ui}/heading.js +2 -2
  494. package/dist/ui/heading.js.map +1 -0
  495. package/dist/{core/components → ui}/icon.d.ts +1 -1
  496. package/dist/{core/components → ui}/icon.js +3 -3
  497. package/dist/ui/icon.js.map +1 -0
  498. package/dist/ui/index.d.ts +27 -0
  499. package/dist/ui/index.js +26 -0
  500. package/dist/{core/components → ui}/info-tooltip.js +3 -3
  501. package/dist/ui/info-tooltip.js.map +1 -0
  502. package/dist/{form/components/base → ui}/input-error.js +2 -2
  503. package/dist/ui/input-error.js.map +1 -0
  504. package/dist/{form/components/base → ui}/input-otp.js +2 -2
  505. package/dist/ui/input-otp.js.map +1 -0
  506. package/dist/{form/components/base → ui}/input.js +3 -3
  507. package/dist/ui/input.js.map +1 -0
  508. package/dist/{form/components/base → ui}/label.js +2 -2
  509. package/dist/ui/label.js.map +1 -0
  510. package/dist/{core/components → ui}/link.d.ts +1 -1
  511. package/dist/{core/components → ui}/link.js +8 -7
  512. package/dist/ui/link.js.map +1 -0
  513. package/dist/{core/components → ui}/modal.d.ts +1 -1
  514. package/dist/{core/components → ui}/modal.js +2 -2
  515. package/dist/ui/modal.js.map +1 -0
  516. package/dist/{form/components/base → ui}/password-input.js +3 -3
  517. package/dist/ui/password-input.js.map +1 -0
  518. package/dist/ui/plugin.d.ts +1 -0
  519. package/dist/{core/components/eager.js → ui/plugin.js} +7 -7
  520. package/dist/ui/plugin.js.map +1 -0
  521. package/dist/{core/components → ui}/popover.js +2 -2
  522. package/dist/ui/popover.js.map +1 -0
  523. package/dist/{core/components → ui}/raw-block.d.ts +1 -1
  524. package/dist/{core/components → ui}/raw-block.js +1 -1
  525. package/dist/ui/raw-block.js.map +1 -0
  526. package/dist/{core/components → ui}/section.d.ts +1 -1
  527. package/dist/{core/components → ui}/section.js +6 -6
  528. package/dist/ui/section.js.map +1 -0
  529. package/dist/{core/components → ui}/segmented-control.d.ts +1 -1
  530. package/dist/{core/components → ui}/segmented-control.js +1 -1
  531. package/dist/ui/segmented-control.js.map +1 -0
  532. package/dist/{core/components → ui}/segmented-pills.d.ts +1 -1
  533. package/dist/{core/components → ui}/segmented-pills.js +2 -2
  534. package/dist/ui/segmented-pills.js.map +1 -0
  535. package/dist/{core/components → ui}/skeleton.js +2 -2
  536. package/dist/ui/skeleton.js.map +1 -0
  537. package/dist/{core/components → ui}/spinner.js +4 -4
  538. package/dist/ui/spinner.js.map +1 -0
  539. package/dist/{core/components → ui}/stack.d.ts +1 -1
  540. package/dist/{core/components → ui}/stack.js +3 -3
  541. package/dist/ui/stack.js.map +1 -0
  542. package/dist/{core/components → ui}/tabs.d.ts +1 -1
  543. package/dist/{core/components → ui}/tabs.js +3 -3
  544. package/dist/ui/tabs.js.map +1 -0
  545. package/dist/{core/components → ui}/text.d.ts +1 -1
  546. package/dist/{core/components → ui}/text.js +4 -4
  547. package/dist/ui/text.js.map +1 -0
  548. package/dist/{form/components/base → ui}/textarea.js +3 -3
  549. package/dist/ui/textarea.js.map +1 -0
  550. package/dist/{core/components → ui}/tooltip.d.ts +1 -1
  551. package/dist/{core/components → ui}/tooltip.js +3 -3
  552. package/dist/ui/tooltip.js.map +1 -0
  553. package/dist/vite.js +2 -2
  554. package/dist/vite.js.map +1 -1
  555. package/package.json +30 -103
  556. package/resources/icons/align-center.svg +1 -1
  557. package/resources/icons/align-justify.svg +1 -1
  558. package/resources/icons/align-left.svg +1 -1
  559. package/resources/icons/align-right.svg +1 -1
  560. package/resources/icons/arrow-down.svg +1 -1
  561. package/resources/icons/arrow-up.svg +1 -1
  562. package/resources/icons/bell.svg +1 -1
  563. package/resources/icons/bold.svg +1 -1
  564. package/resources/icons/calendar.svg +1 -1
  565. package/resources/icons/check.svg +1 -1
  566. package/resources/icons/chevron-down.svg +1 -1
  567. package/resources/icons/chevron-left.svg +1 -1
  568. package/resources/icons/chevron-right.svg +1 -1
  569. package/resources/icons/chevrons-up-down.svg +1 -1
  570. package/resources/icons/circle-alert.svg +1 -1
  571. package/resources/icons/circle-check.svg +1 -1
  572. package/resources/icons/circle-help.svg +1 -1
  573. package/resources/icons/circle-x.svg +1 -1
  574. package/resources/icons/clock.svg +1 -1
  575. package/resources/icons/code.svg +1 -1
  576. package/resources/icons/columns-3.svg +1 -1
  577. package/resources/icons/copy.svg +1 -1
  578. package/resources/icons/external-link.svg +1 -1
  579. package/resources/icons/eye-off.svg +1 -1
  580. package/resources/icons/eye.svg +1 -1
  581. package/resources/icons/filter.svg +1 -1
  582. package/resources/icons/heading-1.svg +1 -1
  583. package/resources/icons/heading-2.svg +1 -1
  584. package/resources/icons/heading-3.svg +1 -1
  585. package/resources/icons/highlighter.svg +1 -1
  586. package/resources/icons/info.svg +1 -1
  587. package/resources/icons/italic.svg +1 -1
  588. package/resources/icons/layout-dashboard.svg +1 -1
  589. package/resources/icons/link.svg +1 -1
  590. package/resources/icons/list-ordered.svg +1 -1
  591. package/resources/icons/list.svg +1 -1
  592. package/resources/icons/loader-2.svg +1 -1
  593. package/resources/icons/minus.svg +1 -1
  594. package/resources/icons/more-horizontal.svg +1 -1
  595. package/resources/icons/panel-left.svg +1 -1
  596. package/resources/icons/pencil-line.svg +1 -1
  597. package/resources/icons/pencil.svg +1 -1
  598. package/resources/icons/plus.svg +1 -1
  599. package/resources/icons/quote.svg +1 -1
  600. package/resources/icons/rotate-ccw.svg +1 -1
  601. package/resources/icons/rows-3.svg +1 -1
  602. package/resources/icons/search.svg +1 -1
  603. package/resources/icons/send.svg +1 -1
  604. package/resources/icons/settings.svg +1 -1
  605. package/resources/icons/smile.svg +1 -1
  606. package/resources/icons/strikethrough.svg +1 -1
  607. package/resources/icons/table.svg +1 -1
  608. package/resources/icons/trash-2.svg +1 -1
  609. package/resources/icons/underline.svg +1 -1
  610. package/resources/icons/x.svg +1 -1
  611. package/dist/action/components/action-menu-context.js.map +0 -1
  612. package/dist/action/index.js.map +0 -1
  613. package/dist/action/run-action.js.map +0 -1
  614. package/dist/action/use-action.js.map +0 -1
  615. package/dist/chat/index.js.map +0 -1
  616. package/dist/chat/transport.js.map +0 -1
  617. package/dist/chat/use-chat.js.map +0 -1
  618. package/dist/clipboard/copyable-text.js.map +0 -1
  619. package/dist/core/column-sizing.js.map +0 -1
  620. package/dist/core/components/badge.js.map +0 -1
  621. package/dist/core/components/button.js.map +0 -1
  622. package/dist/core/components/card.js.map +0 -1
  623. package/dist/core/components/chart.js.map +0 -1
  624. package/dist/core/components/checkbox.js.map +0 -1
  625. package/dist/core/components/collapsible.js.map +0 -1
  626. package/dist/core/components/combobox.js.map +0 -1
  627. package/dist/core/components/confirm-dialog.js.map +0 -1
  628. package/dist/core/components/control.js.map +0 -1
  629. package/dist/core/components/dialog.js.map +0 -1
  630. package/dist/core/components/dropdown-menu.js.map +0 -1
  631. package/dist/core/components/eager.d.ts +0 -1
  632. package/dist/core/components/eager.js.map +0 -1
  633. package/dist/core/components/floating-panel.js.map +0 -1
  634. package/dist/core/components/fragment.js.map +0 -1
  635. package/dist/core/components/grid.js.map +0 -1
  636. package/dist/core/components/heading.js.map +0 -1
  637. package/dist/core/components/icon.js.map +0 -1
  638. package/dist/core/components/index.d.ts +0 -1
  639. package/dist/core/components/index.js +0 -49
  640. package/dist/core/components/index.js.map +0 -1
  641. package/dist/core/components/info-tooltip.js.map +0 -1
  642. package/dist/core/components/link.js.map +0 -1
  643. package/dist/core/components/modal.js.map +0 -1
  644. package/dist/core/components/popover.js.map +0 -1
  645. package/dist/core/components/raw-block.js.map +0 -1
  646. package/dist/core/components/section.js.map +0 -1
  647. package/dist/core/components/segmented-control.js.map +0 -1
  648. package/dist/core/components/segmented-pills.js.map +0 -1
  649. package/dist/core/components/skeleton.js.map +0 -1
  650. package/dist/core/components/spinner.js.map +0 -1
  651. package/dist/core/components/stack.js.map +0 -1
  652. package/dist/core/components/tabs.js.map +0 -1
  653. package/dist/core/components/text.js.map +0 -1
  654. package/dist/core/components/tooltip.js.map +0 -1
  655. package/dist/core/use-click-behavior.js +0 -46
  656. package/dist/core/use-click-behavior.js.map +0 -1
  657. package/dist/core/use-column-resizing.js.map +0 -1
  658. package/dist/core/use-column-visibility.js.map +0 -1
  659. package/dist/events/event-bridge.js.map +0 -1
  660. package/dist/form/components/base/affix-group.js.map +0 -1
  661. package/dist/form/components/base/input-error.js.map +0 -1
  662. package/dist/form/components/base/input-otp.js.map +0 -1
  663. package/dist/form/components/base/input.js.map +0 -1
  664. package/dist/form/components/base/label.js.map +0 -1
  665. package/dist/form/components/base/password-input.js.map +0 -1
  666. package/dist/form/components/base/textarea.js.map +0 -1
  667. package/dist/form/components/conditions.js.map +0 -1
  668. package/dist/form/components/context.js.map +0 -1
  669. package/dist/form/components/field-props.js.map +0 -1
  670. package/dist/form/components/field-scope.js.map +0 -1
  671. package/dist/form/components/fields/block-add-menu.js.map +0 -1
  672. package/dist/form/components/fields/date-picker-control.js.map +0 -1
  673. package/dist/form/components/fields/lazy-date-picker-control.d.ts +0 -2
  674. package/dist/form/components/fields/lazy-date-picker-control.js +0 -17
  675. package/dist/form/components/fields/lazy-date-picker-control.js.map +0 -1
  676. package/dist/form/components/form-path.js.map +0 -1
  677. package/dist/form/components/form-transport.js +0 -30
  678. package/dist/form/components/form-transport.js.map +0 -1
  679. package/dist/form/components/override-keys.js +0 -12
  680. package/dist/form/components/override-keys.js.map +0 -1
  681. package/dist/form/components/prefill-context.js.map +0 -1
  682. package/dist/form/components/prefill-targets.js.map +0 -1
  683. package/dist/form/components/resolved-nodes.js.map +0 -1
  684. package/dist/form/components/row-layout-context.js.map +0 -1
  685. package/dist/form/components/use-controlled-field.js.map +0 -1
  686. package/dist/form/components/use-dependent-field.d.ts +0 -3
  687. package/dist/form/components/use-dependent-field.js.map +0 -1
  688. package/dist/form/components/use-field-commit.js.map +0 -1
  689. package/dist/form/components/use-form-resolver.js.map +0 -1
  690. package/dist/form/components/use-seed-default.js.map +0 -1
  691. package/dist/form/components/values.js +0 -52
  692. package/dist/form/components/values.js.map +0 -1
  693. package/dist/form/eager.d.ts +0 -1
  694. package/dist/form/eager.js.map +0 -1
  695. package/dist/form/index.js.map +0 -1
  696. package/dist/form/skeleton.d.ts +0 -2
  697. package/dist/form/skeleton.js +0 -22
  698. package/dist/form/skeleton.js.map +0 -1
  699. package/dist/layout/breadcrumbs.js.map +0 -1
  700. package/dist/layout/callouts.js.map +0 -1
  701. package/dist/layout/components.d.ts +0 -1
  702. package/dist/layout/components.js.map +0 -1
  703. package/dist/layout/context.js.map +0 -1
  704. package/dist/layout/dropdown.js.map +0 -1
  705. package/dist/layout/menu-item.js.map +0 -1
  706. package/dist/layout/menu.js.map +0 -1
  707. package/dist/layout/outlet.js.map +0 -1
  708. package/dist/layout/popover.js.map +0 -1
  709. package/dist/layout/schema-layout.js.map +0 -1
  710. package/dist/layout/sidebar.js.map +0 -1
  711. package/dist/layout/topbar.js.map +0 -1
  712. package/dist/notifications/index.js.map +0 -1
  713. package/dist/registry/eager.d.ts +0 -1
  714. package/dist/registry/eager.js +0 -15
  715. package/dist/registry/eager.js.map +0 -1
  716. package/dist/registry/lazy.d.ts +0 -1
  717. package/dist/registry/lazy.js +0 -15
  718. package/dist/registry/lazy.js.map +0 -1
  719. package/dist/remote/index.js.map +0 -1
  720. package/dist/svg-sprite-client/index.d.ts +0 -1
  721. package/dist/svg-sprite-client/index.js +0 -0
  722. package/dist/table/align.js.map +0 -1
  723. package/dist/table/bulk.js.map +0 -1
  724. package/dist/table/components/filter-stack-bar.d.ts +0 -7
  725. package/dist/table/components/filter-stack-bar.js +0 -38
  726. package/dist/table/components/filter-stack-bar.js.map +0 -1
  727. package/dist/table/eager.d.ts +0 -1
  728. package/dist/table/eager.js.map +0 -1
  729. package/dist/table/filter-values.js.map +0 -1
  730. package/dist/table/format.js.map +0 -1
  731. package/dist/table/index.js.map +0 -1
  732. package/dist/table/payload.js.map +0 -1
  733. package/dist/table/query.js.map +0 -1
  734. package/dist/table/use-table-selection.js.map +0 -1
  735. package/dist/table/use-table.js.map +0 -1
  736. package/dist/types/generated.js +0 -0
  737. package/dist/types/index.js +0 -0
  738. /package/dist/form/{components → hooks}/field-scope.d.ts +0 -0
  739. /package/dist/form/{components → hooks}/prefill-context.d.ts +0 -0
  740. /package/dist/form/{components → hooks}/row-layout-context.d.ts +0 -0
  741. /package/dist/form/{components → hooks}/use-seed-default.d.ts +0 -0
  742. /package/dist/form/{components → lib}/form-path.d.ts +0 -0
  743. /package/dist/form/{components → lib}/override-keys.d.ts +0 -0
  744. /package/dist/form/{components/types.js → types.js} +0 -0
  745. /package/dist/layout/{popover.d.ts → components/popover.d.ts} +0 -0
  746. /package/dist/layout/{schema-layout.d.ts → components/schema-layout.d.ts} +0 -0
  747. /package/dist/table/{use-table-selection.d.ts → hooks/use-table-selection.d.ts} +0 -0
  748. /package/dist/{action/components → ui}/action-menu-context.d.ts +0 -0
  749. /package/dist/{core/components → ui}/checkbox.d.ts +0 -0
  750. /package/dist/{core/components → ui}/dialog.d.ts +0 -0
  751. /package/dist/{core/components → ui}/info-tooltip.d.ts +0 -0
  752. /package/dist/{form/components/base → ui}/input-error.d.ts +0 -0
  753. /package/dist/{form/components/base → ui}/input-otp.d.ts +0 -0
  754. /package/dist/{form/components/base → ui}/input.d.ts +0 -0
  755. /package/dist/{form/components/base → ui}/label.d.ts +0 -0
  756. /package/dist/{form/components/base → ui}/password-input.d.ts +0 -0
  757. /package/dist/{core/components → ui}/popover.d.ts +0 -0
  758. /package/dist/{core/components → ui}/skeleton.d.ts +0 -0
  759. /package/dist/{core/components → ui}/spinner.d.ts +0 -0
  760. /package/dist/{form/components/base → ui}/textarea.d.ts +0 -0
@@ -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":";;;;;;;;;;;AAmBA,SAAgB,oBAAoB,EAClC,QACA,SACA,YACA,OACA,UACA,UACA,WACA,YAUC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,EAAE,QAAQ,OAAO,aAAa,OAAO;CAC3C,MAAM,QAAQ,YAAY,OAAO;CAEjC,IAAI,CAAC,QACH,OAAO;CAGT,IAAI,OAAO,YAAY,iBACrB,OACE,oBAAC,oBAAD;EACU;EACC;EACG;EACD;EACD;CACX,CAAA;CAIL,MAAM,OAAO,OAAO,QAAQ;CAC5B,MAAM,YAAY,OAAO,aAAa,CAAC;CACvC,MAAM,kBAAkB,OAAO,mBAAmB,UAAU,MAAM;CAClE,MAAM,UAAU,QAAQ,MAAM,UAAU,MAAM,OAAO,aAAa,eAAe,KAAK,QAAQ;CAE9F,SAAS,cAAc,OAAqB;EAC1C,IAAI,UAAU,IAAI;GAChB,IAAI,SACF,SAAS,QAAQ,KAAK;GAGxB;EACF;EAEA,IAAI,SACF,SAAS,QAAQ,OAAO;GAAE,GAAG,QAAQ;GAAQ;EAAM,CAAC;OAEpD,MAAM;GAAE,OAAO,OAAO;GAAK,UAAU;GAAiB;EAAM,CAAC;CAEjE;CAEA,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,OAAD;GAAK,WAAU;aACb,oBAAC,kBAAD;IACQ;IACC;IACP,OAAO,SAAS,OAAO,SAAS;IACpB;IACZ,gBAAgB,SAAS,UAAU,SAAS;IAC5C,SAAA;IACA,QAAQ,UAAU,OAAO,IAAI;IAC7B,UAAU;IACV,SAAS,gBAAgB,SAAS,QAAQ,KAAK,IAAI,KAAA;GACpD,CAAA;EACE,CAAA,GACL,qBAAC,SAAD,EAAA,UAAA,CACE,oBAAC,gBAAD;GAAgB,SAAA;aACd,qBAAC,UAAD;IACE,MAAK;IACL,cAAY,EAAE,8BAA8B,qBAAqB,EAC/D,MACF,CAAC;IACD,aAAW,UAAU,OAAO;IAC5B,WAAU;IACV,UAAU;cAPZ,CASE,oBAAC,MAAD;KAAM,MAAK;KAAS,eAAY;KAAO,WAAU;IAAmB,CAAA,GACnE,QAAQ,SAAS,KAChB,oBAAC,QAAD;KAAM,WAAU;eACb,QAAQ;IACL,CAAA,CAEF;;EACM,CAAA,GAEhB,oBAAC,gBAAD;GAAgB,OAAM;GAAQ,WAAU;aACtC,oBAAC,kBAAD;IACU;IACC;IACE;IACM;IACL;IACL;IACG;IACA;GACX,CAAA;EACa,CAAA,CACT,EAAA,CAAA,CACN;;AAET;AAEA,SAAS,qBAAqB,OAAwB;CACpD,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,KAAK,GAAG;CAGvB,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAS,mBAAmB,EAC1B,QACA,SACA,YACA,WACA,YAOC;CACD,MAAM,EAAE,QAAQ,UAAU,OAAO;CAEjC,IAAI,CAAC,QACH,OAAO;CAGT,MAAM,WAAW,OAAO;CACxB,MAAM,WAAW,OAAO;CACxB,MAAM,gBAAgB,OAAO,iBAAiB,CAAC;CAC/C,MAAM,qBAAqB,uBACzB,QAAQ,KAAK,UAAU,MAAM,MAAM,GACnC,aACF;CACA,MAAM,SAAS,QAAQ,MAAM,UAAU,MAAM,OAAO,aAAa,QAAQ,KAAK,QAAQ;CACtF,MAAM,QAAiB,qBACnB,mBAAmB,QACnB,WACE,QAAQ,OAAO,QACb,OAAO,OAAO,MAAM,MAAM,GAAG,IAC7B,CAAC,IACF,QAAQ,OAAO,SAAS;CAE/B,MAAM,OAAoC;EACxC,KAAK,OAAO;EACZ,MAAM;EACN,OAAO;GACL;GACA,SAAS,OAAO;GAChB;GACA,YAAY,OAAO;GACnB,aAAa;EACf;EACA,QAAQ,CACN;GACE,MAAM;GACN,KAAK,OAAO;GACZ,OAAO;IACL,MAAM;IACN;IACA,SAAS,OAAO;IAChB;IACA,YAAY,OAAO;IACnB,aAAa;GACf;EACF,CACF;CACF;CAEA,SAAS,OAAO,MAAqB;EACnC,MAAM,aAAa,qBAAqB,YAAY,IAAI,EAAE,KAAK;EAE/D,IAAI,eAAe,IAAI;GACrB,UAAU,OAAO,KAAK,CAAC,CAAC;GAExB;EACF;EAEA,MAAM,eAAe,cAAc,MAAM,WAAW,OAAO,UAAU,UAAU;EAE/E,IAAI,cAAc;GAChB,UAAU,OAAO,KAAK,iBAAiB,OAAO,KAAK,YAAY,CAAC;GAEhE;EACF;EAEA,UAAU,OAAO,KAAK,CAAC;GAAE,OAAO,OAAO;GAAK;GAAU,OAAO;EAAW,CAAC,CAAC;CAC5E;CAEA,OACE,oBAAC,oBAAD;EACE,QAAQ;EACR,OAAO,EAAE,MAAM;EACH;EACZ,UAAU;EACV,UAAU,YAAY,QAAQ,OAAO,WAAW,SAAS,OAAO,MAAM,IAAI,KAAA;CAC3E,CAAA;AAEL;AAEA,SAAS,iBAAiB,OAAe,QAA4C;CACnF,OAAO,OAAO,QAAQ,KAAK,YAAY;EACrC;EACA,UAAU,OAAO;EACjB,OAAO,OAAO;CAChB,EAAE;AACJ;AAEA,SAAS,uBACP,SACA,SACgC;CAChC,OAAO,QAAQ,MAAM,WAAW,aAAa,SAAS,iBAAiB,IAAI,MAAM,CAAC,CAAC;AACrF;AAEA,SAAS,aAAa,QAAwB,UAAmC;CAC/E,IAAI,OAAO,WAAW,SAAS,QAC7B,OAAO;CAGT,OAAO,SAAS,OAAO,WACrB,OAAO,MACJ,YAAY,QAAQ,aAAa,OAAO,YAAY,QAAQ,UAAU,OAAO,KAChF,CACF;AACF;AAEA,SAAS,iBAAiB,EACxB,QACA,SACA,WACA,iBACA,YACA,OACA,UACA,YAUC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,OAAO,OAAO,MAAM,QAAQ,QAAQ;CAC1C,MAAM,CAAC,eAAe,oBAAoB,SAAS,eAAe;CAClE,MAAM,CAAC,QAAQ,aAAa,SAAS,QAAQ,WAAW,CAAC;CAEzD,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACG,QAAQ,KAAK,UACZ,oBAAC,iBAAD;IAEU;IACF;IACK;IACX,QAAQ,MAAM;IACF;IACZ,aAAa,aAAa,SAAS,MAAM,OAAO;KAAE,GAAG,MAAM;KAAQ;IAAS,CAAC;IAC7E,UAAU,UACR,UAAU,KAAK,SAAS,MAAM,KAAK,IAAI,SAAS,MAAM,OAAO;KAAE,GAAG,MAAM;KAAQ;IAAM,CAAC;IAEzF,gBAAgB,SAAS,MAAM,KAAK;GACrC,GAXM,MAAM,KAWZ,CACF;GAEA,UACC,oBAAC,iBAAD;IACU;IACF;IACK;IACX,QAAQ;KAAE,OAAO,OAAO;KAAK,UAAU;KAAe,OAAO;IAAG;IACpD;IACZ,aAAa,aAAa;KACxB,IAAI,2BAA2B,IAAI,QAAQ,GAAG;MAC5C,MAAM;OAAE,OAAO,OAAO;OAAK;OAAU,OAAO;MAAG,CAAC;MAChD,iBAAiB,eAAe;MAChC,UAAU,KAAK;MACf;KACF;KACA,iBAAiB,QAAQ;IAC3B;IACA,UAAU,UAAU;KAClB,IAAI,UAAU,IAAI;MAChB,MAAM;OAAE,OAAO,OAAO;OAAK,UAAU;OAAe;MAAM,CAAC;MAC3D,iBAAiB,eAAe;MAChC,UAAU,KAAK;KACjB;IACF;IACA,gBAAgB,UAAU,KAAK;GAChC,CAAA;GAGH,oBAAC,OAAD;IAAK,WAAU;cACb,qBAAC,UAAD;KACE,MAAK;KACL,aAAW,UAAU,OAAO,IAAI;KAChC,WAAU;KACV,UAAU;KACV,eAAe,UAAU,IAAI;eAL/B,CAOE,oBAAC,MAAD;MAAM,MAAK;MAAO,eAAY;MAAO,WAAU;KAAmB,CAAA,GACjE,EAAE,oBAAoB,YAAY,CAC7B;;GACL,CAAA;EACF;;AAET;AAEA,SAAS,gBAAgB,EACvB,QACA,MACA,WACA,QACA,YACA,YACA,SACA,YAUC;CACD,MAAM,EAAE,MAAM,KAAK,SAAS;CAC5B,MAAM,QAAQ,OAAO,MAAM,SAAS,OAAO;CAC3C,MAAM,YAAY,2BAA2B,IAAI,OAAO,QAAQ;CAEhE,OACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACG,UAAU,SAAS,IAClB,oBAAC,UAAD;IACE,cAAY,EAAE,yBAAyB,sBAAsB,EAAE,MAAM,CAAC;IACtE,aAAW,UAAU,OAAO,IAAI;IAChC,WAAW,GAAG,YAAY,QAAQ;IAClC,UAAU;IACV,OAAO,OAAO;IACd,WAAW,UAAU,WAAW,MAAM,OAAO,KAAW;cAEvD,UAAU,KAAK,aACd,oBAAC,UAAD;KAAuB,OAAO;eAC3B,cAAc,QAAQ;IACjB,GAFK,QAEL,CACT;GACK,CAAA,IAER,oBAAC,QAAD;IAAM,WAAU;cAA8B,cAAc,OAAO,QAAQ;GAAQ,CAAA,GAErF,oBAAC,UAAD;IACE,MAAK;IACL,cAAY,EAAE,uBAAuB,2BAA2B,EAAE,MAAM,CAAC;IACzE,aAAW,UAAU,OAAO,IAAI;IAChC,WAAU;IACV,UAAU;IACV,SAAS;cAET,oBAAC,MAAD;KAAM,MAAK;KAAU,eAAY;KAAO,WAAU;IAAmB,CAAA;GAC/D,CAAA,CACL;MACJ,CAAC,aACA,oBAAC,kBAAD;GACQ;GACC;GACP,WAAW,EAAE,sBAAsB,0BAA0B,EAAE,MAAM,CAAC;GACtE,OAAO,OAAO;GACF;GACZ,UAAU;GACV,eAAe,QAAQ,EAAE;EAC1B,CAAA,CAEA;;AAET"}
@@ -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;
@@ -1,47 +1,75 @@
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 { filterOptions, isActiveFilterValue, stringProp } from "../filter-values.js";
3
+ import { Popover, PopoverContent, PopoverTrigger } from "../../ui/popover.js";
4
+ import { isActiveFilterValue } from "../lib/filter-values.js";
5
+ import { VALUELESS_FILTER_OPERATORS, operatorLabel } from "../lib/query.js";
5
6
  import { TableFilterControl } from "./filter-controls.js";
6
- import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
8
  //#region resources/js/table/components/filter-bar.tsx
8
- function FilterBar({ filters, values, processing, hasActiveFilters, onChange, onReset }) {
9
+ function FilterBar({ clauses, columnsByKey, indicators, processing, onRemoveClause, onChange, onReset }) {
9
10
  const { t } = useT("lattice");
10
- const active = filters.filter((filter) => isActiveFilterValue(values[filter.key]));
11
- if (!hasActiveFilters) return null;
11
+ if (clauses.length === 0 && indicators.length === 0) return null;
12
12
  return /* @__PURE__ */ jsx("div", {
13
13
  className: "border-b border-lt-border px-4 py-3",
14
14
  children: /* @__PURE__ */ jsxs("div", {
15
15
  className: "flex flex-wrap items-center gap-2 text-sm",
16
- children: [active.map((filter) => /* @__PURE__ */ jsxs("span", {
17
- className: "inline-flex items-center gap-1.5 rounded-lt-sm bg-lt-muted px-2 py-1",
18
- children: [/* @__PURE__ */ jsxs("span", { children: [`${filter.label}: `, /* @__PURE__ */ jsx("span", {
19
- className: "font-semibold",
20
- children: displayValue(filter, values[filter.key])
21
- })] }), /* @__PURE__ */ jsx("button", {
16
+ children: [
17
+ clauses.map((clause, index) => {
18
+ const label = columnsByKey.get(clause.field)?.props.label ?? clause.field;
19
+ const valueless = VALUELESS_FILTER_OPERATORS.has(clause.operator);
20
+ return /* @__PURE__ */ jsx(FilterChip, {
21
+ label: `${label} ${operatorLabel(clause.operator)}`,
22
+ value: valueless ? "" : clause.value,
23
+ removeTestId: `filter-chip-${clause.field}-remove`,
24
+ removeLabel: t("table.filter.remove", "Remove {{label}} filter", { label }),
25
+ processing,
26
+ onRemove: () => onRemoveClause(index)
27
+ }, `${clause.field}-${clause.operator}-${index}`);
28
+ }),
29
+ indicators.map((indicator) => /* @__PURE__ */ jsx(FilterChip, {
30
+ label: indicator.label,
31
+ value: indicator.value,
32
+ removeTestId: `table-filter-chip-${indicator.filter}-remove`,
33
+ removeLabel: t("table.filter.remove", "Remove {{label}} filter", { label: indicator.label }),
34
+ processing,
35
+ onRemove: () => onChange(indicator.filter, void 0)
36
+ }, `${indicator.filter}:${indicator.label}:${indicator.value}`)),
37
+ /* @__PURE__ */ jsx("button", {
22
38
  type: "button",
23
- "data-test": `table-filter-chip-${filter.key}-remove`,
24
- className: "inline-flex size-5 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-border disabled:opacity-50",
39
+ "data-test": "table-filters-reset",
40
+ className: "text-lt-muted-fg underline-offset-2 hover:underline disabled:opacity-50",
25
41
  disabled: processing,
26
- "aria-label": t("table.filter.remove", "Remove {{label}} filter", { label: filter.label }),
27
- onClick: () => onChange(filter.key, void 0),
28
- children: /* @__PURE__ */ jsx(Icon, {
29
- name: "x",
30
- "aria-hidden": "true",
31
- className: "size-lt-icon-sm"
32
- })
33
- })]
34
- }, filter.key)), /* @__PURE__ */ jsx("button", {
35
- type: "button",
36
- "data-test": "table-filters-reset",
37
- className: "text-lt-muted-fg underline-offset-2 hover:underline disabled:opacity-50",
38
- disabled: processing,
39
- onClick: onReset,
40
- children: t("table.filter.resetAll", "Reset all")
41
- })]
42
+ onClick: onReset,
43
+ children: t("table.filter.resetAll", "Reset all")
44
+ })
45
+ ]
42
46
  })
43
47
  });
44
48
  }
49
+ function FilterChip({ label, value, removeTestId, removeLabel, processing, onRemove }) {
50
+ return /* @__PURE__ */ jsxs("span", {
51
+ className: "inline-flex items-center gap-1.5 rounded-lt-sm bg-lt-muted px-2 py-1",
52
+ children: [/* @__PURE__ */ jsx("span", { children: value === "" ? /* @__PURE__ */ jsx("span", {
53
+ className: "font-semibold",
54
+ children: label
55
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [`${label}: `, /* @__PURE__ */ jsx("span", {
56
+ className: "font-semibold",
57
+ children: value
58
+ })] }) }), /* @__PURE__ */ jsx("button", {
59
+ type: "button",
60
+ "data-test": removeTestId,
61
+ className: "inline-flex size-5 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-border disabled:opacity-50",
62
+ disabled: processing,
63
+ "aria-label": removeLabel,
64
+ onClick: onRemove,
65
+ children: /* @__PURE__ */ jsx(Icon, {
66
+ name: "x",
67
+ "aria-hidden": "true",
68
+ className: "size-lt-icon-sm"
69
+ })
70
+ })]
71
+ });
72
+ }
45
73
  function FilterMenu({ filters, values, processing, onChange, onSearch }) {
46
74
  const { t } = useT("lattice");
47
75
  const active = filters.filter((filter) => isActiveFilterValue(values[filter.key]));
@@ -67,37 +95,19 @@ function FilterMenu({ filters, values, processing, onChange, onSearch }) {
67
95
  className: "w-80 p-4",
68
96
  children: /* @__PURE__ */ jsx("div", {
69
97
  className: "grid gap-3",
70
- children: filters.map((filter) => /* @__PURE__ */ jsxs("div", {
98
+ children: filters.map((filter) => /* @__PURE__ */ jsx("div", {
71
99
  className: "grid gap-1",
72
- children: [filter.type !== "toggle" && /* @__PURE__ */ jsx("span", {
73
- className: "text-xs font-medium text-lt-muted-fg",
74
- children: filter.label
75
- }), /* @__PURE__ */ jsx(TableFilterControl, {
100
+ children: /* @__PURE__ */ jsx(TableFilterControl, {
76
101
  filter,
77
102
  value: values[filter.key],
78
103
  processing,
79
104
  onChange: (value) => onChange(filter.key, value),
80
- onSearch: onSearch ? (query) => onSearch(filter.key, query) : void 0
81
- })]
105
+ onSearch: onSearch ? (field, query, signal) => onSearch(`filter:${filter.key}.${field}`, query, signal) : void 0
106
+ })
82
107
  }, filter.key))
83
108
  })
84
109
  })] });
85
110
  }
86
- function optionLabel(filter, value) {
87
- return filterOptions(filter).find((option) => option.value === value)?.label ?? value;
88
- }
89
- function displayValue(filter, value) {
90
- if (filter.type === "select") {
91
- if (Array.isArray(value)) return value.map((item) => optionLabel(filter, String(item))).join(", ");
92
- return optionLabel(filter, String(value));
93
- }
94
- if (filter.type === "ternary") return value === "true" ? stringProp(filter, "trueLabel", "True") : stringProp(filter, "falseLabel", "False");
95
- if (filter.type === "date-range" && value && typeof value === "object") {
96
- const range = value;
97
- return [range.from, range.until].filter((part) => part).join(" – ");
98
- }
99
- return String(value);
100
- }
101
111
  //#endregion
102
112
  export { FilterBar, FilterMenu };
103
113