themelia-react-ui 2.0.4 → 2.0.5

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 (588) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +113 -18
  3. package/dist/{accordion-96o0pN62.js → accordion-B9MHG0cT.js} +11 -11
  4. package/dist/accordion-B9MHG0cT.js.map +1 -0
  5. package/dist/{action-menu-CHgs8vmj.js → action-menu-Dr8K-ghE.js} +48 -45
  6. package/dist/action-menu-Dr8K-ghE.js.map +1 -0
  7. package/dist/{affordance-geometry.generated-B8yGOr8-.js → affordance-geometry.generated-P-aVJisu.js} +36 -36
  8. package/dist/affordance-geometry.generated-P-aVJisu.js.map +1 -0
  9. package/dist/{ai-artifact-BZUGwBq6.js → ai-artifact-C58tQcBy.js} +210 -174
  10. package/dist/ai-artifact-C58tQcBy.js.map +1 -0
  11. package/dist/app-shell-B_IuNWOo.js +321 -0
  12. package/dist/app-shell-B_IuNWOo.js.map +1 -0
  13. package/dist/{attachment-DkoqHPPl.js → attachment-Dg_69lPS.js} +9 -9
  14. package/dist/{attachment-DkoqHPPl.js.map → attachment-Dg_69lPS.js.map} +1 -1
  15. package/dist/{auth-D2FVZ1MH.js → auth-DTkkshS8.js} +43 -46
  16. package/dist/auth-DTkkshS8.js.map +1 -0
  17. package/dist/{avatar-DWO_HHhB.js → avatar-CeZaFmNH.js} +8 -8
  18. package/dist/avatar-CeZaFmNH.js.map +1 -0
  19. package/dist/{badge-DErMA7ul.js → badge-xIiV_E7f.js} +5 -5
  20. package/dist/{badge-DErMA7ul.js.map → badge-xIiV_E7f.js.map} +1 -1
  21. package/dist/base/accordion.js +1 -1
  22. package/dist/base/action-menu.js +1 -1
  23. package/dist/base/attachment.js +1 -1
  24. package/dist/base/avatar.js +1 -1
  25. package/dist/base/badge.js +1 -1
  26. package/dist/base/batch-action-bar.js +1 -1
  27. package/dist/base/buttons.js +1 -1
  28. package/dist/base/cards.js +2 -2
  29. package/dist/base/carousel.js +3 -3
  30. package/dist/base/cascader.js +2 -372
  31. package/dist/base/chart.js +1 -1
  32. package/dist/base/choice-inputs.js +2 -2
  33. package/dist/base/code-block.js +1 -1
  34. package/dist/base/combobox.js +2 -2
  35. package/dist/base/command.js +1 -1
  36. package/dist/base/copyable.js +1 -1
  37. package/dist/base/date-pickers.js +2 -2
  38. package/dist/base/display.js +6 -6
  39. package/dist/base/feedback.js +3 -3
  40. package/dist/base/forms-numeric.js +1 -1
  41. package/dist/base/forms.js +2 -2
  42. package/dist/base/inline-edit.js +10 -10
  43. package/dist/base/item.js +1 -1
  44. package/dist/base/media-gallery.js +1 -1
  45. package/dist/base/metadata-list.js +1 -1
  46. package/dist/base/navigation.js +7 -7
  47. package/dist/base/popover-menu.js +1 -1
  48. package/dist/base/popover.js +1 -1
  49. package/dist/base/qr-code.js +1 -1
  50. package/dist/base/repeaters.js +12 -12
  51. package/dist/base/repeaters.js.map +1 -1
  52. package/dist/base/sheet.js +1 -1
  53. package/dist/base/sidebar.js +2 -2
  54. package/dist/base/signature-pad.js +7 -7
  55. package/dist/base/signature-pad.js.map +1 -1
  56. package/dist/base/skeleton.js +1 -1
  57. package/dist/base/spinner.js +4 -4
  58. package/dist/base/structure.js +1 -1
  59. package/dist/base/table.js +1 -1
  60. package/dist/base/text-inputs.js +2 -2
  61. package/dist/base/toaster.js +36 -36
  62. package/dist/base/toaster.js.map +1 -1
  63. package/dist/base/tree.js +1 -1
  64. package/dist/base/upload-queue.js +1 -1
  65. package/dist/base/upload.js +3 -3
  66. package/dist/base/value-inputs.js +1 -1
  67. package/dist/{batch-action-bar-CdfIkCsV.js → batch-action-bar-Cb8cuvyy.js} +6 -6
  68. package/dist/batch-action-bar-Cb8cuvyy.js.map +1 -0
  69. package/dist/blocks/admin.js +21 -21
  70. package/dist/blocks/admin.js.map +1 -1
  71. package/dist/blocks/ai.js +230 -216
  72. package/dist/blocks/ai.js.map +1 -1
  73. package/dist/blocks/analytics/usage-card.js +1 -1
  74. package/dist/blocks/analytics.js +325 -306
  75. package/dist/blocks/analytics.js.map +1 -1
  76. package/dist/blocks/collaboration.js +1 -1
  77. package/dist/blocks/commerce/receipt.js +1 -1
  78. package/dist/blocks/commerce.js +1259 -1184
  79. package/dist/blocks/commerce.js.map +1 -1
  80. package/dist/blocks/data-display.js +2 -2
  81. package/dist/blocks/onboarding.js +6 -6
  82. package/dist/blocks/onboarding.js.map +1 -1
  83. package/dist/blocks/planning.js +11 -11
  84. package/dist/blocks/timelines.js +1 -1
  85. package/dist/{breadcrumbs-B-WFKecD.js → breadcrumbs-J-K2kl4c.js} +6 -6
  86. package/dist/{breadcrumbs-B-WFKecD.js.map → breadcrumbs-J-K2kl4c.js.map} +1 -1
  87. package/dist/{button-DkmK-z8E.js → button-S2Cubiiz.js} +3 -3
  88. package/dist/button-S2Cubiiz.js.map +1 -0
  89. package/dist/{buttons-BbfzgczK.js → buttons-BedGfygC.js} +16 -16
  90. package/dist/buttons-BedGfygC.js.map +1 -0
  91. package/dist/cards-rNX1M4Xn.js +69 -0
  92. package/dist/cards-rNX1M4Xn.js.map +1 -0
  93. package/dist/cascader-B1MiqkBq.js +439 -0
  94. package/dist/cascader-B1MiqkBq.js.map +1 -0
  95. package/dist/chart-Darg_0Kv.js +162 -0
  96. package/dist/chart-Darg_0Kv.js.map +1 -0
  97. package/dist/{checkbox-CzYUTPeJ.js → checkbox-fflqmODR.js} +2 -2
  98. package/dist/{checkbox-CzYUTPeJ.js.map → checkbox-fflqmODR.js.map} +1 -1
  99. package/dist/{choice-inputs-JLtij2y4.js → choice-inputs-zUgBZfE4.js} +258 -257
  100. package/dist/choice-inputs-zUgBZfE4.js.map +1 -0
  101. package/dist/{code-block-CGNaUtAE.js → code-block-BzmM9Eig.js} +8 -8
  102. package/dist/code-block-BzmM9Eig.js.map +1 -0
  103. package/dist/{collapsible-Do4G0zcC.js → collapsible-BkAI_XD4.js} +5 -5
  104. package/dist/{collapsible-Do4G0zcC.js.map → collapsible-BkAI_XD4.js.map} +1 -1
  105. package/dist/{collection-content-C0e8SsTm.js → collection-content-gDh1v6O4.js} +3 -3
  106. package/dist/{collection-content-C0e8SsTm.js.map → collection-content-gDh1v6O4.js.map} +1 -1
  107. package/dist/combobox-BEx0vJgF.js +362 -0
  108. package/dist/combobox-BEx0vJgF.js.map +1 -0
  109. package/dist/{combobox-CBJDs6w_.js → combobox-BwzoXFSG.js} +254 -247
  110. package/dist/combobox-BwzoXFSG.js.map +1 -0
  111. package/dist/{command-D8NrBj-b.js → command-CrlPIL6m.js} +11 -11
  112. package/dist/command-CrlPIL6m.js.map +1 -0
  113. package/dist/{comments-Di4w0H_S.js → comments-Dmpp0YIc.js} +29 -29
  114. package/dist/{comments-Di4w0H_S.js.map → comments-Dmpp0YIc.js.map} +1 -1
  115. package/dist/components/base/action-menu/action-menu.d.ts +7 -1
  116. package/dist/components/base/buttons/button-group.recipes.d.ts +2 -2
  117. package/dist/components/base/cards/card.recipes.d.ts +6 -4
  118. package/dist/components/base/cards/partials/card-primitives.d.ts +9 -2
  119. package/dist/components/base/cards/partials/smart-card-header-row.d.ts +3 -1
  120. package/dist/components/base/cards/smart-card.types.d.ts +3 -4
  121. package/dist/components/base/cascader/cascader-panel.d.ts +76 -0
  122. package/dist/components/base/chart/chart.d.ts +6 -1
  123. package/dist/components/base/choice-inputs/choice-types.d.ts +1 -1
  124. package/dist/components/base/combobox/index.d.ts +4 -2
  125. package/dist/components/base/feedback/alert.d.ts +1 -1
  126. package/dist/components/base/forms/form-sizing.d.ts +7 -7
  127. package/dist/components/base/forms/workflow.d.ts +7 -1
  128. package/dist/components/base/forms-numeric/coordinates-input.d.ts +4 -0
  129. package/dist/components/base/metadata-list/metadata-list.d.ts +1 -1
  130. package/dist/components/base/navigation/dropdown-menu.d.ts +1 -1
  131. package/dist/components/base/navigation/page-header/page-header-commands.d.ts +14 -7
  132. package/dist/components/base/navigation/page-header/page-header.d.ts +10 -3
  133. package/dist/components/base/popover/popover.d.ts +3 -3
  134. package/dist/components/base/popover/popover.recipes.d.ts +10 -6
  135. package/dist/components/base/sheet/sheet.d.ts +2 -0
  136. package/dist/components/base/sidebar/index.d.ts +1 -1
  137. package/dist/components/base/sidebar/sidebar.d.ts +27 -5
  138. package/dist/components/base/toaster/index.d.ts +1 -0
  139. package/dist/components/blocks/ai/ai-file-tree/types.d.ts +1 -1
  140. package/dist/components/blocks/ai/ai-tool-call/types.d.ts +3 -1
  141. package/dist/components/blocks/ai/ai.strings.d.ts +2 -0
  142. package/dist/components/blocks/analytics/metric-comparison/metric-comparison.d.ts +2 -0
  143. package/dist/components/blocks/analytics/usage-card/usage-card.strings.d.ts +2 -0
  144. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +1 -1
  145. package/dist/components/blocks/commerce/cart-summary/types.d.ts +3 -1
  146. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +1 -1
  147. package/dist/components/blocks/commerce/discount-stack/types.d.ts +3 -1
  148. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +1 -1
  149. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +11 -2
  150. package/dist/components/blocks/commerce/index.d.ts +7 -6
  151. package/dist/components/blocks/commerce/inventory-section/inventory-section.d.ts +1 -1
  152. package/dist/components/blocks/commerce/inventory-section/types.d.ts +7 -2
  153. package/dist/components/blocks/commerce/invoice-header/index.d.ts +2 -1
  154. package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
  155. package/dist/components/blocks/commerce/invoice-header/types.d.ts +20 -6
  156. package/dist/components/blocks/commerce/invoice-line-items/invoice-line-items.d.ts +1 -1
  157. package/dist/components/blocks/commerce/invoice-line-items/types.d.ts +24 -7
  158. package/dist/components/blocks/commerce/invoice-mini/index.d.ts +2 -1
  159. package/dist/components/blocks/commerce/invoice-mini/types.d.ts +7 -1
  160. package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +1 -1
  161. package/dist/components/blocks/commerce/order-customer/types.d.ts +9 -1
  162. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +1 -1
  163. package/dist/components/blocks/commerce/refund-status/types.d.ts +3 -1
  164. package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
  165. package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +3 -1
  166. package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
  167. package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +3 -1
  168. package/dist/components/features/activities/activities.types.d.ts +8 -2
  169. package/dist/components/features/activities/partials/activity-marker.d.ts +7 -3
  170. package/dist/components/features/activities/partials/activity-row.d.ts +24 -0
  171. package/dist/components/features/event-calendar/colors.d.ts +2 -2
  172. package/dist/components/features/event-calendar/event-calendar.types.d.ts +4 -0
  173. package/dist/components/features/filters/facets/select-facet.d.ts +2 -1
  174. package/dist/components/features/filters/filters.strings.d.ts +4 -0
  175. package/dist/components/features/filters/filters.types.d.ts +3 -0
  176. package/dist/components/features/filters/partials/filter-editor-header.d.ts +16 -0
  177. package/dist/components/features/filters/partials/filter-popover-content.d.ts +1 -1
  178. package/dist/components/features/filters/partials/nested-filter-options.d.ts +21 -0
  179. package/dist/components/features/filters/partials/regular-filter-content.d.ts +2 -1
  180. package/dist/components/features/filters/utils/filter-utils.d.ts +21 -3
  181. package/dist/components/features/global-search/global-search.types.d.ts +2 -0
  182. package/dist/components/features/global-search/partials/global-search-input.d.ts +10 -0
  183. package/dist/components/features/global-search/partials/global-search-result-row.d.ts +7 -1
  184. package/dist/components/features/media-library/media-library.strings.d.ts +2 -0
  185. package/dist/components/features/media-library/media-library.types.d.ts +14 -4
  186. package/dist/components/features/media-library/partials/media-library-partials.d.ts +1 -1
  187. package/dist/components/features/products/components/product-options-matrix.d.ts +1 -1
  188. package/dist/components/features/products/components/product-variant-editor.d.ts +1 -1
  189. package/dist/components/features/products/components/product-variants-manager.d.ts +1 -1
  190. package/dist/components/features/products/products.strings.d.ts +9 -1
  191. package/dist/components/features/products/products.types.d.ts +43 -6
  192. package/dist/components/features/resource/resource.d.ts +5 -1
  193. package/dist/components/features/resource/resource.types.d.ts +12 -1
  194. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +1 -1
  195. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +12 -2
  196. package/dist/components/features/table/partials/resource-cell.d.ts +22 -5
  197. package/dist/components/features/table/table.types.d.ts +1 -1
  198. package/dist/components/layout/app-shell/app-shell.types.d.ts +35 -6
  199. package/dist/components/layout/app-shell/index.d.ts +1 -1
  200. package/dist/components/layout/app-shell/shell-regions.d.ts +27 -0
  201. package/dist/components/layout/app-shell/sidebar-inset-layout.d.ts +1 -1
  202. package/dist/components/layout/app-shell/stacked-layout.d.ts +1 -1
  203. package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
  204. package/dist/components/layout/containers/two-column-layout.d.ts +2 -0
  205. package/dist/components/layout/header/header.recipes.d.ts +6 -0
  206. package/dist/components/layout/header/header.types.d.ts +6 -6
  207. package/dist/components/layout/navigation/section-nav/section-nav.d.ts +5 -0
  208. package/dist/components/layout/page/index.d.ts +2 -1
  209. package/dist/components/layout/page/page.d.ts +1 -0
  210. package/dist/components/layout/page/page.strings.d.ts +11 -0
  211. package/dist/components/layout/page/page.types.d.ts +69 -17
  212. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  213. package/dist/components/layout/settings/settings.d.ts +9 -2
  214. package/dist/components/layout/sidebar/app-sidebar.d.ts +1 -1
  215. package/dist/components/layout/sidebar/components/sidebar-grouped-navigation.d.ts +1 -1
  216. package/dist/components/layout/sidebar/components/sidebar-navigation.d.ts +1 -1
  217. package/dist/components/layout/sidebar/index.d.ts +2 -1
  218. package/dist/components/layout/sidebar/sidebar-navigation-rail.d.ts +36 -0
  219. package/dist/components/layout/sidebar/sidebar.context.d.ts +5 -7
  220. package/dist/components/layout/sidebar/sidebar.types.d.ts +48 -10
  221. package/dist/components/layout/sidebar/sidebar.utils.d.ts +9 -1
  222. package/dist/components/layout/workspace/workspace.types.d.ts +8 -1
  223. package/dist/components/ui/alert-dialog.d.ts +2 -2
  224. package/dist/components/ui/combobox.d.ts +1 -1
  225. package/dist/components/ui/dialog.d.ts +2 -2
  226. package/dist/components/ui/overlay-layer.d.ts +18 -0
  227. package/dist/components/ui/sheet.d.ts +5 -1
  228. package/dist/components/ui/sidebar-state.d.ts +82 -0
  229. package/dist/components/ui/sidebar.d.ts +5 -17
  230. package/dist/{containers-CRmHf7GP.js → containers-CIxwbZt5.js} +26 -18
  231. package/dist/containers-CIxwbZt5.js.map +1 -0
  232. package/dist/{control-group-recipes-DBXmfh2E.js → control-group-recipes-fMuFo0H7.js} +6 -6
  233. package/dist/control-group-recipes-fMuFo0H7.js.map +1 -0
  234. package/dist/{copyable-CnGCZdX4.js → copyable-DIznBqiT.js} +7 -7
  235. package/dist/{copyable-CnGCZdX4.js.map → copyable-DIznBqiT.js.map} +1 -1
  236. package/dist/{data-display-D4oujtx0.js → data-display-BdgCAw8T.js} +268 -277
  237. package/dist/data-display-BdgCAw8T.js.map +1 -0
  238. package/dist/{date-Q7jnXxpk.js → date-Cq8ioE4o.js} +5 -5
  239. package/dist/{date-Q7jnXxpk.js.map → date-Cq8ioE4o.js.map} +1 -1
  240. package/dist/{date-picker-zOt1oNss.js → date-picker-RlIzKom_.js} +446 -437
  241. package/dist/date-picker-RlIzKom_.js.map +1 -0
  242. package/dist/{date-pickers-cj8IXbDC.js → date-pickers-DY-CpXS1.js} +12 -12
  243. package/dist/{date-pickers-cj8IXbDC.js.map → date-pickers-DY-CpXS1.js.map} +1 -1
  244. package/dist/{display-BB4BL_-K.js → display-KsZLw9Ov.js} +9 -9
  245. package/dist/{display-BB4BL_-K.js.map → display-KsZLw9Ov.js.map} +1 -1
  246. package/dist/dropdown-menu-CLs8Lihj.js +194 -0
  247. package/dist/dropdown-menu-CLs8Lihj.js.map +1 -0
  248. package/dist/features/activities.js +302 -253
  249. package/dist/features/activities.js.map +1 -1
  250. package/dist/features/ai-chat.js +15 -14
  251. package/dist/features/ai-chat.js.map +1 -1
  252. package/dist/features/appointment-calendar.js +22 -22
  253. package/dist/features/appointment-calendar.js.map +1 -1
  254. package/dist/features/async-preview.js +11 -10
  255. package/dist/features/async-preview.js.map +1 -1
  256. package/dist/features/combobox.js +1 -1
  257. package/dist/features/comments.js +1 -1
  258. package/dist/features/data-view.js +13 -13
  259. package/dist/features/data-view.js.map +1 -1
  260. package/dist/features/email-composer.js +237 -238
  261. package/dist/features/email-composer.js.map +1 -1
  262. package/dist/features/event-calendar.js +140 -146
  263. package/dist/features/event-calendar.js.map +1 -1
  264. package/dist/features/filters.js +1 -1
  265. package/dist/features/global-search.js +167 -138
  266. package/dist/features/global-search.js.map +1 -1
  267. package/dist/features/kanban.js +6 -7
  268. package/dist/features/kanban.js.map +1 -1
  269. package/dist/features/map.js +269 -260
  270. package/dist/features/map.js.map +1 -1
  271. package/dist/features/media-library.js +375 -326
  272. package/dist/features/media-library.js.map +1 -1
  273. package/dist/features/mentions.js +1 -1
  274. package/dist/features/overlays.js +1 -1
  275. package/dist/features/products.js +1266 -1193
  276. package/dist/features/products.js.map +1 -1
  277. package/dist/features/questionnaire.js +13 -13
  278. package/dist/features/questionnaire.js.map +1 -1
  279. package/dist/features/resource-assignment.js +8 -8
  280. package/dist/features/resource.js +69 -66
  281. package/dist/features/resource.js.map +1 -1
  282. package/dist/features/rich-text-editor.js +2 -2
  283. package/dist/features/schema-form.js +13 -13
  284. package/dist/features/suggestions.js +3 -3
  285. package/dist/features/sync.js +3 -3
  286. package/dist/features/table.js +1 -1
  287. package/dist/features/theme-tweaker.js +94 -95
  288. package/dist/features/theme-tweaker.js.map +1 -1
  289. package/dist/{feedback-DZNL5Lg1.js → feedback-Dm4izqFn.js} +80 -79
  290. package/dist/feedback-Dm4izqFn.js.map +1 -0
  291. package/dist/{field-affordance-recipes-DjwGx8eM.js → field-affordance-recipes-DWcNcOjh.js} +4 -4
  292. package/dist/field-affordance-recipes-DWcNcOjh.js.map +1 -0
  293. package/dist/{filters-BcT-uoFy.js → filters-DzgSJpMK.js} +693 -645
  294. package/dist/filters-DzgSJpMK.js.map +1 -0
  295. package/dist/{form-field-CsgRmdit.js → form-field-BriWAXyg.js} +6 -6
  296. package/dist/{form-field-CsgRmdit.js.map → form-field-BriWAXyg.js.map} +1 -1
  297. package/dist/{form-sizing-NXgjkmBG.js → form-sizing-Bs2qFUeE.js} +4 -4
  298. package/dist/form-sizing-Bs2qFUeE.js.map +1 -0
  299. package/dist/{forms-BV5m5aQF.js → forms-C0RGnJTe.js} +17 -13
  300. package/dist/forms-C0RGnJTe.js.map +1 -0
  301. package/dist/{forms-numeric-Cd33AKbD.js → forms-numeric-DIhghX1Q.js} +86 -82
  302. package/dist/forms-numeric-DIhghX1Q.js.map +1 -0
  303. package/dist/{header-BA697l4a.js → header-DMMxG__r.js} +67 -63
  304. package/dist/header-DMMxG__r.js.map +1 -0
  305. package/dist/header.recipes-BigdJjw1.js +6 -0
  306. package/dist/header.recipes-BigdJjw1.js.map +1 -0
  307. package/dist/{hooks-BQ-L7Uu2.js → hooks-DB6CJ4MR.js} +26 -14
  308. package/dist/hooks-DB6CJ4MR.js.map +1 -0
  309. package/dist/{icon-badge-COWbCCWu.js → icon-badge-DZF-YjQp.js} +4 -4
  310. package/dist/{icon-badge-COWbCCWu.js.map → icon-badge-DZF-YjQp.js.map} +1 -1
  311. package/dist/index.js +4 -5
  312. package/dist/{input-Cdw4k0fb.js → input-CvyDQlY7.js} +8 -8
  313. package/dist/{input-Cdw4k0fb.js.map → input-CvyDQlY7.js.map} +1 -1
  314. package/dist/input-DMBwAZmr.js +21 -0
  315. package/dist/input-DMBwAZmr.js.map +1 -0
  316. package/dist/{item-BvZ2DR_x.js → item-DjCcM18E.js} +16 -16
  317. package/dist/item-DjCcM18E.js.map +1 -0
  318. package/dist/layout/app-shell.js +1 -1
  319. package/dist/layout/auth.js +1 -1
  320. package/dist/layout/containers.js +1 -1
  321. package/dist/layout/header.js +1 -1
  322. package/dist/layout/hooks.js +1 -1
  323. package/dist/layout/navigation.js +1 -1
  324. package/dist/layout/page.js +2 -2
  325. package/dist/layout/settings.js +1 -1
  326. package/dist/layout/sidebar.js +3 -3
  327. package/dist/layout/workspace.js +1 -1
  328. package/dist/layout.js +11 -11
  329. package/dist/lib/affordance-geometry.generated.d.ts +35 -35
  330. package/dist/lib/control-group-recipes.d.ts +5 -5
  331. package/dist/lib/field-affordance-recipes.d.ts +2 -2
  332. package/dist/lib/motion-recipes.d.ts +3 -0
  333. package/dist/lib/navigation-row-recipes.d.ts +7 -7
  334. package/dist/lib/overlay-anatomy-recipes.d.ts +3 -3
  335. package/dist/lib/portal-recipes.d.ts +3 -0
  336. package/dist/lib/token-merge.generated.d.ts +13 -10
  337. package/dist/lib/utils.js +1 -1
  338. package/dist/map-demo-tile.svg +1 -1
  339. package/dist/{media-gallery-CSl5W1Fy.js → media-gallery-C-vChPmE.js} +6 -6
  340. package/dist/{media-gallery-CSl5W1Fy.js.map → media-gallery-C-vChPmE.js.map} +1 -1
  341. package/dist/{mentions-RKOQaaIB.js → mentions-0_4nWuI-.js} +10 -10
  342. package/dist/{mentions-RKOQaaIB.js.map → mentions-0_4nWuI-.js.map} +1 -1
  343. package/dist/{message-INU2xsxu.js → message-g8p7eVtN.js} +7 -7
  344. package/dist/message-g8p7eVtN.js.map +1 -0
  345. package/dist/{metadata-list-qVV7AVxa.js → metadata-list-C3MkU-Om.js} +64 -64
  346. package/dist/metadata-list-C3MkU-Om.js.map +1 -0
  347. package/dist/{motion-recipes-ChBg4HBq.js → motion-recipes-DitYv6P2.js} +10 -2
  348. package/dist/motion-recipes-DitYv6P2.js.map +1 -0
  349. package/dist/navigation-C90-oQFq.js +255 -0
  350. package/dist/navigation-C90-oQFq.js.map +1 -0
  351. package/dist/{navigation-BQNcg1jT.js → navigation-DaRjthVk.js} +101 -82
  352. package/dist/navigation-DaRjthVk.js.map +1 -0
  353. package/dist/{navigation-row-recipes-WZEs-hYo.js → navigation-row-recipes-BGVLvU_O.js} +9 -9
  354. package/dist/navigation-row-recipes-BGVLvU_O.js.map +1 -0
  355. package/dist/{number-E_OiIfJz.js → number-CRU3kGuk.js} +5 -5
  356. package/dist/{number-E_OiIfJz.js.map → number-CRU3kGuk.js.map} +1 -1
  357. package/dist/overflow-tab-bar-IVFVQFV6.js +172 -0
  358. package/dist/overflow-tab-bar-IVFVQFV6.js.map +1 -0
  359. package/dist/overlays-BSgCtM2v.js +1013 -0
  360. package/dist/overlays-BSgCtM2v.js.map +1 -0
  361. package/dist/page-DUUKDAjo.js +331 -0
  362. package/dist/page-DUUKDAjo.js.map +1 -0
  363. package/dist/page-header-commands-7P3sfE9u.js +193 -0
  364. package/dist/page-header-commands-7P3sfE9u.js.map +1 -0
  365. package/dist/{pagination-Ch8X_47u.js → pagination-CgCjElfu.js} +7 -7
  366. package/dist/{pagination-Ch8X_47u.js.map → pagination-CgCjElfu.js.map} +1 -1
  367. package/dist/popover-B85RenIl.js +201 -0
  368. package/dist/popover-B85RenIl.js.map +1 -0
  369. package/dist/{popover-menu-BYaCdFhf.js → popover-menu-DlnQ2zlR.js} +7 -7
  370. package/dist/{popover-menu-BYaCdFhf.js.map → popover-menu-DlnQ2zlR.js.map} +1 -1
  371. package/dist/{popover.recipes-D3j8R8Yp.js → popover.recipes-DdiEp0rd.js} +18 -11
  372. package/dist/popover.recipes-DdiEp0rd.js.map +1 -0
  373. package/dist/portal-recipes-BpsV_iRw.js +9 -0
  374. package/dist/portal-recipes-BpsV_iRw.js.map +1 -0
  375. package/dist/{primitives-Du64iDbb.js → primitives-ByWgGUgt.js} +5 -5
  376. package/dist/{primitives-Du64iDbb.js.map → primitives-ByWgGUgt.js.map} +1 -1
  377. package/dist/primitives.js +4 -4
  378. package/dist/{progress-BvF2oCdV.js → progress-BJhQP9WX.js} +9 -9
  379. package/dist/{progress-BvF2oCdV.js.map → progress-BJhQP9WX.js.map} +1 -1
  380. package/dist/{receipt-D789Jwyy.js → receipt-tOc7B3hw.js} +7 -7
  381. package/dist/receipt-tOc7B3hw.js.map +1 -0
  382. package/dist/{rich-text-CLJEf76s.js → rich-text-Dth5E882.js} +3 -3
  383. package/dist/{rich-text-CLJEf76s.js.map → rich-text-Dth5E882.js.map} +1 -1
  384. package/dist/{rich-text-editor-Cm1dpUpQ.js → rich-text-editor-C1fOjBTd.js} +429 -430
  385. package/dist/rich-text-editor-C1fOjBTd.js.map +1 -0
  386. package/dist/{rich-text-editor-toolbar-L__e4x47.js → rich-text-editor-toolbar-laT3tpBT.js} +32 -28
  387. package/dist/rich-text-editor-toolbar-laT3tpBT.js.map +1 -0
  388. package/dist/{scroll-area-La5RXsEk.js → scroll-area-B0dB2cBi.js} +2 -2
  389. package/dist/{scroll-area-La5RXsEk.js.map → scroll-area-B0dB2cBi.js.map} +1 -1
  390. package/dist/{separator-DAEV0w65.js → separator-Bb17I4pu.js} +2 -2
  391. package/dist/{separator-DAEV0w65.js.map → separator-Bb17I4pu.js.map} +1 -1
  392. package/dist/{separator-GNfPG-90.js → separator-Ct_WSWTJ.js} +3 -3
  393. package/dist/{separator-GNfPG-90.js.map → separator-Ct_WSWTJ.js.map} +1 -1
  394. package/dist/services/actions.js +1 -1
  395. package/dist/{settings-BA2iboic.js → settings-Bar5wiSo.js} +31 -38
  396. package/dist/settings-Bar5wiSo.js.map +1 -0
  397. package/dist/sheet-BGPERY55.js +250 -0
  398. package/dist/sheet-BGPERY55.js.map +1 -0
  399. package/dist/sidebar-D-JYMMbY.js +686 -0
  400. package/dist/sidebar-D-JYMMbY.js.map +1 -0
  401. package/dist/sidebar-f9gRWXIR.js +1001 -0
  402. package/dist/sidebar-f9gRWXIR.js.map +1 -0
  403. package/dist/skeleton-BapcJd9C.js +265 -0
  404. package/dist/skeleton-BapcJd9C.js.map +1 -0
  405. package/dist/smart-card-CW0hjetE.js +617 -0
  406. package/dist/smart-card-CW0hjetE.js.map +1 -0
  407. package/dist/{structure-C0V0_Fyf.js → structure-DuxKl954.js} +2 -2
  408. package/dist/{structure-C0V0_Fyf.js.map → structure-DuxKl954.js.map} +1 -1
  409. package/dist/style.css +1 -1
  410. package/dist/{table-CpvnzJn9.js → table-B4TE7iOV.js} +3 -3
  411. package/dist/{table-CpvnzJn9.js.map → table-B4TE7iOV.js.map} +1 -1
  412. package/dist/{table-DH7rozUv.js → table-CFOWY9pQ.js} +394 -388
  413. package/dist/table-CFOWY9pQ.js.map +1 -0
  414. package/dist/{tabs-eqVsJZWO.js → tabs-e7ko9S2o.js} +11 -11
  415. package/dist/tabs-e7ko9S2o.js.map +1 -0
  416. package/dist/{text-inputs-DXItiR0O.js → text-inputs-B1culiSK.js} +17 -17
  417. package/dist/text-inputs-B1culiSK.js.map +1 -0
  418. package/dist/theme.css +40 -37
  419. package/dist/{timelines-DmtztAY_.js → timelines-D3Sl9ueq.js} +13 -12
  420. package/dist/timelines-D3Sl9ueq.js.map +1 -0
  421. package/dist/tooltip-8wz5S_Zr.js +113 -0
  422. package/dist/tooltip-8wz5S_Zr.js.map +1 -0
  423. package/dist/{tree-CV11PURP.js → tree-CzUJHnFs.js} +8 -8
  424. package/dist/{tree-CV11PURP.js.map → tree-CzUJHnFs.js.map} +1 -1
  425. package/dist/typography/rich-text.js +1 -1
  426. package/dist/{typography-CSyJrh28.js → typography-BQnine1k.js} +12 -12
  427. package/dist/{typography-CSyJrh28.js.map → typography-BQnine1k.js.map} +1 -1
  428. package/dist/typography.js +1 -1
  429. package/dist/ui-provider-C-74NVLc.js +178 -0
  430. package/dist/ui-provider-C-74NVLc.js.map +1 -0
  431. package/dist/ui-provider.js +2 -3
  432. package/dist/{upload-C9SA0X-8.js → upload-BOW6U2tI.js} +25 -24
  433. package/dist/upload-BOW6U2tI.js.map +1 -0
  434. package/dist/{upload-queue-DhQJiSRc.js → upload-queue-qUXn1ykN.js} +16 -14
  435. package/dist/upload-queue-qUXn1ykN.js.map +1 -0
  436. package/dist/{usage-card-DVTRDmGz.js → usage-card-BeSLY0i0.js} +24 -17
  437. package/dist/usage-card-BeSLY0i0.js.map +1 -0
  438. package/dist/{utils-CF3c95Io.js → utils-B6kKb8jB.js} +237 -141
  439. package/dist/utils-B6kKb8jB.js.map +1 -0
  440. package/dist/value-inputs-skdVB2zh.js +980 -0
  441. package/dist/value-inputs-skdVB2zh.js.map +1 -0
  442. package/dist/{value-typography-ClupF0Gz.js → value-typography-uAmWUAL1.js} +2 -2
  443. package/dist/{value-typography-ClupF0Gz.js.map → value-typography-uAmWUAL1.js.map} +1 -1
  444. package/dist/{workspace-9EFVXUyk.js → workspace-DHeHv0qw.js} +50 -49
  445. package/dist/workspace-DHeHv0qw.js.map +1 -0
  446. package/docs/consumer-skill/SKILL.md +4 -3
  447. package/docs/consumer-skill/agents/themelia-ui-designer.md +96 -0
  448. package/docs/consumer-skill/examples/app-layout.tsx +52 -1
  449. package/docs/consumer-skill/examples/commerce-lines.tsx +271 -0
  450. package/docs/consumer-skill/examples/custom-composition.tsx +21 -0
  451. package/docs/consumer-skill/examples/detail.tsx +5 -4
  452. package/docs/consumer-skill/examples/editable-sections.tsx +38 -0
  453. package/docs/consumer-skill/examples/index-table.tsx +4 -4
  454. package/docs/consumer-skill/examples/manifest.json +38 -1
  455. package/docs/consumer-skill/examples/product-media.tsx +41 -0
  456. package/docs/consumer-skill/examples/product-parts.tsx +81 -0
  457. package/docs/consumer-skill/examples/rhf-edit-page.tsx +1 -1
  458. package/docs/consumer-skill/examples/rhf-overlay-form.tsx +24 -11
  459. package/docs/consumer-skill/examples/token-domain-structure.tsx +68 -0
  460. package/docs/consumer-skill/references/agents-md.md +19 -17
  461. package/docs/consumer-skill/references/analytics.md +18 -1
  462. package/docs/consumer-skill/references/commerce-composition.md +97 -0
  463. package/docs/consumer-skill/references/component-contracts.json +7131 -1754
  464. package/docs/consumer-skill/references/composition-mapping.md +17 -3
  465. package/docs/consumer-skill/references/composition.md +159 -31
  466. package/docs/consumer-skill/references/critique-rubric.md +98 -0
  467. package/docs/consumer-skill/references/custom-composition.md +261 -0
  468. package/docs/consumer-skill/references/data-reading.md +79 -0
  469. package/docs/consumer-skill/references/design-contract.md +11 -9
  470. package/docs/consumer-skill/references/discovery.md +27 -3
  471. package/docs/consumer-skill/references/domain-structures.md +124 -0
  472. package/docs/consumer-skill/references/installation.md +15 -4
  473. package/docs/consumer-skill/references/integration.md +35 -0
  474. package/docs/consumer-skill/references/product-composition.md +94 -0
  475. package/docs/consumer-skill/references/public-api.json +2881 -420
  476. package/docs/consumer-skill/references/review.md +39 -2
  477. package/docs/consumer-skill/references/rhf-workflows.md +7 -0
  478. package/docs/consumer-skill/references/screen-archetypes.md +19 -7
  479. package/docs/consumer-skill/references/screen-decisions.md +126 -0
  480. package/docs/consumer-skill/references/theming.md +17 -18
  481. package/docs/consumer-skill/references/tokens.json +9 -9
  482. package/docs/consumer-skill/references/view-craft.md +153 -0
  483. package/docs/consumer-skill/references/view-spec.md +73 -0
  484. package/docs/consumer-skill/references/workflows.md +7 -1
  485. package/docs/consumer-skill/scripts/composition-policy.mjs +39 -3
  486. package/docs/consumer-skill/scripts/composition-schema.mjs +1 -1
  487. package/docs/consumer-skill/scripts/composition.mjs +61 -5
  488. package/docs/consumer-skill/scripts/discovery.mjs +54 -0
  489. package/docs/consumer-skill/scripts/inspect-component.mjs +1 -1
  490. package/docs/consumer-skill/scripts/inspection.mjs +73 -18
  491. package/docs/consumer-skill/scripts/setup-skills.mjs +41 -6
  492. package/docs/consumer-skill/scripts/surface-policy.mjs +5 -5
  493. package/docs/consumer-skills/themelia-components/SKILL.md +14 -13
  494. package/docs/consumer-skills/themelia-composition/SKILL.md +16 -17
  495. package/docs/consumer-skills/themelia-design/SKILL.md +55 -0
  496. package/docs/consumer-skills/themelia-foundation/SKILL.md +2 -1
  497. package/docs/consumer-skills/themelia-tokenization/SKILL.md +24 -17
  498. package/package.json +1 -1
  499. package/dist/accordion-96o0pN62.js.map +0 -1
  500. package/dist/action-menu-CHgs8vmj.js.map +0 -1
  501. package/dist/affordance-geometry.generated-B8yGOr8-.js.map +0 -1
  502. package/dist/ai-artifact-BZUGwBq6.js.map +0 -1
  503. package/dist/app-shell-D63ATkIK.js +0 -237
  504. package/dist/app-shell-D63ATkIK.js.map +0 -1
  505. package/dist/auth-D2FVZ1MH.js.map +0 -1
  506. package/dist/avatar-DWO_HHhB.js.map +0 -1
  507. package/dist/base/cascader.js.map +0 -1
  508. package/dist/batch-action-bar-CdfIkCsV.js.map +0 -1
  509. package/dist/button-DkmK-z8E.js.map +0 -1
  510. package/dist/buttons-BbfzgczK.js.map +0 -1
  511. package/dist/cards-4JTWqvVe.js +0 -68
  512. package/dist/cards-4JTWqvVe.js.map +0 -1
  513. package/dist/chart-C19flDQb.js +0 -155
  514. package/dist/chart-C19flDQb.js.map +0 -1
  515. package/dist/choice-inputs-JLtij2y4.js.map +0 -1
  516. package/dist/code-block-CGNaUtAE.js.map +0 -1
  517. package/dist/combobox-CBJDs6w_.js.map +0 -1
  518. package/dist/combobox-hbhSS18O.js +0 -355
  519. package/dist/combobox-hbhSS18O.js.map +0 -1
  520. package/dist/command-D8NrBj-b.js.map +0 -1
  521. package/dist/containers-CRmHf7GP.js.map +0 -1
  522. package/dist/control-group-recipes-DBXmfh2E.js.map +0 -1
  523. package/dist/data-display-D4oujtx0.js.map +0 -1
  524. package/dist/date-picker-zOt1oNss.js.map +0 -1
  525. package/dist/dropdown-menu-CjY8Vt7W.js +0 -193
  526. package/dist/dropdown-menu-CjY8Vt7W.js.map +0 -1
  527. package/dist/feedback-DZNL5Lg1.js.map +0 -1
  528. package/dist/field-affordance-recipes-DjwGx8eM.js.map +0 -1
  529. package/dist/filters-BcT-uoFy.js.map +0 -1
  530. package/dist/form-sizing-NXgjkmBG.js.map +0 -1
  531. package/dist/forms-BV5m5aQF.js.map +0 -1
  532. package/dist/forms-numeric-Cd33AKbD.js.map +0 -1
  533. package/dist/header-BA697l4a.js.map +0 -1
  534. package/dist/hooks-BQ-L7Uu2.js.map +0 -1
  535. package/dist/input-DOPL5_QE.js +0 -21
  536. package/dist/input-DOPL5_QE.js.map +0 -1
  537. package/dist/item-BvZ2DR_x.js.map +0 -1
  538. package/dist/message-INU2xsxu.js.map +0 -1
  539. package/dist/metadata-list-qVV7AVxa.js.map +0 -1
  540. package/dist/motion-recipes-ChBg4HBq.js.map +0 -1
  541. package/dist/navigation-BQNcg1jT.js.map +0 -1
  542. package/dist/navigation-DLF3E1IC.js +0 -145
  543. package/dist/navigation-DLF3E1IC.js.map +0 -1
  544. package/dist/navigation-row-recipes-WZEs-hYo.js.map +0 -1
  545. package/dist/overflow-tab-bar-CrbqMteP.js +0 -284
  546. package/dist/overflow-tab-bar-CrbqMteP.js.map +0 -1
  547. package/dist/overlays-BlKynmde.js +0 -1004
  548. package/dist/overlays-BlKynmde.js.map +0 -1
  549. package/dist/page-CIwNUtGr.js +0 -227
  550. package/dist/page-CIwNUtGr.js.map +0 -1
  551. package/dist/page-header-commands-DFMlNYzN.js +0 -128
  552. package/dist/page-header-commands-DFMlNYzN.js.map +0 -1
  553. package/dist/popover-uwzX2vo7.js +0 -198
  554. package/dist/popover-uwzX2vo7.js.map +0 -1
  555. package/dist/popover.recipes-D3j8R8Yp.js.map +0 -1
  556. package/dist/receipt-D789Jwyy.js.map +0 -1
  557. package/dist/rich-text-editor-Cm1dpUpQ.js.map +0 -1
  558. package/dist/rich-text-editor-toolbar-L__e4x47.js.map +0 -1
  559. package/dist/settings-BA2iboic.js.map +0 -1
  560. package/dist/sheet-DoAxTb2J.js +0 -213
  561. package/dist/sheet-DoAxTb2J.js.map +0 -1
  562. package/dist/sidebar-ByqKR_W5.js +0 -512
  563. package/dist/sidebar-ByqKR_W5.js.map +0 -1
  564. package/dist/sidebar-D2iSnGJ7.js +0 -619
  565. package/dist/sidebar-D2iSnGJ7.js.map +0 -1
  566. package/dist/skeleton-CUj8O5Bd.js +0 -264
  567. package/dist/skeleton-CUj8O5Bd.js.map +0 -1
  568. package/dist/smart-card-CqkzQsK-.js +0 -614
  569. package/dist/smart-card-CqkzQsK-.js.map +0 -1
  570. package/dist/table-DH7rozUv.js.map +0 -1
  571. package/dist/tabs-eqVsJZWO.js.map +0 -1
  572. package/dist/text-inputs-DXItiR0O.js.map +0 -1
  573. package/dist/theme-scope-BJ6eE2xt.js +0 -50
  574. package/dist/theme-scope-BJ6eE2xt.js.map +0 -1
  575. package/dist/timelines-DmtztAY_.js.map +0 -1
  576. package/dist/tooltip-B4hjKtoV.js +0 -111
  577. package/dist/tooltip-B4hjKtoV.js.map +0 -1
  578. package/dist/ui-provider-CQCuCBcy.js +0 -136
  579. package/dist/ui-provider-CQCuCBcy.js.map +0 -1
  580. package/dist/upload-C9SA0X-8.js.map +0 -1
  581. package/dist/upload-queue-DhQJiSRc.js.map +0 -1
  582. package/dist/usage-card-DVTRDmGz.js.map +0 -1
  583. package/dist/use-mobile-vaLKwgyf.js +0 -15
  584. package/dist/use-mobile-vaLKwgyf.js.map +0 -1
  585. package/dist/utils-CF3c95Io.js.map +0 -1
  586. package/dist/value-inputs-C0o70p-U.js +0 -980
  587. package/dist/value-inputs-C0o70p-U.js.map +0 -1
  588. package/dist/workspace-9EFVXUyk.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-CFOWY9pQ.js","names":["NumberValue","PaginationRoot","_Fragment","_Fragment","Link","NumberValue","DateValue","Link","DateValue","resolveComponentScale","useDensityConfig","cn","Button","Text","DisplayLabel","TextLink","focusRecipes","Stack","popoverWidthRecipes","ActionMenu","ActionButtons","interactionRecipes","Value","Phone","Name","MutedValue","FileSize","Url","MonoValue","Email","EmptyValue","Link$1","Initials","formatInitials","Percent","Money","Number$1","Time","RelativeTime","DateTime","parseDateInput","DatePrimitive","AvatarFallback","Avatar","AvatarImage","Badge","BatchActionBar","Separator","Input","Checkbox","segmentedControlRecipes","controlGroupHeightClasses","PaginationNext","defaultPaginationStrings","PaginationLink","PaginationEllipsis","PaginationPrevious","PaginationItem","PaginationPrimitive","PaginationContent","TableRow","TableCell","TableBody","TableHead","TableHeader","Table","EmptyState","React","Fragment$1","SCROLL_AMOUNT_DEFAULT","getDataTableScrollContainer","tableArea","useDataTableScrollState","options","canScrollLeft","setCanScrollLeft","useState","canScrollRight","setCanScrollRight","rafRef","useRef","measure","useCallback","el","tableAreaRef","scrollLeft","clientWidth","scrollWidth","detach","timerId","handleScroll","ro","deps","scrollBy","delta","stepPx","EDITABLE_VALUES","FOCUSABLE_SELECTOR","getOwnedTableRegions","regions","region","index","trigger","id","controlled","useFullscreenTableModality","onExitRef","onExit","useEffect","active","opener","previousBodyOverflow","tabDirection","mounted","containsFocus","current","owner","getFocusables","node","isChildDialog","dialog","handleKeyDown","regionRef","event","focusables","first","last","inside","handleFocusIn","handlePointerDown","guardedRegion","fallbackTitleCase","formatted","value","char","defaultDataTableStrings","currentLabel","columnId","selected","total","columnLabel","direction","priority","mergeNested","defaults","overrides","mergeDataTableStrings","generatePageNumbers","lastPage","i","pages","currentPage","start","end","buildPageUrl","params","queryKey","page","basePath","Pagination","paginationLabels","labels","primitiveStrings","pageQueryKey","firstItem","pagination","lastItem","navigateToPage","url","onPageChange","hasPrevious","hasNext","SecondaryValue","e","isEllipsis","itemKey","DataTableActions","providedStrings","props","strings","resolvedMenuLabel","menuLabel","resolvedActions","useMemo","base","actions","row","visibleActions","evalFlag","flag","visible","action","hasVisibleActions","isNarrow","setIsNarrow","nonDestructive","destructive","sortedActions","displayMode","handleResize","responsiveBreakpoint","mode","actionDefinitions","idx","handleRowSelectionChange","updatedSelection","setInternalState","newState","prevState","externalHandler","handleSortingChange","updatedSorting","handleColumnVisibilityChange","updatedVisibility","getRowClassName","className","isSelected","rowClassName","getCellClassName","baseClassName","cellClassName","stickyFirstColumn","isFirstColumn","getSelectedRowsData","table","createRowSelectionCheckbox","checked","createHeaderSelectionCheckbox","addSelectionColumn","columns","rowControlSelector","DataTableBody","tableRows","resolvedEmptyStateMessage","emptyStateMessage","isRowSelected","rowCells","computedRowClassName","rowIndex","zebraClass","striped","cursorClass","onRowClick","rowClasses","target","control","cell","cellIndex","flexRender","PackageOpen","emptyStateAction","DataTableHeader","headerGroups","sortDescriptionId","sorting","stickyCellClassName","stickyHeader","headerTransparent","getColumnGroup","columnGroups","group","headerClassName","headers","currentGroup","groupSpan","groupCells","groupName","header","headerGroup","cellClasses","enableResizing","headerStyle","headerSortDescriptionId","resizeHandler","resizeLeaves","leaf","minSize","sum","maxSize","startResize","previous","isResizing","rawHeader","canSort","sortDir","headerNode","SortIcon","ArrowUp","ArrowDown","ChevronsUpDown","rtl","size","ratio","min","max","next","ColumnVisibilityToggle","column","showVisualLabel","labelVisibility","columnName","Settings2","buttonClass","FullscreenToggle","label","fullscreen","exitLabel","enterLabel","Icon","Minimize2","Maximize2","onFullscreenChange","SCROLL_AMOUNT","btnBase","ToolbarIconButton","getScrollContainer","DataTableToolbar","defaultScale","cleanupRef","checkOverflow","handleScrollLeft","handleScrollRight","hideableColumns","enableColumnVisibility","hasScrollArrows","hasColumns","hasFullscreen","showFullscreenToggle","ChevronLeft","ChevronRight","DataTableSizeContext","createContext","useDataTableSize","useContext","densityByDataTableSize","textSizeByDataTableSize","toCssSize","withTextFilter","filterColumn","DataTable","controlledFullscreen","controlledRowSelection","controlledSorting","controlledColumnVisibility","stringsOverride","totalRowCountProp","resolvedSize","tableRowClasses","resolvedPageQueryKey","resolvedMaxBodyHeight","maxBodyHeight","resolvedColumns","formattedStorageKey","storageKey","initialColumnVisibility","explicitDefault","defaultColumnVisibility","initialState","stored","internalSorting","setInternalSorting","defaultSorting","columnFilters","setColumnFilters","internalColumnVisibility","setInternalColumnVisibility","internalRowSelection","setInternalRowSelection","internalFullscreen","setInternalFullscreen","defaultFullscreen","columnVisibility","rowSelection","lastTableFocusRef","selectionReturnFocusRef","rememberTableFocus","handleColumnFiltersChange","nextFilters","updater","onColumnFiltersChange","handleSortingChangeCallback","nextSorting","onSortingChange","handleVisibilityChangeCallback","nextVisibility","onColumnVisibilityChange","handleRowSelectionChangeCallback","nextRowSelection","onRowSelectionChange","fullscreenRegionRef","handleFullscreenChange","nextFullscreen","getRowActionsMenuLabel","rowActionsMenuLabel","columnsWithActions","searchableColumns","enableFiltering","baseColumns","enableRowSelection","rowActions","actionCol","rowActionsDisplayMode","rowActionsBreakpoint","useReactTable","enableSorting","getCoreRowModel","getFilteredRowModel","getSortedRowModel","filterTarget","searchPlaceholder","filterPlaceholder","shouldShow","selectedRows","selectedRowCount","clearSelection","totalRowCount","data","selectionToolbarContext","selectionToolbarNode","selectionToolbar","bulkActionNode","bulkActions","bar","selectionToolbarPlacement","selectionToolbarClassName","count","tableAreaStyle","shouldUseScrollableTableContainer","fillAvailableHeight","Provider","resolvedTextSize","surface","wrapperClassName","topbarContent","topbarEnd","stickyToolbar","topbarClassName","toolbarLabelVisibility","innerClassName","tableContainerClassName","footerContent","DataTableFilterBar","customContent","isMissingPrimitive","isMissingDisplay","isDescriptor","isValidElement","isTuple","normalizeTuple","rawValue","kind","normalizeCellValue","descriptor","stringValue","renderPrimitiveCellValue","isPrimary","display","resolvedEmptyLabel","emptyLabel","resolvedClassName","weight","primaryWeight","href","CellValue","isMissing","missing","children","fallback","CellStack","visibleValues","values","itemClassName","primaryClassName","secondaryClassName","TableLink","renderResourceBadge","badge","renderResourceMetadata","metadata","item","ResourceCell","IconComponent","title","titleText","initials","content","contentClassName","titleClassName","badges","subtitle","subtitleClassName","hasFallback","hasMedia","imageUrl","square","mediaShape","mediaClassName","linkClassName","renderLink","StatusCell","map","entry","StatusClusterCell","visibleItems","items","badgeClassName","DateCell","Calendar","date","showIcon","DateMetaCell","secondaryNode","secondary","CurrencyCell","currency","AvatarCell","Mail","name"],"sources":["../src/components/features/table/hooks.ts","../src/components/features/table/table.strings.ts","../src/components/features/table/pagination.tsx","../src/components/features/table/table-actions.tsx","../src/components/features/table/table-helpers.tsx","../src/components/features/table/table-body.tsx","../src/components/features/table/table-header.tsx","../src/components/features/table/column-visibility-toggle.tsx","../src/components/features/table/partials/fullscreen-toggle.tsx","../src/components/features/table/table-toolbar.tsx","../src/components/features/table/data-table.tsx","../src/components/features/table/filter-bar.tsx","../src/components/features/table/partials/cell-value.tsx","../src/components/features/table/partials/table-link.tsx","../src/components/features/table/partials/resource-cell.tsx","../src/components/features/table/partials/cell-renderers.tsx"],"sourcesContent":["/**\n * Reusable hooks for DataTable consumers building custom toolbars or chrome.\n *\n * The default `DataTableToolbar` already wires these internally; expose them\n * for consumers that need horizontal-scroll arrows in a\n * custom layout (e.g. inside a hero banner above the table).\n */\nimport { useCallback, useEffect, useRef, useState, type RefObject } from 'react';\n\nconst SCROLL_AMOUNT_DEFAULT = 300;\n\n/**\n * Locate the actual horizontally-scrollable element inside a `tableArea`\n * wrapper. The shadcn-style Table primitive renders a\n * `<div data-slot=\"table-container\" class=\"overflow-x-auto\">` we target.\n */\nexport function getDataTableScrollContainer(\n\ttableArea: HTMLDivElement | null,\n): HTMLDivElement | null {\n\tif (!tableArea) return null;\n\treturn tableArea.querySelector<HTMLDivElement>('[data-slot=\"table-container\"]');\n}\n\nexport interface UseDataTableScrollStateReturn {\n\tcanScrollLeft: boolean;\n\tcanScrollRight: boolean;\n\tscrollBy: (delta: number) => void;\n\tscrollLeft: () => void;\n\tscrollRight: () => void;\n}\n\n/**\n * Track horizontal-overflow state for a DataTable wrapper. Returns booleans\n * for whether each scroll direction is available, plus helpers to nudge the\n * scroll container by a fixed amount.\n *\n * Pass the same `RefObject<HTMLDivElement>` you pass to `<DataTable>` as\n * `tableAreaRef`.\n */\nexport function useDataTableScrollState(\n\ttableAreaRef: RefObject<HTMLDivElement | null>,\n\toptions: { stepPx?: number; deps?: ReadonlyArray<unknown> } = {},\n): UseDataTableScrollStateReturn {\n\tconst { stepPx = SCROLL_AMOUNT_DEFAULT, deps = [] } = options;\n\tconst [canScrollLeft, setCanScrollLeft] = useState(false);\n\tconst [canScrollRight, setCanScrollRight] = useState(false);\n\tconst rafRef = useRef(0);\n\n\tconst measure = useCallback(() => {\n\t\tconst el = getDataTableScrollContainer(tableAreaRef.current);\n\t\tif (!el) {\n\t\t\tsetCanScrollLeft(false);\n\t\t\tsetCanScrollRight(false);\n\t\t\treturn;\n\t\t}\n\t\tconst { scrollLeft, scrollWidth, clientWidth } = el;\n\t\tsetCanScrollLeft(scrollLeft > 1);\n\t\tsetCanScrollRight(scrollLeft + clientWidth < scrollWidth - 1);\n\t}, [tableAreaRef]);\n\n\tuseEffect(() => {\n\t\tlet detach: (() => void) | undefined;\n\t\tconst timerId = window.setTimeout(() => {\n\t\t\tmeasure();\n\t\t\tconst el = getDataTableScrollContainer(tableAreaRef.current);\n\t\t\tif (!el) return;\n\n\t\t\tconst handleScroll = () => {\n\t\t\t\tcancelAnimationFrame(rafRef.current);\n\t\t\t\trafRef.current = requestAnimationFrame(measure);\n\t\t\t};\n\n\t\t\tel.addEventListener('scroll', handleScroll, { passive: true });\n\t\t\tconst ro = new ResizeObserver(measure);\n\t\t\tro.observe(el);\n\t\t\tif (el.firstElementChild) ro.observe(el.firstElementChild);\n\n\t\t\tdetach = () => {\n\t\t\t\tel.removeEventListener('scroll', handleScroll);\n\t\t\t\tcancelAnimationFrame(rafRef.current);\n\t\t\t\tro.disconnect();\n\t\t\t};\n\t\t}, 0);\n\n\t\treturn () => {\n\t\t\twindow.clearTimeout(timerId);\n\t\t\tdetach?.();\n\t\t};\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [tableAreaRef, measure, ...deps]);\n\n\tconst scrollBy = useCallback(\n\t\t(delta: number) => {\n\t\t\tgetDataTableScrollContainer(tableAreaRef.current)?.scrollBy({\n\t\t\t\tleft: delta,\n\t\t\t\tbehavior: 'smooth',\n\t\t\t});\n\t\t},\n\t\t[tableAreaRef],\n\t);\n\n\tconst scrollLeft = useCallback(() => scrollBy(-stepPx), [scrollBy, stepPx]);\n\tconst scrollRight = useCallback(() => scrollBy(stepPx), [scrollBy, stepPx]);\n\n\treturn { canScrollLeft, canScrollRight, scrollBy, scrollLeft, scrollRight };\n}\n\nconst EDITABLE_VALUES = new Set(['', 'true', 'plaintext-only']);\nconst FOCUSABLE_SELECTOR = [\n\t'a[href]',\n\t'button:not([disabled])',\n\t'input:not([disabled])',\n\t'select:not([disabled])',\n\t'textarea:not([disabled])',\n\t'summary',\n\t'[contenteditable]',\n\t'[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\n/** Follow the public control relationship rather than depending on portal markup. */\nfunction getOwnedTableRegions(region: HTMLElement): HTMLElement[] {\n\tconst regions = [region];\n\tfor (let index = 0; index < regions.length; index++) {\n\t\tfor (const trigger of regions[index].querySelectorAll('[aria-controls]:not([aria-expanded=\"false\"])')) {\n\t\t\tfor (const id of (trigger.getAttribute('aria-controls') ?? '').split(/\\s+/)) {\n\t\t\t\tconst controlled = region.ownerDocument.getElementById(id);\n\t\t\t\tif (controlled && !regions.includes(controlled)) regions.push(controlled);\n\t\t\t}\n\t\t}\n\t}\n\treturn regions;\n}\n\n/**\n * Modal behaviour for the full-screen table.\n *\n * Full-screen mode paints `fixed inset-0` over the entire viewport — the app's\n * own header and navigation included — which makes it modal in every way that\n * matters to a user. It shipped with none of the contract that implies: Escape\n * did nothing, Tab walked out into the page underneath that nobody can see, and\n * assistive technology was never told the rest of the document was unavailable.\n *\n * `aria-modal` on the region covers the announcement. This covers the rest:\n * Escape leaves, Tab cycles inside, and focus returns to the control that\n * opened it so keyboard users are not dropped at the top of the document.\n */\nexport function useFullscreenTableModality(\n\tactive: boolean,\n\tregionRef: RefObject<HTMLElement | null>,\n\tonExit: () => void,\n): void {\n\tconst onExitRef = useRef(onExit);\n\tonExitRef.current = onExit;\n\n\tuseEffect(() => {\n\t\tif (!active || typeof document === 'undefined') return;\n\n\t\tconst opener = document.activeElement as HTMLElement | null;\n\t\tconst previousBodyOverflow = document.body.style.overflow;\n\t\tdocument.body.style.overflow = 'hidden';\n\t\tlet tabDirection: 'forward' | 'backward' | undefined;\n\t\tlet mounted = true;\n\t\tconst containsFocus = (region: HTMLElement, current: Element | null) =>\n\t\t\tcurrent instanceof Node && getOwnedTableRegions(region).some(owner => owner.contains(current));\n\t\tconst getFocusables = (region: HTMLElement) => Array.from(\n\t\t\tregion.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n\t\t).filter(node => (node.tabIndex >= 0\n\t\t\t// An editable root is naturally tabbable despite reporting tabIndex -1.\n\t\t\t// Nested editors and an explicit negative tabIndex keep native opt-out.\n\t\t\t|| (EDITABLE_VALUES.has(node.getAttribute('contenteditable')?.toLowerCase() ?? 'false') && !node.hasAttribute('tabindex') && !node.parentElement?.isContentEditable))\n\t\t\t&& !node.matches(':disabled') && !node.closest('[inert], [hidden]')\n\t\t\t&& !['hidden', 'collapse'].includes(getComputedStyle(node).visibility)\n\t\t\t&& (node.offsetParent !== null || node === document.activeElement));\n\t\tconst isChildDialog = (current: Element | null, region: HTMLElement) => {\n\t\t\t// Base UI traps focus through the semantic dialog role; aria-modal is\n\t\t\t// not required, and a scoped portal may stay inside the table's DOM.\n\t\t\tconst dialog = current?.closest('[role=\"dialog\"], [role=\"alertdialog\"], [aria-modal=\"true\"]');\n\t\t\treturn !!dialog && dialog !== region;\n\t\t};\n\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tconst region = regionRef.current;\n\t\t\tif (!region || event.defaultPrevented || event.isComposing) return;\n\t\t\tif (isChildDialog(document.activeElement, region)) return;\n\t\t\ttabDirection = event.key === 'Tab' ? event.shiftKey ? 'backward' : 'forward' : undefined;\n\n\t\t\tif (event.key === 'Escape') {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\tonExitRef.current();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.key !== 'Tab') return;\n\n\t\t\tconst current = document.activeElement;\n\t\t\t// Child popups retain their own Tab/Shift+Tab routing and dismissal.\n\t\t\tif (current && !region.contains(current) && containsFocus(region, current)) return;\n\t\t\tconst focusables = getFocusables(region);\n\t\t\tif (focusables.length === 0) return;\n\n\t\t\tconst first = focusables[0];\n\t\t\tconst last = focusables[focusables.length - 1];\n\t\t\tconst inside = current instanceof Node && region.contains(current);\n\n\t\t\tif (event.shiftKey && (!inside || current === first)) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tlast.focus();\n\t\t\t} else if (!event.shiftKey && (!inside || current === last)) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tfirst.focus();\n\t\t\t}\n\t\t};\n\t\tconst handleFocusIn = () => {\n\t\t\tif (!tabDirection) return;\n\t\t\t// A portal's focus guard may route through a temporary outside node.\n\t\t\t// Check after that synchronous routing and recover only a real escape.\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tconst region = regionRef.current;\n\t\t\t\tif (!mounted || !region || !tabDirection || containsFocus(region, document.activeElement) || isChildDialog(document.activeElement, region)) return;\n\t\t\t\tconst focusables = getFocusables(region);\n\t\t\t\t(tabDirection === 'backward' ? focusables.at(-1) : focusables[0])?.focus();\n\t\t\t});\n\t\t};\n\t\tconst handlePointerDown = () => { tabDirection = undefined; };\n\n\t\t// Captured now: by cleanup the ref may already point elsewhere, and the\n\t\t// node this effect actually guarded is the one whose focus we care about.\n\t\tconst guardedRegion = regionRef.current;\n\n\t\t// Bubble at the window, after child React and Base UI document handlers.\n\t\t// Their preventDefault/stopPropagation owns the first Escape.\n\t\twindow.addEventListener('keydown', handleKeyDown);\n\t\twindow.addEventListener('focusin', handleFocusIn);\n\t\twindow.addEventListener('pointerdown', handlePointerDown, true);\n\t\treturn () => {\n\t\t\tmounted = false;\n\t\t\twindow.removeEventListener('keydown', handleKeyDown);\n\t\t\twindow.removeEventListener('focusin', handleFocusIn);\n\t\t\twindow.removeEventListener('pointerdown', handlePointerDown, true);\n\t\t\tdocument.body.style.overflow = previousBodyOverflow;\n\t\t\t// Only reclaim focus if it is still inside the region we are closing;\n\t\t\t// a consumer that moved focus elsewhere on exit keeps it.\n\t\t\tconst current = document.activeElement;\n\t\t\tconst stillInside = guardedRegion && containsFocus(guardedRegion, current);\n\t\t\tif ((stillInside || current === document.body) && opener?.isConnected) opener.focus();\n\t\t};\n\t}, [active, regionRef]);\n}\n","import { type DataTableStrings, type DataTableStringsOverride } from './table.types';\n\nconst fallbackTitleCase = (value: string): string => {\n\tconst formatted = value\n\t\t.replace(/[_-]+/g, ' ')\n\t\t.replace(/\\s+/g, ' ')\n\t\t.trim();\n\n\tif (!formatted) {\n\t\treturn 'Column';\n\t}\n\n\treturn formatted.replace(/\\b\\w/g, (char) => char.toUpperCase());\n};\n\nconst formatColumnLabel = (columnId: string, currentLabel?: string | null): string => {\n\tif (currentLabel && currentLabel.trim().length > 0) {\n\t\treturn currentLabel;\n\t}\n\n\treturn fallbackTitleCase(columnId);\n};\n\nexport const defaultDataTableStrings = {\n\temptyState: {\n\t\tmessage: 'No results found.',\n\t\tariaLabel: 'Empty state',\n\t},\n\tactions: {\n\t\ttriggerLabel: 'Actions',\n\t\tsrLabel: 'Row actions menu',\n\t\tmenuLabel: 'More actions',\n\t},\n\tfilter: {\n\t\tsearchPlaceholder: 'Filter...',\n\t\tcolumnsButton: 'Columns',\n\t},\n\tcolumnVisibility: {\n\t\ttitle: 'Toggle columns',\n\t\ttriggerLabel: 'Columns',\n\t\tformatLabel: formatColumnLabel,\n\t},\n\ttoolbar: {\n\t\tscrollLeft: 'Scroll left',\n\t\tscrollRight: 'Scroll right',\n\t\tcolumns: 'Toggle columns',\n\t\tenterFullscreen: 'Enter full screen',\n\t\texitFullscreen: 'Exit full screen',\n\t},\n\tpagination: {\n\t\tshowing: 'Showing',\n\t\tto: 'to',\n\t\tof: 'of',\n\t\tentries: 'results',\n\t\tprevious: 'Previous',\n\t\tnext: 'Next',\n\t\tpreviousLabel: 'Go to previous page',\n\t\tnextLabel: 'Go to next page',\n\t\tmorePages: 'More pages',\n\t\tpage: 'Page',\n\t\trowsPerPage: 'Rows per page',\n\t\tariaLabel: 'Pagination navigation',\n\t},\n\tselection: {\n\t\tsummary: (selected, total) => `${selected} of ${total} row${total === 1 ? '' : 's'} selected.`,\n\t\trow: (index) => `Select row ${index + 1}`,\n\t\tselectAll: 'Select all rows',\n\t\tclear: 'Clear selection',\n\t\tlabel: 'Batch actions',\n\t},\n\taccessibility: {\n\t\tscrollRegion: 'Table scroll area',\n\t\tfullscreenRegion: 'Table, full screen',\n\t\tsortColumn: (columnLabel: string) => `Sort ${columnLabel}`,\n\t\tsortPriority: (direction: 'asc' | 'desc', priority: number, total: number) => `${direction === 'asc' ? 'Ascending' : 'Descending'}, sort priority ${priority} of ${total}.`,\n\t\tresizeColumn: (columnLabel: string) => `Resize ${columnLabel}`,\n\t},\n} satisfies DataTableStrings;\n\nconst mergeNested = <T extends object>(defaults: T, overrides?: Partial<T>): T => ({\n\t...defaults,\n\t...overrides,\n});\n\nexport const mergeDataTableStrings = (overrides?: DataTableStringsOverride): DataTableStrings => {\n\tif (!overrides) {\n\t\treturn defaultDataTableStrings;\n\t}\n\n\treturn {\n\t\temptyState: mergeNested(defaultDataTableStrings.emptyState, overrides.emptyState),\n\t\tactions: {\n\t\t\t...mergeNested(defaultDataTableStrings.actions, overrides.actions),\n\t\t\t// A localized column header without a trigger name keeps naming the trigger.\n\t\t\t...(overrides.actions?.triggerLabel !== undefined && overrides.actions.menuLabel === undefined\n\t\t\t\t? { menuLabel: overrides.actions.triggerLabel }\n\t\t\t\t: {}),\n\t\t},\n\t\tfilter: mergeNested(defaultDataTableStrings.filter, overrides.filter),\n\t\tcolumnVisibility: mergeNested(defaultDataTableStrings.columnVisibility, overrides.columnVisibility),\n\t\ttoolbar: mergeNested(defaultDataTableStrings.toolbar, overrides.toolbar),\n\t\tpagination: mergeNested(defaultDataTableStrings.pagination, overrides.pagination),\n\t\tselection: mergeNested(defaultDataTableStrings.selection, overrides.selection),\n\t\taccessibility: mergeNested(defaultDataTableStrings.accessibility, overrides.accessibility),\n\t};\n};\n","import { useCallback } from 'react';\nimport {\n\tPaginationPrimitive as PaginationRoot,\n\tPaginationContent,\n\tPaginationEllipsis,\n\tPaginationItem,\n\tPaginationLink,\n\tPaginationNext,\n\tPaginationPrevious,\n\tdefaultPaginationStrings,\n} from '../../base/navigation/pagination';\nimport { Number as NumberValue, SecondaryValue } from '../../primitives';\nimport { defaultDataTableStrings } from './table.strings';\nimport { type ServerPaginationProps } from './table.types';\n\nimport { cn } from '../../../lib/utils';\n/**\n * Generate a window of page numbers with ellipsis gaps.\n *\n * Always shows first page, last page, and up to 1 sibling\n * on each side of the current page.\n */\nfunction generatePageNumbers(\n\tcurrentPage: number,\n\tlastPage: number,\n): (number | 'ellipsis')[] {\n\tif (lastPage <= 7) {\n\t\treturn Array.from({ length: lastPage }, (_, i) => i + 1);\n\t}\n\n\tconst pages: (number | 'ellipsis')[] = [1];\n\n\tif (currentPage > 3) {\n\t\tpages.push('ellipsis');\n\t}\n\n\tconst start = Math.max(2, currentPage - 1);\n\tconst end = Math.min(lastPage - 1, currentPage + 1);\n\n\tfor (let i = start; i <= end; i++) {\n\t\tpages.push(i);\n\t}\n\n\tif (currentPage < lastPage - 2) {\n\t\tpages.push('ellipsis');\n\t}\n\n\tpages.push(lastPage);\n\n\treturn pages;\n}\n\nfunction buildPageUrl(basePath: string, page: number, queryKey: string): string {\n\t// Build a URL without inheriting the current location's query string —\n\t// the library is framework-agnostic and must not read browser globals\n\t// to decide what to put in href. Consumers that need their own params\n\t// merged should compute and pass the URL via the pagination object.\n\tconst params = new URLSearchParams();\n\tparams.set(queryKey, String(page));\n\treturn `${basePath}?${params.toString()}`;\n}\n\nexport function Pagination({\n\tpagination,\n\tonPageChange,\n\tlabels = {},\n\tpageQueryKey,\n}: ServerPaginationProps) {\n\tconst paginationLabels = {\n\t\t...defaultDataTableStrings.pagination,\n\t\t...labels,\n\t};\n\tconst primitiveStrings = {\n\t\tnavigationLabel: paginationLabels.ariaLabel,\n\t\tprevious: paginationLabels.previous,\n\t\tnext: paginationLabels.next,\n\t\tpreviousLabel: paginationLabels.previousLabel ?? defaultPaginationStrings.previousLabel,\n\t\tnextLabel: paginationLabels.nextLabel ?? defaultPaginationStrings.nextLabel,\n\t\tmorePages: paginationLabels.morePages ?? defaultPaginationStrings.morePages,\n\t};\n\tconst queryKey = pageQueryKey ?? 'page';\n\n\tconst firstItem = (pagination.current_page - 1) * pagination.per_page + 1;\n\tconst lastItem = Math.min(\n\t\tpagination.current_page * pagination.per_page,\n\t\tpagination.total,\n\t);\n\n\tconst navigateToPage = useCallback(\n\t\t(page: number, url: string | null) => {\n\t\t\tif (!url) return;\n\t\t\t// The library never navigates on its own. Consumers wire their\n\t\t\t// router (Inertia, Tanstack Router, RR7, Next, …) through\n\t\t\t// `onPageChange`. When it's absent the click is a no-op — the\n\t\t\t// `href` attribute on the underlying anchor remains the only\n\t\t\t// fallback path (browsers will navigate it if JS doesn't run).\n\t\t\tonPageChange?.(page, url, pagination.path || '');\n\t\t},\n\t\t[onPageChange, pagination.path],\n\t);\n\n\tconst hasPrevious = pagination.prev_page_url !== null;\n\tconst hasNext = pagination.next_page_url !== null;\n\tconst pages = generatePageNumbers(pagination.current_page, pagination.last_page);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\t'pagination--component',\n\t\t\t\t'flex flex-col items-start gap-space-md px-surface py-row-y-lg sm:flex-row sm:items-center sm:justify-between sm:gap-0',\n\t\t\t)}\n\t\t>\n\t\t\t<SecondaryValue size=\"xs\" className=\"tabular-nums tracking-tight\">\n\t\t\t\t<NumberValue value={firstItem} size=\"xs\" weight=\"medium\" align=\"left\" />\n\t\t\t\t&ndash;\n\t\t\t\t<NumberValue value={lastItem} size=\"xs\" weight=\"medium\" align=\"left\" />{' '}\n\t\t\t\t{paginationLabels.of}{' '}\n\t\t\t\t<NumberValue value={pagination.total} size=\"xs\" weight=\"medium\" align=\"left\" />{' '}\n\t\t\t\t{paginationLabels.entries}\n\t\t\t</SecondaryValue>\n\n\t\t\t<PaginationRoot strings={primitiveStrings} className=\"mx-0 w-full justify-start sm:w-auto sm:justify-center\">\n\t\t\t\t<PaginationContent className=\"gap-0 sm:gap-space-2xs\">\n\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t<PaginationPrevious\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\ttext={paginationLabels.previous}\n\t\t\t\t\t\t\thref=\"#\"\n\t\t\t\t\t\t\tonClick={(e: React.MouseEvent) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tnavigateToPage(\n\t\t\t\t\t\t\t\t\tpagination.current_page - 1,\n\t\t\t\t\t\t\t\t\tpagination.prev_page_url,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-disabled={!hasPrevious}\n\t\t\t\t\t\t\tclassName=\"h-action-sm text-pxs\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PaginationItem>\n\n\t\t\t\t\t{pages.map((page, index) => {\n\t\t\t\t\t\tconst isEllipsis = page === 'ellipsis';\n\t\t\t\t\t\tconst itemKey = isEllipsis\n\t\t\t\t\t\t\t? `ellipsis-${pagination.current_page}-${index}`\n\t\t\t\t\t\t\t: `page-${page}`;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t<PaginationItem key={itemKey}>\n\t\t\t\t\t\t\t{isEllipsis ? (\n\t\t\t\t\t\t\t\t<PaginationEllipsis size=\"sm\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<PaginationLink\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\thref=\"#\"\n\t\t\t\t\t\t\t\t\tactive={page === pagination.current_page}\n\t\t\t\t\t\t\t\t\tonClick={(e: React.MouseEvent) => {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tnavigateToPage(\n\t\t\t\t\t\t\t\t\t\t\tpage,\n\t\t\t\t\t\t\t\t\t\t\tbuildPageUrl(pagination.path, page, queryKey),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName=\"size-action-sm text-pxs\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{page}\n\t\t\t\t\t\t\t\t</PaginationLink>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</PaginationItem>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\n\t\t\t\t\t<PaginationItem>\n\t\t\t\t\t\t<PaginationNext\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\ttext={paginationLabels.next}\n\t\t\t\t\t\t\thref=\"#\"\n\t\t\t\t\t\t\tonClick={(e: React.MouseEvent) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tnavigateToPage(\n\t\t\t\t\t\t\t\t\tpagination.current_page + 1,\n\t\t\t\t\t\t\t\t\tpagination.next_page_url,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\taria-disabled={!hasNext}\n\t\t\t\t\t\t\tclassName=\"h-action-sm text-pxs\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</PaginationItem>\n\t\t\t\t</PaginationContent>\n\t\t\t</PaginationRoot>\n\t\t</div>\n\t);\n}\n\nPagination.displayName = 'Pagination';\n","import { useEffect, useMemo, useState } from 'react';\nimport {\n\tActionButtons,\n\tActionMenu,\n\ttype ActionMenuAction,\n} from '../../base/action-menu';\nimport { cn } from '../../../lib/utils';\nimport { defaultDataTableStrings } from './table.strings';\nimport { type DataTableActionsProps, type TableAction } from './table.types';\n\nexport function DataTableActions<TData>(props: DataTableActionsProps<TData>) {\n\tconst {\n\t\trow,\n\t\tactions,\n\t\tmenuLabel,\n\t\tdisplayMode = 'menu', // preserve existing behavior\n\t\tresponsiveBreakpoint = 1040,\n\t\tstrings: providedStrings\n\t} = props;\n\n\tconst strings = providedStrings ?? defaultDataTableStrings;\n\t// Copy without `menuLabel` (written before 2.0.1) keeps naming the trigger with `triggerLabel`.\n\tconst resolvedMenuLabel = menuLabel ?? strings.actions.menuLabel ?? strings.actions.triggerLabel;\n\n\t// Resolve actions array\n\tconst resolvedActions = useMemo<TableAction<TData>[]>(() => {\n\t\tconst base = typeof actions === 'function' ? actions(row) : actions;\n\t\treturn Array.isArray(base) ? base : [];\n\t}, [actions, row]);\n\n\t// Filter visibility and compute disabled by predicate/boolean\n\tconst visibleActions = useMemo(() => {\n\t\tconst evalFlag = (flag: boolean | ((r: TData) => boolean) | undefined): boolean | undefined => {\n\t\t\tif (typeof flag === 'function') return flag(row);\n\t\t\treturn flag;\n\t\t};\n\t\treturn resolvedActions.flatMap((action) => {\n\t\t\tconst visible = evalFlag(action.visible) ?? true;\n\t\t\tif (!visible) return [];\n\t\t\treturn [{\n\t\t\t\t...action,\n\t\t\t\tvisible,\n\t\t\t\tdisabled: evalFlag(action.disabled) ?? false,\n\t\t\t}];\n\t\t});\n\t}, [resolvedActions, row]);\n\n\t// No actions to render\n\tconst hasVisibleActions = visibleActions.length > 0;\n\n\t// Responsive auto mode: inline over breakpoint, menu under\n\tconst [isNarrow, setIsNarrow] = useState(false);\n\n\t// Keep destructive actions at the end in both inline and menu modes.\n\tconst nonDestructive = visibleActions.filter((action) => action.tone !== 'destructive');\n\tconst destructive = visibleActions.filter((action) => action.tone === 'destructive');\n\n\t// 2. Combine them (non-destructive first, destructive last)\n\tconst sortedActions = [...nonDestructive, ...destructive];\n\n\tuseEffect(() => {\n\t\tif (displayMode !== 'auto' || !hasVisibleActions) {\n\t\t\tsetIsNarrow(false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst handleResize = () => {\n\t\t\ttry {\n\t\t\t\tsetIsNarrow(window.innerWidth <= responsiveBreakpoint);\n\t\t\t} catch {\n\t\t\t\tsetIsNarrow(false);\n\t\t\t}\n\t\t};\n\n\t\thandleResize();\n\t\twindow.addEventListener('resize', handleResize);\n\t\treturn () => window.removeEventListener('resize', handleResize);\n\t}, [displayMode, hasVisibleActions, responsiveBreakpoint]);\n\n\tif (!hasVisibleActions) return null;\n\n\tconst mode: 'menu' | 'inline' = displayMode === 'auto' ? (isNarrow ? 'menu' : 'inline') : displayMode;\n\n\tconst actionDefinitions = sortedActions.map<ActionMenuAction>((action, idx) => ({\n\t\tid: action.id || `${action.label}-${idx}`,\n\t\tlabel: action.label,\n\t\ticon: action.icon,\n\t\tdisabled: !!action.disabled,\n\t\ttone: action.tone,\n\t\tbuttonStyle: action.buttonStyle,\n\t\tonClick: () => action.onClick?.(row),\n\t}));\n\n\t if (mode === 'inline') {\n\t return (\n\t <ActionButtons\n\t\t\t\t\tactions={actionDefinitions}\n\t\t\t\t\tclassName={cn('table-actions--component')}\n\t\t\t\t/>\n\t\t);\n\t}\n\n\n\t// Menu mode (default): the shared ghost overflow square at the provider scale.\n\treturn (\n\t\t<ActionMenu\n\t\t\tactions={actionDefinitions}\n\t\t\tsrText={resolvedMenuLabel || strings.actions.srLabel}\n\t\t\tcloseOnSelect={true}\n\t\t\talign=\"end\"\n\t\t/>\n\t);\n}\n\nDataTableActions.displayName = 'DataTableActions';\n","import type {\n\tSortingState,\n\tRowSelectionState,\n\tVisibilityState,\n\tTable,\n\tRow,\n\tUpdater,\n\tColumnDef,\n} from '@tanstack/react-table';\nimport React from 'react';\nimport { Checkbox } from '../../base/choice-inputs';\nimport { defaultDataTableStrings } from './table.strings';\nimport type { DataTableStrings } from './table.types';\n\n/**\n * Helper function for handling row selection changes with OnChangeFn compatibility\n */\nexport const handleRowSelectionChange = (\n\tupdatedSelection: Updater<RowSelectionState>,\n\tsetInternalState: React.Dispatch<React.SetStateAction<RowSelectionState>>,\n\texternalHandler?: (state: RowSelectionState) => void,\n) => {\n\t// Handle both direct values and updater functions\n\tif (typeof updatedSelection === 'function') {\n\t\t// If it's a function, use setState with function argument\n\t\tsetInternalState((prevState) => {\n\t\t\tconst newState = (\n\t\t\t\tupdatedSelection as (prev: RowSelectionState) => RowSelectionState\n\t\t\t)(prevState);\n\t\t\tif (externalHandler) {\n\t\t\t\texternalHandler(newState);\n\t\t\t}\n\t\t\treturn newState;\n\t\t});\n\t} else {\n\t\t// If it's a direct value, just use it\n\t\tsetInternalState(updatedSelection);\n\t\tif (externalHandler) {\n\t\t\texternalHandler(updatedSelection);\n\t\t}\n\t}\n};\n\n/**\n * Helper function for handling sorting changes with OnChangeFn compatibility\n */\nexport const handleSortingChange = (\n\tupdatedSorting: Updater<SortingState>,\n\tsetInternalState: React.Dispatch<React.SetStateAction<SortingState>>,\n\texternalHandler?: (state: SortingState) => void,\n) => {\n\t// Handle both direct values and updater functions\n\tif (typeof updatedSorting === 'function') {\n\t\t// If it's a function, use setState with function argument\n\t\tsetInternalState((prevState) => {\n\t\t\tconst newState = (updatedSorting as (prev: SortingState) => SortingState)(\n\t\t\t\tprevState,\n\t\t\t);\n\t\t\tif (externalHandler) {\n\t\t\t\texternalHandler(newState);\n\t\t\t}\n\t\t\treturn newState;\n\t\t});\n\t} else {\n\t\t// If it's a direct value, just use it\n\t\tsetInternalState(updatedSorting);\n\t\tif (externalHandler) {\n\t\t\texternalHandler(updatedSorting);\n\t\t}\n\t}\n};\n\n/**\n * Helper function for handling column visibility changes\n */\nexport const handleColumnVisibilityChange = (\n\tupdatedVisibility: Updater<VisibilityState>,\n\tsetInternalState: React.Dispatch<React.SetStateAction<VisibilityState>>,\n\texternalHandler?: (state: VisibilityState) => void,\n) => {\n\t// Handle both direct values and updater functions\n\tif (typeof updatedVisibility === 'function') {\n\t\t// If it's a function, use setState with function argument\n\t\tsetInternalState((prevState) => {\n\t\t\tconst newState = (\n\t\t\t\tupdatedVisibility as (prev: VisibilityState) => VisibilityState\n\t\t\t)(prevState);\n\t\t\tif (externalHandler) {\n\t\t\t\texternalHandler(newState);\n\t\t\t}\n\t\t\treturn newState;\n\t\t});\n\t} else {\n\t\t// If it's a direct value, just use it\n\t\tsetInternalState(updatedVisibility);\n\t\tif (externalHandler) {\n\t\t\texternalHandler(updatedVisibility);\n\t\t}\n\t}\n};\n\n/**\n * Get row class name based on selection state and custom function\n */\nexport const getRowClassName = <TData,>(\n\trow: Row<TData>,\n\tindex: number,\n\trowClassName?: string | ((row: Row<TData>, index: number) => string),\n\tisSelected?: boolean,\n): string => {\n\tlet className = '';\n\n\t// A selected row holds the shared table selection fill (bg-muted).\n\tif (isSelected) {\n\t\tclassName += 'bg-muted ';\n\t}\n\n\t// Add custom class name\n\tif (typeof rowClassName === 'function') {\n\t\tclassName += rowClassName(row, index) + ' ';\n\t} else if (rowClassName) {\n\t\tclassName += rowClassName + ' ';\n\t}\n\n\treturn className.trim();\n};\n\n/**\n * Get cell class name including sticky column handling\n */\nexport const getCellClassName = <TData,>(\n\tcolumnId: string,\n\trow: Row<TData> | null,\n\tcellClassName?: string | ((column: string, row: Row<TData> | null) => string),\n\tstickyFirstColumn?: boolean,\n\tisFirstColumn?: boolean,\n): string => {\n\tlet baseClassName = '';\n\n\t// Add base class name\n\tif (typeof cellClassName === 'string') {\n\t\tbaseClassName = cellClassName;\n\t} else if (cellClassName) {\n\t\tbaseClassName = cellClassName(columnId, row);\n\t}\n\n\t// Add sticky class if it's the first column and sticky first column is enabled\n\tif (stickyFirstColumn && isFirstColumn) {\n\t\treturn `${baseClassName} sticky start-0 z-10 bg-card shadow-[1px_0_0_0_var(--border)] rtl:shadow-[-1px_0_0_0_var(--border)]`;\n\t}\n\n\treturn baseClassName;\n};\n\n/**\n * Get selected rows data from the table\n */\nexport const getSelectedRowsData = <T extends object>(table: Table<T>): T[] => {\n\treturn table.getSelectedRowModel().rows.map((row) => row.original);\n};\n\n/**\n * Create row selection component for a row\n */\nexport const createRowSelectionCheckbox = <TData,>(\n\trow: Row<TData>,\n\tstrings: DataTableStrings = defaultDataTableStrings,\n) => (\n\t\t// A flex box centres the checkbox on the row's text line; as an inline box it\n\t\t// sat on the baseline, a few pixels above the cell text.\n\t\t<div className=\"flex items-center px-space-sm\">\n\t\t\t<Checkbox\n\t\t\t\tclassName=\"size-icon cursor-pointer disabled:cursor-not-allowed disabled:opacity-50\"\n\t\t\tchecked={row.getIsSelected()}\n\t\t\tdisabled={!row.getCanSelect()}\n\t\t\tonCheckedChange={(checked) => row.toggleSelected(checked === true)}\n\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\taria-label={strings.selection.row(row.index)}\n\t\t/>\n\t</div>\n);\n\n/**\n * Create header selection checkbox\n */\nexport const createHeaderSelectionCheckbox = <TData,>(\n\ttable: Table<TData>,\n\tstrings: DataTableStrings = defaultDataTableStrings,\n) => (\n\t\t// A flex box centres the checkbox on the row's text line; as an inline box it\n\t\t// sat on the baseline, a few pixels above the cell text.\n\t\t<div className=\"flex items-center px-space-sm\">\n\t\t\t<Checkbox\n\t\t\t\tclassName=\"size-icon cursor-pointer\"\n\t\t\tchecked={table.getIsAllPageRowsSelected()}\n\t\t\tindeterminate={table.getIsSomePageRowsSelected() && !table.getIsAllPageRowsSelected()}\n\t\t\tonCheckedChange={(checked) => table.toggleAllPageRowsSelected(checked === true)}\n\t\t\taria-label={strings.selection.selectAll}\n\t\t/>\n\t</div>\n);\n\n/**\n * Add selection column to columns\n */\nexport const addSelectionColumn = <TData, TValue = unknown>(\n\tcolumns: ColumnDef<TData, TValue>[],\n\tstrings: DataTableStrings = defaultDataTableStrings,\n) => {\n\tconst selectionColumn = {\n\t\tid: 'selection',\n\t\theader: ({ table }: { table: Table<TData> }) =>\n\t\t\tcreateHeaderSelectionCheckbox(table, strings),\n\t\tcell: ({ row }: { row: Row<TData> }) => createRowSelectionCheckbox(row, strings),\n\t\tenableSorting: false,\n\t\tenableResizing: false,\n\t\t// A utility column, not data: column visibility never lists it.\n\t\tenableHiding: false,\n\t\tsize: 40,\n\t} as ColumnDef<TData, TValue>;\n\n\treturn [selectionColumn, ...columns];\n};\n","/**\n * DataTableBody — body rows, selection highlighting, hover, empty state,\n * and (optional) loading skeleton. Stronger hover + selection contrast than\n * the original implementation so rows feel interactive at a glance.\n */\nimport { flexRender } from '@tanstack/react-table';\nimport { PackageOpen } from 'lucide-react';\nimport { TableBody, TableCell, TableRow } from '../../base/table';\nimport { EmptyState } from '../../blocks/data-display';\nimport { cn } from '../../../lib/utils';\nimport {\n\tgetCellClassName,\n\tgetRowClassName,\n} from './table-helpers';\nimport { defaultDataTableStrings } from './table.strings';\nimport { type DataTableBodyProps } from './table.types';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\nimport { focusRecipes } from '../../../lib/focus-recipes';\n\nconst rowControlSelector = [\n\t'button, a[href], input, select, textarea, summary, label, [tabindex]',\n\t'[role=\"button\"], [role=\"link\"], [role=\"checkbox\"], [role=\"switch\"], [role=\"radio\"]',\n\t'[role=\"menuitem\"], [role=\"menuitemcheckbox\"], [role=\"menuitemradio\"], [role=\"tab\"]',\n\t'[role=\"combobox\"], [role=\"textbox\"], [role=\"slider\"], [role=\"spinbutton\"]',\n\t'[contenteditable]:not([contenteditable=\"false\"])',\n].join(',');\n\nexport function DataTableBody<TData>({\n\ttable,\n\tonRowClick,\n\temptyStateMessage,\n\temptyStateAction,\n\tcellClassName = '',\n\trowClassName = '',\n\tstickyFirstColumn = false,\n\tstriped = false,\n\tstrings,\n}: DataTableBodyProps<TData>) {\n\tconst tableRows = table.getRowModel().rows;\n\tconst resolvedEmptyStateMessage =\n\t\temptyStateMessage ??\n\t\tstrings?.emptyState.message ??\n\t\tdefaultDataTableStrings.emptyState.message;\n\n\tif (!tableRows.length) {\n\t\t// Column headers may keep the table wider than its viewport. Feedback uses\n\t\t// DataTable's existing query container, with EmptyState owning the inset.\n\t\treturn (\n\t\t\t<TableBody className=\"table-body--component\">\n\t\t\t\t<TableRow className=\"hover:bg-transparent\">\n\t\t\t\t\t<TableCell\n\t\t\t\t\t\tclassName=\"p-0! text-center whitespace-normal\"\n\t\t\t\t\t\tcolSpan={table.getAllColumns().length}\n\t\t\t\t\t>\n\t\t\t\t\t\t<EmptyState\n\t\t\t\t\t\t\tstrings={{ ariaLabel: strings?.emptyState.ariaLabel ?? defaultDataTableStrings.emptyState.ariaLabel }}\n\t\t\t\t\t\t\ttitle={resolvedEmptyStateMessage}\n\t\t\t\t\t\t\tdescription={false}\n\t\t\t\t\t\t\tmedia={<PackageOpen className=\"size-icon\" />}\n\t\t\t\t\t\t\tmediaVariant=\"icon-soft\"\n\t\t\t\t\t\t\tactions={emptyStateAction}\n\t\t\t\t\t\t\tclassName=\"data-table--empty-state w-[100cqw] max-w-full\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</TableCell>\n\t\t\t\t</TableRow>\n\t\t\t</TableBody>\n\t\t);\n\t}\n\n\treturn (\n\t\t<TableBody>\n\t\t\t{tableRows.map((row, rowIndex) => {\n\t\t\t\tconst isRowSelected = row.getIsSelected();\n\t\t\t\tconst rowCells = row.getVisibleCells();\n\t\t\t\tconst computedRowClassName = getRowClassName(\n\t\t\t\t\trow,\n\t\t\t\t\trowIndex,\n\t\t\t\t\trowClassName,\n\t\t\t\t\tisRowSelected,\n\t\t\t\t);\n\t\t\t\tconst zebraClass = striped && rowIndex % 2 !== 0 ? interactionRecipes.tableStripe : '';\n\t\t\t\tconst cursorClass = onRowClick ? 'cursor-pointer' : '';\n\t\t\t\tconst rowClasses = cn(\n\t\t\t\t\tcomputedRowClassName,\n\t\t\t\t\tzebraClass,\n\t\t\t\t\t'transition-colors duration-150',\n\t\t\t\t\t`${interactionRecipes.tableRowHover} ${interactionRecipes.tableRowSelected}`,\n\t\t\t\t\tcursorClass,\n\t\t\t\t\tonRowClick && `focus-visible:outline-none ${focusRecipes.inset}`,\n\t\t\t\t\t'border-b border-border/60 last:border-b-0',\n\t\t\t\t);\n\t\t\t\tconst rowState = isRowSelected ? 'selected' : null;\n\n\t\t\t\treturn (\n\t\t\t\t\t<TableRow\n\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\tdata-state={rowState}\n\t\t\t\t\t\tclassName={rowClasses}\n\t\t\t\t\t\ttabIndex={onRowClick ? 0 : undefined}\n\t\t\t\t\t\tonClick={onRowClick ? event => {\n\t\t\t\t\t\t\tif (event.defaultPrevented) return;\n\t\t\t\t\t\t\tconst target = event.target;\n\t\t\t\t\t\t\tconst control = target instanceof Element ? target.closest(rowControlSelector) : null;\n\t\t\t\t\t\t\tif (control && control !== event.currentTarget) return;\n\t\t\t\t\t\t\t// Portaled cell actions bubble through React but are not row targets.\n\t\t\t\t\t\t\tif (target instanceof Node && event.currentTarget.contains(target)) onRowClick(row.original);\n\t\t\t\t\t\t} : undefined}\n\t\t\t\t\t\tonKeyDown={onRowClick ? event => {\n\t\t\t\t\t\t\tif (event.defaultPrevented || event.target !== event.currentTarget || (event.key !== 'Enter' && event.key !== ' ')) return;\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tif (!event.repeat) onRowClick(row.original);\n\t\t\t\t\t\t} : undefined}\n\t\t\t\t\t>\n\t\t\t\t\t\t{rowCells.map((cell, cellIndex) => (\n\t\t\t\t\t\t\t<TableCell\n\t\t\t\t\t\t\t\tkey={cell.id}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\tgetCellClassName(\n\t\t\t\t\t\t\t\t\t\tcell.column.id,\n\t\t\t\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\t\t\t\tcellClassName,\n\t\t\t\t\t\t\t\t\t\tstickyFirstColumn,\n\t\t\t\t\t\t\t\t\t\tcellIndex === 0,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t// End-aligned columns are figures (money, counts): tabular\n\t\t\t\t\t\t\t\t\t// digits keep them lined up down the column.\n\t\t\t\t\t\t\t\t\tcell.column.columnDef.meta?.align === 'end' && 'text-right tabular-nums',\n\t\t\t\t\t\t\t\t\tcell.column.columnDef.meta?.align === 'center' && 'text-center',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{flexRender(\n\t\t\t\t\t\t\t\t\tcell.column.columnDef.cell,\n\t\t\t\t\t\t\t\t\tcell.getContext(),\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</TableRow>\n\t\t\t\t);\n\t\t\t})}\n\t\t</TableBody>\n\t);\n}\n\nDataTableBody.displayName = 'DataTableBody';\n","/**\n * DataTableHeader — column-group row, primary header row, sort indicators,\n * and (optionally) resize handles. Sortable columns render as a button with\n * an inline up / down / both arrow icon driven by TanStack `column.getIsSorted()`.\n */\nimport { flexRender } from '@tanstack/react-table';\nimport { ArrowDown, ArrowUp, ChevronsUpDown } from 'lucide-react';\nimport React from 'react';\nimport { Button } from '../../base/buttons';\nimport { TableHead, TableHeader, TableRow } from '../../base/table';\nimport { DisplayLabel } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { getCellClassName } from './table-helpers';\nimport { type DataTableHeaderProps } from './table.types';\nimport { focusRecipes } from '../../../lib/focus-recipes';\nimport { interactionRecipes } from '../../../lib/interaction-recipes';\nimport { defaultDataTableStrings } from './table.strings';\n\nexport function DataTableHeader<TData>(\n\t{\n\t\ttable,\n\t\tenableResizing = false,\n\t\tstickyHeader = false,\n\t\theaderClassName = '',\n\t\tcellClassName = '',\n\t\tstickyFirstColumn = false,\n\t\tcolumnGroups,\n\t\theaderTransparent = false,\n\t\tstrings,\n\t}: DataTableHeaderProps<TData>) {\n\n\tconst headerGroups = table.getHeaderGroups();\n\tconst sortDescriptionId = React.useId();\n\tconst sorting = table.getState().sorting;\n\tconst stickyCellClassName = stickyHeader\n\t\t? cn(\n\t\t\t// Opaque so scrolled rows never show through the sticky header.\n\t\t\t'shadow-[0_1px_0_0_var(--border)]',\n\t\t\theaderTransparent ? 'bg-background' : 'bg-muted',\n\t\t)\n\t\t: '';\n\n\tconst getColumnGroup = (columnId: string) => {\n\t\tif (!columnGroups) return null;\n\t\treturn columnGroups.find(group => group.columns.includes(columnId));\n\t};\n\n\tconst renderGroupHeaderRow = () => {\n\t\tif (!columnGroups || columnGroups.length === 0 || headerGroups.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst headers = headerGroups[0].headers;\n\t\tlet currentGroup: string | null = null;\n\t\tlet groupSpan = 0;\n\t\tconst groupCells: React.ReactNode[] = [];\n\n\t\theaders.forEach((header, index) => {\n\t\t\tconst group = getColumnGroup(header.id);\n\t\t\tconst groupName = group?.header || '';\n\n\t\t\tif (groupName !== currentGroup) {\n\t\t\t\tif (currentGroup !== null && groupSpan > 0) {\n\t\t\t\t\tgroupCells.push(\n\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\tkey={`group-${currentGroup}-${groupCells.length}`}\n\t\t\t\t\t\t\tcolSpan={groupSpan}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'border-r border-border/60 bg-muted/50 text-center text-muted-foreground last:border-r-0',\n\t\t\t\t\t\t\t\tstickyCellClassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<DisplayLabel>{currentGroup || ''}</DisplayLabel>\n\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tcurrentGroup = groupName;\n\t\t\t\tgroupSpan = 1;\n\t\t\t} else {\n\t\t\t\tgroupSpan++;\n\t\t\t}\n\n\t\t\tif (index === headers.length - 1 && groupSpan > 0) {\n\t\t\t\tgroupCells.push(\n\t\t\t\t\t<TableHead\n\t\t\t\t\t\tkey={`group-${currentGroup}-${groupCells.length}`}\n\t\t\t\t\t\t\tcolSpan={groupSpan}\n\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t'whitespace-nowrap border-r border-border/60 bg-muted/50 text-center text-muted-foreground last:border-r-0',\n\t\t\t\t\t\t\t\tstickyCellClassName,\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<DisplayLabel>{currentGroup || ''}</DisplayLabel>\n\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t);\n\t\t\t}\n\t\t});\n\n\t\treturn (\n\t\t\t<TableRow className={cn('table-header--component', 'border-b border-border')}>\n\t\t\t\t{groupCells}\n\t\t\t</TableRow>\n\t\t);\n\t};\n\n\treturn (\n\t\t<TableHeader\n\t\t\tclassName={cn(stickyHeader && 'sticky top-0 z-20', headerClassName)}\n\t\t>\n\t\t\t{renderGroupHeaderRow()}\n\t\t\t{headerGroups.map((headerGroup) => (\n\t\t\t\t<TableRow\n\t\t\t\t\tkey={headerGroup.id}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'border-b border-border/60',\n\t\t\t\t\t\theaderTransparent\n\t\t\t\t\t\t\t? 'bg-transparent hover:bg-transparent'\n\t\t\t\t\t\t\t: `${interactionRecipes.tableHead} ${interactionRecipes.tableRowHover}`,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t{headerGroup.headers.map((header, index) => {\n\t\t\t\t\t\tconst cellClasses = cn(\n\t\t\t\t\t\t\tgetCellClassName(\n\t\t\t\t\t\t\t\theader.id,\n\t\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\t\tcellClassName,\n\t\t\t\t\t\t\t\tstickyFirstColumn,\n\t\t\t\t\t\t\t\tindex === 0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t'text-muted-foreground font-medium whitespace-nowrap',\n\t\t\t\t\t\t\theader.column.columnDef.meta?.align === 'end' && 'text-right',\n\t\t\t\t\t\t\theader.column.columnDef.meta?.align === 'center' && 'text-center',\n\t\t\t\t\t\t\tstickyCellClassName,\n\t\t\t\t\t\t\tstickyHeader && stickyFirstColumn && index === 0 && 'z-30',\n\t\t\t\t\t\t\t!stickyHeader && 'bg-transparent',\n\t\t\t\t\t\t\tenableResizing && !(stickyFirstColumn && index === 0) && 'relative',\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// An explicit column `size` is a width hint even without resizing;\n\t\t\t\t\t\t// TanStack's implicit 150px default is not.\n\t\t\t\t\t\tconst headerStyle = enableResizing || header.column.columnDef.size !== undefined\n\t\t\t\t\t\t\t? { width: header.getSize() }\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tconst headerSortDescriptionId = `${sortDescriptionId}-${encodeURIComponent(header.id)}`;\n\t\t\t\t\t\tconst resizeHandler = header.getResizeHandler();\n\t\t\t\t\t\t// Group widths are the sum of visible leaves, not the group's own\n\t\t\t\t\t\t// unused column sizing entry. Keep announcement and keyboard edits\n\t\t\t\t\t\t// on the same geometry that TanStack's pointer handler changes.\n\t\t\t\t\t\tconst resizeLeaves = header.getLeafHeaders().filter(leaf => leaf.subHeaders.length === 0);\n\t\t\t\t\t\tconst minSize = resizeLeaves.reduce((sum, leaf) => sum + (leaf.column.columnDef.minSize ?? 20), 0);\n\t\t\t\t\t\tconst maxSize = Math.min(Number.MAX_SAFE_INTEGER, resizeLeaves.reduce((sum, leaf) => sum + (leaf.column.columnDef.maxSize ?? Number.MAX_SAFE_INTEGER), 0));\n\t\t\t\t\t\tconst startResize = (event: React.MouseEvent<HTMLDivElement> | React.TouchEvent<HTMLDivElement>) => {\n\t\t\t\t\t\t\t// Resolve the actual boundary at gesture time, including inherited\n\t\t\t\t\t\t\t// and dynamically changed direction. No app-owned dir prop required.\n\t\t\t\t\t\t\ttable.setOptions(previous => ({...previous, columnResizeDirection: getComputedStyle(event.currentTarget).direction === 'rtl' ? 'rtl' : 'ltr'}));\n\t\t\t\t\t\t\tresizeHandler(event);\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst isResizing = header.column.getIsResizing();\n\t\t\t\t\t\tconst columnLabel = (() => {\n\t\t\t\t\t\t\tconst rawHeader = header.column.columnDef.header;\n\t\t\t\t\t\t\tif (typeof rawHeader === 'string') {\n\t\t\t\t\t\t\t\treturn rawHeader;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn typeof header.id === 'string' ? header.id : 'column';\n\t\t\t\t\t\t})();\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\tcolSpan={header.colSpan}\n\t\t\t\t\t\t\t\tclassName={cellClasses}\n\t\t\t\t\t\t\t\tstyle={headerStyle}\n\t\t\t\t\t\t\t\taria-sort={!header.isPlaceholder && header.subHeaders.length === 0 && header.column.getIsSorted() && header.column.getSortIndex() === 0\n\t\t\t\t\t\t\t\t\t? header.column.getIsSorted() === 'asc' ? 'ascending' : 'descending'\n\t\t\t\t\t\t\t\t\t: undefined}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{header.isPlaceholder ? null : (\n\t\t\t\t\t\t\t\t\t<div className={cn(enableResizing && header.column.getCanResize() && 'pe-action-sm')}>\n\t\t\t\t\t\t\t\t\t\t{(() => {\n\t\t\t\t\t\t\t\t\t\t\tconst canSort = header.column.getCanSort();\n\t\t\t\t\t\t\t\t\t\t\tconst sortDir = header.column.getIsSorted();\n\t\t\t\t\t\t\t\t\t\t\tconst headerNode = flexRender(\n\t\t\t\t\t\t\t\t\t\t\t\theader.column.columnDef.header,\n\t\t\t\t\t\t\t\t\t\t\t\theader.getContext(),\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\tconst SortIcon =\n\t\t\t\t\t\t\t\t\t\t\t\tsortDir === 'asc'\n\t\t\t\t\t\t\t\t\t\t\t\t\t? ArrowUp\n\t\t\t\t\t\t\t\t\t\t\t\t\t: sortDir === 'desc'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? ArrowDown\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ChevronsUpDown;\n\t\t\t\t\t\t\t\t\t\t\tif (!canSort) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn <div className={cn('flex items-center', header.column.columnDef.meta?.align === 'end' && 'justify-end', header.column.columnDef.meta?.align === 'center' && 'justify-center')}>{headerNode}</div>;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={header.column.getToggleSortingHandler()}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'group -ml-space-sm inline-flex select-none items-center gap-space-sm rounded-radius px-space-sm',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Sortable labels keep the header row's one muted colour; the\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// sorted column is marked by its full-strength glyph instead.\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'text-muted-foreground hover:text-foreground transition-colors',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t`focus-visible:outline-none ${focusRecipes.edge}`,\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={(strings?.accessibility.sortColumn ?? defaultDataTableStrings.accessibility.sortColumn)(columnLabel)}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-describedby={sortDir && sorting.length > 1 ? headerSortDescriptionId : undefined}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{headerNode}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{sortDir && sorting.length > 1 && <span id={headerSortDescriptionId} className=\"sr-only\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{(strings?.accessibility.sortPriority ?? defaultDataTableStrings.accessibility.sortPriority)(sortDir, header.column.getSortIndex() + 1, sorting.length)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>}\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SortIcon\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'size-icon-sm shrink-0 transition-opacity',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsortDir\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'text-foreground opacity-100'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'opacity-30 group-hover:opacity-70',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})()}\n\n\t\t\t\t\t\t\t\t\t\t{!!enableResizing && header.column.getCanResize() && (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"separator\" tabIndex={0}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t'absolute inset-y-0 end-0 w-action-sm cursor-col-resize select-none touch-none bg-transparent after:absolute after:inset-y-0 after:end-0 after:w-px after:bg-muted-foreground opacity-0 hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:after:w-1 focus-visible:after:bg-ring',\n\t\t\t\t\t\t\t\t\t\t\t\t\tisResizing &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'after:bg-primary-accent!',\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={(strings?.accessibility.resizeColumn ?? defaultDataTableStrings.accessibility.resizeColumn)(columnLabel)}\n\t\t\t\t\t\t\t\t\t\t\t\taria-orientation=\"vertical\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-valuenow={header.getSize()}\n\t\t\t\t\t\t\t\t\t\t\t\taria-valuemin={minSize}\n\t\t\t\t\t\t\t\t\t\t\t\taria-valuemax={maxSize}\n\t\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\t const rtl = getComputedStyle(event.currentTarget).direction === 'rtl';\n\t\t\t\t\t\t\t\t\t\t\t\t const delta = (event.key === 'ArrowRight' ? 10 : event.key === 'ArrowLeft' ? -10 : 0) * (rtl ? -1 : 1);\n\t\t\t\t\t\t\t\t\t\t\t\t if (!delta && event.key !== 'Home' && event.key !== 'End') return;\n\t\t\t\t\t\t\t\t\t\t\t\t if (event.key === 'End' && maxSize === Number.MAX_SAFE_INTEGER) return;\n\t\t\t\t\t\t\t\t\t\t\t\t event.preventDefault(); event.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t const size = header.getSize();\n\t\t\t\t\t\t\t\t\t\t\t\t const ratio = Math.max(minSize, Math.min(maxSize, size + delta)) / Math.max(1, size);\n\t\t\t\t\t\t\t\t\t\t\t\t table.setColumnSizing(previous => ({...previous, ...Object.fromEntries(resizeLeaves.map(leaf => {\n\t\t\t\t\t\t\t\t\t\t\t\t const min = leaf.column.columnDef.minSize ?? 20, max = leaf.column.columnDef.maxSize ?? Number.MAX_SAFE_INTEGER;\n\t\t\t\t\t\t\t\t\t\t\t\t const next = event.key === 'Home' ? min : event.key === 'End' ? max : Math.max(min, Math.min(max, leaf.column.getSize() * ratio));\n\t\t\t\t\t\t\t\t\t\t\t\t return [leaf.column.id, Math.round(next * 100) / 100];\n\t\t\t\t\t\t\t\t\t\t\t\t }))}));\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tonMouseDown={startResize}\n\t\t\t\t\t\t\t\t\t\t\t\tonTouchStart={startResize}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</TableRow>\n\t\t\t))}\n\t\t</TableHeader>\n\t);\n}\n\nDataTableHeader.displayName = 'DataTableHeader';\n","import { Settings2 } from 'lucide-react';\nimport {\n\tActionMenu,\n\ttype ActionMenuAction,\n} from '../../base/action-menu';\nimport { cn } from '../../../lib/utils';\n\nimport { defaultDataTableStrings } from './table.strings';\nimport { type ColumnVisibilityToggleProps } from './table.types';\nimport { popoverWidthRecipes } from '../../base/popover/popover.recipes';\n\nexport function ColumnVisibilityToggle<TData>({\n\ttable,\n\tclassName,\n\talign = 'end',\n\tlabelVisibility = 'hidden',\n\tstrings = defaultDataTableStrings,\n}: ColumnVisibilityToggleProps<TData>) {\n\tconst columns = table.getAllColumns()\n\t\t.filter((column) => column.getCanHide());\n\n\tif (columns.length === 0) return null;\n\tconst showVisualLabel = labelVisibility !== 'hidden';\n\tconst actions: ActionMenuAction[] = columns.map((column) => {\n\t\tconst header = column.columnDef.header;\n\t\tconst columnName = strings.columnVisibility.formatLabel(\n\t\t\tcolumn.id,\n\t\t\ttypeof header === 'string' ? header : undefined,\n\t\t);\n\n\t\treturn {\n\t\t\tid: column.id,\n\t\t\ttype: 'checkbox',\n\t\t\tlabel: columnName,\n\t\t\tgroup: strings.columnVisibility.title,\n\t\t\tchecked: column.getIsVisible(),\n\t\t\tonCheckedChange: (checked) => column.toggleVisibility(!!checked),\n\t\t\tclassName: 'capitalize',\n\t\t};\n\t});\n\n\treturn (\n\t\t<ActionMenu\n\t\t\tactions={actions}\n\t\t\ticon={Settings2}\n\t\t\tlabel={strings.columnVisibility.triggerLabel}\n\t\t\tsrText={strings.columnVisibility.triggerLabel}\n\t\t\talign={align}\n\t\t\twidth={popoverWidthRecipes.xs}\n\t\t\tlabelVisibility={showVisualLabel ? 'responsive' : 'hidden'}\n\t\t\tbuttonProps={{\n\t\t\t\t'aria-label': strings.columnVisibility.triggerLabel,\n\t\t\t\ttone: 'secondary',\n\t\t\t\tbuttonStyle: 'outline',\n\t\t\t\tsize: 'sm',\n\t\t\t\ticonOnly: !showVisualLabel,\n\t\t\t\tclassName: cn(\n\t\t\t\t\t'column-visibility-toggle--component',\n\t\t\t\t\tshowVisualLabel\n\t\t\t\t\t\t? 'h-action-sm gap-space-sm px-control-sm'\n\t\t\t\t\t\t: 'size-action-sm gap-0 px-0',\n\t\t\t\t\tclassName,\n\t\t\t\t),\n\t\t\t}}\n\t\t\tpreserveOrder\n\t\t/>\n\t);\n}\n\nColumnVisibilityToggle.displayName = 'ColumnVisibilityToggle';\n","/**\n * Stateless full-screen toggle for custom DataTable toolbars.\n */\nimport { Maximize2, Minimize2 } from 'lucide-react';\nimport { Button } from '../../../base/buttons';\nimport { cn } from '../../../../lib/utils';\n\nconst buttonClass =\n\t'text-muted-foreground hover:text-foreground disabled:pointer-events-none disabled:opacity-50';\n\nexport interface FullscreenToggleProps {\n\t/** Whether the table currently covers the viewport. */\n\tfullscreen: boolean;\n\t/** Fired with the next full-screen state. */\n\tonFullscreenChange: (fullscreen: boolean) => void;\n\t/** Accessible copy for entering full screen. */\n\tenterLabel?: string;\n\t/** Accessible copy for leaving full screen. */\n\texitLabel?: string;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function FullscreenToggle({\n\tfullscreen,\n\tonFullscreenChange,\n\tenterLabel = 'Enter full screen',\n\texitLabel = 'Exit full screen',\n\tclassName,\n}: FullscreenToggleProps) {\n\tconst label = fullscreen ? exitLabel : enterLabel;\n\tconst Icon = fullscreen ? Minimize2 : Maximize2;\n\n\treturn (\n\t\t<Button\n\t\t\ttype=\"button\"\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\tsize=\"sm\"\n\t\t\ticonOnly\n\t\t\taria-label={label}\n\t\t\taria-pressed={fullscreen}\n\t\t\tonClick={() => onFullscreenChange(!fullscreen)}\n\t\t\tclassName={cn('fullscreen-toggle--component', buttonClass, className)}\n\t\t>\n\t\t\t<Icon className=\"size-icon-sm\" />\n\t\t</Button>\n\t);\n}\n\nFullscreenToggle.displayName = 'FullscreenToggle';\n","import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button } from '../../base/buttons';\nimport { cn } from '../../../lib/utils';\nimport { controlGroupHeightClasses, segmentedControlRecipes } from '../../../lib/control-group-recipes';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { defaultDataTableStrings } from './table.strings';\nimport { type DataTableToolbarProps } from './table.types';\nimport { ColumnVisibilityToggle } from './column-visibility-toggle';\nimport { FullscreenToggle } from './partials/fullscreen-toggle';\n\nconst SCROLL_AMOUNT = 300;\n\nconst btnBase = 'text-muted-foreground transition-colors duration-150 hover:text-foreground disabled:pointer-events-none disabled:opacity-50';\n\ninterface ToolbarIconButtonProps {\n\t/** Display label. */\n\tlabel: string;\n\tonClick: () => void;\n\t/** Renders the entry as unselectable. */\n\tdisabled?: boolean;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\tchildren: React.ReactNode;\n}\n\nfunction ToolbarIconButton({ label, onClick, disabled, className, children }: ToolbarIconButtonProps) {\n\treturn (\n\t\t<Button\n\t\t\ttype=\"button\"\n\t\t\ttone=\"secondary\"\n\t\t\tbuttonStyle=\"ghost\"\n\t\t\tsize=\"sm\" iconOnly\n\t\t\taria-label={label}\n\t\t\t\tclassName={cn('table-toolbar--component', btnBase, segmentedControlRecipes.joinedItem, className)}\n\t\t\tonClick={onClick}\n\t\t\tdisabled={disabled}\n\t\t>\n\t\t\t{children}\n\t\t</Button>\n\t);\n}\n\n/**\n * Finds the actual horizontally-scrollable element inside the table area.\n * The Table primitive renders: <div data-slot=\"table-container\" class=\"overflow-x-auto\">\n */\nfunction getScrollContainer(tableArea: HTMLDivElement | null): HTMLDivElement | null {\n\tif (!tableArea) return null;\n\treturn tableArea.querySelector<HTMLDivElement>('[data-slot=\"table-container\"]');\n}\n\nexport function DataTableToolbar<TData>({\n\ttable,\n\ttableAreaRef,\n\tfullscreen,\n\tonFullscreenChange,\n\tshowFullscreenToggle = false,\n\tenableColumnVisibility = false,\n\tlabelVisibility = 'hidden',\n\tstrings = defaultDataTableStrings,\n}: DataTableToolbarProps<TData>) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst size = resolveComponentScale(undefined, defaultScale);\n\tconst [canScrollLeft, setCanScrollLeft] = useState(false);\n\tconst [canScrollRight, setCanScrollRight] = useState(false);\n\tconst rafRef = useRef(0);\n\tconst cleanupRef = useRef<(() => void) | null>(null);\n\n\t// --- Scroll overflow detection ---\n\tconst checkOverflow = useCallback(() => {\n\t\tconst el = getScrollContainer(tableAreaRef.current);\n\t\tif (!el) {\n\t\t\tsetCanScrollLeft(false);\n\t\t\tsetCanScrollRight(false);\n\t\t\treturn;\n\t\t}\n\t\tconst { scrollLeft, scrollWidth, clientWidth } = el;\n\t\tsetCanScrollLeft(scrollLeft > 1);\n\t\tsetCanScrollRight(scrollLeft + clientWidth < scrollWidth - 1);\n\t}, [tableAreaRef]);\n\n\tuseEffect(() => {\n\t\t// Defer slightly to ensure the Table primitive has rendered its container\n\t\tconst timerId = window.setTimeout(() => {\n\t\t\tconst el = getScrollContainer(tableAreaRef.current);\n\t\t\tif (!el) return;\n\n\t\t\t// Initial check\n\t\t\tcheckOverflow();\n\n\t\t\tif (typeof ResizeObserver === 'undefined') return;\n\n\t\t\tconst handleScroll = () => {\n\t\t\t\tcancelAnimationFrame(rafRef.current);\n\t\t\t\trafRef.current = requestAnimationFrame(checkOverflow);\n\t\t\t};\n\n\t\t\tel.addEventListener('scroll', handleScroll, { passive: true });\n\n\t\t\t// ResizeObserver to detect when table width changes\n\t\t\tconst ro = new ResizeObserver(checkOverflow);\n\t\t\tro.observe(el);\n\t\t\tif (el.firstElementChild) {\n\t\t\t\tro.observe(el.firstElementChild);\n\t\t\t}\n\n\t\t\t// Store cleanup references\n\t\t\tcleanupRef.current = () => {\n\t\t\t\tel.removeEventListener('scroll', handleScroll);\n\t\t\t\tcancelAnimationFrame(rafRef.current);\n\t\t\t\tro.disconnect();\n\t\t\t};\n\t\t}, 0);\n\n\t\treturn () => {\n\t\t\twindow.clearTimeout(timerId);\n\t\t\tcleanupRef.current?.();\n\t\t};\n\t\t// Re-run when full-screen mode changes because the viewport-sized layout\n\t\t// can alter horizontal overflow.\n\t}, [tableAreaRef, checkOverflow, fullscreen]);\n\n\t// --- Scroll handlers ---\n\tconst handleScrollLeft = useCallback(() => {\n\t\tgetScrollContainer(tableAreaRef.current)?.scrollBy({ left: -SCROLL_AMOUNT, behavior: 'smooth' });\n\t}, [tableAreaRef]);\n\n\tconst handleScrollRight = useCallback(() => {\n\t\tgetScrollContainer(tableAreaRef.current)?.scrollBy({ left: SCROLL_AMOUNT, behavior: 'smooth' });\n\t}, [tableAreaRef]);\n\n\t// --- Column visibility ---\n\tconst hideableColumns = enableColumnVisibility\n\t\t? table.getAllColumns().filter((column) => column.getCanHide())\n\t\t: [];\n\n\tconst hasScrollArrows = canScrollLeft || canScrollRight;\n\tconst hasColumns = hideableColumns.length > 0;\n\tconst hasFullscreen = showFullscreenToggle;\n\tif (!hasScrollArrows && !hasColumns && !hasFullscreen) return null;\n\n\treturn (\n\t\t<div className={cn(segmentedControlRecipes.joinedFrame, controlGroupHeightClasses[size], 'bg-card text-card-foreground')}>\n\t\t\t{/* Scroll arrows - only rendered when overflow exists */}\n\t\t\t{!!hasScrollArrows && (\n\t\t\t\t<>\n\t\t\t\t\t<ToolbarIconButton\n\t\t\t\t\t\tlabel={strings.toolbar.scrollLeft}\n\t\t\t\t\t\tonClick={handleScrollLeft}\n\t\t\t\t\t\tdisabled={!canScrollLeft}\n\t\t\t\t\t\tclassName={segmentedControlRecipes.firstItem}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronLeft className=\"size-icon-sm\" />\n\t\t\t\t\t</ToolbarIconButton>\n\t\t\t\t\t<ToolbarIconButton\n\t\t\t\t\t\tlabel={strings.toolbar.scrollRight}\n\t\t\t\t\t\tonClick={handleScrollRight}\n\t\t\t\t\t\tdisabled={!canScrollRight}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronRight className=\"size-icon-sm\" />\n\t\t\t\t\t</ToolbarIconButton>\n\t\t\t\t\t{(hasColumns || hasFullscreen) && <div className=\"h-4 w-px self-center bg-border\" />}\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{/* Column visibility dropdown */}\n\t\t\t{!!hasColumns && (\n\t\t\t\t<>\n\t\t\t\t\t<ColumnVisibilityToggle\n\t\t\t\t\t\ttable={table}\n\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\tlabelVisibility={labelVisibility}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tsegmentedControlRecipes.joinedItem, 'border-0 shadow-none',\n\t\t\t\t\t\t\t!hasScrollArrows && segmentedControlRecipes.firstItem,\n\t\t\t\t\t\t\t!hasFullscreen && segmentedControlRecipes.lastItem,\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t\t{hasFullscreen && <div className=\"h-4 w-px self-center bg-border\" />}\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{hasFullscreen && (\n\t\t\t\t<FullscreenToggle\n\t\t\t\t\tfullscreen={fullscreen}\n\t\t\t\t\tonFullscreenChange={onFullscreenChange}\n\t\t\t\t\tenterLabel={strings.toolbar.enterFullscreen}\n\t\t\t\t\texitLabel={strings.toolbar.exitFullscreen}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\tsegmentedControlRecipes.joinedItem, segmentedControlRecipes.lastItem,\n\t\t\t\t\t\t!hasScrollArrows && !hasColumns &&\n\t\t\t\t\t\t\tsegmentedControlRecipes.firstItem,\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nDataTableToolbar.displayName = 'DataTableToolbar';\n","/**\n * DataTable — TanStack-powered data table with sorting, row selection, column\n * visibility, server-side pagination, full-screen mode, sticky header / first column,\n * and pluggable row actions (menu / inline / responsive).\n *\n * Strings are overridable through the `strings` prop and a default set in\n * `./table.strings`. Column visibility persists to localStorage when a\n * `storageKey` is provided; full-screen state remains an explicit UI contract.\n *\n * Use the cell renderers exported from `./partials/cell-renderers`\n * (`StatusCell`, `DateCell`, `CurrencyCell`, `AvatarCell`) for visually\n * consistent cells across pages.\n */\nimport {\n\tgetCoreRowModel,\n\tgetFilteredRowModel,\n\tgetSortedRowModel,\n\tuseReactTable,\n\ttype SortingState,\n\ttype VisibilityState,\n\ttype Updater,\n\ttype ColumnDef,\n\ttype ColumnFiltersState,\n\ttype RowSelectionState,\n} from '@tanstack/react-table';\nimport {\n\tcreateContext,\n\tuseContext,\n\tuseState,\n\tuseMemo,\n\tuseCallback,\n\tuseRef,\n\ttype CSSProperties,\n\ttype FocusEvent,\n\ttype RefObject,\n} from 'react';\nimport { Table, type TableProps } from '../../base/table';\nimport { BatchActionBar } from '../../base/batch-action-bar';\nimport { Input } from '../../base/text-inputs';\nimport { Separator } from '../../base/display/separator';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { useFullscreenTableModality } from './hooks';\nimport { cn } from '../../../lib/utils';\nimport { focusRecipes } from '../../../lib/focus-recipes';\n\n/**\n * Context exposing the current `<DataTable size>` to descendant cell renderers\n * so consumer-built cells can stay typographically aligned with the table\n * (instead of hardcoding `<Text>` and breaking the unification the\n * `size` prop is supposed to give).\n *\n * Use it from custom cells:\n * const textSize = useDataTableSize();\n * return <Text className=\"data-table--component\" size={textSize}>{value}</Text>;\n *\n * The built-in renderers in `partials/cell-renderers` consume this hook.\n */\nconst DataTableSizeContext = createContext<'xs' | 'sm'>('sm');\n\nexport function useDataTableSize(): 'xs' | 'sm' {\n\treturn useContext(DataTableSizeContext);\n}\nimport { Pagination } from './pagination';\nimport { DataTableActions } from './table-actions';\nimport { DataTableBody } from './table-body';\nimport { DataTableHeader } from './table-header';\nimport { DataTableToolbar } from './table-toolbar';\nimport { addSelectionColumn } from './table-helpers';\nimport { mergeDataTableStrings } from './table.strings';\nimport {\n\ttype DataTableProps,\n\ttype DataTableSelectionToolbarContext,\n} from './table.types';\n\n// The base table owns head and cell geometry from the shared row recipe; the\n// DataTable `size` only chooses its row density. Header and body text stay on\n// the default admin body scale at every size.\nconst densityByDataTableSize: Record<NonNullable<DataTableProps<object, unknown>['size']>, NonNullable<TableProps['density']>> = {\n\tsm: 'compact',\n\tmd: 'default',\n\tlg: 'comfortable',\n};\n\nconst textSizeByDataTableSize: Record<NonNullable<DataTableProps<object, unknown>['size']>, 'xs' | 'sm'> = {\n\tsm: 'sm',\n\tmd: 'sm',\n\tlg: 'sm',\n};\n\nconst toCssSize = (value: number | string | undefined): string | undefined => {\n\tif (value === undefined) return undefined;\n\treturn typeof value === 'number' ? `${value}px` : value;\n};\n\n// The toolbar supplies a text query. Give only its default target a text\n// recipe: TanStack's automatic numeric filter expects a range tuple instead.\nfunction withTextFilter<TData extends object, TValue>(\n\tcolumns: ColumnDef<TData, TValue>[],\n\tfilterColumn: string,\n): ColumnDef<TData, TValue>[] {\n\treturn columns.map((column) => {\n\t\tif ('columns' in column && column.columns) {\n\t\t\treturn { ...column, columns: withTextFilter(column.columns, filterColumn) };\n\t\t}\n\t\tconst columnId = column.id\n\t\t\t?? ('accessorKey' in column && typeof column.accessorKey === 'string'\n\t\t\t\t? column.accessorKey.replace(/\\./g, '_') : undefined)\n\t\t\t?? (typeof column.header === 'string' ? column.header : undefined);\n\t\treturn columnId === filterColumn && column.filterFn === undefined\n\t\t\t? { ...column, filterFn: 'includesString' }\n\t\t\t: column;\n\t});\n}\n\nexport function DataTable<TData extends object, TValue = unknown>({\n\tsize,\n\tsurface = 'card',\n\theaderTransparent = true,\n\tcolumns,\n\tdata,\n\tcolumnGroups,\n\trowActions,\n\trowActionsMenuLabel,\n\trowActionsDisplayMode,\n\trowActionsBreakpoint,\n\tenableSorting = false,\n\tenableResizing = false,\n\tenableFiltering = false,\n\tfilterColumn,\n\tfilterPlaceholder,\n\tmanualSorting = false,\n\tenableColumnVisibility = false,\n\tfullscreen: controlledFullscreen,\n\tdefaultFullscreen = false,\n\tonFullscreenChange,\n\tshowFullscreenToggle = false,\n\tenableRowSelection = false,\n\tenableMultiRowSelection = true,\n\tenableSubRowSelection = false,\n\tpagination,\n\tpageQueryKey,\n\tonPageChange,\n\tonSortingChange,\n\tonColumnFiltersChange,\n\tonRowClick,\n\tonRowSelectionChange,\n\tstickyHeader = false,\n\tstickyToolbar = false,\n\tstickyFirstColumn = false,\n\tmaxBodyHeight,\n\tfillAvailableHeight = false,\n\temptyStateMessage,\n\temptyStateAction,\n\tclassName = '',\n\trowClassName = '',\n\tcellClassName = '',\n\theaderClassName = '',\n\twrapperClassName = '',\n\tinnerClassName = '',\n\ttableContainerClassName = '',\n\tgetRowId,\n\trowSelection: controlledRowSelection,\n\tsorting: controlledSorting,\n\tdefaultSorting,\n\tcolumnVisibility: controlledColumnVisibility,\n\tdefaultColumnVisibility,\n\tinitialState,\n\tonColumnVisibilityChange,\n\tstrings: stringsOverride,\n\ttopbarContent,\n\ttopbarEnd,\n\ttopbarClassName,\n\ttoolbarLabelVisibility = 'hidden',\n\tfooterContent,\n\tselectionToolbar,\n\tbulkActions,\n\tselectionToolbarClassName,\n\tselectionToolbarPlacement = 'floating',\n\ttotalRowCount: totalRowCountProp,\n\tstorageKey,\n}: DataTableProps<TData, TValue>) {\n\tconst { defaultScale } = useDensityConfig();\n\tconst resolvedSize = resolveComponentScale(size, defaultScale);\n\n\tconst strings = useMemo(\n\t\t() => mergeDataTableStrings(stringsOverride),\n\t\t[stringsOverride],\n\t);\n\n\tconst tableRowClasses = cn('bg-card text-card-foreground', rowClassName);\n\tconst resolvedEmptyStateMessage = emptyStateMessage ?? strings.emptyState.message;\n\tconst resolvedPageQueryKey = pageQueryKey ?? 'page';\n\tconst resolvedMaxBodyHeight = toCssSize(maxBodyHeight);\n\n\t\t// --- Detect and resolve tuple pattern for columns ---\n\t\tconst resolvedColumns = (() => {\n\t\t\t// Tuple pattern detected: [columns, deps]\n\t\t\tif (Array.isArray(columns) && columns.length === 2 && Array.isArray(columns[1])) {\n\t\t\t\treturn columns[0] as ColumnDef<TData, TValue>[];\n\t\t\t}\n\n\t\t\t// Regular pattern: just columns array\n\t\t\treturn columns as ColumnDef<TData, TValue>[];\n\t\t})();\n\n\t// --- Format storage key internally ---\n\tconst formattedStorageKey = useMemo(() => {\n\t\treturn storageKey ? `dt.${storageKey}.columns` : null;\n\t}, [storageKey]);\n\n\t// --- Load initial column visibility from localStorage if persistence enabled ---\n\tconst initialColumnVisibility = useMemo<VisibilityState>(() => {\n\t\tconst explicitDefault =\n\t\t\tdefaultColumnVisibility ?? initialState?.columnVisibility ?? {};\n\n\t\t// If persistence is disabled or we're in SSR, use initialState or empty object\n\t\tif (!formattedStorageKey || typeof window === 'undefined') {\n\t\t\treturn explicitDefault;\n\t\t}\n\n\t\ttry {\n\t\t\tconst stored = window.localStorage.getItem(formattedStorageKey);\n\t\t\tconst parsed = stored ? (JSON.parse(stored) as VisibilityState) : {};\n\t\t\t// Explicit defaults win over persisted values.\n\t\t\treturn { ...parsed, ...explicitDefault };\n\t\t} catch {\n\t\t\t// If parsing fails, fall back to the explicit default.\n\t\t\treturn explicitDefault;\n\t\t}\n\t}, [defaultColumnVisibility, formattedStorageKey, initialState?.columnVisibility]);\n\n\t// --- State for sorting, visibility, selection, and full screen ---\n\tconst [internalSorting, setInternalSorting] = useState<SortingState>(\n\t\tdefaultSorting ?? initialState?.sorting ?? [],\n\t);\n\tconst [columnFilters, setColumnFilters] = useState<ColumnFiltersState>(\n\t\tinitialState?.columnFilters ?? [],\n\t);\n\tconst [internalColumnVisibility, setInternalColumnVisibility] = useState<VisibilityState>(\n\t\tinitialColumnVisibility,\n\t);\n\tconst [internalRowSelection, setInternalRowSelection] = useState<RowSelectionState>(\n\t\tinitialState?.rowSelection || {},\n\t);\n\tconst [internalFullscreen, setInternalFullscreen] = useState(defaultFullscreen);\n\tconst sorting = controlledSorting ?? internalSorting;\n\tconst columnVisibility = controlledColumnVisibility ?? internalColumnVisibility;\n\tconst rowSelection = controlledRowSelection ?? internalRowSelection;\n\tconst fullscreen = controlledFullscreen ?? internalFullscreen;\n\n\t// --- Refs ---\n\tconst tableAreaRef = useRef<HTMLDivElement>(null);\n\t// When the selection bar goes away with focus in it, focus returns to the\n\t// control the user last used in the table, or to select-all once that row is\n\t// gone, so it never falls to the document body.\n\tconst lastTableFocusRef = useRef<HTMLElement | null>(null);\n\tconst selectionReturnFocusRef = useMemo<RefObject<HTMLElement | null>>(() => ({\n\t\tget current() {\n\t\t\tconst last = lastTableFocusRef.current;\n\t\t\tif (last?.isConnected) return last;\n\t\t\treturn tableAreaRef.current?.querySelector<HTMLElement>('thead [role=\"checkbox\"]') ?? null;\n\t\t},\n\t}), []);\n\tconst rememberTableFocus = useCallback((event: FocusEvent<HTMLDivElement>) => {\n\t\tif (event.target instanceof HTMLElement) lastTableFocusRef.current = event.target;\n\t}, []);\n\n\t// --- Callbacks ---\n\tconst handleColumnFiltersChange = useCallback(\n\t\t(updater: Updater<ColumnFiltersState>) => {\n\t\t\tconst nextFilters = typeof updater === 'function' ? updater(columnFilters) : updater;\n\t\t\tsetColumnFilters(nextFilters);\n\t\t\tonColumnFiltersChange?.(nextFilters);\n\t\t},\n\t\t[columnFilters, onColumnFiltersChange],\n\t);\n\n\tconst handleSortingChangeCallback = useCallback(\n\t\t(updater: Updater<SortingState>) => {\n\t\t\tconst nextSorting =\n\t\t\t\ttypeof updater === 'function' ? updater(sorting) : updater;\n\n\t\t\tif (controlledSorting === undefined) {\n\t\t\t\tsetInternalSorting(nextSorting);\n\t\t\t}\n\n\t\t\tonSortingChange?.(nextSorting);\n\t\t},\n\t\t[controlledSorting, onSortingChange, sorting],\n\t);\n\n\tconst handleVisibilityChangeCallback = useCallback(\n\t\t(updater: Updater<VisibilityState>) => {\n\t\t\tconst nextVisibility =\n\t\t\t\ttypeof updater === 'function' ? updater(columnVisibility) : updater;\n\n\t\t\tif (controlledColumnVisibility === undefined) {\n\t\t\t\tsetInternalColumnVisibility(nextVisibility);\n\t\t\t}\n\n\t\t\t// Persist to localStorage if enabled.\n\t\t\tif (formattedStorageKey && typeof window !== 'undefined') {\n\t\t\t\ttry {\n\t\t\t\t\twindow.localStorage.setItem(\n\t\t\t\t\t\tformattedStorageKey,\n\t\t\t\t\t\tJSON.stringify(nextVisibility),\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Silent fail - quota exceeded or other localStorage errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tonColumnVisibilityChange?.(nextVisibility);\n\t\t},\n\t\t[\n\t\t\tcolumnVisibility,\n\t\t\tcontrolledColumnVisibility,\n\t\t\tformattedStorageKey,\n\t\t\tonColumnVisibilityChange,\n\t\t],\n\t);\n\n\tconst handleRowSelectionChangeCallback = useCallback(\n\t\t(updater: Updater<RowSelectionState>) => {\n\t\t\tconst nextRowSelection =\n\t\t\t\ttypeof updater === 'function' ? updater(rowSelection) : updater;\n\n\t\t\tif (controlledRowSelection === undefined) {\n\t\t\t\tsetInternalRowSelection(nextRowSelection);\n\t\t\t}\n\n\t\t\tonRowSelectionChange?.(nextRowSelection);\n\t\t},\n\t\t[controlledRowSelection, onRowSelectionChange, rowSelection],\n\t);\n\n\tconst fullscreenRegionRef = useRef<HTMLDivElement | null>(null);\n\n\tconst handleFullscreenChange = useCallback(\n\t\t(nextFullscreen: boolean) => {\n\t\t\tif (controlledFullscreen === undefined) {\n\t\t\t\tsetInternalFullscreen(nextFullscreen);\n\t\t\t}\n\t\t\tonFullscreenChange?.(nextFullscreen);\n\t\t},\n\t\t[controlledFullscreen, onFullscreenChange],\n\t);\n\n\tconst exitFullscreen = useCallback(\n\t\t() => handleFullscreenChange(false),\n\t\t[handleFullscreenChange],\n\t);\n\tuseFullscreenTableModality(fullscreen, fullscreenRegionRef, exitFullscreen);\n\n\tconst getRowActionsMenuLabel = useCallback(\n\t\t(row: TData) => {\n\t\t\tif (typeof rowActionsMenuLabel === 'function') {\n\t\t\t\treturn rowActionsMenuLabel(row);\n\t\t\t}\n\n\t\t\treturn rowActionsMenuLabel ?? strings.actions.menuLabel;\n\t\t},\n\t\t[rowActionsMenuLabel, strings.actions.menuLabel],\n\t);\n\n\tconst columnsWithActions = useMemo<ColumnDef<TData, TValue>[]>(() => {\n\t\tconst searchableColumns = enableFiltering && filterColumn\n\t\t\t? withTextFilter(resolvedColumns, filterColumn)\n\t\t\t: resolvedColumns;\n\t\tconst baseColumns = enableRowSelection\n\t\t\t? addSelectionColumn<TData, TValue>(searchableColumns, strings)\n\t\t\t: searchableColumns;\n\n\t\t// if no actions, leave cols untouched\n\t\tif (!rowActions) {\n\t\t\treturn baseColumns;\n\t\t}\n\n\t\t// otherwise append a fixed Actions column:\n\t\tconst actionCol: ColumnDef<TData, TValue> = {\n\t\t\tid: 'actions',\n\t\t\theader: strings.actions.triggerLabel,\n\t\t\t// NOTE: just hand `rowActions` array, not a call\n\t\t\tcell: ({ row }: { row: { original: TData } }) => (\n\t\t\t\t<DataTableActions\n\t\t\t\t\trow={row.original}\n\t\t\t\t\tactions={rowActions}\n\t\t\t\t\tmenuLabel={getRowActionsMenuLabel(row.original)}\n\t\t\t\t\tdisplayMode={rowActionsDisplayMode}\n\t\t\t\t\tresponsiveBreakpoint={rowActionsBreakpoint}\n\t\t\t\t\tstrings={strings}\n\t\t\t\t/>\n\t\t\t),\n\t\t\tenableSorting: false,\n\t\t\tenableHiding: false,\n\t\t\tsize: 40,\n\t\t};\n\n\t\treturn [...baseColumns, actionCol];\n\t}, [\n\t\tresolvedColumns,\n\t\tenableFiltering,\n\t\tfilterColumn,\n\t\tenableRowSelection,\n\t\trowActions,\n\t\tgetRowActionsMenuLabel,\n\t\trowActionsBreakpoint,\n\t\trowActionsDisplayMode,\n\t\tstrings,\n\t]);\n\n\t// --- Configure table ---\n\tconst table = useReactTable({\n\t\tdata,\n\t\tcolumns: columnsWithActions,\n\t\tstate: { sorting, columnVisibility, rowSelection, columnFilters },\n\t\tenableSorting,\n\t\tenableColumnResizing: enableResizing,\n\t\tcolumnResizeMode: 'onChange',\n\t\t// Leave `size` unset unless a column declares one, so the header can tell\n\t\t// an explicit width from TanStack's implicit 150px; getSize() still falls back.\n\t\tdefaultColumn: { size: undefined },\n\t\tenableColumnFilters: enableFiltering,\n\t\tmanualFiltering: !enableFiltering,\n\t\tmanualSorting,\n\t\t// Pagination is consumer-owned through the `pagination` prop. Disabling\n\t\t// TanStack's unused auto-reset also avoids its render-time microtask from\n\t\t// attempting a state update before a concurrently rendered table mounts.\n\t\tautoResetPageIndex: false,\n\t\tenableRowSelection,\n\t\tenableMultiRowSelection,\n\t\tenableSubRowSelection,\n\t\tonSortingChange: enableSorting ? handleSortingChangeCallback : undefined,\n\t\tonRowSelectionChange:\n\t\t\tenableRowSelection ? handleRowSelectionChangeCallback : undefined,\n\t\tonColumnVisibilityChange: handleVisibilityChangeCallback,\n\t\tonColumnFiltersChange: handleColumnFiltersChange,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetFilteredRowModel: getFilteredRowModel(),\n\t\tgetSortedRowModel: getSortedRowModel(),\n\t\tgetRowId,\n\t});\n\t// Resolve safely: a missing or explicitly nonfilterable column must not\n\t// produce a control that accepts text without changing the visible rows.\n\tconst filterTarget = enableFiltering && filterColumn\n\t\t? table.getAllLeafColumns().find((column) => column.id === filterColumn && column.getCanFilter())\n\t\t: undefined;\n\tconst searchPlaceholder = filterPlaceholder ?? strings.filter.searchPlaceholder;\n\n\t// --- Determine server pagination ---\n\tconst shouldShow = pagination && pagination.last_page > 1;\n\tconst selectedRows = table.getSelectedRowModel().rows.map((row) => row.original);\n\tconst selectedRowCount = selectedRows.length;\n\tconst clearSelection = useCallback(() => {\n\t\ttable.resetRowSelection();\n\t}, [table]);\n\t// The whole result, not the loaded page: server pagination knows the total.\n\tconst totalRowCount = totalRowCountProp ?? pagination?.total ?? data.length;\n\tconst selectionToolbarContext: DataTableSelectionToolbarContext<TData> = {\n\t\ttable,\n\t\tselectedRows,\n\t\tselectedRowCount,\n\t\ttotalRowCount,\n\t\trowSelection,\n\t\tclearSelection,\n\t};\n\tconst selectionToolbarNode = (() => {\n\t\tif (!enableRowSelection) return null;\n\t\tif (selectionToolbar === null || selectionToolbar === false) return null;\n\t\tif (selectionToolbar !== undefined) {\n\t\t\tif (selectedRowCount === 0) return null;\n\t\t\treturn typeof selectionToolbar === 'function'\n\t\t\t\t? selectionToolbar(selectionToolbarContext)\n\t\t\t\t: selectionToolbar;\n\t\t}\n\t\tconst bulkActionNode = selectedRowCount === 0\n\t\t\t? null\n\t\t\t: typeof bulkActions === 'function'\n\t\t\t\t? bulkActions(selectionToolbarContext)\n\t\t\t\t: bulkActions;\n\t\t/*\n\t\t * The shared selection bar. Floating by default, so the selection stays\n\t\t * reachable after scrolling far from the topbar; fixed positioning escapes\n\t\t * this root's overflow clipping, and container queries do not trap it.\n\t\t * Mounted while selection is enabled (it renders nothing at zero), so it\n\t\t * is still there to return focus when the selection drops.\n\t\t */\n\t\tconst bar = (\n\t\t\t<BatchActionBar\n\t\t\t\tselectedCount={selectedRowCount}\n\t\t\t\ttotalCount={totalRowCount}\n\t\t\t\tonClear={clearSelection}\n\t\t\t\tplacement={selectionToolbarPlacement}\n\t\t\t\treturnFocusRef={selectionReturnFocusRef}\n\t\t\t\tclassName={cn('data-table-selection-toolbar--component', selectionToolbarClassName)}\n\t\t\t\tstrings={{\n\t\t\t\t\tsummary: (count, total) => strings.selection.summary(count, total ?? totalRowCount),\n\t\t\t\t\tclear: strings.selection.clear,\n\t\t\t\t\tlabel: strings.selection.label,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t{bulkActionNode}\n\t\t\t</BatchActionBar>\n\t\t);\n\t\t// Inline, the table's own region owns the inset around the bar; it\n\t\t// collapses while the bar renders nothing.\n\t\treturn selectionToolbarPlacement === 'inline' ? (\n\t\t\t<div data-slot=\"data-table-selection-toolbar\" className=\"data-table--selection-toolbar px-surface py-row-y empty:hidden\">\n\t\t\t\t{bar}\n\t\t\t</div>\n\t\t) : bar;\n\t})();\n\tconst tableAreaStyle = useMemo<CSSProperties | undefined>(() => {\n\t\tif (!resolvedMaxBodyHeight) return undefined;\n\t\treturn { '--data-table-body-max-height': resolvedMaxBodyHeight } as CSSProperties;\n\t}, [resolvedMaxBodyHeight]);\n\tconst shouldUseScrollableTableContainer =\n\t\tfullscreen || fillAvailableHeight || resolvedMaxBodyHeight !== undefined;\n\n\tconst Provider = DataTableSizeContext.Provider;\n\tconst resolvedTextSize = textSizeByDataTableSize[resolvedSize];\n\n\treturn (\n\t\t<Provider value={resolvedTextSize}>\n\t\t{/*\n\t\t * Full screen paints over the whole viewport, navigation included, so it\n\t\t * is modal whether or not it was designed as one. `role`/`aria-modal` say\n\t\t * so, and `useFullscreenTableModality` supplies the behaviour that claim\n\t\t * obliges: Escape leaves, Tab stays inside, focus returns to the toggle.\n\t\t * It is the one documented exception to features/overlays owning modals\n\t\t * (the `modal-owner` contract rule exempts this file only): maximising in\n\t\t * place keeps the table's DOM, scroll position and focus.\n\t\t */}\n\t\t<div\n\t\t\tref={fullscreenRegionRef}\n\t\t\trole={fullscreen ? 'dialog' : undefined}\n\t\t\taria-modal={fullscreen ? true : undefined}\n\t\t\taria-label={fullscreen ? strings.accessibility.fullscreenRegion : undefined}\n\t\t\tclassName={cn(\n\t\t\t'data-table--component @container/data-table box-border',\n\t\t\tfullscreen\n\t\t\t\t? 'fixed inset-0 z-50 bg-background text-foreground flex flex-col overflow-hidden p-surface'\n\t\t\t\t: cn(\n\t\t\t\t\t'w-full min-w-0 max-w-full',\n\t\t\t\t\tfillAvailableHeight && 'flex h-full min-h-0 flex-col',\n\t\t\t\t\tsurface === 'card' &&\n\t\t\t\t\t\t'overflow-hidden rounded-surface border border-border bg-card text-card-foreground shadow-xs',\n\t\t\t\t\tsurface === 'glass' &&\n\t\t\t\t\t\t'rounded-surface overflow-hidden border border-border/60',\n\t\t\t\t\t// `flat` renders no chrome — consumer wraps.\n\t\t\t\t\twrapperClassName,\n\t\t\t\t),\n\t\t)}>\n\t\t\t{!!(filterTarget || topbarContent || topbarEnd || enableColumnVisibility || showFullscreenToggle) && (\n\t\t\t\t<div className={cn('relative', stickyToolbar && 'sticky top-0 z-20 bg-card text-card-foreground')}>\n\n\t\t\t\t\t<div className={cn(\n\t 'data-table-topbar grid gap-space-lg px-surface py-surface-sm @2xl/data-table:grid-cols-[minmax(0,1fr)_auto] @2xl/data-table:items-start',\n\t\t\t\t\t\tfullscreen ? 'mb-space-lg shrink-0' : 'mb-0',\n\t\t\t\t\t\ttopbarClassName,\n\t\t\t\t\t)}>\n\t\t\t\t\t\t<div className=\"data-table-topbar-left flex min-w-0 flex-col gap-space-md\">\n\t\t\t\t\t\t\t{topbarContent}\n\t\t\t\t\t\t\t{filterTarget && (\n\t\t\t\t\t\t\t\t<div className=\"min-w-0 max-w-sm\">\n\t\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\t\taria-label={searchPlaceholder}\n\t\t\t\t\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\t\t\t\t\tvalue={(filterTarget.getFilterValue() as string) ?? ''}\n\t\t\t\t\t\t\t\t\t\tonChange={(event) => filterTarget.setFilterValue(event.target.value)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"data-table-topbar-right flex flex-wrap items-center justify-end gap-space-md\">\n\t\t\t\t\t\t\t{topbarEnd}\n\t\t\t\t\t\t\t<DataTableToolbar\n\t\t\t\t\t\t\t\ttable={table}\n\t\t\t\t\t\t\t\ttableAreaRef={tableAreaRef}\n\t\t\t\t\t\t\t\tfullscreen={fullscreen}\n\t\t\t\t\t\t\t\tonFullscreenChange={handleFullscreenChange}\n\t\t\t\t\t\t\t\tshowFullscreenToggle={showFullscreenToggle}\n\t\t\t\t\t\t\t\tenableColumnVisibility={enableColumnVisibility}\n\t\t\t\t\t\t\t\tlabelVisibility={toolbarLabelVisibility}\n\t\t\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t</div>\n\t\t\t\t\t<Separator />\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{selectionToolbarNode}\n\n\t\t\t<div\n\t\t\t\tref={tableAreaRef}\n\t\t\t\tstyle={tableAreaStyle}\n\t\t\t\tonFocus={enableRowSelection ? rememberTableFocus : undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'min-h-0',\n\t\t\t\t\tshouldUseScrollableTableContainer ? 'overflow-hidden' : innerClassName,\n\t\t\t\t\t(fullscreen || fillAvailableHeight) && 'flex-1',\n\t\t\t\t)}\n\t\t\t>\n\n\t\t\t\t<Table\n\t\t\t\t\tdensity={densityByDataTableSize[resolvedSize]}\n\t\t\t\t\tcontainerProps={{role: 'region', 'aria-label': strings.accessibility.scrollRegion}}\n\t\t\t\t\tstyle={enableResizing ? {width: table.getTotalSize()} : undefined}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'relative', enableResizing && 'min-w-full table-fixed',\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\tcontainerClassName={cn(\n\t\t\t\t\t\t`focus-visible:outline-none ${focusRecipes.edge}`,\n\t\t\t\t\t\tshouldUseScrollableTableContainer && 'overflow-auto',\n\t\t\t\t\t\tresolvedMaxBodyHeight !== undefined && 'max-h-(--data-table-body-max-height)',\n\t\t\t\t\t\t(fullscreen || fillAvailableHeight) && 'h-full min-h-0',\n\t\t\t\t\t\ttableContainerClassName,\n\t\t\t\t\t)}\n\t\t\t\t>\n\t\t\t\t\t<DataTableHeader\n\t\t\t\t\t\tenableResizing={enableResizing}\n\t\t\t\t\t\ttable={table}\n\t\t\t\t\t\tstickyHeader={stickyHeader}\n\t\t\t\t\t\theaderClassName={headerClassName}\n\t\t\t\t\t\tcellClassName={cellClassName}\n\t\t\t\t\t\tstickyFirstColumn={stickyFirstColumn}\n\t\t\t\t\t\tcolumnGroups={columnGroups}\n\t\t\t\t\t\theaderTransparent={headerTransparent}\n\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t/>\n\t\t\t\t\t<DataTableBody\n\t\t\t\t\t\ttable={table}\n\t\t\t\t\t\tonRowClick={onRowClick}\n\t\t\t\t\t\temptyStateMessage={resolvedEmptyStateMessage}\n\t\t\t\t\t\temptyStateAction={emptyStateAction}\n\t\t\t\t\t\tcellClassName={cellClassName}\n\t\t\t\t\t\trowClassName={tableRowClasses}\n\t\t\t\t\t\tstickyFirstColumn={stickyFirstColumn}\n\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t/>\n\t\t\t\t</Table>\n\t\t\t</div>\n\t\t\t{!!shouldShow && (\n\t\t\t\t<>\n\t\t\t\t\t<Separator />\n\t\t\t\t\t<Pagination\n\t\t\t\t\t\tpagination={pagination}\n\t\t\t\t\t\tonPageChange={onPageChange}\n\t\t\t\t\t\tpageQueryKey={resolvedPageQueryKey}\n\t\t\t\t\t\tlabels={strings.pagination}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t{!!footerContent && (\n\t\t\t\t<div\n\t\t\t\t\tdata-slot=\"data-table-footer\"\n\t\t\t\t\t\tclassName=\"data-table--footer border-t border-border/60 px-surface py-row-y\"\n\t\t\t\t>\n\t\t\t\t\t{footerContent}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t\t</Provider>\n\t);\n}\n\nDataTable.displayName = 'DataTable';\n","import { Input } from '../../base/text-inputs';\nimport { ColumnVisibilityToggle } from './column-visibility-toggle';\nimport { defaultDataTableStrings } from './table.strings';\nimport { type DataTableFilterBarProps } from './table.types';\n\nimport { cn } from '../../../lib/utils';\nexport function DataTableFilterBar<TData>({\n\t\t\t\t\t\t\t\t\t\t\t table,\n\t\t\t\t\t\t\t\t\t\t\t filterColumn,\n\t\t\t\t\t\t\t\t\t\t\t filterPlaceholder,\n\t\t\t\t\t\t\t\t\t\t\t enableColumnVisibility = false,\n\t\t\t\t\t\t\t\t\t\t\t customContent,\n\t\t\t\t\t\t\t\t\t\t strings = defaultDataTableStrings,\n\t\t\t\t\t\t\t\t\t }: DataTableFilterBarProps<TData>) {\n\tif (!filterColumn && !enableColumnVisibility && !customContent) {\n\t\treturn null;\n\t}\n\n\tconst searchPlaceholder = filterPlaceholder ?? strings.filter.searchPlaceholder;\n\n\treturn (\n\t\t<div className={cn('filter-bar--component', 'flex items-center justify-between p-surface')}>\n\t\t\t<div className=\"flex flex-1 items-center space-x-space-md\">\n\t\t\t\t{/* Filter input */}\n\t\t\t\t{!!filterColumn && (\n\t <Input\n\t\t\t\t\t\tplaceholder={searchPlaceholder}\n\t\t\t\t\t\tvalue={(table.getColumn(filterColumn)?.getFilterValue() as string) ?? ''}\n\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\tconst value = event.target.value;\n\t\t\t\t\t\t\ttable.getColumn(filterColumn)?.setFilterValue(value);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"max-w-sm\"\n\t\t\t\t\t/>\n\t )}\n\n\t\t\t\t{/* Custom content */}\n\t\t\t\t{customContent}\n\t\t\t</div>\n\n\t\t\t{/* Column visibility toggle */}\n\t\t\t\t{!!enableColumnVisibility && (\n\t\t\t\t\t<ColumnVisibilityToggle\n\t\t\t\t\t\ttable={table}\n\t\t\t\t\t\tstrings={strings}\n\t\t\t\t\t\tlabelVisibility=\"responsive\"\n\t\t\t\t\t\tclassName=\"ml-auto\"\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t</div>\n\t);\n}\n\nDataTableFilterBar.displayName = 'DataTableFilterBar';\n","import { isValidElement, type ReactElement, type ReactNode } from 'react';\nimport type { Locale } from 'date-fns';\n\nimport {\n\tDate as DateValue,\n\tDateTime,\n\tEmail,\n\tEmptyValue,\n\tFileSize,\n\ttype FileSizeUnit,\n\tLink,\n\tMoney,\n\ttype MoneyProps,\n\tMonoValue,\n\tMutedValue,\n\tName,\n\tNumber as NumberValue,\n\tPercent,\n\tPhone,\n\tRelativeTime,\n\tSecondaryValue,\n\tTime,\n\tUrl,\n\tValue,\n} from '../../../primitives';\nimport { cn } from '../../../../lib/utils';\n\nexport type CellValueKind =\n\t| 'value'\n\t| 'secondary'\n\t| 'muted'\n\t| 'name'\n\t| 'mono'\n\t| 'link'\n\t| 'email'\n\t| 'phone'\n\t| 'url'\n\t| 'money'\n\t| 'number'\n\t| 'percent'\n\t| 'fileSize'\n\t| 'date'\n\t| 'time'\n\t| 'dateTime'\n\t| 'relativeTime';\n\nexport type PrimitiveCellValue = string | number | Date | null | undefined;\n\n/**\n * A value plus the formatting needed to render it.\n *\n * `kind` selects the display primitive; every other option applies only to the\n * kinds noted below and is ignored otherwise, so one descriptor shape can\n * describe any cell in a column definition.\n */\nexport interface CellValueDescriptor {\n\t/** The raw value. Empty values render the missing state instead. */\n\tvalue?: PrimitiveCellValue;\n\t/** Which primitive renders the value. Defaults to `value`. */\n\tkind?: CellValueKind;\n\t/** Pre-rendered content used verbatim, bypassing `kind` and all formatting. */\n\tdisplay?: ReactNode;\n\t/** Destination for the entry, when it navigates. */\n\thref?: string;\n\t/** ISO currency code. `money` only. */\n\tcurrency?: string;\n\t/** Whether the currency shows as a symbol, code, or name. `money` only. */\n\tcurrencyDisplay?: MoneyProps['currencyDisplay'];\n\t/** Smallest number of decimals to show. `money`, `number`, and `percent`. */\n\tminimumFractionDigits?: number;\n\t/** Largest number of decimals to show. `money`, `number`, and `percent`. */\n\tmaximumFractionDigits?: number;\n\t/** Selects the compact or full money presentation. `money` only. */\n\tformatMode?: MoneyProps['formatMode'];\n\t/** BCP 47 locale for number and currency formatting. */\n\tlocale?: string;\n\t/** date-fns `Locale` for date and time formatting. */\n\tdateLocale?: Locale;\n\t/** Unit the raw value is already expressed in. `fileSize` only. */\n\tfrom?: FileSizeUnit;\n\t/** Renders the zero value rather than the missing state. */\n\tforce?: boolean;\n\t/** Escape hatch passed to `Intl.NumberFormat`. `number` and `percent`. */\n\toptions?: Intl.NumberFormatOptions;\n\t/** Treats the value as a fraction and scales it to a percentage. `percent` only. */\n\tscaled?: boolean;\n\t/** date-fns pattern, overriding `datePreset`. `date` and `dateTime`. */\n\tdateFormat?: string;\n\t/** Named date length. `date` and `dateTime`. */\n\tdatePreset?: 'compact' | 'short' | 'medium' | 'long';\n\t/** date-fns pattern for the time portion. `time` and `dateTime`. */\n\ttimeFormat?: string;\n\t/** Copy shown in place of an empty value. Defaults to an em dash. */\n\temptyLabel?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport type CellValueTuple = readonly [\n\tvalue: PrimitiveCellValue,\n\tkind?: CellValueKind,\n\toptions?: Omit<CellValueDescriptor, 'value' | 'kind'>,\n];\n\nexport type CellStackValue =\n\t| PrimitiveCellValue\n\t| false\n\t| ReactElement\n\t| CellValueDescriptor\n\t| CellValueTuple;\n\nexport interface CellValueProps extends Omit<CellValueDescriptor, 'className' | 'display'> {\n\t/** The value to display. When empty, renders fallback with muted styling. */\n\tvalue?: PrimitiveCellValue;\n\t/** Which primitive should render the value. Defaults to Value. */\n\tkind?: CellValueKind;\n\t/** Text shown when value is missing. Defaults to '--'. */\n\tfallback?: ReactNode;\n\t/** Force missing state regardless of value emptiness. */\n\tmissing?: boolean;\n\t/** Additional class names. */\n\tclassName?: string;\n\t/** Children override. When provided, renders children directly with missing styling applied. */\n\tchildren?: ReactNode;\n}\n\nexport interface CellStackProps {\n\t/** Values are filtered for null, undefined, and empty strings, then capped at four rows. */\n\tvalues?: readonly CellStackValue[];\n\t/** Copy shown when every value is empty. */\n\temptyLabel?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Merged onto the item. */\n\titemClassName?: string;\n\t/** Merged onto the primary. */\n\tprimaryClassName?: string;\n\t/** Merged onto the secondary. */\n\tsecondaryClassName?: string;\n\t/** Weight of the first row, which reads as the cell's primary value. */\n\tprimaryWeight?: 'regular' | 'medium' | 'semibold' | 'bold';\n}\n\nfunction isMissingPrimitive(value: PrimitiveCellValue | false) {\n\tif (value === false || value === null || value === undefined) return true;\n\tif (typeof value === 'string') return value.trim() === '';\n\treturn false;\n}\n\nfunction isMissingDisplay(value: ReactNode) {\n\treturn value === null || value === undefined;\n}\n\nfunction isDescriptor(value: CellStackValue): value is CellValueDescriptor {\n\treturn (\n\t\ttypeof value === 'object' &&\n\t\tvalue !== null &&\n\t\t!Array.isArray(value) &&\n\t\t!isValidElement(value) &&\n\t\t!(value instanceof Date)\n\t);\n}\n\nfunction isTuple(value: CellStackValue): value is CellValueTuple {\n\treturn Array.isArray(value);\n}\n\nfunction normalizeTuple(value: CellValueTuple): CellValueDescriptor {\n\tconst [rawValue, kind, options] = value;\n\treturn {\n\t\t...options,\n\t\tvalue: rawValue,\n\t\tkind,\n\t};\n}\n\nfunction normalizeCellValue(value: CellStackValue): CellValueDescriptor | ReactElement | null {\n\tif (value === false) return null;\n\tif (isValidElement(value)) return value;\n\tif (isTuple(value)) {\n\t\tconst descriptor = normalizeTuple(value);\n\t\treturn isMissingPrimitive(descriptor.value) && isMissingDisplay(descriptor.display) ? null : descriptor;\n\t}\n\tif (isDescriptor(value)) {\n\t\treturn isMissingPrimitive(value.value) && isMissingDisplay(value.display) ? null : value;\n\t}\n\treturn isMissingPrimitive(value) ? null : { value: value as PrimitiveCellValue };\n}\n\nfunction stringValue(value: PrimitiveCellValue) {\n\treturn value instanceof Date ? value.toISOString() : String(value ?? '');\n}\n\nfunction renderPrimitiveCellValue({\n\tdescriptor,\n\tindex = 0,\n\temptyLabel,\n\tclassName,\n\tprimaryWeight = 'medium',\n}: {\n\tdescriptor: CellValueDescriptor;\n\tindex?: number;\n\temptyLabel: ReactNode;\n\tclassName?: string;\n\tprimaryWeight?: NonNullable<CellStackProps['primaryWeight']>;\n}) {\n\tconst isPrimary = index === 0;\n\tconst kind = descriptor.kind ?? (isPrimary ? 'value' : 'secondary');\n\tconst value = descriptor.value;\n\tconst display: ReactNode = descriptor.display ?? (value instanceof Date ? stringValue(value) : value);\n\tconst resolvedEmptyLabel = descriptor.emptyLabel ?? emptyLabel;\n\tconst resolvedClassName = cn(className, descriptor.className);\n\tconst weight = isPrimary ? primaryWeight : 'regular';\n\n\tswitch (kind) {\n\t\tcase 'secondary':\n\t\t\treturn (\n\t\t\t\t<SecondaryValue size=\"inherit\" className={resolvedClassName}>\n\t\t\t\t\t{display}\n\t\t\t\t</SecondaryValue>\n\t\t\t);\n\t\tcase 'muted':\n\t\t\treturn (\n\t\t\t\t<MutedValue size=\"inherit\" className={resolvedClassName}>\n\t\t\t\t\t{display}\n\t\t\t\t</MutedValue>\n\t\t\t);\n\t\tcase 'name':\n\t\t\treturn (\n\t\t\t\t<Name\n\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\tvalue={descriptor.display === undefined && typeof value === 'string' ? value : undefined}\n\t\t\t\t\tforce={descriptor.force}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tweight={weight}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t>\n\t\t\t\t\t{descriptor.display}\n\t\t\t\t</Name>\n\t\t\t);\n\t\tcase 'mono':\n\t\t\treturn (\n\t\t\t\t<MonoValue type=\"inherit\" size=\"inherit\" weight={weight} className={resolvedClassName}>\n\t\t\t\t\t{display}\n\t\t\t\t</MonoValue>\n\t\t\t);\n\t\tcase 'link': {\n\t\t\tconst href = descriptor.href ?? stringValue(value);\n\t\t\treturn (\n\t\t\t\t<Link href={href} emptyLabel={resolvedEmptyLabel} className={resolvedClassName}>\n\t\t\t\t\t{display}\n\t\t\t\t</Link>\n\t\t\t);\n\t\t}\n\t\tcase 'email':\n\t\t\treturn (\n\t\t\t\t<Email\n\t\t\t\t\tvalue={typeof value === 'string' ? value : undefined}\n\t\t\t\t\tdisplay={descriptor.display}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'phone':\n\t\t\treturn (\n\t\t\t\t<Phone\n\t\t\t\t\tvalue={typeof value === 'string' ? value : undefined}\n\t\t\t\t\tdisplay={descriptor.display}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'url':\n\t\t\treturn (\n\t\t\t\t<Url\n\t\t\t\t\tvalue={typeof value === 'string' ? value : undefined}\n\t\t\t\t\tdisplay={descriptor.display}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'money':\n\t\t\treturn (\n\t\t\t\t<Money\n\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\tamount={typeof value === 'number' || typeof value === 'string' ? value : null}\n\t\t\t\t\tcurrency={descriptor.currency}\n\t\t\t\t\tlocale={descriptor.locale}\n\t\t\t\t\tcurrencyDisplay={descriptor.currencyDisplay}\n\t\t\t\t\tminimumFractionDigits={descriptor.minimumFractionDigits}\n\t\t\t\t\tmaximumFractionDigits={descriptor.maximumFractionDigits}\n\t\t\t\t\tformatMode={descriptor.formatMode}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tweight={weight}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'number':\n\t\t\treturn (\n\t\t\t\t<NumberValue\n\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\tvalue={typeof value === 'number' || typeof value === 'string' ? value : null}\n\t\t\t\t\tlocale={descriptor.locale}\n\t\t\t\t\toptions={descriptor.options}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tweight={weight}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'percent':\n\t\t\treturn (\n\t\t\t\t<Percent\n\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\tvalue={typeof value === 'number' || typeof value === 'string' ? value : null}\n\t\t\t\t\tlocale={descriptor.locale}\n\t\t\t\t\tscaled={descriptor.scaled}\n\t\t\t\t\toptions={descriptor.options}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tweight={weight}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'fileSize':\n\t\t\treturn (\n\t\t\t\t<FileSize\n\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\tvalue={typeof value === 'number' ? value : null}\n\t\t\t\t\tfrom={descriptor.from}\n\t\t\t\t\tlocale={descriptor.locale}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tweight={weight}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'date':\n\t\t\treturn (\n\t\t\t\t<DateValue\n\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tformat={descriptor.dateFormat}\n\t\t\t\t\tpreset={descriptor.datePreset}\n\t\t\t\t\tlocale={descriptor.dateLocale}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tweight={weight}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'time':\n\t\t\treturn (\n\t\t\t\t<Time\n\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tformat={descriptor.timeFormat}\n\t\t\t\t\tlocale={descriptor.dateLocale}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tweight={weight}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'dateTime':\n\t\t\treturn (\n\t\t\t\t<DateTime\n\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tformat={descriptor.dateFormat}\n\t\t\t\t\ttimeFormat={descriptor.timeFormat}\n\t\t\t\t\tpreset={descriptor.datePreset}\n\t\t\t\t\tlocale={descriptor.dateLocale}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tweight={weight}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'relativeTime':\n\t\t\treturn (\n\t\t\t\t<RelativeTime\n\t\t\t\t\tvalue={value}\n\t\t\t\t\tlocale={descriptor.dateLocale}\n\t\t\t\t\temptyLabel={resolvedEmptyLabel}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tweight={weight}\n\t\t\t\t\tclassName={resolvedClassName}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'value':\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<Value type=\"inherit\" size=\"inherit\" weight={weight} className={resolvedClassName}>\n\t\t\t\t\t{display}\n\t\t\t\t</Value>\n\t\t\t);\n\t}\n}\n\n/**\n * Table cell value with primitive-backed formatting and automatic missing-value treatment.\n *\n * @example\n * <CellValue value={booking.reference} kind=\"mono\" />\n * <CellValue value={booking.total} kind=\"money\" />\n */\nexport function CellValue({\n\tvalue,\n\tkind,\n\thref,\n\tcurrency,\n\tcurrencyDisplay,\n\tminimumFractionDigits,\n\tmaximumFractionDigits,\n\tformatMode,\n\tlocale,\n\tdateLocale,\n\tfrom,\n\tforce,\n\toptions,\n\tscaled,\n\tdateFormat,\n\tdatePreset,\n\ttimeFormat,\n\temptyLabel,\n\tfallback = '--',\n\tmissing,\n\tclassName,\n\tchildren,\n}: CellValueProps) {\n\tconst isMissing = missing ?? isMissingPrimitive(value);\n\n\tif (children !== undefined) {\n\t\tconst Primitive = isMissing ? EmptyValue : Value;\n\t\treturn (\n\t\t\t<Primitive\n\t\t\t\ttype={isMissing ? 'secondary' : 'inherit'}\n\t\t\t\tsize=\"inherit\"\n\t\t\t\tclassName={cn('cell-value--component', className)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Primitive>\n\t\t);\n\t}\n\n\tif (isMissing) {\n\t\treturn (\n\t\t\t<EmptyValue size=\"inherit\" className={cn('cell-value--component', className)}>\n\t\t\t\t{emptyLabel ?? fallback}\n\t\t\t</EmptyValue>\n\t\t);\n\t}\n\n\treturn renderPrimitiveCellValue({\n\t\tdescriptor: {\n\t\t\tvalue,\n\t\t\tkind,\n\t\t\thref,\n\t\t\tcurrency,\n\t\t\tcurrencyDisplay,\n\t\t\tminimumFractionDigits,\n\t\t\tmaximumFractionDigits,\n\t\t\tformatMode,\n\t\t\tlocale,\n\t\t\tdateLocale,\n\t\t\tfrom,\n\t\t\tforce,\n\t\t\toptions,\n\t\t\tscaled,\n\t\t\tdateFormat,\n\t\t\tdatePreset,\n\t\t\ttimeFormat,\n\t\t\temptyLabel,\n\t\t\tclassName: 'cell-value--component',\n\t\t},\n\t\temptyLabel: emptyLabel ?? fallback,\n\t\tclassName,\n\t});\n}\n\n/**\n * Table cell stack for primary + secondary value rows.\n *\n * Values are normalized, null/undefined/empty-string entries are skipped, and\n * only the first four visible rows render. The first visible primitive defaults\n * to normal `Value`; later primitive rows default to smaller `SecondaryValue`.\n * Pass tuples/descriptors to opt into richer primitives such as `email`,\n * `phone`, `name`, `money`, `fileSize`, or `date`.\n *\n * @example\n * <CellStack values={[\n * booking.contactName,\n * [booking.contactEmail, 'email'],\n * [booking.contactPhone, 'phone'],\n * ]} />\n */\nexport function CellStack({\n\tvalues = [],\n\temptyLabel = '--',\n\tclassName,\n\titemClassName,\n\tprimaryClassName,\n\tsecondaryClassName,\n\tprimaryWeight = 'medium',\n}: CellStackProps) {\n\tconst visibleValues = values\n\t\t.map(normalizeCellValue)\n\t\t.filter((value): value is CellValueDescriptor | ReactElement => value !== null)\n\t\t.slice(0, 4);\n\n\tif (visibleValues.length === 0) {\n\t\treturn (\n\t\t\t<EmptyValue size=\"inherit\" className={cn('cell-stack--component', className)}>\n\t\t\t\t{emptyLabel}\n\t\t\t</EmptyValue>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn('cell-stack--component flex min-w-0 flex-col items-start gap-space-2xs', className)}>\n\t\t\t{visibleValues.map((value, index) => {\n\t\t\t\tconst isPrimary = index === 0;\n\t\t\t\tconst resolvedClassName = cn(\n\t\t\t\t\t'cell-stack--item min-w-0 max-w-full truncate',\n\t\t\t\t\t!isPrimary && 'text-xs',\n\t\t\t\t\titemClassName,\n\t\t\t\t\tisPrimary ? primaryClassName : secondaryClassName,\n\t\t\t\t);\n\n\t\t\t\tif (isValidElement(value)) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={index} className={resolvedClassName}>\n\t\t\t\t\t\t\t{value}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<div key={index} className={resolvedClassName}>\n\t\t\t\t\t\t{renderPrimitiveCellValue({\n\t\t\t\t\t\t\tdescriptor: value,\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\temptyLabel,\n\t\t\t\t\t\t\tclassName: cn('leading-tight', !isPrimary && 'text-xs'),\n\t\t\t\t\t\t\tprimaryWeight,\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n\nCellValue.displayName = 'CellValue';\nCellStack.displayName = 'CellStack';\n","import type { AnchorHTMLAttributes } from 'react';\n\nimport { Link } from '../../../primitives';\nimport { cn } from '../../../../lib/utils';\n\nexport type TableLinkProps = AnchorHTMLAttributes<HTMLAnchorElement>;\n\nexport const TableLink = ({ className, ...props }: TableLinkProps) => {\n\treturn (\n\t\t<Link\n\t\t\tclassName={cn(\n\t\t\t\t'table-link--component',\n\t\t\t\t'underline decoration-link-color/35 decoration-dotted underline-offset-2 hover:decoration-link-color',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{props.children}\n\t\t</Link>\n\t);\n};\n","import type { ComponentType, ReactNode } from 'react';\nimport type { LucideIcon } from 'lucide-react';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../base/avatar';\nimport { Badge, type BadgeTone } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { Initials } from '../../../primitives';\nimport { formatInitials } from '../../../primitives/initials-format';\nimport { Text, TextLink } from '../../../typography';\nimport { EMPTY } from '../../../../lib/format';\nimport { cn } from '../../../../lib/utils';\nimport { focusRecipes } from '../../../../lib/focus-recipes';\n\nexport interface ResourceCellMetadataItem {\n\t/** Stable identity for this entry. */\n\tid?: string;\n\t/** Display label. */\n\tlabel?: ReactNode;\n\tvalue: ReactNode;\n}\n\nexport type ResourceCellBadge =\n\t| ReactNode\n\t| ({\n\t\t\tid?: string;\n\t\t\tlabel: ReactNode;\n\t\t\ttone?: BadgeTone;\n\t\t\ticon?: LucideIcon;\n\t\t\tdot?: boolean;\n\t });\n\nexport interface ResourceCellLinkProps {\n\t/** Destination for the entry, when it navigates. */\n\thref: string;\n\tchildren: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t'aria-label'?: string;\n}\n\nexport interface ResourceCellProps {\n\t/** Surface title. */\n\ttitle?: ReactNode;\n\t/** Secondary line under the title. */\n\tsubtitle?: ReactNode;\n\t/** Label/value facts rendered as a metadata list. */\n\tmetadata?: ReactNode | readonly ResourceCellMetadataItem[];\n\t/** Status chips shown after the title. */\n\tbadges?: readonly ResourceCellBadge[];\n\t/**\n\t * Thumbnail source. When it is absent or fails to load, the circle shows\n\t * `fallback`, then `icon`, then the title's initials.\n\t */\n\timageUrl?: string;\n\t/** Leading glyph in the media circle. Pass one only when it identifies the resource. */\n\ticon?: ComponentType<{ className?: string }>;\n\t/**\n\t * Media shown when `imageUrl` is absent or fails — usually\n\t * `<Initials value={name} />` for a person or organization.\n\t *\n\t * The cell draws its media circle only when `imageUrl`, `icon` or\n\t * `fallback` is supplied, so identifiers such as orders and invoices read\n\t * as plain text with no decorative monogram. In a person column where only\n\t * some rows have a photo, pass `fallback` on every row so titles align.\n\t */\n\tfallback?: ReactNode;\n\t/** Destination for the entry, when it navigates. */\n\thref?: string;\n\t/** Replaces the default link rendering. */\n\trenderLink?: (props: ResourceCellLinkProps) => ReactNode;\n\t/** Copy shown when the cell has no title. */\n\temptyLabel?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/**\n\t * `circle` for people and organizations; `square` (the default radius) for\n\t * product photos and documents, so square images are not clipped.\n\t * @default 'circle'\n\t */\n\tmediaShape?: 'circle' | 'square';\n\t/** Merged onto the media. */\n\tmediaClassName?: string;\n\t/** Merged onto the content. */\n\tcontentClassName?: string;\n\t/** Merged onto the title. */\n\ttitleClassName?: string;\n\t/** Merged onto the subtitle. */\n\tsubtitleClassName?: string;\n}\n\nfunction renderResourceBadge(badge: ResourceCellBadge, index: number): ReactNode {\n\tif (\n\t\tbadge &&\n\t\ttypeof badge === 'object' &&\n\t\t!('type' in badge) &&\n\t\t'label' in badge\n\t) {\n\t\tconst Icon = badge.icon;\n\t\treturn (\n\t\t\t<Badge key={badge.id ?? index} tone={badge.tone ?? 'secondary'} dot={badge.dot}>\n\t\t\t\t{!!Icon && <Icon className=\"size-icon-sm\" />}\n\t\t\t\t{badge.label}\n\t\t\t</Badge>\n\t\t);\n\t}\n\n\treturn <span key={index}>{badge}</span>;\n}\n\nfunction renderResourceMetadata(metadata: ResourceCellProps['metadata']): ReactNode {\n\tif (!metadata) return null;\n\tif (Array.isArray(metadata)) {\n\t\treturn (\n\t\t\t<span className=\"inline-flex min-w-0 flex-wrap items-center gap-x-space-md gap-y-space-2xs\">\n\t\t\t\t{metadata.map((item, index) => (\n\t\t\t\t\t<span key={item.id ?? index} className=\"inline-flex min-w-0 items-center gap-space-sm\">\n\t\t\t\t\t\t{!!item.label && (\n\t\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" className=\"shrink-0\">\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<Text tag=\"span\" size=\"inherit\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t\t\t{item.value}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t</span>\n\t\t);\n\t}\n\n\treturn metadata as ReactNode;\n}\n\nexport function ResourceCell({\n\ttitle,\n\tsubtitle,\n\tmetadata,\n\tbadges = [],\n\timageUrl,\n\ticon: IconComponent,\n\tfallback,\n\thref,\n\trenderLink,\n\temptyLabel = EMPTY,\n\tclassName,\n\tmediaShape = 'circle',\n\tmediaClassName,\n\tcontentClassName,\n\ttitleClassName,\n\tsubtitleClassName,\n}: ResourceCellProps) {\n\tif (!title) {\n\t\treturn (\n\t\t\t<Text size=\"inherit\" type=\"secondary\" className={className}>\n\t\t\t\t{emptyLabel}\n\t\t\t</Text>\n\t\t);\n\t}\n\n\tconst titleText = typeof title === 'string' ? title : undefined;\n\tconst initials = titleText\n\t\t? formatInitials(titleText, { strategy: 'first-words' })\n\t\t: '';\n\tconst content = (\n\t\t<Stack render={<span />} gap=\"dense\" className={cn('resource-cell--content', contentClassName)}>\n\t\t\t<Stack render={<span />} direction=\"horizontal\" gap=\"sm\" wrap={false} className=\"resource-cell--title-row\">\n\t\t\t\t<Text\n\t\t\t\t\ttype=\"inherit\"\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tweight=\"medium\"\n\t\t\t\t\t// The full title stays available when the column truncates it.\n\t\t\t\t\ttitle={titleText}\n\t\t\t\t\tclassName={cn('resource-cell--title truncate', titleClassName)}\n\t\t\t\t>\n\t\t\t\t\t{title}\n\t\t\t\t</Text>\n\t\t\t\t{badges.length > 0 && (\n\t\t\t\t\t<span className=\"resource-cell--badges inline-flex shrink-0 items-center gap-space-sm\">\n\t\t\t\t\t\t{badges.map(renderResourceBadge)}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</Stack>\n\t\t\t{!!subtitle && (\n\t\t\t\t<Text\n\t\t\t\t\ttag=\"span\"\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\tclassName={cn('resource-cell--subtitle truncate', subtitleClassName)}\n\t\t\t\t>\n\t\t\t\t\t{subtitle}\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t\t{!!metadata && (\n\t\t\t\t<span className=\"resource-cell--metadata min-w-0\">\n\t\t\t\t\t{renderResourceMetadata(metadata)}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</Stack>\n\t);\n\tconst hasFallback = fallback !== undefined && fallback !== null && fallback !== false && fallback !== '';\n\t// Media is opt-in: a monogram derived from \"ORD-2048\" carries no information.\n\tconst hasMedia = !!imageUrl || !!IconComponent || hasFallback;\n\tconst square = mediaShape === 'square';\n\tconst cell = (\n\t\t<span className={cn('resource-cell--component inline-flex min-w-0 items-center gap-space-md', className)}>\n\t\t\t{/* The public Avatar owns the frame, the image load and its fallback. */}\n\t\t\t{hasMedia && (\n\t\t\t\t<Avatar size=\"md\" data-shape={mediaShape} className={cn('resource-cell--media', square && 'rounded-radius after:rounded-radius', mediaClassName)}>\n\t\t\t\t\t{!!imageUrl && <AvatarImage src={imageUrl} alt={titleText ?? ''} className={cn(square && 'rounded-radius')} />}\n\t\t\t\t\t<AvatarFallback className={cn(square && 'rounded-radius')}>\n\t\t\t\t\t\t{hasFallback ? (\n\t\t\t\t\t\t\tfallback\n\t\t\t\t\t\t) : IconComponent ? (\n\t\t\t\t\t\t\t<IconComponent className=\"size-icon\" />\n\t\t\t\t\t\t) : initials ? (\n\t\t\t\t\t\t\t<Initials value={titleText} strategy=\"first-words\" />\n\t\t\t\t\t\t) : null}\n\t\t\t\t\t</AvatarFallback>\n\t\t\t\t</Avatar>\n\t\t\t)}\n\t\t\t{content}\n\t\t</span>\n\t);\n\n\tif (!href) return cell;\n\n\tconst linkClassName = `resource-cell--link inline-flex min-w-0 rounded-radius outline-none ${focusRecipes.text}`;\n\tif (renderLink) {\n\t\treturn renderLink({\n\t\t\thref,\n\t\t\tchildren: cell,\n\t\t\tclassName: linkClassName,\n\t\t\t'aria-label': titleText,\n\t\t});\n\t}\n\n\treturn (\n\t\t<TextLink\n\t\t\thref={href}\n\t\t\tsize=\"inherit\"\n\t\t\tunderline={false}\n\t\t\tclassName={linkClassName}\n\t\t\taria-label={titleText}\n\t\t>\n\t\t\t{cell}\n\t\t</TextLink>\n\t);\n}\n\nResourceCell.displayName = 'ResourceCell';\n","/**\n * Reusable cell renderers for DataTable columns.\n *\n * Use these from `column.cell` definitions to keep table preview pages and\n * production code consistent. Every renderer is presentational (no data\n * fetching) and accepts the value plus optional formatting hints.\n *\n * { accessorKey: 'status', cell: ({ getValue }) => <StatusCell value={getValue()} map={STATUS_MAP} /> }\n * { accessorKey: 'createdAt', cell: ({ getValue }) => <DateCell value={getValue()} /> }\n * { accessorKey: 'amount', cell: ({ getValue }) => <CurrencyCell value={getValue()} currency=\"USD\" /> }\n * { accessorKey: 'owner', cell: ({ getValue }) => <AvatarCell name={getValue()} /> }\n */\nimport type { ComponentType, ReactNode } from 'react';\nimport { Calendar, Mail, type LucideIcon } from 'lucide-react';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '../../../base/avatar';\nimport { Badge, type BadgeTone } from '../../../base/badge';\nimport {\n\tDate as DateValue,\n\tInitials,\n\tMoney,\n\tparseDateInput,\n\ttype DateProps,\n} from '../../../primitives';\nimport { formatInitials } from '../../../primitives/initials-format';\nimport { Text } from '../../../typography';\nimport { EMPTY } from '../../../../lib/format';\nimport { cn } from '../../../../lib/utils';\n\n// ──────────────────────────────────────────────────────────────\n// StatusCell\n// ──────────────────────────────────────────────────────────────\n\nexport interface StatusCellEntry {\n\t/** Display label. */\n\tlabel: ReactNode;\n\ttone?: BadgeTone;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n\tdot?: boolean;\n}\n\nexport interface StatusCellProps<TStatus extends string> {\n\t/** The record's status. */\n\tvalue?: TStatus | null;\n\t/** Label and tone for every status this column can show. */\n\tmap: Record<TStatus, StatusCellEntry>;\n\t/** Copy shown when the status is absent or missing from `map`. */\n\t/** Copy shown when the value is absent. */\n\temptyLabel?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function StatusCell<TStatus extends string>({\n\tvalue,\n\tmap,\n\temptyLabel = EMPTY,\n\tclassName,\n}: StatusCellProps<TStatus>) {\n\tif (!value || !(value in map)) {\n\t\treturn (\n\t\t\t<Text size=\"inherit\" type=\"secondary\" className={cn('status-cell--component', className)}>\n\t\t\t\t{emptyLabel}\n\t\t\t</Text>\n\t\t);\n\t}\n\tconst entry = map[value];\n\tconst Icon = entry.icon;\n\treturn (\n\t\t<Badge\n\t\t\ttone={entry.tone ?? 'secondary'}\n\t\t\tclassName={cn('status-cell--component gap-space-sm', className)}\n\t\t>\n\t\t\t{!!Icon && <Icon className=\"size-icon-sm\" />}\n\t\t\t{entry.label}\n\t\t</Badge>\n\t);\n}\n\nStatusCell.displayName = 'StatusCell';\n\n// ──────────────────────────────────────────────────────────────\n// StatusClusterCell\n// ──────────────────────────────────────────────────────────────\n\nexport interface StatusClusterCellItem {\n\t/** Stable identity for this entry. */\n\tid?: string;\n\t/** Display label. */\n\tlabel: ReactNode;\n\ttone?: BadgeTone;\n\t/** Leading glyph. */\n\ticon?: LucideIcon;\n\tdot?: boolean;\n\thidden?: boolean;\n}\n\nexport interface StatusClusterCellProps {\n\t/** Status chips to show side by side in one cell. */\n\titems?: readonly StatusClusterCellItem[];\n\t/** Copy shown when there are no items. */\n\t/** Copy shown when the value is absent. */\n\temptyLabel?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Merged onto the badge. */\n\tbadgeClassName?: string;\n}\n\nexport function StatusClusterCell({\n\titems = [],\n\temptyLabel = EMPTY,\n\tclassName,\n\tbadgeClassName,\n}: StatusClusterCellProps) {\n\tconst visibleItems = items.filter((item) => !item.hidden);\n\n\tif (visibleItems.length === 0) {\n\t\treturn (\n\t\t\t<Text size=\"inherit\" type=\"secondary\" className={cn('status-cluster-cell--component', className)}>\n\t\t\t\t{emptyLabel}\n\t\t\t</Text>\n\t\t);\n\t}\n\n\treturn (\n\t\t<span className={cn('status-cluster-cell--component inline-flex min-w-0 flex-wrap items-center gap-space-sm', className)}>\n\t\t\t{visibleItems.map((item, index) => {\n\t\t\t\tconst Icon = item.icon;\n\t\t\t\treturn (\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tkey={item.id ?? index}\n\t\t\t\t\t\ttone={item.tone ?? 'secondary'}\n\t\t\t\t\t\tdot={item.dot}\n\t\t\t\t\t\tclassName={cn('shrink-0', badgeClassName)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{!!Icon && <Icon className=\"size-icon-sm\" />}\n\t\t\t\t\t\t{item.label}\n\t\t\t\t\t</Badge>\n\t\t\t\t);\n\t\t\t})}\n\t\t</span>\n\t);\n}\n\nStatusClusterCell.displayName = 'StatusClusterCell';\n\n// ──────────────────────────────────────────────────────────────\n// DateCell\n// ──────────────────────────────────────────────────────────────\n\nexport interface DateCellProps {\n\t/** The date to render. */\n\tvalue?: DateProps['value'];\n\t/** date-fns format string. Falls back to the Date primitive/provider default. */\n\tformat?: DateProps['format'];\n\t/** Semantic Date primitive preset. */\n\tpreset?: DateProps['preset'];\n\t/** date-fns locale override. Falls back to UIProvider dates. */\n\tlocale?: DateProps['locale'];\n\t/** Renders the leading glyph. Off by default: a repeated calendar glyph on every row adds no information. */\n\tshowIcon?: boolean;\n\t/** Leading glyph. */\n\ticon?: ComponentType<{ className?: string }>;\n\t/** Copy shown when the value is absent. */\n\temptyLabel?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function DateCell({\n\tvalue,\n\tformat,\n\tpreset,\n\tlocale,\n\tshowIcon = false,\n\ticon: IconComponent = Calendar,\n\temptyLabel = EMPTY,\n\tclassName,\n}: DateCellProps) {\n\tconst date = parseDateInput(value);\n\tif (!date) {\n\t\treturn (\n\t\t\t<Text size=\"inherit\" type=\"secondary\" className={cn('date-cell--component', className)}>\n\t\t\t\t{emptyLabel}\n\t\t\t</Text>\n\t\t);\n\t}\n\treturn (\n\t\t<span className={cn('date-cell--component inline-flex items-center gap-space-sm', className)}>\n\t\t\t{!!showIcon && <IconComponent className=\"size-icon text-muted-foreground\" />}\n\t\t\t<DateValue\n\t\t\t\tvalue={date}\n\t\t\t\tformat={format}\n\t\t\t\tpreset={preset}\n\t\t\t\tlocale={locale}\n\t\t\t\temptyLabel={emptyLabel}\n\t\t\t\tsize=\"inherit\"\n\t\t\t\ttype=\"secondary\"\n\t\t\t/>\n\t\t</span>\n\t);\n}\n\nDateCell.displayName = 'DateCell';\n\n// ──────────────────────────────────────────────────────────────\n// DateMetaCell\n// ──────────────────────────────────────────────────────────────\n\nexport interface DateMetaCellProps extends DateCellProps {\n\t/** Second line under the date — pass a function to derive it from the value. */\n\tsecondary?: ReactNode | ((date: Date) => ReactNode);\n\t/** Merged onto the primary. */\n\tprimaryClassName?: string;\n\t/** Merged onto the secondary. */\n\tsecondaryClassName?: string;\n}\n\nexport function DateMetaCell({\n\tvalue,\n\tformat,\n\tpreset,\n\tlocale,\n\tshowIcon = false,\n\ticon: IconComponent = Calendar,\n\temptyLabel = EMPTY,\n\tclassName,\n\tprimaryClassName,\n\tsecondary,\n\tsecondaryClassName,\n}: DateMetaCellProps) {\n\tconst date = parseDateInput(value);\n\tif (!date) {\n\t\treturn (\n\t\t\t<Text size=\"inherit\" type=\"secondary\" className={cn('date-meta-cell--component', className)}>\n\t\t\t\t{emptyLabel}\n\t\t\t</Text>\n\t\t);\n\t}\n\n\tconst secondaryNode = typeof secondary === 'function' ? secondary(date) : secondary;\n\n\treturn (\n\t\t<span className={cn('date-meta-cell--component inline-flex min-w-0 items-start gap-space-sm', className)}>\n\t\t\t{!!showIcon && <IconComponent className=\"mt-space-2xs size-icon shrink-0 text-muted-foreground\" />}\n\t\t\t<span className=\"grid min-w-0 gap-space-2xs\">\n\t\t\t\t<DateValue\n\t\t\t\t\tvalue={date}\n\t\t\t\t\tformat={format}\n\t\t\t\t\tpreset={preset}\n\t\t\t\t\tlocale={locale}\n\t\t\t\t\temptyLabel={emptyLabel}\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\tclassName={cn('truncate tabular-nums', primaryClassName)}\n\t\t\t\t/>\n\t\t\t\t{!!secondaryNode && (\n\t\t\t\t\t<Text\n\t\t\t\t\t\ttag=\"span\"\n\t\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\t\ttype=\"secondary\"\n\t\t\t\t\t\tclassName={cn('truncate', secondaryClassName)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{secondaryNode}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n\nDateMetaCell.displayName = 'DateMetaCell';\n\n// ──────────────────────────────────────────────────────────────\n// CurrencyCell\n// ──────────────────────────────────────────────────────────────\n\nexport interface CurrencyCellProps {\n\t/** The amount to render. */\n\tvalue?: number | string | null;\n\t/** ISO currency code. */\n\tcurrency?: string;\n\t/** BCP 47 locale for the amount. */\n\tlocale?: string;\n\t/** Copy shown when the amount is absent. */\n\t/** Copy shown when the value is absent. */\n\temptyLabel?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n\t/** Weight of the amount. */\n\tweight?: 'regular' | 'medium' | 'semibold' | 'bold';\n}\n\nexport function CurrencyCell({\n\tvalue,\n\tcurrency,\n\tlocale,\n\temptyLabel = EMPTY,\n\tclassName,\n\tweight = 'semibold',\n}: CurrencyCellProps) {\n\treturn (\n\t\t<Money\n\t\t\ttype=\"inherit\"\n\t\t\tamount={value}\n\t\t\tcurrency={currency}\n\t\t\tlocale={locale}\n\t\t\tformatMode={currency ? 'with_symbol' : 'decimal'}\n\t\t\temptyLabel={emptyLabel}\n\t\t\tsize=\"inherit\"\n\t\t\tweight={weight}\n\t\t\tclassName={cn('currency-cell--component tabular-nums', className)}\n\t\t/>\n\t);\n}\n\nCurrencyCell.displayName = 'CurrencyCell';\n\n// ──────────────────────────────────────────────────────────────\n// AvatarCell\n// ──────────────────────────────────────────────────────────────\n\nexport interface AvatarCellProps {\n\t/** Display name. */\n\tname?: string | null;\n\t/** Avatar source. Falls back to initials when absent or broken. */\n\timageUrl?: string;\n\t/** Leading glyph. */\n\ticon?: ComponentType<{ className?: string }>;\n\t/** Secondary line under the name. */\n\tsubtitle?: ReactNode;\n\t/** Copy shown when the value is absent. */\n\temptyLabel?: ReactNode;\n\t/** Merged onto the outermost node. */\n\tclassName?: string;\n}\n\nexport function AvatarCell({\n\tname,\n\timageUrl,\n\ticon: IconComponent = Mail,\n\tsubtitle,\n\temptyLabel = EMPTY,\n\tclassName,\n}: AvatarCellProps) {\n\tif (!name || name.trim().length === 0) {\n\t\treturn (\n\t\t\t<Text size=\"inherit\" type=\"secondary\" className={cn('avatar-cell--component', className)}>\n\t\t\t\t{emptyLabel}\n\t\t\t</Text>\n\t\t);\n\t}\n\treturn (\n\t\t<span className={cn('avatar-cell--component inline-flex items-center gap-space-md', className)}>\n\t\t\t{/* The public Avatar owns the frame, the image load and its fallback. */}\n\t\t\t<Avatar size=\"sm\" className=\"avatar-cell--avatar\">\n\t\t\t\t{!!imageUrl && <AvatarImage src={imageUrl} alt={name} />}\n\t\t\t\t<AvatarFallback>\n\t\t\t\t\t{formatInitials(name, { strategy: 'first-words' }) ? (\n\t\t\t\t\t\t<Initials value={name} strategy=\"first-words\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<IconComponent className=\"size-icon\" />\n\t\t\t\t\t)}\n\t\t\t\t</AvatarFallback>\n\t\t\t</Avatar>\n\t\t\t<span className=\"min-w-0 inline-flex flex-col\">\n\t\t\t\t<Text type=\"inherit\" size=\"inherit\" weight=\"medium\" className=\"truncate\">\n\t\t\t\t\t{name}\n\t\t\t\t</Text>\n\t\t\t\t{!!subtitle && (\n\t\t\t\t\t<Text size=\"inherit\" type=\"secondary\" className=\"truncate\">\n\t\t\t\t\t\t{subtitle}\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</span>\n\t\t</span>\n\t);\n}\n\nAvatarCell.displayName = 'AvatarCell';\n\nexport {\n\tResourceCell,\n\ttype ResourceCellBadge,\n\ttype ResourceCellLinkProps,\n\ttype ResourceCellMetadataItem,\n\ttype ResourceCellProps,\n} from './resource-cell';\n"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  "use client";
2
- import { s as e } from "./ui-provider-CQCuCBcy.js";
2
+ import { d as e } from "./ui-provider-C-74NVLc.js";
3
3
  import { useStrings as t } from "./lib/strings.js";
4
- import { t as n } from "./utils-CF3c95Io.js";
5
- import { n as r } from "./buttons-BbfzgczK.js";
6
- import { c as i } from "./typography-CSyJrh28.js";
4
+ import { t as n } from "./utils-B6kKb8jB.js";
5
+ import { n as r } from "./buttons-BedGfygC.js";
6
+ import { c as i } from "./typography-BQnine1k.js";
7
7
  import { t as a } from "./focus-recipes-B653VaLq.js";
8
- import { t as o } from "./structure-C0V0_Fyf.js";
9
- import { t as s } from "./scroll-area-La5RXsEk.js";
8
+ import { t as o } from "./structure-DuxKl954.js";
9
+ import { t as s } from "./scroll-area-B0dB2cBi.js";
10
10
  import { useLayoutEffect as c, useRef as l, useState as u } from "react";
11
11
  import { jsx as d, jsxs as f } from "react/jsx-runtime";
12
12
  import { ChevronLeft as p, ChevronRight as m } from "lucide-react";
@@ -113,7 +113,7 @@ function y({ className: e, orientation: t = "horizontal", ...r }) {
113
113
  ...r
114
114
  });
115
115
  }
116
- var b = h("box-border rounded-inner p-space-2xs h-action data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col", {
116
+ var b = h("box-border rounded-radius p-space-2xs h-action data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col", {
117
117
  variants: { variant: {
118
118
  default: "bg-muted",
119
119
  line: "gap-space-xs bg-transparent",
@@ -132,7 +132,7 @@ function x({ className: e, variant: t = "default", ...r }) {
132
132
  function S({ className: e, ...t }) {
133
133
  return /* @__PURE__ */ d(g.Tab, {
134
134
  "data-slot": "tabs-trigger",
135
- className: n(`box-border font-sans gap-space-sm rounded-inner border border-transparent px-space-md py-space-xs text-sm font-medium group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg:not([class*='size-'])]:size-icon outline-none ${a.frame} text-muted-foreground hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center whitespace-nowrap transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0`, "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent", "data-active:bg-card data-active:text-foreground", "group-data-[variant=chips]/tabs-list:h-action-sm group-data-[variant=chips]/tabs-list:flex-none group-data-[variant=chips]/tabs-list:px-control-sm group-data-[variant=chips]/tabs-list:py-0 group-data-[variant=chips]/tabs-list:after:hidden group-data-[variant=chips]/tabs-list:hover:bg-muted group-data-[variant=chips]/tabs-list:data-active:bg-accent group-data-[variant=chips]/tabs-list:data-active:text-accent-foreground group-data-[variant=chips]/tabs-list:data-active:hover:bg-accent group-data-[variant=chips]/tabs-list:data-active:hover:text-accent-foreground", "after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100", e),
135
+ className: n(`box-border font-sans gap-space-sm rounded-radius border border-transparent px-space-md py-space-xs text-sm font-medium group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg:not([class*='size-'])]:size-icon outline-none ${a.frame} text-muted-foreground hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center whitespace-nowrap transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0`, "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent", "data-active:bg-card data-active:text-foreground", "group-data-[variant=chips]/tabs-list:h-action-sm group-data-[variant=chips]/tabs-list:flex-none group-data-[variant=chips]/tabs-list:px-control-sm group-data-[variant=chips]/tabs-list:py-0 group-data-[variant=chips]/tabs-list:after:hidden group-data-[variant=chips]/tabs-list:hover:bg-muted group-data-[variant=chips]/tabs-list:data-active:bg-accent group-data-[variant=chips]/tabs-list:data-active:text-accent-foreground group-data-[variant=chips]/tabs-list:data-active:hover:bg-accent group-data-[variant=chips]/tabs-list:data-active:hover:text-accent-foreground", "after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100", e),
136
136
  ...t
137
137
  });
138
138
  }
@@ -156,7 +156,7 @@ function T({ className: e, ...t }) {
156
156
  }
157
157
  function E({ className: t, scrollable: r = !1, scrollStrings: i, ...a }) {
158
158
  let { defaultScale: o } = e(), s = a.variant === "chips" ? void 0 : o === "sm" ? "h-action-sm" : o === "lg" ? "h-action-lg" : "h-action", c = /* @__PURE__ */ d(x, {
159
- className: n("tabs-list--component", "rounded-inner", s, r && "w-max", t),
159
+ className: n("tabs-list--component", "rounded-radius", s, r && "w-max", t),
160
160
  ...a
161
161
  });
162
162
  return r ? /* @__PURE__ */ d(v, {
@@ -166,7 +166,7 @@ function E({ className: t, scrollable: r = !1, scrollStrings: i, ...a }) {
166
166
  }
167
167
  function D({ className: e, children: t, ...r }) {
168
168
  return /* @__PURE__ */ d(S, {
169
- className: n("tabs-trigger--component", "gap-space-sm rounded-inner px-space-md py-space-xs", e),
169
+ className: n("tabs-trigger--component", "gap-space-sm rounded-radius px-space-md py-space-xs", e),
170
170
  ...r,
171
171
  children: w(t) ? /* @__PURE__ */ d(i, {
172
172
  tag: "span",
@@ -188,4 +188,4 @@ function O({ className: e, children: t, ...r }) {
188
188
  //#endregion
189
189
  export { v as a, D as i, O as n, _ as o, E as r, T as t };
190
190
 
191
- //# sourceMappingURL=tabs-eqVsJZWO.js.map
191
+ //# sourceMappingURL=tabs-e7ko9S2o.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs-e7ko9S2o.js","names":["Tabs","TabsPrimitive","TabsList","TabsTrigger","TabsContent","Tabs","PrimitiveTabs","PrimitiveTabsList","PrimitiveTabsTrigger","PrimitiveTabsContent","useDensityConfig","cn","Button","Text","focusRecipes","Stack","ScrollArea","defaultTabsScrollStrings","TabScrollViewport","stringsProp","strings","useStrings","frameRef","useRef","viewportRef","edges","setEdges","useState","viewport","measure","maximum","offset","available","style","inset","next","current","reveal","selected","bounds","item","resize","selection","scroll","rtl","reduce","direction","ChevronLeft","ChevronRight","Tabs$2","props","Tabs","orientation","className","tabsListVariants","cva","TabsList$1","variant","TabsTrigger$1","TabsContent$1","isSimpleText","value","Tabs$1","TabsList","height","defaultScale","list","scrollable","scrollStrings","TabsTrigger","children","TabsContent"],"sources":["../src/components/base/navigation/tab-scroll-viewport.tsx","../src/components/ui/tabs.tsx","../src/components/base/navigation/tabs.tsx"],"sourcesContent":["import { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { useLayoutEffect, useRef, useState, type ReactNode } from 'react';\n\nimport { Button } from '../buttons';\nimport { ScrollArea } from '../display/scroll-area';\nimport { Stack } from '../structure';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\n\nexport interface TabsScrollStrings {\n\tprevious: string;\n\tnext: string;\n}\n\nexport const defaultTabsScrollStrings: TabsScrollStrings = {\n\tprevious: 'Previous tabs',\n\tnext: 'Next tabs',\n};\n\n/** Shared scroll mechanics for state tabs and route tabs; selection stays with each owner. */\nexport function TabScrollViewport({ children, strings: stringsProp }: {\n\tchildren: ReactNode;\n\tstrings?: StringsProp<TabsScrollStrings>;\n}) {\n\tconst strings = useStrings(defaultTabsScrollStrings, stringsProp);\n\tconst frameRef = useRef<HTMLDivElement>(null);\n\tconst viewportRef = useRef<HTMLDivElement>(null);\n\tconst [edges, setEdges] = useState({ overflow: false, start: true, end: true });\n\n\tuseLayoutEffect(() => {\n\t\tconst viewport = viewportRef.current;\n\t\tif (!viewport) return;\n\t\tconst measure = () => {\n\t\t\tconst maximum = viewport.scrollWidth - viewport.clientWidth;\n\t\t\tconst offset = Math.abs(viewport.scrollLeft);\n\t\t\t// Measure the full row so visible arrows cannot keep themselves alive after a resize.\n\t\t\tconst available = frameRef.current?.clientWidth || viewport.clientWidth;\n\t\t\t// The viewport's ring inset is outside the row (negative margin), so it is not content.\n\t\t\tconst style = getComputedStyle(viewport);\n\t\t\tconst inset = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);\n\t\t\tconst next = { overflow: viewport.scrollWidth - inset > available + 1, start: offset <= 1, end: offset >= maximum - 1 };\n\t\t\tsetEdges(current => current.overflow === next.overflow && current.start === next.start && current.end === next.end ? current : next);\n\t\t};\n\t\tconst reveal = () => {\n\t\t\tconst selected = viewport.querySelector<HTMLElement>('[aria-selected=\"true\"], [aria-current=\"page\"]');\n\t\t\tif (selected) {\n\t\t\t\tconst bounds = viewport.getBoundingClientRect();\n\t\t\t\tconst item = selected.getBoundingClientRect();\n\t\t\t\tif (item.left < bounds.left) viewport.scrollLeft += item.left - bounds.left;\n\t\t\t\telse if (item.right > bounds.right) viewport.scrollLeft += item.right - bounds.right;\n\t\t\t}\n\t\t\tmeasure();\n\t\t};\n\t\tmeasure();\n\t\tviewport.addEventListener('scroll', measure, { passive: true });\n\t\tconst resize = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(reveal);\n\t\tresize?.observe(viewport);\n\t\tif (frameRef.current) resize?.observe(frameRef.current);\n\t\tif (viewport.firstElementChild) resize?.observe(viewport.firstElementChild);\n\t\tconst selection = new MutationObserver(reveal);\n\t\tselection.observe(viewport, { subtree: true, attributes: true, attributeFilter: ['aria-selected', 'aria-current'] });\n\t\treveal();\n\t\treturn () => { viewport.removeEventListener('scroll', measure); resize?.disconnect(); selection.disconnect(); };\n\t}, []);\n\n\tconst scroll = (direction: number) => {\n\t\tconst viewport = viewportRef.current;\n\t\tif (!viewport) return;\n\t\tconst rtl = getComputedStyle(viewport).direction === 'rtl';\n\t\tconst reduce = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n\t\tviewport.scrollBy({ left: direction * (rtl ? -1 : 1) * viewport.clientWidth * 0.75, behavior: reduce ? 'instant' : 'smooth' });\n\t};\n\n\treturn <Stack ref={frameRef} direction=\"horizontal\" gap=\"xs\" align=\"center\" wrap={false} className=\"tab-scroll--component w-full min-w-0\">\n\t\t{edges.overflow && <Button size=\"sm\" iconOnly icon={ChevronLeft} tone=\"secondary\" buttonStyle=\"ghost\" aria-label={strings.previous} disabled={edges.start} onClick={() => scroll(-1)} className=\"shrink-0 rtl:[&_svg]:rotate-180\" />}\n\t\t{/* The inset only gives focus rings and the active tab's shadow room inside the\n\t\t clipping viewport; the matching negative margin keeps the list on the\n\t\t container's edge and centred on the arrows. The arrows replace the\n\t\t scrollbar, so it no longer needs reserved space under the tabs. */}\n\t\t<ScrollArea orientation=\"horizontal\" viewportRef={viewportRef} className=\"-m-space-xs min-w-0 flex-1\" viewportClassName=\"p-space-xs\" scrollbarClassName=\"hidden\">{children}</ScrollArea>\n\t\t{edges.overflow && <Button size=\"sm\" iconOnly icon={ChevronRight} tone=\"secondary\" buttonStyle=\"ghost\" aria-label={strings.next} disabled={edges.end} onClick={() => scroll(1)} className=\"shrink-0 rtl:[&_svg]:rotate-180\" />}\n\t</Stack>;\n}\n","import { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { focusRecipes } from \"../../lib/focus-recipes\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"gap-space-md group/tabs flex data-[orientation=horizontal]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"box-border rounded-radius p-space-2xs h-action data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-space-xs bg-transparent\",\n // Wrapping toggle chips (saved views, filter presets): no track, compact\n // pressed-state triggers that wrap onto further lines.\n chips: \"h-auto flex-wrap justify-start gap-space-xs bg-transparent p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n className={cn(tabsListVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) {\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n className={cn(\n `box-border font-sans gap-space-sm rounded-radius border border-transparent px-space-md py-space-xs text-sm font-medium group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg:not([class*='size-'])]:size-icon outline-none ${focusRecipes.frame} text-muted-foreground hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center whitespace-nowrap transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0`,\n \"group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent\",\n // The card fill is lighter than the muted track in both themes; the page\n // background is darker than the track in dark mode and reads as recessed.\n \"data-active:bg-card data-active:text-foreground\",\n // Chips use the toggle recipe: a muted hover and the accent pressed fill.\n \"group-data-[variant=chips]/tabs-list:h-action-sm group-data-[variant=chips]/tabs-list:flex-none group-data-[variant=chips]/tabs-list:px-control-sm group-data-[variant=chips]/tabs-list:py-0 group-data-[variant=chips]/tabs-list:after:hidden group-data-[variant=chips]/tabs-list:hover:bg-muted group-data-[variant=chips]/tabs-list:data-active:bg-accent group-data-[variant=chips]/tabs-list:data-active:text-accent-foreground group-data-[variant=chips]/tabs-list:data-active:hover:bg-accent group-data-[variant=chips]/tabs-list:data-active:hover:text-accent-foreground\",\n \"after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\"text-sm flex-1 outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n","/**\n * Typography- and token-aware wrappers around the internal shadcn tabs parts.\n *\n * Raw anatomy and these wrappers share token-backed spacing. The wrappers\n * add stable public hooks, canonical corners, scalar text and scroll controls;\n * the primitive owns tab/list interaction and the nested list inset.\n */\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport {\n\tTabs as PrimitiveTabs,\n\tTabsContent as PrimitiveTabsContent,\n\tTabsList as PrimitiveTabsList,\n\tTabsTrigger as PrimitiveTabsTrigger,\n} from '../../ui/tabs';\nimport { Text } from '../../typography';\nimport { cn } from '../../../lib/utils';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport type { StringsProp } from '../../../lib/strings';\nimport { TabScrollViewport, type TabsScrollStrings } from './tab-scroll-viewport';\n\nfunction isSimpleText(value: ReactNode): value is string | number | bigint {\n\treturn typeof value === 'string' || typeof value === 'number' || typeof value === 'bigint';\n}\n\nexport function Tabs({ className, ...props }: ComponentProps<typeof PrimitiveTabs>) {\n\treturn <PrimitiveTabs className={cn('tabs--component', className)} {...props} />;\n}\n\nexport type TabsListProps = ComponentProps<typeof PrimitiveTabsList> & {\n\t/** Adds previous/next controls when the tab list exceeds its container. */\n\tscrollable?: boolean;\n\t/** Accessible labels for the previous/next scroll controls. */\n\tscrollStrings?: StringsProp<TabsScrollStrings>;\n};\n\nexport function TabsList({ className, scrollable = false, scrollStrings, ...props }: TabsListProps) {\n\tconst { defaultScale } = useDensityConfig();\n\t// Chips wrap onto further lines, so the list takes its height from them.\n\tconst height = props.variant === 'chips' ? undefined : defaultScale === 'sm' ? 'h-action-sm' : defaultScale === 'lg' ? 'h-action-lg' : 'h-action';\n\tconst list = (\n\t\t<PrimitiveTabsList\n\t\t\tclassName={cn('tabs-list--component', 'rounded-radius', height, scrollable && 'w-max', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n\treturn scrollable ? <TabScrollViewport strings={scrollStrings}>{list}</TabScrollViewport> : list;\n}\n\nexport function TabsTrigger({ className, children, ...props }: ComponentProps<typeof PrimitiveTabsTrigger>) {\n\treturn (\n\t\t<PrimitiveTabsTrigger\n\t\t\tclassName={cn(\n\t\t\t\t'tabs-trigger--component',\n\t\t\t\t'gap-space-sm rounded-radius px-space-md py-space-xs',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isSimpleText(children) ? (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" weight=\"medium\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : children}\n\t\t</PrimitiveTabsTrigger>\n\t);\n}\n\nexport function TabsContent({ className, children, ...props }: ComponentProps<typeof PrimitiveTabsContent>) {\n\treturn (\n\t\t<PrimitiveTabsContent className={cn('tabs-content--component', className)} {...props}>\n\t\t\t{isSimpleText(children) ? <Text>{children}</Text> : children}\n\t\t</PrimitiveTabsContent>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAaA,IAAaiB,IAA8C;CAC1D,UAAU;CACV,MAAM;AACP;AAGA,SAAgBC,EAAkB,EAAE,aAAU,SAASC,KAGpD;CACF,IAAMC,IAAUC,EAAWJ,GAA0BE,CAAW,GAC1DG,IAAWC,EAAuB,IAAI,GACtCC,IAAcD,EAAuB,IAAI,GACzC,CAACE,GAAOC,KAAYC,EAAS;EAAE,UAAU;EAAO,OAAO;EAAM,KAAK;CAAK,CAAC;CAE9E,QAAsB;EACrB,IAAMC,IAAWJ,EAAY;EAC7B,IAAI,CAACI,GAAU;EACf,IAAMC,UAAgB;GACrB,IAAMC,IAAUF,EAAS,cAAcA,EAAS,aAC1CG,IAAS,KAAK,IAAIH,EAAS,UAAU,GAErCI,IAAYV,EAAS,SAAS,eAAeM,EAAS,aAEtDK,IAAQ,iBAAiBL,CAAQ,GACjCM,KAAS,WAAWD,EAAM,WAAW,KAAK,MAAM,WAAWA,EAAM,YAAY,KAAK,IAClFE,IAAO;IAAE,UAAUP,EAAS,cAAcM,IAAQF,IAAY;IAAG,OAAOD,KAAU;IAAG,KAAKA,KAAUD,IAAU;GAAE;GACtH,GAAS,MAAWM,EAAQ,aAAaD,EAAK,YAAYC,EAAQ,UAAUD,EAAK,SAASC,EAAQ,QAAQD,EAAK,MAAMC,IAAUD,CAAI;EACpI,GACME,UAAe;GACpB,IAAMC,IAAWV,EAAS,cAA2B,mDAA+C;GACpG,IAAIU,GAAU;IACb,IAAMC,IAASX,EAAS,sBAAsB,GACxCY,IAAOF,EAAS,sBAAsB;IAC5C,AAAIE,EAAK,OAAOD,EAAO,OAAM,EAAS,cAAcC,EAAK,OAAOD,EAAO,OAC9DC,EAAK,QAAQD,EAAO,UAAO,EAAS,cAAcC,EAAK,QAAQD,EAAO;GAChF;GACA,EAAQ;EACT;EAEA,AADAV,EAAQ,GACRD,EAAS,iBAAiB,UAAUC,GAAS,EAAE,SAAS,GAAK,CAAC;EAC9D,IAAMY,IAAS,OAAO,iBAAmB,MAAc,OAAO,IAAI,eAAeJ,CAAM;EAGvF,AAFAI,GAAQ,QAAQb,CAAQ,GACpBN,EAAS,WAASmB,GAAQ,QAAQnB,EAAS,OAAO,GAClDM,EAAS,qBAAmBa,GAAQ,QAAQb,EAAS,iBAAiB;EAC1E,IAAMc,IAAY,IAAI,iBAAiBL,CAAM;EAG7C,OAFAK,EAAU,QAAQd,GAAU;GAAE,SAAS;GAAM,YAAY;GAAM,iBAAiB,CAAC,iBAAiB,cAAc;EAAE,CAAC,GACnHS,EAAO,SACM;GAAyE,AAAvET,EAAS,oBAAoB,UAAUC,CAAO,GAAGY,GAAQ,WAAW,GAAGC,EAAU,WAAW;EAAG;CAC/G,GAAG,CAAC,CAAC;CAEL,IAAMC,KAAU,MAAsB;EACrC,IAAMf,IAAWJ,EAAY;EAC7B,IAAI,CAACI,GAAU;EACf,IAAMgB,IAAM,iBAAiBhB,CAAQ,CAAC,CAAC,cAAc,OAC/CiB,IAAS,OAAO,aAAa,kCAAkC,CAAC,CAAC;EACvE,EAAS,SAAS;GAAE,MAAMC,KAAaF,IAAM,KAAK,KAAKhB,EAAS,cAAc;GAAM,UAAUiB,IAAS,YAAY;EAAS,CAAC;CAC9H;CAEA,OAAO,kBAAC9B,GAAD;EAAO,KAAKO;EAAU,WAAU;EAAa,KAAI;EAAK,OAAM;EAAS,MAAM;EAAO,WAAU;EAA5F,UAAA;GACLG,EAAM,YAAY,kBAACb,GAAD;IAAQ,MAAK;IAAK,UAAA;IAAS,MAAMmC;IAAa,MAAK;IAAY,aAAY;IAAQ,cAAY3B,EAAQ;IAAU,UAAUK,EAAM;IAAO,eAAekB,EAAO,EAAE;IAAG,WAAU;GAAmC,CAAA;GAKnO,kBAAC3B,GAAD;IAAY,aAAY;IAA0B;IAAa,WAAU;IAA6B,mBAAkB;IAAa,oBAAmB;IAAU;GAAqB,CAAA;GACtLS,EAAM,YAAY,kBAACb,GAAD;IAAQ,MAAK;IAAK,UAAA;IAAS,MAAMoC;IAAc,MAAK;IAAY,aAAY;IAAQ,cAAY5B,EAAQ;IAAM,UAAUK,EAAM;IAAK,eAAekB,EAAO,CAAC;IAAG,WAAU;GAAmC,CAAA;EACvN;;AACR;;;AC3EA,SAAS3C,EAAK,EACZ,cACA,iBAAc,cACd,GAAGkD,KACwB;CAC3B,OACE,kBAACjD,EAAc,MAAf;EACE,aAAU;EACV,oBAAkBmD;EAClB,WAAWzC,EACT,uEACA0C,CACF;EACA,GAAIH;CACL,CAAA;AAEL;AAEA,IAAMI,IAAmBC,EACvB,oQACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,MAAM;EAGN,OAAO;CACT,EACF;CACA,iBAAiB,EACf,SAAS,UACX;AACF,CACF;AAEA,SAASrD,EAAS,EAChB,cACA,aAAU,WACV,GAAGgD,KACgE;CACnE,OACE,kBAACjD,EAAc,MAAf;EACE,aAAU;EACV,gBAAcwD;EACd,WAAW9C,EAAG2C,EAAiB,EAAE,WAAQ,CAAC,GAAGD,CAAS;EACtD,GAAIH;CACL,CAAA;AAEL;AAEA,SAAS/C,EAAY,EAAE,cAAW,GAAG+C,KAAkC;CACrE,OACE,kBAACjD,EAAc,KAAf;EACE,aAAU;EACV,WAAWU,EACT,wSAAwSG,EAAa,MAAM,uZAC3T,iQAGA,mDAEA,wjBACA,4dACAuC,CACF;EACA,GAAIH;CACL,CAAA;AAEL;AAEA,SAAS9C,EAAY,EAAE,cAAW,GAAG8C,KAAoC;CACvE,OACE,kBAACjD,EAAc,OAAf;EACE,aAAU;EACV,WAAWU,EAAG,+BAA+B0C,CAAS;EACtD,GAAIH;CACL,CAAA;AAEL;;;AChEA,SAASU,EAAa,GAAqD;CAC1E,OAAO,OAAOC,KAAU,YAAY,OAAOA,KAAU,YAAY,OAAOA,KAAU;AACnF;AAEA,SAAgBxD,EAAK,EAAE,cAAW,GAAG6C,KAA+C;CACnF,OAAO,kBAAC5C,GAAD;EAAe,WAAWK,EAAG,mBAAmB0C,CAAS;EAAG,GAAIH;CAAQ,CAAA;AAChF;AASA,SAAgBa,EAAS,EAAE,cAAW,gBAAa,IAAO,kBAAe,GAAGb,KAAwB;CACnG,IAAM,EAAE,oBAAiBxC,EAAiB,GAEpCsD,IAASd,EAAM,YAAY,UAAU,KAAA,IAAYe,MAAiB,OAAO,gBAAgBA,MAAiB,OAAO,gBAAgB,YACjIC,IACL,kBAAC3D,GAAD;EACC,WAAWI,EAAG,wBAAwB,kBAAkBqD,GAAQG,KAAc,SAASd,CAAS;EAChG,GAAIH;CACJ,CAAA;CAEF,OAAOiB,IAAa,kBAACjD,GAAD;EAAmB,SAASkD;EAAgB,UAAAF;CAAwB,CAAA,IAAIA;AAC7F;AAEA,SAAgBG,EAAY,EAAE,cAAW,aAAU,GAAGnB,KAAsD;CAC3G,OACC,kBAAC1C,GAAD;EACC,WAAWG,EACV,2BACA,uDACA0C,CACD;EACA,GAAIH;EAEH,UAAAU,EAAaU,CAAQ,IACrB,kBAACzD,GAAD;GAAM,KAAI;GAAO,MAAK;GAAU,QAAO;GAAS,YAAW;GAAQ,WAAU;GAC3E;EACI,CAAA,IACHyD;CACiB,CAAA;AAExB;AAEA,SAAgBC,EAAY,EAAE,cAAW,aAAU,GAAGrB,KAAsD;CAC3G,OACC,kBAACzC,GAAD;EAAsB,WAAWE,EAAG,2BAA2B0C,CAAS;EAAG,GAAIH;EAC7E,UAAAU,EAAaU,CAAQ,IAAI,kBAACzD,GAAD,EAAO,YAAe,CAAA,IAAIyD;CAC/B,CAAA;AAExB"}