themelia-react-ui 2.0.0 → 2.0.1

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 (625) hide show
  1. package/CHANGELOG.md +351 -0
  2. package/README.md +26 -13
  3. package/dist/{accordion-CQXVcd7Q.js → accordion-B6a3vVgA.js} +84 -82
  4. package/dist/accordion-B6a3vVgA.js.map +1 -0
  5. package/dist/action-menu-TzCoSlwL.js +280 -0
  6. package/dist/action-menu-TzCoSlwL.js.map +1 -0
  7. package/dist/{affordance-geometry.generated-CCIXb2A1.js → affordance-geometry.generated-B5iu-Mkr.js} +3 -2
  8. package/dist/affordance-geometry.generated-B5iu-Mkr.js.map +1 -0
  9. package/dist/{ai-artifact-2PQ2fItc.js → ai-artifact-BMJdv-6q.js} +379 -376
  10. package/dist/ai-artifact-BMJdv-6q.js.map +1 -0
  11. package/dist/{app-shell-BE_j8-AT.js → app-shell-ZK5RWdo6.js} +4 -4
  12. package/dist/{app-shell-BE_j8-AT.js.map → app-shell-ZK5RWdo6.js.map} +1 -1
  13. package/dist/attachment-BtfhGm8i.js +245 -0
  14. package/dist/attachment-BtfhGm8i.js.map +1 -0
  15. package/dist/{auth-M3vGMgDR.js → auth-CYxKfo69.js} +237 -235
  16. package/dist/auth-CYxKfo69.js.map +1 -0
  17. package/dist/{avatar-djdaaQ_s.js → avatar-BBnEJIx8.js} +66 -65
  18. package/dist/avatar-BBnEJIx8.js.map +1 -0
  19. package/dist/badge-MrKVNzW9.js +93 -0
  20. package/dist/badge-MrKVNzW9.js.map +1 -0
  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 +3 -0
  27. package/dist/base/buttons.js +2 -3
  28. package/dist/base/cards.js +2 -2
  29. package/dist/base/carousel.js +13 -13
  30. package/dist/base/carousel.js.map +1 -1
  31. package/dist/base/cascader.js +103 -115
  32. package/dist/base/cascader.js.map +1 -1
  33. package/dist/base/chart.js +1 -1
  34. package/dist/base/choice-inputs.js +3 -3
  35. package/dist/base/code-block.js +1 -1
  36. package/dist/base/combobox.js +1 -1
  37. package/dist/base/command.js +1 -1
  38. package/dist/base/copyable.js +1 -1
  39. package/dist/base/date-pickers.js +2 -2
  40. package/dist/base/display.js +7 -7
  41. package/dist/base/feedback.js +3 -3
  42. package/dist/base/forms-numeric.js +1 -1
  43. package/dist/base/forms.js +2 -2
  44. package/dist/base/inline-edit.js +17 -17
  45. package/dist/base/inline-edit.js.map +1 -1
  46. package/dist/base/item.js +1 -1
  47. package/dist/base/media-gallery.js +1 -1
  48. package/dist/base/metadata-list.js +3 -0
  49. package/dist/base/navigation.js +7 -7
  50. package/dist/base/popover-menu.js +1 -1
  51. package/dist/base/popover.js +1 -1
  52. package/dist/base/qr-code.js +1 -1
  53. package/dist/base/repeaters.js +171 -170
  54. package/dist/base/repeaters.js.map +1 -1
  55. package/dist/base/sheet.js +1 -1
  56. package/dist/base/sidebar.js +1 -1
  57. package/dist/base/signature-pad.js +147 -137
  58. package/dist/base/signature-pad.js.map +1 -1
  59. package/dist/base/skeleton.js +1 -1
  60. package/dist/base/spinner.js +1 -1
  61. package/dist/base/structure.js +1 -1
  62. package/dist/base/table.js +1 -1
  63. package/dist/base/text-inputs.js +2 -2
  64. package/dist/base/toaster.js +2 -2
  65. package/dist/base/tree.js +1 -1
  66. package/dist/base/upload-queue.js +1 -1
  67. package/dist/base/upload.js +3 -3
  68. package/dist/base/value-inputs.js +2 -2
  69. package/dist/batch-action-bar-BZGDG-Si.js +104 -0
  70. package/dist/batch-action-bar-BZGDG-Si.js.map +1 -0
  71. package/dist/blocks/admin.js +173 -171
  72. package/dist/blocks/admin.js.map +1 -1
  73. package/dist/blocks/ai.js +266 -263
  74. package/dist/blocks/ai.js.map +1 -1
  75. package/dist/blocks/analytics/usage-card.js +1 -1
  76. package/dist/blocks/analytics.js +440 -438
  77. package/dist/blocks/analytics.js.map +1 -1
  78. package/dist/blocks/collaboration.js +1 -1
  79. package/dist/blocks/commerce/receipt.js +1 -1
  80. package/dist/blocks/commerce.js +1945 -1266
  81. package/dist/blocks/commerce.js.map +1 -1
  82. package/dist/blocks/data-display.js +3 -2
  83. package/dist/blocks/onboarding.js +50 -49
  84. package/dist/blocks/onboarding.js.map +1 -1
  85. package/dist/blocks/planning.js +25 -25
  86. package/dist/blocks/planning.js.map +1 -1
  87. package/dist/blocks/timelines.js +1 -1
  88. package/dist/breadcrumbs-D5t7I023.js +129 -0
  89. package/dist/breadcrumbs-D5t7I023.js.map +1 -0
  90. package/dist/{button-R9CCoH7A.js → button-QYwiyhD2.js} +15 -14
  91. package/dist/button-QYwiyhD2.js.map +1 -0
  92. package/dist/{button-BS3KDg00.js → buttons-SbIcm1HJ.js} +200 -213
  93. package/dist/buttons-SbIcm1HJ.js.map +1 -0
  94. package/dist/{cards-QoJ4syG9.js → cards-CiiHpKYd.js} +8 -8
  95. package/dist/cards-CiiHpKYd.js.map +1 -0
  96. package/dist/{chart-DwYRKKc-.js → chart-QfrARkXl.js} +5 -5
  97. package/dist/{chart-DwYRKKc-.js.map → chart-QfrARkXl.js.map} +1 -1
  98. package/dist/checkbox-DhB6K0bK.js +36 -0
  99. package/dist/checkbox-DhB6K0bK.js.map +1 -0
  100. package/dist/choice-inputs-t6w3ATNz.js +766 -0
  101. package/dist/choice-inputs-t6w3ATNz.js.map +1 -0
  102. package/dist/code-block-Dgbu-CU3.js +185 -0
  103. package/dist/code-block-Dgbu-CU3.js.map +1 -0
  104. package/dist/{collapsible-oMUGM4tr.js → collapsible-D8AEGU1-.js} +4 -4
  105. package/dist/{collapsible-oMUGM4tr.js.map → collapsible-D8AEGU1-.js.map} +1 -1
  106. package/dist/{collection-content-Ys-OZOkY.js → collection-content-uK16Grv0.js} +3 -3
  107. package/dist/{collection-content-Ys-OZOkY.js.map → collection-content-uK16Grv0.js.map} +1 -1
  108. package/dist/{combobox-6dvVny2q.js → combobox-2Ic8N9bL.js} +74 -68
  109. package/dist/combobox-2Ic8N9bL.js.map +1 -0
  110. package/dist/{combobox-CB7039j7.js → combobox-DLl0bfiq.js} +307 -305
  111. package/dist/combobox-DLl0bfiq.js.map +1 -0
  112. package/dist/{command-kPMPjIxJ.js → command-kNR20o7x.js} +7 -7
  113. package/dist/{command-kPMPjIxJ.js.map → command-kNR20o7x.js.map} +1 -1
  114. package/dist/{comments-You0Bzbr.js → comments-BpDuCUUu.js} +341 -339
  115. package/dist/comments-BpDuCUUu.js.map +1 -0
  116. package/dist/components/base/action-menu/action-menu.d.ts +21 -4
  117. package/dist/components/base/action-menu/action-menu.recipes.d.ts +21 -0
  118. package/dist/components/base/action-menu/index.d.ts +1 -0
  119. package/dist/components/base/badge/badge.recipes.d.ts +4 -4
  120. package/dist/components/base/batch-action-bar/batch-action-bar.d.ts +50 -0
  121. package/dist/components/base/batch-action-bar/batch-action-bar.strings.d.ts +20 -0
  122. package/dist/components/base/batch-action-bar/index.d.ts +8 -0
  123. package/dist/components/base/buttons/button-group.recipes.d.ts +1 -1
  124. package/dist/components/base/buttons/button.recipes.d.ts +2 -2
  125. package/dist/components/base/choice-inputs/checkbox.d.ts +2 -2
  126. package/dist/components/base/choice-inputs/choice-types.d.ts +18 -6
  127. package/dist/components/base/display/alert-dialog.d.ts +6 -5
  128. package/dist/components/base/display/dialog.d.ts +4 -8
  129. package/dist/components/base/display/icon-badge/icon-badge.d.ts +1 -1
  130. package/dist/components/base/forms/form-sizing.d.ts +15 -12
  131. package/dist/components/base/metadata-list/index.d.ts +12 -0
  132. package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.d.ts +28 -25
  133. package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-value.d.ts +2 -2
  134. package/dist/components/base/navigation/index.d.ts +1 -1
  135. package/dist/components/base/navigation/page-header/index.d.ts +1 -0
  136. package/dist/components/base/navigation/page-header/page-header-commands.d.ts +73 -0
  137. package/dist/components/base/navigation/page-header/page-header.d.ts +26 -3
  138. package/dist/components/base/sheet/sheet.d.ts +4 -8
  139. package/dist/components/base/signature-pad/signature-pad.types.d.ts +5 -1
  140. package/dist/components/base/signature-pad/signature-pad.utils.d.ts +11 -3
  141. package/dist/components/base/text-inputs/field-clear-button.d.ts +6 -0
  142. package/dist/components/base/upload/upload.recipes.d.ts +25 -3
  143. package/dist/components/base/value-inputs/index.d.ts +5 -5
  144. package/dist/components/base/value-inputs/tags-input.d.ts +36 -12
  145. package/dist/components/blocks/commerce/address-card/address-card.d.ts +1 -1
  146. package/dist/components/blocks/commerce/address-card/types.d.ts +2 -1
  147. package/dist/components/blocks/commerce/cart-summary/cart-summary.d.ts +3 -1
  148. package/dist/components/blocks/commerce/cart-summary/index.d.ts +2 -2
  149. package/dist/components/blocks/commerce/cart-summary/types.d.ts +6 -1
  150. package/dist/components/blocks/commerce/discount-stack/discount-stack.d.ts +3 -1
  151. package/dist/components/blocks/commerce/discount-stack/index.d.ts +2 -2
  152. package/dist/components/blocks/commerce/discount-stack/types.d.ts +16 -4
  153. package/dist/components/blocks/commerce/fulfillment-group/fulfillment-group.d.ts +5 -0
  154. package/dist/components/blocks/commerce/fulfillment-group/index.d.ts +2 -0
  155. package/dist/components/blocks/commerce/fulfillment-group/types.d.ts +43 -0
  156. package/dist/components/blocks/commerce/index.d.ts +13 -5
  157. package/dist/components/blocks/commerce/invoice-header/invoice-header.d.ts +1 -1
  158. package/dist/components/blocks/commerce/invoice-header/types.d.ts +4 -2
  159. package/dist/components/blocks/commerce/invoice-mini/invoice-mini.d.ts +1 -1
  160. package/dist/components/blocks/commerce/invoice-mini/types.d.ts +2 -1
  161. package/dist/components/blocks/commerce/order-customer/index.d.ts +2 -0
  162. package/dist/components/blocks/commerce/order-customer/order-customer.d.ts +5 -0
  163. package/dist/components/blocks/commerce/order-customer/types.d.ts +48 -0
  164. package/dist/components/blocks/commerce/order-header/index.d.ts +2 -0
  165. package/dist/components/blocks/commerce/order-header/order-header.d.ts +5 -0
  166. package/dist/components/blocks/commerce/order-header/types.d.ts +37 -0
  167. package/dist/components/blocks/commerce/order-line-item/index.d.ts +2 -0
  168. package/dist/components/blocks/commerce/order-line-item/order-line-item.d.ts +5 -0
  169. package/dist/components/blocks/commerce/order-line-item/types.d.ts +46 -0
  170. package/dist/components/blocks/commerce/order-summary/index.d.ts +2 -0
  171. package/dist/components/blocks/commerce/order-summary/order-summary.d.ts +5 -0
  172. package/dist/components/blocks/commerce/order-summary/types.d.ts +42 -0
  173. package/dist/components/blocks/commerce/order-transactions/index.d.ts +2 -0
  174. package/dist/components/blocks/commerce/order-transactions/order-transactions.d.ts +5 -0
  175. package/dist/components/blocks/commerce/order-transactions/types.d.ts +46 -0
  176. package/dist/components/blocks/commerce/payment-method/index.d.ts +2 -2
  177. package/dist/components/blocks/commerce/payment-method/payment-method.d.ts +9 -1
  178. package/dist/components/blocks/commerce/payment-method/types.d.ts +12 -1
  179. package/dist/components/blocks/commerce/refund-status/index.d.ts +2 -2
  180. package/dist/components/blocks/commerce/refund-status/refund-status.d.ts +3 -1
  181. package/dist/components/blocks/commerce/refund-status/types.d.ts +6 -3
  182. package/dist/components/blocks/commerce/shared/address-lines.d.ts +21 -0
  183. package/dist/components/blocks/commerce/shared/line-thumbnail.d.ts +9 -0
  184. package/dist/components/blocks/commerce/shared/order-status.d.ts +51 -0
  185. package/dist/components/blocks/commerce/shipment-tracking/shipment-tracking.d.ts +1 -1
  186. package/dist/components/blocks/commerce/shipment-tracking/types.d.ts +27 -6
  187. package/dist/components/blocks/commerce/summary-panel/amount-row.d.ts +2 -0
  188. package/dist/components/blocks/commerce/summary-panel/index.d.ts +3 -0
  189. package/dist/components/blocks/commerce/summary-panel/summary-panel.d.ts +2 -0
  190. package/dist/components/blocks/commerce/summary-panel/types.d.ts +26 -0
  191. package/dist/components/blocks/commerce/tax-breakdown/tax-breakdown.d.ts +1 -1
  192. package/dist/components/blocks/commerce/tax-breakdown/types.d.ts +2 -1
  193. package/dist/components/blocks/data-display/metadata/index.d.ts +30 -4
  194. package/dist/components/features/activities/partials/activity-row.d.ts +6 -2
  195. package/dist/components/features/activities/partials/tone-tokens.d.ts +0 -6
  196. package/dist/components/features/global-search/partials/global-search-group-heading.d.ts +15 -0
  197. package/dist/components/features/global-search/partials/tone-palettes.d.ts +0 -5
  198. package/dist/components/features/kanban/kanban.d.ts +1 -1
  199. package/dist/components/features/kanban/kanban.strings.d.ts +1 -1
  200. package/dist/components/features/kanban/kanban.types.d.ts +2 -2
  201. package/dist/components/features/media-library/hooks/use-media-library.d.ts +1 -1
  202. package/dist/components/features/media-library/index.d.ts +1 -1
  203. package/dist/components/features/media-library/media-library.d.ts +1 -1
  204. package/dist/components/features/media-library/media-library.strings.d.ts +4 -0
  205. package/dist/components/features/media-library/media-library.types.d.ts +74 -1
  206. package/dist/components/features/media-library/partials/media-library-partials.d.ts +3 -3
  207. package/dist/components/features/mentions/partials/mention-kind-toggles.d.ts +16 -0
  208. package/dist/components/features/overlays/alert-dialog.d.ts +1 -1
  209. package/dist/components/features/overlays/dialog.d.ts +1 -1
  210. package/dist/components/features/overlays/index.d.ts +1 -1
  211. package/dist/components/features/overlays/overlay-tone-icon.d.ts +3 -3
  212. package/dist/components/features/overlays/overlays.types.d.ts +20 -0
  213. package/dist/components/features/products/components/product-contract-overview.d.ts +5 -0
  214. package/dist/components/features/products/components/product-details-card.d.ts +5 -0
  215. package/dist/components/features/products/components/product-operations-card.d.ts +5 -0
  216. package/dist/components/features/products/components/product-option-action-menu.d.ts +5 -0
  217. package/dist/components/features/products/components/product-options-summary.d.ts +5 -0
  218. package/dist/components/features/products/components/product-policies-card.d.ts +5 -0
  219. package/dist/components/features/products/components/product-quote-preview-card.d.ts +5 -0
  220. package/dist/components/features/products/components/product-readiness-card.d.ts +5 -0
  221. package/dist/components/features/products/components/product-structure-card.d.ts +5 -0
  222. package/dist/components/features/products/components/product-variant-action-menu.d.ts +23 -1
  223. package/dist/components/features/products/products.types.d.ts +9 -2
  224. package/dist/components/features/resource/index.d.ts +1 -1
  225. package/dist/components/features/resource/resource.d.ts +1 -1
  226. package/dist/components/features/resource/resource.types.d.ts +34 -6
  227. package/dist/components/features/rich-text-editor/index.d.ts +2 -1
  228. package/dist/components/features/rich-text-editor/partials/image-nodes.d.ts +13 -0
  229. package/dist/components/features/rich-text-editor/partials/image-uploads.d.ts +66 -0
  230. package/dist/components/features/rich-text-editor/partials/inline-reference-node.d.ts +19 -0
  231. package/dist/components/features/rich-text-editor/rich-text-editor.recipes.d.ts +1 -1
  232. package/dist/components/features/rich-text-editor/rich-text-editor.strings.d.ts +14 -0
  233. package/dist/components/features/rich-text-editor/rich-text-editor.types.d.ts +45 -0
  234. package/dist/components/features/rich-text-editor/use-rich-text-images.d.ts +18 -0
  235. package/dist/components/features/sync/index.d.ts +26 -3
  236. package/dist/components/features/table/data-table.d.ts +1 -1
  237. package/dist/components/features/table/table.types.d.ts +32 -7
  238. package/dist/components/layout/page/index.d.ts +1 -1
  239. package/dist/components/layout/page/page.types.d.ts +33 -36
  240. package/dist/components/layout/page/partials/page-actions.d.ts +1 -0
  241. package/dist/components/layout/page/partials/page-header.d.ts +1 -1
  242. package/dist/components/layout/settings/settings.d.ts +16 -2
  243. package/dist/components/layout/workspace/workspace.types.d.ts +21 -4
  244. package/dist/components/typography/rich-text/index.d.ts +1 -1
  245. package/dist/components/typography/rich-text/rich-text-tree.d.ts +19 -0
  246. package/dist/components/typography/rich-text/rich-text.d.ts +16 -0
  247. package/dist/components/typography/text-link.d.ts +4 -3
  248. package/dist/components/ui/checkbox.d.ts +4 -3
  249. package/dist/components/ui/overlay.recipes.d.ts +0 -9
  250. package/dist/components/ui/switch.d.ts +2 -2
  251. package/dist/{containers-D_L4mTVb.js → containers-DmWiJa2I.js} +36 -35
  252. package/dist/containers-DmWiJa2I.js.map +1 -0
  253. package/dist/{copyable-DDjTeW_j.js → copyable-B3Gwgdqc.js} +6 -6
  254. package/dist/{copyable-DDjTeW_j.js.map → copyable-B3Gwgdqc.js.map} +1 -1
  255. package/dist/data-display-DafIvCl5.js +960 -0
  256. package/dist/data-display-DafIvCl5.js.map +1 -0
  257. package/dist/{date-uf3z37Nm.js → date-BgK3bTdo.js} +5 -5
  258. package/dist/{date-uf3z37Nm.js.map → date-BgK3bTdo.js.map} +1 -1
  259. package/dist/date-picker-CF-DtUpF.js +1529 -0
  260. package/dist/date-picker-CF-DtUpF.js.map +1 -0
  261. package/dist/{date-pickers-CnFCb0n2.js → date-pickers-BmzxJl5l.js} +19 -19
  262. package/dist/{date-pickers-CnFCb0n2.js.map → date-pickers-BmzxJl5l.js.map} +1 -1
  263. package/dist/{display-DrdvPwF0.js → display-DsQTVzMz.js} +88 -87
  264. package/dist/display-DsQTVzMz.js.map +1 -0
  265. package/dist/{dropdown-menu-CURh59jb.js → dropdown-menu-E2qmdC7o.js} +7 -7
  266. package/dist/{dropdown-menu-CURh59jb.js.map → dropdown-menu-E2qmdC7o.js.map} +1 -1
  267. package/dist/features/activities.js +414 -501
  268. package/dist/features/activities.js.map +1 -1
  269. package/dist/features/ai-chat.js +170 -169
  270. package/dist/features/ai-chat.js.map +1 -1
  271. package/dist/features/async-preview.js +8 -8
  272. package/dist/features/async-preview.js.map +1 -1
  273. package/dist/features/combobox.js +1 -1
  274. package/dist/features/comments.js +1 -1
  275. package/dist/features/data-view.js +139 -138
  276. package/dist/features/data-view.js.map +1 -1
  277. package/dist/features/email-composer/engine.js +1 -1
  278. package/dist/features/email-composer.js +73 -71
  279. package/dist/features/email-composer.js.map +1 -1
  280. package/dist/features/event-calendar.js +278 -275
  281. package/dist/features/event-calendar.js.map +1 -1
  282. package/dist/features/filters.js +1 -1
  283. package/dist/features/global-search.js +307 -310
  284. package/dist/features/global-search.js.map +1 -1
  285. package/dist/features/kanban.js +95 -97
  286. package/dist/features/kanban.js.map +1 -1
  287. package/dist/features/map.js +56 -57
  288. package/dist/features/map.js.map +1 -1
  289. package/dist/features/media-library.js +918 -825
  290. package/dist/features/media-library.js.map +1 -1
  291. package/dist/features/mentions.js +1 -1
  292. package/dist/features/overlays.js +1 -1
  293. package/dist/features/products.js +1115 -1122
  294. package/dist/features/products.js.map +1 -1
  295. package/dist/features/questionnaire.js +202 -194
  296. package/dist/features/questionnaire.js.map +1 -1
  297. package/dist/features/resource-assignment.js +25 -25
  298. package/dist/features/resource-assignment.js.map +1 -1
  299. package/dist/features/resource.js +77 -69
  300. package/dist/features/resource.js.map +1 -1
  301. package/dist/features/rich-text-editor.js +30 -11
  302. package/dist/features/rich-text-editor.js.map +1 -1
  303. package/dist/features/schema-form.js +33 -33
  304. package/dist/features/schema-form.js.map +1 -1
  305. package/dist/features/suggestions.js +3 -3
  306. package/dist/features/sync.js +3 -3
  307. package/dist/features/table.js +1 -1
  308. package/dist/features/theme-tweaker.js +397 -396
  309. package/dist/features/theme-tweaker.js.map +1 -1
  310. package/dist/{feedback-C7nR0UtT.js → feedback-qNuMBtRH.js} +84 -83
  311. package/dist/feedback-qNuMBtRH.js.map +1 -0
  312. package/dist/{field-affordance-recipes-CkOCdE2y.js → field-affordance-recipes-qQeIf4lG.js} +8 -6
  313. package/dist/field-affordance-recipes-qQeIf4lG.js.map +1 -0
  314. package/dist/field-state-recipes-BVA2CWHo.js +12 -0
  315. package/dist/field-state-recipes-BVA2CWHo.js.map +1 -0
  316. package/dist/{filters-Da-gNPsE.js → filters-BkHH53uv.js} +565 -563
  317. package/dist/filters-BkHH53uv.js.map +1 -0
  318. package/dist/focus-recipes-B653VaLq.js +12 -0
  319. package/dist/focus-recipes-B653VaLq.js.map +1 -0
  320. package/dist/{form-field-VZRULhUK.js → form-field-DUt4UxSV.js} +4 -4
  321. package/dist/{form-field-VZRULhUK.js.map → form-field-DUt4UxSV.js.map} +1 -1
  322. package/dist/{form-sizing-uWP4lzVh.js → form-sizing-By94KzXE.js} +19 -15
  323. package/dist/form-sizing-By94KzXE.js.map +1 -0
  324. package/dist/{forms-DDeEnXSY.js → forms-Bzha-Y3B.js} +22 -22
  325. package/dist/{forms-DDeEnXSY.js.map → forms-Bzha-Y3B.js.map} +1 -1
  326. package/dist/{forms-numeric-D3CO60IF.js → forms-numeric-C0bvjRPZ.js} +265 -264
  327. package/dist/forms-numeric-C0bvjRPZ.js.map +1 -0
  328. package/dist/{header-2ycNqGOR.js → header-BOefOKd1.js} +47 -51
  329. package/dist/header-BOefOKd1.js.map +1 -0
  330. package/dist/{hooks-DQ5SPwZw.js → hooks-9k_TtmKh.js} +2 -2
  331. package/dist/{hooks-DQ5SPwZw.js.map → hooks-9k_TtmKh.js.map} +1 -1
  332. package/dist/{http-CdEIHyQf.js → http-D_6rOnzU.js} +2 -2
  333. package/dist/{http-CdEIHyQf.js.map → http-D_6rOnzU.js.map} +1 -1
  334. package/dist/icon-badge-CAuKupo9.js +55 -0
  335. package/dist/icon-badge-CAuKupo9.js.map +1 -0
  336. package/dist/index.js +7 -7
  337. package/dist/input-DWhBBBww.js +262 -0
  338. package/dist/input-DWhBBBww.js.map +1 -0
  339. package/dist/{input-BoLm9Hks.js → input-Ddi_LSYv.js} +3 -3
  340. package/dist/{input-BoLm9Hks.js.map → input-Ddi_LSYv.js.map} +1 -1
  341. package/dist/interaction-recipes-CHr0dJUs.js +24 -0
  342. package/dist/interaction-recipes-CHr0dJUs.js.map +1 -0
  343. package/dist/{item-xzh8Df65.js → item-DEmDiTlD.js} +98 -97
  344. package/dist/item-DEmDiTlD.js.map +1 -0
  345. package/dist/layer-recipes-CCpklYME.js +13 -0
  346. package/dist/layer-recipes-CCpklYME.js.map +1 -0
  347. package/dist/layout/app-shell.js +1 -1
  348. package/dist/layout/auth.js +1 -1
  349. package/dist/layout/containers.js +1 -1
  350. package/dist/layout/header.js +1 -1
  351. package/dist/layout/hooks.js +1 -1
  352. package/dist/layout/navigation.js +1 -1
  353. package/dist/layout/page.js +1 -1
  354. package/dist/layout/settings.js +1 -1
  355. package/dist/layout/sidebar.js +2 -2
  356. package/dist/layout/workspace.js +1 -1
  357. package/dist/layout.js +10 -10
  358. package/dist/lib/affordance-geometry.generated.d.ts +1 -0
  359. package/dist/lib/field-affordance-recipes.d.ts +6 -1
  360. package/dist/lib/field-state-recipes.d.ts +9 -8
  361. package/dist/lib/focus-recipes.d.ts +24 -0
  362. package/dist/lib/interaction-recipes.d.ts +35 -0
  363. package/dist/lib/layer-recipes.d.ts +19 -0
  364. package/dist/lib/motion-recipes.d.ts +1 -0
  365. package/dist/lib/overlay-anatomy-recipes.d.ts +1 -0
  366. package/dist/lib/safe-image-src.d.ts +10 -0
  367. package/dist/lib/sanitize-html.d.ts +15 -3
  368. package/dist/lib/surface-recipes.d.ts +47 -7
  369. package/dist/lib/token-merge.generated.d.ts +9 -6
  370. package/dist/lib/tone-recipes.d.ts +79 -0
  371. package/dist/lib/ui-provider/hooks.d.ts +2 -1
  372. package/dist/lib/ui-provider/index.d.ts +2 -2
  373. package/dist/lib/ui-provider/types.d.ts +9 -0
  374. package/dist/lib/utils.js +1 -1
  375. package/dist/media-gallery-DcTtAaeC.js +203 -0
  376. package/dist/media-gallery-DcTtAaeC.js.map +1 -0
  377. package/dist/mentions-D-uyCh01.js +568 -0
  378. package/dist/mentions-D-uyCh01.js.map +1 -0
  379. package/dist/{message-YfFmbXNP.js → message-CdHgIWKf.js} +5 -5
  380. package/dist/{message-YfFmbXNP.js.map → message-CdHgIWKf.js.map} +1 -1
  381. package/dist/metadata-list-X5rYAKSB.js +394 -0
  382. package/dist/metadata-list-X5rYAKSB.js.map +1 -0
  383. package/dist/{motion-recipes-B6jKXEcN.js → motion-recipes-ChBg4HBq.js} +3 -2
  384. package/dist/{motion-recipes-B6jKXEcN.js.map → motion-recipes-ChBg4HBq.js.map} +1 -1
  385. package/dist/navigation-D3KwXmaq.js +145 -0
  386. package/dist/navigation-D3KwXmaq.js.map +1 -0
  387. package/dist/navigation-HJf5zxlH.js +268 -0
  388. package/dist/navigation-HJf5zxlH.js.map +1 -0
  389. package/dist/{navigation-row-recipes-DlU-4QYO.js → navigation-row-recipes-BVowojQw.js} +2 -2
  390. package/dist/{navigation-row-recipes-DlU-4QYO.js.map → navigation-row-recipes-BVowojQw.js.map} +1 -1
  391. package/dist/{number-CKRBYmZK.js → number-DMhe-Vsk.js} +5 -5
  392. package/dist/{number-CKRBYmZK.js.map → number-DMhe-Vsk.js.map} +1 -1
  393. package/dist/overflow-tab-bar-sQHXLlwQ.js +280 -0
  394. package/dist/overflow-tab-bar-sQHXLlwQ.js.map +1 -0
  395. package/dist/overlay.recipes-8GHqmlb4.js +6 -0
  396. package/dist/overlay.recipes-8GHqmlb4.js.map +1 -0
  397. package/dist/overlays-I0axtYA6.js +999 -0
  398. package/dist/overlays-I0axtYA6.js.map +1 -0
  399. package/dist/page-B5dTH9gE.js +224 -0
  400. package/dist/page-B5dTH9gE.js.map +1 -0
  401. package/dist/page-header-commands-DjzFEq3E.js +126 -0
  402. package/dist/page-header-commands-DjzFEq3E.js.map +1 -0
  403. package/dist/{pagination-Cm0jqa3I.js → pagination-3bPA_a6K.js} +15 -15
  404. package/dist/{pagination-Cm0jqa3I.js.map → pagination-3bPA_a6K.js.map} +1 -1
  405. package/dist/{popover-Dcv_9jxr.js → popover-Di55PyAI.js} +8 -8
  406. package/dist/popover-Di55PyAI.js.map +1 -0
  407. package/dist/{popover-menu-DnRFKnHP.js → popover-menu-B71Tn2Qz.js} +6 -6
  408. package/dist/{popover-menu-DnRFKnHP.js.map → popover-menu-B71Tn2Qz.js.map} +1 -1
  409. package/dist/{popover.recipes-wmbvL8Ah.js → popover.recipes-Bdyhj2db.js} +2 -2
  410. package/dist/{popover.recipes-wmbvL8Ah.js.map → popover.recipes-Bdyhj2db.js.map} +1 -1
  411. package/dist/{primitives-BHrwQXFC.js → primitives-B-CkiEMU.js} +5 -5
  412. package/dist/{primitives-BHrwQXFC.js.map → primitives-B-CkiEMU.js.map} +1 -1
  413. package/dist/primitives.js +4 -4
  414. package/dist/{progress-Br9WTFya.js → progress-rnS8-uAW.js} +9 -9
  415. package/dist/{progress-Br9WTFya.js.map → progress-rnS8-uAW.js.map} +1 -1
  416. package/dist/{receipt-CV89q1fs.js → receipt-D0oswZ0p.js} +6 -6
  417. package/dist/{receipt-CV89q1fs.js.map → receipt-D0oswZ0p.js.map} +1 -1
  418. package/dist/rich-text-DvGulsNJ.js +78 -0
  419. package/dist/rich-text-DvGulsNJ.js.map +1 -0
  420. package/dist/rich-text-editor-sMU_Scqm.js +1204 -0
  421. package/dist/rich-text-editor-sMU_Scqm.js.map +1 -0
  422. package/dist/rich-text-editor.recipes-CadiF_Uu.js +88 -0
  423. package/dist/rich-text-editor.recipes-CadiF_Uu.js.map +1 -0
  424. package/dist/rich-text-editor.strings-CB59ekH2.js +38 -0
  425. package/dist/rich-text-editor.strings-CB59ekH2.js.map +1 -0
  426. package/dist/safe-image-src-C6kQSMBZ.js +17 -0
  427. package/dist/safe-image-src-C6kQSMBZ.js.map +1 -0
  428. package/dist/sanitize-html-DsQmI48u.js +92 -0
  429. package/dist/sanitize-html-DsQmI48u.js.map +1 -0
  430. package/dist/scroll-area-Bt_vXY2b.js +48 -0
  431. package/dist/scroll-area-Bt_vXY2b.js.map +1 -0
  432. package/dist/{separator-Do5GWDYi.js → separator-C8DlRGwF.js} +3 -3
  433. package/dist/{separator-Do5GWDYi.js.map → separator-C8DlRGwF.js.map} +1 -1
  434. package/dist/{separator-BMEvwnSX.js → separator-CYHnjsAb.js} +2 -2
  435. package/dist/{separator-BMEvwnSX.js.map → separator-CYHnjsAb.js.map} +1 -1
  436. package/dist/services/actions/action-adapters.d.ts +18 -0
  437. package/dist/services/actions/index.d.ts +1 -1
  438. package/dist/services/actions.js +16 -4
  439. package/dist/services/actions.js.map +1 -1
  440. package/dist/settings-CQW3b-Cu.js +170 -0
  441. package/dist/settings-CQW3b-Cu.js.map +1 -0
  442. package/dist/sheet-4SEvVYzA.js +210 -0
  443. package/dist/sheet-4SEvVYzA.js.map +1 -0
  444. package/dist/{sidebar-Crc9M9JV.js → sidebar-C7WWR29L.js} +180 -179
  445. package/dist/sidebar-C7WWR29L.js.map +1 -0
  446. package/dist/{sidebar-Cb8WzOvE.js → sidebar-d7Dg80ln.js} +16 -16
  447. package/dist/sidebar-d7Dg80ln.js.map +1 -0
  448. package/dist/{skeleton-DVMXr15h.js → skeleton-Cz890JZF.js} +9 -9
  449. package/dist/{skeleton-DVMXr15h.js.map → skeleton-Cz890JZF.js.map} +1 -1
  450. package/dist/smart-card-lFKxn5Hu.js +595 -0
  451. package/dist/smart-card-lFKxn5Hu.js.map +1 -0
  452. package/dist/{spinner-CmTAbEp0.js → spinner-fa3h1Aif.js} +7 -7
  453. package/dist/{spinner-CmTAbEp0.js.map → spinner-fa3h1Aif.js.map} +1 -1
  454. package/dist/{structure-hzCW-XsV.js → structure-DC2dygdA.js} +2 -2
  455. package/dist/{structure-hzCW-XsV.js.map → structure-DC2dygdA.js.map} +1 -1
  456. package/dist/style.css +1 -1
  457. package/dist/surface-recipes-BKRVW8Os.js +43 -0
  458. package/dist/surface-recipes-BKRVW8Os.js.map +1 -0
  459. package/dist/{table-D6zKeYQX.js → table-CIKyLUsy.js} +59 -58
  460. package/dist/table-CIKyLUsy.js.map +1 -0
  461. package/dist/table-CrcLN9Io.js +1458 -0
  462. package/dist/table-CrcLN9Io.js.map +1 -0
  463. package/dist/{tabs-Dk8E_knt.js → tabs-DwBJfjxX.js} +58 -57
  464. package/dist/tabs-DwBJfjxX.js.map +1 -0
  465. package/dist/{text-inputs-BFpku0Qd.js → text-inputs-aaK9wcDT.js} +74 -79
  466. package/dist/text-inputs-aaK9wcDT.js.map +1 -0
  467. package/dist/theme.css +3 -3
  468. package/dist/{timelines-CxuAFIc2.js → timelines-C_SBwHNP.js} +153 -150
  469. package/dist/timelines-C_SBwHNP.js.map +1 -0
  470. package/dist/tone-recipes-CPoExcTE.js +70 -0
  471. package/dist/tone-recipes-CPoExcTE.js.map +1 -0
  472. package/dist/tooltip-CsfgrfS7.js +111 -0
  473. package/dist/tooltip-CsfgrfS7.js.map +1 -0
  474. package/dist/{tree-BotPlyiD.js → tree-BiKhg8AY.js} +68 -66
  475. package/dist/tree-BiKhg8AY.js.map +1 -0
  476. package/dist/typography/rich-text.js +1 -1
  477. package/dist/typography-DTRkE9zL.js +117 -0
  478. package/dist/typography-DTRkE9zL.js.map +1 -0
  479. package/dist/typography.js +1 -1
  480. package/dist/{ui-provider-D2_TeLqw.js → ui-provider-1D_NSYzO.js} +11 -3
  481. package/dist/ui-provider-1D_NSYzO.js.map +1 -0
  482. package/dist/ui-provider.js +3 -3
  483. package/dist/{upload-B0WHW7ak.js → upload-BO8-CLN6.js} +209 -209
  484. package/dist/upload-BO8-CLN6.js.map +1 -0
  485. package/dist/{upload-queue-BHZ_wBfd.js → upload-queue-EOC8g1gf.js} +109 -111
  486. package/dist/upload-queue-EOC8g1gf.js.map +1 -0
  487. package/dist/upload.recipes-BbxTqrCT.js +61 -0
  488. package/dist/upload.recipes-BbxTqrCT.js.map +1 -0
  489. package/dist/{usage-card-U0YBLTNT.js → usage-card-obRaBskq.js} +46 -46
  490. package/dist/{usage-card-U0YBLTNT.js.map → usage-card-obRaBskq.js.map} +1 -1
  491. package/dist/{utils-Cospvlj1.js → utils-l5LpDw2z.js} +56 -24
  492. package/dist/utils-l5LpDw2z.js.map +1 -0
  493. package/dist/value-inputs-TAYMX111.js +947 -0
  494. package/dist/value-inputs-TAYMX111.js.map +1 -0
  495. package/dist/{value-typography-Deb3yQZg.js → value-typography-b8wpz1eX.js} +2 -2
  496. package/dist/{value-typography-Deb3yQZg.js.map → value-typography-b8wpz1eX.js.map} +1 -1
  497. package/dist/workspace-DH0v0KcB.js +407 -0
  498. package/dist/workspace-DH0v0KcB.js.map +1 -0
  499. package/docs/consumer-skill/SKILL.md +19 -20
  500. package/docs/consumer-skill/examples/app-layout.tsx +1 -1
  501. package/docs/consumer-skill/examples/composition.tsx +3 -3
  502. package/docs/consumer-skill/examples/detail.tsx +59 -12
  503. package/docs/consumer-skill/examples/edit.tsx +1 -1
  504. package/docs/consumer-skill/examples/receipt.tsx +2 -2
  505. package/docs/consumer-skill/examples/scoped-directory.tsx +1 -1
  506. package/docs/consumer-skill/examples/website.tsx +1 -1
  507. package/docs/consumer-skill/references/agents-md.md +33 -0
  508. package/docs/consumer-skill/references/analytics.md +1 -1
  509. package/docs/consumer-skill/references/composition.md +51 -8
  510. package/docs/consumer-skill/references/design-contract.md +12 -3
  511. package/docs/consumer-skill/references/installation.md +11 -1
  512. package/docs/consumer-skill/references/public-api.json +847 -447
  513. package/docs/consumer-skill/references/review.md +25 -5
  514. package/docs/consumer-skill/references/theming.md +8 -4
  515. package/docs/consumer-skill/references/tokens.json +1 -1
  516. package/docs/consumer-skill/references/workflows.md +29 -10
  517. package/docs/consumer-skill/scripts/composition-policy.mjs +41 -11
  518. package/docs/consumer-skill/scripts/surface-policy.mjs +139 -5
  519. package/package.json +10 -2
  520. package/dist/accordion-CQXVcd7Q.js.map +0 -1
  521. package/dist/action-menu-BTpyPWJ2.js +0 -264
  522. package/dist/action-menu-BTpyPWJ2.js.map +0 -1
  523. package/dist/affordance-geometry.generated-CCIXb2A1.js.map +0 -1
  524. package/dist/ai-artifact-2PQ2fItc.js.map +0 -1
  525. package/dist/attachment-q69dlt5Y.js +0 -244
  526. package/dist/attachment-q69dlt5Y.js.map +0 -1
  527. package/dist/auth-M3vGMgDR.js.map +0 -1
  528. package/dist/avatar-djdaaQ_s.js.map +0 -1
  529. package/dist/badge-0tATj-tW.js +0 -92
  530. package/dist/badge-0tATj-tW.js.map +0 -1
  531. package/dist/breadcrumbs-BG_FfMK4.js +0 -128
  532. package/dist/breadcrumbs-BG_FfMK4.js.map +0 -1
  533. package/dist/button-BS3KDg00.js.map +0 -1
  534. package/dist/button-R9CCoH7A.js.map +0 -1
  535. package/dist/buttons-DS0ZIwJ_.js +0 -99
  536. package/dist/buttons-DS0ZIwJ_.js.map +0 -1
  537. package/dist/cards-QoJ4syG9.js.map +0 -1
  538. package/dist/checkbox-B7ygNTYp.js +0 -35
  539. package/dist/checkbox-B7ygNTYp.js.map +0 -1
  540. package/dist/choice-inputs-DrJ17tpL.js +0 -752
  541. package/dist/choice-inputs-DrJ17tpL.js.map +0 -1
  542. package/dist/code-block-CD0B7M93.js +0 -183
  543. package/dist/code-block-CD0B7M93.js.map +0 -1
  544. package/dist/combobox-6dvVny2q.js.map +0 -1
  545. package/dist/combobox-CB7039j7.js.map +0 -1
  546. package/dist/comments-You0Bzbr.js.map +0 -1
  547. package/dist/components/layout/page/partials/page-header-commands.d.ts +0 -13
  548. package/dist/containers-D_L4mTVb.js.map +0 -1
  549. package/dist/data-display-3xWQUnMA.js +0 -1335
  550. package/dist/data-display-3xWQUnMA.js.map +0 -1
  551. package/dist/date-picker-DrDFj8Lo.js +0 -1527
  552. package/dist/date-picker-DrDFj8Lo.js.map +0 -1
  553. package/dist/display-DrdvPwF0.js.map +0 -1
  554. package/dist/feedback-C7nR0UtT.js.map +0 -1
  555. package/dist/field-affordance-recipes-CkOCdE2y.js.map +0 -1
  556. package/dist/field-state-recipes-C-MFBX_8.js +0 -11
  557. package/dist/field-state-recipes-C-MFBX_8.js.map +0 -1
  558. package/dist/filters-Da-gNPsE.js.map +0 -1
  559. package/dist/form-sizing-uWP4lzVh.js.map +0 -1
  560. package/dist/forms-numeric-D3CO60IF.js.map +0 -1
  561. package/dist/header-2ycNqGOR.js.map +0 -1
  562. package/dist/icon-badge-DKlaKXoo.js +0 -53
  563. package/dist/icon-badge-DKlaKXoo.js.map +0 -1
  564. package/dist/input-DhQdBnV3.js +0 -255
  565. package/dist/input-DhQdBnV3.js.map +0 -1
  566. package/dist/item-xzh8Df65.js.map +0 -1
  567. package/dist/media-gallery-DQUQ0m3O.js +0 -201
  568. package/dist/media-gallery-DQUQ0m3O.js.map +0 -1
  569. package/dist/mentions-DwnO1hh4.js +0 -564
  570. package/dist/mentions-DwnO1hh4.js.map +0 -1
  571. package/dist/navigation-Cbp5V8gG.js +0 -264
  572. package/dist/navigation-Cbp5V8gG.js.map +0 -1
  573. package/dist/navigation-Cs1npsPm.js +0 -300
  574. package/dist/navigation-Cs1npsPm.js.map +0 -1
  575. package/dist/overlay.recipes-CNO2S9V6.js +0 -34
  576. package/dist/overlay.recipes-CNO2S9V6.js.map +0 -1
  577. package/dist/overlays-DhZO7N-I.js +0 -994
  578. package/dist/overlays-DhZO7N-I.js.map +0 -1
  579. package/dist/page-C6R_8jFt.js +0 -325
  580. package/dist/page-C6R_8jFt.js.map +0 -1
  581. package/dist/page-header-hUTzcRZX.js +0 -112
  582. package/dist/page-header-hUTzcRZX.js.map +0 -1
  583. package/dist/popover-Dcv_9jxr.js.map +0 -1
  584. package/dist/rich-text-editor-CF8QYt5p.js +0 -574
  585. package/dist/rich-text-editor-CF8QYt5p.js.map +0 -1
  586. package/dist/rich-text-editor.recipes-CnrbmTS1.js +0 -81
  587. package/dist/rich-text-editor.recipes-CnrbmTS1.js.map +0 -1
  588. package/dist/rich-text-editor.strings-BpnIQgMl.js +0 -25
  589. package/dist/rich-text-editor.strings-BpnIQgMl.js.map +0 -1
  590. package/dist/rich-text-j-FGAeZW.js +0 -32
  591. package/dist/rich-text-j-FGAeZW.js.map +0 -1
  592. package/dist/sanitize-html-BG9FGe-j.js +0 -64
  593. package/dist/sanitize-html-BG9FGe-j.js.map +0 -1
  594. package/dist/scroll-area-DRdr16Pt.js +0 -47
  595. package/dist/scroll-area-DRdr16Pt.js.map +0 -1
  596. package/dist/settings-DHk0L2MF.js +0 -161
  597. package/dist/settings-DHk0L2MF.js.map +0 -1
  598. package/dist/sheet-DRFNY1_D.js +0 -207
  599. package/dist/sheet-DRFNY1_D.js.map +0 -1
  600. package/dist/sidebar-Cb8WzOvE.js.map +0 -1
  601. package/dist/sidebar-Crc9M9JV.js.map +0 -1
  602. package/dist/smart-card-Bek-TwUp.js +0 -599
  603. package/dist/smart-card-Bek-TwUp.js.map +0 -1
  604. package/dist/surface-recipes-DOdoBXGm.js +0 -28
  605. package/dist/surface-recipes-DOdoBXGm.js.map +0 -1
  606. package/dist/table-D6zKeYQX.js.map +0 -1
  607. package/dist/table-Dn4XSrSB.js +0 -1444
  608. package/dist/table-Dn4XSrSB.js.map +0 -1
  609. package/dist/tabs-Dk8E_knt.js.map +0 -1
  610. package/dist/text-inputs-BFpku0Qd.js.map +0 -1
  611. package/dist/timelines-CxuAFIc2.js.map +0 -1
  612. package/dist/tree-BotPlyiD.js.map +0 -1
  613. package/dist/typography-CAr3dQhX.js +0 -116
  614. package/dist/typography-CAr3dQhX.js.map +0 -1
  615. package/dist/ui-provider-D2_TeLqw.js.map +0 -1
  616. package/dist/upload-B0WHW7ak.js.map +0 -1
  617. package/dist/upload-queue-BHZ_wBfd.js.map +0 -1
  618. package/dist/use-file-drop-target-BX7GnhoQ.js +0 -39
  619. package/dist/use-file-drop-target-BX7GnhoQ.js.map +0 -1
  620. package/dist/utils-Cospvlj1.js.map +0 -1
  621. package/dist/value-inputs-CjfzGMsN.js +0 -854
  622. package/dist/value-inputs-CjfzGMsN.js.map +0 -1
  623. package/dist/workspace-YoFjXi6i.js +0 -394
  624. package/dist/workspace-YoFjXi6i.js.map +0 -1
  625. /package/dist/components/{blocks/data-display/metadata → base/metadata-list}/metadata-list.strings.d.ts +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"table-Dn4XSrSB.js","names":["NumberValue","PaginationRoot","_Fragment","_Fragment","Link","NumberValue","DateValue","Link","DateValue","resolveComponentScale","useDensityConfig","cn","DisplayLabel","Text","TextLink","Button","Stack","ActionMenu","ActionButtons","Value","Phone","Name","SecondaryValue","MutedValue","FileSize","Url","MonoValue","Email","EmptyValue","Link$1","formatInitials","Percent","Money","Number$1","Time","RelativeTime","DateTime","parseDateInput","DatePrimitive","Badge","Separator","Input","Checkbox","segmentedControlRecipes","controlGroupHeightClasses","PaginationNext","defaultPaginationStrings","PaginationLink","PaginationEllipsis","PaginationPrevious","PaginationItem","PaginationPrimitive","PaginationContent","TableRow","TableCell","TableBody","TableHead","TableHeader","Table","EmptyState","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","FOCUSABLE_SELECTOR","useFullscreenTableModality","onExitRef","onExit","useEffect","active","opener","previousBodyOverflow","handleKeyDown","region","regionRef","event","focusables","node","first","last","current","inside","guardedRegion","fallbackTitleCase","formatted","value","char","defaultDataTableStrings","currentLabel","columnId","selected","total","index","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","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","MoreHorizontal","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","DataTableBody","tableRows","resolvedEmptyStateMessage","emptyStateMessage","handleRowClick","onRowClick","isRowSelected","rowCells","computedRowClassName","rowIndex","handleRowSelection","zebraClass","striped","rowClasses","cell","cellIndex","flexRender","PackageOpen","emptyStateAction","DataTableHeader","headerGroups","stickyCellClassName","stickyHeader","headerTransparent","getColumnGroup","columnGroups","group","headerClassName","headers","currentGroup","groupSpan","groupCells","groupName","header","headerGroup","cellClasses","enableResizing","headerStyle","resizeHandler","resizeLeaves","leaf","minSize","sum","maxSize","startResize","previous","isResizing","columnLabel","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","sizeClassByDataTableSize","textSizeByDataTableSize","toCssSize","withTextFilter","filterColumn","DataTable","controlledFullscreen","controlledRowSelection","controlledSorting","controlledColumnVisibility","stringsOverride","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","sorting","columnVisibility","rowSelection","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","selectionToolbarContext","data","bulkActionNode","bulkActions","defaultSelectionToolbar","stickyToolbar","selectionToolbarClassName","selectionToolbarNode","selectionToolbar","tableAreaStyle","shouldUseScrollableTableContainer","fillAvailableHeight","Provider","resolvedTextSize","surface","wrapperClassName","topbarContent","topbarEnd","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","Mail","title","titleText","initials","content","contentClassName","titleClassName","badges","subtitle","subtitleClassName","mediaClassName","imageUrl","linkClassName","renderLink","StatusCell","map","entry","StatusClusterCell","visibleItems","items","badgeClassName","DateCell","Calendar","date","showIcon","DateMetaCell","secondaryNode","secondary","CurrencyCell","currency","AvatarCell","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 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'[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\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\n\t\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\t\tconst region = regionRef.current;\n\t\t\tif (!region) return;\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 focusables = Array.from(\n\t\t\t\tregion.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n\t\t\t).filter((node) => node.offsetParent !== null || node === document.activeElement);\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 current = document.activeElement;\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\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\tdocument.addEventListener('keydown', handleKeyDown, true);\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('keydown', handleKeyDown, 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 =\n\t\t\t\tguardedRegion && current instanceof Node && guardedRegion.contains(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: DataTableStrings = {\n\temptyState: {\n\t\tmessage: 'No results found.',\n\t},\n\tactions: {\n\t\ttriggerLabel: 'Actions',\n\t\tsrLabel: 'Row actions menu',\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},\n\taccessibility: {\n\t\tscrollRegion: 'Table scroll area',\n\t\tfullscreenRegion: 'Table, full screen',\n\t},\n} as const;\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: mergeNested(defaultDataTableStrings.actions, overrides.actions),\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\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 ${!hasPrevious ? 'pointer-events-none opacity-40' : ''}`}\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 className=\"size-action-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\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\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 ${!hasNext ? 'pointer-events-none opacity-40' : ''}`}\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 { MoreHorizontal } from 'lucide-react';\nimport { 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\tconst resolvedMenuLabel = 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) using our ActionMenu implementation\n\treturn (\n\t\t<ActionMenu\n\t\t\tactions={actionDefinitions}\n\t\t\tlabel={undefined}\n\t\t\ticon={MoreHorizontal}\n\t\t\tsrText={resolvedMenuLabel || strings.actions.srLabel}\n\t\t\tcloseOnSelect={true}\n\t\t\talign=\"end\"\n\t\t\tdensity=\"table\"\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// Add selected class if the row is selected\n\tif (isSelected) {\n\t\tclassName += 'bg-primary/5 ';\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<div className=\"px-space-sm\">\n\t\t\t<Checkbox\n\t\t\t\tclassName=\"size-icon cursor-pointer disabled:cursor-not-allowed disabled:opacity-40\"\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<div className=\"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\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';\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\tconst handleRowClick = (row: TData) => {\n\t\tif (onRowClick) {\n\t\t\tonRowClick(row);\n\t\t}\n\t};\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\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 handleRowSelection = () => {\n\t\t\t\t\tif (onRowClick) {\n\t\t\t\t\t\thandleRowClick(row.original);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tconst zebraClass = striped && rowIndex % 2 !== 0 ? 'bg-muted/30' : '';\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'hover:bg-muted/35 data-[state=selected]:bg-primary/8',\n\t\t\t\t\tcursorClass,\n\t\t\t\t\t'border-b border-border/50 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\tonClick={handleRowSelection}\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\tcell.column.columnDef.meta?.align === 'end' && 'text-right',\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';\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}: DataTableHeaderProps<TData>) {\n\n\tconst headerGroups = table.getHeaderGroups();\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'h-12 border-r border-border/60 bg-muted/35 px-surface py-row-y-sm text-center text-muted-foreground/75 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'h-12 whitespace-nowrap border-r border-border/60 bg-muted/35 px-surface py-row-y-sm text-center text-muted-foreground/75 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/70',\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: 'bg-muted/45 hover:bg-muted/45',\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'h-12',\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\tconst headerStyle = enableResizing\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 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>\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-inner px-space-sm',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'hover:text-foreground transition-colors',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsortDir && 'text-foreground',\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={`Sort ${columnLabel}`}\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<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? '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-foreground/50 opacity-0 hover:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:after:w-1 focus-visible:after:bg-primary-accent',\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={`Resize ${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';\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=\"w-48\"\n\t\t\tdensity=\"table\"\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/70 hover:text-foreground disabled:pointer-events-none disabled:opacity-30';\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/70 transition-colors duration-150 hover:text-foreground disabled:pointer-events-none disabled:opacity-30';\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')}>\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} from 'react';\nimport { Table } from '../../base/table';\nimport { Button } from '../../base/buttons';\nimport { Input } from '../../base/text-inputs';\nimport { Separator } from '../../base/display/separator';\nimport { Text } from '../../typography';\nimport { useDensityConfig } from '../../../lib/ui-provider';\nimport { resolveComponentScale } from '../../../lib/ui-provider/scale';\nimport { useFullscreenTableModality } from './hooks';\nimport { cn } from '../../../lib/utils';\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// Class applied to the `<table>` element.\n//\n// Body cells get an explicit `[&_td]:text-{size}` so deeply nested\n// elements that use `<Text size=\"inherit\">` (or any plain `<span>`)\n// inherit the right font-size from the cell rather than relying on\n// the table-level inheritance chain (which breaks the moment any\n// descendant has its own text-size class).\n//\n// Header and body cells use `text-sm` consistently. Size changes alter spacing,\n// not typography, so table reading text stays on the default admin body scale.\nconst sizeClassByDataTableSize: Record<NonNullable<DataTableProps<object, unknown>['size']>, string> = {\n\tsm: '[&_th]:h-12 [&_th]:px-row-x [&_th]:py-row-y-lg [&_th]:text-sm [&_td]:px-row-x [&_td]:py-row-y-sm [&_td]:text-sm',\n\tmd: '[&_th]:h-12 [&_th]:px-row-x [&_th]:py-row-y-lg [&_th]:text-sm [&_td]:px-row-x [&_td]:py-row-y [&_td]:text-sm',\n\tlg: '[&_th]:h-12 [&_th]:px-row-x [&_th]:py-row-y-lg [&_th]:text-sm [&_td]:px-row-x [&_td]:py-row-y-lg [&_td]:text-sm',\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\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', 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\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.triggerLabel;\n\t\t},\n\t\t[rowActionsMenuLabel, strings.actions.triggerLabel],\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\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\tconst selectionToolbarContext: DataTableSelectionToolbarContext<TData> = {\n\t\ttable,\n\t\tselectedRows,\n\t\tselectedRowCount,\n\t\ttotalRowCount: data.length,\n\t\trowSelection,\n\t\tclearSelection,\n\t};\n\tconst bulkActionNode =\n\t\ttypeof bulkActions === 'function'\n\t\t\t? bulkActions(selectionToolbarContext)\n\t\t\t: bulkActions;\n\tconst defaultSelectionToolbar = selectedRowCount > 0 ? (\n\t\t<div\n\t\t\tdata-component=\"data-table-selection-toolbar\"\n\t\t\tdata-slot=\"data-table-selection-toolbar\"\n\t\t\tclassName={cn(\n\t\t\t\t\t'data-table-selection-toolbar--component flex min-w-0 flex-col gap-space-md border-b border-border/70 bg-muted/35 px-surface py-row-y @2xl/data-table:flex-row @2xl/data-table:items-center @2xl/data-table:justify-between',\n\t\t\t\tstickyToolbar && 'sticky top-0 z-20 bg-card',\n\t\t\t\tselectionToolbarClassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Text className=\"data-table-selection-toolbar--summary min-w-0\">\n\t\t\t\t{strings.selection.summary(selectedRowCount, data.length)}\n\t\t\t</Text>\n\t\t\t<div\n\t\t\t\tdata-slot=\"data-table-selection-toolbar-actions\"\n\t\t\t\t\tclassName=\"data-table-selection-toolbar--actions flex shrink-0 flex-wrap items-center gap-space-md\"\n\t\t\t>\n\t\t\t\t{bulkActionNode}\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\ttone=\"secondary\"\n\t\t\t\t\tbuttonStyle=\"ghost\"\n\t\t\t\t\tonClick={clearSelection}\n\t\t\t\t>\n\t\t\t\t\t{strings.selection.clear}\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t) : null;\n\tconst selectionToolbarNode = (() => {\n\t\tif (!enableRowSelection || selectedRowCount === 0) return null;\n\t\tif (selectionToolbar === null || selectionToolbar === false) return null;\n\t\tif (typeof selectionToolbar === 'function') {\n\t\t\treturn selectionToolbar(selectionToolbarContext);\n\t\t}\n\t\treturn selectionToolbar ?? defaultSelectionToolbar;\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 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-radius border border-border bg-card shadow-[0_1px_3px_0_color-mix(in_oklch,var(--foreground)_4%,transparent)]',\n\t\t\t\t\tsurface === 'glass' &&\n\t\t\t\t\t\t'rounded-radius 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')}>\n\n\t\t\t\t\t<div className={cn(\n\t 'data-table-topbar grid gap-space-lg px-surface py-row-y @2xl/data-table:grid-cols-[minmax(0,1fr)_auto] @2xl/data-table:items-end',\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\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\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\tsizeClassByDataTableSize[resolvedSize],\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 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\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/>\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/70 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\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 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\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\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\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\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\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\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\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 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\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 { Mail, type LucideIcon } from 'lucide-react';\n\nimport { Badge, type BadgeTone } from '../../../base/badge';\nimport { Stack } from '../../../base/structure';\nimport { formatInitials } from '../../../primitives/initials-format';\nimport { Text, TextLink } from '../../../typography';\nimport { EMPTY } from '../../../../lib/format';\nimport { cn } from '../../../../lib/utils';\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/** Thumbnail source. Falls back to `icon`, then `fallback`, when absent or broken. */\n\timageUrl?: string;\n\t/** Leading glyph. */\n\ticon?: ComponentType<{ className?: string }>;\n\t/** Media shown when neither `imageUrl` nor `icon` resolves — usually initials. */\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/** 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 = Mail,\n\tfallback,\n\thref,\n\trenderLink,\n\temptyLabel = EMPTY,\n\tclassName,\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\ttag=\"span\"\n\t\t\t\t\tsize=\"inherit\"\n\t\t\t\t\tweight=\"medium\"\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 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<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'resource-cell--media relative inline-flex size-avatar shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted text-muted-foreground',\n\t\t\t\t\tmediaClassName,\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{imageUrl ? (\n\t\t\t\t\t<img src={imageUrl} alt={titleText ?? ''} className=\"absolute inset-0 size-full object-cover\" />\n\t\t\t\t) : fallback ? (\n\t\t\t\t\tfallback\n\t\t\t\t) : initials ? (\n\t\t\t\t\t<Text size=\"inherit\" weight=\"semibold\" className=\"text-sm leading-none\">\n\t\t\t\t\t\t{initials}\n\t\t\t\t\t</Text>\n\t\t\t\t) : (\n\t\t\t\t\t<IconComponent className=\"size-icon\" />\n\t\t\t\t)}\n\t\t\t</span>\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-inner focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2';\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 { Badge, type BadgeTone } from '../../../base/badge';\nimport {\n\tDate as DateValue,\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\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<span className=\"relative inline-flex size-avatar-sm shrink-0 items-center justify-center overflow-hidden rounded-full bg-muted text-muted-foreground\">\n\t\t\t\t{imageUrl ? (\n\t\t\t\t\t<img src={imageUrl} alt={name} className=\"absolute inset-0 size-full object-cover\" />\n\t\t\t\t) : name.length > 0 ? (\n\t\t\t\t\t<Text size=\"inherit\" weight=\"semibold\" className=\"text-sm leading-none\">\n\t\t\t\t\t\t{formatInitials(name, { strategy: 'first-words' })}\n\t\t\t\t\t</Text>\n\t\t\t\t) : (\n\t\t\t\t\t<IconComponent className=\"size-icon\" />\n\t\t\t\t)}\n\t\t\t</span>\n\t\t\t<span className=\"min-w-0 inline-flex flex-col\">\n\t\t\t\t<Text 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 +0,0 @@
1
- {"version":3,"file":"tabs-Dk8E_knt.js","names":["Tabs","TabsPrimitive","TabsList","TabsTrigger","TabsContent","Tabs","PrimitiveTabs","PrimitiveTabsList","PrimitiveTabsTrigger","PrimitiveTabsContent","useDensityConfig","cn","Text","Button","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","list","defaultScale","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\"\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-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\",\n {\n variants: {\n variant: {\n default: \"bg-muted\",\n line: \"gap-space-xs bg-transparent\",\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-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-4 outline-none focus-visible:ring-2 focus-visible:ring-ring text-foreground/60 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 \"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\tconst list = (\n\t\t<PrimitiveTabsList\n\t\t\tclassName={cn('tabs-list--component', 'rounded-inner', defaultScale === 'sm' ? 'h-action-sm' : defaultScale === 'lg' ? 'h-action-lg' : 'h-action', 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-inner 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":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"text-inputs-BFpku0Qd.js","names":["Textarea","React","InputGroup","InputGroupAddon","InputGroupText","InputGroupInput","Input","InputGroupTextarea","InputGroupPrimitive","InputGroupAddonPrimitive","InputGroupTextPrimitive","InputGroupInputPrimitive","InputGroupTextareaPrimitive","React","React","useDensityConfig","cn","Text","Button","fieldStateRecipes","fieldAffordanceRecipes","editableTextSizeClasses","resolveFormControlSize","formTextareaSizeClasses","formControlPaddingClasses","formTextareaInsetClasses","formTextareaAffordanceTopClasses","useFormFieldState","clearNativeField","InputTrailingActionContext","Input","Input$1","React$1","defaultTextareaStrings","Textarea$1","sizeProp","controlledValue","providedId","stringsProp","props","textareaRef","useRef","strings","useStrings","size","defaultScale","textareaValue","onChange","hasError","invalid","adjustHeight","useCallback","autoResize","textarea","css","lineHeight","padding","border","minHeight","minRows","maxHeight","maxRows","newHeight","useEffect","previous","observer","signature","handleTextareaChange","newValue","wouldExceedLimit","updateValue","handleClear","loading","onClear","showClearButton","clearable","hasValue","showCount","forwardedRef","node","isReactHookForm","className","characterCount","hasCharacterLimit","maxLength","Loader2Icon","CircleXIcon","Textarea","InputGroup$1","inputGroupAddonVariants","cva","InputGroupAddon$1","align","InputGroupText$1","InputGroupInput$1","InputGroupTextarea$1","InputGroup","addonAlignmentClasses","InputGroupAddon","InputGroupButton","isScalarContent","content","InputGroupText","children","InputGroupInput","InputGroupTextarea","defaultPasswordInputStrings","PasswordInput","internalVisible","setInternalVisible","defaultVisible","isControlled","visible","isVisible","disabledState","disabled","toggleVisibility","nextVisible","onVisibleChange","visibilityAction","revealable","visibilityButtonClassName","event","jsx","EyeOff","Eye","wrapperClassName","inputStrings","slugifyValue","safeSeparator","separator","escapedSeparator","normalized","value","lowercase","trim","SlugField","slug","slugify"],"sources":["../src/components/base/text-inputs/textarea.tsx","../src/components/ui/textarea.tsx","../src/components/ui/input-group.tsx","../src/components/base/text-inputs/input-group.tsx","../src/components/base/text-inputs/password-input.tsx","../src/components/base/text-inputs/slug-field.tsx"],"sourcesContent":["import { fieldStateRecipes } from '../../../lib/field-state-recipes';\nimport { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\nimport { editableTextSizeClasses } from '../../../lib/editable-text-recipe';\nimport { CircleXIcon, Loader2Icon } from 'lucide-react';\nimport * as React from 'react';\nimport { useRef, useCallback, useEffect } from 'react';\nimport { Text } from '../../typography';\nimport { useDensityConfig, type FormControlSize } from '../../../lib/ui-provider';\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\nimport { formTextareaAffordanceTopClasses, formTextareaInsetClasses, formTextareaSizeClasses, resolveFormControlSize } from '../forms/form-sizing';\nimport { useFormFieldState } from './hooks';\nimport { clearNativeField } from './clear-native-field';\n\nexport interface TextareaStrings {\n\t\tclear: string;\n}\n\nexport const defaultTextareaStrings: TextareaStrings = {\n\t\tclear: 'Clear textarea',\n};\n\nexport interface TextareaProps extends Omit<React.ComponentProps<'textarea'>, 'onChange'> {\n\t\t// String overrides (e.g. clear button aria-label)\n\t\t/** Overrides the character-count and clear copy. */\n\t\tstrings?: StringsProp<TextareaStrings>;\n\t\t// Character limit\n\t\t/** Character cap, also used as the denominator of the count. */\n\t\tmaxLength?: number;\n\t\t/** Shows the current and maximum character count. */\n\t\tshowCharacterCount?: boolean;\n\n\t\t// Clear button\n\t\t/** Shows an inline clear action when the field has a value. */\n\t\tclearable?: boolean;\n\t\tonClear?: () => void;\n\n\t\t// Loading state\n\t\t/** Replaces the trailing affordance with a loading indicator. */\n\t\tloading?: boolean;\n\n\t\t// Error state for styling (passed from FormField)\n\t\t/** Applies the invalid styling. Validation copy stays with FormField. */\n\t\tinvalid?: boolean;\n\n\t\t// Visual size\n\t\t/** Control density. Falls back to `UIProvider.density.defaultScale`. */\n\t\tsize?: FormControlSize;\n\n\t\t// Auto-resize functionality\n\t\t/** Grows the field with its content, between `minRows` and `maxRows`. */\n\t\tautoResize?: boolean;\n\t\t/** Smallest height, in rows, when `autoResize` is set. */\n\t\tminRows?: number;\n\t\t/** Height at which the field stops growing and starts scrolling. */\n\t\tmaxRows?: number;\n\n\t\t// Value props\n\t\tonChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n\t\t/** Current text. Controlled. */\n\t\tvalue?: string;\n\t\t/** Initial text for uncontrolled use. */\n\t\tdefaultValue?: string;\n}\n\nconst TextareaImpl = (\n\t\t{\n\t\t\t\tclassName,\n\t\t\t\tmaxLength,\n\t\t\t\tshowCharacterCount,\n\t\t\t\tclearable,\n\t\t\t\tonClear,\n\t\t\t\tloading = false,\n\t\t\t\tinvalid,\n\t\t\t\tsize: sizeProp,\n\t\t\t\tautoResize = false,\n\t\t\t\tminRows = 2,\n\t\t\t\tmaxRows,\n\t\t\t\tonChange,\n\t\t\t\tvalue: controlledValue,\n\t\t\t\tdefaultValue,\n\t\t\t\tid: providedId,\n\t\t\t\tstrings: stringsProp,\n\t\t\t\t...props\n\t\t}: TextareaProps,\n\t\tforwardedRef: React.ForwardedRef<HTMLTextAreaElement>,\n) => {\n\t\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\n\t\tconst strings = useStrings(defaultTextareaStrings, stringsProp);\n\t\tconst { defaultScale } = useDensityConfig();\n\t\tconst size = resolveFormControlSize(sizeProp, defaultScale);\n\n\t\t// Use shared form field state hook\n\t\tconst {\n\t\t\t\tid,\n\t\t\t\tvalue: textareaValue,\n\t\t\t\tisReactHookForm,\n\t\t\t\tcharacterCount,\n\t\t\t\thasCharacterLimit,\n\t\t\t\tshowCount,\n\t\t\t\thasValue,\n\t\t\t\tupdateValue,\n\t\t\t\twouldExceedLimit,\n\t\t} = useFormFieldState({\n\t\t\t\tcontrolledValue,\n\t\t\t\tdefaultValue,\n\t\t\t\tmaxLength,\n\t\t\t\tshowCharacterCount,\n\t\t\t\tprovidedId,\n\t\t\t\tidPrefix: 'textarea',\n\t\t\t\thasOnChange: onChange !== undefined,\n\t\t});\n\n\t\t// Derive display states\n\t\tconst hasError = Boolean(invalid);\n\n\t\tconst adjustHeight = useCallback(() => {\n\t\t\t\tif (!autoResize || !textareaRef.current) return;\n\n\t\t\t\tconst textarea = textareaRef.current;\n\n\t\t\t\tconst css = getComputedStyle(textarea);\n\t\t\t\tconst lineHeight = Number.parseFloat(css.lineHeight) || 20;\n\t\t\t\tconst padding = (Number.parseFloat(css.paddingTop) || 0) + (Number.parseFloat(css.paddingBottom) || 0);\n\t\t\t\tconst border = css.boxSizing === 'border-box' ? (Number.parseFloat(css.borderTopWidth) || 0) + (Number.parseFloat(css.borderBottomWidth) || 0) : 0;\n\t\t\t\ttextarea.style.height = 'auto';\n\t\t\t\tconst minHeight = lineHeight * minRows + padding + border;\n\t\t\t\tconst maxHeight = maxRows ? lineHeight * maxRows + padding + border : Infinity;\n\n\t\t\t\tconst newHeight = Math.min(Math.max(textarea.scrollHeight + border, minHeight), maxHeight);\n\t\t\t\ttextarea.style.height = `${newHeight}px`;\n\t\t}, [autoResize, maxRows, minRows]);\n\n\t\tuseEffect(() => {\n\t\t\t\tadjustHeight();\n\t\t}, [textareaValue, props.placeholder, autoResize, adjustHeight]);\n\n\t\tuseEffect(() => {\n\t\t\t\tconst textarea = textareaRef.current;\n\t\t\t\tif (!autoResize || !textarea || typeof ResizeObserver === 'undefined') return;\n\t\t\t\tlet previous = '';\n\t\t\t\tconst observer = new ResizeObserver(() => {\n\t\t\t\t\t\tconst css = getComputedStyle(textarea);\n\t\t\t\t\t\tconst signature = `${textarea.clientWidth}:${css.fontSize}:${css.lineHeight}`;\n\t\t\t\t\t\tif (signature === previous) return;\n\t\t\t\t\t\tprevious = signature;\n\t\t\t\t\t\tadjustHeight();\n\t\t\t\t});\n\t\t\t\tobserver.observe(textarea);\n\t\t\t\treturn () => observer.disconnect();\n\t\t}, [autoResize, adjustHeight]);\n\n\t\tconst handleTextareaChange = useCallback(\n\t\t\t\t(e: React.ChangeEvent<HTMLTextAreaElement>) => {\n\t\t\t\t\t\tconst newValue = e.target.value;\n\n\t\t\t\t\t\t// Check character limit\n\t\t\t\t\t\tif (wouldExceedLimit(newValue)) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update internal state if uncontrolled\n\t\t\t\t\t\tupdateValue(newValue);\n\n\t\t\t\t\t\t// Call external onChange\n\t\t\t\t\t\tonChange?.(e);\n\n\t\t\t\t\t\t// Auto-resize if enabled\n\t\t\t\t\t\tif (autoResize) {\n\t\t\t\t\t\t\t\tsetTimeout(adjustHeight, 0);\n\t\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[onChange, updateValue, wouldExceedLimit, autoResize, adjustHeight]\n\t\t);\n\n\t\tconst handleClear = useCallback(() => {\n\t\t\t\tif (props.disabled || props.readOnly || loading) return;\n\n\t\t\t\tif (textareaRef.current) clearNativeField(textareaRef.current);\n\n\t\t\t\t// Execute optional onClear callback\n\t\t\t\tonClear?.();\n\n\t\t\t\t// Focus the textarea after clearing\n\t\t\t\ttextareaRef.current?.focus();\n\n\t\t}, [props.disabled, props.readOnly, loading, onClear]);\n\n\t\t// Determine what to show in the end position\n\t\tconst showClearButton = clearable && hasValue && !loading && !showCount;\n\n\t\treturn (\n\t\t\t\t<div className={cn('textarea--component', 'relative w-full')}>\n\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\t\tif (typeof forwardedRef === 'function') {\n\t\t\t\t\t\t\t\t\t\t\t\tforwardedRef(node);\n\t\t\t\t\t\t\t\t\t\t} else if (forwardedRef) {\n\t\t\t\t\t\t\t\t\t\t\t\tforwardedRef.current = node;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\ttextareaRef.current = node;\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tid={id}\n\t\t\t\t\t\t\t\t{...(!isReactHookForm && { value: textareaValue })}\n\t\t\t\t\t\t\t\tonChange={handleTextareaChange}\n\t\t\t\t\t\t\t\tmaxLength={maxLength}\n\t\t\t\t\t\t\t\taria-invalid={hasError || undefined}\n\t\t\t\t\t\t\t\trows={minRows}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\tresize: autoResize ? 'none' : props.style?.resize,\n\t\t\t\t\t\t\t\t\t\toverflow: autoResize && maxRows ? 'auto' : 'visible',\n\t\t\t\t\t\t\t\t\t\t...props.style,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t// Base styles\n\t\t\t\t\t\t\t\t\t\t'placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground',\n\t\t\t\t\t\t\t\t\t\t'border-input box-border flex w-full rounded-inner border bg-transparent px-control',\n\t\t\t\t\t\t\t\t\t\t// First line where a single-line control of this size draws its value.\n\t\t\t\t\t\t\t\t\t\tformTextareaInsetClasses[size],\n\t\t\t\t\t\t\t\t\t\t'transition-[color,box-shadow] outline-none',\n\t\t\t\t\t\t\t\t\t\t'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50',\n\t\t\t\t\t\t\t\t\t\t// Same read-only fill as Input; disabled stays on the transparent fill.\n\t\t\t\t\t\t\t\t\t\t'[&:read-only:not(:disabled)]:bg-muted',\n\t\t\t\t\t\t\t\t\t\tformTextareaSizeClasses[size],\n\t\t\t\t\t\t\t\t\t\teditableTextSizeClasses[size],\n\t\t\t\t\t\t\t\t\t\t// Focus styles\n\t\t\t\t\t\t\t\t\t\tfieldStateRecipes.focus,\n\t\t\t\t\t\t\t\t\t\t// Invalid/error styles\n\t\t\t\t\t\t\t\t\t\tfieldStateRecipes.invalid,\n\t\t\t\t\t\t\t\t\t\t// Dynamic padding for overlays\n\t\t\t\t\t\t\t\t\t\tshowClearButton && fieldAffordanceRecipes.clearPadding[size],\n\t\t\t\t\t\t\t\t\t\tshowCount && fieldAffordanceRecipes.textareaCountPadding,\n\t\t\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\tdisabled={props.disabled || loading}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{/* Character Count */}\n\t\t\t\t\t\t{!!showCount && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'pointer-events-none absolute bottom-control-y-offset end-[calc(var(--control-x)*var(--space-scale))] text-xs tabular-nums',\n\t\t\t\t\t\t\t\t\t\t\t\tprops.disabled && 'opacity-50',\n\t\t\t\t\t\t\t\t\t\t\t\thasError ? 'text-destructive' : 'text-muted-foreground'\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\taria-live=\"polite\"\n\t\t\t\t\t\t\t\t\t\trole=\"status\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Text tag=\"span\" size=\"xs\" type={hasError ? 'error' : 'secondary'}>\n\t\t\t\t\t\t\t\t\t\t\t\t{characterCount}\n\t\t\t\t\t\t\t\t\t\t\t\t{hasCharacterLimit ? `/${maxLength}` : ''}\n\t\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Loading Spinner */}\n\t\t\t\t\t\t{!!loading && !showCount && (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t'pointer-events-none absolute end-[calc(var(--control-x)*var(--space-scale))]',\n\t\t\t\t\t\t\t\t\t\t\t\tformTextareaAffordanceTopClasses.icon[size],\n\t\t\t\t\t\t\t\t\t\t\t\thasError ? 'text-destructive' : 'text-muted-foreground'\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Loader2Icon className=\"size-icon animate-spin\" aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{/* Clear Button */}\n\t\t\t\t\t\t{!!showClearButton && !showCount && (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tclassName={cn(fieldAffordanceRecipes.target,fieldAffordanceRecipes.focus,fieldAffordanceRecipes.clear,'absolute',formTextareaAffordanceTopClasses.target[size],fieldAffordanceRecipes.clearEnd[size])}\n\t\t\t\t\t\t\t\t\t\taria-label={strings.clear}\n\t\t\t\t\t\t\t\t\t\tonClick={handleClear}\n\t\t\t\t\t\t\t\t\t\tdisabled={props.disabled || props.readOnly || loading}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<CircleXIcon className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t);\n};\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(TextareaImpl);\nTextarea.displayName = 'Textarea';\n\nexport { Textarea };\n","import { fieldStateRecipes } from '../../lib/field-state-recipes';\nimport { editableTextSizeClasses } from '../../lib/editable-text-recipe';\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\n \"border-input rounded-inner border bg-transparent px-control py-space-md shadow-none transition-[color,box-shadow] placeholder:text-muted-foreground flex field-sizing-content min-h-textarea w-full outline-none disabled:cursor-not-allowed disabled:opacity-50 [&:read-only:not(:disabled)]:bg-muted\",\n editableTextSizeClasses.md,\n fieldStateRecipes.focus,\n fieldStateRecipes.invalid,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","import { fieldStateRecipes } from '../../lib/field-state-recipes';\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport * as React from \"react\"\n\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\nimport { cn } from \"../../lib/utils\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"border-input h-control rounded-inner border shadow-none transition-[color,box-shadow] has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-space-lg has-[>[data-align=block-start]]:[&>input]:pb-space-lg has-[>[data-align=inline-end]]:[&>input]:pe-space-sm has-[>[data-align=inline-start]]:[&>input]:ps-space-sm [[data-slot=combobox-content]_&]:focus-within:border-inherit [[data-slot=combobox-content]_&]:focus-within:ring-0 group/input-group relative flex w-full min-w-0 items-center outline-none has-[>textarea]:h-auto\",\n fieldStateRecipes.groupFocus,\n fieldStateRecipes.groupInvalid,\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground h-auto gap-space-md py-space-sm text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-inner [&>svg:not([class*='size-'])]:size-icon flex cursor-text items-center justify-center select-none\",\n {\n variants: {\n align: {\n \"inline-start\": \"ps-control has-[>button]:-ms-space-xs has-[>kbd]:-ms-space-2xs order-first\",\n \"inline-end\": \"pe-control has-[>button]:-me-space-xs has-[>kbd]:-me-space-2xs order-last\",\n \"block-start\":\n \"px-control pt-space-md group-has-[>input]/input-group:pt-space-md [.border-b]:pb-space-md order-first w-full justify-start\",\n \"block-end\":\n \"px-control pb-space-md group-has-[>input]/input-group:pb-space-md [.border-t]:pt-space-md order-last w-full justify-start\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"gap-space-md text-sm shadow-none flex items-center\",\n {\n variants: {\n size: {\n xs: \"h-action-xs gap-space-xs rounded-inner px-control-xs [&>svg:not([class*='size-'])]:size-icon-sm\",\n sm: \"\",\n \"icon-xs\": \"size-action-xs rounded-inner p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-action-sm p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\" | \"type\"> &\n VariantProps<typeof inputGroupButtonVariants> & {\n type?: \"button\" | \"submit\" | \"reset\"\n }) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"text-muted-foreground gap-space-md text-sm [&_svg:not([class*='size-'])]:size-icon flex items-center [&_svg]:pointer-events-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\"rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 flex-1\", className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\"rounded-none border-0 bg-transparent py-space-md shadow-none ring-0 focus-visible:ring-0 aria-invalid:ring-0 flex-1 resize-none\", className)}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","/**\n * InputGroup — base wrapper around the shadcn `ui/input-group` primitive.\n *\n * What this layer adds on top of the primitive:\n * - Stable BEM hooks on every wrapped part's outermost node\n * (`input-group--component`, `input-group-addon--component`, and so on).\n * - Design-system typography for the scalar copy inside `InputGroupText`,\n * while arbitrary `ReactNode` content (icons, `kbd`, buttons) passes through\n * untouched so the compound pattern stays composable.\n * - Keeps the primitive's addon alignment and button-size variants, its\n * focus-within/aria-invalid ring behaviour, and every native prop by spread.\n *\n * Compose it as\n * `<InputGroup><InputGroupAddon><Icon/></InputGroupAddon><InputGroupInput/></InputGroup>`.\n *\n * Reach for it when one control needs inline affordances welded to its frame —\n * a search icon, a unit suffix, a busy indicator, an inline action. For the\n * label / control / hint / error row, use `FormField` instead; this wrapper\n * owns only the control frame.\n */\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport {\n\tInputGroup as InputGroupPrimitive,\n\tInputGroupAddon as InputGroupAddonPrimitive,\n\tInputGroupInput as InputGroupInputPrimitive,\n\tInputGroupText as InputGroupTextPrimitive,\n\tInputGroupTextarea as InputGroupTextareaPrimitive,\n} from '../../ui/input-group';\nimport { Button, type ButtonProps } from '../buttons';\nimport { Text } from '../../typography';\nimport type { ComponentScale } from '../../../lib/ui-provider';\nimport { cn } from '../../../lib/utils';\nimport { formControlPaddingClasses } from '../forms/form-sizing';\n\nexport type InputGroupProps = ComponentProps<typeof InputGroupPrimitive>;\nexport type InputGroupAddonProps = ComponentProps<typeof InputGroupAddonPrimitive>;\nexport interface InputGroupButtonProps extends Omit<ButtonProps, 'size'> {\n\t/** Component scale. Falls back to `UIProvider.density.defaultScale`. */\n\tsize?: ComponentScale;\n}\nexport type InputGroupInputProps = ComponentProps<typeof InputGroupInputPrimitive>;\nexport type InputGroupTextProps = ComponentProps<typeof InputGroupTextPrimitive>;\nexport type InputGroupTextareaProps = ComponentProps<typeof InputGroupTextareaPrimitive>;\n\n/** Control frame that welds inline addons onto a single input or textarea. */\nfunction InputGroup({ className, ...props }: InputGroupProps) {\n\treturn (\n\t\t<InputGroupPrimitive\n\t\t\tclassName={cn(\n\t\t\t\t'input-group--component box-border h-control rounded-inner font-sans text-foreground shadow-none',\n\t\t\t\t'has-[>[data-align=block-end]]:[&>input]:pt-space-lg has-[>[data-align=block-start]]:[&>input]:pb-space-lg',\n\t\t\t\t'has-[>[data-align=inline-end]]:[&>input]:pe-space-sm has-[>[data-align=inline-start]]:[&>input]:ps-space-sm',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nconst addonAlignmentClasses = {\n\t'inline-start': 'h-full ps-control py-0',\n\t'inline-end': 'h-full pe-control py-0',\n\t'block-start': 'px-control pt-space-md group-has-[>input]/input-group:pt-space-md [.border-b]:pb-space-md',\n\t'block-end': 'px-control pb-space-md group-has-[>input]/input-group:pb-space-md [.border-t]:pt-space-md',\n} as const;\n\n/** Leading/trailing (or block start/end) affordance slot inside the frame. */\nfunction InputGroupAddon({ className, align = 'inline-start', ...props }: InputGroupAddonProps) {\n\treturn (\n\t\t<InputGroupAddonPrimitive\n\t\t\talign={align}\n\t\t\tclassName={cn(\n\t\t\t\t'input-group-addon--component box-border gap-space-md py-space-sm [&>svg:not([class*=\\'size-\\'])]:size-icon',\n\t\t\t\taddonAlignmentClasses[align ?? 'inline-start'],\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/** Inline action button sized to sit inside the control frame; its label stays on one line. */\nfunction InputGroupButton({\n\tclassName,\n\ttone = 'secondary',\n\tbuttonStyle = 'ghost',\n\ttruncate = true,\n\t...props\n}: InputGroupButtonProps) {\n\treturn (\n\t\t<Button\n\t\t\ttone={tone}\n\t\t\tbuttonStyle={buttonStyle}\n\t\t\ttruncate={truncate}\n\t\t\tclassName={cn('input-group-button--component max-h-full shadow-none', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction isScalarContent(content: ReactNode): content is string | number | bigint {\n\treturn typeof content === 'string' || typeof content === 'number' || typeof content === 'bigint';\n}\n\n/** Static copy segment — scalar text renders through Typography. */\nfunction InputGroupText({ children, className, ...props }: InputGroupTextProps) {\n\treturn (\n\t\t<InputGroupTextPrimitive\n\t\t\tclassName={cn('input-group-text--component gap-space-md [&_svg:not([class*=\\'size-\\'])]:size-icon', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{isScalarContent(children) ? (\n\t\t\t\t<Text tag=\"span\" size=\"inherit\" lineHeight=\"tight\" className=\"text-inherit\">\n\t\t\t\t\t{children}\n\t\t\t\t</Text>\n\t\t\t) : (\n\t\t\t\tchildren\n\t\t\t)}\n\t\t</InputGroupTextPrimitive>\n\t);\n}\n\n/** Single-line control that inherits the group's frame instead of its own. */\nfunction InputGroupInput({ className, ...props }: InputGroupInputProps) {\n\treturn (\n\t\t<InputGroupInputPrimitive\n\t\t\tclassName={cn(\n\t\t\t\t// Fixed-height inline frames clamp the input to their content box.\n\t\t\t\t// Auto-height block compositions retain the shared control height.\n\t\t\t\t'input-group-input--component box-border h-control max-h-full min-h-0 font-sans text-foreground',\n\t\t\t\tformControlPaddingClasses.md,\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\n/** Multi-line control that inherits the group's frame instead of its own. */\nfunction InputGroupTextarea({ className, ...props }: InputGroupTextareaProps) {\n\treturn (\n\t\t<InputGroupTextareaPrimitive\n\t\t\tclassName={cn('input-group-textarea--component box-border min-h-textarea px-control py-space-md font-sans text-foreground', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tInputGroup,\n\tInputGroupAddon,\n\tInputGroupButton,\n\tInputGroupInput,\n\tInputGroupText,\n\tInputGroupTextarea,\n};\n","import { Eye, EyeOff } from 'lucide-react';\nimport * as React from 'react';\n\nimport { useStrings, type StringsProp } from '../../../lib/strings';\nimport { cn } from '../../../lib/utils';\n\nimport { Input, type InputProps } from './input';\nimport { InputTrailingActionContext } from './input-trailing-action';\nimport { fieldAffordanceRecipes } from '../../../lib/field-affordance-recipes';\n\nexport interface PasswordInputStrings {\n\tshowPassword: string;\n\thidePassword: string;\n}\n\nexport const defaultPasswordInputStrings: PasswordInputStrings = {\n\tshowPassword: 'Show password',\n\thidePassword: 'Hide password',\n};\n\nexport interface PasswordInputProps extends Omit<InputProps, 'type' | 'endIcon' | 'strings'> {\n\t/** Whether the value is revealed. Controlled. */\n\tvisible?: boolean;\n\t/** Whether the value starts revealed, for uncontrolled use. */\n\tdefaultVisible?: boolean;\n\t/** Fired whenever the reveal state changes. */\n\tonVisibleChange?: (visible: boolean) => void;\n\t/** Shows the reveal toggle. Turn it off for fields that must stay masked. */\n\trevealable?: boolean;\n\t/** Merged onto the field wrapper, outside the input frame. */\n\twrapperClassName?: string;\n\t/** Merged onto the reveal toggle. */\n\tvisibilityButtonClassName?: string;\n\t/** Copy overrides forwarded to the underlying text input. */\n\tinputStrings?: InputProps['strings'];\n\t/** Overrides the show/hide accessible names. */\n\tstrings?: StringsProp<PasswordInputStrings>;\n}\n\nconst PasswordInput = React.forwardRef<HTMLInputElement, PasswordInputProps>(\n\tfunction PasswordInput(\n\t\t{\n\t\t\tvisible,\n\t\t\tdefaultVisible = false,\n\t\t\tonVisibleChange,\n\t\t\trevealable = true,\n\t\t\twrapperClassName,\n\t\t\tvisibilityButtonClassName,\n\t\t\tclassName,\n\t\t\tdisabled,\n\t\t\tloading,\n\t\t\tinputStrings,\n\t\t\tstrings: stringsProp,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst strings = useStrings(defaultPasswordInputStrings, stringsProp);\n\t\tconst [internalVisible, setInternalVisible] = React.useState(defaultVisible);\n\t\tconst isControlled = visible !== undefined;\n\t\tconst isVisible = isControlled ? visible : internalVisible;\n\t\tconst disabledState = disabled || loading;\n\n\t\tconst toggleVisibility = React.useCallback(() => {\n\t\t\tconst nextVisible = !isVisible;\n\t\t\tif (!isControlled) {\n\t\t\t\tsetInternalVisible(nextVisible);\n\t\t\t}\n\t\t\tonVisibleChange?.(nextVisible);\n\t\t}, [isControlled, isVisible, onVisibleChange]);\n\n\t\tconst visibilityAction = revealable ? (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={cn('password-input--toggle', fieldAffordanceRecipes.target, fieldAffordanceRecipes.focus, fieldAffordanceRecipes.toggle, visibilityButtonClassName)}\n\t\t\t\taria-label={isVisible ? strings.hidePassword : strings.showPassword}\n\t\t\t\taria-pressed={isVisible}\n\t\t\t\tdisabled={disabledState}\n\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\tonClick={toggleVisibility}\n\t\t\t>\n\t\t\t\t{isVisible ? <EyeOff className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" /> : <Eye className={fieldAffordanceRecipes.icon} aria-hidden=\"true\" />}\n\t\t\t</button>\n\t\t) : null;\n\n\t\treturn (\n\t\t\t<div className={cn('password-input--component', 'relative', wrapperClassName)}>\n\t\t\t\t<InputTrailingActionContext.Provider value={visibilityAction}>\n\t\t\t\t\t<Input\n\t\t\t\t\t\t{...props}\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\ttype={isVisible ? 'text' : 'password'}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tloading={loading}\n\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\tstrings={inputStrings}\n\t\t\t\t\t/>\n\t\t\t\t</InputTrailingActionContext.Provider>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nPasswordInput.displayName = 'PasswordInput';\n\nexport { PasswordInput };\n","import * as React from 'react';\n\nimport { cn } from '../../../lib/utils';\n\nimport { Input, type InputProps } from './input';\n\nexport interface SlugifyValueOptions {\n\t/** Character joining words in the generated slug. Default: `-`. */\n\tseparator?: string;\n\t/** Lowercases the generated slug. */\n\tlowercase?: boolean;\n\t/** Strips leading and trailing separators. */\n\ttrim?: boolean;\n}\n\nexport function slugifyValue(\n\tvalue: string | number | null | undefined,\n\t{\n\t\tseparator = '-',\n\t\tlowercase = true,\n\t\ttrim = true,\n\t}: SlugifyValueOptions = {},\n) {\n\tconst safeSeparator = separator || '-';\n\tconst escapedSeparator = safeSeparator.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\tlet normalized = String(value ?? '')\n\t\t.normalize('NFKD')\n\t\t.replace(/[\\u0300-\\u036f]/g, '')\n\t\t.replace(/&/g, ' and ')\n\t\t.replace(/['’]/g, '');\n\n\tif (lowercase) {\n\t\tnormalized = normalized.toLowerCase();\n\t}\n\n\tnormalized = normalized\n\t\t.replace(/[^\\p{Letter}\\p{Number}]+/gu, safeSeparator)\n\t\t.replace(new RegExp(`${escapedSeparator}{2,}`, 'g'), safeSeparator);\n\n\tif (trim) {\n\t\tnormalized = normalized.replace(new RegExp(`^${escapedSeparator}|${escapedSeparator}$`, 'g'), '');\n\t}\n\n\treturn normalized;\n}\n\nexport interface SlugFieldProps\n\textends Omit<\n\t\tInputProps,\n\t\t'value' | 'defaultValue' | 'onChange' | 'readOnly' | 'type'\n\t>,\n\t\tSlugifyValueOptions {\n\t/** Current slug. Controlled. */\n\tvalue: string | number | null | undefined;\n\t/** Replaces the built-in slug derivation entirely. */\n\tslugify?: (value: string | number | null | undefined) => string;\n\t/** Merged onto the field wrapper, outside the input frame. */\n\twrapperClassName?: string;\n}\n\nconst SlugField = React.forwardRef<HTMLInputElement, SlugFieldProps>(\n\tfunction SlugField(\n\t\t{\n\t\t\tvalue,\n\t\t\tslugify,\n\t\t\tseparator = '-',\n\t\t\tlowercase = true,\n\t\t\ttrim = true,\n\t\t\twrapperClassName,\n\t\t\tclassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) {\n\t\tconst slug = React.useMemo(\n\t\t\t() => slugify?.(value) ?? slugifyValue(value, { separator, lowercase, trim }),\n\t\t\t[lowercase, separator, slugify, trim, value],\n\t\t);\n\n\t\treturn (\n\t\t\t<div className={cn('slug-field--component', wrapperClassName)}>\n\t\t\t\t<Input\n\t\t\t\t\tref={ref}\n\t\t\t\t\t{...props}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tvalue={slug}\n\t\t\t\t\treadOnly\n\t\t\t\t\tclassName={className}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nSlugField.displayName = 'SlugField';\n\nexport { SlugField };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,IAAaiC,IAA0C,EACrD,OAAO,iBACT,GAyQMjC,IAAWC,EAAM,YA3NrB,EACE,cACA,cACA,uBACA,cACA,YACA,aAAU,IACV,YACA,MAAMkC,GACN,gBAAa,IACb,aAAU,GACV,YACA,aACA,OAAOC,GACP,iBACA,IAAIC,GACJ,SAASC,GACT,GAAGC,KAEL,MACG;CACH,IAAMC,IAAcC,EAA4B,IAAI,GAC9CC,IAAUC,EAAWV,GAAwBK,CAAW,GACxD,EAAE,oBAAiBvB,EAAiB,GACpC6B,IAAOtB,EAAuBa,GAAUU,CAAY,GAGpD,EACJ,OACA,OAAOC,GACP,oBACA,mBACA,sBACA,cACA,aACA,gBACA,wBACEnB,EAAkB;EACpB;EACA;EACA;EACA;EACA;EACA,UAAU;EACV,aAAaoB,MAAa,KAAA;CAC5B,CAAC,GAGKC,IAAW,EAAQC,GAEnBC,IAAeC,QAAkB;EACrC,IAAI,CAACC,KAAc,CAACZ,EAAY,SAAS;EAEzC,IAAMa,IAAWb,EAAY,SAEvBc,IAAM,iBAAiBD,CAAQ,GAC/BE,IAAa,OAAO,WAAWD,EAAI,UAAU,KAAK,IAClDE,KAAW,OAAO,WAAWF,EAAI,UAAU,KAAK,MAAM,OAAO,WAAWA,EAAI,aAAa,KAAK,IAC9FG,IAASH,EAAI,cAAc,gBAAgB,OAAO,WAAWA,EAAI,cAAc,KAAK,MAAM,OAAO,WAAWA,EAAI,iBAAiB,KAAK,KAAK;EACjJ,EAAS,MAAM,SAAS;EACxB,IAAMI,IAAYH,IAAaI,IAAUH,IAAUC,GAC7CG,IAAYC,IAAUN,IAAaM,IAAUL,IAAUC,IAAS,UAEhEK,IAAY,KAAK,IAAI,KAAK,IAAIT,EAAS,eAAeI,GAAQC,CAAS,GAAGE,CAAS;EACzF,EAAS,MAAM,SAAS,GAAGE,EAAU;CACvC,GAAG;EAACV;EAAYS;EAASF;CAAO,CAAC;CAMjC,AAJAI,QAAgB;EACd,EAAa;CACf,GAAG;EAACjB;EAAeP,EAAM;EAAaa;EAAYF;CAAY,CAAC,GAE/Da,QAAgB;EACd,IAAMV,IAAWb,EAAY;EAC7B,IAAI,CAACY,KAAc,CAACC,KAAY,OAAO,iBAAmB,KAAa;EACvE,IAAIW,IAAW,IACTC,IAAW,IAAI,qBAAqB;GACxC,IAAMX,IAAM,iBAAiBD,CAAQ,GAC/Ba,IAAY,GAAGb,EAAS,YAAY,GAAGC,EAAI,SAAS,GAAGA,EAAI;GACjE,AAAIY,MAAcF,MAClB,IAAWE,GACXhB,EAAa;EACf,CAAC;EAED,OADAe,EAAS,QAAQZ,CAAQ,SACZY,EAAS,WAAW;CACnC,GAAG,CAACb,GAAYF,CAAY,CAAC;CAE7B,IAAMiB,KAAuBhB,GAC1B,MAA8C;EAC7C,IAAMiB,IAAW,EAAE,OAAO;EAG1B,AAAIC,EAAiBD,CAAQ,MAK7BE,EAAYF,CAAQ,GAGpBrB,IAAW,CAAC,GAGRK,KACF,WAAWF,GAAc,CAAC;CAE9B,GACA;EAACH;EAAUuB;EAAaD;EAAkBjB;EAAYF;CAAY,CACpE,GAEMqB,KAAcpB,QAAkB;EACpC,AAAIZ,EAAM,YAAYA,EAAM,YAAYiC,MAEpChC,EAAY,WAASZ,EAAiBY,EAAY,OAAO,GAG7DiC,IAAU,GAGVjC,EAAY,SAAS,MAAM;CAE7B,GAAG;EAACD,EAAM;EAAUA,EAAM;EAAUiC;EAASC;CAAO,CAAC,GAG/CC,KAAkBC,KAAaC,KAAY,CAACJ,KAAW,CAACK;CAE9D,OACE,kBAAC,OAAD;EAAK,WAAW7D,EAAG,uBAAuB,iBAAiB;EAA3D,UAAA;GACE,kBAAC,YAAD;IACE,MAAM,MAAS;KAMb,AALI,OAAO8D,KAAiB,aAC1BA,EAAaC,CAAI,IACRD,MACT,EAAa,UAAUC,IAEzB,EAAY,UAAUA;IACxB;IACI;IACJ,GAAK,CAACC,KAAmB,EAAE,OAAOlC,EAAc;IAChD,UAAUqB;IACC;IACX,gBAAcnB,KAAY,KAAA;IAC1B,MAAMW;IACN,OAAO;KACL,QAAQP,IAAa,SAASb,EAAM,OAAO;KAC3C,UAAUa,KAAcS,IAAU,SAAS;KAC3C,GAAGtB,EAAM;IACX;IACA,WAAWvB,EAET,4FACA,sFAEAS,EAAyBmB,IACzB,8CACA,gFAEA,yCACArB,EAAwBqB,IACxBvB,EAAwBuB,IAExBzB,EAAkB,OAElBA,EAAkB,SAElBuD,MAAmBtD,EAAuB,aAAawB,IACvDiC,KAAazD,EAAuB,sBACpC6D,CACF;IACA,GAAI1C;IACJ,UAAUA,EAAM,YAAYiC;GAC7B,CAAA;GAGA,CAAC,CAACK,KACD,kBAAC,OAAD;IACE,WAAW7D,EACT,6HACAuB,EAAM,YAAY,cAClBS,IAAW,qBAAqB,uBAClC;IACA,aAAU;IACV,MAAK;IAEL,UAAA,kBAAC/B,GAAD;KAAM,KAAI;KAAO,MAAK;KAAK,MAAM+B,IAAW,UAAU;KAAtD,UAAA,CACGkC,GACAC,IAAoB,IAAIC,MAAc,EACnC;;GACH,CAAA;GAIN,CAAC,CAACZ,KAAW,CAACK,KACb,kBAAC,OAAD;IACE,WAAW7D,EACT,gFACAU,EAAiC,KAAKkB,IACtCI,IAAW,qBAAqB,uBAClC;IAEA,UAAA,kBAACqC,GAAD;KAAa,WAAU;KAAyB,eAAY;IAAQ,CAAA;GACjE,CAAA;GAIN,CAAC,CAACX,MAAmB,CAACG,KACrB,kBAAC,UAAD;IACE,MAAK;IACL,WAAW7D,EAAGI,EAAuB,QAAOA,EAAuB,OAAMA,EAAuB,OAAM,YAAWM,EAAiC,OAAOkB,IAAMxB,EAAuB,SAASwB,EAAK;IACpM,cAAYF,EAAQ;IACpB,SAAS6B;IACT,UAAUhC,EAAM,YAAYA,EAAM,YAAYiC;IAE9C,UAAA,kBAACc,GAAD;KAAa,WAAWlE,EAAuB;KAAM,eAAY;IAAQ,CAAA;GACnE,CAAA;EAEP;;AAET,CAEkF;AAClF,EAAS,cAAc;;;ACxRvB,SAASmE,EAAS,EAAE,cAAW,GAAGhD,KAA2C;CAC3E,OACE,kBAAC,YAAD;EACE,aAAU;EACV,WAAWvB,EACT,0SACAK,EAAwB,IACxBF,EAAkB,OAClBA,EAAkB,SAClB8D,CACF;EACA,GAAI1C;CACL,CAAA;AAEL;;;ACXA,SAASrC,EAAW,EAAE,cAAW,GAAGqC,KAAsC;CACxE,OACE,kBAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,WAAWvB,EACT,6pBACAG,EAAkB,YAClBA,EAAkB,cAClB8D,CACF;EACA,GAAI1C;CACL,CAAA;AAEL;AAEA,IAAMkD,IAA0BC,EAC9B,sPACA;CACE,UAAU,EACR,OAAO;EACL,gBAAgB;EAChB,cAAc;EACd,eACE;EACF,aACE;CACJ,EACF;CACA,iBAAiB,EACf,OAAO,eACT;AACF,CACF;AAEA,SAASvF,EAAgB,EACvB,cACA,WAAQ,gBACR,GAAGoC,KAC0E;CAC7E,OACE,kBAAC,OAAD;EACE,MAAK;EACL,aAAU;EACV,cAAYqD;EACZ,WAAW5E,EAAGyE,EAAwB,EAAE,SAAM,CAAC,GAAGR,CAAS;EAC3D,UAAU,MAAM;GACd,AAAK,EAAE,OAAuB,QAAQ,QAAQ,KAG9C,EAAE,cAAc,eAAe,cAAc,OAAO,CAAC,EAAE,MAAM;EAC/D;EACA,GAAI1C;CACL,CAAA;AAEL;AAEiCmD,EAC/B,sDACA;CACE,UAAU,EACR,MAAM;EACJ,IAAI;EACJ,IAAI;EACJ,WAAW;EACX,WAAW;CACb,EACF;CACA,iBAAiB,EACf,MAAM,KACR;AACF,CACF;AAuBA,SAAStF,EAAe,EAAE,cAAW,GAAGmC,KAAuC;CAC7E,OACE,kBAAC,QAAD;EACE,WAAWvB,EACT,oIACAiE,CACF;EACA,GAAI1C;CACL,CAAA;AAEL;AAEA,SAASlC,EAAgB,EACvB,cACA,GAAGkC,KAC6B;CAChC,OACE,kBAACjC,GAAD;EACE,aAAU;EACV,WAAWU,EAAG,2GAA2GiE,CAAS;EAClI,GAAI1C;CACL,CAAA;AAEL;AAEA,SAAShC,EAAmB,EAC1B,cACA,GAAGgC,KACgC;CACnC,OACE,kBAACgD,GAAD;EACE,aAAU;EACV,WAAWvE,EAAG,mIAAmIiE,CAAS;EAC1J,GAAI1C;CACL,CAAA;AAEL;;;AC9FA,SAASyD,EAAW,EAAE,cAAW,GAAGzD,KAA0B;CAC7D,OACC,kBAAC/B,GAAD;EACC,WAAWQ,EACV,mGACA,6GACA,+GACAiE,CACD;EACA,GAAI1C;CACJ,CAAA;AAEH;AAEA,IAAM0D,IAAwB;CAC7B,gBAAgB;CAChB,cAAc;CACd,eAAe;CACf,aAAa;AACd;AAGA,SAASC,EAAgB,EAAE,cAAW,WAAQ,gBAAgB,GAAG3D,KAA+B;CAC/F,OACC,kBAAC9B,GAAD;EACQ;EACP,WAAWO,EACV,4GACAiF,EAAsBL,KAAS,iBAC/BX,CACD;EACA,GAAI1C;CACJ,CAAA;AAEH;AAGA,SAAS4D,EAAiB,EACzB,cACA,UAAO,aACP,iBAAc,SACd,cAAW,IACX,GAAG5D,KACsB;CACzB,OACC,kBAACrB,GAAD;EACO;EACO;EACH;EACV,WAAWF,EAAG,wDAAwDiE,CAAS;EAC/E,GAAI1C;CACJ,CAAA;AAEH;AAEA,SAAS6D,EAAgB,GAAyD;CACjF,OAAO,OAAOC,KAAY,YAAY,OAAOA,KAAY,YAAY,OAAOA,KAAY;AACzF;AAGA,SAASC,EAAe,EAAE,aAAU,cAAW,GAAG/D,KAA8B;CAC/E,OACC,kBAAC7B,GAAD;EACC,WAAWM,EAAG,oFAAsFiE,CAAS;EAC7G,GAAI1C;EAEH,UAAA6D,EAAgBG,CAAQ,IACxB,kBAACtF,GAAD;GAAM,KAAI;GAAO,MAAK;GAAU,YAAW;GAAQ,WAAU;GAC3D;EACI,CAAA,IAENsF;CAEuB,CAAA;AAE3B;AAGA,SAASC,EAAgB,EAAE,cAAW,GAAGjE,KAA+B;CACvE,OACC,kBAAC5B,GAAD;EACC,WAAWK,EAGV,kGACAQ,EAA0B,IAC1ByD,CACD;EACA,GAAI1C;CACJ,CAAA;AAEH;AAGA,SAASkE,EAAmB,EAAE,cAAW,GAAGlE,KAAkC;CAC7E,OACC,kBAAC3B,GAAD;EACC,WAAWI,EAAG,8GAA8GiE,CAAS;EACrI,GAAI1C;CACJ,CAAA;AAEH;;;ACpIA,IAAamE,IAAoD;CAChE,cAAc;CACd,cAAc;AACf,GAqBMC,IAAgB9F,EAAM,WAC3B,SACC,EACC,YACA,oBAAiB,IACjB,oBACA,gBAAa,IACb,qBACA,8BACA,cACA,aACA,YACA,iBACA,SAASyB,GACT,GAAGC,KAEJ,GACC;CACD,IAAMG,IAAUC,EAAW+D,GAA6BpE,CAAW,GAC7D,CAACsE,GAAiBC,KAAsBhG,EAAM,SAASiG,CAAc,GACrEC,IAAeC,MAAY,KAAA,GAC3BC,IAAYF,IAAeC,IAAUJ,GACrCM,IAAgBC,KAAY3C,GAE5B4C,IAAmBvG,EAAM,kBAAkB;EAChD,IAAMwG,IAAc,CAACJ;EAIrB,AAHKF,KACJF,EAAmBQ,CAAW,GAE/BC,IAAkBD,CAAW;CAC9B,GAAG;EAACN;EAAcE;EAAWK;CAAe,CAAC,GAEvCC,IAAmBC,IACxB,kBAAC,UAAD;EACC,MAAK;EACL,WAAWxG,EAAG,0BAA0BI,EAAuB,QAAQA,EAAuB,OAAOA,EAAuB,QAAQqG,CAAyB;EAC7J,cAAYR,IAAYvE,EAAQ,eAAeA,EAAQ;EACvD,gBAAcuE;EACd,UAAUC;EACV,cAAc,MAAUQ,EAAM,eAAe;EAC7C,SAASN;EAER,UAAYO,EAAZV,IAAaW,IAAwEC,GAAzE;GAAQ,WAAWzG,EAAuB;GAAM,eAAY;EAAQ,CAAqE;CAC/I,CAAA,IACL;CAEJ,OACC,kBAAC,OAAD;EAAK,WAAWJ,EAAG,6BAA6B,YAAY8G,CAAgB;EAC3E,UAAA,kBAACjG,EAA2B,UAA5B;GAAqC,OAAO0F;GAC3C,UAAA,kBAACzF,GAAD;IACC,GAAIS;IACC;IACL,MAAM0E,IAAY,SAAS;IACjB;IACD;IACE;IACX,SAASc;GACT,CAAA;EACmC,CAAA;CACjC,CAAA;AAEP,CACD;AAEA,EAAc,cAAc;;;ACxF5B,SAAgBC,EACf,GACA,EACC,eAAY,KACZ,eAAY,IACZ,UAAO,OACiB,CAAC,GACzB;CACD,IAAMC,IAAgBC,KAAa,KAC7BC,IAAmBF,EAAc,QAAQ,uBAAuB,MAAM,GACxEG,IAAa,OAAOC,KAAS,EAAE,CAAC,CAClC,UAAU,MAAM,CAAC,CACjB,QAAQ,oBAAoB,EAAE,CAAC,CAC/B,QAAQ,MAAM,OAAO,CAAC,CACtB,QAAQ,SAAS,EAAE;CAcrB,OAZIC,MACH,IAAaF,EAAW,YAAY,IAGrC,IAAaA,EACX,QAAQ,8BAA8BH,CAAa,CAAC,CACpD,QAAY,OAAO,GAAGE,EAAiB,OAAO,GAAG,GAAGF,CAAa,GAE/DM,MACH,IAAaH,EAAW,QAAY,OAAO,IAAID,EAAiB,GAAGA,EAAiB,IAAI,GAAG,GAAG,EAAE,IAG1FC;AACR;AAgBA,IAAMI,IAAY1H,EAAM,WACvB,SACC,EACC,UACA,YACA,eAAY,KACZ,eAAY,IACZ,UAAO,IACP,qBACA,cACA,GAAGyB,KAEJ,GACC;CACD,IAAMkG,IAAO3H,EAAM,cACZ4H,IAAUL,CAAK,KAAKL,EAAaK,GAAO;EAAE;EAAW;EAAW;CAAK,CAAC,GAC5E;EAACC;EAAWJ;EAAWQ;EAASH;EAAMF;CAAK,CAC5C;CAEA,OACC,kBAAC,OAAD;EAAK,WAAWrH,EAAG,yBAAyB8G,CAAgB;EAC3D,UAAA,kBAAChG,GAAD;GACM;GACL,GAAIS;GACJ,MAAK;GACL,OAAOkG;GACP,UAAA;GACW;EACX,CAAA;CACG,CAAA;AAEP,CACD;AAEA,EAAU,cAAc"}