@exxatdesignux/ui 0.2.19 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (688) hide show
  1. package/CHANGELOG.md +60 -7
  2. package/bin/sync-extras.mjs +116 -29
  3. package/consumer-extras/README.md +42 -7
  4. package/consumer-extras/cursor-rules/exxat-accessibility.mdc +39 -0
  5. package/consumer-extras/cursor-rules/exxat-board-cards.mdc +26 -0
  6. package/consumer-extras/cursor-rules/exxat-breadcrumbs-no-back.mdc +21 -0
  7. package/consumer-extras/cursor-rules/exxat-card-vs-list-rows.mdc +21 -0
  8. package/consumer-extras/cursor-rules/exxat-centralized-list-dataset.mdc +44 -0
  9. package/consumer-extras/cursor-rules/exxat-collaboration-access.mdc +32 -0
  10. package/consumer-extras/cursor-rules/exxat-command-menu.mdc +22 -0
  11. package/consumer-extras/cursor-rules/exxat-dashboard-view-charts.mdc +53 -0
  12. package/consumer-extras/cursor-rules/exxat-data-tables.mdc +41 -0
  13. package/consumer-extras/cursor-rules/exxat-dedicated-search-surfaces.mdc +25 -0
  14. package/consumer-extras/cursor-rules/exxat-drawer-vs-dialog.mdc +22 -0
  15. package/consumer-extras/cursor-rules/exxat-ds-agents.mdc +56 -0
  16. package/consumer-extras/cursor-rules/exxat-fontawesome-icons.mdc +31 -0
  17. package/consumer-extras/cursor-rules/exxat-kbd-shortcuts.mdc +100 -0
  18. package/consumer-extras/cursor-rules/exxat-kpi-flat-band.mdc +28 -0
  19. package/consumer-extras/cursor-rules/exxat-kpi-max-four.mdc +21 -0
  20. package/consumer-extras/cursor-rules/exxat-kpi-trends.mdc +31 -0
  21. package/consumer-extras/cursor-rules/exxat-list-page-connected-views.mdc +24 -0
  22. package/consumer-extras/cursor-rules/exxat-list-page-view-shells.mdc +31 -0
  23. package/consumer-extras/cursor-rules/exxat-mono-ids.mdc +30 -0
  24. package/consumer-extras/cursor-rules/exxat-no-slds-leakage.mdc +78 -0
  25. package/consumer-extras/cursor-rules/exxat-no-toast.mdc +25 -0
  26. package/consumer-extras/cursor-rules/exxat-page-vs-drawer.mdc +23 -0
  27. package/consumer-extras/cursor-rules/exxat-person-identity-display.mdc +47 -0
  28. package/consumer-extras/cursor-rules/exxat-primary-nav-secondary-panel.mdc +52 -0
  29. package/consumer-extras/cursor-rules/exxat-question-bank-hub-header.mdc +28 -0
  30. package/consumer-extras/cursor-rules/exxat-reuse-before-custom.mdc +34 -0
  31. package/consumer-extras/cursor-rules/exxat-table-properties-drawer.mdc +77 -0
  32. package/consumer-extras/cursor-rules/exxat-token-discipline.mdc +103 -0
  33. package/consumer-extras/cursor-skills/exxat-accessibility/SKILL.md +1 -1
  34. package/consumer-extras/cursor-skills/exxat-board-cards/SKILL.md +2 -2
  35. package/consumer-extras/cursor-skills/exxat-centralized-list-dataset/SKILL.md +4 -15
  36. package/consumer-extras/cursor-skills/exxat-ds-skill/SKILL.md +13 -28
  37. package/consumer-extras/cursor-skills/exxat-ds-skill/references/data-table-pattern.md +1 -1
  38. package/consumer-extras/cursor-skills/exxat-primary-nav-secondary-panel/SKILL.md +2 -4
  39. package/consumer-extras/handbook/HANDBOOK.md +185 -0
  40. package/consumer-extras/handbook/glossary.md +57 -0
  41. package/consumer-extras/handbook/reference-implementations.md +126 -0
  42. package/consumer-extras/handbook/voice-and-tone.md +262 -0
  43. package/consumer-extras/patterns/command-menu-pattern.md +1 -1
  44. package/consumer-extras/patterns/consumer-upgrade-checklist.md +0 -20
  45. package/consumer-extras/patterns/data-views-pattern.md +17 -54
  46. package/consumer-extras/patterns/shell-surface-elevation-pattern.md +3 -5
  47. package/dist/components/data-table/filter-date-calendar.d.ts +10 -0
  48. package/dist/components/data-table/filter-date-calendar.js +280 -0
  49. package/dist/components/data-table/filter-date-calendar.js.map +1 -0
  50. package/dist/components/data-table/filter-text-value-input.d.ts +15 -0
  51. package/dist/components/data-table/filter-text-value-input.js +561 -0
  52. package/dist/components/data-table/filter-text-value-input.js.map +1 -0
  53. package/dist/components/data-table/index.d.ts +45 -0
  54. package/dist/components/data-table/index.js +3085 -0
  55. package/dist/components/data-table/index.js.map +1 -0
  56. package/dist/components/data-table/pagination.d.ts +28 -0
  57. package/dist/components/data-table/pagination.js +3264 -0
  58. package/dist/components/data-table/pagination.js.map +1 -0
  59. package/dist/components/data-table/types.d.ts +84 -0
  60. package/dist/components/data-table/types.js +3 -0
  61. package/dist/components/data-table/types.js.map +1 -0
  62. package/dist/components/data-table/use-table-state.d.ts +116 -0
  63. package/dist/components/data-table/use-table-state.js +670 -0
  64. package/dist/components/data-table/use-table-state.js.map +1 -0
  65. package/dist/components/data-views/board-card-primitives.d.ts +22 -0
  66. package/dist/components/data-views/board-card-primitives.js +84 -0
  67. package/dist/components/data-views/board-card-primitives.js.map +1 -0
  68. package/dist/components/data-views/data-row-list.d.ts +33 -0
  69. package/dist/components/data-views/data-row-list.js +106 -0
  70. package/dist/components/data-views/data-row-list.js.map +1 -0
  71. package/dist/components/data-views/finder-panel-view.d.ts +54 -0
  72. package/dist/components/data-views/finder-panel-view.js +388 -0
  73. package/dist/components/data-views/finder-panel-view.js.map +1 -0
  74. package/dist/components/data-views/folder-grid-view.d.ts +22 -0
  75. package/dist/components/data-views/folder-grid-view.js +58 -0
  76. package/dist/components/data-views/folder-grid-view.js.map +1 -0
  77. package/dist/components/data-views/hub-table.d.ts +167 -0
  78. package/dist/components/data-views/hub-table.js +5561 -0
  79. package/dist/components/data-views/hub-table.js.map +1 -0
  80. package/dist/components/data-views/index.d.ts +27 -0
  81. package/dist/components/data-views/index.js +6575 -0
  82. package/dist/components/data-views/index.js.map +1 -0
  83. package/dist/components/data-views/list-page-board-card.d.ts +72 -0
  84. package/dist/components/data-views/list-page-board-card.js +264 -0
  85. package/dist/components/data-views/list-page-board-card.js.map +1 -0
  86. package/dist/components/data-views/list-page-board-template.d.ts +24 -0
  87. package/dist/components/data-views/list-page-board-template.js +137 -0
  88. package/dist/components/data-views/list-page-board-template.js.map +1 -0
  89. package/dist/components/data-views/list-page-connected-view-body.d.ts +19 -0
  90. package/dist/components/data-views/list-page-connected-view-body.js +116 -0
  91. package/dist/components/data-views/list-page-connected-view-body.js.map +1 -0
  92. package/dist/components/data-views/list-page-split-details-placeholder.d.ts +14 -0
  93. package/dist/components/data-views/list-page-split-details-placeholder.js +38 -0
  94. package/dist/components/data-views/list-page-split-details-placeholder.js.map +1 -0
  95. package/dist/components/data-views/list-page-split-hub-chrome.d.ts +17 -0
  96. package/dist/components/data-views/list-page-split-hub-chrome.js +54 -0
  97. package/dist/components/data-views/list-page-split-hub-chrome.js.map +1 -0
  98. package/dist/components/data-views/list-page-split-hub-tokens.d.ts +12 -0
  99. package/dist/components/data-views/list-page-split-hub-tokens.js +8 -0
  100. package/dist/components/data-views/list-page-split-hub-tokens.js.map +1 -0
  101. package/dist/components/data-views/list-page-tree-column-header.d.ts +15 -0
  102. package/dist/components/data-views/list-page-tree-column-header.js +22 -0
  103. package/dist/components/data-views/list-page-tree-column-header.js.map +1 -0
  104. package/dist/components/data-views/list-page-tree-panel-shell.d.ts +25 -0
  105. package/dist/components/data-views/list-page-tree-panel-shell.js +146 -0
  106. package/dist/components/data-views/list-page-tree-panel-shell.js.map +1 -0
  107. package/dist/components/data-views/os-folder-glyph.d.ts +35 -0
  108. package/dist/components/data-views/os-folder-glyph.js +104 -0
  109. package/dist/components/data-views/os-folder-glyph.js.map +1 -0
  110. package/dist/components/data-views/outline-tree-menu.d.ts +36 -0
  111. package/dist/components/data-views/outline-tree-menu.js +131 -0
  112. package/dist/components/data-views/outline-tree-menu.js.map +1 -0
  113. package/dist/components/table-properties/column-row.d.ts +22 -0
  114. package/dist/components/table-properties/column-row.js +153 -0
  115. package/dist/components/table-properties/column-row.js.map +1 -0
  116. package/dist/components/table-properties/draggable-list.d.ts +24 -0
  117. package/dist/components/table-properties/draggable-list.js +53 -0
  118. package/dist/components/table-properties/draggable-list.js.map +1 -0
  119. package/dist/components/table-properties/drawer-button.d.ts +110 -0
  120. package/dist/components/table-properties/drawer-button.js +2748 -0
  121. package/dist/components/table-properties/drawer-button.js.map +1 -0
  122. package/dist/components/table-properties/drawer.d.ts +100 -0
  123. package/dist/components/table-properties/drawer.js +2595 -0
  124. package/dist/components/table-properties/drawer.js.map +1 -0
  125. package/dist/components/table-properties/filter-card.d.ts +24 -0
  126. package/dist/components/table-properties/filter-card.js +854 -0
  127. package/dist/components/table-properties/filter-card.js.map +1 -0
  128. package/dist/components/table-properties/index.d.ts +14 -0
  129. package/dist/components/table-properties/index.js +2768 -0
  130. package/dist/components/table-properties/index.js.map +1 -0
  131. package/dist/components/table-properties/sort-card.d.ts +20 -0
  132. package/dist/components/table-properties/sort-card.js +102 -0
  133. package/dist/components/table-properties/sort-card.js.map +1 -0
  134. package/dist/components/templates/dedicated-search-landing-template.d.ts +21 -0
  135. package/dist/components/templates/dedicated-search-landing-template.js +254 -0
  136. package/dist/components/templates/dedicated-search-landing-template.js.map +1 -0
  137. package/dist/components/templates/dedicated-search-results-template.d.ts +15 -0
  138. package/dist/components/templates/dedicated-search-results-template.js +16 -0
  139. package/dist/components/templates/dedicated-search-results-template.js.map +1 -0
  140. package/dist/components/templates/index.d.ts +9 -0
  141. package/dist/components/templates/index.js +2720 -0
  142. package/dist/components/templates/index.js.map +1 -0
  143. package/dist/components/templates/list-page.d.ts +83 -0
  144. package/dist/components/templates/list-page.js +2433 -0
  145. package/dist/components/templates/list-page.js.map +1 -0
  146. package/dist/components/templates/nested-secondary-panel-shell.d.ts +20 -0
  147. package/dist/components/templates/nested-secondary-panel-shell.js +54 -0
  148. package/dist/components/templates/nested-secondary-panel-shell.js.map +1 -0
  149. package/dist/components/ui/accordion.d.ts +10 -0
  150. package/dist/components/ui/accordion.js +74 -0
  151. package/dist/components/ui/accordion.js.map +1 -0
  152. package/dist/components/ui/alert-dialog.d.ts +37 -0
  153. package/dist/components/ui/alert-dialog.js +201 -0
  154. package/dist/components/ui/alert-dialog.js.map +1 -0
  155. package/dist/components/ui/avatar.d.ts +84 -0
  156. package/dist/components/ui/avatar.js +328 -0
  157. package/dist/components/ui/avatar.js.map +1 -0
  158. package/dist/components/ui/badge.d.ts +13 -0
  159. package/dist/components/ui/badge.js +49 -0
  160. package/dist/components/ui/badge.js.map +1 -0
  161. package/dist/components/ui/banner.d.ts +62 -0
  162. package/dist/components/ui/banner.js +364 -0
  163. package/dist/components/ui/banner.js.map +1 -0
  164. package/dist/components/ui/breadcrumb.d.ts +14 -0
  165. package/dist/components/ui/breadcrumb.js +114 -0
  166. package/dist/components/ui/breadcrumb.js.map +1 -0
  167. package/dist/components/ui/button.d.ts +16 -0
  168. package/dist/components/ui/button.js +59 -0
  169. package/dist/components/ui/button.js.map +1 -0
  170. package/dist/components/ui/calendar.d.ts +13 -0
  171. package/dist/components/ui/calendar.js +238 -0
  172. package/dist/components/ui/calendar.js.map +1 -0
  173. package/dist/components/ui/card.d.ts +14 -0
  174. package/dist/components/ui/card.js +102 -0
  175. package/dist/components/ui/card.js.map +1 -0
  176. package/dist/components/ui/chart.d.ts +58 -0
  177. package/dist/components/ui/chart.js +292 -0
  178. package/dist/components/ui/chart.js.map +1 -0
  179. package/dist/components/ui/checkbox.d.ts +23 -0
  180. package/dist/components/ui/checkbox.js +155 -0
  181. package/dist/components/ui/checkbox.js.map +1 -0
  182. package/dist/components/ui/coach-mark.d.ts +27 -0
  183. package/dist/components/ui/coach-mark.js +306 -0
  184. package/dist/components/ui/coach-mark.js.map +1 -0
  185. package/dist/components/ui/collapsible.d.ts +8 -0
  186. package/dist/components/ui/collapsible.js +35 -0
  187. package/dist/components/ui/collapsible.js.map +1 -0
  188. package/dist/components/ui/command.d.ts +36 -0
  189. package/dist/components/ui/command.js +274 -0
  190. package/dist/components/ui/command.js.map +1 -0
  191. package/dist/components/ui/context-menu.d.ts +32 -0
  192. package/dist/components/ui/context-menu.js +245 -0
  193. package/dist/components/ui/context-menu.js.map +1 -0
  194. package/dist/components/ui/date-picker-field.d.ts +38 -0
  195. package/dist/components/ui/date-picker-field.js +550 -0
  196. package/dist/components/ui/date-picker-field.js.map +1 -0
  197. package/dist/components/ui/dialog.d.ts +22 -0
  198. package/dist/components/ui/dialog.js +200 -0
  199. package/dist/components/ui/dialog.js.map +1 -0
  200. package/dist/components/ui/dot-pattern.d.ts +21 -0
  201. package/dist/components/ui/dot-pattern.js +139 -0
  202. package/dist/components/ui/dot-pattern.js.map +1 -0
  203. package/dist/components/ui/drag-handle-grip.d.ts +10 -0
  204. package/dist/components/ui/drag-handle-grip.js +15 -0
  205. package/dist/components/ui/drag-handle-grip.js.map +1 -0
  206. package/dist/components/ui/drawer.d.ts +16 -0
  207. package/dist/components/ui/drawer.js +125 -0
  208. package/dist/components/ui/drawer.js.map +1 -0
  209. package/dist/components/ui/dropdown-menu.d.ts +45 -0
  210. package/dist/components/ui/dropdown-menu.js +353 -0
  211. package/dist/components/ui/dropdown-menu.js.map +1 -0
  212. package/dist/components/ui/export-drawer.d.ts +11 -0
  213. package/dist/components/ui/export-drawer.js +1658 -0
  214. package/dist/components/ui/export-drawer.js.map +1 -0
  215. package/dist/components/ui/field.d.ts +30 -0
  216. package/dist/components/ui/field.js +249 -0
  217. package/dist/components/ui/field.js.map +1 -0
  218. package/dist/components/ui/form.d.ts +28 -0
  219. package/dist/components/ui/form.js +110 -0
  220. package/dist/components/ui/form.js.map +1 -0
  221. package/dist/components/ui/hover-card.d.ts +9 -0
  222. package/dist/components/ui/hover-card.js +43 -0
  223. package/dist/components/ui/hover-card.js.map +1 -0
  224. package/dist/components/ui/input-group.d.ts +20 -0
  225. package/dist/components/ui/input-group.js +219 -0
  226. package/dist/components/ui/input-group.js.map +1 -0
  227. package/dist/components/ui/input-mask.d.ts +39 -0
  228. package/dist/components/ui/input-mask.js +118 -0
  229. package/dist/components/ui/input-mask.js.map +1 -0
  230. package/dist/components/ui/input.d.ts +5 -0
  231. package/dist/components/ui/input.js +30 -0
  232. package/dist/components/ui/input.js.map +1 -0
  233. package/dist/components/ui/kbd.d.ts +20 -0
  234. package/dist/components/ui/kbd.js +45 -0
  235. package/dist/components/ui/kbd.js.map +1 -0
  236. package/dist/components/ui/key-metrics-context.d.ts +19 -0
  237. package/dist/components/ui/key-metrics-context.js +26 -0
  238. package/dist/components/ui/key-metrics-context.js.map +1 -0
  239. package/dist/components/ui/key-metrics.d.ts +131 -0
  240. package/dist/components/ui/key-metrics.js +1015 -0
  241. package/dist/components/ui/key-metrics.js.map +1 -0
  242. package/dist/components/ui/label.d.ts +6 -0
  243. package/dist/components/ui/label.js +28 -0
  244. package/dist/components/ui/label.js.map +1 -0
  245. package/dist/components/ui/list-page-view-frame.d.ts +22 -0
  246. package/dist/components/ui/list-page-view-frame.js +24 -0
  247. package/dist/components/ui/list-page-view-frame.js.map +1 -0
  248. package/dist/components/ui/page-header.d.ts +51 -0
  249. package/dist/components/ui/page-header.js +372 -0
  250. package/dist/components/ui/page-header.js.map +1 -0
  251. package/dist/components/ui/payment-card-fields.d.ts +10 -0
  252. package/dist/components/ui/payment-card-fields.js +80 -0
  253. package/dist/components/ui/payment-card-fields.js.map +1 -0
  254. package/dist/components/ui/popover.d.ts +10 -0
  255. package/dist/components/ui/popover.js +47 -0
  256. package/dist/components/ui/popover.js.map +1 -0
  257. package/dist/components/ui/radio-group.d.ts +29 -0
  258. package/dist/components/ui/radio-group.js +190 -0
  259. package/dist/components/ui/radio-group.js.map +1 -0
  260. package/dist/components/ui/resizable.d.ts +16 -0
  261. package/dist/components/ui/resizable.js +51 -0
  262. package/dist/components/ui/resizable.js.map +1 -0
  263. package/dist/components/ui/scroll-area.d.ts +8 -0
  264. package/dist/components/ui/scroll-area.js +66 -0
  265. package/dist/components/ui/scroll-area.js.map +1 -0
  266. package/dist/components/ui/select.d.ts +18 -0
  267. package/dist/components/ui/select.js +186 -0
  268. package/dist/components/ui/select.js.map +1 -0
  269. package/dist/components/ui/selection-tile-grid.d.ts +52 -0
  270. package/dist/components/ui/selection-tile-grid.js +347 -0
  271. package/dist/components/ui/selection-tile-grid.js.map +1 -0
  272. package/dist/components/ui/separator.d.ts +7 -0
  273. package/dist/components/ui/separator.js +33 -0
  274. package/dist/components/ui/separator.js.map +1 -0
  275. package/dist/components/ui/sheet.d.ts +18 -0
  276. package/dist/components/ui/sheet.js +181 -0
  277. package/dist/components/ui/sheet.js.map +1 -0
  278. package/dist/components/ui/sidebar.d.ts +94 -0
  279. package/dist/components/ui/sidebar.js +805 -0
  280. package/dist/components/ui/sidebar.js.map +1 -0
  281. package/dist/components/ui/skeleton.d.ts +5 -0
  282. package/dist/components/ui/skeleton.js +22 -0
  283. package/dist/components/ui/skeleton.js.map +1 -0
  284. package/dist/components/ui/slider.d.ts +7 -0
  285. package/dist/components/ui/slider.js +66 -0
  286. package/dist/components/ui/slider.js.map +1 -0
  287. package/dist/components/ui/sonner.d.ts +6 -0
  288. package/dist/components/ui/sonner.js +38 -0
  289. package/dist/components/ui/sonner.js.map +1 -0
  290. package/dist/components/ui/status-badge.d.ts +38 -0
  291. package/dist/components/ui/status-badge.js +77 -0
  292. package/dist/components/ui/status-badge.js.map +1 -0
  293. package/dist/components/ui/table.d.ts +13 -0
  294. package/dist/components/ui/table.js +115 -0
  295. package/dist/components/ui/table.js.map +1 -0
  296. package/dist/components/ui/tabs.d.ts +15 -0
  297. package/dist/components/ui/tabs.js +93 -0
  298. package/dist/components/ui/tabs.js.map +1 -0
  299. package/dist/components/ui/textarea.d.ts +6 -0
  300. package/dist/components/ui/textarea.js +25 -0
  301. package/dist/components/ui/textarea.js.map +1 -0
  302. package/dist/components/ui/tip.d.ts +12 -0
  303. package/dist/components/ui/tip.js +61 -0
  304. package/dist/components/ui/tip.js.map +1 -0
  305. package/dist/components/ui/toggle-group.d.ts +14 -0
  306. package/dist/components/ui/toggle-group.js +104 -0
  307. package/dist/components/ui/toggle-group.js.map +1 -0
  308. package/dist/components/ui/toggle-switch.d.ts +10 -0
  309. package/dist/components/ui/toggle-switch.js +33 -0
  310. package/dist/components/ui/toggle-switch.js.map +1 -0
  311. package/dist/components/ui/toggle.d.ts +13 -0
  312. package/dist/components/ui/toggle.js +51 -0
  313. package/dist/components/ui/toggle.js.map +1 -0
  314. package/dist/components/ui/tooltip.d.ts +10 -0
  315. package/dist/components/ui/tooltip.js +68 -0
  316. package/dist/components/ui/tooltip.js.map +1 -0
  317. package/dist/components/ui/view-segmented-control.d.ts +31 -0
  318. package/dist/components/ui/view-segmented-control.js +167 -0
  319. package/dist/components/ui/view-segmented-control.js.map +1 -0
  320. package/dist/data-list-view-registry-CyBoBML4.d.ts +73 -0
  321. package/dist/hooks/use-app-theme.d.ts +24 -0
  322. package/dist/hooks/use-app-theme.js +286 -0
  323. package/dist/hooks/use-app-theme.js.map +1 -0
  324. package/dist/hooks/use-coach-mark.d.ts +86 -0
  325. package/dist/hooks/use-coach-mark.js +218 -0
  326. package/dist/hooks/use-coach-mark.js.map +1 -0
  327. package/dist/hooks/use-mobile.d.ts +3 -0
  328. package/dist/hooks/use-mobile.js +29 -0
  329. package/dist/hooks/use-mobile.js.map +1 -0
  330. package/dist/hooks/use-mod-key-label.d.ts +6 -0
  331. package/dist/hooks/use-mod-key-label.js +25 -0
  332. package/dist/hooks/use-mod-key-label.js.map +1 -0
  333. package/dist/index.d.ts +120 -0
  334. package/dist/index.js +13324 -0
  335. package/dist/index.js.map +1 -0
  336. package/dist/lib/compose-refs.d.ts +6 -0
  337. package/dist/lib/compose-refs.js +17 -0
  338. package/dist/lib/compose-refs.js.map +1 -0
  339. package/dist/lib/conditional-rule-match.d.ts +30 -0
  340. package/dist/lib/conditional-rule-match.js +66 -0
  341. package/dist/lib/conditional-rule-match.js.map +1 -0
  342. package/dist/lib/data-list-display-options.d.ts +26 -0
  343. package/dist/lib/data-list-display-options.js +14 -0
  344. package/dist/lib/data-list-display-options.js.map +1 -0
  345. package/dist/lib/data-list-view-registry.d.ts +2 -0
  346. package/dist/lib/data-list-view-registry.js +102 -0
  347. package/dist/lib/data-list-view-registry.js.map +1 -0
  348. package/dist/lib/data-list-view-surface.d.ts +2 -0
  349. package/dist/lib/data-list-view-surface.js +80 -0
  350. package/dist/lib/data-list-view-surface.js.map +1 -0
  351. package/dist/lib/data-list-view.d.ts +21 -0
  352. package/dist/lib/data-list-view.js +25 -0
  353. package/dist/lib/data-list-view.js.map +1 -0
  354. package/dist/lib/date-filter.d.ts +22 -0
  355. package/dist/lib/date-filter.js +61 -0
  356. package/dist/lib/date-filter.js.map +1 -0
  357. package/dist/lib/dev-log.d.ts +8 -0
  358. package/dist/lib/dev-log.js +10 -0
  359. package/dist/lib/dev-log.js.map +1 -0
  360. package/dist/lib/dropdown-menu-surface.d.ts +14 -0
  361. package/dist/lib/dropdown-menu-surface.js +6 -0
  362. package/dist/lib/dropdown-menu-surface.js.map +1 -0
  363. package/dist/lib/editable-target.d.ts +12 -0
  364. package/dist/lib/editable-target.js +12 -0
  365. package/dist/lib/editable-target.js.map +1 -0
  366. package/dist/lib/list-page-table-properties.d.ts +35 -0
  367. package/dist/lib/list-page-table-properties.js +81 -0
  368. package/dist/lib/list-page-table-properties.js.map +1 -0
  369. package/dist/lib/raf-throttle.d.ts +23 -0
  370. package/dist/lib/raf-throttle.js +27 -0
  371. package/dist/lib/raf-throttle.js.map +1 -0
  372. package/dist/lib/row-height.d.ts +16 -0
  373. package/dist/lib/row-height.js +10 -0
  374. package/dist/lib/row-height.js.map +1 -0
  375. package/dist/lib/table-properties-types.d.ts +83 -0
  376. package/dist/lib/table-properties-types.js +19 -0
  377. package/dist/lib/table-properties-types.js.map +1 -0
  378. package/dist/lib/utils.d.ts +5 -0
  379. package/dist/lib/utils.js +11 -0
  380. package/dist/lib/utils.js.map +1 -0
  381. package/package.json +83 -19
  382. package/src/components/data-table/filter-date-calendar.tsx +38 -0
  383. package/src/components/data-table/filter-text-value-input.tsx +77 -0
  384. package/src/components/data-table/index.tsx +1678 -0
  385. package/src/components/data-table/pagination.tsx +255 -0
  386. package/src/components/data-table/types.ts +96 -0
  387. package/src/components/data-table/use-table-state.ts +767 -0
  388. package/src/components/data-views/board-card-primitives.tsx +93 -0
  389. package/src/components/data-views/data-row-list.tsx +183 -0
  390. package/src/components/data-views/finder-panel-view.tsx +405 -0
  391. package/src/components/data-views/folder-grid-view.tsx +86 -0
  392. package/src/components/data-views/hub-table.tsx +498 -0
  393. package/src/components/data-views/index.ts +28 -0
  394. package/src/components/data-views/list-page-board-card.tsx +192 -0
  395. package/src/components/data-views/list-page-board-template.tsx +122 -0
  396. package/src/components/data-views/list-page-connected-view-body.tsx +66 -0
  397. package/src/components/data-views/list-page-split-details-placeholder.tsx +39 -0
  398. package/src/components/data-views/list-page-split-hub-chrome.tsx +60 -0
  399. package/src/components/data-views/list-page-split-hub-tokens.ts +16 -0
  400. package/src/components/data-views/list-page-tree-column-header.tsx +31 -0
  401. package/src/components/data-views/list-page-tree-panel-shell.tsx +91 -0
  402. package/src/components/data-views/os-folder-glyph.tsx +141 -0
  403. package/src/components/data-views/outline-tree-menu.tsx +157 -0
  404. package/src/components/table-properties/column-row.tsx +90 -0
  405. package/src/components/table-properties/draggable-list.ts +54 -0
  406. package/src/components/table-properties/drawer-button.tsx +300 -0
  407. package/src/components/table-properties/drawer.tsx +1148 -0
  408. package/src/components/table-properties/filter-card.tsx +251 -0
  409. package/src/components/table-properties/index.ts +36 -0
  410. package/src/components/table-properties/sort-card.tsx +63 -0
  411. package/src/components/templates/dedicated-search-landing-template.tsx +124 -0
  412. package/src/components/templates/dedicated-search-results-template.tsx +19 -0
  413. package/src/components/templates/index.ts +33 -0
  414. package/src/components/templates/list-page.tsx +602 -0
  415. package/src/components/templates/nested-secondary-panel-shell.tsx +70 -0
  416. package/src/components/ui/accordion.tsx +92 -0
  417. package/src/components/ui/alert-dialog.tsx +221 -0
  418. package/src/components/ui/avatar.tsx +13 -2
  419. package/src/components/ui/banner.tsx +2 -2
  420. package/src/components/ui/button.tsx +4 -4
  421. package/src/components/ui/calendar.tsx +1 -1
  422. package/src/components/ui/coach-mark.tsx +1 -1
  423. package/src/components/ui/context-menu.tsx +291 -0
  424. package/src/components/ui/date-picker-field.tsx +2 -2
  425. package/src/components/ui/dot-pattern.tsx +183 -0
  426. package/src/components/ui/export-drawer.tsx +375 -0
  427. package/src/components/ui/hover-card.tsx +66 -0
  428. package/src/components/ui/key-metrics-context.tsx +78 -0
  429. package/src/components/ui/key-metrics.tsx +1133 -0
  430. package/src/components/ui/list-page-view-frame.tsx +64 -0
  431. package/src/components/ui/page-header.tsx +244 -0
  432. package/src/components/ui/payment-card-fields.tsx +2 -2
  433. package/src/components/ui/resizable.tsx +68 -0
  434. package/src/components/ui/scroll-area.tsx +72 -0
  435. package/src/components/ui/selection-tile-grid.tsx +9 -2
  436. package/src/components/ui/sidebar.tsx +84 -12
  437. package/src/components/ui/slider.tsx +83 -0
  438. package/src/globals.css +2201 -7
  439. package/src/globals.d.ts +20 -0
  440. package/src/index.ts +68 -1
  441. package/src/lib/conditional-rule-match.ts +119 -0
  442. package/src/lib/data-list-display-options.ts +35 -0
  443. package/src/lib/data-list-view-registry.ts +104 -0
  444. package/src/lib/data-list-view-surface.ts +83 -0
  445. package/src/lib/data-list-view.ts +47 -0
  446. package/src/lib/dev-log.ts +10 -0
  447. package/src/lib/editable-target.ts +20 -0
  448. package/src/lib/list-page-table-properties.ts +48 -0
  449. package/src/lib/raf-throttle.ts +45 -0
  450. package/src/lib/row-height.ts +19 -0
  451. package/src/lib/table-properties-types.ts +98 -0
  452. package/template/.cursor/rules/exxat-command-menu.mdc +1 -1
  453. package/template/.cursor/rules/exxat-dashboard-view-charts.mdc +3 -3
  454. package/template/.cursor/rules/exxat-data-tables.mdc +1 -1
  455. package/template/.cursor/rules/exxat-ds-agents.mdc +2 -2
  456. package/template/.cursor/rules/exxat-kbd-shortcuts.mdc +2 -2
  457. package/template/.cursor/rules/exxat-table-properties-drawer.mdc +1 -1
  458. package/template/AGENTS.md +104 -78
  459. package/template/app/(app)/dashboard/loading.tsx +15 -3
  460. package/template/app/(app)/dashboard/page.tsx +14 -2
  461. package/template/app/(app)/examples/page.tsx +0 -2
  462. package/template/app/(app)/layout.tsx +17 -4
  463. package/template/app/(app)/loading.tsx +18 -1
  464. package/template/app/(app)/question-bank/find/page.tsx +1 -2
  465. package/template/app/(app)/question-bank/layout.tsx +1 -1
  466. package/template/app/(app)/question-bank/library/page.tsx +1 -2
  467. package/template/app/(app)/question-bank/list/page.tsx +1 -2
  468. package/template/app/(app)/question-bank/new/page.tsx +15 -20
  469. package/template/app/(app)/question-bank/page.tsx +1 -2
  470. package/template/app/(app)/settings/page.tsx +5 -4
  471. package/template/app/globals.css +14 -16
  472. package/template/components/ask-leo-sidebar.tsx +5 -1
  473. package/template/components/brand-color-picker.tsx +2 -2
  474. package/template/components/charts-overview.tsx +1 -1
  475. package/template/components/compliance-board-view.tsx +142 -0
  476. package/template/components/compliance-client.tsx +92 -0
  477. package/template/components/compliance-page-header.tsx +89 -0
  478. package/template/components/compliance-table.tsx +468 -0
  479. package/template/components/dashboard-report-charts.tsx +1 -1
  480. package/template/components/dashboard-tabs.tsx +1 -1
  481. package/template/components/data-table/filter-date-calendar.tsx +1 -38
  482. package/template/components/data-table/filter-text-value-input.tsx +1 -77
  483. package/template/components/data-table/index.tsx +1 -1634
  484. package/template/components/data-table/pagination.tsx +1 -255
  485. package/template/components/data-table/types.ts +1 -94
  486. package/template/components/data-table/use-table-state.test.ts +420 -0
  487. package/template/components/data-table/use-table-state.ts +1 -758
  488. package/template/components/data-view-dashboard-charts-compliance.tsx +963 -0
  489. package/template/components/data-view-dashboard-charts-team.tsx +971 -0
  490. package/template/components/data-view-dashboard-charts.tsx +1503 -0
  491. package/template/components/data-views/board-card-primitives.tsx +1 -93
  492. package/template/components/data-views/data-row-list.tsx +1 -183
  493. package/template/components/data-views/finder-panel-view.tsx +1 -405
  494. package/template/components/data-views/folder-grid-view.tsx +1 -86
  495. package/template/components/data-views/hub-table.tsx +1 -0
  496. package/template/components/data-views/index.ts +50 -37
  497. package/template/components/data-views/list-page-board-card.tsx +1 -192
  498. package/template/components/data-views/list-page-board-template.tsx +1 -122
  499. package/template/components/data-views/list-page-connected-view-body.tsx +1 -66
  500. package/template/components/data-views/list-page-split-details-placeholder.tsx +1 -39
  501. package/template/components/data-views/list-page-split-hub-chrome.tsx +1 -68
  502. package/template/components/data-views/list-page-split-hub-tokens.ts +1 -16
  503. package/template/components/data-views/list-page-tree-column-header.tsx +1 -31
  504. package/template/components/data-views/list-page-tree-panel-shell.tsx +1 -91
  505. package/template/components/data-views/list-page-view-frame.tsx +5 -53
  506. package/template/components/data-views/os-folder-glyph.tsx +1 -129
  507. package/template/components/data-views/outline-tree-menu.tsx +1 -157
  508. package/template/components/export-drawer.test.tsx +71 -0
  509. package/template/components/export-drawer.tsx +1 -375
  510. package/template/components/exxat-product-logo.tsx +5 -5
  511. package/template/components/hub-tree-panel-view.tsx +2 -2
  512. package/template/components/invite-collaborators-drawer.tsx +3 -3
  513. package/template/components/key-metrics-ask-leo-bridge.tsx +40 -0
  514. package/template/components/key-metrics.tsx +1 -1063
  515. package/template/components/leo-insight-indicator.tsx +2 -2
  516. package/template/components/new-placement-back-btn.tsx +28 -0
  517. package/template/components/new-placement-form.tsx +942 -0
  518. package/template/components/new-question-composer.tsx +456 -408
  519. package/template/components/onboarding/index.ts +9 -0
  520. package/template/components/onboarding/onboarding-01.tsx +1 -1
  521. package/template/components/onboarding/onboarding-02.tsx +1 -1
  522. package/template/components/onboarding/onboarding-03.tsx +1 -1
  523. package/template/components/onboarding/onboarding-04.tsx +1 -1
  524. package/template/components/page-header.tsx +8 -226
  525. package/template/components/placement-board-card.tsx +250 -0
  526. package/template/components/placement-detail.tsx +438 -0
  527. package/template/components/placements-board-view.tsx +397 -0
  528. package/template/components/placements-client.tsx +220 -0
  529. package/template/components/placements-list-view.tsx +124 -0
  530. package/template/components/placements-page-header.tsx +166 -0
  531. package/template/components/placements-table-cells.test.tsx +22 -0
  532. package/template/components/placements-table-cells.tsx +173 -0
  533. package/template/components/placements-table-columns.tsx +210 -0
  534. package/template/components/placements-table.tsx +934 -0
  535. package/template/components/product-switcher.tsx +3 -4
  536. package/template/components/product-wordmark.tsx +2 -1
  537. package/template/components/question-bank-client.tsx +5 -5
  538. package/template/components/question-bank-hub-client.tsx +1 -1
  539. package/template/components/question-bank-new-folder-sheet.tsx +2 -2
  540. package/template/components/question-bank-secondary-nav.tsx +3 -3
  541. package/template/components/question-bank-table.tsx +541 -431
  542. package/template/components/rotations-empty-state.tsx +50 -0
  543. package/template/components/rotations-panel-activator.tsx +8 -0
  544. package/template/components/settings-appearance-card.tsx +3 -4
  545. package/template/components/settings-client.tsx +15 -59
  546. package/template/components/settings-form-row.tsx +4 -9
  547. package/template/components/{app-sidebar-dynamic.tsx → sidebar/app-sidebar-dynamic.tsx} +1 -1
  548. package/template/components/{app-sidebar.tsx → sidebar/app-sidebar.tsx} +59 -74
  549. package/template/components/sidebar/index.ts +16 -0
  550. package/template/components/{secondary-nav.tsx → sidebar/secondary-nav.tsx} +2 -2
  551. package/template/components/{secondary-panel.tsx → sidebar/secondary-panel.tsx} +50 -7
  552. package/template/components/{sidebar-auto-collapse.tsx → sidebar/sidebar-auto-collapse.tsx} +6 -2
  553. package/template/components/{sidebar-shell.tsx → sidebar/sidebar-shell.tsx} +1 -1
  554. package/template/components/site-header.tsx +1 -1
  555. package/template/components/sites-board-view.tsx +67 -0
  556. package/template/components/sites-client.tsx +154 -0
  557. package/template/components/sites-table.tsx +249 -0
  558. package/template/components/table-properties/column-row.tsx +1 -90
  559. package/template/components/table-properties/draggable-list.ts +1 -49
  560. package/template/components/table-properties/drawer-button.tsx +1 -262
  561. package/template/components/table-properties/drawer.tsx +1 -1166
  562. package/template/components/table-properties/filter-card.tsx +1 -251
  563. package/template/components/table-properties/sort-card.tsx +1 -59
  564. package/template/components/table-properties/types.ts +28 -71
  565. package/template/components/team-board-view.tsx +122 -0
  566. package/template/components/team-client.tsx +100 -0
  567. package/template/components/team-page-header.tsx +92 -0
  568. package/template/components/team-table.tsx +553 -0
  569. package/template/components/templates/dedicated-search-landing-template.tsx +1 -124
  570. package/template/components/templates/dedicated-search-results-template.tsx +1 -19
  571. package/template/components/templates/list-page.tsx +1 -608
  572. package/template/components/templates/nested-secondary-panel-shell.tsx +1 -63
  573. package/template/components/templates/new-focus-template.tsx +659 -0
  574. package/template/components/templates/secondary-panel-hub-template.tsx +1 -1
  575. package/template/components/ui/accordion.tsx +1 -0
  576. package/template/components/ui/alert-dialog.tsx +1 -0
  577. package/template/components/ui/context-menu.tsx +1 -0
  578. package/template/components/ui/dot-pattern.tsx +1 -183
  579. package/template/components/ui/hover-card.tsx +1 -0
  580. package/template/components/ui/resizable.tsx +1 -68
  581. package/template/components/ui/scroll-area.tsx +1 -0
  582. package/template/components/ui/slider.tsx +1 -0
  583. package/template/docs/blueprints/README.md +86 -0
  584. package/template/docs/blueprints/_template.md +91 -0
  585. package/template/docs/blueprints/board-card.md +123 -0
  586. package/template/docs/blueprints/data-table.md +139 -0
  587. package/template/docs/blueprints/key-metrics.md +128 -0
  588. package/template/docs/blueprints/list-page-template.md +123 -0
  589. package/template/docs/blueprints/page-header.md +130 -0
  590. package/template/docs/command-menu-pattern.md +1 -1
  591. package/template/docs/component-selection-guide.md +224 -0
  592. package/template/docs/components-audit-2026-05.md +158 -0
  593. package/template/docs/data-views-pattern.md +17 -54
  594. package/template/docs/drawer-vs-dialog-pattern.md +1 -3
  595. package/template/docs/migrations/0001-brand-deep-alias-stabilization.md +95 -0
  596. package/template/docs/migrations/0002-exxat-token-namespace.md +154 -0
  597. package/template/docs/migrations/0003-globals-css-canonical.md +110 -0
  598. package/template/docs/migrations/README.md +100 -0
  599. package/template/docs/migrations/_template.md +64 -0
  600. package/template/docs/shell-surface-elevation-pattern.md +3 -5
  601. package/template/docs/token-taxonomy.md +416 -0
  602. package/template/eslint.config.mjs +27 -0
  603. package/template/hooks/use-secondary-panel-hub-nav.ts +1 -1
  604. package/template/lib/command-menu-config.ts +0 -1
  605. package/template/lib/command-menu-search-data.ts +27 -11
  606. package/template/lib/compliance-supported-views.ts +10 -0
  607. package/template/lib/conditional-rule-match.ts +6 -97
  608. package/template/lib/data-list-display-options.ts +1 -49
  609. package/template/lib/data-list-view-registry.ts +1 -104
  610. package/template/lib/data-list-view-surface.ts +1 -83
  611. package/template/lib/data-list-view.ts +1 -47
  612. package/template/lib/data-view-dashboard-placements-layout.ts +215 -0
  613. package/template/lib/data-view-dashboard-storage.ts +35 -38
  614. package/template/lib/dev-log.ts +1 -8
  615. package/template/lib/editable-target.ts +1 -10
  616. package/template/lib/list-page-table-properties.ts +1 -48
  617. package/template/lib/list-status-badges.ts +97 -4
  618. package/template/lib/mock/compliance-kpi.ts +61 -0
  619. package/template/lib/mock/compliance.ts +146 -0
  620. package/template/lib/mock/navigation.tsx +0 -9
  621. package/template/lib/mock/placements-kpi.ts +134 -0
  622. package/template/lib/mock/placements.ts +176 -0
  623. package/template/lib/mock/sites-directory.ts +16 -0
  624. package/template/lib/mock/sites-kpi.ts +25 -0
  625. package/template/lib/mock/team-kpi.ts +60 -0
  626. package/template/lib/mock/team.ts +118 -0
  627. package/template/lib/placement-board-card-layout.ts +79 -0
  628. package/template/lib/placements-supported-views.ts +12 -0
  629. package/template/lib/question-bank-supported-views.ts +0 -1
  630. package/template/lib/raf-throttle.ts +1 -45
  631. package/template/lib/row-height.ts +4 -10
  632. package/template/lib/sidebar-state-cookie.ts +11 -2
  633. package/template/lib/sites-supported-views.ts +10 -0
  634. package/template/lib/table-state-lifecycle.ts +2 -2
  635. package/template/lib/team-supported-views.ts +10 -0
  636. package/template/package.json +1 -0
  637. package/template/tests/setup.ts +25 -0
  638. package/consumer-extras/AGENTS.md +0 -76
  639. package/consumer-extras/cursor-skills/exxat-consumer-app/SKILL.md +0 -37
  640. package/consumer-extras/cursor-skills/exxat-focused-workflow-page/SKILL.md +0 -57
  641. package/consumer-extras/patterns/consumer-app-pattern.md +0 -39
  642. package/consumer-extras/patterns/focused-workflow-page-pattern.md +0 -84
  643. package/src/components/ui/button-group.tsx +0 -81
  644. package/src/theme.css +0 -16
  645. package/src/tokens/README.md +0 -15
  646. package/src/tokens/base.css +0 -337
  647. package/src/tokens/high-contrast.css +0 -1195
  648. package/src/tokens/layers.css +0 -224
  649. package/src/tokens/tailwind-bridge.css +0 -118
  650. package/src/tokens/themes.css +0 -201
  651. package/template/app/(app)/data-list/layout.tsx +0 -43
  652. package/template/app/(app)/data-list/page.tsx +0 -10
  653. package/template/app/(app)/examples/focused-workflow/page.tsx +0 -5
  654. package/template/components/app-route-loading.tsx +0 -14
  655. package/template/components/dashboard-onboarding-gallery.tsx +0 -13
  656. package/template/components/dashboard-onboarding.tsx +0 -21
  657. package/template/components/data-views/list-page-calendar-view.tsx +0 -593
  658. package/template/components/data-views/list-page-folder-columns-panel.tsx +0 -345
  659. package/template/components/examples/focused-workflow-showcase.tsx +0 -183
  660. package/template/components/list-hub-board-view.tsx +0 -68
  661. package/template/components/list-hub-client.tsx +0 -186
  662. package/template/components/list-hub-list-view.tsx +0 -36
  663. package/template/components/list-hub-panel-activator.tsx +0 -8
  664. package/template/components/list-hub-secondary-nav.tsx +0 -121
  665. package/template/components/list-hub-table.tsx +0 -336
  666. package/template/components/question-bank-folder-columns-panel.tsx +0 -104
  667. package/template/components/question-bank-list-view.tsx +0 -53
  668. package/template/components/secondary-panel/nav-link-rows.tsx +0 -83
  669. package/template/components/secondary-panels/list-hub-panel.tsx +0 -39
  670. package/template/components/secondary-panels/question-bank-panel.tsx +0 -39
  671. package/template/components/secondary-panels/registry.tsx +0 -15
  672. package/template/components/section-cards.tsx +0 -106
  673. package/template/components/templates/focused-workflow-layouts.tsx +0 -448
  674. package/template/components/templates/focused-workflow-page-template.tsx +0 -69
  675. package/template/components/templates/page-loading-shell.tsx +0 -262
  676. package/template/components/ui/button-group.tsx +0 -1
  677. package/template/docs/consumer-app-pattern.md +0 -39
  678. package/template/docs/focused-workflow-page-pattern.md +0 -84
  679. package/template/lib/list-hub-nav.ts +0 -121
  680. package/template/lib/mock/list-hub-directory.ts +0 -27
  681. package/template/lib/mock/list-hub-kpi.ts +0 -27
  682. package/template/lib/page-loading-variant.ts +0 -40
  683. /package/template/components/{getting-started.tsx → onboarding/getting-started.tsx} +0 -0
  684. /package/template/components/{nav-documents.tsx → sidebar/nav-documents.tsx} +0 -0
  685. /package/template/components/{nav-main.tsx → sidebar/nav-main.tsx} +0 -0
  686. /package/template/components/{nav-secondary.tsx → sidebar/nav-secondary.tsx} +0 -0
  687. /package/template/components/{nav-user.tsx → sidebar/nav-user.tsx} +0 -0
  688. /package/template/components/{sidebar-auto-open.tsx → sidebar/sidebar-auto-open.tsx} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils.ts","../src/lib/raf-throttle.ts","../src/components/ui/button.tsx","../src/components/ui/input.tsx","../src/components/ui/kbd.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/tip.tsx","../src/hooks/use-mod-key-label.ts","../src/lib/editable-target.ts","../src/components/ui/label.tsx","../src/components/ui/checkbox.tsx","../src/lib/dropdown-menu-surface.ts","../src/components/ui/dropdown-menu.tsx","../src/components/ui/popover.tsx","../src/lib/table-properties-types.ts","../src/lib/conditional-rule-match.ts","../src/lib/date-filter.ts","../src/components/ui/calendar.tsx","../src/components/data-table/filter-date-calendar.tsx","../src/components/ui/textarea.tsx","../src/components/ui/input-group.tsx","../src/lib/compose-refs.ts","../src/components/ui/input-mask.tsx","../src/components/ui/date-picker-field.tsx","../src/components/data-table/filter-text-value-input.tsx","../src/components/data-table/use-table-state.ts","../src/components/data-table/index.tsx","../src/components/data-table/pagination.tsx","../src/lib/data-list-view.ts","../src/lib/data-list-view-surface.ts","../src/lib/data-list-view-registry.ts","../src/lib/data-list-display-options.ts","../src/lib/row-height.ts","../src/components/ui/radio-group.tsx","../src/components/ui/selection-tile-grid.tsx","../src/components/ui/sheet.tsx","../src/components/ui/select.tsx","../src/components/ui/toggle-switch.tsx","../src/components/table-properties/filter-card.tsx","../src/components/ui/drag-handle-grip.tsx","../src/components/table-properties/sort-card.tsx","../src/components/table-properties/column-row.tsx","../src/components/table-properties/draggable-list.ts","../src/components/table-properties/drawer.tsx","../src/components/table-properties/drawer-button.tsx","../src/lib/list-page-table-properties.ts","../src/components/data-views/list-page-connected-view-body.tsx","../src/components/data-views/data-row-list.tsx","../src/components/ui/badge.tsx","../src/components/data-views/board-card-primitives.tsx","../src/components/data-views/list-page-board-template.tsx","../src/components/data-views/hub-table.tsx","../src/components/ui/avatar.tsx","../src/components/ui/card.tsx","../src/components/data-views/list-page-board-card.tsx","../src/components/data-views/list-page-tree-column-header.tsx","../src/components/data-views/list-page-split-details-placeholder.tsx","../src/components/ui/list-page-view-frame.tsx","../src/components/data-views/list-page-split-hub-chrome.tsx","../src/components/data-views/list-page-split-hub-tokens.ts","../src/components/ui/resizable.tsx","../src/components/data-views/list-page-tree-panel-shell.tsx","../src/components/data-views/finder-panel-view.tsx","../src/components/data-views/folder-grid-view.tsx","../src/components/ui/collapsible.tsx","../src/components/data-views/outline-tree-menu.tsx","../src/components/data-views/os-folder-glyph.tsx","../src/lib/dev-log.ts","../src/components/ui/form.tsx","../src/components/ui/export-drawer.tsx","../src/components/ui/dialog.tsx","../src/components/ui/view-segmented-control.tsx","../src/components/templates/list-page.tsx","../src/components/templates/nested-secondary-panel-shell.tsx","../src/components/ui/dot-pattern.tsx","../src/components/templates/dedicated-search-landing-template.tsx","../src/components/templates/dedicated-search-results-template.tsx","../src/components/ui/accordion.tsx","../src/components/ui/alert-dialog.tsx","../src/components/ui/banner.tsx","../src/components/ui/breadcrumb.tsx","../src/components/ui/chart.tsx","../src/components/ui/coach-mark.tsx","../src/components/ui/command.tsx","../src/components/ui/context-menu.tsx","../src/components/ui/drawer.tsx","../src/components/ui/hover-card.tsx","../src/components/ui/separator.tsx","../src/components/ui/field.tsx","../src/components/ui/payment-card-fields.tsx","../src/components/ui/key-metrics-context.tsx","../src/components/ui/key-metrics.tsx","../src/components/ui/page-header.tsx","../src/components/ui/scroll-area.tsx","../src/hooks/use-mobile.ts","../src/components/ui/skeleton.tsx","../src/components/ui/sidebar.tsx","../src/components/ui/slider.tsx","../src/components/ui/sonner.tsx","../src/components/ui/status-badge.tsx","../src/components/ui/table.tsx","../src/components/ui/tabs.tsx","../src/components/ui/toggle.tsx","../src/components/ui/toggle-group.tsx","../src/theme/windows-contrast-theme.json","../src/theme/apply-windows-contrast-theme.ts","../src/hooks/use-app-theme.ts","../src/hooks/use-coach-mark.ts"],"names":["React","React2","Input","jsx","TooltipPrimitive","jsxs","React3","React4","Label","LabelPrimitive","cva","React5","Checkbox","motion","CheckboxPrimitive","DropdownMenuPrimitive","React6","PopoverPrimitive","hit","className","props","React7","React8","React9","MaskedInput","hay","React11","SortChevron","Fragment","el","React12","React13","RadioGroupPrimitive","RadioGroupItem","SheetPrimitive","SelectPrimitive","React14","React15","React16","React17","React18","Slot","React19","React20","args","AvatarPrimitive","Separator","React21","CollapsiblePrimitive","React22","React23","DialogPrimitive","React24","React25","React26","AccordionPrimitive","AlertDialogPrimitive","setDismissed","React27","React28","config","createPortal","React29","CommandPrimitive","React30","CommandInput","ContextMenuPrimitive","DrawerPrimitive","HoverCardPrimitive","SeparatorPrimitive","useMemo","React31","React32","memo","React33","MetricCell","ScrollAreaPrimitive","React34","React35","open","SidebarMenuButton","React36","SliderPrimitive","useTheme","Sonner","TabsPrimitive","TogglePrimitive","React37","ToggleGroupPrimitive","useState","useEffect","useCallback","React38"],"mappings":"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","file":"index.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","/**\n * Coalesce many calls to `fn` into one per animation frame.\n *\n * Use for high-frequency layout-reading event handlers (scroll, resize,\n * visualViewport, ResizeObserver) where the work must happen in a frame but\n * doing it on every event call (60+/s for resize, hundreds/s for capture\n * scrolls) wastes layout/paint cycles. The returned function exposes\n * `.cancel()` so effect cleanup can drop a pending frame.\n *\n * Pattern:\n * const apply = () => { ...layout reads + setState... }\n * const scheduled = rafThrottle(apply)\n * window.addEventListener(\"scroll\", scheduled, { passive: true, capture: true })\n * return () => {\n * scheduled.cancel()\n * window.removeEventListener(\"scroll\", scheduled, { capture: true })\n * }\n */\nexport function rafThrottle<TArgs extends unknown[]>(\n fn: (...args: TArgs) => void,\n): ((...args: TArgs) => void) & { cancel: () => void } {\n let rafId = 0\n let lastArgs: TArgs | null = null\n\n const scheduled = ((...args: TArgs) => {\n lastArgs = args\n if (rafId !== 0) return\n rafId = requestAnimationFrame(() => {\n rafId = 0\n const a = lastArgs\n lastArgs = null\n if (a) fn(...a)\n })\n }) as ((...args: TArgs) => void) & { cancel: () => void }\n\n scheduled.cancel = () => {\n if (rafId !== 0) {\n cancelAnimationFrame(rafId)\n rafId = 0\n }\n lastArgs = null\n }\n\n return scheduled\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"group/button inline-flex shrink-0 cursor-pointer items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline:\n \"border-input bg-background hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:bg-input/15 dark:hover:bg-input/25\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost:\n \"hover:bg-interactive-hover hover:text-interactive-hover-foreground aria-expanded:bg-interactive-hover aria-expanded:text-interactive-hover-foreground dark:hover:bg-interactive-hover-subtle\",\n destructive:\n \"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default:\n \"h-9 gap-1.5 px-3 has-data-[icon=inline-end]:pe-2.5 has-data-[icon=inline-start]:ps-2.5\",\n xs: \"h-6 gap-1 px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 px-3 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pe-2 has-data-[icon=inline-start]:ps-2 [&_svg:not([class*='size-'])]:size-3.5\",\n lg: \"h-10 gap-1.5 px-4 has-data-[icon=inline-end]:pe-3.5 has-data-[icon=inline-start]:ps-3.5\",\n icon: \"size-9\",\n \"icon-xs\":\n \"size-6 in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\":\n \"size-8 in-data-[slot=button-group]:rounded-lg\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst Button = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }\n>(({ className, variant = \"default\", size = \"default\", asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size }), className)}\n {...props}\n />\n )\n})\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n function Input({ className, type, ...props }, ref) {\n return (\n <input\n ref={ref}\n type={type}\n data-slot=\"input\"\n className={cn(\n \"h-8 w-full min-w-0 rounded-md border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n },\n)\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Kbd — display keyboard keys and shortcuts (shadcn/ui).\n * @see https://ui.shadcn.com/docs/components/radix/kbd\n *\n * Variants:\n * - \"tile\" (default) — filled tile with border; use in tooltips, menus, docs,\n * or any surface where the Kbd sits on neutral background.\n * - \"bare\" — no background, no border; inherits `currentColor` at 70% opacity.\n * Use **inside buttons** (primary/secondary workflow actions) so the hint\n * does not look like a pasted-on patch against the button fill.\n */\nfunction Kbd({\n className,\n variant = \"tile\",\n \"aria-hidden\": ariaHidden,\n ...props\n}: React.ComponentProps<\"kbd\"> & { variant?: \"tile\" | \"bare\" }) {\n // Bare variant lives inside buttons — the button already carries the\n // accessible name, so the inline kbd is redundant noise for screen readers.\n // Default to aria-hidden unless a consumer explicitly opts in.\n const hidden = ariaHidden ?? (variant === \"bare\" ? true : undefined)\n return (\n <kbd\n data-slot=\"kbd\"\n data-variant={variant}\n aria-hidden={hidden}\n className={cn(\n \"pointer-events-none inline-flex h-5 min-w-5 select-none items-center justify-center gap-1 px-1 font-sans text-xs font-medium\",\n variant === \"tile\" &&\n \"bg-muted text-muted-foreground rounded-sm border\",\n variant === \"bare\" && \"text-current/70 px-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"kbd-group\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nexport { Kbd, KbdGroup }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return (\n <TooltipPrimitive.Provider\n data-slot=\"tooltip-provider\"\n delayDuration={delayDuration}\n {...props}\n />\n )\n}\n\nfunction Tooltip({\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return (\n <TooltipPrimitive.Trigger\n data-slot=\"tooltip-trigger\"\n suppressHydrationWarning\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n )\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-50 inline-flex w-fit max-w-xs origin-(--radix-tooltip-content-transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pe-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","\"use client\"\nimport * as React from \"react\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\"\n\ninterface TipProps {\n /** Plain string or text + `<Kbd />` — see `.cursor/rules/exxat-kbd-shortcuts.mdc` */\n label: React.ReactNode\n children: React.ReactNode\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n}\n\nexport function Tip({ label, children, side = \"top\" }: TipProps) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side={side} className=\"flex flex-wrap items-center gap-1.5\">\n {label}\n </TooltipContent>\n </Tooltip>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\n/** \"⌘\" on Apple platforms, \"Ctrl\" elsewhere — for `Kbd` tooltips. */\nexport function useModKeyLabel() {\n const [mod, setMod] = React.useState(\"⌘\")\n React.useEffect(() => {\n setMod(\n typeof navigator !== \"undefined\" && /Mac|iPhone|iPod|iPad/i.test(navigator.platform)\n ? \"⌘\"\n : \"Ctrl\",\n )\n }, [])\n return mod\n}\n\n/** \"⌥\" on Apple platforms, \"Alt\" elsewhere — pair with `useModKeyLabel` for ⌘⌥ / Ctrl+Alt chords. */\nexport function useAltKeyLabel() {\n const [alt, setAlt] = React.useState(\"⌥\")\n React.useEffect(() => {\n setAlt(\n typeof navigator !== \"undefined\" && /Mac|iPhone|iPod|iPad/i.test(navigator.platform)\n ? \"⌥\"\n : \"Alt\",\n )\n }, [])\n return alt\n}\n","/**\n * True when focus is in a field where global shortcuts should not fire.\n *\n * Mirrors the same skip logic baked into Radix `useShortcut` so global\n * hotkey handlers (export ⌘⇧E, rename F2, etc.) don't steal keystrokes\n * that the user clearly intends for the input. Covers native form\n * fields and any element marked `contenteditable=\"true\"` (richtext\n * editors, comment composers).\n */\nexport function isEditableTarget(target: EventTarget | null): boolean {\n const el = target as HTMLElement | null\n if (!el) return false\n if (\n el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement\n )\n return true\n return el.getAttribute?.(\"contenteditable\") === \"true\"\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Label as LabelPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(function Label({ className, ...props }, ref) {\n return (\n <LabelPrimitive.Root\n ref={ref}\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n})\n\nexport { Label }\n","\"use client\"\n\n/**\n * Checkbox — Radix control + Exxat styling.\n *\n * Aligned with Shadcn Studio checkbox guidance (see shadcnstudio.com/docs/components/checkbox):\n * • Tri-state: `checked={true | false | \"indeterminate\"}` (parent “select some” rows)\n * • Visual variants: default, outline, secondary, success, destructive, warning, muted\n * • Sizes: sm, default, lg\n * • Motion: none | pop | glow | pop-glow — uses `motion-safe` / `motion-reduce` (WCAG 2.3.3)\n * • Forms: `aria-invalid` from Field, `disabled`, extended hit slop (`after:`)\n * • Pair with `CheckboxLabel` + `htmlFor` / `id` for 44px-friendly targets\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\nconst checkboxVariants = cva(\n [\n \"peer relative box-border flex shrink-0 items-center justify-center self-center rounded-[4px] border border-input\",\n \"outline-none transition-[color,box-shadow,transform,background-color,border-color] duration-150\",\n \"motion-reduce:transition-none\",\n \"group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2\",\n \"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary\",\n \"dark:bg-input/15 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary\",\n \"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-primary data-[state=indeterminate]:text-primary-foreground dark:data-[state=indeterminate]:bg-primary dark:data-[state=indeterminate]:text-primary-foreground\",\n ].join(\" \"),\n outline: [\n \"bg-background\",\n \"data-[state=checked]:border-primary data-[state=checked]:bg-background data-[state=checked]:text-primary data-[state=checked]:ring-2 data-[state=checked]:ring-primary/25\",\n \"data-[state=indeterminate]:border-primary data-[state=indeterminate]:bg-background data-[state=indeterminate]:text-primary data-[state=indeterminate]:ring-2 data-[state=indeterminate]:ring-primary/25\",\n ].join(\" \"),\n secondary: [\n \"data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]:text-secondary-foreground\",\n \"data-[state=indeterminate]:border-secondary data-[state=indeterminate]:bg-secondary data-[state=indeterminate]:text-secondary-foreground\",\n ].join(\" \"),\n success: [\n \"data-[state=checked]:border-chart-2 data-[state=checked]:bg-chart-2 data-[state=checked]:text-primary-foreground\",\n \"data-[state=indeterminate]:border-chart-2 data-[state=indeterminate]:bg-chart-2 data-[state=indeterminate]:text-primary-foreground\",\n ].join(\" \"),\n destructive: [\n \"data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]:text-destructive-foreground\",\n \"data-[state=indeterminate]:border-destructive data-[state=indeterminate]:bg-destructive data-[state=indeterminate]:text-destructive-foreground\",\n ].join(\" \"),\n warning: [\n \"data-[state=checked]:border-amber-500 data-[state=checked]:bg-amber-500 data-[state=checked]:text-amber-950\",\n \"data-[state=indeterminate]:border-amber-500 data-[state=indeterminate]:bg-amber-500 data-[state=indeterminate]:text-amber-950\",\n ].join(\" \"),\n muted: [\n \"data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground\",\n \"data-[state=indeterminate]:border-muted-foreground/50 data-[state=indeterminate]:bg-muted data-[state=indeterminate]:text-foreground\",\n ].join(\" \"),\n },\n size: {\n sm: \"size-3.5 max-h-3.5 max-w-3.5 min-h-3.5 min-w-3.5 rounded-[3px] [&_[data-slot=checkbox-indicator]_i]:text-[10px]\",\n default: \"size-4 max-h-4 max-w-4 min-h-4 min-w-4 [&_[data-slot=checkbox-indicator]_i]:text-xs\",\n lg: \"size-5 max-h-5 max-w-5 min-h-5 min-w-5 rounded-[5px] [&_[data-slot=checkbox-indicator]_i]:text-sm\",\n },\n motion: {\n none: \"\",\n pop: [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04] data-[state=indeterminate]:motion-safe:scale-[1.04]\",\n ].join(\" \"),\n glow: [\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"data-[state=indeterminate]:shadow-[0_0_0_3px] data-[state=indeterminate]:shadow-primary/35\",\n ].join(\" \"),\n \"pop-glow\": [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04] data-[state=indeterminate]:motion-safe:scale-[1.04]\",\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"data-[state=indeterminate]:shadow-[0_0_0_3px] data-[state=indeterminate]:shadow-primary/35\",\n ].join(\" \"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n motion: \"none\",\n },\n }\n)\n\nconst checkboxIndicatorVariants = cva(\"grid place-content-center text-current\", {\n variants: {\n motion: {\n none: \"transition-none\",\n pop: \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n glow: \"\",\n \"pop-glow\":\n \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n },\n },\n defaultVariants: {\n motion: \"none\",\n },\n})\n\nexport type CheckboxProps = React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root> &\n VariantProps<typeof checkboxVariants>\n\nconst Checkbox = React.forwardRef<React.ElementRef<typeof CheckboxPrimitive.Root>, CheckboxProps>(\n function Checkbox({ className, variant, size, motion, checked, ...props }, ref) {\n const m = motion ?? \"none\"\n return (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n data-variant={variant ?? \"default\"}\n data-motion={m}\n checked={checked}\n className={cn(checkboxVariants({ variant, size, motion: m }), className)}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className={checkboxIndicatorVariants({ motion: m })}\n >\n {checked === \"indeterminate\" ? (\n <i className=\"fa-solid fa-minus text-current\" aria-hidden=\"true\" />\n ) : (\n <i className=\"fa-solid fa-check text-current\" aria-hidden=\"true\" />\n )}\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n )\n }\n)\n\nexport type CheckboxLabelProps = React.ComponentPropsWithRef<typeof Label>\n\n/** Label tuned for `Checkbox` siblings: larger tap target, respects `peer-disabled`. */\nfunction CheckboxLabel({ className, ...props }: CheckboxLabelProps) {\n return (\n <Label\n data-slot=\"checkbox-label\"\n className={cn(\n \"inline-flex min-h-11 cursor-pointer select-none items-center gap-2 py-1 -my-1 text-sm font-medium leading-snug\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-60\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Checkbox, CheckboxLabel, checkboxVariants }\n","/**\n * Default surface sizing for product dropdown menus (view settings, row ⋯, column menus, etc.).\n *\n * Uses **pure CSS** (`w-max` + `min-w-*` + `max-w-*`) so width follows labels and shortcuts\n * without **ResizeObserver** or layout thrash.\n *\n * Override when you need a fixed rail, for example:\n * - `className=\"w-20\"` — page-size picker in `DataTablePaginated`\n * - `className=\"w-(--radix-dropdown-menu-trigger-width) min-w-60\"` — account / identity menus\n * - `className=\"!w-max min-w-72 …\"` — very wide school/program switcher\n */\nexport const DROPDOWN_MENU_CONTENT_SURFACE_CLASS =\n \"min-w-52 w-max max-w-[min(24rem,calc(100vw-2rem))]\" as const\n","\"use client\"\n\nimport * as React from \"react\"\nimport { DropdownMenu as DropdownMenuPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { DROPDOWN_MENU_CONTENT_SURFACE_CLASS } from \"../../lib/dropdown-menu-surface\"\n\nfunction DropdownMenu({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return (\n <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n )\n}\n\nfunction DropdownMenuTrigger({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return (\n <DropdownMenuPrimitive.Trigger\n data-slot=\"dropdown-menu-trigger\"\n suppressHydrationWarning\n className={cn(\"cursor-pointer\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n align={align}\n className={cn(\n \"z-50 max-h-(--radix-dropdown-menu-content-available-height) origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\nfunction DropdownMenuGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />\n )\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant = \"default\",\n shortcut,\n children,\n asChild,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n /** Visual keyboard-shortcut hint shown on the right of the item (e.g. \"⌘E\", \"F2\").\n * Purely cosmetic — to actually bind the key, render a sibling `<Shortcut keys={…} onInvoke={…} />`\n * in a parent that stays mounted (menu items unmount when the menu closes). */\n shortcut?: string\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset}\n data-variant={variant}\n asChild={asChild}\n className={cn(\n \"group/dropdown-menu-item relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className\n )}\n {...props}\n >\n {asChild ? (\n children\n ) : (\n <>\n {children}\n {shortcut ? <DropdownMenuShortcut>{shortcut}</DropdownMenuShortcut> : null}\n </>\n )}\n </DropdownMenuPrimitive.Item>\n )\n}\n\n/** Invisible component that binds a keyboard shortcut globally while mounted.\n * Pair with `DropdownMenuItem shortcut=\"⌘E\"` for the visual hint. */\nfunction Shortcut({\n keys,\n onInvoke,\n disabled,\n}: {\n keys: string\n onInvoke: (e: KeyboardEvent) => void\n disabled?: boolean\n}) {\n useShortcut(keys, onInvoke, disabled)\n return null\n}\n\nfunction useShortcut(\n keys: string,\n onInvoke: (e: KeyboardEvent) => void,\n disabled?: boolean,\n) {\n const ref = React.useRef(onInvoke)\n React.useEffect(() => { ref.current = onInvoke }, [onInvoke])\n React.useEffect(() => {\n if (disabled) return\n const parsed = parseShortcut(keys)\n if (!parsed) return\n function handler(e: KeyboardEvent) {\n if (!matchesShortcut(e, parsed!)) return\n const t = e.target as HTMLElement | null\n if (t && (t.tagName === \"INPUT\" || t.tagName === \"TEXTAREA\" || t.isContentEditable)) return\n // Skip when the user is activating an interactive control — Enter/Space on a\n // focused button, link, or role=button is already that control's native action.\n // Without this guard, a page-level `Shortcut keys=\"Enter\"` (e.g. the wizard's\n // \"submit on review\") races the button's own click: the Edit / Back / Cancel\n // button runs its handler AND the window listener submits the form on the same\n // keystroke — the classic \"review auto-closes when I click Edit\" bug.\n if (t && (parsed!.key === \"enter\" || parsed!.key === \" \")) {\n const role = t.getAttribute(\"role\")\n if (\n t.tagName === \"BUTTON\" ||\n t.tagName === \"A\" ||\n t.tagName === \"SELECT\" ||\n role === \"button\" ||\n role === \"link\" ||\n role === \"menuitem\" ||\n role === \"tab\" ||\n role === \"option\" ||\n role === \"checkbox\" ||\n role === \"radio\" ||\n role === \"switch\" ||\n t.closest('[role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"tab\"], [role=\"option\"]')\n )\n return\n }\n // If a Radix dialog/sheet/alert-dialog is open, only fire when the event\n // originates inside it — page-level shortcuts must NOT bleed through\n // an open dialog, but in-dialog `<Shortcut>` bindings (Export, Save)\n // still need to fire.\n const openDialog = document.querySelector('[role=\"dialog\"][data-state=\"open\"], [role=\"alertdialog\"][data-state=\"open\"]') as HTMLElement | null\n if (openDialog && (!t || !openDialog.contains(t))) return\n e.preventDefault()\n e.stopPropagation()\n ref.current(e)\n }\n window.addEventListener(\"keydown\", handler)\n return () => window.removeEventListener(\"keydown\", handler)\n }, [keys, disabled])\n}\n\n/* --------------------------------------------------------------------------\n * Shortcut parsing + global binding\n * ------------------------------------------------------------------------ */\n\ntype ParsedShortcut = {\n meta: boolean\n ctrl: boolean\n shift: boolean\n alt: boolean\n key: string // normalized lowercase, or special like \"f2\", \"backspace\", \"delete\", \"enter\", \"escape\", \"arrowup\"…\n}\n\nfunction mapKey(raw: string): string {\n const p = raw.toLowerCase()\n if (raw === \"⌫\") return \"backspace\"\n if (raw === \"⌦\") return \"delete\"\n if (raw === \"⏎\" || p === \"enter\" || p === \"return\") return \"enter\"\n if (raw === \"␣\" || p === \"space\") return \" \"\n if (p === \"esc\" || p === \"escape\") return \"escape\"\n if (p === \"tab\") return \"tab\"\n if (p === \"up\" || raw === \"↑\") return \"arrowup\"\n if (p === \"down\" || raw === \"↓\") return \"arrowdown\"\n if (p === \"left\" || raw === \"←\") return \"arrowleft\"\n if (p === \"right\" || raw === \"→\") return \"arrowright\"\n return p\n}\n\nfunction parseShortcut(input: string): ParsedShortcut | null {\n let s = input.trim()\n if (!s) return null\n const out: ParsedShortcut = { meta: false, ctrl: false, shift: false, alt: false, key: \"\" }\n // Strip leading symbolic modifiers (⌘ ⌃ ⇧ ⌥) which may be glued to the key char.\n while (s.length) {\n const c = s[0]\n if (c === \"⌘\") { out.meta = true; s = s.slice(1) }\n else if (c === \"⌃\") { out.ctrl = true; s = s.slice(1) }\n else if (c === \"⇧\") { out.shift = true; s = s.slice(1) }\n else if (c === \"⌥\") { out.alt = true; s = s.slice(1) }\n else break\n }\n if (!s) return null\n // Word-style modifiers (Cmd+Shift+D, Alt P) joined by + or whitespace.\n if (/[+\\s]/.test(s)) {\n for (const raw of s.split(/[+\\s]+/).filter(Boolean)) {\n const p = raw.toLowerCase()\n if (raw === \"⌘\" || p === \"cmd\" || p === \"meta\" || p === \"command\") out.meta = true\n else if (raw === \"⌃\" || p === \"ctrl\" || p === \"control\") out.ctrl = true\n else if (raw === \"⇧\" || p === \"shift\") out.shift = true\n else if (raw === \"⌥\" || p === \"alt\" || p === \"opt\" || p === \"option\") out.alt = true\n else out.key = mapKey(raw)\n }\n } else {\n out.key = mapKey(s)\n }\n return out.key ? out : null\n}\n\nfunction matchesShortcut(e: KeyboardEvent, s: ParsedShortcut): boolean {\n if (e.metaKey !== s.meta) return false\n if (e.ctrlKey !== s.ctrl) return false\n if (e.altKey !== s.alt) return false\n if (e.shiftKey !== s.shift) return false\n return e.key.toLowerCase() === s.key\n}\n\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4\",\n className\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-checkbox-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction DropdownMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return (\n <DropdownMenuPrimitive.RadioGroup\n data-slot=\"dropdown-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"dropdown-menu-radio-item-indicator\"\n >\n <DropdownMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n )\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:ps-7\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\n \"ms-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DropdownMenuSub({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n suppressHydrationWarning\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([data-product-logo]):not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <i className=\"fa-light fa-chevron-right rtl:rotate-180 ms-auto\" aria-hidden=\"true\" />\n </DropdownMenuPrimitive.SubTrigger>\n )\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n \"z-50 origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n Shortcut,\n useShortcut,\n}\n\nexport { DROPDOWN_MENU_CONTENT_SURFACE_CLASS } from \"../../lib/dropdown-menu-surface\"\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\nimport { cn } from \"../../lib/utils\"\n\nfunction Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root {...props} />\n}\n\nfunction PopoverTrigger({ className, ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {\n return <PopoverPrimitive.Trigger className={cn(\"cursor-pointer\", className)} {...props} />\n}\n\nfunction PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {\n return <PopoverPrimitive.Anchor {...props} />\n}\n\nfunction PopoverContent({\n className,\n align = \"start\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof PopoverPrimitive.Content>) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 rounded-lg border border-border bg-popover shadow-md outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n \"data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2\",\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n )\n}\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger }\n","/**\n * Shared types + design-system constants for the Table Properties drawer\n * and related data-table primitives (filter chips, sort cards,\n * conditional formatting rules).\n *\n * Product-specific seed data (`FILTER_FIELDS` and `COLUMNS` arrays\n * tailored to the Placements hub) intentionally stays in\n * `apps/web/components/table-properties/types.ts` — those values are\n * **product data**, not design-system primitives, and the package must\n * not know about Placement specializations, supervisor labels, etc.\n *\n * Consumers compose their own `FilterFieldDef[]` / `ColDef[]` arrays\n * tailored to their entity (Team members, Compliance items, Question\n * bank rows, …) and pass them into the drawer through props.\n */\n\n/** Comparison operator vocabulary used by every filter row + conditional rule. */\nexport type FilterOperator = \"is\" | \"is_not\" | \"contains\" | \"not_contains\"\n\n/**\n * Input mask for `type: \"text\"` filters. Maps to a\n * [Shadcn Studio input-mask](https://shadcnstudio.com/docs/components/input-mask)\n * pattern key. Add new keys here (and in your concrete `exxatMaskPatterns`\n * map) when a new column needs a structured text format.\n */\nexport type FilterTextMask = \"phone\" | \"zip\" | \"dateMDY\"\n\nexport interface FilterFieldDef {\n key: string\n label: string\n icon: string\n type: \"select\" | \"text\" | \"date\"\n operators: FilterOperator[]\n /** Select options, or for `date` fields used by conditional rules (exact row strings). */\n options?: { value: string; label: string }[]\n /** When `type` is `text`, optional `use-mask-input` pattern for the value field. */\n textMask?: FilterTextMask\n}\n\nexport interface ActiveFilter {\n id: string\n fieldKey: string\n operator: FilterOperator\n values: string[]\n}\n\nexport interface SortRule {\n id: string\n fieldKey: string\n direction: \"asc\" | \"desc\"\n}\n\n/** Operator → human-readable label map (centralized so chips, drawer, and CSV exports stay aligned). */\nexport const OPERATOR_LABELS: Record<FilterOperator, string> = {\n is: \"is\",\n is_not: \"is not\",\n contains: \"contains\",\n not_contains: \"does not contain\",\n}\n\n/** Column descriptor for `TableProperties` views (Columns / Sort / Group panels). */\nexport interface ColDef {\n key: string\n label: string\n sortable: boolean\n sortKey?: string\n minWidth: number\n}\n\n/* ─── Conditional formatting ──────────────────────────────────────────── */\n\nexport interface ConditionalRule {\n id: string\n /** Column key to evaluate */\n fieldKey: string\n operator: FilterOperator\n /** Selected option values (select) or text (single entry) when operator needs values */\n values: string[]\n /** Resolved CSS background color string */\n bgColor: string\n}\n\n/**\n * Predefined palette for conditional rule backgrounds.\n *\n * Backgrounds are exposed as CSS custom properties so theming swaps the\n * palette per brand without code edits (`--conditional-rule-green`,\n * `--conditional-rule-yellow`, etc., declared in\n * `packages/ui/src/globals.css`).\n */\nexport const RULE_COLORS: { name: string; bg: string }[] = [\n { name: \"Green\", bg: \"var(--conditional-rule-green)\" },\n { name: \"Yellow\", bg: \"var(--conditional-rule-yellow)\" },\n { name: \"Blue\", bg: \"var(--conditional-rule-blue)\" },\n { name: \"Red\", bg: \"var(--conditional-rule-red)\" },\n { name: \"Purple\", bg: \"var(--conditional-rule-purple)\" },\n { name: \"Orange\", bg: \"var(--conditional-rule-orange)\" },\n]\n","import type {\n ConditionalRule,\n FilterTextMask,\n} from \"./table-properties-types\"\n\n/**\n * Conditional-formatting matchers shared by `DataTable` cells,\n * `data-row-list` rows, and board card backgrounds. Keeping the logic\n * here ensures the table grid and the list / board derivatives all\n * paint the same row with the same rule (no UI drift between views).\n *\n * `columns` is optional and only used when the consumer needs to:\n * - read from a different row key than the rule's `fieldKey`\n * (`sortKey`-aliased columns), or\n * - apply a `textMask` (phone / zip) so \"contains 555\" matches the\n * raw digits of \"(415) 555-0100\".\n */\n\nexport type ConditionalColumnHint = {\n key: string\n sortKey?: string\n filter?: { type?: string; textMask?: FilterTextMask }\n}\n\nfunction rowValueForRule<T extends Record<string, unknown>>(\n row: T,\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): string {\n const col = columns?.find((c) => c.key === rule.fieldKey)\n const dataKey = (col?.sortKey ?? rule.fieldKey) as keyof T\n return String(row[dataKey] ?? \"\")\n}\n\nfunction ruleHasActiveValues(\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): boolean {\n if (rule.values.length === 0) return false\n const col = columns?.find((c) => c.key === rule.fieldKey)\n if (col?.filter?.type === \"text\")\n return (rule.values[0] ?? \"\").trim().length > 0\n return true\n}\n\nfunction conditionalTextMatches(\n cellVal: string,\n needle: string,\n op: \"contains\" | \"not_contains\",\n textMask: FilterTextMask | undefined,\n) {\n const v = cellVal.trim()\n const n = needle.trim()\n if (!n) return op === \"not_contains\"\n if (textMask === \"phone\" || textMask === \"zip\") {\n const nd = n.replace(/\\D/g, \"\")\n const hay = v.replace(/\\D/g, \"\")\n if (!nd) return op === \"not_contains\"\n const hit = hay.includes(nd)\n return op === \"contains\" ? hit : !hit\n }\n const hit = v.toLowerCase().includes(n.toLowerCase())\n return op === \"contains\" ? hit : !hit\n}\n\n/** Whether a conditional rule matches a row (same logic as DataTable cells). */\nexport function conditionalRuleMatchesRow<T extends Record<string, unknown>>(\n row: T,\n rule: ConditionalRule,\n columns?: ConditionalColumnHint[],\n): boolean {\n if (!ruleHasActiveValues(rule, columns)) return false\n const v = rowValueForRule(row, rule, columns).trim()\n const col = columns?.find((c) => c.key === rule.fieldKey)\n const textMask =\n col?.filter?.type === \"text\" ? col.filter.textMask : undefined\n switch (rule.operator) {\n case \"is\":\n return rule.values.includes(v)\n case \"is_not\":\n return !rule.values.includes(v)\n case \"contains\":\n return rule.values.some((val) =>\n conditionalTextMatches(v, val, \"contains\", textMask),\n )\n case \"not_contains\":\n return !rule.values.some((val) =>\n conditionalTextMatches(v, val, \"contains\", textMask),\n )\n default:\n return false\n }\n}\n\n/** First matching conditional rule background for a row (list/board row tint). */\nexport function getConditionalRowBackground<T extends Record<string, unknown>>(\n row: T,\n rules: ConditionalRule[] | undefined,\n columns?: ConditionalColumnHint[],\n): string | undefined {\n if (!rules?.length) return undefined\n for (const rule of rules) {\n if (conditionalRuleMatchesRow(row, rule, columns)) return rule.bgColor\n }\n return undefined\n}\n\n/** Background for one table cell from conditional rules on that column. */\nexport function getConditionalCellBackground<T extends Record<string, unknown>>(\n row: T,\n colKey: string,\n rules: ConditionalRule[] | undefined,\n columns?: ConditionalColumnHint[],\n): string | undefined {\n if (!rules?.length) return undefined\n const rule = rules.find((r) => r.fieldKey === colKey)\n if (!rule || !conditionalRuleMatchesRow(row, rule, columns)) return undefined\n return rule.bgColor\n}\n","/**\n * Format any date string (ISO, MM/DD/YYYY, \"Mar 15 2026\", etc.) into the\n * app-wide display format: MM/DD/YYYY.\n * Returns \"—\" for empty / unparseable values.\n */\nexport function formatDateUS(raw: string | null | undefined): string {\n if (!raw || raw.trim() === \"—\" || raw.trim() === \"-\") return \"—\"\n // Already MM/DD/YYYY — return as-is\n if (/^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(raw.trim())) return raw.trim()\n const d = new Date(raw)\n if (Number.isNaN(d.getTime())) return raw\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n const y = d.getFullYear()\n return `${m}/${day}/${y}`\n}\n\n/** Format a `Date` with local calendar fields as MM/DD/YYYY (avoids UTC drift from `toISOString()`). */\nexport function formatDateFromDate(raw: Date | null | undefined): string {\n if (!raw || Number.isNaN(raw.getTime())) return \"—\"\n const m = String(raw.getMonth() + 1).padStart(2, \"0\")\n const day = String(raw.getDate()).padStart(2, \"0\")\n const y = raw.getFullYear()\n return `${m}/${day}/${y}`\n}\n\n/**\n * Format a Date (or ISO string) into \"MM/DD/YYYY hh:mm AM/PM EST\".\n * Time zone label is always appended as the literal string \"EST\" (display only).\n */\nexport function formatDateTimeUS(raw: Date | string | null | undefined): string {\n if (!raw) return \"—\"\n const d = raw instanceof Date ? raw : new Date(raw)\n if (Number.isNaN(d.getTime())) return String(raw)\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n const y = d.getFullYear()\n let h = d.getHours()\n const min = String(d.getMinutes()).padStart(2, \"0\")\n const ampm = h >= 12 ? \"PM\" : \"AM\"\n h = h % 12 || 12\n return `${m}/${day}/${y} ${String(h).padStart(2, \"0\")}:${min} ${ampm} EST`\n}\n\n/** Parse a human-readable date string into YYYY-MM-DD for comparison (local timezone). */\nexport function parseRowDateToYmd(raw: string): string | null {\n const t = raw.trim()\n if (!t || t === \"—\" || t === \"-\") return null\n const d = new Date(t)\n if (Number.isNaN(d.getTime())) return null\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n return `${y}-${m}-${day}`\n}\n\n/** Format YYYY-MM-DD for filter chip labels (MM/DD/YYYY). */\nexport function formatYmdForDisplay(ymd: string): string {\n const d = ymdToLocalDate(ymd)\n if (!d) return ymd\n return formatDateFromDate(d)\n}\n\n/** Local noon to avoid timezone shifting the calendar day. */\nexport function ymdToLocalDate(ymd: string | undefined): Date | undefined {\n if (!ymd || !/^\\d{4}-\\d{2}-\\d{2}$/.test(ymd)) return undefined\n const [y, m, d] = ymd.split(\"-\").map(Number)\n return new Date(y, m - 1, d, 12, 0, 0, 0)\n}\n\nexport function localDateToYmd(d: Date): string {\n const y = d.getFullYear()\n const m = String(d.getMonth() + 1).padStart(2, \"0\")\n const day = String(d.getDate()).padStart(2, \"0\")\n return `${y}-${m}-${day}`\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport {\n ChevronDownIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n} from \"lucide-react\"\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n} from \"react-day-picker\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button, buttonVariants } from \"./button\"\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n buttonVariant = \"ghost\",\n formatters,\n components,\n ...props\n}: React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"]\n}) {\n const defaultClassNames = getDefaultClassNames()\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n \"group/calendar bg-background p-3 [--cell-size:--spacing(8)] [[data-slot=card-content]_&]:bg-transparent [[data-slot=popover-content]_&]:bg-transparent\",\n String.raw`rtl:**:[.rdp-button\\_next>svg]:rotate-180`,\n String.raw`rtl:**:[.rdp-button\\_previous>svg]:rotate-180`,\n className\n )}\n captionLayout={captionLayout}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n months: cn(\n \"relative flex flex-col gap-4 md:flex-row\",\n defaultClassNames.months\n ),\n month: cn(\"flex w-full flex-col gap-4\", defaultClassNames.month),\n nav: cn(\n \"absolute inset-x-0 top-0 flex w-full items-center justify-between gap-1\",\n defaultClassNames.nav\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_previous\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant }),\n \"size-(--cell-size) p-0 select-none aria-disabled:opacity-50\",\n defaultClassNames.button_next\n ),\n month_caption: cn(\n \"flex h-(--cell-size) w-full items-center justify-center px-(--cell-size)\",\n defaultClassNames.month_caption\n ),\n dropdowns: cn(\n \"flex h-(--cell-size) w-full items-center justify-center gap-1.5 text-sm font-medium\",\n defaultClassNames.dropdowns\n ),\n dropdown_root: cn(\n \"relative rounded-md border border-input shadow-xs has-focus:border-ring has-focus:ring-[3px] has-focus:ring-ring/50\",\n defaultClassNames.dropdown_root\n ),\n dropdown: cn(\n \"absolute inset-0 bg-popover opacity-0\",\n defaultClassNames.dropdown\n ),\n caption_label: cn(\n \"font-medium select-none\",\n captionLayout === \"label\"\n ? \"text-sm\"\n : \"flex h-8 items-center gap-1 rounded-md pe-1 ps-2 text-sm [&>svg]:size-3.5 [&>svg]:text-muted-foreground\",\n defaultClassNames.caption_label\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n \"flex-1 rounded-md text-[0.8rem] font-normal text-muted-foreground select-none\",\n defaultClassNames.weekday\n ),\n week: cn(\"mt-2 flex w-full\", defaultClassNames.week),\n week_number_header: cn(\n \"w-(--cell-size) select-none\",\n defaultClassNames.week_number_header\n ),\n week_number: cn(\n \"text-[0.8rem] text-muted-foreground select-none\",\n defaultClassNames.week_number\n ),\n day: cn(\n \"group/day relative aspect-square h-full w-full p-0 text-center select-none [&:last-child[data-selected=true]_button]:rounded-r-md\",\n props.showWeekNumber\n ? \"[&:nth-child(2)[data-selected=true]_button]:rounded-l-md\"\n : \"[&:first-child[data-selected=true]_button]:rounded-l-md\",\n defaultClassNames.day\n ),\n range_start: cn(\n \"rounded-l-md bg-accent\",\n defaultClassNames.range_start\n ),\n range_middle: cn(\"rounded-none\", defaultClassNames.range_middle),\n range_end: cn(\"rounded-r-md bg-accent\", defaultClassNames.range_end),\n today: cn(\n \"rounded-md bg-accent text-accent-foreground data-[selected=true]:rounded-none\",\n defaultClassNames.today\n ),\n outside: cn(\n \"text-muted-foreground aria-selected:text-muted-foreground\",\n defaultClassNames.outside\n ),\n disabled: cn(\n \"text-muted-foreground opacity-50\",\n defaultClassNames.disabled\n ),\n hidden: cn(\"invisible\", defaultClassNames.hidden),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n )\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <ChevronLeftIcon className={cn(\"size-4\", className)} {...props} />\n )\n }\n\n if (orientation === \"right\") {\n return (\n <ChevronRightIcon\n className={cn(\"size-4\", className)}\n {...props}\n />\n )\n }\n\n return (\n <ChevronDownIcon className={cn(\"size-4\", className)} {...props} />\n )\n },\n DayButton: CalendarDayButton,\n WeekNumber: ({ children, ...props }) => {\n return (\n <td {...props}>\n <div className=\"flex size-(--cell-size) items-center justify-center text-center\">\n {children}\n </div>\n </td>\n )\n },\n ...components,\n }}\n {...props}\n />\n )\n}\n\nfunction CalendarDayButton({\n className,\n day,\n modifiers,\n ...props\n}: React.ComponentProps<typeof DayButton>) {\n const defaultClassNames = getDefaultClassNames()\n\n const ref = React.useRef<HTMLButtonElement>(null)\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus()\n }, [modifiers.focused])\n\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"icon\"\n data-day={day.date.toLocaleDateString()}\n data-selected-single={\n modifiers.selected &&\n !modifiers.range_start &&\n !modifiers.range_end &&\n !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n className={cn(\n \"flex aspect-square size-auto w-full min-w-(--cell-size) flex-col gap-1 leading-none font-normal group-data-[focused=true]/day:relative group-data-[focused=true]/day:z-10 group-data-[focused=true]/day:border-ring group-data-[focused=true]/day:ring-[3px] group-data-[focused=true]/day:ring-ring/50 data-[range-end=true]:rounded-md data-[range-end=true]:rounded-r-md data-[range-end=true]:bg-primary data-[range-end=true]:text-primary-foreground data-[range-middle=true]:rounded-none data-[range-middle=true]:bg-accent data-[range-middle=true]:text-accent-foreground data-[range-start=true]:rounded-md data-[range-start=true]:rounded-l-md data-[range-start=true]:bg-primary data-[range-start=true]:text-primary-foreground data-[selected-single=true]:bg-primary data-[selected-single=true]:text-primary-foreground dark:hover:text-accent-foreground [&>span]:text-xs [&>span]:opacity-70\",\n defaultClassNames.day,\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Calendar, CalendarDayButton }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Calendar } from \"../ui/calendar\"\nimport { localDateToYmd, ymdToLocalDate } from \"../../lib/date-filter\"\n\n/** Single-date calendar for table filters (YYYY-MM-DD). */\nexport function FilterDateCalendar({\n valueYmd,\n onChangeYmd,\n label,\n}: {\n valueYmd: string | undefined\n onChangeYmd: (ymd: string | undefined) => void\n label: string\n}) {\n const [timeZone, setTimeZone] = React.useState<string | undefined>()\n React.useEffect(() => {\n setTimeZone(Intl.DateTimeFormat().resolvedOptions().timeZone)\n }, [])\n\n return (\n <div\n className=\"rounded-lg border border-border overflow-hidden\"\n role=\"group\"\n aria-label={label}\n >\n <Calendar\n mode=\"single\"\n selected={ymdToLocalDate(valueYmd)}\n onSelect={(d) => onChangeYmd(d ? localDateToYmd(d) : undefined)}\n captionLayout=\"dropdown\"\n timeZone={timeZone}\n className=\"rounded-lg border-0\"\n />\n </div>\n )\n}\n","import * 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 \"flex min-h-[80px] w-full rounded-md border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Textarea }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Textarea } from \"./textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group relative flex h-8 w-full min-w-0 items-center rounded-md border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 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-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pe-1.5 has-[>[data-align=inline-start]]:[&>input]:ps-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first ps-2 has-[>button]:ms-[-0.3rem] has-[>kbd]:ms-[-0.15rem]\",\n \"inline-end\":\n \"order-last pe-2 has-[>button]:me-[-0.3rem] has-[>kbd]:me-[-0.15rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2\",\n \"block-end\":\n \"order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2\",\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 \"flex items-center gap-2 text-sm shadow-none\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*='size-'])]:size-3.5\",\n sm: \"\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 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\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\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 \"flex items-center gap-2 text-sm text-muted-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\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(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\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(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","import * as React from \"react\"\n\n/** Merges multiple refs (callback or object) for the same DOM node — e.g. RHF `field.ref` + mask ref. */\nexport function composeRefs<T>(...refs: (React.Ref<T> | undefined)[]): React.RefCallback<T> {\n return node => {\n for (const ref of refs) {\n if (ref == null) continue\n if (typeof ref === \"function\") {\n ref(node)\n } else {\n ;(ref as React.MutableRefObject<T | null>).current = node\n }\n }\n }\n}\n","\"use client\"\n\n/**\n * Input masking — aligned with [Shadcn Studio input-mask](https://shadcnstudio.com/docs/components/input-mask):\n * `use-mask-input` for phone / date / time / custom / zip; use `PaymentCardFields` for card flows.\n */\n\nimport * as React from \"react\"\nimport {\n useMaskInput,\n withMask,\n useHookFormMask,\n withHookFormMask,\n useTanStackFormMask,\n withTanStackFormMask,\n} from \"use-mask-input\"\nimport type { Mask, Options } from \"use-mask-input\"\n\nimport { composeRefs } from \"../../lib/compose-refs\"\n\nexport { composeRefs } from \"../../lib/compose-refs\"\nimport { cn } from \"../../lib/utils\"\nimport { Input } from \"./input\"\n\n/** Default mask UX per Shadcn Studio demos (underscore placeholder, no hover mask). */\nexport const exxatInputMaskDefaults: Options = {\n placeholder: \"_\",\n showMaskOnHover: false,\n}\n\n/** Common patterns (Inputmask `9` = digit, `a` = letter, `*` = alnum). */\nexport const exxatMaskPatterns = {\n /** US NANP 10-digit display */\n phoneUS: \"(999) 999-9999\",\n /** US ZIP or ZIP+4 */\n zipUS: \"99999[-9999]\",\n /** Calendar-style date (validate separately). */\n dateMDY: \"99/99/9999\",\n /** Studio input-mask-01 style — UK-style plate-ish token; adjust per product. */\n customReference: \"AA99 AAA\",\n} as const satisfies Record<string, Mask>\n\nexport function exxatTimeMaskOptions(): Options & {\n inputFormat: string\n outputFormat: string\n} {\n return {\n ...exxatInputMaskDefaults,\n inputFormat: \"HH:MM:ss\",\n outputFormat: \"HH:MM:ss\",\n }\n}\n\nexport function useExxatPhoneMask(options?: Options) {\n return useMaskInput({\n mask: exxatMaskPatterns.phoneUS,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\nexport function useExxatZipMask(options?: Options) {\n return useMaskInput({\n mask: exxatMaskPatterns.zipUS,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\nexport function useExxatDateMDYMask(options?: Options) {\n return useMaskInput({\n mask: exxatMaskPatterns.dateMDY,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\nexport function useExxatTimeMask(options?: Options) {\n return useMaskInput({\n mask: \"datetime\",\n options: { ...exxatTimeMaskOptions(), ...options },\n })\n}\n\nexport function useExxatCustomMask(mask: Mask, options?: Options) {\n return useMaskInput({\n mask,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n}\n\n/** Merge React Hook Form Controller `field.ref` with a mask ref. */\nexport function useExxatMaskedFieldRef(\n fieldRef: React.Ref<HTMLInputElement>,\n mask: Mask,\n options?: Options\n): React.RefCallback<HTMLInputElement> {\n const maskRef = useMaskInput({\n mask,\n options: { ...exxatInputMaskDefaults, ...options },\n })\n return React.useMemo(() => composeRefs(fieldRef, maskRef), [fieldRef, maskRef])\n}\n\nexport type MaskedInputProps = React.ComponentProps<typeof Input> & {\n mask: Mask\n maskOptions?: Options\n}\n\n/** Standalone masked `Input` (forwardRef + merged mask ref). */\nconst MaskedInput = React.forwardRef<HTMLInputElement, MaskedInputProps>(function MaskedInput(\n { mask, maskOptions, className, type = \"text\", ...props },\n ref\n) {\n const maskRef = useMaskInput({\n mask,\n options: { ...exxatInputMaskDefaults, ...maskOptions },\n })\n return (\n <Input\n ref={composeRefs(ref, maskRef)}\n type={type}\n className={cn(className)}\n {...props}\n />\n )\n})\n\nexport {\n MaskedInput,\n useMaskInput,\n withMask,\n useHookFormMask,\n withHookFormMask,\n useTanStackFormMask,\n withTanStackFormMask,\n}\nexport type { Mask, Options }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { formatDateFromDate } from \"../../lib/date-filter\"\nimport { Button } from \"./button\"\nimport { Calendar } from \"./calendar\"\nimport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n} from \"./input-group\"\nimport { MaskedInput, exxatMaskPatterns } from \"./input-mask\"\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"./popover\"\n\nexport const DATE_PICKER_ICON_CLASS = \"fa-light fa-calendar\"\n\nexport interface DatePickerFieldProps {\n value: Date | undefined\n onChange: (d: Date | undefined) => void\n id?: string\n disabled?: boolean\n /** Passed to the trigger `Button` (e.g. `h-8 text-sm` in compact drawers). */\n triggerClassName?: string\n fromYear?: number\n toYear?: number\n popoverAlign?: \"start\" | \"center\" | \"end\"\n popoverClassName?: string\n}\n\n/**\n * Calendar + popover trigger — same pattern as New Placement schedule dates (WCAG: button exposes label, not raw text input).\n */\nexport function DatePickerField({\n value,\n onChange,\n id,\n disabled,\n triggerClassName,\n fromYear = 2020,\n toYear = 2032,\n popoverAlign = \"start\",\n popoverClassName,\n}: DatePickerFieldProps) {\n return (\n <Popover>\n <PopoverTrigger asChild>\n <Button\n id={id}\n type=\"button\"\n variant=\"outline\"\n disabled={disabled}\n className={cn(\n \"w-full justify-start text-start font-normal\",\n triggerClassName,\n )}\n aria-label={value ? formatDateFromDate(value) : \"Pick a date\"}\n >\n <i className={cn(DATE_PICKER_ICON_CLASS, \"me-2 shrink-0 text-muted-foreground\")} aria-hidden=\"true\" />\n <span className={cn(!value && \"text-muted-foreground\")}>\n {value ? formatDateFromDate(value) : \"MM/DD/YYYY\"}\n </span>\n </Button>\n </PopoverTrigger>\n <PopoverContent className={cn(\"z-[80] w-auto p-0\", popoverClassName)} align={popoverAlign}>\n <Calendar\n mode=\"single\"\n selected={value}\n onSelect={onChange}\n initialFocus\n fromYear={fromYear}\n toYear={toYear}\n captionLayout=\"dropdown\"\n />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport interface DateTextInputFieldProps {\n value: string\n onValueChange: (value: string) => void\n \"aria-label\": string\n id?: string\n placeholder?: string\n className?: string\n inputClassName?: string\n autoFocus?: boolean\n disabled?: boolean\n fromYear?: number\n toYear?: number\n iconButtonVariant?: \"ghost\" | \"outline\"\n popoverAlign?: \"start\" | \"center\" | \"end\"\n popoverClassName?: string\n}\n\nfunction parseMdyToLocalDate(raw: string): Date | undefined {\n const match = raw.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/)\n if (!match) return undefined\n const month = Number(match[1])\n const day = Number(match[2])\n const year = Number(match[3])\n if (month < 1 || month > 12 || day < 1 || day > 31) return undefined\n const date = new Date(year, month - 1, day, 12, 0, 0, 0)\n if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) return undefined\n return date\n}\n\nfunction formatLocalDateToMdy(date: Date): string {\n const month = String(date.getMonth() + 1).padStart(2, \"0\")\n const day = String(date.getDate()).padStart(2, \"0\")\n const year = String(date.getFullYear())\n return `${month}/${day}/${year}`\n}\n\nexport function DateTextInputField({\n value,\n onValueChange,\n \"aria-label\": ariaLabel,\n id,\n placeholder = \"MM/DD/YYYY\",\n className,\n inputClassName,\n autoFocus,\n disabled,\n fromYear = 2020,\n toYear = 2032,\n iconButtonVariant = \"ghost\",\n popoverAlign = \"end\",\n popoverClassName,\n}: DateTextInputFieldProps) {\n return (\n <InputGroup className={className}>\n <MaskedInput\n data-slot=\"input-group-control\"\n id={id}\n mask={exxatMaskPatterns.dateMDY}\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={value}\n onChange={(event) => onValueChange(event.target.value)}\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent\",\n inputClassName,\n )}\n autoFocus={autoFocus}\n disabled={disabled}\n />\n <InputGroupAddon align=\"inline-end\">\n <Popover>\n <PopoverTrigger asChild>\n <InputGroupButton\n type=\"button\"\n variant={iconButtonVariant}\n size=\"icon-xs\"\n disabled={disabled}\n aria-label={`${ariaLabel} pick date`}\n >\n <i className={DATE_PICKER_ICON_CLASS} aria-hidden=\"true\" />\n </InputGroupButton>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\"z-[80] w-auto p-0\", popoverClassName)}\n align={popoverAlign}\n sideOffset={6}\n >\n <Calendar\n mode=\"single\"\n selected={parseMdyToLocalDate(value)}\n onSelect={(next) => onValueChange(next ? formatLocalDateToMdy(next) : \"\")}\n initialFocus\n fromYear={fromYear}\n toYear={toYear}\n captionLayout=\"dropdown\"\n />\n </PopoverContent>\n </Popover>\n </InputGroupAddon>\n </InputGroup>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { DateTextInputField } from \"../ui/date-picker-field\"\nimport { Input } from \"../ui/input\"\nimport { MaskedInput, exxatMaskPatterns } from \"../ui/input-mask\"\nimport type { Mask } from \"../ui/input-mask\"\nimport type { FilterTextMask } from \"../../lib/table-properties-types\"\n\nconst MASK_BY_KIND: Record<FilterTextMask, Mask> = {\n phone: exxatMaskPatterns.phoneUS,\n zip: exxatMaskPatterns.zipUS,\n dateMDY: exxatMaskPatterns.dateMDY,\n}\n\nexport function FilterTextValueInput({\n id,\n mask,\n value,\n onValueChange,\n \"aria-label\": ariaLabel,\n placeholder,\n className,\n autoFocus,\n}: {\n id?: string\n mask?: FilterTextMask\n value: string\n onValueChange: (next: string) => void\n \"aria-label\": string\n placeholder?: string\n className?: string\n autoFocus?: boolean\n}) {\n if (mask === \"dateMDY\") {\n return (\n <DateTextInputField\n id={id}\n value={value}\n onValueChange={onValueChange}\n aria-label={ariaLabel}\n placeholder={placeholder}\n inputClassName={className}\n autoFocus={autoFocus}\n iconButtonVariant=\"ghost\"\n popoverAlign=\"end\"\n />\n )\n }\n\n if (mask) {\n return (\n <MaskedInput\n id={id}\n mask={MASK_BY_KIND[mask]}\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={value}\n onChange={e => onValueChange(e.target.value)}\n className={className}\n autoFocus={autoFocus}\n />\n )\n }\n return (\n <Input\n id={id}\n type=\"text\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={value}\n onChange={e => onValueChange(e.target.value)}\n className={className}\n autoFocus={autoFocus}\n />\n )\n}\n","\"use client\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useTableState — all non-display state shared by DataTable and DataTablePaginated\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport * as React from \"react\"\nimport type { RowHeight } from \"../../lib/row-height\"\nimport type { ColumnDef, SortDir } from \"./types\"\nimport type { ActiveFilter, FilterOperator, SortRule } from \"../../lib/table-properties-types\"\nimport { parseRowDateToYmd } from \"../../lib/date-filter\"\n\nlet _filterId = 0\nfunction nextFilterId() { return `f-${++_filterId}` }\n\n/**\n * “Reflow” / high-zoom short viewport. At 200% zoom a 1080p monitor’s CSS\n * height is ≈ 540px — `500px` was too low and never disabled pins. 640px\n * catches typical 200% cases and small laptop tops without breaking `500px` flows.\n * Column stickies + edge shadows harm reflow (WCAG 1.4.10).\n */\nconst REFLOW_VIEWPORT_MQ = \"(max-height: 640px)\"\n\nfunction subscribeReflowViewport(callback: () => void) {\n if (typeof window === \"undefined\") return () => {}\n const mql = window.matchMedia(REFLOW_VIEWPORT_MQ)\n mql.addEventListener(\"change\", callback)\n return () => mql.removeEventListener(\"change\", callback)\n}\nfunction getReflowViewportSnapshot() {\n if (typeof window === \"undefined\") return false\n return window.matchMedia(REFLOW_VIEWPORT_MQ).matches\n}\nfunction getServerReflowViewportSnapshot() {\n return false\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction digitsOnly(s: string): string {\n return s.replace(/\\D/g, \"\")\n}\n\n/** Build the default widths map from column defs */\nfunction buildDefaultWidths<TData>(columns: ColumnDef<TData>[]): Record<string, number> {\n const map: Record<string, number> = {}\n for (const col of columns) {\n if (col.width !== undefined) map[col.key] = col.width\n }\n return map\n}\n\n/** Build the initial pin state from column defs */\nfunction buildDefaultPins<TData>(columns: ColumnDef<TData>[]): Record<string, \"left\" | \"right\"> {\n const map: Record<string, \"left\" | \"right\"> = {}\n for (const col of columns) {\n if (col.defaultPin) map[col.key] = col.defaultPin\n }\n return map\n}\n\nfunction compareUnknownSort(a: unknown, b: unknown): number {\n if (a === b) return 0\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n if (typeof a === \"number\" && typeof b === \"number\") return a < b ? -1 : a > b ? 1 : 0\n if (typeof a === \"string\" && typeof b === \"string\") return a < b ? -1 : a > b ? 1 : 0\n const as = String(a)\n const bs = String(b)\n return as < bs ? -1 : as > bs ? 1 : 0\n}\n\n/** Build the locked-pin set (columns that can never be unpinned) */\nfunction buildLockedPins<TData>(columns: ColumnDef<TData>[]): Record<string, \"left\" | \"right\"> {\n const map: Record<string, \"left\" | \"right\"> = {}\n for (const col of columns) {\n if (col.lockPin && col.defaultPin) map[col.key] = col.defaultPin\n }\n return map\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function useTableState<TData extends Record<string, unknown>>(\n data: TData[],\n columns: ColumnDef<TData>[],\n defaultSort?: { key: string; dir: SortDir },\n paginationOverride?: { page: number; pageSize: number },\n /**\n * When defined (including `\"\"`), toolbar search is synced from the URL (`?q=`).\n * Use `searchParams.get(\"q\") ?? \"\"` on question bank list routes; omit for other hubs.\n */\n syncedSearchFromUrl?: string,\n) {\n // ── Sort ──────────────────────────────────────────────────────────────────\n const [sortRules, setSortRules] = React.useState<SortRule[]>(() => {\n if (defaultSort) {\n return [{ id: \"sort-default\", fieldKey: defaultSort.key, direction: defaultSort.dir }]\n }\n return []\n })\n\n const primarySort = sortRules[0] ?? null\n const sortKey: string = primarySort?.fieldKey ?? \"\"\n const sortDir: SortDir = primarySort?.direction ?? \"asc\"\n\n const addSortRule = React.useCallback((fieldKey: string) => {\n setSortRules(prev => {\n if (prev.some(r => r.fieldKey === fieldKey)) return prev\n // New drawer sorts are primary (same as column-header sort), not trailing.\n return [{ id: `sort-${Date.now()}`, fieldKey, direction: \"asc\" }, ...prev]\n })\n }, [setSortRules])\n\n const removeSortRule = React.useCallback((id: string) => {\n setSortRules(prev => prev.filter(r => r.id !== id))\n }, [setSortRules])\n\n const toggleSortDir = React.useCallback((id: string) => {\n setSortRules(prev => prev.map(r =>\n r.id === id ? { ...r, direction: r.direction === \"asc\" ? \"desc\" : \"asc\" } : r\n ))\n }, [setSortRules])\n\n const handleSortByKey = React.useCallback((colKey: string) => {\n setSortRules(prev => {\n const idx = prev.findIndex(r => r.fieldKey === colKey)\n if (idx === 0) {\n return prev.map((r, i) => i === 0 ? { ...r, direction: r.direction === \"asc\" ? \"desc\" : \"asc\" } : r)\n }\n const filtered = prev.filter(r => r.fieldKey !== colKey)\n return [{ id: `sort-${Date.now()}`, fieldKey: colKey, direction: \"asc\" }, ...filtered]\n })\n }, [setSortRules])\n\n // ── Filters ───────────────────────────────────────────────────────────────\n const [search, setSearch] = React.useState(() =>\n syncedSearchFromUrl !== undefined ? syncedSearchFromUrl.trim() : \"\",\n )\n const [searchOpen, setSearchOpen] = React.useState(() =>\n syncedSearchFromUrl !== undefined && Boolean(syncedSearchFromUrl.trim()),\n )\n const searchRef = React.useRef<HTMLInputElement>(null)\n const [activeFilters, setActiveFilters] = React.useState<ActiveFilter[]>([])\n const [filterConnectors, setFilterConnectors] = React.useState<Record<string, \"and\" | \"or\">>({})\n const [openFilterId, setOpenFilterId] = React.useState<string | null>(null)\n const [filterBarVisible, setFilterBarVisible] = React.useState(true)\n const [drawerExpandedFilters, setDrawerExpandedFilters] = React.useState<Set<string>>(new Set())\n\n React.useEffect(() => {\n if (syncedSearchFromUrl === undefined) return\n const next = syncedSearchFromUrl.trim()\n setSearch(next)\n setSearchOpen(next.length > 0)\n }, [syncedSearchFromUrl])\n\n const toggleConnector = React.useCallback((leftId: string) => {\n setFilterConnectors(prev => ({ ...prev, [leftId]: prev[leftId] === \"or\" ? \"and\" : \"or\" }))\n }, [setFilterConnectors])\n\n function getConnector(leftId: string): \"and\" | \"or\" {\n return filterConnectors[leftId] ?? \"and\"\n }\n\n const addFilter = React.useCallback((fieldKey: string, fromDrawer = false) => {\n const col = columns.find(c => c.key === fieldKey)\n if (!col?.filter) return\n const id = nextFilterId()\n const f = col.filter\n const firstOperator: FilterOperator = (() => {\n if (f.type === \"select\" || f.type === \"date\") {\n const pick = f.operators?.find(o => o === \"is\" || o === \"is_not\")\n return pick ?? \"is\"\n }\n return f.operators?.[0] ?? \"contains\"\n })()\n const newFilter: ActiveFilter = { id, fieldKey, operator: firstOperator, values: [] }\n setActiveFilters(prev => [...prev, newFilter])\n if (fromDrawer) {\n setDrawerExpandedFilters(() => new Set([id]))\n // Keep toolbar pills hidden until a value is chosen — avoids mounting every\n // FilterPill (heavy) on each drawer \"Add filter\" click.\n } else {\n setOpenFilterId(id)\n setFilterBarVisible(true)\n }\n }, [columns, setActiveFilters, setDrawerExpandedFilters, setOpenFilterId, setFilterBarVisible])\n\n const updateFilter = React.useCallback((id: string, patch: Partial<ActiveFilter>) => {\n let shouldShowFilterBar = false\n setActiveFilters(prev => {\n const next = prev.map(f => {\n if (f.id !== id) return f\n const merged = { ...f, ...patch }\n const col = columns.find(c => c.key === merged.fieldKey)\n if (merged.values.length > 0) {\n shouldShowFilterBar =\n col?.filter?.type === \"text\"\n ? (merged.values[0] ?? \"\").trim().length > 0\n : true\n }\n return merged\n })\n return next\n })\n if (shouldShowFilterBar) setFilterBarVisible(true)\n }, [columns, setActiveFilters, setFilterBarVisible])\n\n const removeFilter = React.useCallback((id: string) => {\n // Use functional updates only — no stale-closure risk on activeFilters.\n setActiveFilters(prev => {\n const idx = prev.findIndex(f => f.id === id)\n const next = prev.filter(f => f.id !== id)\n setFilterConnectors(prevC => {\n const c = { ...prevC }\n if (idx > 0 && next.length > 0) {\n const leftId = prev[idx - 1].id\n c[leftId] = prevC[id] ?? prevC[leftId] ?? \"and\"\n }\n delete c[id]\n return c\n })\n return next\n })\n setOpenFilterId(prev => prev === id ? null : prev)\n }, [setActiveFilters, setFilterConnectors, setOpenFilterId])\n\n // ── Group by ──────────────────────────────────────────────────────────────\n const [groupBy, setGroupBy] = React.useState<string | null>(null)\n\n // ── Per-column quick-search ───────────────────────────────────────────────\n const [colMenuSearch, setColMenuSearch] = React.useState<Record<string, string>>({})\n\n // ── Selection ─────────────────────────────────────────────────────────────\n const [selected, setSelected] = React.useState<Set<string | number>>(new Set())\n\n // ── Column widths ─────────────────────────────────────────────────────────\n const [colWidths, setColWidths] = React.useState<Record<string, number>>(() => buildDefaultWidths(columns))\n const resizeRef = React.useRef<{ key: string; startX: number; startW: number } | null>(null)\n\n // ── Column order ──────────────────────────────────────────────────────────\n const [colOrder, setColOrder] = React.useState<string[]>(() => columns.map(c => c.key))\n\n // ── Column pins ───────────────────────────────────────────────────────────\n const [colPins, setColPins] = React.useState<Record<string, \"left\" | \"right\">>(() => buildDefaultPins(columns))\n const lockedPins = React.useMemo(() => buildLockedPins(columns), [columns])\n\n // ── Column wrap ───────────────────────────────────────────────────────────\n const [colWrap, setColWrap] = React.useState<Record<string, boolean>>({})\n\n // ── Drawer / display settings ─────────────────────────────────────────────\n const [sheetOpen, setSheetOpen] = React.useState(false)\n /**\n * Deep-link target for the Properties drawer. When a callsite wants to open\n * the drawer focused on a specific panel (e.g. \"conditional-rules\" from the\n * column header menu), it sets this before calling `setSheetOpen(true)`. The\n * drawer's `initialPanel` prop reads it and syncs its internal `sheetPanel`\n * accordingly. The toolbar Properties button clears it so it opens to \"main\".\n */\n const [sheetInitialPanel, setSheetInitialPanel] = React.useState<string | null>(null)\n const [showGridlines, setShowGridlines] = React.useState(true)\n const [rowHeight, setRowHeight] = React.useState<RowHeight>(\"default\")\n const [hiddenCols, setHiddenCols] = React.useState<Set<string>>(new Set())\n\n const toggleColVisibility = React.useCallback((key: string) => {\n setHiddenCols(prev => {\n const next = new Set(prev)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n }, [setHiddenCols])\n\n const moveCol = React.useCallback((key: string, dir: \"up\" | \"down\") => {\n setColOrder(prev => {\n const lockedLeft = columns.filter(c => c.lockPin && c.defaultPin === \"left\").map(c => c.key)\n const lockedRight = columns.filter(c => c.lockPin && c.defaultPin === \"right\").map(c => c.key)\n const orderable = prev.filter(k => !lockedLeft.includes(k) && !lockedRight.includes(k))\n const idx = orderable.indexOf(key)\n if (dir === \"up\" && idx <= 0) return prev\n if (dir === \"down\" && idx >= orderable.length - 1) return prev\n const next = [...orderable]\n const swap = dir === \"up\" ? idx - 1 : idx + 1\n ;[next[idx], next[swap]] = [next[swap], next[idx]]\n return [...lockedLeft, ...next, ...lockedRight]\n })\n }, [columns, setColOrder])\n\n // ── Drag-to-reorder ───────────────────────────────────────────────────────\n const draggedKey = React.useRef<string | null>(null)\n const [dragOverKey, setDragOverKey] = React.useState<string | null>(null)\n\n // ── Scroll / overflow ─────────────────────────────────────────────────────\n const scrollRef = React.useRef<HTMLDivElement>(null)\n const [scrolled, setScrolled] = React.useState(false)\n const [scrollEnd, setScrollEnd] = React.useState(false)\n const [isOverflowing, setIsOverflowing] = React.useState(false)\n\n const isReflowViewport = React.useSyncExternalStore(\n subscribeReflowViewport,\n getReflowViewportSnapshot,\n getServerReflowViewportSnapshot,\n )\n\n // ── Hovered row ───────────────────────────────────────────────────────────\n const [hoveredRow, setHoveredRow] = React.useState<string | number | null>(null)\n\n // ── Column lookup index (stable per `columns` reference) ─────────────────\n // The previous implementation called `columns.find(c => c.key === ...)` inside\n // every filter/sort comparator and every sticky-offset getter — for large\n // datasets that's O(rows × cols) per render. Map lookups make those O(1).\n const columnsByKey = React.useMemo(() => {\n const map = new Map<string, ColumnDef<TData>>()\n for (const col of columns) map.set(col.key, col)\n return map\n }, [columns])\n\n // Searchable text cache. Per row, concatenate every value into one\n // lower-cased blob ONCE and reuse it across keystrokes. Keyed by row\n // identity via WeakMap so it never holds onto rows the consumer dropped.\n const searchableTextCache = React.useRef<WeakMap<object, string>>(new WeakMap())\n const getSearchableText = React.useCallback((row: TData): string => {\n const cache = searchableTextCache.current\n const cached = cache.get(row)\n if (cached !== undefined) return cached\n let blob = \"\"\n for (const v of Object.values(row)) {\n if (v == null) continue\n blob += String(v).toLowerCase() + \"\\n\"\n }\n cache.set(row, blob)\n return blob\n }, [])\n\n // Per-row per-column lower-cased value cache (column quick-search +\n // text-mask filters). One `Map` per row, lazily filled on first lookup.\n const lowerValueCache = React.useRef<WeakMap<object, Map<string, string>>>(new WeakMap())\n const getLowerValue = React.useCallback((row: TData, key: string): string => {\n const wm = lowerValueCache.current\n let perRow = wm.get(row)\n if (!perRow) {\n perRow = new Map()\n wm.set(row, perRow)\n }\n const cached = perRow.get(key)\n if (cached !== undefined) return cached\n const computed = String(row[key] ?? \"\").toLowerCase()\n perRow.set(key, computed)\n return computed\n }, [])\n\n // Reset the row-keyed caches whenever the dataset reference changes so we\n // don't pin stale strings for rows the consumer just replaced.\n React.useEffect(() => {\n searchableTextCache.current = new WeakMap()\n lowerValueCache.current = new WeakMap()\n }, [data])\n\n // ── Derived: filtered + sorted rows ──────────────────────────────────────\n const rows = React.useMemo(() => {\n let result = data.slice()\n\n const q = search.trim().toLowerCase()\n if (q) {\n result = result.filter(r => getSearchableText(r).includes(q))\n }\n\n const activeWithValues = activeFilters.filter(f => {\n if (f.values.length === 0) return false\n const col = columnsByKey.get(f.fieldKey)\n if (col?.filter?.type === \"text\") {\n return (f.values[0] ?? \"\").trim().length > 0\n }\n return true\n })\n if (activeWithValues.length > 0) {\n // Pre-resolve column, operator, normalised needle, and select-value Set\n // for each active filter ONCE (instead of per row).\n type CompiledFilter = {\n col: ColumnDef<TData>\n id: string\n type: \"select\" | \"date\" | \"text\"\n operator: ActiveFilter[\"operator\"]\n selectValues?: Set<string>\n dateTarget?: string\n textNeedle?: string\n digitsNeedle?: string\n isDigitsMask?: boolean\n }\n const compiled: CompiledFilter[] = []\n for (const f of activeWithValues) {\n const col = columnsByKey.get(f.fieldKey)\n if (!col?.filter) continue\n if (col.filter.type === \"select\") {\n compiled.push({\n col,\n id: f.id,\n type: \"select\",\n operator: f.operator,\n selectValues: new Set(f.values),\n })\n } else if (col.filter.type === \"date\") {\n compiled.push({\n col,\n id: f.id,\n type: \"date\",\n operator: f.operator,\n dateTarget: f.values[0],\n })\n } else {\n const raw = f.values[0] ?? \"\"\n const isDigitsMask = col.filter.textMask === \"phone\" || col.filter.textMask === \"zip\"\n compiled.push({\n col,\n id: f.id,\n type: \"text\",\n operator: f.operator,\n isDigitsMask,\n digitsNeedle: isDigitsMask ? digitsOnly(raw) : undefined,\n textNeedle: !isDigitsMask ? raw.toLowerCase() : undefined,\n })\n }\n }\n\n const matchesCompiled = (r: TData, f: CompiledFilter): boolean => {\n const rowVal = String(r[f.col.key] ?? \"\")\n if (f.type === \"select\") {\n const hit = f.selectValues!.has(rowVal)\n return f.operator === \"is\" ? hit : !hit\n }\n if (f.type === \"date\") {\n if (!f.dateTarget) return true\n const rowYmd = parseRowDateToYmd(rowVal)\n const op = f.operator === \"is_not\" ? \"is_not\" : \"is\"\n if (rowYmd === null) return op === \"is_not\"\n return op === \"is\" ? rowYmd === f.dateTarget : rowYmd !== f.dateTarget\n }\n if (f.isDigitsMask) {\n if (!f.digitsNeedle) return true\n const hay = digitsOnly(rowVal)\n return f.operator === \"contains\" ? hay.includes(f.digitsNeedle) : !hay.includes(f.digitsNeedle)\n }\n if (!f.textNeedle) return true\n const hay = getLowerValue(r, f.col.key)\n return f.operator === \"contains\" ? hay.includes(f.textNeedle) : !hay.includes(f.textNeedle)\n }\n\n if (compiled.length > 0) {\n result = result.filter(r => {\n let res = matchesCompiled(r, compiled[0])\n for (let i = 1; i < compiled.length; i++) {\n const connector = filterConnectors[compiled[i - 1].id] ?? \"and\"\n const match = matchesCompiled(r, compiled[i])\n res = connector === \"and\" ? res && match : res || match\n }\n return res\n })\n }\n }\n\n // Column menu quick-search — pre-normalise needles outside the row loop.\n const colMenuEntries: { key: string; lower: string }[] = []\n for (const [key, raw] of Object.entries(colMenuSearch)) {\n const trimmed = raw.trim()\n if (trimmed) colMenuEntries.push({ key, lower: trimmed.toLowerCase() })\n }\n if (colMenuEntries.length > 0) {\n result = result.filter(r => {\n for (const { key, lower } of colMenuEntries) {\n if (!getLowerValue(r, key).includes(lower)) return false\n }\n return true\n })\n }\n\n // Sort — resolve each rule's sort key ONCE, then run the comparator over\n // an indexed list so the inner loop is a tight array walk, not a chain of\n // `columns.find` lookups per comparison.\n if (sortRules.length > 0) {\n const resolved: { sk: string; dir: SortDir }[] = []\n for (const rule of sortRules) {\n const col = columnsByKey.get(rule.fieldKey)\n const sk = col?.sortKey ?? col?.key\n if (sk) resolved.push({ sk: sk as string, dir: rule.direction })\n }\n if (resolved.length > 0) {\n result.sort((a, b) => {\n for (let i = 0; i < resolved.length; i++) {\n const { sk, dir } = resolved[i]\n const cmp = compareUnknownSort(a[sk], b[sk])\n if (cmp !== 0) return dir === \"asc\" ? cmp : -cmp\n }\n return 0\n })\n }\n }\n\n return result\n }, [\n data,\n search,\n activeFilters,\n filterConnectors,\n colMenuSearch,\n sortRules,\n columnsByKey,\n getSearchableText,\n getLowerValue,\n ])\n\n // ── Paged rows (slice of rows when pagination is active) ─────────────────\n const pagedRows = React.useMemo(() => {\n if (!paginationOverride || paginationOverride.pageSize <= 0) return rows\n const { page, pageSize } = paginationOverride\n const safePage = Math.max(1, page)\n return rows.slice((safePage - 1) * pageSize, safePage * pageSize)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rows, paginationOverride?.page, paginationOverride?.pageSize])\n\n // ── Grouped rows ──────────────────────────────────────────────────────────\n const groupedRows = React.useMemo(() => {\n if (!groupBy) return [{ groupKey: null as string | null, groupLabel: null as string | null, rows }]\n const groups = new Map<string, TData[]>()\n rows.forEach(row => {\n const val = String(row[groupBy] ?? \"—\")\n if (!groups.has(val)) groups.set(val, [])\n groups.get(val)!.push(row)\n })\n return [...groups.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, groupRows]) => ({ groupKey: key, groupLabel: key, rows: groupRows }))\n }, [rows, groupBy])\n\n // ── Effective pins (respect overflow) ─────────────────────────────────────\n const LOCKED_KEYS = React.useMemo(() => new Set(Object.keys(lockedPins)), [lockedPins])\n\n // When the table fits within its container (not overflowing) there is no need\n // to sticky-pin any column — even locked ones. Pins only activate once the\n // user has to scroll horizontally so the selection / action edges stay visible.\n // In reflow viewports (high zoom), disable all column stickies — shadow + sticky\n // fight the short viewport and overlap content.\n const effectivePins = React.useMemo(() => {\n if (isReflowViewport || !isOverflowing) return {}\n const result: Record<string, \"left\" | \"right\"> = {}\n for (const [key, pin] of Object.entries(colPins)) {\n result[key] = pin\n }\n return result\n }, [colPins, isOverflowing, isReflowViewport])\n\n // ── Display columns ───────────────────────────────────────────────────────\n const displayCols = React.useMemo(() => {\n const leftPinned: string[] = []\n const free: string[] = []\n const rightPinned: string[] = []\n for (const k of colOrder) {\n const pin = colPins[k]\n if (pin === \"left\") leftPinned.push(k)\n else if (pin === \"right\") rightPinned.push(k)\n else free.push(k)\n }\n const ordered = [...leftPinned, ...free, ...rightPinned]\n const out: ColumnDef<TData>[] = []\n for (const k of ordered) {\n if (hiddenCols.has(k)) continue\n const col = columnsByKey.get(k)\n if (col) out.push(col)\n }\n return out\n }, [colOrder, colPins, hiddenCols, columnsByKey])\n\n // ── Column actions ────────────────────────────────────────────────────────\n function startResize(key: string, e: React.MouseEvent) {\n e.preventDefault()\n e.stopPropagation()\n const minW = columns.find(c => c.key === key)?.minWidth ?? 60\n const startW = colWidths[key] ?? (columns.find(c => c.key === key)?.width ?? 100)\n resizeRef.current = { key, startX: e.clientX, startW }\n const onMove = (ev: MouseEvent) => {\n if (!resizeRef.current) return\n const { key: k, startX, startW: sw } = resizeRef.current\n setColWidths(p => ({ ...p, [k]: Math.max(minW, sw + ev.clientX - startX) }))\n }\n const onUp = () => {\n resizeRef.current = null\n document.removeEventListener(\"mousemove\", onMove)\n document.removeEventListener(\"mouseup\", onUp)\n }\n document.addEventListener(\"mousemove\", onMove)\n document.addEventListener(\"mouseup\", onUp)\n }\n\n function handleDragStart(key: string, e: React.DragEvent<HTMLTableCellElement>) {\n draggedKey.current = key\n e.dataTransfer.effectAllowed = \"move\"\n }\n function handleDragOver(key: string, e: React.DragEvent<HTMLTableCellElement>) {\n e.preventDefault()\n e.dataTransfer.dropEffect = \"move\"\n if (draggedKey.current && draggedKey.current !== key) setDragOverKey(key)\n }\n function handleDrop(key: string) {\n if (!draggedKey.current || draggedKey.current === key) { setDragOverKey(null); return }\n const order = [...colOrder]\n const from = order.indexOf(draggedKey.current)\n const to = order.indexOf(key)\n order.splice(from, 1)\n order.splice(to, 0, draggedKey.current!)\n setColOrder(order)\n draggedKey.current = null\n setDragOverKey(null)\n }\n function handleDragEnd() { draggedKey.current = null; setDragOverKey(null) }\n\n function pinColumn(key: string, pin: \"left\" | \"right\") {\n setColPins(p => ({ ...p, [key]: pin }))\n }\n function unpinColumn(key: string) {\n if (lockedPins[key]) return\n setColPins(p => { const n = { ...p }; delete n[key]; return n })\n }\n function toggleWrap(key: string) {\n setColWrap(p => ({ ...p, [key]: !p[key] }))\n }\n\n // ── Scroll handlers ───────────────────────────────────────────────────────\n function checkOverflow() {\n const el = scrollRef.current\n if (!el) return\n setIsOverflowing(el.scrollWidth > el.clientWidth + 1)\n }\n function handleScroll() {\n const el = scrollRef.current\n if (!el) return\n setScrolled(el.scrollLeft > 1)\n setScrollEnd(el.scrollLeft >= el.scrollWidth - el.clientWidth - 1)\n setIsOverflowing(el.scrollWidth > el.clientWidth + 1)\n }\n\n // ── Selection helpers ─────────────────────────────────────────────────────\n function getRowId(row: TData, index: number, getIdFn?: (r: TData, i: number) => string | number): string | number {\n return getIdFn ? getIdFn(row, index) : (row.id as string | number ?? index)\n }\n\n const toggleRow = React.useCallback((id: string | number) => {\n setSelected(prev => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }, [setSelected])\n\n const toggleAll = React.useCallback((allRowIds: (string | number)[]) => {\n setSelected(prev => prev.size === allRowIds.length ? new Set() : new Set(allRowIds))\n }, [setSelected])\n\n // ── Sticky offset calculations ────────────────────────────────────────────\n // Precompute every pinned column's offset ONCE per render so the per-cell\n // `stickyStyle()` call is an O(1) map lookup instead of an O(cols) walk.\n // With `cells = rows × cols`, the previous O(rows × cols²) became the\n // dominant cost on wide tables.\n const stickyOffsets = React.useMemo(() => {\n const left = new Map<string, number>()\n const right = new Map<string, number>()\n let leftOffset = 0\n for (const col of displayCols) {\n if (effectivePins[col.key] !== \"left\") break\n left.set(col.key, leftOffset)\n leftOffset += colWidths[col.key] ?? col.width ?? 100\n }\n let rightOffset = 0\n for (let i = displayCols.length - 1; i >= 0; i--) {\n const col = displayCols[i]\n if (effectivePins[col.key] !== \"right\") break\n right.set(col.key, rightOffset)\n rightOffset += colWidths[col.key] ?? col.width ?? 100\n }\n return { left, right }\n }, [displayCols, effectivePins, colWidths])\n\n const getStickyLeft = React.useCallback((key: string): number => {\n return stickyOffsets.left.get(key) ?? 0\n }, [stickyOffsets])\n\n const getStickyRight = React.useCallback((key: string): number => {\n return stickyOffsets.right.get(key) ?? 0\n }, [stickyOffsets])\n\n const stickyStyle = React.useCallback(\n (key: string, isHeader = false): React.CSSProperties => {\n if (isReflowViewport) return {}\n const pin = effectivePins[key]\n if (pin === \"left\") {\n return isHeader\n ? { position: \"sticky\", left: stickyOffsets.left.get(key) ?? 0, top: 0 }\n : { position: \"sticky\", left: stickyOffsets.left.get(key) ?? 0 }\n }\n if (pin === \"right\") {\n return isHeader\n ? { position: \"sticky\", right: stickyOffsets.right.get(key) ?? 0, top: 0 }\n : { position: \"sticky\", right: stickyOffsets.right.get(key) ?? 0 }\n }\n return isHeader ? { position: \"sticky\", top: 0 } : {}\n },\n [effectivePins, isReflowViewport, stickyOffsets],\n )\n\n const totalWidth = React.useMemo(\n () => displayCols.reduce((s, c) => s + (colWidths[c.key] ?? c.width ?? 100), 0),\n [displayCols, colWidths],\n )\n\n return {\n // Sort\n sortRules, setSortRules,\n sortKey, sortDir,\n addSortRule, removeSortRule, toggleSortDir, handleSortByKey,\n // Filters\n search, setSearch,\n searchOpen, setSearchOpen,\n searchRef,\n activeFilters, setActiveFilters,\n filterConnectors, setFilterConnectors, toggleConnector, getConnector,\n openFilterId, setOpenFilterId,\n filterBarVisible, setFilterBarVisible,\n drawerExpandedFilters, setDrawerExpandedFilters,\n addFilter, updateFilter, removeFilter,\n // Group\n groupBy, setGroupBy,\n // Column quick-search\n colMenuSearch, setColMenuSearch,\n // Selection\n selected, setSelected, toggleRow, toggleAll, getRowId,\n // Column widths / order / pins / wrap\n colWidths, setColWidths, resizeRef, startResize,\n colOrder, setColOrder, moveCol,\n colPins, setColPins, lockedPins, LOCKED_KEYS,\n pinColumn, unpinColumn,\n colWrap, setColWrap, toggleWrap,\n // Drag-to-reorder\n draggedKey, dragOverKey,\n handleDragStart, handleDragOver, handleDrop, handleDragEnd,\n // Scroll\n scrollRef, scrolled, scrollEnd, isOverflowing,\n checkOverflow, handleScroll,\n // Hover\n hoveredRow, setHoveredRow,\n // Derived\n rows, pagedRows, groupedRows,\n effectivePins, displayCols,\n isReflowViewport,\n getStickyLeft, getStickyRight, stickyStyle,\n totalWidth,\n // Display settings\n sheetOpen, setSheetOpen,\n sheetInitialPanel, setSheetInitialPanel,\n showGridlines, setShowGridlines,\n rowHeight, setRowHeight,\n hiddenCols, setHiddenCols, toggleColVisibility,\n }\n}\n","\"use client\"\n\n/**\n * DataTable<TData> — generic reusable table (no pagination)\n *\n * Column features:\n * • Resizable — drag trailing-edge handle on any non-locked column\n * • Drag-to-reorder — drag header cell for free (unpinned) columns\n * • Pin Left / Pin Right / Unpin — per-column context menu\n * • Sort Asc / Desc — per-column context menu (sortable columns)\n * • Wrap Text / Unwrap — per-column context menu\n * • Per-column quick search\n * • Row selection (checkboxes + floating bulk action bar)\n * • Group by (collapsible group rows)\n * • Hidden columns\n *\n * WCAG 2.1 AA:\n * ✓ aria-sort on sortable <th>\n * ✓ aria-label on every icon-only button\n * ✓ Select / Actions columns: sr-only header text + resolved labels for controls\n * ✓ Row checkboxes: visible on row focus-within, stop row click propagation (default control size; extended hit slop on Checkbox)\n * ✓ Bulk-action bar: role=\"status\" aria-live=\"polite\"\n * ✓ Resize handles: role=\"separator\" aria-label\n */\n\nimport * as React from \"react\"\nimport { useTheme } from \"next-themes\"\nimport { createPortal } from \"react-dom\"\nimport { cn } from \"../../lib/utils\"\nimport { rafThrottle } from \"../../lib/raf-throttle\"\nimport { Button } from \"../ui/button\"\nimport { Input } from \"../ui/input\"\nimport { Kbd, KbdGroup } from \"../ui/kbd\"\nimport { Tip } from \"../ui/tip\"\nimport { useModKeyLabel } from \"../../hooks/use-mod-key-label\"\nimport { isEditableTarget } from \"../../lib/editable-target\"\nimport { Checkbox } from \"../ui/checkbox\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport {\n Popover,\n PopoverAnchor,\n PopoverContent,\n PopoverTrigger,\n} from \"../ui/popover\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\"\nimport { OPERATOR_LABELS } from \"../../lib/table-properties-types\"\nimport type { ActiveFilter } from \"../../lib/table-properties-types\"\nimport { getConditionalCellBackground } from \"../../lib/conditional-rule-match\"\nimport { formatYmdForDisplay } from \"../../lib/date-filter\"\nimport { FilterDateCalendar } from \"./filter-date-calendar\"\nimport { FilterTextValueInput } from \"./filter-text-value-input\"\nimport type { DataTableProps, ColumnDef, SortDir } from \"./types\"\nimport { useTableState } from \"./use-table-state\"\n\n/** When `ColumnDef.label` is empty, use a standard name for select/actions columns. */\nfunction defaultColumnHeaderLabel(key: string): string | undefined {\n switch (key) {\n case \"select\":\n return \"Select\"\n case \"actions\":\n return \"Actions\"\n default:\n return undefined\n }\n}\n\nfunction resolvedColumnLabel<TData>(col: ColumnDef<TData>): string {\n const t = col.label?.trim()\n if (t) return t\n return defaultColumnHeaderLabel(col.key) ?? col.key\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Internal sub-components\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SortChevron = React.memo(function SortChevron({ dir }: { dir: SortDir }) {\n return (\n <i className={`fa-solid fa-arrow-${dir === \"asc\" ? \"up\" : \"down\"} ms-1 text-xs`} aria-hidden=\"true\" />\n )\n})\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FilterPill — active filter pill with inline editor popover\n// (driven by ColumnDef.filter config rather than FILTER_FIELDS)\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface FilterPillProps<TData> {\n filter: ActiveFilter\n columns: ColumnDef<TData>[]\n defaultOpen?: boolean\n onUpdate: (id: string, patch: Partial<ActiveFilter>) => void\n onRemove: (id: string) => void\n /** Optional custom cell renderer for filter option values */\n renderOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}\n\nfunction FilterPillBase<TData>({\n filter,\n columns,\n defaultOpen = false,\n onUpdate,\n onRemove,\n renderOptionValue,\n}: FilterPillProps<TData>) {\n const [open, setOpen] = React.useState(false)\n const [optSearch, setOptSearch] = React.useState(\"\")\n const justAutoOpenedRef = React.useRef(false)\n\n React.useEffect(() => {\n if (defaultOpen) {\n justAutoOpenedRef.current = true\n const t = setTimeout(() => {\n setOpen(true)\n setTimeout(() => { justAutoOpenedRef.current = false }, 400)\n }, 0)\n return () => clearTimeout(t)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const col = columns.find(c => c.key === filter.fieldKey)\n const filterDef = col?.filter\n\n React.useEffect(() => {\n if (!filterDef) return\n if (filterDef.type !== \"select\" && filterDef.type !== \"date\") return\n if (filter.operator !== \"is\" && filter.operator !== \"is_not\") {\n onUpdate(filter.id, { operator: \"is\" })\n }\n }, [filter.id, filterDef, filter.operator, onUpdate])\n\n if (!filterDef) return null\n\n const options = filterDef.options ?? []\n const showSearch = options.length > 8\n const filteredOpts = optSearch\n ? options.filter(o => o.label.toLowerCase().includes(optSearch.toLowerCase()))\n : options\n\n const operators = filterDef.operators ?? (\n filterDef.type === \"select\" || filterDef.type === \"date\"\n ? ([\"is\", \"is_not\"] as const)\n : ([\"contains\", \"not_contains\"] as const)\n )\n\n const valueLabel = (() => {\n if (filterDef.type === \"select\") {\n if (filter.values.length === 0) return \"…\"\n if (filter.values.length === 1) {\n return options.find(o => o.value === filter.values[0])?.label ?? filter.values[0]\n }\n return `${filter.values.length} selected`\n }\n if (filterDef.type === \"date\") {\n const ymd = filter.values[0]\n return ymd ? formatYmdForDisplay(ymd) : \"…\"\n }\n return filter.values[0] || \"…\"\n })()\n\n function toggleValue(val: string) {\n const next = filter.values.includes(val)\n ? filter.values.filter(v => v !== val)\n : [...filter.values, val]\n onUpdate(filter.id, { values: next })\n }\n\n function cycleOperator() {\n const idx = operators.indexOf(filter.operator as typeof operators[number])\n const i = idx === -1 ? 0 : idx\n onUpdate(filter.id, { operator: operators[(i + 1) % operators.length] })\n }\n\n const isActive =\n filterDef.type === \"date\"\n ? Boolean(filter.values[0])\n : filter.values.length > 0\n const hasSelection = filter.values.length > 0\n const iconClass = filterDef.icon ? `fa-light ${filterDef.icon}` : \"fa-light fa-filter\"\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverAnchor asChild>\n <div\n className={cn(\n \"inline-flex cursor-pointer items-center rounded border text-xs transition-colors\",\n isActive ? \"border-brand/45 bg-brand/10\" : \"border-input bg-background\"\n )}\n >\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"inline-flex cursor-pointer items-center gap-1 h-6 ps-2 pe-1.5 rounded-s transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n isActive ? \"hover:bg-brand/15\" : \"hover:bg-interactive-hover\",\n )}\n >\n <i\n className={cn(iconClass, \"text-xs\", isActive ? \"text-brand\" : \"text-muted-foreground\")}\n aria-hidden=\"true\"\n />\n <span className=\"text-foreground\">{col.label}</span>\n {isActive && <span className=\"text-foreground font-medium\">{valueLabel}</span>}\n </button>\n </PopoverTrigger>\n <button\n type=\"button\"\n aria-label={`Remove ${col.label} filter`}\n onClick={() => onRemove(filter.id)}\n className={cn(\n \"inline-flex cursor-pointer items-center justify-center h-6 w-5 rounded-e transition-colors\",\n \"text-muted-foreground hover:text-destructive\",\n isActive ? \"hover:bg-brand/15\" : \"hover:bg-interactive-hover\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n )}\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n </PopoverAnchor>\n\n <PopoverContent\n className={cn(\n \"p-0\",\n filterDef.type === \"date\"\n ? \"w-auto max-w-[min(calc(100vw-2rem),22rem)]\"\n : \"w-64\",\n )}\n align=\"start\"\n onFocusOutside={e => e.preventDefault()}\n onInteractOutside={e => {\n if (justAutoOpenedRef.current) {\n e.preventDefault()\n justAutoOpenedRef.current = false\n }\n }}\n >\n <div className=\"flex items-center justify-between px-3 py-2 border-b border-border\">\n <div className=\"flex items-center gap-1 text-sm text-foreground\">\n <span className=\"font-medium\">{col.label}</span>\n <button\n type=\"button\"\n onClick={cycleOperator}\n className=\"inline-flex items-center gap-0.5 text-muted-foreground hover:text-interactive-hover-foreground transition-colors rounded px-1 py-0.5 hover:bg-interactive-hover\"\n >\n {OPERATOR_LABELS[filter.operator]}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n <button\n type=\"button\"\n aria-label=\"Remove filter\"\n onClick={() => onRemove(filter.id)}\n className=\"text-muted-foreground hover:text-destructive transition-colors p-1 rounded hover:bg-interactive-hover\"\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {filterDef.type === \"date\" && (\n <div className=\"p-2\">\n <FilterDateCalendar\n label={`${col.label} — choose date`}\n valueYmd={filter.values[0]}\n onChangeYmd={(ymd) =>\n onUpdate(filter.id, { values: ymd ? [ymd] : [] })\n }\n />\n </div>\n )}\n\n {filterDef.type === \"select\" && (\n <div className=\"py-1 max-h-64 overflow-y-auto\">\n {showSearch && (\n <div className=\"px-2 pt-1 pb-1\">\n <div className=\"relative\">\n <Input\n type=\"text\"\n placeholder=\"Search options…\"\n value={optSearch}\n onChange={e => setOptSearch(e.target.value)}\n className={cn(\"h-7 text-xs\", optSearch ? \"pe-8\" : \"pe-2\")}\n autoFocus\n />\n {optSearch ? (\n <button\n type=\"button\"\n aria-label=\"Clear option search\"\n onClick={() => setOptSearch(\"\")}\n className=\"absolute end-1 top-1/2 -translate-y-1/2 inline-flex size-6 items-center justify-center rounded text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n </div>\n )}\n {filteredOpts.map(opt => {\n const checked = filter.values.includes(opt.value)\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={checked}\n tabIndex={0}\n onClick={() => toggleValue(opt.value)}\n onKeyDown={e => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); toggleValue(opt.value) } }}\n className=\"flex w-full items-center gap-2.5 px-3 py-1.5 text-sm hover:bg-interactive-hover transition-colors cursor-pointer select-none focus-visible:outline-none focus-visible:bg-interactive-hover\"\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"checkbox\"\n data-state={checked ? \"checked\" : \"unchecked\"}\n className={cn(\n \"inline-flex items-center justify-center size-3.5 shrink-0 rounded-[4px] border transition-colors\",\n checked ? \"bg-primary border-primary text-primary-foreground\" : \"border-input bg-background\"\n )}\n >\n {checked && <i className=\"fa-solid fa-check text-current\" style={{ fontSize: \"8px\" }} />}\n </span>\n {renderOptionValue\n ? renderOptionValue(filter.fieldKey, opt.value)\n : <span className=\"text-foreground\">{opt.label}</span>\n }\n </div>\n )\n })}\n {filteredOpts.length === 0 && (\n <p className=\"px-3 py-2 text-xs text-muted-foreground\">No options found</p>\n )}\n </div>\n )}\n\n {filterDef.type === \"text\" && (\n <div className=\"p-2\">\n <FilterTextValueInput\n mask={filterDef.textMask}\n placeholder={`Enter ${col.label.toLowerCase()}…`}\n value={filter.values[0] ?? \"\"}\n onValueChange={next => onUpdate(filter.id, { values: [next] })}\n aria-label={`${col.label} filter value`}\n className=\"h-8 text-xs focus-visible:border-ring focus-visible:ring-ring/50\"\n autoFocus\n />\n </div>\n )}\n {hasSelection ? (\n <div className=\"sticky bottom-0 border-t border-border bg-popover p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onUpdate(filter.id, { values: [] })}\n className=\"w-full justify-center gap-1.5 text-xs text-muted-foreground\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n Clear selection\n </Button>\n </div>\n ) : null}\n </PopoverContent>\n </Popover>\n )\n}\n\n// React.memo wrapper — preserves generic signature via cast.\n// FilterPillBase is a pure function of its props; memoizing it prevents\n// re-renders when unrelated table state (hover, scroll) changes.\nconst FilterPill = React.memo(FilterPillBase) as typeof FilterPillBase\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Sticky shadow utility\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction stickyShadow(pin: \"left\" | \"right\" | undefined): string {\n if (!pin) return \"\"\n const base = \"after:content-[''] after:absolute after:top-0 after:bottom-0 after:w-3 after:pointer-events-none\"\n if (pin === \"left\") {\n return cn(\n base,\n \"after:start-full\",\n \"after:bg-[linear-gradient(to_right,var(--sticky-edge-fade),transparent)]\",\n )\n }\n return cn(\n base,\n \"after:end-full\",\n \"after:bg-[linear-gradient(to_left,var(--sticky-edge-fade),transparent)]\",\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DataTableToolbar — search, filter bar, properties slot (shared by table + board)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function DataTableToolbar<TData extends Record<string, unknown>>({\n state,\n columns,\n searchable = true,\n /** When false, hides filter pills, search, and filter controls (e.g. dashboard canvas edit mode). */\n showQueryControls = true,\n renderFilterOptionValue,\n toolbarSlot,\n searchAriaLabel = \"Search table\",\n}: {\n state: ReturnType<typeof useTableState<TData>>\n columns: ColumnDef<TData>[]\n searchable?: boolean\n showQueryControls?: boolean\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n toolbarSlot?: (state: ReturnType<typeof useTableState<TData>>) => React.ReactNode\n /** Passed to the search input `aria-label` (e.g. \"Search placements\") */\n searchAriaLabel?: string\n}) {\n const {\n search, setSearch, searchOpen, setSearchOpen, searchRef,\n activeFilters, setActiveFilters, openFilterId,\n filterBarVisible, setFilterBarVisible,\n addFilter, updateFilter, removeFilter,\n } = state\n\n const filterableCols = columns.filter(c => c.filter)\n const searchModLabel = useModKeyLabel()\n const effectiveSearchable = showQueryControls && searchable\n\n React.useEffect(() => {\n if (!effectiveSearchable) return\n function onGlobalKeyDown(e: KeyboardEvent) {\n if (!e.metaKey && !e.ctrlKey) return\n if (e.altKey) return\n if (e.key.toLowerCase() !== \"k\") return\n if (isEditableTarget(e.target)) return\n e.preventDefault()\n setSearchOpen(true)\n queueMicrotask(() => searchRef.current?.focus())\n }\n document.addEventListener(\"keydown\", onGlobalKeyDown)\n return () => document.removeEventListener(\"keydown\", onGlobalKeyDown)\n }, [effectiveSearchable, setSearchOpen, searchRef])\n\n return (\n <div\n className={cn(\n \"flex items-center gap-1.5 px-4 lg:px-6\",\n showQueryControls ? \"min-h-10 pt-2 pb-2\" : \"min-h-0 justify-end py-1.5\",\n )}\n >\n\n {showQueryControls && filterBarVisible && filterableCols.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5 flex-1 min-w-0\">\n {activeFilters.map(filter => (\n <React.Fragment key={filter.id}>\n <FilterPill\n filter={filter}\n columns={columns}\n defaultOpen={filter.id === openFilterId}\n onUpdate={updateFilter}\n onRemove={removeFilter}\n renderOptionValue={renderFilterOptionValue}\n />\n </React.Fragment>\n ))}\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button type=\"button\"\n className=\"inline-flex cursor-pointer items-center gap-1 h-6 px-2 rounded text-xs text-muted-foreground hover:text-interactive-hover-foreground border border-dashed border-input/70 hover:border-input hover:bg-interactive-hover-subtle transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add filter\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuLabel className=\"text-xs\">Filter by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterableCols.map(c => (\n <DropdownMenuItem key={c.key} onClick={() => addFilter(c.key)}>\n {c.filter?.icon && <i className={`fa-light ${c.filter.icon}`} aria-hidden=\"true\" />}\n {c.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n\n {activeFilters.length > 0 && (\n <button\n type=\"button\"\n onClick={() => setActiveFilters([])}\n className=\"cursor-pointer text-xs text-muted-foreground hover:text-interactive-hover-foreground transition-colors px-1\"\n >\n Clear all\n </button>\n )}\n </div>\n )}\n\n <div\n className={cn(\n \"flex items-center gap-1 shrink-0\",\n showQueryControls && \"ms-auto\",\n )}\n >\n\n {effectiveSearchable && (\n searchOpen ? (\n <div className=\"relative flex items-center\">\n <i className=\"fa-light fa-magnifying-glass absolute start-2.5 top-1/2 -translate-y-1/2 text-muted-foreground text-xs pointer-events-none\" aria-hidden=\"true\" />\n <Input\n ref={searchRef}\n type=\"text\"\n role=\"searchbox\"\n inputMode=\"search\"\n autoComplete=\"off\"\n placeholder=\"Search…\"\n value={search}\n onChange={e => setSearch(e.target.value)}\n onBlur={() => { if (!search) setSearchOpen(false) }}\n onKeyDown={e => { if (e.key === \"Escape\") { setSearch(\"\"); setSearchOpen(false) } }}\n className={cn(\"h-8 w-48 ps-7 text-xs\", search ? \"pe-8\" : \"pe-2\")}\n aria-label={searchAriaLabel}\n />\n {search ? (\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onClick={() => setSearch(\"\")}\n className=\"absolute end-1.5 top-1/2 -translate-y-1/2 inline-flex cursor-pointer size-6 items-center justify-center rounded text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n ) : (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\" aria-label=\"Search\"\n onClick={() => { setSearchOpen(true); setTimeout(() => searchRef.current?.focus(), 10) }}\n className=\"inline-flex shrink-0 cursor-pointer items-center justify-center size-8 rounded-md text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-magnifying-glass text-[13px]\" aria-hidden=\"true\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <span>{searchAriaLabel}</span>\n <KbdGroup>\n <Kbd>{searchModLabel}</Kbd>\n <Kbd>K</Kbd>\n </KbdGroup>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n )}\n\n {showQueryControls && filterableCols.length > 0 && (\n <>\n <div className=\"h-4 w-px bg-border/70\" aria-hidden=\"true\" />\n {activeFilters.length > 0 ? (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button type=\"button\"\n aria-label={filterBarVisible ? \"Hide filters\" : \"Show filters\"}\n onClick={() => setFilterBarVisible(v => !v)}\n className={cn(\n \"inline-flex shrink-0 cursor-pointer items-center gap-1 size-8 justify-center rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n filterBarVisible\n ? \"bg-accent text-accent-foreground hover:bg-accent/90\"\n : \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover\",\n )}\n >\n <i className=\"fa-light fa-filter text-[13px]\" aria-hidden=\"true\" />\n <span className=\"text-xs font-semibold tabular-nums\">{activeFilters.length}</span>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {filterBarVisible ? \"Hide filters\" : \"Show filters\"}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n // NOTE: Tooltip MUST wrap DropdownMenuTrigger directly (not the\n // surrounding <DropdownMenu> wrapper). Radix `asChild` Slot needs\n // a real DOM child — `<DropdownMenu>` is a logical wrapper, so\n // putting it inside TooltipTrigger swallows the tooltip handlers\n // and the hover hint silently disappears.\n <DropdownMenu>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild>\n <button type=\"button\" aria-label=\"Add filter\"\n onClick={() => setFilterBarVisible(true)}\n className=\"inline-flex shrink-0 cursor-pointer items-center justify-center size-8 rounded-md text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-filter text-[13px]\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Add filter</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuLabel className=\"text-xs\">Filter by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterableCols.map(c => (\n <DropdownMenuItem key={c.key} onClick={() => addFilter(c.key)}>\n {c.filter?.icon && <i className={`fa-light ${c.filter.icon}`} aria-hidden=\"true\" />}\n {c.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </>\n )}\n\n {toolbarSlot && toolbarSlot(state)}\n </div>\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DataTable<TData>\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DataTableExtendedProps<TData extends Record<string, unknown>>\n extends DataTableProps<TData> {\n /** Slot for a toolbar drawer button + drawer itself (e.g. TablePropertiesDrawer) */\n toolbarSlot?: (state: ReturnType<typeof useTableState<TData>>) => React.ReactNode\n /** Slot rendered inside the floating bulk-action bar (after the \"N selected\" label) */\n bulkActionsSlot?: (selected: Set<string | number>, rows: TData[]) => React.ReactNode\n /** Optional \"add new row\" row text — pass false to hide */\n addRowLabel?: string | false\n /** Custom option-value renderer for filter pills */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n /** When set by DataTablePaginated — drives row slicing inside useTableState */\n paginationOverride?: { page: number; pageSize: number }\n /** When true, removes rounded bottom corners so a pagination bar can attach flush */\n hasFooter?: boolean\n /** Conditional formatting rules — apply bg color to cells based on value */\n conditionalRules?: import(\"./types\").ConditionalRule[]\n /** When false, the column header row is hidden (Display options). */\n showColumnHeaders?: boolean\n /** When set, table uses this state (e.g. shared with board view) instead of internal useTableState. */\n state?: ReturnType<typeof useTableState<TData>>\n}\n\ntype DataTableInnerProps<TData extends Record<string, unknown>> = DataTableExtendedProps<TData> & {\n state: ReturnType<typeof useTableState<TData>>\n}\n\n/** Max width for bulk bar in normal (non-reflow) zoom — ~28rem, centered in table. */\nconst BULK_BAR_MAX_PX = 448\n\n/**\n * When the app theme is `dark`, the bulk strip is a **light** surface; shadcn\n * “dark:” button tokens are wrong — reapply light-look solid/outline/destructive/ghost.\n */\nconst BULK_BAR_ON_LIGHT_STRIP = cn(\n \"[&_button[data-variant=default]]:bg-zinc-900 [&_button[data-variant=default]]:text-zinc-50\",\n \"hover:[&_button[data-variant=default]]:bg-zinc-800\",\n \"[&_button[data-variant=outline]]:border-zinc-300/80 [&_button[data-variant=outline]]:bg-white [&_button[data-variant=outline]]:text-zinc-900\",\n \"hover:[&_button[data-variant=outline]]:bg-zinc-100\",\n \"[&_button[data-variant=destructive]]:border-rose-200/80 [&_button[data-variant=destructive]]:bg-rose-100 [&_button[data-variant=destructive]]:text-rose-800\",\n \"hover:[&_button[data-variant=destructive]]:bg-rose-200/40\",\n \"[&_button[data-variant=ghost]]:text-zinc-600 hover:[&_button[data-variant=ghost]]:bg-zinc-200/70 hover:[&_button[data-variant=ghost]]:text-zinc-900\",\n)\n\n/**\n * Pins the bulk bar to the viewport bottom, aligned to the table scroll\n * wrapper. When `fullWidth` is false (normal zoom), width is\n * `min(tableWidth, 28rem)` and centered; when true (reflow), matches table\n * width.\n */\nfunction useBulkBarFixedToTableScrollEl(\n scrollRef: React.RefObject<HTMLDivElement | null>,\n active: boolean,\n fullWidth: boolean,\n): React.CSSProperties | undefined {\n const [style, setStyle] = React.useState<React.CSSProperties | undefined>(undefined)\n React.useLayoutEffect(() => {\n if (!active) {\n setStyle(undefined)\n return\n }\n const el = scrollRef.current\n if (!el) {\n setStyle(undefined)\n return\n }\n const apply = () => {\n const r = el.getBoundingClientRect()\n let left = r.left\n let width = r.width\n if (!fullWidth) {\n const w = Math.min(r.width, BULK_BAR_MAX_PX)\n left = r.left + (r.width - w) / 2\n width = w\n }\n setStyle({\n position: \"fixed\",\n left,\n width,\n bottom: \"max(0.5rem, env(safe-area-inset-bottom, 0px))\",\n zIndex: 50,\n boxSizing: \"border-box\",\n margin: 0,\n right: \"auto\",\n })\n }\n apply()\n // rAF-coalesce so a single frame handles bursts of capture-phase scroll\n // events plus the ResizeObserver firing — instead of N getBoundingClientRect\n // + setState per second.\n const scheduled = rafThrottle(apply)\n const ro = new ResizeObserver(scheduled)\n ro.observe(el)\n window.addEventListener(\"resize\", scheduled, { passive: true })\n window.addEventListener(\"scroll\", scheduled, { passive: true, capture: true })\n return () => {\n scheduled.cancel()\n ro.disconnect()\n window.removeEventListener(\"resize\", scheduled)\n window.removeEventListener(\"scroll\", scheduled, { capture: true })\n }\n }, [active, fullWidth, scrollRef])\n return style\n}\n\nfunction DataTableInner<TData extends Record<string, unknown>>({\n // `data` / `defaultSort` flow into `useTableState` upstream; the inner table\n // reads them via `state` and never directly here. Keep the prop slots so\n // the public `DataTable<TData>` API stays unchanged.\n data: _data,\n columns,\n getRowId: getRowIdProp,\n getRowSelectionLabel,\n selectable = true,\n searchable = true,\n emptyState,\n onRowClick,\n defaultSort: _defaultSort,\n toolbarSlot,\n bulkActionsSlot,\n addRowLabel = false,\n renderFilterOptionValue,\n hasFooter = false,\n conditionalRules,\n showColumnHeaders = true,\n state,\n}: DataTableInnerProps<TData>) {\n const {\n setSortRules,\n sortKey, sortDir,\n handleSortByKey,\n addFilter,\n groupBy, setGroupBy,\n colMenuSearch, setColMenuSearch,\n selected, setSelected, toggleRow, toggleAll, getRowId,\n colWidths, startResize,\n colPins, lockedPins,\n pinColumn, unpinColumn,\n colWrap, toggleWrap,\n draggedKey, dragOverKey,\n handleDragStart, handleDragOver, handleDrop, handleDragEnd,\n scrollRef, handleScroll, checkOverflow,\n isOverflowing,\n setHoveredRow,\n rows, pagedRows, groupedRows,\n effectivePins, displayCols,\n isReflowViewport,\n stickyStyle,\n totalWidth,\n rowHeight,\n showGridlines,\n setSheetOpen,\n setSheetInitialPanel,\n } = state\n\n // Mount overflow check + scrollport width for sticky group headers on horizontal scroll.\n React.useEffect(() => {\n const syncScrollport = () => {\n const el = scrollRef.current\n if (el) {\n el.style.setProperty(\"--dt-scrollport-width\", `${el.clientWidth}px`)\n }\n checkOverflow()\n }\n syncScrollport()\n const el = scrollRef.current\n if (!el) return\n const ro = new ResizeObserver(syncScrollport)\n ro.observe(el)\n return () => ro.disconnect()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n /** Pending action queued from a column-menu item that should run *after* the menu\n * has fully closed. The Properties drawer is a non-modal Radix Sheet (`modal=false`)\n * and Radix's DropdownMenu close cycle races with the Sheet's `onInteractOutside`\n * / focus-return logic if we open the Sheet synchronously from `onSelect` / `onClick`.\n * `onCloseAutoFocus` on `DropdownMenuContent` is the Radix-native hook that fires\n * after the menu has unmounted and focus has returned — the safe moment to act. */\n const columnMenuPendingActionRef = React.useRef<(() => void) | null>(null)\n\n /** One-time horizontal nudge when the grid overflows and pins are active — hints that more columns scroll (overlay scrollbars, esp. Windows, are often invisible until interaction). */\n const pinnedScrollHintDoneRef = React.useRef(false)\n React.useEffect(() => {\n if (!isOverflowing || isReflowViewport || Object.keys(colPins).length === 0) return\n if (pinnedScrollHintDoneRef.current) return\n const el = scrollRef.current\n if (!el) return\n if (el.scrollLeft > 2) return\n const maxScroll = el.scrollWidth - el.clientWidth\n if (maxScroll < 16) return\n if (typeof window !== \"undefined\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) {\n pinnedScrollHintDoneRef.current = true\n return\n }\n\n pinnedScrollHintDoneRef.current = true\n const delta = Math.min(96, Math.max(28, Math.round(maxScroll * 0.14)))\n const startDelayMs = 320\n const dwellMs = 520\n\n const t1 = window.setTimeout(() => {\n el.scrollTo({ left: delta, behavior: \"smooth\" })\n }, startDelayMs)\n const t2 = window.setTimeout(() => {\n el.scrollTo({ left: 0, behavior: \"smooth\" })\n }, startDelayMs + dwellMs)\n\n return () => {\n window.clearTimeout(t1)\n window.clearTimeout(t2)\n }\n }, [isOverflowing, isReflowViewport, colPins, scrollRef])\n\n const lastLeftPinKey = [...displayCols].reverse().find(c => effectivePins[c.key] === \"left\")?.key\n const firstRightPinKey = displayCols.find(c => effectivePins[c.key] === \"right\")?.key\n\n function floatingHeaderPinnedStyle(key: string): React.CSSProperties | undefined {\n const pin = effectivePins[key]\n if (!pin) return undefined\n\n const visibleWidth =\n typeof floatingHeaderStyle?.width === \"number\"\n ? floatingHeaderStyle.width\n : tableWrapRef.current?.clientWidth ?? floatingHeaderTableWidth\n const maxScroll = Math.max(0, floatingHeaderTableWidth - visibleWidth)\n const translateX = pin === \"left\"\n ? headerScrollLeft\n : headerScrollLeft - maxScroll\n\n // The floating sticky header is horizontally translated as one table.\n // Counter-translate pinned header cells so they remain locked to the viewport edge.\n return { position: \"relative\", transform: `translateX(${translateX}px)` }\n }\n\n // Row IDs for the current visible rows\n const allRowIds = rows.map((r, i) => getRowId(r, i, getRowIdProp))\n const allSelected = rows.length > 0 && selected.size === rows.length\n const someSelected = selected.size > 0 && !allSelected\n const anySelected = selected.size > 0\n\n const { resolvedTheme } = useTheme()\n const isAppDark = resolvedTheme === \"dark\"\n\n const bulkBarUseFixedLayout = anySelected\n /** Reflow: bar spans table width. Normal zoom: bar centered, max 28rem. */\n const bulkBarFixedStyle = useBulkBarFixedToTableScrollEl(\n scrollRef,\n bulkBarUseFixedLayout,\n isReflowViewport,\n )\n const tableWrapRef = React.useRef<HTMLDivElement | null>(null)\n const tableHeadRef = React.useRef<HTMLTableSectionElement | null>(null)\n const [headerIsStuck, setHeaderIsStuck] = React.useState(false)\n const [headerScrollLeft, setHeaderScrollLeft] = React.useState(0)\n const [floatingHeaderStyle, setFloatingHeaderStyle] = React.useState<React.CSSProperties | undefined>(undefined)\n const [floatingHeaderTableWidth, setFloatingHeaderTableWidth] = React.useState(totalWidth)\n const [isClient, setIsClient] = React.useState(false)\n\n React.useEffect(() => {\n setIsClient(true)\n }, [])\n\n React.useEffect(() => {\n const wrapEl = tableWrapRef.current\n const headEl = tableHeadRef.current\n if (!wrapEl || !headEl || !showColumnHeaders) {\n setHeaderIsStuck(false)\n return\n }\n\n const update = () => {\n const wrapRect = wrapEl.getBoundingClientRect()\n const headHeight = headEl.getBoundingClientRect().height || 0\n const rootStyle = getComputedStyle(document.documentElement)\n const headerOffset = Number.parseFloat(rootStyle.getPropertyValue(\"--header-height\")) || 0\n const stuck = wrapRect.top <= headerOffset && wrapRect.bottom > (headHeight + headerOffset + 1)\n setHeaderIsStuck(prev => (prev === stuck ? prev : stuck))\n }\n\n update()\n // rAF-coalesce: capture-phase scroll fires for every ancestor (sidebar,\n // dashboard panels, anchored sheets), so a single getBoundingClientRect\n // per frame is more than enough to keep the sticky header aligned.\n const scheduled = rafThrottle(update)\n window.addEventListener(\"scroll\", scheduled, { passive: true, capture: true })\n window.addEventListener(\"resize\", scheduled, { passive: true })\n return () => {\n scheduled.cancel()\n window.removeEventListener(\"scroll\", scheduled, { capture: true })\n window.removeEventListener(\"resize\", scheduled)\n }\n }, [showColumnHeaders, rows.length, displayCols.length])\n\n React.useLayoutEffect(() => {\n if (!headerIsStuck || !showColumnHeaders) {\n setFloatingHeaderStyle(undefined)\n return\n }\n const wrapEl = tableWrapRef.current\n if (!wrapEl) {\n setFloatingHeaderStyle(undefined)\n return\n }\n\n const apply = () => {\n const rect = wrapEl.getBoundingClientRect()\n const rootStyle = getComputedStyle(document.documentElement)\n const headerOffset = Number.parseFloat(rootStyle.getPropertyValue(\"--header-height\")) || 0\n const cs = getComputedStyle(wrapEl)\n const borderLeft = parseFloat(cs.borderLeftWidth) || 0\n const borderRight = parseFloat(cs.borderRightWidth) || 0\n const visibleWidth = Math.max(0, wrapEl.clientWidth - borderLeft - borderRight)\n const renderedTableWidth = Math.max(\n totalWidth,\n visibleWidth,\n wrapEl.querySelector(\"table\")?.getBoundingClientRect().width ?? 0,\n )\n setFloatingHeaderStyle({\n position: \"fixed\",\n top: headerOffset,\n left: rect.left + borderLeft,\n width: visibleWidth,\n zIndex: 50,\n })\n setFloatingHeaderTableWidth(renderedTableWidth)\n setHeaderScrollLeft(wrapEl.scrollLeft)\n }\n\n apply()\n const scheduled = rafThrottle(apply)\n const ro = new ResizeObserver(scheduled)\n ro.observe(wrapEl)\n window.addEventListener(\"scroll\", scheduled, { passive: true, capture: true })\n window.addEventListener(\"resize\", scheduled, { passive: true })\n return () => {\n scheduled.cancel()\n ro.disconnect()\n window.removeEventListener(\"scroll\", scheduled, { capture: true })\n window.removeEventListener(\"resize\", scheduled)\n }\n }, [headerIsStuck, showColumnHeaders, totalWidth, displayCols.length])\n\n function ariaSortAttr(colKey: string): React.AriaAttributes[\"aria-sort\"] {\n return sortKey !== colKey ? \"none\" : sortDir === \"asc\" ? \"ascending\" : \"descending\"\n }\n\n function cellStyle(key: string): React.CSSProperties {\n return stickyStyle(key)\n }\n\n // ─── Render ───────────────────────────────────────────────────────────────\n return (\n <div className=\"flex min-w-0 w-full flex-col gap-0\">\n\n <DataTableToolbar\n state={state}\n columns={columns}\n searchable={searchable}\n renderFilterOptionValue={renderFilterOptionValue}\n toolbarSlot={toolbarSlot}\n searchAriaLabel=\"Search table\"\n />\n\n {isClient && showColumnHeaders && headerIsStuck && floatingHeaderStyle\n ? createPortal(\n <div\n style={floatingHeaderStyle}\n className=\"pointer-events-auto\"\n >\n <div className=\"overflow-hidden border border-border bg-dt-header-bg shadow-[0_10px_18px_-14px_rgba(15,23,42,0.5)] dark:shadow-[0_12px_20px_-14px_rgba(0,0,0,0.75)]\">\n <div style={{ transform: `translateX(${-headerScrollLeft}px)` }}>\n <table\n className=\"w-full text-sm border-separate border-spacing-0\"\n style={{ tableLayout: \"fixed\", width: floatingHeaderTableWidth }}\n >\n <colgroup>\n {displayCols.map(col => (\n <col key={col.key} style={{ width: colWidths[col.key] ?? col.width ?? 100 }} />\n ))}\n </colgroup>\n <thead className=\"bg-dt-header-bg\">\n <tr>\n {displayCols.map(col => {\n const isPinned = !!effectivePins[col.key]\n const isEdgePinCol = col.key === lastLeftPinKey || col.key === firstRightPinKey\n return (\n <th\n key={col.key}\n scope=\"col\"\n style={floatingHeaderPinnedStyle(col.key)}\n className={cn(\n \"h-9 px-3 text-start align-middle select-none\",\n \"text-xs font-medium text-muted-foreground tracking-wide\",\n \"bg-dt-header-bg border-b border-border\",\n showGridlines && (!isEdgePinCol\n ? \"border-e border-border last:border-e-0\"\n : \"last:border-e-0\"),\n isPinned ? \"z-40\" : \"z-30\",\n isPinned && \"relative\",\n isEdgePinCol && stickyShadow(effectivePins[col.key]),\n )}\n >\n <div className=\"flex items-center justify-between gap-1 min-w-0\">\n <div className=\"flex items-center min-w-0 flex-1\">\n {col.key === \"select\" ? (\n selectable && (\n <span className=\"inline-flex items-center justify-center self-center\">\n <span className=\"sr-only\">{resolvedColumnLabel(col)}</span>\n <Checkbox\n checked={allSelected ? true : someSelected ? \"indeterminate\" : false}\n onCheckedChange={() => toggleAll(allRowIds)}\n aria-label=\"Select all rows\"\n />\n </span>\n )\n ) : col.sortable && col.sortKey ? (\n <button\n type=\"button\"\n onClick={() => handleSortByKey(col.key)}\n className={cn(\n \"inline-flex items-center hover:text-interactive-hover-foreground transition-colors whitespace-nowrap\",\n sortKey === col.key && \"text-foreground\",\n )}\n >\n {col.label?.trim() ? col.label : resolvedColumnLabel(col)}\n {sortKey === col.key ? <SortChevron dir={sortDir} /> : null}\n </button>\n ) : (\n <span className=\"truncate whitespace-nowrap\">\n {col.label?.trim()\n ? col.label\n : defaultColumnHeaderLabel(col.key) ?? col.key}\n </span>\n )}\n </div>\n </div>\n </th>\n )\n })}\n </tr>\n </thead>\n </table>\n </div>\n </div>\n </div>,\n document.body,\n )\n : null}\n\n {/* ── Table ────────────────────────────────────────────────────────── */}\n <div\n ref={el => {\n tableWrapRef.current = el\n scrollRef.current = el\n }}\n onScroll={e => {\n handleScroll()\n setHeaderScrollLeft((e.currentTarget as HTMLDivElement).scrollLeft)\n }}\n className={cn(\n \"mx-4 lg:mx-6 overflow-x-auto border border-border\",\n hasFooter ? \"rounded-t-lg\" : \"rounded-lg\",\n )}\n >\n <table\n className=\"w-full text-sm border-separate border-spacing-0\"\n style={{\n tableLayout: \"fixed\",\n minWidth: totalWidth,\n width: headerIsStuck ? floatingHeaderTableWidth : undefined,\n }}\n >\n <colgroup>\n {displayCols.map(col => (\n <col key={col.key} style={{ width: colWidths[col.key] ?? col.width ?? 100 }} />\n ))}\n </colgroup>\n\n {/* ── Table head ──────────────────────────────────────────────── */}\n <thead\n ref={tableHeadRef}\n className={cn(\n \"bg-dt-header-bg\",\n headerIsStuck && \"invisible\",\n !showColumnHeaders && \"hidden\"\n )}\n >\n <tr>\n {displayCols.map(col => {\n const isPinned = !!effectivePins[col.key]\n const isLocked = !!lockedPins[col.key]\n const isFree = !colPins[col.key]\n const isResizable = !isLocked || (col.key !== \"select\")\n\n const isEdgePinCol = col.key === lastLeftPinKey || col.key === firstRightPinKey\n\n return (\n <th\n key={col.key}\n scope=\"col\"\n aria-sort={col.sortable && col.sortKey ? ariaSortAttr(col.sortKey as string) : undefined}\n draggable={isFree}\n onDragStart={isFree ? e => handleDragStart(col.key, e) : undefined}\n onDragOver={isFree ? e => handleDragOver(col.key, e) : undefined}\n onDrop={isFree ? () => handleDrop(col.key) : undefined}\n onDragEnd={isFree ? handleDragEnd : undefined}\n style={stickyStyle(col.key, false)}\n className={cn(\n \"group/th relative h-9 px-3 text-start align-middle select-none\",\n \"text-xs font-medium text-muted-foreground tracking-wide\",\n \"bg-dt-header-bg border-b border-border\",\n showGridlines && (!isEdgePinCol\n ? \"border-e border-border last:border-e-0\"\n : \"last:border-e-0\"),\n isPinned ? \"z-40\" : \"z-30\",\n isFree && \"cursor-grab active:cursor-grabbing\",\n dragOverKey === col.key && draggedKey.current !== col.key && \"bg-accent/40\",\n isEdgePinCol && stickyShadow(effectivePins[col.key])\n )}\n >\n <div className=\"flex items-center justify-between gap-1 min-w-0\">\n <div className=\"flex items-center min-w-0 flex-1\">\n {col.header ? (\n col.header()\n ) : col.key === \"select\" ? (\n selectable && (\n <span className=\"inline-flex items-center justify-center self-center\">\n <span className=\"sr-only\">{resolvedColumnLabel(col)}</span>\n <Checkbox\n checked={allSelected ? true : someSelected ? \"indeterminate\" : false}\n onCheckedChange={() => toggleAll(allRowIds)}\n aria-label=\"Select all rows\"\n />\n </span>\n )\n ) : col.sortable && col.sortKey ? (\n <Tip label={`Sort by ${resolvedColumnLabel(col)}`} side=\"top\">\n <button\n type=\"button\"\n onClick={() => handleSortByKey(col.key)}\n className={cn(\n \"inline-flex items-center hover:text-interactive-hover-foreground transition-colors whitespace-nowrap\",\n sortKey === col.key && \"text-foreground\"\n )}\n >\n {col.label?.trim() ? col.label : resolvedColumnLabel(col)}\n {sortKey === col.key && <SortChevron dir={sortDir} />}\n </button>\n </Tip>\n ) : (\n <Tip label={resolvedColumnLabel(col)} side=\"top\">\n <span className=\"whitespace-nowrap\">\n {col.label?.trim() ? (\n col.label\n ) : defaultColumnHeaderLabel(col.key) ? (\n <span className=\"sr-only\">{defaultColumnHeaderLabel(col.key)}</span>\n ) : (\n <span className=\"sr-only\">{col.key}</span>\n )}\n </span>\n </Tip>\n )}\n </div>\n\n {/* Column context menu — not on checkbox or locked-right columns */}\n {col.key !== \"select\" && !lockedPins[col.key]?.includes(\"right\") && col.key !== (columns.find(c => c.lockPin && c.defaultPin === \"right\")?.key) && (\n <DropdownMenu>\n <Tip label=\"Column options\" side=\"top\">\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={`${resolvedColumnLabel(col)} column options`}\n onClick={e => e.stopPropagation()}\n className={cn(\n \"opacity-0 group-hover/th:opacity-100 group-focus-within/th:opacity-100\",\n \"inline-flex shrink-0 items-center justify-center size-7 rounded-md\",\n \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover-row\",\n \"transition-opacity focus-visible:opacity-100\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n )}\n >\n <i className=\"fa-light fa-ellipsis-vertical text-xs\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n </Tip>\n <DropdownMenuContent\n align=\"start\"\n onCloseAutoFocus={() => {\n const action = columnMenuPendingActionRef.current\n if (!action) return\n columnMenuPendingActionRef.current = null\n action()\n }}\n >\n\n {/* Column quick-search */}\n <div className=\"px-2 pt-2 pb-1\">\n <div className=\"relative\">\n <i className=\"fa-light fa-magnifying-glass absolute start-2 top-1/2 -translate-y-1/2 text-muted-foreground text-xs pointer-events-none\" aria-hidden=\"true\" />\n <Input\n placeholder={`Search ${resolvedColumnLabel(col)}…`}\n value={colMenuSearch[col.key] ?? \"\"}\n onChange={e => setColMenuSearch(prev => ({ ...prev, [col.key]: e.target.value }))}\n onKeyDown={e => e.stopPropagation()}\n className=\"h-7 ps-6 text-xs\"\n />\n {colMenuSearch[col.key] && (\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onClick={() => setColMenuSearch(prev => ({ ...prev, [col.key]: \"\" }))}\n className=\"absolute end-1.5 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-interactive-hover-foreground transition-colors\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n <DropdownMenuSeparator />\n\n {/* Pin options */}\n {!isLocked && (\n <>\n <DropdownMenuItem\n onClick={() => pinColumn(col.key, \"left\")}\n disabled={colPins[col.key] === \"left\"}\n >\n <i className=\"fa-light fa-arrow-left-to-line\" aria-hidden=\"true\" />\n Pin Left\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => pinColumn(col.key, \"right\")}\n disabled={colPins[col.key] === \"right\"}\n >\n <i className=\"fa-light fa-arrow-right-to-line\" aria-hidden=\"true\" />\n Pin Right\n </DropdownMenuItem>\n {colPins[col.key] && (\n <DropdownMenuItem onClick={() => unpinColumn(col.key)}>\n <i className=\"fa-light fa-thumbtack-slash\" aria-hidden=\"true\" />\n Unpin\n </DropdownMenuItem>\n )}\n <DropdownMenuSeparator />\n </>\n )}\n\n {/* Sort options */}\n {col.sortable && col.sortKey && (\n <>\n <DropdownMenuItem onClick={() => setSortRules(prev => {\n const filtered = prev.filter(r => r.fieldKey !== col.key)\n return [{ id: `sort-${Date.now()}`, fieldKey: col.key, direction: \"asc\" as const }, ...filtered]\n })}>\n <i className=\"fa-light fa-arrow-up-a-z text-xs shrink-0\" aria-hidden=\"true\" />\n Sort Ascending\n </DropdownMenuItem>\n <DropdownMenuItem onClick={() => setSortRules(prev => {\n const filtered = prev.filter(r => r.fieldKey !== col.key)\n return [{ id: `sort-${Date.now()}`, fieldKey: col.key, direction: \"desc\" as const }, ...filtered]\n })}>\n <i className=\"fa-light fa-arrow-down-a-z text-xs shrink-0\" aria-hidden=\"true\" />\n Sort Descending\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n\n {/* Text wrap toggle */}\n <DropdownMenuItem onClick={() => toggleWrap(col.key)}>\n <i className=\"fa-light fa-text-width\" aria-hidden=\"true\" />\n {colWrap[col.key] ? \"Unwrap Text\" : \"Wrap Text\"}\n </DropdownMenuItem>\n\n {/* Filter / Group by */}\n <DropdownMenuSeparator />\n {col.filter && (\n <DropdownMenuItem onClick={() => addFilter(col.key)}>\n <i className=\"fa-light fa-filter\" aria-hidden=\"true\" />\n Filter by this column\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onClick={() => setGroupBy(groupBy === col.key ? null : col.key)}\n >\n <i className=\"fa-light fa-layer-group\" aria-hidden=\"true\" />\n {groupBy === col.key ? \"Remove Grouping\" : \"Group by this Column\"}\n </DropdownMenuItem>\n\n {/* Conditional rule shortcut */}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onSelect={() => {\n // Queue the deep-link into `onCloseAutoFocus` (above).\n // Opening the non-modal Properties Sheet synchronously\n // here races with the DropdownMenu close cycle and the\n // Sheet's outside-interaction listener — neither RAF\n // nor setTimeout(0) is enough. `onCloseAutoFocus` is\n // Radix's official \"menu is fully closed and focus has\n // returned\" hook, so it's the only safe moment.\n // Set the panel + open in the same batched action —\n // both setState calls land in one render so the drawer\n // opens already focused on the Conditional rules panel.\n columnMenuPendingActionRef.current = () => {\n setSheetInitialPanel(\"conditional-rules\")\n setSheetOpen(true)\n }\n }}\n >\n <i className=\"fa-light fa-palette\" aria-hidden=\"true\" />\n Add Conditional Rule\n </DropdownMenuItem>\n\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n\n {/* Resize handle */}\n {isResizable && col.key !== \"select\" && (\n <div\n role=\"separator\"\n aria-label={`Resize ${resolvedColumnLabel(col)} column`}\n aria-orientation=\"vertical\"\n onMouseDown={e => startResize(col.key, e)}\n className=\"absolute end-0 top-1 bottom-1 w-1.5 cursor-col-resize rounded-full hover:bg-interactive-hover-foreground/50 active:bg-muted-foreground/70 transition-colors\"\n />\n )}\n </th>\n )\n })}\n </tr>\n </thead>\n\n {/* ── Table body ───────────────────────────────────────────────── */}\n <tbody>\n {(pagedRows !== rows\n ? [{ groupKey: null as string | null, groupLabel: null as string | null, rows: pagedRows }]\n : groupedRows\n ).map(({ groupKey, groupLabel, rows: groupRows }) => (\n <React.Fragment key={groupKey ?? \"__all__\"}>\n {groupLabel && (\n <tr>\n <td colSpan={displayCols.length} className=\"p-0 border-b border-border bg-dt-group-bg\">\n <div\n className={cn(\n \"sticky start-0 z-[25] px-4 py-1.5 text-xs font-semibold text-muted-foreground tracking-wide bg-dt-group-bg select-none\",\n !isReflowViewport && \"shadow-[4px_0_8px_-4px_var(--sticky-edge-fade)]\",\n )}\n style={{ width: \"var(--dt-scrollport-width, 100%)\" }}\n >\n {groupLabel}\n <span className=\"ms-2 font-normal normal-case opacity-60 tracking-normal\">\n {groupRows.length} record{groupRows.length !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n </td>\n </tr>\n )}\n {groupRows.map((row, rowIndex) => {\n const rowId = getRowId(row, rowIndex, getRowIdProp)\n const isSelected = selected.has(rowId)\n const rowClickable = Boolean(onRowClick) || selectable\n function handleRowClick(e: React.MouseEvent<HTMLTableRowElement>) {\n if (!rowClickable) return\n const el = e.target as HTMLElement | null\n if (!el) return\n if (el.closest(\"button, a, input, textarea, select, label, [role='checkbox']\")) return\n if (onRowClick) {\n onRowClick(row)\n return\n }\n if (selectable) {\n toggleRow(rowId)\n }\n }\n return (\n <tr\n key={String(rowId)}\n data-state={isSelected ? \"selected\" : undefined}\n onMouseEnter={() => setHoveredRow(rowId)}\n onMouseLeave={() => setHoveredRow(null)}\n onClick={rowClickable ? handleRowClick : undefined}\n data-new={Boolean((row as Record<string, unknown>).isNew) || undefined}\n className={cn(\n \"group/row transition-colors\",\n \"hover:bg-dt-row-hover\",\n isSelected && \"bg-dt-row-selected text-dt-row-selected-fg\",\n rowClickable && \"cursor-pointer\",\n Boolean((row as Record<string, unknown>).isNew) && \"bg-dt-new-row-bg border-s-2 border-s-dt-new-row-border\"\n )}\n >\n {displayCols.map(col => {\n const isPinned = !!effectivePins[col.key]\n const wrap = colWrap[col.key]\n const isEdgePin = col.key === lastLeftPinKey || col.key === firstRightPinKey\n const rowPy = rowHeight === \"compact\" ? \"py-1\" : rowHeight === \"comfortable\" ? \"py-4\" : \"py-2.5\"\n const cs = cellStyle(col.key)\n\n const tdBase = cn(\n `px-3 ${rowPy} align-middle`,\n showGridlines && !isEdgePin && \"border-e border-border last:border-e-0\",\n \"border-b border-border group-last/row:border-b-0\",\n isPinned && [\n \"z-20 pinned-cell\",\n \"bg-dt-row-bg\",\n \"group-data-[state=selected]/row:bg-dt-row-selected\",\n \"group-hover/row:bg-dt-row-hover\",\n isEdgePin && stickyShadow(effectivePins[col.key]),\n ]\n )\n\n const conditionalBg = getConditionalCellBackground(\n row,\n col.key,\n conditionalRules,\n columns,\n )\n\n const tdStyle = conditionalBg\n ? { ...cs, background: conditionalBg }\n : cs\n\n // Special synthetic columns\n if (col.key === \"select\") {\n const selectionLabel = getRowSelectionLabel?.(row, rowIndex)\n const ariaLabel = selectionLabel\n ? `Select row, ${selectionLabel}`\n : `Select row ${rowIndex + 1}`\n return (\n <td key=\"select\" className={cn(tdBase, \"text-center\")} style={tdStyle}>\n {selectable && (\n // inline-flex: inline elements inside <td> are never\n // stretched by table-cell height in Chrome/Safari/Firefox.\n // Block-level flex/grid always inherits full cell height at zoom.\n <span\n className={cn(\n \"inline-flex items-center justify-center transition-opacity\",\n anySelected\n ? \"opacity-100\"\n : \"opacity-0 group-hover/row:opacity-100 group-focus-within/row:opacity-100\",\n )}\n onClick={e => e.stopPropagation()}\n >\n <Checkbox\n checked={isSelected}\n onCheckedChange={() => toggleRow(rowId)}\n aria-label={ariaLabel}\n onClick={e => e.stopPropagation()}\n />\n </span>\n )}\n </td>\n )\n }\n\n // Custom cell renderer\n if (col.cell) {\n return (\n <td\n key={col.key}\n className={cn(\n tdBase,\n // When wrap is on, override truncate/overflow on any descendant\n wrap && \"[&_.truncate]:!whitespace-normal [&_.truncate]:!overflow-visible [&_.truncate]:!text-clip\",\n )}\n style={tdStyle}\n >\n {col.cell(row, {\n rowIndex,\n selected: isSelected,\n onSelect: checked => checked ? setSelected(prev => new Set([...prev, rowId])) : toggleRow(rowId),\n })}\n </td>\n )\n }\n\n // Default: render string value with optional truncation\n const rawVal = String(row[col.key] ?? \"\")\n return (\n <td key={col.key} className={cn(tdBase, \"text-sm text-foreground/80\")} style={tdStyle}>\n <span className={wrap ? \"whitespace-normal\" : \"block truncate\"} title={!wrap ? rawVal : undefined}>\n {rawVal}\n </span>\n </td>\n )\n })}\n </tr>\n )\n })}\n </React.Fragment>\n ))}\n\n {/* Empty state */}\n {rows.length === 0 && (\n <tr>\n <td colSpan={displayCols.length} className=\"h-24 px-3 text-center text-sm text-muted-foreground\">\n {emptyState ?? \"No results match your filters.\"}\n </td>\n </tr>\n )}\n\n {/* Add new row stub */}\n {addRowLabel !== false && (\n <tr\n role=\"button\"\n tabIndex={0}\n onKeyDown={e => { if (e.key === \"Enter\" || e.key === \" \") e.preventDefault() }}\n className=\"cursor-pointer hover:bg-dt-row-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\"\n aria-label={`Add new ${addRowLabel}`}\n >\n <td colSpan={displayCols.length} className=\"px-3 py-2.5 align-middle\">\n <span className=\"flex items-center gap-1.5 text-sm text-muted-foreground\">\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n {addRowLabel}\n </span>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {/* ── Bulk selection bar — dark strip in light app; light strip in dark app.\n Normal zoom: max ~28rem, centered. Reflow: full table width. Inner\n `dark` in light app → shadcn `dark:` buttons; in dark app → explicit\n light-surface button overrides.\n */}\n {anySelected && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`${selected.size} row${selected.size !== 1 ? \"s\" : \"\"} selected`}\n data-exxat-bulk-bar=\"\"\n style={bulkBarFixedStyle}\n className={cn(\n \"flex min-w-0 max-w-full items-stretch overflow-hidden\",\n isAppDark\n ? \"rounded-lg border border-zinc-300/80 bg-zinc-100 text-zinc-900 shadow-lg\"\n : \"rounded-lg border border-zinc-800 bg-zinc-900 text-zinc-100 shadow-lg\",\n \"animate-in fade-in-0 duration-150\",\n \"w-auto max-w-none\",\n )}\n >\n <div\n className={cn(\n \"flex shrink-0 items-center gap-2 border-e py-2.5 ps-3 pe-2\",\n isAppDark ? \"border-zinc-300/50\" : \"border-zinc-600/50\",\n )}\n aria-hidden=\"true\"\n >\n <span\n className={cn(\n \"inline-flex size-8 items-center justify-center rounded-md\",\n isAppDark ? \"text-zinc-500\" : \"text-zinc-400\",\n )}\n aria-hidden=\"true\"\n >\n <i className=\"fa-light fa-clipboard-list text-[1.1rem] leading-none\" />\n </span>\n <span\n className={cn(\n \"min-w-6 rounded-md px-1.5 py-0.5 text-center text-xs font-semibold leading-none tabular-nums\",\n isAppDark ? \"bg-zinc-200/90 text-zinc-900\" : \"bg-zinc-800 text-zinc-100\",\n )}\n >\n {selected.size}\n </span>\n </div>\n\n <div\n className={cn(\n \"flex min-w-0 min-h-0 flex-1 items-stretch\",\n !isAppDark && \"dark\",\n isAppDark && BULK_BAR_ON_LIGHT_STRIP,\n )}\n >\n <div\n className={cn(\n \"min-w-0 flex-1 self-center\",\n \"overflow-x-auto overscroll-x-contain [scrollbar-width:thin] [touch-action:pan-x]\",\n )}\n >\n <div className=\"flex w-max min-w-0 max-w-full flex-nowrap items-center gap-2 py-2.5 ps-2 pe-2\">\n {bulkActionsSlot ? (\n bulkActionsSlot(selected, rows)\n ) : (\n <>\n <Button size=\"sm\" variant=\"outline\" className=\"shrink-0\">\n <i className=\"fa-light fa-arrow-down-to-line\" aria-hidden=\"true\" /> Export\n </Button>\n <Button size=\"sm\" variant=\"destructive\" className=\"shrink-0\">\n <i className=\"fa-light fa-trash\" aria-hidden=\"true\" /> Delete\n </Button>\n </>\n )}\n </div>\n </div>\n\n <div\n className={cn(\n \"flex shrink-0 items-center border-e py-2.5 ps-2 pe-2.5\",\n isAppDark ? \"border-zinc-300/50\" : \"border-zinc-600/50\",\n )}\n >\n <Tip label=\"Clear selection\" side=\"top\">\n <Button\n type=\"button\"\n size=\"icon-sm\"\n variant=\"ghost\"\n aria-label=\"Clear selection\"\n onClick={() => setSelected(new Set())}\n className=\"shrink-0\"\n >\n <i className=\"fa-light fa-xmark\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n}\n\nfunction DataTableWithInternalState<TData extends Record<string, unknown>>(props: DataTableExtendedProps<TData>) {\n const state = useTableState(props.data, props.columns, props.defaultSort, props.paginationOverride)\n return <DataTableInner {...props} state={state} />\n}\n\nexport function DataTable<TData extends Record<string, unknown>>(props: DataTableExtendedProps<TData>) {\n if (props.state) {\n return <DataTableInner {...props} state={props.state} />\n }\n return <DataTableWithInternalState {...props} />\n}\n","\"use client\"\n\n/**\n * DataTablePaginated<TData> — DataTable with a bottom pagination bar\n *\n * Adds:\n * • \"Rows per page\" selector\n * • First / Previous / Next / Last page buttons\n * • \"{from}–{to} of {total}\" status span (role=\"status\" aria-live=\"polite\")\n * • Keyboard: Left/Right arrow keys on the pagination bar change page\n *\n * Everything else (columns, pinning, resize, DnD, sort, filters, group,\n * selection) is identical to DataTable — they share useTableState.\n *\n * Props: DataTableProps<TData> & { pagination?: PaginationConfig }\n */\n\nimport * as React from \"react\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport { Tip } from \"../ui/tip\"\nimport { TooltipProvider } from \"../ui/tooltip\"\nimport { DataTable, type DataTableExtendedProps } from \"./index\"\nimport type { PaginationConfig } from \"./types\"\nimport type { useTableState } from \"./use-table-state\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// PaginationBar\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface PaginationBarProps {\n page: number\n pageSize: number\n total: number\n pageSizeOptions: number[]\n onPageChange: (p: number) => void\n onPageSizeChange: (n: number) => void\n}\n\nexport function PaginationBar({\n page,\n pageSize,\n total,\n pageSizeOptions,\n onPageChange,\n onPageSizeChange,\n}: PaginationBarProps) {\n const totalPages = Math.max(1, Math.ceil(total / pageSize))\n const from = Math.min((page - 1) * pageSize + 1, total)\n const to = Math.min(page * pageSize, total)\n\n function handleKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (e.key === \"ArrowLeft\" && page > 1) {\n e.preventDefault()\n onPageChange(page - 1)\n } else if (e.key === \"ArrowRight\" && page < totalPages) {\n e.preventDefault()\n onPageChange(page + 1)\n }\n }\n\n return (\n <div\n className=\"flex items-center justify-between px-4 py-2.5 border-t border-border bg-background text-sm select-none\"\n onKeyDown={handleKeyDown}\n >\n {/* Rows per page */}\n <div className=\"flex items-center gap-2 text-muted-foreground\">\n <span>Rows per page</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Rows per page\"\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded border border-input bg-background hover:bg-interactive-hover text-foreground text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {pageSize}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-20\">\n {pageSizeOptions.map(n => (\n <DropdownMenuItem key={n} onClick={() => onPageSizeChange(n)}>\n {n}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n\n {/* Nav */}\n <div className=\"flex items-center gap-3\">\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"text-muted-foreground tabular-nums\"\n >\n {total === 0 ? \"0 results\" : `${from}–${to} of ${total}`}\n </span>\n <TooltipProvider>\n <div className=\"flex items-center gap-1\">\n <Tip label=\"First page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"First page\"\n disabled={page === 1}\n onClick={() => onPageChange(1)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevrons-left text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <Tip label=\"Previous page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"Previous page\"\n disabled={page === 1}\n onClick={() => onPageChange(page - 1)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevron-left text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <span className=\"px-2 text-muted-foreground tabular-nums\">\n {page} / {totalPages}\n </span>\n <Tip label=\"Next page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"Next page\"\n disabled={page >= totalPages}\n onClick={() => onPageChange(page + 1)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevron-right text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <Tip label=\"Last page\" side=\"top\">\n <button\n type=\"button\"\n aria-label=\"Last page\"\n disabled={page >= totalPages}\n onClick={() => onPageChange(totalPages)}\n className=\"inline-flex items-center justify-center size-7 rounded hover:bg-interactive-hover disabled:opacity-40 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevrons-right text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n </div>\n </TooltipProvider>\n </div>\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DataTablePaginated<TData>\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DataTablePaginatedProps<TData extends Record<string, unknown>>\n extends DataTableExtendedProps<TData> {\n pagination?: PaginationConfig\n}\n\nexport function DataTablePaginated<TData extends Record<string, unknown>>({\n data,\n columns,\n pagination,\n defaultSort,\n ...rest\n}: DataTablePaginatedProps<TData>) {\n const config = {\n pageSize: pagination?.pageSize ?? 10,\n pageSizeOptions: pagination?.pageSizeOptions ?? [10, 25, 50, 100],\n }\n\n const [page, setPage] = React.useState(1)\n const [pageSize, setPageSize] = React.useState(config.pageSize)\n\n // filteredCount: total rows after filters (driven by inner table state via CountSyncer)\n const [filteredCount, setFilteredCount] = React.useState(data.length)\n\n const totalPages = Math.max(1, Math.ceil(filteredCount / pageSize))\n const safePage = Math.min(page, totalPages)\n\n function handlePageSizeChange(n: number) {\n setPageSize(n)\n setPage(1)\n }\n\n // Wrap toolbarSlot to intercept state.rows.length (a number — no circular ref)\n const originalToolbarSlot = rest.toolbarSlot\n const toolbarSlot = React.useCallback(\n (state: ReturnType<typeof useTableState<TData>>) => (\n <>\n <CountSyncer count={state.rows.length} onSync={setFilteredCount} onReset={() => setPage(1)} />\n {originalToolbarSlot ? originalToolbarSlot(state) : null}\n </>\n ),\n [originalToolbarSlot],\n )\n\n return (\n <div className=\"flex flex-col gap-0\">\n <DataTable\n {...rest}\n data={data}\n columns={columns}\n defaultSort={defaultSort}\n toolbarSlot={toolbarSlot}\n paginationOverride={{ page: safePage, pageSize }}\n hasFooter\n />\n <div className=\"mx-4 lg:mx-6 border-x border-b border-border rounded-b-lg overflow-hidden\">\n <PaginationBar\n page={safePage}\n pageSize={pageSize}\n total={filteredCount}\n pageSizeOptions={config.pageSizeOptions}\n onPageChange={setPage}\n onPageSizeChange={handlePageSizeChange}\n />\n </div>\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CountSyncer — syncs filtered row count (a number) to parent without loops.\n// Syncing a primitive avoids the circular-reference issue of syncing an array.\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function CountSyncer({\n count,\n onSync,\n onReset,\n}: {\n count: number\n onSync: (n: number) => void\n onReset: () => void\n}) {\n const prevCount = React.useRef(count)\n React.useLayoutEffect(() => {\n if (prevCount.current !== count) {\n prevCount.current = count\n onSync(count)\n onReset()\n }\n }, [count, onSync, onReset])\n return null\n}\n","/**\n * Data list “view type” — shared by Properties drawer, ListPageTemplate tabs, and client state.\n *\n * **Single source of truth** for view labels/icons: use `DATA_LIST_VIEW_TILES` and\n * `dataListViewLabel` / `dataListViewIcon` on every page so Table / List / Board / Dashboard\n * stay consistent and stay wired to the same `useTableState` dataset (see `docs/data-views-pattern.md`).\n */\nexport type DataListViewType =\n | \"table\"\n | \"list\"\n | \"board\"\n | \"dashboard\"\n | \"calendar\"\n | \"folder\"\n | \"panel\"\n | \"tree-panel\"\n\nexport const DATA_LIST_VIEW_TILES: readonly {\n value: DataListViewType\n label: string\n icon: string\n}[] = [\n { value: \"table\", icon: \"fa-table\", label: \"Table view\" },\n { value: \"list\", icon: \"fa-list\", label: \"List view\" },\n { value: \"board\", icon: \"fa-table-columns\", label: \"Board view\" },\n { value: \"dashboard\", icon: \"fa-chart-mixed\", label: \"Dashboard view\" },\n { value: \"calendar\", icon: \"fa-calendar-days\", label: \"Calendar view\" },\n { value: \"folder\", icon: \"fa-grid-2\", label: \"Folder view\" },\n { value: \"panel\", icon: \"fa-sidebar\", label: \"List & details\" },\n { value: \"tree-panel\", icon: \"fa-sitemap\", label: \"Tree & details\" },\n]\n\n/** User-facing name for tabs, Properties summary rows, and tooltips (not entity-specific). */\nexport function dataListViewLabel(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.label ?? view\n}\n\n/** Font Awesome icon class (no prefix) for tab / toolbar state when view changes. */\nexport function dataListViewIcon(view: DataListViewType): string {\n return DATA_LIST_VIEW_TILES.find(t => t.value === view)?.icon ?? \"fa-table\"\n}\n\n/** Add-view menu hint + `<Shortcut>` keys (1–9). Skipped in inputs via `useShortcut`. */\nexport function dataListViewAddShortcut(index: number): string | undefined {\n if (index < 0 || index > 8) return undefined\n return String(index + 1)\n}\n","/**\n * Maps `DataListViewType` to the UI surface pattern for list pages.\n *\n * **Data:** One `useTableState(fullRows, columns, …)` per tab; **filtered/sorted rows**\n * (`tableState.rows`) are the single source of truth for List, Board, and Dashboard.\n * Table view renders the same state via `DataTable`.\n *\n * | View | Surface |\n * |------------|---------|\n * | `table` | `DataTable` |\n * | `list` | `DataTableToolbar` + list layout |\n * | `board` | `DataTableToolbar` + board / kanban |\n * | `dashboard`| `DataTableToolbar` + KPI (`KeyMetrics`) + optional charts (`ChartCard`, Recharts, etc.) |\n * | `calendar` | `DataTableToolbar` + `ListPageCalendarView` (month grid + day detail) |\n * | `folder` | `DataTableToolbar` + icon grid (macOS-Finder-style) |\n * | `panel` | `DataTableToolbar` + resizable split (list / tree column + detail inspector) |\n */\n\nimport type { DataListViewType } from \"./data-list-view\"\n\nexport { showsListPageHubMetricsStrip } from \"./data-list-view-registry\"\n\n/** What to render for the active view tab (routing / branching). */\nexport type DataListViewRenderKind =\n | \"data-table\"\n | \"list-with-toolbar\"\n | \"board-with-toolbar\"\n | \"dashboard-with-toolbar\"\n | \"calendar-with-toolbar\"\n | \"folder-with-toolbar\"\n | \"panel-with-toolbar\"\n | \"tree-panel-with-toolbar\"\n\n/**\n * Stable classification for switch/if chains. **Every** `DataListViewType` maps to exactly one kind.\n * Use this so `dashboard` is never mistaken for `board` (a common bug when only `list` is special-cased).\n */\nexport function getDataListViewRenderKind(view: DataListViewType): DataListViewRenderKind {\n switch (view) {\n case \"table\":\n return \"data-table\"\n case \"list\":\n return \"list-with-toolbar\"\n case \"board\":\n return \"board-with-toolbar\"\n case \"dashboard\":\n return \"dashboard-with-toolbar\"\n case \"calendar\":\n return \"calendar-with-toolbar\"\n case \"folder\":\n return \"folder-with-toolbar\"\n case \"panel\":\n return \"panel-with-toolbar\"\n case \"tree-panel\":\n return \"tree-panel-with-toolbar\"\n default: {\n const _x: never = view\n return _x\n }\n }\n}\n\nexport function usesDataTableComponent(view: DataListViewType): boolean {\n return view === \"table\"\n}\n\n/** KPI band + optional charts — not the kanban board. */\nexport function usesDashboardSurface(view: DataListViewType): boolean {\n return view === \"dashboard\"\n}\n\n/** Shared toolbar (search, filters, properties); body differs by view. */\nexport function usesToolbarWithFilteredRows(view: DataListViewType): boolean {\n return (\n view === \"list\" ||\n view === \"board\" ||\n view === \"dashboard\" ||\n view === \"calendar\" ||\n view === \"folder\" ||\n view === \"panel\" ||\n view === \"tree-panel\"\n )\n}\n","/**\n * Central registry for list-page view types — labels, render kinds, and hub chrome rules.\n *\n * **Add a new view once here** (plus a body in `components/data-views/`). Hubs declare\n * `supportedViewTypes` on `ListPageTemplate`; table components branch with\n * `getDataListViewRenderKind` + `ListPageConnectedViewBody` (never a dashboard fallback).\n *\n * @see `docs/data-views-pattern.md` — \"View registry and connected bodies\"\n */\n\nimport {\n DATA_LIST_VIEW_TILES,\n type DataListViewType,\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n} from \"./data-list-view\"\nimport {\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n} from \"./data-list-view-surface\"\n\nexport interface DataListViewDefinition {\n value: DataListViewType\n label: string\n icon: string\n renderKind: DataListViewRenderKind\n /** `ListPageTemplate` metrics slot above the views toolbar. */\n hubMetricsStrip: boolean\n}\n\nconst DEFINITIONS: DataListViewDefinition[] = DATA_LIST_VIEW_TILES.map(tile => {\n const renderKind = getDataListViewRenderKind(tile.value)\n const hubMetricsStrip = renderKind !== \"calendar-with-toolbar\" && renderKind !== \"dashboard-with-toolbar\"\n return {\n value: tile.value,\n label: tile.label,\n icon: tile.icon,\n renderKind,\n hubMetricsStrip,\n }\n})\n\nconst BY_VALUE = new Map<DataListViewType, DataListViewDefinition>(\n DEFINITIONS.map(d => [d.value, d]),\n)\n\nexport const DATA_LIST_VIEW_REGISTRY: readonly DataListViewDefinition[] = DEFINITIONS\n\nexport function dataListViewDefinition(view: DataListViewType): DataListViewDefinition {\n const def = BY_VALUE.get(view)\n if (!def) {\n throw new Error(`Unknown DataListViewType: ${view}`)\n }\n return def\n}\n\n/** `ListPageTemplate` hub KPI strip — false for calendar and dashboard (inline KPIs). */\nexport function showsListPageHubMetricsStrip(view: DataListViewType): boolean {\n return dataListViewDefinition(view).hubMetricsStrip\n}\n\n/** Tiles for Add view + Properties when a hub only supports a subset of views. */\nexport function dataListViewTilesForHub(supported: readonly DataListViewType[]) {\n const allowed = new Set(supported)\n return DATA_LIST_VIEW_REGISTRY.filter(d => allowed.has(d.value)).map(d => ({\n type: d.value,\n label: d.label,\n icon: d.icon,\n }))\n}\n\n/** `SelectionTileGrid` options for Properties when a hub supports a subset of views. */\nexport function dataListViewSelectionTilesForHub(supported: readonly DataListViewType[]) {\n return dataListViewTilesForHub(supported).map(t => ({\n value: t.type,\n label: t.label,\n icon: t.icon,\n }))\n}\n\n/** View types that expose Table Properties (all registered `DataListViewType` values). */\nexport const DATA_LIST_SURFACE_VIEW_TYPES: ReadonlySet<DataListViewType> = new Set(\n DATA_LIST_VIEW_REGISTRY.map(d => d.value),\n)\n\nexport function isDataListSurfaceViewType(viewType: string): viewType is DataListViewType {\n return DATA_LIST_SURFACE_VIEW_TYPES.has(viewType as DataListViewType)\n}\n\nexport function isDataListViewTypeSupported(\n view: DataListViewType,\n supported: readonly DataListViewType[],\n): boolean {\n return supported.includes(view)\n}\n\nexport {\n dataListViewAddShortcut,\n dataListViewIcon,\n dataListViewLabel,\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n}\n","/**\n * Display options for Data list (table / board / etc.) — shared across view types\n * so hide/show preferences persist when switching views.\n */\n\nexport type BoardLineCount = 1 | 2 | 3\n\nexport interface DataListDisplayOptions {\n /**\n * Board swimlanes: dataset field (table column key) used to split cards into columns.\n * Each hub passes allowed keys via `TablePropertiesDrawer` `boardGroupByColumnOptions`.\n */\n boardGroupByColumnKey: string\n /** Max lines for primary text blocks on board cards */\n boardLineCount: BoardLineCount\n /** Page title block (Placements + subtitle) */\n showViewTitle: boolean\n /** Board: phase column titles + descriptions. Table: column header row. */\n showColumnLabels: boolean\n /** Board: “N cards” under each phase column */\n showBoardColumnCounts: boolean\n boardNewCardAbove: boolean\n /** Toolbar search control (table view) */\n showToolbarSearch: boolean\n}\n\nexport const DEFAULT_DATA_LIST_DISPLAY_OPTIONS: DataListDisplayOptions = {\n boardGroupByColumnKey: \"topic\",\n boardLineCount: 2,\n showViewTitle: true,\n showColumnLabels: true,\n showBoardColumnCounts: true,\n boardNewCardAbove: true,\n showToolbarSearch: true,\n}\n","/**\n * Table row density — shared by Properties drawer tiles and useTableState.\n *\n * Three steps modelled after Linear / Notion / Airtable density toggles.\n * `default` is the design-system baseline (`h-9` rows, `text-sm`); the\n * other two scale the row height + vertical padding without changing the\n * font size, so dense tables stay legible.\n */\nexport type RowHeight = \"compact\" | \"default\" | \"comfortable\"\n\nexport const ROW_HEIGHT_TILES: readonly {\n value: RowHeight\n label: string\n icon: string\n}[] = [\n { value: \"compact\", label: \"Compact\", icon: \"fa-down-to-line\" },\n { value: \"default\", label: \"Default\", icon: \"fa-arrows-up-down\" },\n { value: \"comfortable\", label: \"Comfortable\", icon: \"fa-up-to-line\" },\n]\n","\"use client\"\n\n/**\n * Radio group — Radix `RadioGroup` + `RadioGroupItem` with Exxat styling.\n *\n * Aligned with Shadcn Studio radio-group guidance (see shadcnstudio.com/docs/components/radio-group):\n * • Visual variants: default, outline, secondary, success, destructive, warning, muted\n * • Sizes: sm, default, lg (outer ring + inner dot scale together)\n * • Motion: none | pop | glow | pop-glow — `motion-safe` / `motion-reduce` (WCAG 2.3.3)\n * • Optional group defaults: `<RadioGroup itemVariant=\"outline\" itemSize=\"sm\">` so items inherit\n * • Per-item overrides: `<RadioGroupItem variant=\"success\" />`\n * • Forms: `aria-invalid`, `disabled`, hit slop (`after:`); pair with `RadioGroupLabel` + `htmlFor` / `id`\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { RadioGroup as RadioGroupPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\n// ── Item chrome (variants / sizes / motion) ─────────────────────────────────\n\nconst radioGroupItemVariants = cva(\n [\n \"group/radio-group-item peer relative flex shrink-0 aspect-square rounded-full border border-input\",\n \"outline-none transition-[color,box-shadow,transform,background-color,border-color] duration-150\",\n \"motion-reduce:transition-none\",\n \"group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2\",\n \"focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:data-[state=checked]:border-primary\",\n \"dark:bg-input/15 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n default: [\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary\",\n ].join(\" \"),\n outline: [\n \"bg-background\",\n \"data-[state=checked]:border-primary data-[state=checked]:bg-background data-[state=checked]:text-primary data-[state=checked]:ring-2 data-[state=checked]:ring-primary/25\",\n ].join(\" \"),\n secondary: [\n \"data-[state=checked]:border-secondary data-[state=checked]:bg-secondary data-[state=checked]:text-secondary-foreground\",\n ].join(\" \"),\n success: [\n \"data-[state=checked]:border-chart-2 data-[state=checked]:bg-chart-2 data-[state=checked]:text-primary-foreground\",\n ].join(\" \"),\n destructive: [\n \"data-[state=checked]:border-destructive data-[state=checked]:bg-destructive data-[state=checked]:text-destructive-foreground\",\n ].join(\" \"),\n warning: [\n \"data-[state=checked]:border-amber-500 data-[state=checked]:bg-amber-500 data-[state=checked]:text-amber-950\",\n ].join(\" \"),\n muted: [\n \"data-[state=checked]:border-muted-foreground/50 data-[state=checked]:bg-muted data-[state=checked]:text-foreground\",\n ].join(\" \"),\n },\n size: {\n sm: \"size-3.5 min-h-3.5 min-w-3.5 max-h-3.5 max-w-3.5\",\n default: \"size-4 min-h-4 min-w-4 max-h-4 max-w-4\",\n lg: \"size-5 min-h-5 min-w-5 max-h-5 max-w-5\",\n },\n motion: {\n none: \"\",\n pop: [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n ].join(\" \"),\n glow: \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n \"pop-glow\": [\n \"motion-safe:active:scale-95\",\n \"data-[state=checked]:motion-safe:scale-[1.04]\",\n \"data-[state=checked]:shadow-[0_0_0_3px] data-[state=checked]:shadow-primary/35\",\n ].join(\" \"),\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n motion: \"none\",\n },\n }\n)\n\nconst radioIndicatorDotVariants = cva(\n \"pointer-events-none absolute top-1/2 start-1/2 -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 rounded-full\",\n {\n variants: {\n variant: {\n default: \"bg-primary-foreground\",\n outline: \"bg-primary\",\n secondary: \"bg-secondary-foreground\",\n success: \"bg-primary-foreground\",\n destructive: \"bg-destructive-foreground\",\n warning: \"bg-amber-950\",\n muted: \"bg-foreground\",\n },\n size: {\n sm: \"size-1.5\",\n default: \"size-2\",\n lg: \"size-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst radioIndicatorWrapperVariants = cva(\"relative flex size-full items-center justify-center\", {\n variants: {\n motion: {\n none: \"\",\n pop: \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n glow: \"\",\n \"pop-glow\": \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:duration-150\",\n },\n },\n defaultVariants: { motion: \"none\" },\n})\n\ntype ItemChrome = {\n itemVariant?: VariantProps<typeof radioGroupItemVariants>[\"variant\"]\n itemSize?: VariantProps<typeof radioGroupItemVariants>[\"size\"]\n itemMotion?: VariantProps<typeof radioGroupItemVariants>[\"motion\"]\n}\n\nconst RadioGroupItemChromeContext = React.createContext<ItemChrome>({})\n\n// ── RadioGroup root ─────────────────────────────────────────────────────────\n\nexport type RadioGroupProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> &\n ItemChrome\n\nfunction RadioGroup({\n className,\n itemVariant,\n itemSize,\n itemMotion,\n ...props\n}: RadioGroupProps) {\n const ctx = React.useMemo(\n () => ({ itemVariant, itemSize, itemMotion }),\n [itemVariant, itemSize, itemMotion],\n )\n return (\n <RadioGroupItemChromeContext.Provider value={ctx}>\n <RadioGroupPrimitive.Root\n data-slot=\"radio-group\"\n className={cn(\"grid w-full gap-2\", className)}\n {...props}\n />\n </RadioGroupItemChromeContext.Provider>\n )\n}\n\n// ── RadioGroupItem ──────────────────────────────────────────────────────────\n\nexport type RadioGroupItemProps = React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> &\n VariantProps<typeof radioGroupItemVariants>\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n RadioGroupItemProps\n>(function RadioGroupItem(\n { className, variant: variantProp, size: sizeProp, motion: motionProp, ...props },\n ref,\n) {\n const ctx = React.useContext(RadioGroupItemChromeContext)\n const variant = variantProp ?? ctx.itemVariant\n const size = sizeProp ?? ctx.itemSize\n const motion = motionProp ?? ctx.itemMotion ?? \"none\"\n const vResolved = variant ?? \"default\"\n const sResolved = size ?? \"default\"\n\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n data-slot=\"radio-group-item\"\n data-variant={vResolved}\n data-motion={motion}\n className={cn(radioGroupItemVariants({ variant, size, motion }), className)}\n {...props}\n >\n <RadioGroupPrimitive.Indicator\n data-slot=\"radio-group-indicator\"\n className={radioIndicatorWrapperVariants({ motion })}\n >\n <span className={radioIndicatorDotVariants({ variant: vResolved, size: sResolved })} />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n )\n})\n\n// ── Label helper (touch-friendly row with peer-disabled) ────────────────────\n\nexport type RadioGroupLabelProps = React.ComponentPropsWithRef<typeof Label>\n\nfunction RadioGroupLabel({ className, ...props }: RadioGroupLabelProps) {\n return (\n <Label\n data-slot=\"radio-group-label\"\n className={cn(\n \"inline-flex min-h-11 cursor-pointer select-none items-center gap-2 py-1 -my-1 text-sm font-medium leading-snug\",\n \"peer-disabled:cursor-not-allowed peer-disabled:opacity-60\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { RadioGroup, RadioGroupItem, RadioGroupLabel, radioGroupItemVariants }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\nimport { RadioGroup, RadioGroupItem, type RadioGroupProps } from \"./radio-group\"\n\nexport interface SelectionTileOption<T extends string = string> {\n value: T\n label: string\n /** Font Awesome icon class without prefix (e.g. `fa-table`); rendered with `fa-light`. Ignored when `leading` is set. */\n icon?: string\n /** Custom graphic (SVG, swatch, etc.) instead of `icon`. */\n leading?: React.ReactNode\n}\n\n/** Shared surface classes for icon+label tiles (Properties view type, Export format, etc.).\n *\n * `aspect-square` + horizontal padding keeps every tile a uniform square regardless of how\n * many tiles are in the row — without it, the last row of a `grid-cols-N` grid (e.g. 3 tiles\n * in a 4-col grid for the Properties view selector) renders the same width per cell but the\n * eye reads them as inconsistent when the row's empty trailing cell shifts visual rhythm.\n * Two-line labels (e.g. \"List & details\", \"Tree & details\") still fit because the icon\n * column is only ~18px and the square grows with the cell. */\nexport function selectionTileClassNames(selected: boolean) {\n return cn(\n \"flex aspect-square flex-col items-center justify-center gap-1.5 rounded-lg border px-2 py-3 text-xs leading-tight transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n selected\n ? \"border-brand bg-brand/5 text-foreground font-medium shadow-sm\"\n : \"border-border bg-background text-muted-foreground hover:border-border/80 hover:text-interactive-hover-foreground\",\n )\n}\n\n/** Preview box only — label rendered below (Settings appearance pattern). */\nexport function selectionTilePreviewClassNames(selected: boolean) {\n return cn(\n \"relative box-border flex aspect-square w-full max-w-full flex-col rounded-lg border p-1 transition-colors\",\n selected\n ? \"border-brand bg-brand/5 shadow-sm\"\n : \"border-border bg-background hover:border-border/80\",\n )\n}\n\nfunction SelectionTileGraphic<T extends string>({\n option,\n selected,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n}) {\n if (option.leading != null) {\n return (\n <span className=\"flex h-full min-h-0 w-full min-w-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:block [&_svg]:h-full [&_svg]:w-auto [&_svg]:max-h-full [&_svg]:max-w-full [&_svg]:object-contain [&_svg]:object-center\">\n {option.leading}\n </span>\n )\n }\n if (option.icon) {\n return (\n <i\n className={cn(\n \"fa-light shrink-0 text-[18px] leading-none\",\n option.icon,\n selected && \"text-brand\",\n )}\n aria-hidden=\"true\"\n />\n )\n }\n return null\n}\n\nfunction SelectionTileLabelText<T extends string>({\n option,\n}: {\n option: SelectionTileOption<T>\n}) {\n return <span className=\"text-center leading-tight\">{option.label}</span>\n}\n\nexport interface SelectionTileGridProps<T extends string> {\n /** Section caption above the grid (e.g. “View type”). */\n sectionLabel?: string\n options: readonly SelectionTileOption<T>[]\n columns?: 2 | 3 | 4\n value: T\n onValueChange: (value: T) => void\n /** `radio` — Form / RadioGroup; `button` — toggle buttons with aria-pressed. */\n interaction: \"radio\" | \"button\"\n /** Prefix for radio ids (`${idPrefix}-${value}`). */\n idPrefix?: string\n /** Forwarded to `RadioGroup` when `interaction=\"radio\"` (sr-only inputs; affects focus ring / state tokens). */\n itemVariant?: RadioGroupProps[\"itemVariant\"]\n itemSize?: RadioGroupProps[\"itemSize\"]\n itemMotion?: RadioGroupProps[\"itemMotion\"]\n className?: string\n /**\n * `inside` — label in the bordered tile (default). `below` — label under the preview\n * (matches system settings: preview box + caption outside).\n */\n labelPlacement?: \"inside\" | \"below\"\n}\n\n/**\n * Icon tile grid for single selection — matches Properties “View type” and Export “File format” patterns.\n */\nfunction SelectionTileCaptionBelow<T extends string>({\n option,\n selected,\n ariaHidden = false,\n}: {\n option: SelectionTileOption<T>\n selected: boolean\n /** When the parent `button` already has `aria-label` (avoids duplicate SR output). */\n ariaHidden?: boolean\n}) {\n return (\n <span\n className={cn(\n \"max-w-full px-0.5 text-center text-xs leading-tight\",\n selected ? \"font-medium text-foreground\" : \"text-muted-foreground\",\n )}\n {...(ariaHidden ? { \"aria-hidden\": true as const } : {})}\n >\n {option.label}\n </span>\n )\n}\n\nexport function SelectionTileGrid<T extends string>({\n sectionLabel,\n options,\n columns = 4,\n value,\n onValueChange,\n interaction,\n idPrefix = \"tile\",\n className,\n labelPlacement = \"inside\",\n itemVariant,\n itemSize,\n itemMotion,\n}: SelectionTileGridProps<T>) {\n const gridClass = cn(\n \"gap-2\",\n columns === 2 && \"grid grid-cols-2\",\n columns === 3 && \"grid grid-cols-3\",\n columns === 4 && \"grid grid-cols-4\",\n )\n\n if (interaction === \"radio\") {\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <RadioGroup\n value={value}\n onValueChange={v => onValueChange(v as T)}\n className={gridClass}\n itemVariant={itemVariant}\n itemSize={itemSize}\n itemMotion={itemMotion}\n >\n {options.map(opt => {\n const selected = value === opt.value\n const id = `${idPrefix}-${opt.value}`\n if (labelPlacement === \"below\") {\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"flex min-w-0 cursor-pointer flex-col items-center gap-1.5 rounded-lg focus-within:outline-none focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2 focus-within:ring-offset-background\",\n )}\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} />\n </Label>\n )\n }\n return (\n <Label\n key={opt.value}\n htmlFor={id}\n className={cn(\n \"cursor-pointer rounded-lg focus-within:rounded-lg focus-within:ring-2 focus-within:ring-ring focus-within:outline-none\",\n selectionTileClassNames(selected),\n )}\n >\n <RadioGroupItem value={opt.value} id={id} className=\"sr-only\" />\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </Label>\n )\n })}\n </RadioGroup>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {sectionLabel ? (\n <p className=\"mb-2 text-xs font-medium text-muted-foreground\">{sectionLabel}</p>\n ) : null}\n <div className={gridClass}>\n {options.map(opt => {\n const selected = value === opt.value\n if (labelPlacement === \"below\") {\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className=\"flex min-w-0 flex-col items-center gap-1.5 rounded-lg border-0 bg-transparent p-0 text-inherit focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n <span className={cn(\"flex w-full justify-center\", selectionTilePreviewClassNames(selected))}>\n <span className=\"flex min-h-0 w-full min-w-0 flex-1 items-center justify-center\">\n <SelectionTileGraphic option={opt} selected={selected} />\n </span>\n </span>\n <SelectionTileCaptionBelow option={opt} selected={selected} ariaHidden />\n </button>\n )\n }\n return (\n <button\n key={opt.value}\n type=\"button\"\n aria-label={opt.label}\n aria-pressed={selected}\n onClick={() => onValueChange(opt.value)}\n className={selectionTileClassNames(selected)}\n >\n <SelectionTileGraphic option={opt} selected={selected} />\n <SelectionTileLabelText option={opt} />\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as SheetPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-overlay duration-300 ease-out supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = \"right\",\n showCloseButton = true,\n showOverlay = true,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: \"top\" | \"right\" | \"bottom\" | \"left\"\n showCloseButton?: boolean\n showOverlay?: boolean\n}) {\n return (\n <SheetPortal>\n {showOverlay && <SheetOverlay />}\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n data-side={side}\n className={cn(\n \"fixed z-50 flex flex-col gap-4 bg-background bg-clip-padding text-sm shadow-lg outline-none duration-300 ease-out data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-e data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-s data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-[side=bottom]:data-open:slide-in-from-bottom-6 data-[side=left]:data-open:slide-in-from-left-6 data-[side=right]:data-open:slide-in-from-right-6 data-[side=top]:data-open:slide-in-from-top-6 data-closed:animate-out data-closed:fade-out-0 data-[side=bottom]:data-closed:slide-out-to-bottom-6 data-[side=left]:data-closed:slide-out-to-left-6 data-[side=right]:data-closed:slide-out-to-right-6 data-[side=top]:data-closed:slide-out-to-top-6\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <SheetPrimitive.Close data-slot=\"sheet-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-3 end-3\"\n size=\"icon-sm\"\n >\n <i className=\"fa-light fa-xmark\" aria-hidden=\"true\" />\n <span className=\"sr-only\">Close</span>\n </Button>\n </SheetPrimitive.Close>\n )}\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-header\"\n className={cn(\"flex flex-col gap-0.5 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sheet-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction SheetTitle({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn(\n \"text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({\n className,\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"flex w-fit cursor-pointer items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 pe-2 ps-2.5 text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-8 data-[size=sm]:h-7 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/15 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <i className=\"fa-light fa-chevron-down pointer-events-none size-4 text-muted-foreground\" aria-hidden=\"true\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n data-align-trigger={position === \"item-aligned\"}\n className={cn(\"relative z-50 max-h-(--radix-select-content-available-height) min-w-36 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\", position ===\"popper\"&&\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 rtl:data-[side=left]:translate-x-1 data-[side=right]:translate-x-1 rtl:data-[side=right]:-translate-x-1 data-[side=top]:-translate-y-1\", className )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-position={position}\n className={cn(\n \"data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)\",\n position === \"popper\" && \"\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"px-1.5 py-1 text-xs text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"relative flex w-full cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute end-2 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check pointer-events-none\" aria-hidden=\"true\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"pointer-events-none -mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <i className=\"fa-light fa-chevron-up\" aria-hidden=\"true\"\n />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"z-10 flex cursor-default items-center justify-center bg-popover py-1 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <i className=\"fa-light fa-chevron-down\" aria-hidden=\"true\"\n />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\n\ninterface ToggleSwitchProps {\n checked: boolean\n onChange: (value: boolean) => void\n id?: string\n}\n\nexport function ToggleSwitch({ checked, onChange, id }: ToggleSwitchProps) {\n return (\n <button\n id={id}\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n onClick={() => onChange(!checked)}\n className={cn(\n \"relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-input transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n checked ? \"bg-primary\" : \"bg-input\"\n )}\n >\n <span className={cn(\n \"pointer-events-none inline-block size-4 rounded-full bg-primary-foreground shadow-sm transition-transform\",\n checked ? \"translate-x-4\" : \"translate-x-0\"\n )} />\n </button>\n )\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"../ui/button\"\nimport { Input } from \"../ui/input\"\nimport { Tip } from \"../ui/tip\"\nimport { FilterDateCalendar } from \"../data-table/filter-date-calendar\"\nimport { FilterTextValueInput } from \"../data-table/filter-text-value-input\"\nimport {\n type ActiveFilter,\n type ConditionalRule,\n type FilterFieldDef,\n type FilterOperator,\n OPERATOR_LABELS,\n RULE_COLORS,\n} from \"../../lib/table-properties-types\"\n\ntype DrawerFilterCardBaseProps = {\n fieldDef: FilterFieldDef\n expanded: boolean\n onToggleExpand: () => void\n onRemove: (id: string) => void\n renderOptionLabel?: (value: string) => React.ReactNode\n}\n\nexport type DrawerFilterCardProps =\n | (DrawerFilterCardBaseProps & {\n variant?: \"filter\"\n filter: ActiveFilter\n onUpdate: (id: string, patch: Partial<ActiveFilter>) => void\n })\n | (DrawerFilterCardBaseProps & {\n variant: \"conditional\"\n filter: ConditionalRule\n onUpdate: (id: string, patch: Partial<ConditionalRule>) => void\n })\n\n/** Inline filter card used inside the Table Properties drawer (filter or conditional rule). */\nexport function DrawerFilterCard(props: DrawerFilterCardProps) {\n const {\n fieldDef,\n expanded,\n onToggleExpand,\n onRemove,\n renderOptionLabel,\n } = props\n\n const isCond = props.variant === \"conditional\"\n const filter = props.filter\n const filterId = filter.id\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const onUpdate = props.onUpdate as (id: string, patch: any) => void\n\n const [optSearch, setOptSearch] = React.useState(\"\")\n const options = fieldDef.options ?? []\n const showSearch = options.length > 8\n const filteredOpts = optSearch\n ? options.filter(o => o.label.toLowerCase().includes(optSearch.toLowerCase()))\n : options\n\n const values = filter.values\n\n React.useEffect(() => {\n if (fieldDef.type !== \"select\" && fieldDef.type !== \"date\") return\n if (filter.operator !== \"is\" && filter.operator !== \"is_not\") {\n onUpdate(filterId, { operator: \"is\" })\n }\n }, [filter.operator, filter.id, fieldDef.type, filterId, onUpdate])\n\n function toggleValue(val: string) {\n const next = values.includes(val) ? values.filter(v => v !== val) : [...values, val]\n onUpdate(filterId, { values: next })\n }\n\n function cycleOperator() {\n const ops = fieldDef.operators\n const idx = ops.indexOf(filter.operator as FilterOperator)\n const i = idx === -1 ? 0 : idx\n onUpdate(filterId, { operator: ops[(i + 1) % ops.length] })\n }\n\n const removeLabel = isCond ? \"rule\" : \"filter\"\n const rule = isCond ? (props.filter as ConditionalRule) : null\n\n return (\n <div className=\"rounded-lg border border-border overflow-hidden\">\n <div>\n {/* Card header */}\n <div\n className=\"flex items-start justify-between px-3 pt-2.5 pb-2 gap-2 cursor-pointer\"\n role=\"button\"\n tabIndex={0}\n aria-label={expanded ? `Collapse ${fieldDef.label}` : `Expand ${fieldDef.label}`}\n onClick={onToggleExpand}\n onKeyDown={e => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault()\n onToggleExpand()\n }\n }}\n >\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-foreground\">{fieldDef.label}</p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"xs\"\n aria-label={`Operator: ${OPERATOR_LABELS[filter.operator as FilterOperator]} — click to cycle`}\n onClick={e => {\n e.stopPropagation()\n cycleOperator()\n }}\n className=\"h-auto py-0 px-1 -ms-1 text-xs text-muted-foreground font-normal\"\n >\n {OPERATOR_LABELS[filter.operator as FilterOperator]}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </Button>\n </div>\n <div className=\"flex items-center gap-0.5 shrink-0 self-start\">\n <Tip label={`Remove ${fieldDef.label} ${removeLabel}`} side=\"top\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label={`Remove ${fieldDef.label} ${removeLabel}`}\n className=\"text-muted-foreground hover:text-destructive\"\n onClick={e => {\n e.stopPropagation()\n onRemove(filterId)\n }}\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n <i\n className={`fa-light ${expanded ? \"fa-chevron-up\" : \"fa-chevron-down\"} text-xs text-muted-foreground mt-2`}\n aria-hidden=\"true\"\n />\n </div>\n </div>\n\n {/* Expanded body */}\n {expanded && (\n <div className=\"border-t border-border\">\n {fieldDef.type === \"select\" ? (\n <>\n {showSearch && (\n <div className=\"px-3 pt-2 pb-1\">\n <Input placeholder=\"Search…\" value={optSearch} onChange={e => setOptSearch(e.target.value)} className=\"h-7 text-xs\" />\n </div>\n )}\n <div role=\"listbox\" aria-multiselectable=\"true\" aria-label={`${fieldDef.label} options`} className=\"py-1 max-h-52 overflow-y-auto\">\n {filteredOpts.map(opt => {\n const checked = values.includes(opt.value)\n return (\n <div\n key={opt.value}\n role=\"option\"\n aria-selected={checked}\n tabIndex={0}\n onClick={() => toggleValue(opt.value)}\n onKeyDown={e => { if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); toggleValue(opt.value) } }}\n className=\"flex items-center gap-2.5 px-3 py-2 text-sm hover:bg-interactive-hover cursor-pointer select-none focus-visible:outline-none focus-visible:bg-interactive-hover\"\n >\n <span aria-hidden=\"true\" data-slot=\"checkbox\" data-state={checked ? \"checked\" : \"unchecked\"} className={cn(\n \"inline-flex items-center justify-center size-3.5 shrink-0 rounded-[3px] border transition-colors\",\n checked ? \"bg-primary border-primary text-primary-foreground\" : \"border-input bg-background\"\n )}>\n {checked && <i className=\"fa-solid fa-check text-current\" style={{ fontSize: \"7px\" }} />}\n </span>\n {renderOptionLabel\n ? renderOptionLabel(opt.value)\n : <span className=\"text-foreground\">{opt.label}</span>\n }\n </div>\n )\n })}\n {filteredOpts.length === 0 && (\n <p className=\"px-3 py-2 text-xs text-muted-foreground\">No options found</p>\n )}\n </div>\n </>\n ) : fieldDef.type === \"date\" ? (\n <div className=\"p-2\">\n <FilterDateCalendar\n label={`${fieldDef.label} — choose date`}\n valueYmd={filter.values[0]}\n onChangeYmd={(ymd) =>\n onUpdate(filterId, { values: ymd ? [ymd] : [] })\n }\n />\n </div>\n ) : fieldDef.type === \"text\" ? (\n <div className=\"p-3\">\n <FilterTextValueInput\n mask={fieldDef.textMask}\n aria-label={`${fieldDef.label} value`}\n placeholder={`Enter ${fieldDef.label.toLowerCase()}…`}\n value={values[0] ?? \"\"}\n onValueChange={next => onUpdate(filterId, { values: [next] })}\n className=\"text-sm\"\n autoFocus\n />\n </div>\n ) : null}\n {values.length > 0 ? (\n <div className=\"sticky bottom-0 border-t border-border bg-card p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onUpdate(filterId, { values: [] })}\n className=\"w-full justify-center gap-1.5 text-xs text-muted-foreground\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n Clear selection\n </Button>\n </div>\n ) : null}\n </div>\n )}\n\n {/* Highlight color — conditional rules only */}\n {isCond && rule && (\n <div className=\"border-t border-border px-3 py-2.5\">\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-2\">\n Highlight color\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {RULE_COLORS.map(c => (\n <Button\n key={c.name}\n type=\"button\"\n size=\"icon-xs\"\n variant=\"outline\"\n aria-label={c.name}\n className={cn(\n \"rounded-md border-2 p-0 transition-all\",\n rule.bgColor === c.bg ? \"border-foreground scale-110\" : \"border-transparent hover:scale-105\",\n )}\n style={{ background: c.bg }}\n onClick={() => onUpdate(filterId, { bgColor: c.bg })}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { cn } from \"../../lib/utils\"\n\n/**\n * Solid grip icon for drag handles — use anywhere rows/cards reorder (dashboard, Properties, etc.).\n */\nexport function DragHandleGripIcon({ className }: { className?: string }) {\n return (\n <i className={cn(\"fa-solid fa-grip-dots-vertical shrink-0\", className)} aria-hidden=\"true\" />\n )\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { Tip } from \"../ui/tip\"\nimport { DragHandleGripIcon } from \"../ui/drag-handle-grip\"\nimport { type SortRule } from \"../../lib/table-properties-types\"\n\n/** Sort rule card inside the Sort drawer panel */\nexport type DrawerSortCardProps = {\n rule: SortRule\n /**\n * Resolved column label for the sort rule's `fieldKey`. Required — every\n * consumer derives labels from its column defs (the drawer passes\n * `resolveColumnLabel(rule.fieldKey)`), so the card never falls back to a\n * product-specific column list.\n */\n fieldLabel: string\n isPrimary: boolean\n onRemove: () => void\n onToggleDir: () => void\n}\n\nexport function DrawerSortCard(props: DrawerSortCardProps) {\n const { rule, fieldLabel, isPrimary, onRemove, onToggleDir } = props\n const label = fieldLabel || rule.fieldKey\n if (!label) return null\n return (\n <div className=\"rounded-lg border border-border bg-background overflow-hidden\">\n <div className=\"flex items-center gap-2 px-3 py-2.5\">\n <DragHandleGripIcon className=\"text-[13px] text-muted-foreground/40\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-1.5\">\n {isPrimary && (\n <span className=\"text-xs font-bold text-accent-foreground bg-accent rounded px-1 py-0.5 leading-none uppercase tracking-wide shrink-0\">\n Primary\n </span>\n )}\n <p className=\"text-sm font-medium text-foreground truncate\">{label}</p>\n </div>\n <button\n type=\"button\"\n aria-label={`Direction: ${rule.direction === \"asc\" ? \"Ascending\" : \"Descending\"} — click to toggle`}\n onClick={onToggleDir}\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-interactive-hover-foreground transition-colors mt-0.5\"\n >\n <i className={`fa-light ${rule.direction === \"asc\" ? \"fa-arrow-up-a-z\" : \"fa-arrow-down-a-z\"} text-xs`} aria-hidden=\"true\" />\n {rule.direction === \"asc\" ? \"Ascending\" : \"Descending\"}\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n <Tip label={`Remove ${label} sort`} side=\"top\">\n <button\n type=\"button\"\n aria-label={`Remove ${label} sort`}\n onClick={onRemove}\n className=\"inline-flex items-center justify-center size-7 rounded text-muted-foreground hover:text-destructive hover:bg-interactive-hover transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring shrink-0\"\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n </div>\n </div>\n )\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Tip } from \"../ui/tip\"\nimport { DragHandleGripIcon } from \"../ui/drag-handle-grip\"\nimport { ToggleSwitch } from \"../ui/toggle-switch\"\n\nexport interface ColumnRowProps {\n label: string\n isFirst: boolean\n isLast: boolean\n visible: boolean\n onToggleVisible: () => void\n onMoveUp: () => void\n onMoveDown: () => void\n // drag-and-drop props spread from useDraggableList\n draggable: true\n onDragStart: React.DragEventHandler\n onDragOver: React.DragEventHandler\n onDrop: React.DragEventHandler\n onDragEnd: React.DragEventHandler\n isDragging: boolean\n isOver: boolean\n}\n\nexport function ColumnRow({\n label,\n isFirst,\n isLast,\n visible,\n onToggleVisible,\n onMoveUp,\n onMoveDown,\n draggable,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n isDragging,\n isOver,\n}: ColumnRowProps) {\n return (\n <div\n role=\"listitem\"\n draggable={draggable}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n className={cn(\n \"flex items-center gap-2 px-2 py-2 rounded-lg group hover:bg-interactive-hover-subtle transition-colors cursor-grab active:cursor-grabbing\",\n isDragging && \"opacity-40\",\n isOver && \"ring-2 ring-ring bg-accent/30\",\n )}\n >\n <DragHandleGripIcon className=\"text-[13px] text-muted-foreground/40 transition-colors group-hover:text-muted-foreground\" />\n <span className=\"flex-1 text-sm text-foreground\">{label}</span>\n {/* Up / Down priority buttons */}\n <div className=\"flex items-center gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n <Tip label={`Move ${label} up`} side=\"top\">\n <button\n type=\"button\"\n aria-label={`Move ${label} up`}\n disabled={isFirst}\n onClick={onMoveUp}\n className=\"inline-flex items-center justify-center size-6 rounded text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover disabled:opacity-30 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevron-up text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n <Tip label={`Move ${label} down`} side=\"top\">\n <button\n type=\"button\"\n aria-label={`Move ${label} down`}\n disabled={isLast}\n onClick={onMoveDown}\n className=\"inline-flex items-center justify-center size-6 rounded text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover disabled:opacity-30 disabled:pointer-events-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n </div>\n {/* Visibility toggle */}\n <ToggleSwitch\n checked={visible}\n onChange={onToggleVisible}\n />\n </div>\n )\n}\n","/**\n * useDraggableList — pointer-driven reorder hook used by drawer sort cards,\n * column rows, and conditional-rule lists. Generic over item shape via\n * `getId(item) => string | number`.\n */\nimport * as React from \"react\"\n\nexport interface DraggableListHandle {\n dragId: string | null\n overId: string | null\n getItemProps: (id: string) => {\n draggable: true\n onDragStart: (e: React.DragEvent) => void\n onDragOver: (e: React.DragEvent) => void\n onDrop: (e: React.DragEvent) => void\n onDragEnd: () => void\n \"data-dragging\": boolean\n \"data-over\": boolean\n }\n}\n\nexport function useDraggableList<T>(\n items: T[],\n getId: (item: T) => string,\n onReorder: (newItems: T[]) => void,\n): DraggableListHandle {\n const [dragId, setDragId] = React.useState<string | null>(null)\n const [overId, setOverId] = React.useState<string | null>(null)\n\n function getItemProps(id: string) {\n return {\n draggable: true as const,\n onDragStart: (e: React.DragEvent) => { e.dataTransfer.effectAllowed = \"move\"; setDragId(id) },\n onDragOver: (e: React.DragEvent) => { e.preventDefault(); e.dataTransfer.dropEffect = \"move\"; setOverId(id) },\n onDrop: (e: React.DragEvent) => {\n e.preventDefault()\n if (!dragId || dragId === id) { setDragId(null); setOverId(null); return }\n const from = items.findIndex(i => getId(i) === dragId)\n const to = items.findIndex(i => getId(i) === id)\n if (from === -1 || to === -1) { setDragId(null); setOverId(null); return }\n const next = [...items]\n const [moved] = next.splice(from, 1)\n next.splice(to, 0, moved)\n onReorder(next)\n setDragId(null); setOverId(null)\n },\n onDragEnd: () => { setDragId(null); setOverId(null) },\n \"data-dragging\": dragId === id,\n \"data-over\": overId === id && dragId !== id,\n }\n }\n\n return { dragId, overId, getItemProps }\n}\n","\"use client\"\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport { DATA_LIST_VIEW_TILES, dataListViewLabel } from \"../../lib/data-list-view\"\nimport { dataListViewTilesForHub } from \"../../lib/data-list-view-registry\"\nimport type { RowHeight } from \"../../lib/row-height\"\nimport { ROW_HEIGHT_TILES } from \"../../lib/row-height\"\nimport { SelectionTileGrid } from \"../ui/selection-tile-grid\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\"\nimport {\n Sheet,\n SheetContent,\n SheetTitle,\n} from \"../ui/sheet\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../ui/select\"\nimport type { DataListDisplayOptions } from \"../../lib/data-list-display-options\"\nimport { Tip } from \"../ui/tip\"\nimport { ToggleSwitch } from \"../ui/toggle-switch\"\nimport { Button } from \"../ui/button\"\nimport { DrawerFilterCard } from \"./filter-card\"\nimport { DrawerSortCard } from \"./sort-card\"\nimport { ColumnRow } from \"./column-row\"\nimport { useDraggableList } from \"./draggable-list\"\nimport {\n type ActiveFilter,\n type SortRule,\n type ConditionalRule,\n type FilterFieldDef,\n RULE_COLORS,\n} from \"../../lib/table-properties-types\"\n\nexport interface TablePropertiesDrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n /**\n * Optional deep-link target. When set (and `open` is true), the drawer\n * focuses this panel instead of \"main\" — e.g. the column header's\n * **Add Conditional Rule** menu item passes `\"conditional-rules\"` to jump\n * straight to the conditional-formatting panel. Drawer resets to \"main\"\n * automatically when it closes.\n */\n initialPanel?: string | null\n // Display\n showGridlines: boolean\n onShowGridlinesChange: (v: boolean) => void\n rowHeight: RowHeight\n onRowHeightChange: (v: RowHeight) => void\n pagination: boolean\n onPaginationChange: (v: boolean) => void\n // Filters\n activeFilters: ActiveFilter[]\n onAddFilter: (fieldKey: string) => void\n onUpdateFilter: (id: string, patch: Partial<ActiveFilter>) => void\n onRemoveFilter: (id: string) => void\n /** How the filter after `leftFilterId` combines with the one above (default \"and\"). */\n getFilterConnector: (leftFilterId: string) => \"and\" | \"or\"\n onToggleFilterConnector: (leftFilterId: string) => void\n filterBarVisible: boolean\n onFilterBarVisibleChange: (v: boolean) => void\n drawerExpandedFilters: Set<string>\n onDrawerExpandedFiltersChange: React.Dispatch<React.SetStateAction<Set<string>>>\n totalRows: number\n filteredRows: number\n // Sort\n sortRules: SortRule[]\n onSortRulesChange: (rules: SortRule[]) => void\n onAddSortRule: (fieldKey: string) => void\n onRemoveSortRule: (id: string) => void\n onToggleSortDir: (id: string) => void\n // Columns\n colOrder: string[]\n onColOrderChange: (order: string[]) => void\n hiddenCols: Set<string>\n onToggleColVisibility: (key: string) => void\n onMoveCol: (key: string, dir: \"up\" | \"down\") => void\n // Group\n groupBy: string | null\n onGroupByChange: (key: string | null) => void\n // Sort key for display in main panel\n primarySortKey?: string\n // Conditional formatting\n conditionalRules: ConditionalRule[]\n onAddConditionalRule: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemoveConditionalRule: (id: string) => void\n onUpdateConditionalRule: (id: string, patch: Partial<ConditionalRule>) => void\n /**\n * Filter field defs for drawer + conditional rules. Required — every list-hub\n * consumer derives this from its column definitions (`columnsToFilterFields`)\n * and passes it through `drawerToolbarProps` from `HubTable`. There is no\n * product-specific default in the package.\n */\n filterFields: FilterFieldDef[]\n // View type\n currentView?: DataListViewType\n onViewChange?: (view: DataListViewType) => void\n /**\n * Subset of view types this hub actually implements; when set, the view-type tile grid is\n * filtered so users cannot switch to an unsupported view from Properties. Defaults to all\n * registered view types (`DATA_LIST_VIEW_TILES`).\n */\n supportedViewTypes?: readonly DataListViewType[]\n /** Lifecycle context (e.g. tab filter) — shown in the drawer header */\n lifecycleTabLabel?: string\n /**\n * Column metadata for the Sort / Group / Columns panels. Required — every\n * list-hub consumer derives this from its column definitions\n * (`columnsToFieldDefinitions`) and passes it through `drawerToolbarProps`\n * from `HubTable`. The drawer never falls back to a default column list.\n */\n fieldDefinitions: { key: string; label: string; sortable?: boolean }[]\n resolveColumnLabel?: (key: string) => string\n /** Shared display options (table + board); persisted at page level. */\n displayOptions: DataListDisplayOptions\n onDisplayOptionsChange: (patch: Partial<DataListDisplayOptions>) => void\n /**\n * When the active view is Board and more than one entry is provided, shows a control to pick\n * which field defines swimlane columns (`displayOptions.boardGroupByColumnKey`).\n */\n boardGroupByColumnOptions?: { key: string; label: string }[]\n /** Optional custom option renderer for filter values (e.g. status chips). */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}\n\ntype SheetPanel = \"main\" | \"table-display\" | \"filter\" | \"sort\" | \"group\" | \"columns\" | \"conditional-rules\"\n\n/** Properties sheet uses `z-[80]`; default portaled menus are `z-50` and sit underneath. */\nconst PROPERTIES_SHEET_PORTAL_Z = \"z-[90]\"\n\nexport function TablePropertiesDrawer({\n open,\n onOpenChange,\n initialPanel,\n showGridlines,\n onShowGridlinesChange,\n rowHeight,\n onRowHeightChange,\n pagination,\n onPaginationChange,\n activeFilters,\n onAddFilter,\n onUpdateFilter,\n onRemoveFilter,\n getFilterConnector,\n onToggleFilterConnector,\n filterBarVisible,\n onFilterBarVisibleChange,\n drawerExpandedFilters,\n onDrawerExpandedFiltersChange,\n totalRows,\n filteredRows,\n sortRules,\n onSortRulesChange,\n onAddSortRule,\n onRemoveSortRule,\n onToggleSortDir,\n colOrder,\n onColOrderChange,\n hiddenCols,\n onToggleColVisibility,\n onMoveCol,\n groupBy,\n onGroupByChange,\n primarySortKey,\n conditionalRules,\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n filterFields,\n currentView,\n onViewChange,\n supportedViewTypes,\n lifecycleTabLabel,\n fieldDefinitions,\n resolveColumnLabel: resolveColumnLabelProp,\n displayOptions,\n onDisplayOptionsChange,\n boardGroupByColumnOptions,\n renderFilterOptionValue,\n}: TablePropertiesDrawerProps) {\n const [sheetPanel, setSheetPanel] = React.useState<SheetPanel>(\"main\")\n\n // Sync internal sheetPanel with the deep-link request from outside.\n // - Open with an initialPanel → jump to that panel.\n // - Open with no initialPanel → keep whatever the user navigated to last (or \"main\"\n // after a close → re-open cycle, since the next effect resets on close).\n // - initialPanel changes while open (e.g. user triggers a second deep-link\n // from the column menu while the drawer is already open) → switch panels.\n // - Close → reset to \"main\" so the next \"plain\" open lands on the index.\n React.useEffect(() => {\n if (open && initialPanel) {\n setSheetPanel(initialPanel as SheetPanel)\n } else if (!open) {\n setSheetPanel(\"main\")\n }\n }, [open, initialPanel])\n\n const resolveColumnLabel = React.useCallback(\n (key: string) =>\n resolveColumnLabelProp?.(key)\n ?? fieldDefinitions.find(f => f.key === key)?.label\n ?? key,\n [resolveColumnLabelProp, fieldDefinitions],\n )\n\n const sortFieldList = React.useMemo(\n () =>\n fieldDefinitions.filter(\n f => f.sortable !== false && f.key !== \"select\" && f.key !== \"actions\",\n ),\n [fieldDefinitions],\n )\n\n const groupFieldList = React.useMemo(\n () =>\n fieldDefinitions.filter(f => f.key !== \"select\" && f.key !== \"actions\"),\n [fieldDefinitions],\n )\n\n const viewSurface = currentView ?? \"table\"\n const isBoardView = viewSurface === \"board\"\n const boardGroupByLabel =\n boardGroupByColumnOptions?.find(o => o.key === displayOptions.boardGroupByColumnKey)?.label\n const viewDisplayLabel = dataListViewLabel(viewSurface)\n const viewDisplayDesc = (() => {\n if (viewSurface === \"board\") {\n return [\n boardGroupByLabel ? `By ${boardGroupByLabel}` : null,\n `${displayOptions.boardLineCount}-line`,\n displayOptions.showColumnLabels ? \"Column labels\" : \"No labels\",\n ]\n .filter(Boolean)\n .join(\" · \")\n }\n if (viewSurface === \"list\") {\n return [\n displayOptions.showColumnLabels ? \"Column labels\" : \"No labels\",\n displayOptions.showToolbarSearch ? \"Toolbar search\" : \"No search\",\n ].join(\" · \")\n }\n if (viewSurface === \"dashboard\") {\n return \"Charts · KPI metrics\"\n }\n return [showGridlines ? \"Gridlines\" : null, pagination ? \"Paginated\" : null].filter(Boolean).join(\" · \") || \"Default\"\n })()\n const viewDisplayIcon =\n DATA_LIST_VIEW_TILES.find(t => t.value === viewSurface)?.icon ?? \"fa-table\"\n\n // ── Sort drag-and-drop ────────────────────────────────────────────────────\n const sortDrag = useDraggableList(sortRules, r => r.id, onSortRulesChange)\n\n // ── Columns drag-and-drop ─────────────────────────────────────────────────\n const orderable = colOrder.filter(k => k !== \"select\" && k !== \"actions\")\n const colDrag = useDraggableList(\n orderable,\n k => k,\n newOrder => onColOrderChange([\"select\", ...newOrder, \"actions\"]),\n )\n\n // Current primary sort label for display in main panel\n const primarySortLabel = primarySortKey\n ? resolveColumnLabel(primarySortKey)\n : sortRules[0]?.fieldKey\n ? resolveColumnLabel(sortRules[0].fieldKey)\n : \"—\"\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange} modal={false}>\n <SheetContent\n side=\"right\"\n showCloseButton={false}\n showOverlay={false}\n // w-[min(20rem,calc(100vw-1rem))]: cap to viewport width - 1rem at narrow/zoomed viewports\n // so the drawer never overflows horizontally. Use 100svh so height is correct on mobile.\n className=\"z-[80] w-[min(20rem,calc(100vw-1rem))] p-0 gap-0 flex flex-col border border-border shadow-xl rounded-xl overflow-hidden\"\n style={{ top: \"0.5rem\", bottom: \"0.5rem\", right: \"0.5rem\", height: \"calc(100svh - 1rem)\" }}\n >\n\n {sheetPanel === \"main\" ? (\n <>\n {/* Header */}\n <div className=\"flex items-center justify-between gap-3 px-4 pt-5 pb-3\">\n <div className=\"min-w-0\">\n <SheetTitle className=\"text-base font-semibold leading-tight\">Properties</SheetTitle>\n {lifecycleTabLabel ? (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\" title={lifecycleTabLabel}>\n {lifecycleTabLabel}\n </p>\n ) : null}\n </div>\n <Tip label=\"Close\" side=\"bottom\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Close\"\n onClick={() => onOpenChange(false)}\n >\n <i className=\"fa-light fa-xmark text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n </div>\n\n {/* View type switcher — card tiles like export file format. When the hub passes\n `supportedViewTypes`, only its implemented views are offered so users cannot\n switch to a view the hub does not render (which would show the not-configured\n empty state). Default is all registered view types. */}\n {onViewChange && currentView && (\n <div className=\"px-4 pb-3\">\n <SelectionTileGrid<DataListViewType>\n sectionLabel=\"View type\"\n options={\n supportedViewTypes && supportedViewTypes.length > 0\n ? dataListViewTilesForHub(supportedViewTypes).map(t => ({\n value: t.type,\n label: t.label,\n icon: t.icon,\n }))\n : DATA_LIST_VIEW_TILES\n }\n columns={4}\n value={currentView}\n onValueChange={onViewChange}\n interaction=\"button\"\n idPrefix=\"props-view\"\n />\n </div>\n )}\n\n {/* Option list — inset rows + rounded hover (not edge-to-edge) */}\n <div className=\"flex-1 overflow-y-auto py-2 px-3 space-y-1\">\n {([\n {\n id: \"table-display\" as SheetPanel,\n icon: viewDisplayIcon,\n label: viewDisplayLabel,\n desc: viewDisplayDesc,\n },\n {\n id: \"filter\" as SheetPanel,\n icon: \"fa-filter\",\n label: \"Filter\",\n desc: activeFilters.length === 0\n ? `Showing all ${filteredRows} rows.`\n : `${activeFilters.length} filter${activeFilters.length !== 1 ? \"s\" : \"\"} active · ${filteredRows} rows.`,\n },\n {\n id: \"sort\" as SheetPanel,\n icon: \"fa-arrow-up-arrow-down\",\n label: \"Sort\",\n desc: `Sorted by ${primarySortLabel}.`,\n },\n {\n id: \"group\" as SheetPanel,\n icon: \"fa-layer-group\",\n label: \"Group\",\n desc: groupBy\n ? `Grouped by ${resolveColumnLabel(groupBy)}.`\n : \"No grouping.\",\n },\n {\n id: \"columns\" as SheetPanel,\n icon: \"fa-table-columns\",\n label: \"Columns\",\n desc: hiddenCols.size === 0\n ? \"All columns visible.\"\n : `${hiddenCols.size} column${hiddenCols.size !== 1 ? \"s\" : \"\"} hidden.`,\n },\n {\n id: \"conditional-rules\" as SheetPanel,\n icon: \"fa-palette\",\n label: \"Conditional rules\",\n desc: conditionalRules.length === 0\n ? \"No rules applied.\"\n : `${conditionalRules.length} rule${conditionalRules.length !== 1 ? \"s\" : \"\"} active.`,\n },\n ] as { id: SheetPanel; icon: string; label: string; desc: string }[]).map(item => (\n <Button\n key={item.id}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setSheetPanel(item.id)}\n className={cn(\n \"w-full h-auto justify-start gap-3 px-3 py-3 rounded-2xl font-normal border border-transparent\",\n \"hover:bg-muted/60 hover:text-foreground\",\n \"focus-visible:bg-muted/60 focus-visible:text-foreground\",\n )}\n >\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className={`fa-light ${item.icon} text-[15px] text-secondary-foreground`} aria-hidden=\"true\" />\n </span>\n <span className=\"flex-1 min-w-0 text-start\">\n <span className=\"block text-sm font-medium text-foreground\">{item.label}</span>\n <span className=\"block text-xs text-muted-foreground mt-0.5\">{item.desc}</span>\n </span>\n <i className=\"fa-light fa-chevron-right text-xs text-muted-foreground shrink-0\" aria-hidden=\"true\" />\n </Button>\n ))}\n </div>\n </>\n ) : (\n <>\n {/* Sub-panel header — back + title stack as one cluster; close aligns to row center */}\n <div className=\"flex items-center justify-between gap-3 px-4 pt-4 pb-3\">\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <Tip label=\"Back to Properties\" side=\"bottom\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n aria-label=\"Back to Properties\"\n onClick={() => setSheetPanel(\"main\")}\n >\n <i className=\"fa-light fa-chevron-left text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n <div className=\"min-w-0\">\n <SheetTitle className=\"text-base font-semibold text-foreground leading-tight flex items-center gap-1.5\">\n {{\n \"table-display\": viewDisplayLabel,\n filter: \"Filter\",\n sort: \"Sort\",\n group: \"Group\",\n columns: \"Columns\",\n \"conditional-rules\": \"Conditional rules\",\n main: \"\",\n }[sheetPanel]}\n {sheetPanel === \"filter\" && (\n <i className=\"fa-light fa-circle-question text-xs text-muted-foreground\" aria-hidden=\"true\" />\n )}\n </SheetTitle>\n {sheetPanel === \"filter\" && (\n <p\n className=\"text-xs text-muted-foreground mt-0.5\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {activeFilters.length === 0\n ? `Showing all ${filteredRows} rows`\n : `${filteredRows} of ${totalRows} rows match · ${activeFilters.length} filter${activeFilters.length !== 1 ? \"s\" : \"\"} active`}\n </p>\n )}\n </div>\n </div>\n <Tip label=\"Close\" side=\"bottom\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"shrink-0\"\n aria-label=\"Close panel\"\n onClick={() => onOpenChange(false)}\n >\n <i className=\"fa-light fa-xmark text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n </div>\n\n <div className=\"flex-1 overflow-y-auto\">\n\n {/* ── Table / Board display ── */}\n {sheetPanel === \"table-display\" && (\n <div className=\"p-4 space-y-5\">\n {isBoardView ? (\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n {dataListViewLabel(\"board\")} groups rows into columns. Sort, filter, and column settings apply to the same dataset as other views (e.g. Table view).\n </p>\n ) : null}\n\n {isBoardView && boardGroupByColumnOptions && boardGroupByColumnOptions.length > 1 ? (\n <div className=\"flex items-center justify-between gap-3 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-table-columns text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Board columns</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Choose which field splits the board into swimlanes.</p>\n </div>\n </div>\n <Select\n value={\n boardGroupByColumnOptions.some(o => o.key === displayOptions.boardGroupByColumnKey)\n ? displayOptions.boardGroupByColumnKey\n : boardGroupByColumnOptions[0]!.key\n }\n onValueChange={v => onDisplayOptionsChange({ boardGroupByColumnKey: v })}\n >\n <SelectTrigger\n size=\"sm\"\n className=\"w-[9.5rem] shrink-0\"\n id=\"board-group-by-field\"\n aria-label=\"Field for board columns\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\" className={PROPERTIES_SHEET_PORTAL_Z}>\n {boardGroupByColumnOptions.map(o => (\n <SelectItem key={o.key} value={o.key}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n\n {viewSurface === \"table\" ? (\n <>\n <div>\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-3\">Appearance</p>\n <div className=\"space-y-1\">\n {([\n { id: \"gridlines\", icon: \"fa-border-all\", label: \"Gridlines\", checked: showGridlines, onChange: onShowGridlinesChange },\n { id: \"pagination\", icon: \"fa-table-list\", label: \"Pagination\", checked: pagination, onChange: onPaginationChange },\n ] as { id: string; icon: string; label: string; checked: boolean; onChange: (v: boolean) => void }[]).map(row => (\n <div key={row.id} className=\"flex items-center justify-between py-2\">\n <div className=\"flex items-center gap-2.5 text-sm\">\n <i className={`fa-light ${row.icon} text-muted-foreground w-4 text-center`} aria-hidden=\"true\" />\n <label htmlFor={`toggle-${row.id}`} className=\"cursor-pointer select-none\">{row.label}</label>\n </div>\n <ToggleSwitch id={`toggle-${row.id}`} checked={row.checked} onChange={row.onChange} />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"border-t border-border pt-4\">\n <SelectionTileGrid<RowHeight>\n sectionLabel=\"Row height\"\n options={ROW_HEIGHT_TILES}\n columns={3}\n value={rowHeight}\n onValueChange={onRowHeightChange}\n interaction=\"button\"\n idPrefix=\"row-height\"\n />\n </div>\n </>\n ) : null}\n\n <div\n className={cn(\n \"space-y-3\",\n (viewSurface === \"board\" || viewSurface === \"table\") && \"border-t border-border pt-4\",\n )}\n >\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">Display options</p>\n <div className=\"space-y-1\">\n {isBoardView && (\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-file-lines text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Line count</p>\n </div>\n </div>\n <Select\n value={String(displayOptions.boardLineCount)}\n onValueChange={v =>\n onDisplayOptionsChange({ boardLineCount: Number(v) as 1 | 2 | 3 })}\n >\n <SelectTrigger size=\"sm\" className=\"w-[6.5rem] shrink-0\" id=\"board-line-count\" aria-label=\"Line count\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <SelectItem value=\"1\">1 line</SelectItem>\n <SelectItem value=\"2\">2 lines</SelectItem>\n <SelectItem value=\"3\">3 lines</SelectItem>\n </SelectContent>\n </Select>\n </div>\n )}\n\n {viewSurface === \"table\" && (\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-font text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Table title</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Show the page heading and subtitle.</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-view-title\"\n checked={displayOptions.showViewTitle}\n onChange={v => onDisplayOptionsChange({ showViewTitle: v })}\n />\n </div>\n )}\n\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-table-columns text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Column labels</p>\n {viewSurface === \"table\" ? (\n <p className=\"text-xs text-muted-foreground mt-0.5\">Column headers in the table.</p>\n ) : viewSurface === \"list\" ? (\n <p className=\"text-xs text-muted-foreground mt-0.5\">Column headers in the list.</p>\n ) : null}\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-column-labels\"\n checked={displayOptions.showColumnLabels}\n onChange={v => onDisplayOptionsChange({ showColumnLabels: v })}\n />\n </div>\n\n {isBoardView && (\n <>\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-hashtag text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Column counts</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-board-counts\"\n checked={displayOptions.showBoardColumnCounts}\n onChange={v => onDisplayOptionsChange({ showBoardColumnCounts: v })}\n />\n </div>\n\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-square-plus text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Above new card button</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-new-card-above\"\n checked={displayOptions.boardNewCardAbove}\n onChange={v => onDisplayOptionsChange({ boardNewCardAbove: v })}\n />\n </div>\n </>\n )}\n\n {(viewSurface === \"table\" || viewSurface === \"list\") && (\n <div className=\"flex items-center justify-between gap-2 py-2\">\n <div className=\"flex items-center gap-2.5 min-w-0 flex-1\">\n <span className=\"inline-flex items-center justify-center size-9 rounded-lg bg-secondary border border-border shrink-0\">\n <i className=\"fa-light fa-magnifying-glass text-[15px] text-secondary-foreground\" aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-foreground leading-tight\">Search</p>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Toolbar search for this view.</p>\n </div>\n </div>\n <ToggleSwitch\n id=\"toggle-toolbar-search\"\n checked={displayOptions.showToolbarSearch}\n onChange={v => onDisplayOptionsChange({ showToolbarSearch: v })}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* ── Filter ── */}\n {sheetPanel === \"filter\" && (\n <div className=\"px-4 py-4 space-y-2\">\n {activeFilters.length === 0 ? (\n <div className=\"rounded-xl border border-border bg-muted/40 p-4 space-y-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"inline-flex items-center justify-center size-7 rounded-lg bg-background border border-border shrink-0\">\n <i className=\"fa-light fa-filter text-muted-foreground text-xs\" aria-hidden=\"true\" />\n </span>\n <p className=\"text-sm font-medium text-foreground\">No filters yet</p>\n </div>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Use filters to show only the rows you need. With multiple filters, use <span className=\"font-medium text-foreground/80\">and</span> or <span className=\"font-medium text-foreground/80\">or</span> between them to control how they combine.\n </p>\n <div className=\"space-y-1.5\">\n {[\n { icon: \"fa-circle-1\", text: \"Click \\\"Add filter\\\" below\" },\n { icon: \"fa-circle-2\", text: \"Choose a field to filter by\" },\n { icon: \"fa-circle-3\", text: \"Pick at least one value — the grid updates immediately\" },\n ].map(step => (\n <div key={step.icon} className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <i className={`fa-light ${step.icon} text-muted-foreground text-xs shrink-0`} aria-hidden=\"true\" />\n {step.text}\n </div>\n ))}\n </div>\n </div>\n ) : (\n <>\n {activeFilters.map((f, idx) => {\n const fieldDef = filterFields.find(fd => fd.key === f.fieldKey)\n if (!fieldDef) return null\n const leftId = idx > 0 ? activeFilters[idx - 1]!.id : null\n const connector = leftId ? getFilterConnector(leftId) : \"and\"\n return (\n <React.Fragment key={f.id}>\n {idx > 0 && leftId && (\n <div className=\"flex items-center gap-2 py-1\">\n <div className=\"flex-1 h-px bg-border\" aria-hidden=\"true\" />\n <Tip label=\"Click to switch: AND — every filter must match; OR — any matching filter is enough.\" side=\"top\">\n <button\n type=\"button\"\n onClick={() => onToggleFilterConnector(leftId)}\n className={cn(\n \"shrink-0 rounded-md border px-2.5 py-0.5 text-xs font-semibold uppercase tracking-wide transition-colors\",\n \"border-border bg-muted/40 text-muted-foreground hover:bg-interactive-hover hover:text-interactive-hover-foreground\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n aria-label={\n connector === \"and\"\n ? \"Filters are combined with AND. Click to use OR instead.\"\n : \"Filters are combined with OR. Click to use AND instead.\"\n }\n >\n {connector}\n </button>\n </Tip>\n <div className=\"flex-1 h-px bg-border\" aria-hidden=\"true\" />\n </div>\n )}\n <DrawerFilterCard\n filter={f}\n fieldDef={fieldDef}\n expanded={drawerExpandedFilters.has(f.id)}\n onToggleExpand={() => onDrawerExpandedFiltersChange(prev => {\n const next = new Set(prev)\n if (next.has(f.id)) next.delete(f.id)\n else next.add(f.id)\n return next\n })}\n onUpdate={onUpdateFilter}\n onRemove={id => {\n onRemoveFilter(id)\n onDrawerExpandedFiltersChange(prev => { const next = new Set(prev); next.delete(id); return next })\n }}\n renderOptionLabel={value => renderFilterOptionValue?.(f.fieldKey, value)}\n />\n </React.Fragment>\n )\n })}\n </>\n )}\n\n {/* Add filter + Remove all */}\n <div className=\"flex items-center gap-2 pt-2\">\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1 gap-1.5 h-8 border-dashed text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add filter\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <DropdownMenuLabel className=\"text-xs\">Filter by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterFields.map(f => (\n <DropdownMenuItem key={f.key} onSelect={() => onAddFilter(f.key)}>\n <i className={`fa-light ${f.icon}`} aria-hidden=\"true\" />\n {f.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n {activeFilters.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 text-destructive hover:text-destructive hover:bg-destructive/10\"\n onClick={() => { activeFilters.forEach(f => onRemoveFilter(f.id)); onDrawerExpandedFiltersChange(new Set()) }}\n >\n Remove all\n </Button>\n )}\n </div>\n\n {/* Enable filter bar toggle */}\n <div className=\"flex items-start justify-between gap-3 pt-3 mt-1 border-t border-border\">\n <div>\n <label htmlFor=\"toggle-filter-bar\" className=\"text-sm font-medium text-foreground cursor-pointer\">Enable filter bar</label>\n <p className=\"text-xs text-muted-foreground mt-0.5\">Show filters above the table.</p>\n </div>\n <ToggleSwitch id=\"toggle-filter-bar\" checked={filterBarVisible} onChange={onFilterBarVisibleChange} />\n </div>\n </div>\n )}\n\n {/* ── Sort ── */}\n {sheetPanel === \"sort\" && (\n <div className=\"px-4 py-4 space-y-2\">\n {sortRules.length === 0 ? (\n /* Empty state */\n <div className=\"rounded-xl border border-dashed border-border bg-muted/30 px-4 py-6 text-center space-y-2\">\n <div className=\"inline-flex items-center justify-center size-9 rounded-lg bg-muted mb-1\">\n <i className=\"fa-light fa-arrow-up-arrow-down text-muted-foreground text-[16px]\" aria-hidden=\"true\" />\n </div>\n <p className=\"text-sm font-medium text-foreground\">No sorts applied</p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Add a sort rule to order rows by any field. Multiple rules are applied in priority order.\n </p>\n <div className=\"space-y-1.5 text-start pt-1\">\n {[\n { icon: \"fa-circle-1\", text: \"Click \\\"Add sort\\\" below\" },\n { icon: \"fa-circle-2\", text: \"Choose a field to sort by\" },\n { icon: \"fa-circle-3\", text: \"Toggle ascending or descending\" },\n ].map(step => (\n <div key={step.icon} className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <i className={`fa-light ${step.icon} text-muted-foreground text-xs shrink-0`} aria-hidden=\"true\" />\n {step.text}\n </div>\n ))}\n </div>\n </div>\n ) : (\n sortRules.map((rule, idx) => {\n const dragProps = sortDrag.getItemProps(rule.id)\n return (\n <React.Fragment key={rule.id}>\n {idx > 0 && (\n <div className=\"flex items-center gap-2 py-0.5\">\n <div className=\"flex-1 h-px bg-border\" />\n <span className=\"text-xs font-medium text-muted-foreground px-1\">then by</span>\n <div className=\"flex-1 h-px bg-border\" />\n </div>\n )}\n <div\n {...dragProps}\n className={cn(\n \"transition-all\",\n dragProps[\"data-dragging\"] && \"opacity-40\",\n dragProps[\"data-over\"] && \"ring-2 ring-ring bg-accent/30 rounded-lg\",\n )}\n >\n <DrawerSortCard\n rule={rule}\n fieldLabel={resolveColumnLabel(rule.fieldKey)}\n isPrimary={idx === 0}\n onRemove={() => onRemoveSortRule(rule.id)}\n onToggleDir={() => onToggleSortDir(rule.id)}\n />\n </div>\n </React.Fragment>\n )\n })\n )}\n\n {/* Add sort + Remove all */}\n <div className=\"flex items-center gap-2 pt-2\">\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1 gap-1.5 h-8 border-dashed text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add sort\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <DropdownMenuLabel className=\"text-xs\">Sort by field</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {sortFieldList.filter(f => !sortRules.some(r => r.fieldKey === f.key)).map(col => (\n <DropdownMenuItem key={col.key} onSelect={() => onAddSortRule(col.key)}>\n <i className=\"fa-light fa-arrow-up-arrow-down text-xs\" aria-hidden=\"true\" />\n {col.label}\n </DropdownMenuItem>\n ))}\n {sortFieldList.filter(f => !sortRules.some(r => r.fieldKey === f.key)).length === 0 && (\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">All fields added</p>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n {sortRules.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 text-destructive hover:text-destructive hover:bg-destructive/10\"\n onClick={() => onSortRulesChange([])}\n >\n Remove all\n </Button>\n )}\n </div>\n </div>\n )}\n\n {/* ── Group ── */}\n {sheetPanel === \"group\" && (\n <div className=\"p-4 space-y-2\">\n <p className=\"text-xs text-muted-foreground mb-3\">\n {groupBy ? `Grouped by ${resolveColumnLabel(groupBy)}.` : \"No grouping applied.\"}\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onGroupByChange(null)}\n className={cn(\"w-full justify-start gap-2 px-3 py-2 h-auto text-sm font-normal\",\n !groupBy ? \"bg-accent text-accent-foreground font-medium\" : \"text-muted-foreground\",\n )}\n >\n <i className=\"fa-light fa-ban text-xs\" aria-hidden=\"true\" />\n None\n </Button>\n {groupFieldList.map(col => (\n <Button\n key={col.key}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onGroupByChange(groupBy === col.key ? null : col.key)}\n className={cn(\"w-full justify-start gap-2 px-3 py-2 h-auto text-sm font-normal\",\n groupBy === col.key ? \"bg-accent text-accent-foreground font-medium\" : \"\",\n )}\n >\n <i className=\"fa-light fa-layer-group text-xs text-muted-foreground\" aria-hidden=\"true\" />\n {col.label}\n {groupBy === col.key && <i className=\"fa-solid fa-check text-accent-foreground text-xs ms-auto\" aria-hidden=\"true\" />}\n </Button>\n ))}\n </div>\n )}\n\n {/* ── Columns ── */}\n {sheetPanel === \"columns\" && (\n <div className=\"px-4 py-4\">\n {isBoardView ? (\n <p className=\"text-xs text-muted-foreground mb-3\">\n Column visibility and order apply when you use Table view. They are saved with this tab.\n </p>\n ) : null}\n <p className=\"text-xs text-muted-foreground mb-3\">\n {hiddenCols.size === 0\n ? \"All columns visible. Drag to reorder.\"\n : `${hiddenCols.size} column${hiddenCols.size !== 1 ? \"s\" : \"\"} hidden. Drag handle to reorder.`}\n </p>\n <div className=\"space-y-0.5\" role=\"list\" aria-label=\"Column order and visibility\">\n {orderable.map((key, idx, arr) => {\n const dragProps = colDrag.getItemProps(key)\n return (\n <ColumnRow\n key={key}\n label={resolveColumnLabel(key)}\n isFirst={idx === 0}\n isLast={idx === arr.length - 1}\n visible={!hiddenCols.has(key)}\n onToggleVisible={() => onToggleColVisibility(key)}\n onMoveUp={() => onMoveCol(key, \"up\")}\n onMoveDown={() => onMoveCol(key, \"down\")}\n draggable={dragProps.draggable}\n onDragStart={dragProps.onDragStart}\n onDragOver={dragProps.onDragOver}\n onDrop={dragProps.onDrop}\n onDragEnd={dragProps.onDragEnd}\n isDragging={dragProps[\"data-dragging\"]}\n isOver={dragProps[\"data-over\"]}\n />\n )\n })}\n </div>\n </div>\n )}\n\n {/* ── Conditional rules ── */}\n {sheetPanel === \"conditional-rules\" && (\n <ConditionalRulesPanel\n filterFields={filterFields}\n rules={conditionalRules}\n onAdd={onAddConditionalRule}\n onRemove={onRemoveConditionalRule}\n onUpdate={onUpdateConditionalRule}\n renderFilterOptionValue={renderFilterOptionValue}\n />\n )}\n\n </div>\n </>\n )}\n\n </SheetContent>\n </Sheet>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ConditionalRulesPanel — same DrawerFilterCard as filters (incl. operator cycle);\n// highlight color lives inside the card. Adding a rule expands only that card (like\n// add filter from drawer). No And/Or connectors.\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction ConditionalRulesPanel({\n filterFields,\n rules,\n onAdd,\n onRemove,\n onUpdate,\n renderFilterOptionValue,\n}: {\n filterFields: FilterFieldDef[]\n rules: ConditionalRule[]\n onAdd: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemove: (id: string) => void\n onUpdate: (id: string, patch: Partial<ConditionalRule>) => void\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}) {\n const [expandedIds, setExpandedIds] = React.useState<Set<string>>(() => new Set())\n\n const prevLenRef = React.useRef(rules.length)\n React.useEffect(() => {\n if (rules.length > prevLenRef.current && rules.length > 0) {\n const last = rules[rules.length - 1]\n setExpandedIds(new Set([last.id]))\n }\n prevLenRef.current = rules.length\n }, [rules])\n\n function toggleExpanded(id: string) {\n setExpandedIds(prev => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n }\n\n return (\n <div className=\"px-4 py-4 space-y-2\">\n {rules.length === 0 ? (\n <div className=\"rounded-xl border border-dashed border-border bg-muted/30 px-4 py-6 text-center space-y-2\">\n <div className=\"inline-flex items-center justify-center size-9 rounded-lg bg-muted mb-1\">\n <i className=\"fa-light fa-palette text-muted-foreground text-[16px]\" aria-hidden=\"true\" />\n </div>\n <p className=\"text-sm font-medium text-foreground\">No rules yet</p>\n <p className=\"text-xs text-muted-foreground leading-relaxed\">\n Highlight cells with a background color based on their value.\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {rules.map(rule => {\n const fd = filterFields.find(f => f.key === rule.fieldKey)\n if (!fd) return null\n return (\n <DrawerFilterCard\n key={rule.id}\n variant=\"conditional\"\n filter={rule}\n fieldDef={fd}\n expanded={expandedIds.has(rule.id)}\n onToggleExpand={() => toggleExpanded(rule.id)}\n onUpdate={onUpdate}\n onRemove={id => {\n onRemove(id)\n setExpandedIds(prev => {\n const next = new Set(prev)\n next.delete(id)\n return next\n })\n }}\n renderOptionLabel={value => renderFilterOptionValue?.(rule.fieldKey, value)}\n />\n )\n })}\n </div>\n )}\n\n <div className=\"flex items-center gap-2 pt-2\">\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1 gap-1.5 h-8 border-dashed text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n Add rule\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className={PROPERTIES_SHEET_PORTAL_Z}>\n <DropdownMenuLabel className=\"text-xs\">Rule for column</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {filterFields.map(f => (\n <DropdownMenuItem\n key={f.key}\n onSelect={() => onAdd({\n fieldKey: f.key,\n operator: f.operators[0],\n values: [],\n bgColor: RULE_COLORS[0].bg,\n })}\n >\n <i className={`fa-light ${f.icon}`} aria-hidden=\"true\" />\n {f.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n {rules.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"shrink-0 text-destructive hover:text-destructive hover:bg-destructive/10\"\n onClick={() => {\n rules.forEach(r => onRemove(r.id))\n setExpandedIds(new Set())\n }}\n >\n Remove all\n </Button>\n )}\n </div>\n </div>\n )\n}\n","\"use client\"\n\n/**\n * TablePropertiesDrawerButton — reusable Properties button + drawer combo.\n *\n * Centralises the \"sliders\" icon button and the full `TablePropertiesDrawer` that was\n * previously duplicated per hub (TeamDrawerToolbar, ComplianceDrawerToolbar, …).\n *\n * Pass any `useTableState<T>` return object as `state` — the component only reads\n * display-agnostic fields so it is compatible with any row shape.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\"\nimport { Button } from \"../ui/button\"\nimport { TablePropertiesDrawer } from \"./drawer\"\nimport type {\n ActiveFilter,\n ConditionalRule,\n FilterFieldDef,\n SortRule,\n} from \"../../lib/table-properties-types\"\nimport type { RowHeight } from \"../../lib/row-height\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport type { DataListDisplayOptions } from \"../../lib/data-list-display-options\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// State interface\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Structural interface over the fields consumed from `useTableState`.\n * Any `ReturnType<typeof useTableState<T>>` is assignable to this type because:\n * - All non-row fields have the same shape regardless of `T`.\n * - `rows: T[]` is assignable to `rows: { length: number }` (arrays expose `.length`).\n */\nexport interface TablePropertiesDrawerButtonState {\n sheetOpen: boolean\n setSheetOpen: (v: boolean) => void\n /**\n * Optional deep-link target consumed by `TablePropertiesDrawer`'s `initialPanel`.\n * Required only if the hub deep-links into a specific drawer panel (e.g. the\n * column header's **Add Conditional Rule** sets it to `\"conditional-rules\"`).\n * Default state is `null`, which makes the drawer open on its index panel.\n */\n sheetInitialPanel?: string | null\n setSheetInitialPanel?: (v: string | null) => void\n showGridlines: boolean\n setShowGridlines: (v: boolean) => void\n rowHeight: RowHeight\n setRowHeight: (v: RowHeight) => void\n activeFilters: ActiveFilter[]\n addFilter: (fieldKey: string, fromDrawer?: boolean) => void\n updateFilter: (id: string, patch: Partial<ActiveFilter>) => void\n removeFilter: (id: string) => void\n getConnector: (leftFilterId: string) => \"and\" | \"or\"\n toggleConnector: (leftFilterId: string) => void\n filterBarVisible: boolean\n setFilterBarVisible: (v: boolean) => void\n drawerExpandedFilters: Set<string>\n setDrawerExpandedFilters: React.Dispatch<React.SetStateAction<Set<string>>>\n /** Only `.length` is read — compatible with any `T[]`. */\n rows: { length: number }\n sortRules: SortRule[]\n setSortRules: (rules: SortRule[]) => void\n addSortRule: (fieldKey: string) => void\n removeSortRule: (id: string) => void\n toggleSortDir: (id: string) => void\n colOrder: string[]\n setColOrder: (order: string[]) => void\n hiddenCols: Set<string>\n toggleColVisibility: (key: string) => void\n moveCol: (key: string, dir: \"up\" | \"down\") => void\n groupBy: string | null\n setGroupBy: (key: string | null) => void\n sortKey?: string\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Props\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface TablePropertiesDrawerButtonProps {\n /** Pass any `useTableState<T>` return value. */\n state: TablePropertiesDrawerButtonState\n totalRows: number\n filterFields: FilterFieldDef[]\n /**\n * Column definitions for the drawer's Sort / Group / Columns panels.\n * Required — derive from your column defs (`columnsToFieldDefinitions`) so\n * the drawer never falls back to product-specific defaults.\n */\n fieldDefinitions: { key: string; label: string; sortable?: boolean }[]\n resolveColumnLabel?: (key: string) => string\n displayOptions: DataListDisplayOptions\n onDisplayOptionsChange: (patch: Partial<DataListDisplayOptions>) => void\n conditionalRules: ConditionalRule[]\n onAddConditionalRule: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemoveConditionalRule: (id: string) => void\n onUpdateConditionalRule: (id: string, patch: Partial<ConditionalRule>) => void\n /**\n * Whether pagination is enabled. Defaults to `false`.\n * Placements passes `true` because it supports server-side pagination.\n */\n pagination?: boolean\n onPaginationChange?: (v: boolean) => void\n /** View type shown in the drawer header tile grid. */\n currentView?: DataListViewType\n onViewChange?: (v: DataListViewType) => void\n /**\n * Subset of view types this hub implements. When provided, the drawer's view-type tile grid is\n * filtered so users cannot select an unsupported view (e.g. List hub never offers Dashboard).\n */\n supportedViewTypes?: readonly DataListViewType[]\n /** Shown below the \"Properties\" title in the drawer header (e.g. \"Team\", \"Compliance\"). */\n lifecycleTabLabel?: string\n /**\n * When the active view is Board and more than one entry is provided, the drawer renders\n * a selector for which field splits the board into swimlane columns.\n */\n boardGroupByColumnOptions?: { key: string; label: string }[]\n /** Extra controls rendered before the Properties button (e.g. a dashboard-edit button). */\n extraActions?: React.ReactNode\n /** Optional custom option renderer for filter values (e.g. status chips). */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function TablePropertiesDrawerButton({\n state,\n totalRows,\n filterFields,\n fieldDefinitions,\n resolveColumnLabel,\n displayOptions,\n onDisplayOptionsChange,\n conditionalRules,\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n pagination = false,\n onPaginationChange,\n currentView,\n onViewChange,\n supportedViewTypes,\n lifecycleTabLabel,\n boardGroupByColumnOptions,\n extraActions,\n renderFilterOptionValue,\n}: TablePropertiesDrawerButtonProps) {\n // Only destructure the read-only state slices we render directly.\n // Mutators (addFilter, setSortRules, toggleColVisibility, …) are\n // intentionally accessed via `stateRef.current.X` so the portaled Sheet\n // always sees the latest reducers without re-binding event handlers on\n // every render.\n const {\n sheetOpen, setSheetOpen,\n sheetInitialPanel,\n setSheetInitialPanel,\n showGridlines, setShowGridlines,\n rowHeight, setRowHeight,\n activeFilters,\n filterBarVisible,\n drawerExpandedFilters,\n rows,\n sortRules,\n colOrder,\n hiddenCols,\n groupBy,\n sortKey,\n } = state\n\n // Sheet is portaled; keep latest handlers so sort/filter/conditional edits are not lost.\n // Writes to ref.current MUST happen after commit (not during render) — React 19 +\n // react-hooks v6 lints `Cannot access refs during render`. Use `useLayoutEffect` so\n // the ref points at the just-rendered values before any effects fire.\n const stateRef = React.useRef(state)\n const ruleHandlersRef = React.useRef({\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n onDisplayOptionsChange,\n onPaginationChange,\n })\n React.useLayoutEffect(() => {\n stateRef.current = state\n })\n React.useLayoutEffect(() => {\n ruleHandlersRef.current = {\n onAddConditionalRule,\n onRemoveConditionalRule,\n onUpdateConditionalRule,\n onDisplayOptionsChange,\n onPaginationChange,\n }\n })\n\n // Stable callback that defers the ref read to invocation time. Used for\n // `onDrawerExpandedFiltersChange` which is read-by-reference (not invoked\n // through an inline arrow), so we wrap it explicitly to avoid reading\n // `stateRef.current` during render.\n const onDrawerExpandedFiltersChange = React.useCallback<\n React.Dispatch<React.SetStateAction<Set<string>>>\n >((next) => stateRef.current.setDrawerExpandedFilters(next), [])\n\n return (\n <>\n {extraActions}\n\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Properties\"\n onClick={() => {\n // The toolbar button always opens to the drawer's \"main\" index\n // panel — clear any pending deep-link target from a previous\n // column-menu interaction so this open lands on main.\n setSheetInitialPanel?.(null)\n setSheetOpen(true)\n }}\n className={cn(\n sheetOpen\n ? \"bg-accent text-accent-foreground\"\n : \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-interactive-hover\",\n )}\n >\n <i className=\"fa-light fa-sliders text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">Properties</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <TablePropertiesDrawer\n open={sheetOpen}\n onOpenChange={setSheetOpen}\n initialPanel={sheetInitialPanel}\n showGridlines={showGridlines}\n onShowGridlinesChange={setShowGridlines}\n rowHeight={rowHeight}\n onRowHeightChange={setRowHeight}\n pagination={pagination}\n onPaginationChange={v => ruleHandlersRef.current.onPaginationChange?.(v)}\n activeFilters={activeFilters}\n onAddFilter={fieldKey => stateRef.current.addFilter(fieldKey, true)}\n onUpdateFilter={(id, patch) => stateRef.current.updateFilter(id, patch)}\n onRemoveFilter={id => stateRef.current.removeFilter(id)}\n getFilterConnector={leftId => stateRef.current.getConnector(leftId)}\n onToggleFilterConnector={leftId => stateRef.current.toggleConnector(leftId)}\n filterBarVisible={filterBarVisible}\n onFilterBarVisibleChange={v => stateRef.current.setFilterBarVisible(v)}\n drawerExpandedFilters={drawerExpandedFilters}\n onDrawerExpandedFiltersChange={onDrawerExpandedFiltersChange}\n totalRows={totalRows}\n filteredRows={rows.length}\n sortRules={sortRules}\n onSortRulesChange={rules => stateRef.current.setSortRules(rules)}\n onAddSortRule={fieldKey => stateRef.current.addSortRule(fieldKey)}\n onRemoveSortRule={id => stateRef.current.removeSortRule(id)}\n onToggleSortDir={id => stateRef.current.toggleSortDir(id)}\n colOrder={colOrder}\n onColOrderChange={order => stateRef.current.setColOrder(order)}\n hiddenCols={hiddenCols}\n onToggleColVisibility={key => stateRef.current.toggleColVisibility(key)}\n onMoveCol={(key, dir) => stateRef.current.moveCol(key, dir)}\n groupBy={groupBy}\n onGroupByChange={key => stateRef.current.setGroupBy(key)}\n primarySortKey={sortKey}\n conditionalRules={conditionalRules}\n onAddConditionalRule={rule => ruleHandlersRef.current.onAddConditionalRule(rule)}\n onRemoveConditionalRule={id => ruleHandlersRef.current.onRemoveConditionalRule(id)}\n onUpdateConditionalRule={(id, patch) => ruleHandlersRef.current.onUpdateConditionalRule(id, patch)}\n filterFields={filterFields}\n lifecycleTabLabel={lifecycleTabLabel}\n fieldDefinitions={fieldDefinitions}\n resolveColumnLabel={resolveColumnLabel}\n displayOptions={displayOptions}\n onDisplayOptionsChange={patch => ruleHandlersRef.current.onDisplayOptionsChange(patch)}\n currentView={currentView}\n onViewChange={onViewChange}\n supportedViewTypes={supportedViewTypes}\n boardGroupByColumnOptions={boardGroupByColumnOptions}\n renderFilterOptionValue={renderFilterOptionValue}\n />\n </>\n )\n}\n","/**\n * Connects ListPageTemplate “View → Edit” to a surface that hosts TablePropertiesDrawer\n * (PlacementsTable, TeamTable, ComplianceTable, …). Import from `@/components/table-properties`\n * or use here — see `createListPageEditViewHandler`.\n *\n * View **labels** for tabs and Properties are centralized in `@/lib/data-list-view`\n * (`DATA_LIST_VIEW_TILES`, `dataListViewLabel`, `dataListViewIcon`).\n */\n\nimport * as React from \"react\"\n\nimport { dataListViewIcon, type DataListViewType } from \"./data-list-view\"\nimport { isDataListSurfaceViewType } from \"./data-list-view-registry\"\n\nexport { isDataListSurfaceViewType }\n\n/** Minimal ref API any list/table surface exposes for the shared Properties drawer. */\nexport interface OpenTablePropertiesHandle {\n openPropertiesDrawer: () => void\n}\n\nexport interface CreateListPageEditViewHandlerOptions {\n /** Delay before opening Properties after switching to table (ms). Default 160. */\n switchDelayMs?: number\n}\n\n/**\n * Returns `ListPageTemplate`’s `onEditView` handler: optionally coerces the tab to `table`\n * when the view type is unknown, then calls `ref.current.openPropertiesDrawer()`.\n */\nexport function createListPageEditViewHandler(\n tableRef: React.RefObject<OpenTablePropertiesHandle | null>,\n options?: CreateListPageEditViewHandlerOptions\n) {\n const delay = options?.switchDelayMs ?? 160\n return (\n tab: { viewType: string },\n { updateTab }: { updateTab: (patch: { viewType?: DataListViewType; icon?: string }) => void }\n ) => {\n const mustSwitchToTableSurface = !isDataListSurfaceViewType(tab.viewType)\n if (mustSwitchToTableSurface) {\n updateTab({ viewType: \"table\", icon: dataListViewIcon(\"table\") })\n }\n window.setTimeout(() => {\n tableRef.current?.openPropertiesDrawer()\n }, mustSwitchToTableSurface ? delay : 0)\n }\n}\n","\"use client\"\n\n/**\n * Switches list-hub view bodies by `DataListViewRenderKind`.\n * Hubs pass one renderer per kind they support; missing kinds show a clear empty state\n * (never silently fall through to dashboard).\n */\n\nimport * as React from \"react\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport {\n dataListViewDefinition,\n dataListViewLabel,\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n} from \"../../lib/data-list-view-registry\"\n\nexport type ListPageConnectedViewRenderers = Partial<\n Record<DataListViewRenderKind, React.ReactNode | (() => React.ReactNode)>\n>\n\nexport interface ListPageConnectedViewBodyProps {\n view: DataListViewType\n /** Human-readable hub name for the not-configured state. */\n hubLabel?: string\n renderers: ListPageConnectedViewRenderers\n}\n\nfunction resolveRenderer(node: React.ReactNode | (() => React.ReactNode) | undefined) {\n if (node == null) return null\n return typeof node === \"function\" ? node() : node\n}\n\nexport function ListPageViewNotConfigured({\n view,\n hubLabel = \"This hub\",\n}: {\n view: DataListViewType\n hubLabel?: string\n}) {\n const label = dataListViewLabel(view)\n return (\n <div\n className=\"flex flex-1 items-center justify-center px-4 py-12 text-center text-sm text-muted-foreground\"\n role=\"status\"\n >\n {hubLabel} does not implement {label}. Add a renderer for{\" \"}\n <span className=\"font-medium text-foreground\">{dataListViewDefinition(view).renderKind}</span>{\" \"}\n in this hub&apos;s table component, or remove the view from{\" \"}\n <code className=\"rounded bg-muted px-1 py-0.5 text-xs\">supportedViewTypes</code>.\n </div>\n )\n}\n\nexport function ListPageConnectedViewBody({\n view,\n hubLabel,\n renderers,\n}: ListPageConnectedViewBodyProps) {\n const kind = getDataListViewRenderKind(view)\n const body = resolveRenderer(renderers[kind])\n if (body == null) {\n return <ListPageViewNotConfigured view={view} hubLabel={hubLabel} />\n }\n return <>{body}</>\n}\n","\"use client\"\n\n/**\n * DataRowList — generic vertical-stack list view used by every hub's \"list\"\n * tab (placements, team, compliance, sites, question-bank, …). Replaces the\n * hand-rolled `<ul …flex-col gap-2 px-4 pb-8 pt-2 lg:px-6> {rows.map(<li>…)}`\n * shell that was duplicated across `*-list-view.tsx` files.\n *\n * Composition over inheritance: callers provide a `renderRow(row)` that\n * returns whatever ListPageBoardCard / link / chip-stack they need — this\n * component owns the chrome (spacing, empty state, virtualization), not the\n * row body.\n *\n * Auto-virtualises with `@tanstack/react-virtual` when the row count meets\n * `virtualizeThreshold` (default 100). Disable by passing `0`.\n */\n\nimport * as React from \"react\"\nimport { useWindowVirtualizer } from \"@tanstack/react-virtual\"\nimport { cn } from \"../../lib/utils\"\n\nconst DEFAULT_VIRTUALIZE_THRESHOLD = 100\nconst DEFAULT_ESTIMATED_ROW_HEIGHT = 96\nconst DEFAULT_OVERSCAN = 8\n\nexport interface DataRowListProps<TRow> {\n /** The filtered/sorted rows from `tableState.rows` (or wherever). */\n rows: readonly TRow[]\n /** Stable id used as the React `key` and (for virtualizer) the v-key. */\n getRowId: (row: TRow, index: number) => string | number\n /** Render the body of one row. Wrap with `<ListPageBoardCard layout=\"row\">` etc. */\n renderRow: (row: TRow, index: number) => React.ReactNode\n /**\n * Shown when `rows.length === 0`. Strings render as muted body copy; pass\n * a `ReactNode` for richer empty states (illustration, CTA, etc.).\n */\n emptyState?: React.ReactNode\n /**\n * Auto-virtualise when `rows.length >= virtualizeThreshold`. Default 100.\n * Pass `0` to never virtualise (preserves predictable layout for short\n * lists like dashboards / pinned tabs).\n */\n virtualizeThreshold?: number\n /** Hint for the virtualizer; clamps to measured size after first paint. */\n estimatedRowHeight?: number\n /** Override the default container padding / gap if needed. */\n className?: string\n /** Override the per-row `<li>` className (e.g. tighter spacing). */\n rowClassName?: string\n /** `aria-label` for the `<ul>` (screen-reader name for the list). */\n ariaLabel?: string\n}\n\nconst DEFAULT_OUTER_CLASS = \"flex list-none flex-col gap-2 px-4 pb-8 pt-2 lg:px-6\"\n\nexport function DataRowList<TRow>(props: DataRowListProps<TRow>) {\n const {\n rows,\n getRowId,\n renderRow,\n emptyState,\n virtualizeThreshold = DEFAULT_VIRTUALIZE_THRESHOLD,\n estimatedRowHeight = DEFAULT_ESTIMATED_ROW_HEIGHT,\n className,\n rowClassName,\n ariaLabel,\n } = props\n\n if (rows.length === 0) {\n if (emptyState == null) return null\n if (typeof emptyState === \"string\") {\n return (\n <div className=\"px-4 py-16 text-center lg:px-6\">\n <p className=\"text-sm text-muted-foreground\">{emptyState}</p>\n </div>\n )\n }\n return <div className=\"px-4 py-16 text-center lg:px-6\">{emptyState}</div>\n }\n\n if (virtualizeThreshold > 0 && rows.length >= virtualizeThreshold) {\n return (\n <DataRowListVirtualized\n rows={rows}\n getRowId={getRowId}\n renderRow={renderRow}\n estimatedRowHeight={estimatedRowHeight}\n className={className}\n rowClassName={rowClassName}\n ariaLabel={ariaLabel}\n />\n )\n }\n\n return (\n <ul aria-label={ariaLabel} className={cn(DEFAULT_OUTER_CLASS, className)}>\n {rows.map((row, i) => (\n <li key={getRowId(row, i)} className={rowClassName}>\n {renderRow(row, i)}\n </li>\n ))}\n </ul>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Virtualised variant — keeps the DOM short on long lists (e.g. 1000+ rows).\n// Uses `useWindowVirtualizer` so the page scroll drives row recycling; this\n// is the right tool for hub-level lists (not nested-scroll containers).\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction DataRowListVirtualized<TRow>({\n rows,\n getRowId,\n renderRow,\n estimatedRowHeight,\n className,\n rowClassName,\n ariaLabel,\n}: {\n rows: readonly TRow[]\n getRowId: (row: TRow, index: number) => string | number\n renderRow: (row: TRow, index: number) => React.ReactNode\n estimatedRowHeight: number\n className?: string\n rowClassName?: string\n ariaLabel?: string\n}) {\n const anchorRef = React.useRef<HTMLDivElement | null>(null)\n // `scrollMargin` is read by the virtualizer during render, so it has to\n // be state (not a ref). We measure with `useLayoutEffect` after the first\n // paint and on resize so window-scroll math stays accurate when the page\n // layout shifts (sidebar collapse, banner, etc.).\n const [scrollMargin, setScrollMargin] = React.useState(0)\n\n const updateScrollMargin = React.useCallback(() => {\n const el = anchorRef.current\n if (!el) return\n setScrollMargin(el.getBoundingClientRect().top + window.scrollY)\n }, [])\n\n React.useLayoutEffect(() => {\n updateScrollMargin()\n window.addEventListener(\"resize\", updateScrollMargin)\n return () => window.removeEventListener(\"resize\", updateScrollMargin)\n }, [updateScrollMargin, rows.length])\n\n const virtualizer = useWindowVirtualizer({\n count: rows.length,\n estimateSize: () => estimatedRowHeight,\n overscan: DEFAULT_OVERSCAN,\n scrollMargin,\n getItemKey: i => String(getRowId(rows[i], i)),\n })\n\n const totalSize = virtualizer.getTotalSize()\n\n return (\n <div ref={anchorRef} className={cn(\"px-4 pb-8 pt-2 lg:px-6\", className)}>\n <ul\n aria-label={ariaLabel}\n className=\"relative m-0 w-full list-none p-0\"\n style={{ height: `${totalSize}px` }}\n >\n {virtualizer.getVirtualItems().map(vr => {\n const row = rows[vr.index]\n if (!row) return null\n return (\n <li\n key={vr.key}\n data-index={vr.index}\n ref={virtualizer.measureElement}\n className={cn(\"absolute left-0 top-0 w-full pb-2\", rowClassName)}\n style={{ transform: `translateY(${vr.start}px)` }}\n >\n {renderRow(row, vr.index)}\n </li>\n )\n })}\n </ul>\n </div>\n )\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"group/badge inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-1 text-xs font-medium leading-none whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pe-1.5 has-data-[icon=inline-start]:ps-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n secondary:\n \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n destructive:\n \"bg-destructive/10 text-[var(--chip-destructive)] focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:text-red-100 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n outline:\n \"border-border text-foreground [a]:hover:bg-interactive-hover [a]:hover:text-muted-foreground\",\n ghost:\n \"hover:bg-interactive-hover hover:text-muted-foreground dark:hover:bg-interactive-hover-subtle\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction Badge({\n className,\n variant = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> &\n VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\"\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nexport { Badge, badgeVariants }\n","\"use client\"\n\n/**\n * Reusable building blocks for kanban / board cards (icon rows, two-line blocks, placeholders).\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport type { BoardLineCount } from \"../../lib/data-list-display-options\"\n\nexport function BoardCardIconRow({\n iconClass,\n children,\n}: {\n iconClass: string\n children: React.ReactNode\n}) {\n return (\n <div className=\"flex items-start gap-2\">\n <i\n className={cn(\n `fa-light ${iconClass} text-xs text-muted-foreground mt-0.5 w-4 shrink-0 text-center`,\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1 text-xs leading-snug [&_.text-sm]:text-xs [&_span]:text-xs [&_div]:text-xs\">\n {children}\n </div>\n </div>\n )\n}\n\nexport function BoardCardTwoLineBlock({\n iconClass,\n line1,\n line2,\n line2ClassName,\n}: {\n iconClass: string\n line1: React.ReactNode\n /** Omitted for a single-line row (same icon + primary alignment as Placements). */\n line2?: React.ReactNode\n /** Override default muted line-2 (e.g. badges / rich cells). */\n line2ClassName?: string\n}) {\n const showLine2 = line2 !== undefined && line2 !== null\n return (\n <div className=\"flex items-start gap-2\">\n <i\n className={cn(\n `fa-light ${iconClass} text-xs text-muted-foreground mt-0.5 w-4 shrink-0 text-center`,\n )}\n aria-hidden\n />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-medium text-foreground leading-tight\">{line1}</div>\n {showLine2 ? (\n <div\n className={cn(\n \"mt-0.5 min-w-0 leading-tight\",\n line2ClassName ?? \"truncate text-xs text-muted-foreground\",\n )}\n >\n {line2}\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n\nexport function lineClampClass(n: BoardLineCount): string {\n const base = \"min-w-0 overflow-hidden break-words\"\n if (n === 1) return cn(base, \"line-clamp-1\")\n if (n === 2) return cn(base, \"line-clamp-2\")\n return cn(base, \"line-clamp-3\")\n}\n\nexport function BoardNewCardPlaceholder({ position }: { position: \"above\" | \"below\" }) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border bg-background/50 py-2 text-xs font-medium text-muted-foreground transition-colors\",\n \"hover:border-input hover:bg-muted/40 hover:text-foreground\",\n position === \"above\" ? \"mb-2\" : \"mt-2\",\n )}\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n New card\n </button>\n )\n}\n","\"use client\"\n\n/**\n * ListPageBoardTemplate — reusable kanban shell for list pages (Team, custom hubs).\n *\n * - Columns are defined with predicates; each row is placed in the **first** matching column.\n * - Cards are rendered by the caller (`renderCard`) — compose **`ListPageBoardCard`** + primitives (`BoardCardTwoLineBlock`, etc.).\n * - Placements keeps richer column headers (search, menus); this template is for simpler hubs.\n *\n * @see `docs/data-views-pattern.md` — board primitives\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Badge } from \"../ui/badge\"\nimport { BoardNewCardPlaceholder } from \"./board-card-primitives\"\n\nexport type ListPageBoardColumnDef<T> = {\n id: string\n label: string\n /** Shown beside the title on larger breakpoints */\n description?: string\n /** First matching column wins; columns should be mutually exclusive for most domains. */\n filter: (row: T) => boolean\n}\n\nexport type ListPageBoardTemplateProps<T> = {\n columns: ListPageBoardColumnDef<T>[]\n rows: T[]\n getRowKey: (row: T) => string | number\n renderCard: (row: T) => React.ReactNode\n /** Tailwind classes for the count pill, keyed by column `id` */\n columnCountBadgeClassName?: Record<string, string>\n /** Copy when a column has no rows */\n emptyColumnLabel?: string\n}\n\nfunction ListPageBoardColumnHeader({\n label,\n description,\n count,\n badgeClassName,\n}: {\n label: string\n description?: string\n count: number\n badgeClassName?: string\n}) {\n return (\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2.5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{label}</span>\n {description ? (\n <span className=\"hidden text-xs text-muted-foreground sm:inline\">{description}</span>\n ) : null}\n </div>\n <Badge\n variant=\"outline\"\n className={cn(\n \"inline-flex h-6 min-w-6 shrink-0 items-center justify-center border-0 bg-muted/70 px-2 text-xs font-semibold tabular-nums text-foreground\",\n badgeClassName,\n )}\n aria-label={`${count} ${count === 1 ? \"item\" : \"items\"}`}\n >\n {count}\n </Badge>\n </div>\n )\n}\n\nexport function ListPageBoardTemplate<T>({\n columns,\n rows,\n getRowKey,\n renderCard,\n columnCountBadgeClassName = {},\n emptyColumnLabel = \"No items\",\n}: ListPageBoardTemplateProps<T>) {\n const grouped = React.useMemo(() => {\n const map: Record<string, T[]> = {}\n for (const col of columns) map[col.id] = []\n for (const row of rows) {\n for (const col of columns) {\n if (col.filter(row)) {\n map[col.id].push(row)\n break\n }\n }\n }\n return map\n }, [columns, rows])\n\n return (\n <div className=\"flex min-h-0 flex-1 gap-3 overflow-x-auto px-4 pb-6 pt-2 lg:px-6\">\n {columns.map(col => (\n <div\n key={col.id}\n className=\"flex w-72 shrink-0 flex-col overflow-hidden rounded-xl border border-border bg-muted/30\"\n >\n <ListPageBoardColumnHeader\n label={col.label}\n description={col.description}\n count={grouped[col.id]?.length ?? 0}\n badgeClassName={columnCountBadgeClassName[col.id]}\n />\n\n <div className=\"flex flex-1 flex-col gap-2 overflow-y-auto p-2\">\n <BoardNewCardPlaceholder position=\"above\" />\n\n {(grouped[col.id]?.length ?? 0) === 0 ? (\n <p className=\"py-6 text-center text-xs text-muted-foreground\">{emptyColumnLabel}</p>\n ) : (\n grouped[col.id]!.map(row => <React.Fragment key={String(getRowKey(row))}>{renderCard(row)}</React.Fragment>)\n )}\n\n <BoardNewCardPlaceholder position=\"below\" />\n </div>\n </div>\n ))}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * `<HubTable<TRow>>` — single centralized table surface used by every list-page hub.\n *\n * Owns all the per-hub scaffolding that was previously duplicated in `placements-table.tsx`,\n * `team-table.tsx`, `compliance-table.tsx`, `question-bank-table.tsx`, and `sites-table.tsx`:\n *\n * • `useTableState` setup tied to the centralized row dataset\n * • `displayOptions` state + `patchDisplay`\n * • `conditionalRules` state + add/remove/update handlers\n * • `filterFields` derived from column `filter` defs\n * • `fieldDefinitions` + `resolveColumnLabel` for the Properties drawer\n * • `TablePropertiesDrawerButton` wiring with `currentView` + `supportedViewTypes`\n * • `DataTable` for `view === \"table\"`; `ListPageConnectedViewBody` for every other view\n * • Imperative `openPropertiesDrawer()` exposed via `handleRef`\n *\n * Each hub now only declares **what's actually different**: its column defs and a typed\n * `renderers` map for the views it implements. The renderers receive `state`, `toolbar`,\n * `toolbarShell`, `drawerToolbarProps`, `displayOptions`, and `patchDisplay` so they can\n * either reuse the pre-composed toolbar (`toolbarShell(<MyView rows={state.rows} />)`) or\n * build their own (e.g. dashboard view with extra layout-edit actions).\n *\n * **Single dataset rule:** rows flow through `useTableState`; `tableState.rows` is the\n * filtered/sorted row bag every non-table renderer reads. There is **no** parallel mock\n * array per view. See `.cursor/rules/exxat-centralized-list-dataset.mdc`.\n */\n\nimport * as React from \"react\"\nimport { DataTable, DataTableToolbar } from \"../data-table\"\nimport type { ColumnDef } from \"../data-table/types\"\nimport { useTableState } from \"../data-table/use-table-state\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport {\n getDataListViewRenderKind,\n type DataListViewRenderKind,\n} from \"../../lib/data-list-view-registry\"\nimport {\n DEFAULT_DATA_LIST_DISPLAY_OPTIONS,\n type DataListDisplayOptions,\n} from \"../../lib/data-list-display-options\"\nimport { TablePropertiesDrawerButton } from \"../table-properties\"\nimport type {\n ConditionalRule,\n FilterFieldDef,\n FilterOperator,\n} from \"../../lib/table-properties-types\"\nimport {\n ListPageConnectedViewBody,\n type ListPageConnectedViewRenderers,\n} from \"./list-page-connected-view-body\"\nimport { DataRowList } from \"./data-row-list\"\nimport {\n ListPageBoardTemplate,\n type ListPageBoardColumnDef,\n} from \"./list-page-board-template\"\nimport type { OpenTablePropertiesHandle } from \"../../lib/list-page-table-properties\"\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Helpers\n// ──────────────────────────────────────────────────────────────────────────────\n\nfunction columnToFilterFieldDef<TRow>(c: ColumnDef<TRow>): FilterFieldDef | null {\n if (!c.filter) return null\n const f = c.filter\n const defaultOps: FilterOperator[] =\n f.type === \"select\" || f.type === \"date\" ? [\"is\", \"is_not\"] : [\"contains\", \"not_contains\"]\n return {\n key: c.key,\n label: c.label,\n icon: f.icon ?? \"fa-filter\",\n type: f.type,\n operators: (f.operators ?? defaultOps) as FilterOperator[],\n options: f.options,\n ...(f.textMask ? { textMask: f.textMask } : {}),\n }\n}\n\n/** Derive `FilterFieldDef[]` from a hub's column defs — preferred to hand-writing both. */\nexport function columnsToFilterFields<TRow>(cols: ColumnDef<TRow>[]): FilterFieldDef[] {\n return cols\n .map(c => columnToFilterFieldDef<TRow>(c))\n .filter((x): x is FilterFieldDef => x !== null)\n}\n\n/** Field definitions for the drawer's Sort / Group / Columns panels — excludes utility columns. */\nexport function columnsToFieldDefinitions<TRow>(\n cols: ColumnDef<TRow>[],\n): { key: string; label: string; sortable: boolean }[] {\n return cols\n .filter(c => c.key !== \"select\" && c.key !== \"actions\")\n .map(c => ({\n key: c.key,\n label: c.label,\n sortable: !!(c.sortable && (c.sortKey ?? c.key)),\n }))\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Public types\n// ──────────────────────────────────────────────────────────────────────────────\n\n/** Subset of `TablePropertiesDrawerButton` props that `HubTable` owns. Exposed so renderers\n * that build a custom toolbar (e.g. dashboard with an extra Edit-layout button) can splat\n * this back into their own `<TablePropertiesDrawerButton {...drawerToolbarProps} state={s} extraActions={…} />`. */\nexport interface HubDrawerToolbarProps {\n totalRows: number\n filterFields: FilterFieldDef[]\n fieldDefinitions: { key: string; label: string; sortable: boolean }[]\n resolveColumnLabel: (key: string) => string\n displayOptions: DataListDisplayOptions\n onDisplayOptionsChange: (patch: Partial<DataListDisplayOptions>) => void\n conditionalRules: ConditionalRule[]\n onAddConditionalRule: (rule: Omit<ConditionalRule, \"id\">) => void\n onRemoveConditionalRule: (id: string) => void\n onUpdateConditionalRule: (id: string, patch: Partial<ConditionalRule>) => void\n currentView: DataListViewType\n onViewChange?: (v: DataListViewType) => void\n supportedViewTypes: readonly DataListViewType[]\n lifecycleTabLabel: string\n boardGroupByColumnOptions?: { key: string; label: string }[]\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n pagination?: boolean\n onPaginationChange?: (v: boolean) => void\n}\n\n/** Everything a non-table renderer needs. The pre-composed `toolbar` includes search +\n * filter chips + the Properties button; the renderer just wraps it around its body with\n * `toolbarShell`. For dashboards or other layouts that own their own toolbar, use\n * `drawerToolbarProps` to assemble a custom `<TablePropertiesDrawerButton>`. */\nexport interface HubTableRendererArgs<TRow extends Record<string, unknown>> {\n state: ReturnType<typeof useTableState<TRow>>\n toolbar: React.ReactNode\n toolbarShell: (body: React.ReactNode) => React.ReactNode\n drawerToolbarProps: HubDrawerToolbarProps\n displayOptions: DataListDisplayOptions\n patchDisplay: (patch: Partial<DataListDisplayOptions>) => void\n}\n\n/** Hubs provide one renderer per `DataListViewRenderKind` they implement. The `data-table`\n * kind is handled internally by `HubTable` (do not override unless you genuinely need a\n * different table surface). Missing kinds render `<ListPageViewNotConfigured>` — clear empty\n * state, never a silent dashboard fallback. */\nexport type HubTableRenderers<TRow extends Record<string, unknown>> = Partial<\n Record<DataListViewRenderKind, (args: HubTableRendererArgs<TRow>) => React.ReactNode>\n>\n\nexport type HubTableHandle = OpenTablePropertiesHandle\n\nexport interface HubTableProps<TRow extends Record<string, unknown>> {\n /** Full row dataset (already scoped/filtered by the hub client, e.g. by URL nav). */\n rows: TRow[]\n /** Column defs — `filter` blocks here become Properties drawer filter fields automatically. */\n columns: ColumnDef<TRow>[]\n /** Active view from the `ListPageTemplate` tab. */\n view: DataListViewType\n onViewChange?: (v: DataListViewType) => void\n /** Allowlist passed to `TablePropertiesDrawerButton` so Properties cannot offer unsupported views. */\n supportedViewTypes: readonly DataListViewType[]\n /** Used by `ListPageViewNotConfigured` when a supported view has no renderer. */\n hubLabel: string\n /** Shown below \"Properties\" in the drawer header. */\n lifecycleTabLabel: string\n /** Toolbar search input aria-label. */\n searchAriaLabel: string\n getRowId: (row: TRow) => string | number\n getRowSelectionLabel: (row: TRow) => string\n defaultSort: { key: string; dir: \"asc\" | \"desc\" }\n /** DataTable empty state. Defaults to a muted \"No records match your filters.\" */\n emptyState?: React.ReactNode\n /** Per-view renderers (everything other than `view === \"table\"`). */\n renderers: HubTableRenderers<TRow>\n /** Bulk-actions slot rendered when one or more rows are selected. */\n bulkActionsSlot?: (selected: Set<string | number>) => React.ReactNode\n /** Board-view group-by column options for the Properties drawer. */\n boardGroupByColumnOptions?: { key: string; label: string }[]\n /** Initial display options (toolbar search visibility, calendar panel, etc.). */\n displayOptionsInit?: DataListDisplayOptions\n /** Custom renderer for filter option values (e.g. status chips). */\n renderFilterOptionValue?: (fieldKey: string, value: string) => React.ReactNode\n /** DataTable: enable \"Group by\" feature. Default `true`. */\n groupable?: boolean\n /** DataTable: enable row selection checkboxes. Default `true`. */\n selectable?: boolean\n /** DataTable: row click handler (e.g. navigate to detail route). */\n onRowClick?: (row: TRow) => void\n /**\n * Controlled `displayOptions` — when provided (with `onDisplayOptionsChange`), the hub client\n * owns persistence (e.g. Placements page persists across tab switches). Otherwise `HubTable`\n * owns internal state from `displayOptionsInit`.\n */\n displayOptions?: DataListDisplayOptions\n onDisplayOptionsChange?: (patch: Partial<DataListDisplayOptions>) => void\n /**\n * Pagination toggle forwarded to `TablePropertiesDrawerButton` so the drawer can offer\n * \"Show pagination\" on the Display panel. The hub still implements its own pagination chrome\n * around the table body via `tableRenderer`. Defaults to `false` / no toggle.\n */\n pagination?: boolean\n onPaginationChange?: (v: boolean) => void\n /** Imperative handle (`openPropertiesDrawer`) for hub clients that pass `tablePropertiesRef`. */\n handleRef?: React.Ref<HubTableHandle>\n /** Optional override for the `data-table` view. Default mounts `<DataTable {…}>`. */\n tableRenderer?: (args: HubTableRendererArgs<TRow>) => React.ReactNode\n /**\n * Forwarded to `useTableState` so the hub can switch on server-style pagination\n * (e.g. Placements toggles between paged and unpaged tables).\n */\n paginationOverride?: { page: number; pageSize: number }\n /**\n * Forwarded to `useTableState` to sync toolbar search from `?q=` (Question bank search routes).\n * Defining as `\"\"` enables sync without an initial query.\n */\n syncedSearchFromUrl?: string\n\n // ─── Centralized \"list\" and \"board\" defaults ───────────────────────────────\n // When a hub does NOT provide a renderer for `list-with-toolbar`, but DOES provide\n // `renderListRow`, `HubTable` synthesises a default that wires `DataRowList` through\n // the shared toolbar. Same for `board-with-toolbar` + `renderBoardCard`. This is the\n // happy path for most hubs; the explicit renderer escape hatch is only needed for\n // exotic surfaces (e.g. Placements board with per-phase column search).\n\n /** Default `list-with-toolbar` renderer body — `HubTable` wraps with toolbar + `DataRowList`. */\n renderListRow?: (row: TRow) => React.ReactNode\n /** Override the `aria-label` on the `<ul>` from `renderListRow`. Defaults to `hubLabel`. */\n listAriaLabel?: string\n /** Empty-state for the default list renderer. Defaults to \"No records match your filters.\" */\n listEmptyState?: React.ReactNode\n /** Virtualise after N rows in the default list renderer. Default 100; pass `0` to disable. */\n listVirtualizeThreshold?: number\n /** Estimated row height (px) for the default list virtualiser. Default 96. */\n listEstimatedRowHeight?: number\n\n /** Default `board-with-toolbar` renderer body — `HubTable` wraps with toolbar + `ListPageBoardTemplate`. */\n renderBoardCard?: (row: TRow) => React.ReactNode\n /** Required if `renderBoardCard` is set: how rows group into columns. */\n boardGroups?: ListPageBoardColumnDef<TRow>[]\n /** Per-column count badge tint classes for the default board renderer. */\n boardColumnCountBadgeClassName?: Record<string, string>\n /** Empty column copy for the default board renderer. Defaults to \"No items\". */\n boardEmptyColumnLabel?: string\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// Component\n// ──────────────────────────────────────────────────────────────────────────────\n\nexport function HubTable<TRow extends Record<string, unknown>>({\n rows,\n columns,\n view,\n onViewChange,\n supportedViewTypes,\n hubLabel,\n lifecycleTabLabel,\n searchAriaLabel,\n getRowId,\n getRowSelectionLabel,\n defaultSort,\n emptyState,\n renderers,\n bulkActionsSlot,\n boardGroupByColumnOptions,\n displayOptionsInit,\n renderFilterOptionValue,\n groupable = true,\n selectable = true,\n onRowClick,\n displayOptions: displayOptionsControlled,\n onDisplayOptionsChange: onDisplayOptionsChangeControlled,\n pagination,\n onPaginationChange,\n handleRef,\n tableRenderer,\n paginationOverride,\n syncedSearchFromUrl,\n renderListRow,\n listAriaLabel,\n listEmptyState,\n listVirtualizeThreshold,\n listEstimatedRowHeight,\n renderBoardCard,\n boardGroups,\n boardColumnCountBadgeClassName,\n boardEmptyColumnLabel,\n}: HubTableProps<TRow>) {\n const filterFields = React.useMemo(() => columnsToFilterFields(columns), [columns])\n const fieldDefinitions = React.useMemo(() => columnsToFieldDefinitions(columns), [columns])\n const resolveColumnLabel = React.useCallback(\n (key: string) => columns.find(c => c.key === key)?.label ?? key,\n [columns],\n )\n\n // displayOptions: controlled (parent owns state via prop pair) OR uncontrolled (HubTable owns it).\n // Most hubs keep display options ephemeral; Placements persists them across tabs at the page level.\n const [internalDisplayOptions, setInternalDisplayOptions] = React.useState<DataListDisplayOptions>(\n displayOptionsInit ?? DEFAULT_DATA_LIST_DISPLAY_OPTIONS,\n )\n const isControlled =\n displayOptionsControlled !== undefined && onDisplayOptionsChangeControlled !== undefined\n const displayOptions = isControlled ? displayOptionsControlled : internalDisplayOptions\n const patchDisplay = React.useCallback(\n (patch: Partial<DataListDisplayOptions>) => {\n if (isControlled) {\n onDisplayOptionsChangeControlled!(patch)\n } else {\n setInternalDisplayOptions(prev => ({ ...prev, ...patch }))\n }\n },\n [isControlled, onDisplayOptionsChangeControlled],\n )\n\n const [conditionalRules, setConditionalRules] = React.useState<ConditionalRule[]>([])\n const addConditionalRule = React.useCallback((rule: Omit<ConditionalRule, \"id\">) => {\n setConditionalRules(prev => [...prev, { ...rule, id: `cr-${Date.now()}` }])\n }, [])\n const removeConditionalRule = React.useCallback((id: string) => {\n setConditionalRules(prev => prev.filter(r => r.id !== id))\n }, [])\n const updateConditionalRule = React.useCallback(\n (id: string, patch: Partial<ConditionalRule>) => {\n setConditionalRules(prev => prev.map(r => (r.id === id ? { ...r, ...patch } : r)))\n },\n [],\n )\n\n const tableState = useTableState<TRow>(\n rows,\n columns,\n defaultSort,\n paginationOverride,\n syncedSearchFromUrl,\n )\n\n // Extract the stable setter from `useTableState` first so the\n // `useImperativeHandle` deps array sees the exact value the hook reads.\n // `setSheetOpen` is referentially stable, so the handle is created once.\n const { setSheetOpen: openPropertiesSheet } = tableState\n React.useImperativeHandle(\n handleRef ?? null,\n () => ({ openPropertiesDrawer: () => openPropertiesSheet(true) }),\n [openPropertiesSheet],\n )\n\n const drawerToolbarProps: HubDrawerToolbarProps = {\n totalRows: rows.length,\n filterFields,\n fieldDefinitions,\n resolveColumnLabel,\n displayOptions,\n onDisplayOptionsChange: patchDisplay,\n conditionalRules,\n onAddConditionalRule: addConditionalRule,\n onRemoveConditionalRule: removeConditionalRule,\n onUpdateConditionalRule: updateConditionalRule,\n currentView: view,\n onViewChange,\n supportedViewTypes,\n lifecycleTabLabel,\n boardGroupByColumnOptions,\n renderFilterOptionValue,\n ...(pagination !== undefined ? { pagination } : {}),\n ...(onPaginationChange !== undefined ? { onPaginationChange } : {}),\n }\n\n const toolbar = (\n <DataTableToolbar\n state={tableState}\n columns={columns}\n searchable={displayOptions.showToolbarSearch}\n searchAriaLabel={searchAriaLabel}\n renderFilterOptionValue={renderFilterOptionValue}\n toolbarSlot={s => <TablePropertiesDrawerButton {...drawerToolbarProps} state={s} />}\n />\n )\n\n const toolbarShell = React.useCallback(\n (body: React.ReactNode) => (\n <div className=\"flex min-h-0 flex-1 flex-col\">\n {toolbar}\n {body}\n </div>\n ),\n // `toolbar` is recreated each render; including it would defeat memoization but\n // also gives renderers a fresh closure — acceptable because renderers are called\n // on render anyway. Keep deps stable so the function identity is stable.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n tableState,\n columns,\n displayOptions.showToolbarSearch,\n searchAriaLabel,\n renderFilterOptionValue,\n drawerToolbarProps,\n ],\n )\n\n // Default `data-table` renderer — full DataTable with toolbar + bulk actions. Hubs can\n // override via `tableRenderer` for pagination chrome (CountSyncer + PaginationBar) or\n // any other table-view-specific wrapping.\n const defaultTableRenderer = (args: HubTableRendererArgs<TRow>) => (\n <div className=\"pb-6\">\n <DataTable<TRow>\n data={rows}\n columns={columns}\n getRowId={getRowId}\n getRowSelectionLabel={getRowSelectionLabel}\n selectable={selectable}\n searchable={displayOptions.showToolbarSearch}\n showColumnHeaders={displayOptions.showColumnLabels}\n groupable={groupable}\n defaultSort={defaultSort}\n emptyState={emptyState ?? <p className=\"text-sm text-muted-foreground\">No records match your filters.</p>}\n conditionalRules={conditionalRules}\n state={args.state}\n renderFilterOptionValue={renderFilterOptionValue}\n toolbarSlot={s => <TablePropertiesDrawerButton {...drawerToolbarProps} state={s} />}\n bulkActionsSlot={bulkActionsSlot}\n onRowClick={onRowClick}\n />\n </div>\n )\n\n const args: HubTableRendererArgs<TRow> = {\n state: tableState,\n toolbar,\n toolbarShell,\n drawerToolbarProps,\n displayOptions,\n patchDisplay,\n }\n\n // Dev-time warning when a `supportedViewType` has no renderer (other than `table`,\n // which has the built-in default). Mirrors `defineHubViewRenderers` from\n // `lib/hub-connected-view-renderers.ts` but inline so we don't double-wrap.\n if (process.env.NODE_ENV !== \"production\") {\n for (const v of supportedViewTypes) {\n const kind = getDataListViewRenderKind(v)\n if (kind === \"data-table\") continue\n if (renderers[kind] == null) {\n console.warn(\n `[Exxat DS][HubTable: ${hubLabel}] Missing renderer for supported view \"${v}\" (${kind}). ` +\n \"Add a renderer entry, or remove the view from supportedViewTypes.\",\n )\n }\n }\n }\n\n // Compose `ListPageConnectedViewBody` renderers: the built-in `data-table` (or hub override)\n // plus each hub-provided non-table renderer. Wrapping in `() => …` defers execution until\n // the active view actually selects that kind — so heavy bodies (dashboard charts) don't\n // pay render cost on a table tab.\n const composed: ListPageConnectedViewRenderers = {\n \"data-table\": () => (tableRenderer ?? defaultTableRenderer)(args),\n }\n\n // Default centralized list renderer: same DataRowList shell every hub used to roll\n // by hand. Hub provides only the per-row body via `renderListRow`.\n if (renderers[\"list-with-toolbar\"] == null && renderListRow != null) {\n composed[\"list-with-toolbar\"] = () =>\n args.toolbarShell(\n <DataRowList<TRow>\n rows={args.state.rows as TRow[]}\n getRowId={row => getRowId(row)}\n ariaLabel={listAriaLabel ?? hubLabel}\n emptyState={listEmptyState ?? \"No records match your filters.\"}\n {...(listVirtualizeThreshold !== undefined ? { virtualizeThreshold: listVirtualizeThreshold } : {})}\n {...(listEstimatedRowHeight !== undefined ? { estimatedRowHeight: listEstimatedRowHeight } : {})}\n renderRow={renderListRow}\n />,\n )\n }\n\n // Default centralized board renderer: same ListPageBoardTemplate every hub used to wrap.\n // Hub provides only the per-card body via `renderBoardCard` and the column predicate set.\n if (renderers[\"board-with-toolbar\"] == null && renderBoardCard != null && boardGroups != null) {\n composed[\"board-with-toolbar\"] = () =>\n args.toolbarShell(\n <ListPageBoardTemplate<TRow>\n columns={boardGroups}\n rows={args.state.rows as TRow[]}\n getRowKey={getRowId}\n renderCard={renderBoardCard}\n columnCountBadgeClassName={boardColumnCountBadgeClassName ?? {}}\n emptyColumnLabel={boardEmptyColumnLabel ?? \"No items\"}\n />,\n )\n }\n\n for (const kind of Object.keys(renderers) as DataListViewRenderKind[]) {\n const r = renderers[kind]\n if (r) composed[kind] = () => r(args)\n }\n\n return <ListPageConnectedViewBody view={view} hubLabel={hubLabel} renderers={composed} />\n}\n\nHubTable.displayName = \"HubTable\"\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check, Plus } from \"lucide-react\"\nimport { Avatar as AvatarPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Badge } from \"./badge\"\n\n/** Maps to Shadcn Studio avatar demos (shape / ring / stack). Uses theme tokens only. */\nconst avatarRootVariants = cva(\n \"group/avatar relative flex shrink-0 overflow-hidden select-none\",\n {\n variants: {\n size: {\n sm: \"size-6\",\n default: \"size-8\",\n lg: \"size-10\",\n },\n shape: {\n circle: \"rounded-full\",\n square: \"rounded-none\",\n \"rounded-sm\": \"rounded-sm\",\n \"rounded-md\": \"rounded-md\",\n \"rounded-lg\": \"rounded-lg\",\n \"rounded-xl\": \"rounded-xl\",\n },\n variant: {\n default: \"\",\n ring: \"ring-2 ring-ring\",\n \"ring-offset\": \"ring-2 ring-ring ring-offset-2 ring-offset-background\",\n group: \"ring-2 ring-background\",\n },\n },\n defaultVariants: {\n size: \"default\",\n shape: \"circle\",\n variant: \"default\",\n },\n }\n)\n\nconst AVATAR_INSET_AFTER: Record<NonNullable<VariantProps<typeof avatarRootVariants>[\"shape\"]>, string> = {\n circle: \"after:rounded-full\",\n square: \"after:rounded-none\",\n \"rounded-sm\": \"after:rounded-sm\",\n \"rounded-md\": \"after:rounded-md\",\n \"rounded-lg\": \"after:rounded-lg\",\n \"rounded-xl\": \"after:rounded-xl\",\n}\n\nconst avatarImageShape = cn(\n \"aspect-square size-full object-cover\",\n \"group-data-[shape=circle]/avatar:rounded-full\",\n \"group-data-[shape=square]/avatar:rounded-none\",\n \"group-data-[shape=rounded-sm]/avatar:rounded-sm\",\n \"group-data-[shape=rounded-md]/avatar:rounded-md\",\n \"group-data-[shape=rounded-lg]/avatar:rounded-lg\",\n \"group-data-[shape=rounded-xl]/avatar:rounded-xl\"\n)\n\nconst avatarFallbackShape = cn(\n \"flex size-full items-center justify-center bg-muted text-sm text-muted-foreground\",\n \"group-data-[shape=circle]/avatar:rounded-full\",\n \"group-data-[shape=square]/avatar:rounded-none\",\n \"group-data-[shape=rounded-sm]/avatar:rounded-sm\",\n \"group-data-[shape=rounded-md]/avatar:rounded-md\",\n \"group-data-[shape=rounded-lg]/avatar:rounded-lg\",\n \"group-data-[shape=rounded-xl]/avatar:rounded-xl\",\n \"group-data-[size=sm]/avatar:text-xs\"\n)\n\ntype AvatarProps = React.ComponentProps<typeof AvatarPrimitive.Root> &\n VariantProps<typeof avatarRootVariants> & {\n /**\n * Subtle inner hairline on the avatar edge (token `border-border`).\n * Default **false** — full-bleed circle for photos/logos (Shadcn Studio–style profile look).\n */\n insetBorder?: boolean\n }\n\nfunction Avatar({\n className,\n size = \"default\",\n shape = \"circle\",\n variant = \"default\",\n insetBorder = false,\n ...props\n}: AvatarProps) {\n const shapeKey = shape ?? \"circle\"\n const insetClass =\n insetBorder &&\n cn(\n \"after:pointer-events-none after:absolute after:inset-0 after:border after:border-border after:mix-blend-darken dark:after:mix-blend-lighten\",\n AVATAR_INSET_AFTER[shapeKey]\n )\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n data-size={size}\n data-shape={shape}\n className={cn(avatarRootVariants({ size, shape, variant }), insetClass, className)}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({\n className,\n referrerPolicy = \"no-referrer\",\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n referrerPolicy={referrerPolicy}\n className={cn(avatarImageShape, className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(avatarFallbackShape, className)}\n {...props}\n />\n )\n}\n\nfunction AvatarBadge({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"avatar-badge\"\n className={cn(\n \"absolute end-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground bg-blend-color ring-2 ring-background select-none\",\n \"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden\",\n \"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2\",\n \"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2\",\n className\n )}\n {...props}\n />\n )\n}\n\n/**\n * A row of avatars with an overflow counter — **never overlapping**.\n *\n * Overlapping face piles (Slack / GitHub style) have known UX problems in\n * dense product chrome: ring-on-background contrast is fragile in dark mode,\n * click targets stack, and screen readers announce ambiguous groupings.\n * `AvatarGroup` therefore renders children side-by-side with a small inline\n * gap. See `.cursor/rules/exxat-person-identity-display.mdc` (MUST NOT —\n * overlapping avatars) and the `PageHeader` collaboration variant which\n * uses the same gapped row.\n */\nfunction AvatarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group\"\n className={cn(\n \"group/avatar-group flex items-center gap-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarGroupCount({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"avatar-group-count\"\n className={cn(\n \"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3\",\n className\n )}\n {...props}\n />\n )\n}\n\n// ── Shadcn Studio–style compositions (tokens + a11y checklist: sr-only status, meaningful alt on image) ──\n\ntype AvatarShape = NonNullable<VariantProps<typeof avatarRootVariants>[\"shape\"]>\ntype AvatarVariant = NonNullable<VariantProps<typeof avatarRootVariants>[\"variant\"]>\ntype AvatarSize = NonNullable<VariantProps<typeof avatarRootVariants>[\"size\"]>\n\ntype AvatarInitialsProps = Omit<AvatarProps, \"children\"> & {\n initials: string\n /** When true, initials are hidden from accessibility tree (pair with visible name). Default true. */\n decorative?: boolean\n /** Extra classes on `AvatarFallback` (e.g. font weight). */\n fallbackClassName?: string\n}\n\n/** Initials-only chip using `--avatar-initials-bg` / `--avatar-initials-fg` (Exxat tokens). */\nfunction AvatarInitials({\n initials,\n decorative = true,\n fallbackClassName,\n className,\n ...avatarProps\n}: AvatarInitialsProps) {\n return (\n <Avatar className={className} {...avatarProps}>\n <AvatarFallback\n aria-hidden={decorative ? true : undefined}\n className={cn(\n \"border-0 bg-[var(--avatar-initials-bg)] font-semibold text-[var(--avatar-initials-fg)]\",\n fallbackClassName\n )}\n >\n {initials}\n </AvatarFallback>\n </Avatar>\n )\n}\n\ntype AvatarStatusTone = \"online\" | \"busy\" | \"away\"\n\nconst avatarStatusDot: Record<AvatarStatusTone, string> = {\n online: \"bg-emerald-600 dark:bg-emerald-400\",\n busy: \"bg-destructive\",\n away: \"bg-amber-600 dark:bg-amber-400\",\n}\n\n/** Presence dot (Studio avatars 7–9). Wraps a single `Avatar`. */\nfunction AvatarStatus({\n children,\n status,\n label,\n className,\n position = \"bottom-end\",\n}: {\n children: React.ReactNode\n status: AvatarStatusTone\n /** Announced to screen readers (e.g. \"Busy\"). */\n label: string\n className?: string\n /** `bottom-end` matches `AvatarBadge`; `top-end` matches some Studio away demos. */\n position?: \"bottom-end\" | \"top-end\"\n}) {\n const pos =\n position === \"top-end\"\n ? \"-top-0.5 -end-0.5 bottom-auto start-auto\"\n : \"-end-0.5 -bottom-0.5 top-auto start-auto\"\n return (\n <span className={cn(\"relative inline-flex w-fit shrink-0\", className)}>\n {children}\n <span\n className={cn(\n \"pointer-events-none absolute z-10 size-3 rounded-full border-2 border-background\",\n pos,\n avatarStatusDot[status]\n )}\n aria-hidden\n />\n <span className=\"sr-only\">{label}</span>\n </span>\n )\n}\n\n/** Numeric badge overlay (Studio avatar 11). */\nfunction AvatarNotificationCount({\n children,\n count,\n className,\n badgeClassName,\n}: {\n children: React.ReactNode\n count: number | string\n className?: string\n badgeClassName?: string\n}) {\n return (\n <span className={cn(\"relative inline-flex w-fit shrink-0\", className)}>\n {children}\n <Badge\n className={cn(\n \"absolute -top-2.5 -end-2.5 z-10 h-5 min-w-5 justify-center px-1 tabular-nums\",\n badgeClassName\n )}\n >\n {count}\n </Badge>\n </span>\n )\n}\n\n/** Verified check overlay (Studio avatar 12) — primary token fill. */\nfunction AvatarVerified({\n children,\n label = \"Verified\",\n className,\n}: {\n children: React.ReactNode\n label?: string\n className?: string\n}) {\n return (\n <span className={cn(\"relative inline-flex w-fit shrink-0\", className)}>\n {children}\n <span className=\"pointer-events-none absolute -top-1.5 -end-1.5 z-10 inline-flex size-4 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-sm\">\n <Check className=\"size-2.5\" strokeWidth={3} aria-hidden />\n <span className=\"sr-only\">{label}</span>\n </span>\n </span>\n )\n}\n\n/** Leo assistant mark — centralized; same icon treatment as Ask Leo sidebar. */\nfunction AvatarLeoAssistant({\n className,\n size = \"sm\",\n ...props\n}: Omit<AvatarProps, \"children\" | \"shape\">) {\n return (\n <Avatar size={size} shape=\"circle\" insetBorder={false} className={className} {...props}>\n <AvatarFallback className=\"bg-brand/15 p-0\">\n <span className=\"sr-only\">Leo</span>\n <i\n className=\"fa-duotone fa-solid fa-star-christmas text-xs text-brand\"\n aria-hidden=\"true\"\n />\n </AvatarFallback>\n </Avatar>\n )\n}\n\n/** “Add profile” affordance (Studio avatar 10). `onClick` on the button. */\nfunction AvatarPlusAction({\n children,\n actionLabel,\n onClick,\n className,\n buttonClassName,\n}: {\n children: React.ReactNode\n actionLabel: string\n onClick?: () => void\n className?: string\n buttonClassName?: string\n}) {\n return (\n <span className={cn(\"relative inline-flex w-fit shrink-0\", className)}>\n {children}\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"focus-visible:ring-ring/50 absolute -end-1 -bottom-1 z-10 inline-flex size-7 cursor-pointer items-center justify-center rounded-full bg-background shadow-sm ring-1 ring-border focus-visible:ring-[3px] focus-visible:outline-none\",\n buttonClassName\n )}\n >\n <Plus className=\"size-4 text-muted-foreground\" aria-hidden />\n <span className=\"sr-only\">{actionLabel}</span>\n </button>\n </span>\n )\n}\n\nexport {\n Avatar,\n AvatarImage,\n AvatarFallback,\n AvatarGroup,\n AvatarGroupCount,\n AvatarBadge,\n AvatarInitials,\n AvatarStatus,\n AvatarNotificationCount,\n AvatarVerified,\n AvatarPlusAction,\n AvatarLeoAssistant,\n avatarRootVariants,\n}\nexport type {\n AvatarProps,\n AvatarInitialsProps,\n AvatarShape,\n AvatarVariant,\n AvatarSize,\n AvatarStatusTone,\n}\n","/**\n * Card — surface component\n *\n * ── SPACING SYSTEM (do not override) ────────────────────────────────────────\n * Card owns all vertical rhythm:\n * py-4 → 16px top + 16px bottom padding on the card itself\n * gap-4 → 16px gap between CardHeader, CardContent, and CardFooter\n *\n * Rules:\n * ✗ Never add pb-X / pt-X to CardContent or CardHeader\n * ✗ Never add h-full / flex / flex-col to the Card wrapper\n * ✗ Never add flex-1 / min-h-0 to CardContent\n * ✗ Never add shrink-0 / pb-2 to CardHeader\n * ✓ For scrollable list content (Activity, Tasks): add overflow-auto only\n * ✓ For equal-height grid pairs in MixView: handle at grid cell level\n *\n * ── GLOW TREATMENT ──────────────────────────────────────────────────────────\n * Only two approved uses — see full spec in key-metrics.tsx GLOW GUIDELINE:\n * 1. AI surfaces (Insights card, Ask Leo responses) → opacity 0.12–0.16\n * 2. Hero sections (Key Metrics KPI band, onboarding) → opacity 0.18–0.24\n * Always pair with overflow-hidden on the Card.\n * Never add glow to: Tasks, Activity, Learn, Charts, nav elements.\n *\n * ── FOOTER PATTERN ──────────────────────────────────────────────────────────\n * Use CardFooter for card-level CTA actions (e.g. \"View all tasks\", \"Ask Leo\").\n * CardFooter renders with border-t + bg-muted/50 automatically.\n * Do not put primary workflow actions in CardFooter — use CardHeader CardAction.\n *\n * ── SIZE VARIANT ────────────────────────────────────────────────────────────\n * size=\"sm\" → tighter spacing (py-3, gap-3, px-3). Use inside compact grids.\n * size=\"default\" (implicit) → standard spacing described above.\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Card({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"card\"\n data-size={size}\n className={cn(\n \"group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-header\"\n className={cn(\n \"group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-title\"\n className={cn(\n \"font-sans text-base leading-snug font-medium group-data-[size=sm]/card:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction CardAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-action\"\n className={cn(\n \"col-start-2 row-span-2 row-start-1 self-start justify-self-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CardContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-content\"\n className={cn(\"px-4 group-data-[size=sm]/card:px-3\", className)}\n {...props}\n />\n )\n}\n\nfunction CardFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/card:p-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Card,\n CardHeader,\n CardFooter,\n CardTitle,\n CardAction,\n CardDescription,\n CardContent,\n}\n","\"use client\"\n\n/**\n * ListPageBoardCard — single board-card shell for all list hubs (Placements, Team, Compliance, …).\n *\n * Information hierarchy (top → bottom):\n * 1. **Title row** — `ListPageBoardCardTitleRow` — primary label (`text-sm font-semibold`), optional `trailing` (`ListPageBoardCardAvatar` initials chip, same as Placements).\n * 2. **Badge row** — `ListPageBoardCardBadgeRow` — optional status / tags (`flex-wrap`).\n * 3. **Body** — `ListPageBoardCardBody` — primary facts: icon rows, two-line blocks (`BoardCardIconRow` / `BoardCardTwoLineBlock` from board-card-primitives).\n * 4. **Secondary** — `ListPageBoardCardSecondary` — optional muted supporting line (`text-xs text-muted-foreground`).\n *\n * Styling matches **`BoardPlacementCard`**: `Card` `size=\"sm\"`, ring, hover shadow, optional **new** ring accent.\n *\n * **Interaction:** Pass **`onClick`** (e.g. `BoardPlacementCard`) or **`interactive`** when the card is\n * wrapped in `<Link>` / router navigation so hover/cursor match placement board tiles.\n *\n * **Layouts:**\n * - **`stack`** (default) — kanban / grid tile: compose with `ListPageBoardCardHeader`, title row, body.\n * - **`row`** — full-width list row: optional **`leading`**, **`children`** as main column, optional **`rowEnd`**.\n * Use **`rowContainerClassName`** for responsive shells (e.g. `flex-col sm:flex-row`).\n */\n\nimport * as React from \"react\"\nimport { AvatarInitials } from \"../ui/avatar\"\nimport { cn } from \"../../lib/utils\"\nimport { Card, CardHeader, CardTitle } from \"../ui/card\"\n\nexport type ListPageBoardCardLayout = \"stack\" | \"row\"\n\nexport type ListPageBoardCardProps = {\n layout?: ListPageBoardCardLayout\n /** `row` only — avatar / icon column. */\n leading?: React.ReactNode\n /** `row` only — status + chevron, etc. */\n rowEnd?: React.ReactNode\n /**\n * `row` only — flex shell for the card (default `flex flex-row items-start gap-3`).\n * Use e.g. `flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-4` for compliance-style rows.\n */\n rowContainerClassName?: string\n /** Entire card is clickable (e.g. open detail) — enables pointer + hover shadow. */\n onClick?: () => void\n /**\n * Same hover/cursor as `onClick` when the parent uses `<Link>` or `button` instead of Card click\n * (avoids nested interactive targets and keeps keyboard focus on the link).\n */\n interactive?: boolean\n className?: string\n style?: React.CSSProperties\n /** Subtle brand ring — e.g. newly created row. */\n isNew?: boolean\n children: React.ReactNode\n}\n\nexport function ListPageBoardCard({\n layout = \"stack\",\n leading,\n rowEnd,\n rowContainerClassName,\n onClick,\n interactive = false,\n className,\n style,\n isNew,\n children,\n}: ListPageBoardCardProps) {\n const isRow = layout === \"row\"\n const isInteractive = Boolean(onClick) || interactive\n const rowShell = rowContainerClassName ?? \"flex flex-row items-start gap-3\"\n\n return (\n <Card\n size=\"sm\"\n className={cn(\n \"w-full min-w-0 transition-shadow\",\n !isRow && \"gap-1\",\n isRow && cn(\"!gap-0\", rowShell, \"px-4 py-3\"),\n isInteractive && \"cursor-pointer hover:shadow-md\",\n isNew && \"ring-brand/30\",\n className,\n )}\n style={style}\n onClick={onClick}\n >\n {isRow ? (\n <>\n {leading}\n <div className=\"min-w-0 flex-1\">{children}</div>\n {rowEnd}\n </>\n ) : (\n children\n )}\n </Card>\n )\n}\n\n/** Preferred public name — same component as `ListPageBoardCard`. */\nexport const HubRecordCard = ListPageBoardCard\n\nexport function ListPageBoardCardHeader({\n className,\n children,\n}: {\n className?: string\n children: React.ReactNode\n}) {\n return <CardHeader className={cn(\"gap-2 pb-2\", className)}>{children}</CardHeader>\n}\n\n/**\n * Level 1 — Primary title (dominant text on the card).\n */\nexport function ListPageBoardCardTitleRow({\n title,\n titleClassName,\n trailing,\n}: {\n title: React.ReactNode\n /** Extra classes on the title (e.g. line-clamp from `lineClampClass`). */\n titleClassName?: string\n /** End-aligned: avatar, icon, etc. */\n trailing?: React.ReactNode\n}) {\n return (\n <div className=\"flex min-w-0 items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <CardTitle\n className={cn(\n \"break-words text-sm font-semibold leading-snug text-foreground\",\n titleClassName,\n )}\n >\n {title}\n </CardTitle>\n </div>\n {trailing}\n </div>\n )\n}\n\n/** Initials avatar — Radix `Avatar` + `--avatar-initials-*` tokens (same as tables / placement board). */\nexport function ListPageBoardCardAvatar({\n initials,\n className,\n}: {\n initials: string\n className?: string\n}) {\n return (\n <AvatarInitials\n initials={initials}\n className={cn(\"size-7 shrink-0 text-xs\", className)}\n fallbackClassName=\"text-xs\"\n />\n )\n}\n\n/**\n * Level 2 — Status / metadata chips (below title, above primary body).\n */\nexport function ListPageBoardCardBadgeRow({ children }: { children: React.ReactNode }) {\n return <div className=\"flex min-w-0 flex-wrap items-center gap-1.5\">{children}</div>\n}\n\n/**\n * Level 3 — Main facts: compose with `BoardCardIconRow`, `BoardCardTwoLineBlock`, etc.\n */\nexport function ListPageBoardCardBody({\n className,\n children,\n}: {\n className?: string\n children: React.ReactNode\n}) {\n return <div className={cn(\"flex flex-col gap-2\", className)}>{children}</div>\n}\n\n/**\n * Level 4 — Optional muted supporting line (caption, hint, extra context).\n */\nexport function ListPageBoardCardSecondary({\n className,\n children,\n}: {\n className?: string\n children: React.ReactNode\n}) {\n return (\n <p className={cn(\"text-xs text-muted-foreground leading-snug\", className)}>{children}</p>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\n\nexport interface ListPageTreeColumnHeaderProps {\n title: string\n /** Right side (e.g. icon buttons) — keep touch targets ≥ 24px */\n trailing?: React.ReactNode\n className?: string\n}\n\n/**\n * Shared left-column header for tree / outline surfaces — matches Question bank “Questions” bar.\n */\nexport function ListPageTreeColumnHeader({\n title,\n trailing,\n className,\n}: ListPageTreeColumnHeaderProps) {\n return (\n <div className={cn(\"shrink-0 border-b border-border/50 bg-card px-3 py-2\", className)}>\n <div className=\"flex h-9 items-center justify-between gap-2\">\n <h3 className=\"min-w-0 flex-1 truncate text-sm font-medium text-foreground\">{title}</h3>\n {trailing ? (\n <div className=\"flex shrink-0 items-center gap-0.5\">{trailing}</div>\n ) : null}\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\n\nexport interface ListPageSplitDetailsPlaceholderProps {\n title?: string\n description?: React.ReactNode\n className?: string\n}\n\n/**\n * Empty right pane for split hubs — flat `bg-card` to match Miller / tree columns.\n */\nexport function ListPageSplitDetailsPlaceholder({\n title = \"Nothing selected\",\n description,\n className,\n}: ListPageSplitDetailsPlaceholderProps) {\n return (\n <div\n className={cn(\n \"flex h-full min-h-0 flex-col items-center justify-center bg-card px-6 py-10 text-center\",\n className,\n )}\n >\n <div className=\"mb-4 flex size-14 items-center justify-center rounded-2xl border border-dashed border-border/70 bg-card\">\n <i\n className=\"fa-light fa-sidebar text-[1.65rem] leading-none text-muted-foreground/70\"\n aria-hidden=\"true\"\n />\n </div>\n <p className=\"text-sm font-medium text-foreground\">{title}</p>\n {description ? (\n <div className=\"mt-1.5 max-w-[16rem] text-xs leading-relaxed text-muted-foreground\">{description}</div>\n ) : null}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * ListPageViewFrame — shared horizontal gutter + optional centered max-width\n * for list-hub **view bodies** (folder icon grid, finder panel chrome,\n * OS-style folder explorer, dashboard slices, etc.).\n *\n * MUST be used instead of ad-hoc `mx-4 lg:mx-6` + `mx-auto max-w-*` pairs on\n * each page — see `apps/web/AGENTS.md` §4.5 and\n * `.cursor/rules/exxat-list-page-view-shells.mdc`.\n *\n * MUST NOT wrap `DataTable` when its toolbar already applies the same inset\n * (avoid double gutter); use this for **non-table** view branches or\n * **sections below** the shared toolbar.\n *\n * Promotion note: this file lived at\n * `apps/web/components/data-views/list-page-view-frame.tsx` until\n * 2026-05-20. It moved into `@exxatdesignux/ui` because the gutter / max-\n * width contract is entity-agnostic and other consumers (a future docs\n * site, partner apps) need the same rhythm without dragging in the whole\n * `data-views/` family.\n */\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/** Default horizontal rhythm for view bodies under `ListPageTemplate` (matches `FolderGridView`). */\nexport const LIST_PAGE_VIEW_FRAME_GUTTER = \"mx-4 mb-6 lg:mx-6\"\n\n/** Typical max width for icon grids / dense tile views on ultra-wide monitors. */\nexport const LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID = \"max-w-6xl\"\n\n/** Slightly wider shell when a view includes toolbar + breadcrumbs + grid (e.g. OS folder explorer). */\nexport const LIST_PAGE_VIEW_FRAME_MAX_WIDE = \"max-w-7xl\"\n\nexport interface ListPageViewFrameProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n /**\n * When set, children are wrapped in `mx-auto w-full min-w-0` + this\n * max-width so the block stays centered inside the primary page column.\n */\n maxWidthClassName?: string\n /** Override outer gutter; default `LIST_PAGE_VIEW_FRAME_GUTTER`. */\n gutterClassName?: string\n}\n\nexport function ListPageViewFrame({\n children,\n className,\n maxWidthClassName,\n gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,\n ...rest\n}: ListPageViewFrameProps) {\n return (\n <div className={cn(gutterClassName, className)} {...rest}>\n {maxWidthClassName ? (\n <div className={cn(\"mx-auto w-full min-w-0\", maxWidthClassName)}>{children}</div>\n ) : (\n children\n )}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * Shared **centered** chrome for list-hub split surfaces (finder / tree / multi-column explorers).\n *\n * Composes `ListPageViewFrame` (gutter + max width) with a single bordered card + fixed viewport\n * height so panel and tree views match across routes (`AGENTS.md` §4.5).\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport {\n ListPageViewFrame,\n LIST_PAGE_VIEW_FRAME_GUTTER,\n LIST_PAGE_VIEW_FRAME_MAX_WIDE,\n} from \"../ui/list-page-view-frame\"\n\n/** Default height band for split views under `ListPageTemplate` + toolbar. */\nexport const LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE: React.CSSProperties = {\n height: \"calc(100vh - 280px)\",\n minHeight: 420,\n}\n\nconst SURFACE_CLASS =\n \"flex min-h-0 flex-1 flex-col overflow-hidden rounded-xl border border-border bg-card\"\n\nexport interface ListPageSplitHubChromeProps {\n children: React.ReactNode\n \"aria-label\"?: string\n gutterClassName?: string\n maxWidthClassName?: string\n /** Override default split viewport height / min-height */\n surfaceStyle?: React.CSSProperties\n surfaceClassName?: string\n}\n\nexport function ListPageSplitHubChrome({\n children,\n \"aria-label\": ariaLabel,\n gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,\n maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,\n surfaceStyle,\n surfaceClassName,\n}: ListPageSplitHubChromeProps) {\n return (\n <ListPageViewFrame\n gutterClassName={gutterClassName}\n maxWidthClassName={maxWidthClassName}\n className=\"flex min-h-0 flex-1 flex-col\"\n >\n <div\n className={cn(SURFACE_CLASS, surfaceClassName)}\n style={{ ...LIST_PAGE_SPLIT_HUB_HEIGHT_STYLE, ...surfaceStyle }}\n aria-label={ariaLabel}\n >\n {children}\n </div>\n </ListPageViewFrame>\n )\n}\n","/**\n * Shared layout tokens for list-hub split surfaces (Miller columns, tree + details).\n * Keeps Question bank panel / tree and generic `FinderPanelView` visually aligned.\n */\n\n/** `ResizableHandle` between miller / tree columns — matches Question bank panel. */\nexport const LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS =\n \"w-1 bg-border/40 hover:bg-brand/20 transition-colors\"\n\n/** Primary column stack (scope list, folder list, record list, …). */\nexport const LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS =\n \"flex min-h-0 min-w-0 flex-col bg-card\"\n\n/** Right-hand inspector / detail column shell. */\nexport const LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS =\n \"flex min-h-0 min-w-0 flex-col bg-card\"\n","\"use client\"\n\nimport * as React from \"react\"\nimport { GripVertical } from \"lucide-react\"\nimport { Group, Panel, Separator } from \"react-resizable-panels\"\nimport type { GroupProps, PanelProps, SeparatorProps } from \"react-resizable-panels\"\n\nimport { cn } from \"../../lib/utils\"\n\n// ─── ResizablePanelGroup ──────────────────────────────────────────────────────\n\nexport type ResizablePanelGroupProps = Omit<GroupProps, \"orientation\"> & {\n direction?: \"horizontal\" | \"vertical\"\n}\n\nexport function ResizablePanelGroup({\n direction = \"horizontal\",\n className,\n ...props\n}: ResizablePanelGroupProps) {\n return (\n <Group\n orientation={direction}\n className={cn(\n \"flex h-full w-full\",\n direction === \"vertical\" && \"flex-col\",\n className,\n )}\n {...props}\n />\n )\n}\n\n// ─── ResizablePanel ───────────────────────────────────────────────────────────\n\nexport type ResizablePanelProps = PanelProps\n\nexport const ResizablePanel = Panel\n\n// ─── ResizableHandle ──────────────────────────────────────────────────────────\n\nexport type ResizableHandleProps = Omit<SeparatorProps, \"children\"> & {\n /** Render a visible grip icon on the handle. */\n withHandle?: boolean\n}\n\nexport function ResizableHandle({ withHandle, className, ...props }: ResizableHandleProps) {\n return (\n <Separator\n className={cn(\n // Base — horizontal handle (between side-by-side panels)\n \"relative flex w-1 shrink-0 cursor-col-resize items-center justify-center bg-border/60\",\n \"transition-colors hover:bg-border active:bg-primary/30\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n // Vertical handle (between stacked panels)\n \"data-[orientation=vertical]:h-1 data-[orientation=vertical]:w-full data-[orientation=vertical]:cursor-row-resize data-[orientation=vertical]:flex-row\",\n className,\n )}\n {...props}\n >\n {withHandle && (\n <div className=\"z-10 flex h-5 w-3.5 items-center justify-center rounded-sm border border-border bg-background shadow-sm\">\n <GripVertical className=\"h-3 w-3 text-muted-foreground\" />\n </div>\n )}\n </Separator>\n )\n}\n","\"use client\"\n\n/**\n * Generic two-pane layout: scrollable **tree / outline** column + **details** column,\n * with persisted split sizes (`ResizablePanelGroup` `id`) and shared **split hub chrome**\n * (`ListPageSplitHubChrome`) so tree views match finder / folder panels across the app.\n *\n * Domain hubs pass `tree` and `details` nodes; this module stays entity-agnostic.\n */\n\nimport * as React from \"react\"\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from \"../ui/resizable\"\nimport { ListPageSplitHubChrome } from \"./list-page-split-hub-chrome\"\nimport {\n LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS,\n LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS,\n LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS,\n} from \"./list-page-split-hub-tokens\"\nimport {\n LIST_PAGE_VIEW_FRAME_GUTTER,\n LIST_PAGE_VIEW_FRAME_MAX_WIDE,\n} from \"../ui/list-page-view-frame\"\n\nexport interface ListPageTreePanelShellProps {\n /** Stable id for `react-resizable-panels` layout persistence (per hub / route). */\n resizableGroupId: string\n /** Left column (tree chrome + body). */\n tree: React.ReactNode\n /** Right column (detail / inspector). */\n details: React.ReactNode\n /** Accessible name for the split surface, e.g. “Curriculum tree and details”. */\n ariaLabel: string\n treePanelId?: string\n detailsPanelId?: string\n treeDefaultSize?: string\n treeMinSize?: string\n treeMaxSize?: string\n detailsDefaultSize?: string\n detailsMinSize?: string\n gutterClassName?: string\n maxWidthClassName?: string\n}\n\nexport function ListPageTreePanelShell({\n resizableGroupId,\n tree,\n details,\n ariaLabel,\n treePanelId = \"tree\",\n detailsPanelId = \"details\",\n treeDefaultSize = \"40%\",\n treeMinSize = \"20%\",\n treeMaxSize = \"60%\",\n detailsDefaultSize = \"60%\",\n detailsMinSize = \"30%\",\n gutterClassName = LIST_PAGE_VIEW_FRAME_GUTTER,\n maxWidthClassName = LIST_PAGE_VIEW_FRAME_MAX_WIDE,\n}: ListPageTreePanelShellProps) {\n return (\n <ListPageSplitHubChrome\n aria-label={ariaLabel}\n gutterClassName={gutterClassName}\n maxWidthClassName={maxWidthClassName}\n >\n <ResizablePanelGroup id={resizableGroupId} direction=\"horizontal\" className=\"h-full min-h-0 w-full flex-1\">\n <ResizablePanel\n id={treePanelId}\n defaultSize={treeDefaultSize}\n minSize={treeMinSize}\n maxSize={treeMaxSize}\n className={LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS}\n >\n {tree}\n </ResizablePanel>\n <ResizableHandle withHandle className={LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS} />\n <ResizablePanel\n id={detailsPanelId}\n defaultSize={detailsDefaultSize}\n minSize={detailsMinSize}\n className={LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS}\n >\n {details}\n </ResizablePanel>\n </ResizablePanelGroup>\n </ListPageSplitHubChrome>\n )\n}\n","\"use client\"\n\n/**\n * FinderPanelView — Miller-style 3-column split for list-page hubs.\n *\n * Visual shell matches Question bank panel (`ListPageTreeColumnHeader`, `LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS`,\n * shared resizable handles) — see `list-page-split-hub-tokens.ts`.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport {\n ResizableHandle,\n ResizablePanel,\n ResizablePanelGroup,\n} from \"../ui/resizable\"\nimport { ListPageTreeColumnHeader } from \"./list-page-tree-column-header\"\nimport { ListPageSplitDetailsPlaceholder } from \"./list-page-split-details-placeholder\"\nimport {\n LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS,\n LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS,\n LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS,\n} from \"./list-page-split-hub-tokens\"\n\nexport interface FinderGroup {\n id: string\n label: string\n icon?: string\n accent?: string\n count: number\n}\n\nexport interface FinderPanelViewProps<T> {\n groups: FinderGroup[]\n rows: T[]\n getRowId: (row: T) => string | number\n getRowGroupId: (row: T) => string\n renderListRow: (row: T, isSelected: boolean) => React.ReactNode\n renderDetail: (row: T) => React.ReactNode\n emptyDetail?: React.ReactNode\n emptyList?: React.ReactNode\n defaultGroupId?: string\n ariaLabel?: string\n autoSaveId?: string\n className?: string\n style?: React.CSSProperties\n onAddItem?: () => void\n /**\n * When true, omit outer margin, border, and card fill so the grid fits inside\n * `ListPageSplitHubChrome` (shared split surface across hubs).\n */\n embedded?: boolean\n /** Left column title (Question bank: “Categories”). */\n groupsColumnTitle?: string\n /** Middle column title; defaults from the active group label. */\n getListColumnTitle?: (activeGroup: FinderGroup | undefined) => string\n}\n\nexport function GroupsColumn({\n groups,\n selectedGroupId,\n onSelect,\n columnTitle,\n}: {\n groups: FinderGroup[]\n selectedGroupId: string\n onSelect: (id: string) => void\n columnTitle: string\n}) {\n return (\n <div className=\"flex h-full min-h-0 flex-col overflow-hidden\">\n <ListPageTreeColumnHeader title={columnTitle} />\n <div\n className=\"min-h-0 flex-1 overflow-y-auto py-1\"\n role=\"listbox\"\n aria-label=\"Group navigation\"\n aria-multiselectable=\"false\"\n >\n {groups.map(group => {\n const isSelected = group.id === selectedGroupId\n return (\n <div key={group.id} className=\"group flex items-center hover:bg-muted/50\">\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => onSelect(group.id)}\n className={cn(\n \"flex w-full flex-1 items-center gap-2 px-3 py-2 text-start text-sm transition-colors duration-75\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n isSelected\n ? \"bg-accent font-medium text-accent-foreground\"\n : \"text-foreground\",\n )}\n >\n {group.accent ? (\n <span className={cn(\"size-2 shrink-0 rounded-full\", group.accent)} aria-hidden=\"true\" />\n ) : group.icon ? (\n <i\n className={cn(\n \"fa-light shrink-0 text-xs\",\n group.icon,\n isSelected ? \"text-accent-foreground\" : \"text-muted-foreground\",\n )}\n aria-hidden=\"true\"\n />\n ) : null}\n <span className=\"min-w-0 flex-1 truncate leading-tight\">{group.label}</span>\n <span\n className={cn(\n \"shrink-0 tabular-nums text-xs\",\n isSelected ? \"text-accent-foreground/80\" : \"text-muted-foreground\",\n )}\n >\n {group.count}\n </span>\n </button>\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\n/**\n * Horizontal scope strip (toolbar toggles). Optional: place above a hub body when you need\n * status scope without consuming a Finder column.\n */\nexport function FinderGroupStrip({\n groups,\n selectedGroupId,\n onSelect,\n ariaLabel = \"Scope\",\n}: {\n groups: FinderGroup[]\n selectedGroupId: string\n onSelect: (id: string) => void\n ariaLabel?: string\n}) {\n return (\n <div\n role=\"toolbar\"\n aria-label={ariaLabel}\n className=\"flex min-h-10 flex-wrap items-center gap-1.5 border-b border-border bg-card px-2 py-2\"\n >\n {groups.map(group => {\n const isSelected = group.id === selectedGroupId\n return (\n <button\n key={group.id}\n type=\"button\"\n aria-pressed={isSelected}\n onClick={() => onSelect(group.id)}\n className={cn(\n \"inline-flex h-8 max-w-full min-w-0 shrink-0 items-center gap-1.5 rounded-lg border px-2.5 text-xs font-medium transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n isSelected\n ? \"border-brand/40 bg-accent text-accent-foreground\"\n : \"border-transparent bg-background/80 text-foreground hover:bg-muted\",\n )}\n >\n {group.accent ? (\n <span className={cn(\"size-2 shrink-0 rounded-full\", group.accent)} aria-hidden=\"true\" />\n ) : group.icon ? (\n <i\n className={cn(\n \"fa-light shrink-0 text-[11px]\",\n group.icon,\n isSelected ? \"text-accent-foreground\" : \"text-muted-foreground\",\n )}\n aria-hidden=\"true\"\n />\n ) : null}\n <span className=\"min-w-0 truncate\">{group.label}</span>\n <span\n className={cn(\n \"shrink-0 tabular-nums text-[11px]\",\n isSelected ? \"text-accent-foreground/85\" : \"text-muted-foreground\",\n )}\n >\n {group.count}\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n\nfunction ListColumn<T>({\n rows,\n getRowId,\n selectedId,\n renderListRow,\n onSelect,\n emptyList,\n groupLabel,\n columnTitle,\n onAddItem,\n}: {\n rows: T[]\n getRowId: (row: T) => string | number\n selectedId: string | number | null\n renderListRow: (row: T, isSelected: boolean) => React.ReactNode\n onSelect: (id: string | number) => void\n emptyList?: React.ReactNode\n groupLabel: string\n columnTitle: string\n onAddItem?: () => void\n}) {\n return (\n <div className=\"flex h-full min-h-0 flex-col overflow-hidden\">\n <ListPageTreeColumnHeader title={columnTitle} />\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <div\n className=\"min-h-0 flex-1 overflow-y-auto py-1\"\n role=\"listbox\"\n aria-label={`${groupLabel} items`}\n aria-multiselectable=\"false\"\n >\n {rows.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center px-4 py-12 text-center text-sm text-muted-foreground\">\n {emptyList ?? <p>No items in this group.</p>}\n </div>\n ) : (\n rows.map(row => {\n const id = getRowId(row)\n const isSelected = id === selectedId\n return (\n <div key={id} className=\"group flex items-center hover:bg-muted/50\">\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => onSelect(id)}\n className={cn(\n \"flex w-full flex-1 items-center gap-3 px-3 py-2 text-start text-sm transition-colors duration-75\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n isSelected\n ? \"bg-accent font-medium text-accent-foreground\"\n : \"text-foreground\",\n )}\n >\n {renderListRow(row, isSelected)}\n </button>\n </div>\n )\n })\n )}\n </div>\n {onAddItem ? (\n <div className=\"flex shrink-0 items-center justify-center border-t border-border/50 px-2 py-1.5\">\n <button\n type=\"button\"\n onClick={onAddItem}\n className=\"flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n aria-label={`Add item to ${groupLabel}`}\n >\n <i className=\"fa-light fa-plus text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n ) : null}\n </div>\n </div>\n )\n}\n\nfunction DetailColumn({ children }: { children: React.ReactNode }) {\n return (\n <div className={cn(LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS, \"overflow-hidden\")}>\n <ListPageTreeColumnHeader title=\"Details\" />\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">{children}</div>\n </div>\n )\n}\n\nfunction DefaultEmptyDetail() {\n return (\n <ListPageSplitDetailsPlaceholder title=\"Nothing selected\" />\n )\n}\n\nexport function FinderPanelView<T>({\n groups,\n rows,\n getRowId,\n getRowGroupId,\n renderListRow,\n renderDetail,\n emptyDetail,\n emptyList,\n defaultGroupId,\n ariaLabel = \"List and details\",\n autoSaveId = \"finder-panel-view\",\n className,\n style,\n onAddItem,\n embedded = false,\n groupsColumnTitle = \"Categories\",\n getListColumnTitle = g => g?.label ?? \"Items\",\n}: FinderPanelViewProps<T>) {\n const mergedStyle = React.useMemo<React.CSSProperties>(() => {\n if (embedded) {\n return { height: \"100%\", minHeight: 0, ...style }\n }\n return {\n height: \"calc(100vh - 280px)\",\n minHeight: 420,\n ...style,\n }\n }, [embedded, style])\n const firstGroupId = defaultGroupId ?? groups[0]?.id ?? \"all\"\n const [selectedGroupId, setSelectedGroupId] = React.useState(firstGroupId)\n const [selectedRowId, setSelectedRowId] = React.useState<string | number | null>(null)\n\n const visibleRows = React.useMemo(() => {\n if (selectedGroupId === \"all\") return rows\n return rows.filter(r => getRowGroupId(r) === selectedGroupId)\n }, [rows, selectedGroupId, getRowGroupId])\n\n React.useEffect(() => {\n setSelectedRowId(visibleRows[0] ? getRowId(visibleRows[0]) : null)\n }, [selectedGroupId, visibleRows, getRowId])\n\n React.useEffect(() => {\n if (selectedRowId !== null && !visibleRows.find(r => getRowId(r) === selectedRowId)) {\n setSelectedRowId(visibleRows[0] ? getRowId(visibleRows[0]) : null)\n }\n }, [visibleRows, selectedRowId, getRowId])\n\n const selectedRow =\n selectedRowId !== null\n ? (visibleRows.find(r => getRowId(r) === selectedRowId) ?? null)\n : null\n\n const selectedGroup = groups.find(g => g.id === selectedGroupId)\n const listColumnTitle = getListColumnTitle(selectedGroup)\n\n return (\n <div\n className={cn(\n embedded\n ? \"flex h-full min-h-0 flex-col overflow-hidden\"\n : \"mx-4 mb-6 overflow-hidden rounded-xl border border-border bg-card lg:mx-6\",\n className,\n )}\n style={mergedStyle}\n aria-label={ariaLabel}\n >\n <ResizablePanelGroup\n id={String(autoSaveId)}\n direction=\"horizontal\"\n className=\"h-full min-h-0 w-full flex-1\"\n >\n <ResizablePanel\n id=\"groups\"\n defaultSize=\"22%\"\n minSize=\"16%\"\n maxSize=\"32%\"\n className={LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS}\n >\n <GroupsColumn\n columnTitle={groupsColumnTitle}\n groups={groups}\n selectedGroupId={selectedGroupId}\n onSelect={id => setSelectedGroupId(id)}\n />\n </ResizablePanel>\n\n <ResizableHandle withHandle className={LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS} />\n\n <ResizablePanel\n id=\"list\"\n defaultSize=\"34%\"\n minSize=\"22%\"\n maxSize=\"48%\"\n className={LIST_PAGE_SPLIT_MILLER_COLUMN_PANEL_CLASS}\n >\n <ListColumn\n columnTitle={listColumnTitle}\n rows={visibleRows}\n getRowId={getRowId}\n selectedId={selectedRowId}\n renderListRow={renderListRow}\n onSelect={id => setSelectedRowId(id)}\n emptyList={emptyList}\n groupLabel={selectedGroup?.label ?? \"All\"}\n onAddItem={onAddItem}\n />\n </ResizablePanel>\n\n <ResizableHandle withHandle className={LIST_PAGE_SPLIT_RESIZABLE_HANDLE_CLASS} />\n\n <ResizablePanel id=\"detail\" defaultSize=\"44%\" minSize=\"30%\" className={LIST_PAGE_SPLIT_MILLER_DETAIL_PANEL_CLASS}>\n <DetailColumn>\n {selectedRow\n ? renderDetail(selectedRow)\n : (emptyDetail ?? <DefaultEmptyDetail />)}\n </DetailColumn>\n </ResizablePanel>\n </ResizablePanelGroup>\n </div>\n )\n}\n","\"use client\"\n\n/**\n * FolderGridView — generic icon-grid layout for any list-page hub.\n *\n * Handles the responsive CSS grid shell, empty state, and accessibility list role.\n * Pass a `renderTile` render-prop for domain-specific tile content\n * (Placements, Team, Rotations, etc.).\n *\n * Usage:\n * ```tsx\n * <FolderGridView\n * rows={placements}\n * getRowId={r => r.id}\n * renderTile={row => <PlacementFolderTile row={row} onClick={…} />}\n * ariaLabel=\"Placements folder view\"\n * />\n * ```\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport {\n ListPageViewFrame,\n LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID,\n} from \"../ui/list-page-view-frame\"\n\nexport interface FolderGridViewProps<T> {\n rows: T[]\n getRowId: (row: T) => string | number\n /** Render one tile — receives the row, returns a React node (typically a `<button>`). */\n renderTile: (row: T) => React.ReactNode\n /** Shown when `rows` is empty. */\n emptyContent?: React.ReactNode\n /** `aria-label` on the grid list. */\n ariaLabel?: string\n className?: string\n /**\n * When true, constrains the grid to a centered max width so folder tiles don’t stretch\n * edge-to-edge on very wide viewports.\n */\n constrainWidth?: boolean\n}\n\nexport function FolderGridView<T>({\n rows,\n getRowId,\n renderTile,\n emptyContent,\n ariaLabel = \"Folder view\",\n className,\n constrainWidth = false,\n}: FolderGridViewProps<T>) {\n if (rows.length === 0) {\n return (\n <ListPageViewFrame\n maxWidthClassName={constrainWidth ? LIST_PAGE_VIEW_FRAME_MAX_ICON_GRID : undefined}\n className={cn(className)}\n >\n <div className=\"flex flex-col items-center justify-center rounded-xl border border-dashed border-border py-16 text-sm text-muted-foreground\">\n <i className=\"fa-solid fa-grid-2 mb-3 text-3xl opacity-40\" aria-hidden=\"true\" />\n {emptyContent ?? <p>No records found.</p>}\n </div>\n </ListPageViewFrame>\n )\n }\n\n return (\n <ListPageViewFrame className={cn(className)}>\n <div\n className={cn(\n \"grid grid-cols-2 gap-3 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 2xl:grid-cols-8\",\n constrainWidth && \"mx-auto max-w-6xl\",\n )}\n role=\"list\"\n aria-label={ariaLabel}\n >\n {rows.map(row => (\n <div key={getRowId(row)} role=\"listitem\">\n {renderTile(row)}\n </div>\n ))}\n </div>\n </ListPageViewFrame>\n )\n}\n","\"use client\"\n\nimport { Collapsible as CollapsiblePrimitive } from \"radix-ui\"\n\nfunction Collapsible({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {\n return <CollapsiblePrimitive.Root data-slot=\"collapsible\" {...props} />\n}\n\nfunction CollapsibleTrigger({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {\n return (\n <CollapsiblePrimitive.CollapsibleTrigger\n data-slot=\"collapsible-trigger\"\n {...props}\n />\n )\n}\n\nfunction CollapsibleContent({\n ...props\n}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {\n return (\n <CollapsiblePrimitive.CollapsibleContent\n data-slot=\"collapsible-content\"\n{...props}\n />\n )\n}\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n","\"use client\"\n\n/**\n * Central outline-tree chrome — mirrors shadcn/ui **Sidebar** file-tree structure\n * (`SidebarMenu` → `SidebarMenuItem` + `Collapsible` → `SidebarMenuSub` → rows) without\n * coupling to `useSidebar`.\n *\n * - **`guideLayout=\"inset\"`** — same rhythm as `SidebarMenuSub` (`mx-3.5` + `translate-x-px`).\n * - **`guideLayout=\"chevronRail\"`** — use with **`OutlineTreeCollapsibleContentRail`**: a **`w-6`**\n * spacer lines up the vertical guide with the **horizontal center** of a **`size-8`** chevron\n * when the folder row uses **`px-2`** (8px padding + 16px half of 32px chevron hit target).\n *\n * @see packages/ui/src/components/ui/sidebar.tsx — `SidebarMenuSub`, `SidebarMenuSubItem`\n */\n\nimport * as React from \"react\"\nimport { CollapsibleContent } from \"../ui/collapsible\"\nimport { cn } from \"../../lib/utils\"\n\nexport type OutlineTreeSurface = \"sidebar\" | \"panel\"\n\nexport type OutlineTreeGuideLayout = \"inset\" | \"chevronRail\"\n\nconst outlineTreeSubInsetClass: Record<OutlineTreeSurface, string> = {\n sidebar:\n \"mx-3.5 flex min-w-0 list-none translate-x-px flex-col gap-1 border-s border-sidebar-border px-2.5 py-0.5 rtl:-translate-x-px\",\n panel:\n \"mx-3.5 flex min-w-0 list-none translate-x-px flex-col gap-1 border-s border-border/60 px-2.5 py-0.5 rtl:-translate-x-px\",\n}\n\nconst outlineTreeSubChevronRailClass: Record<OutlineTreeSurface, string> = {\n sidebar:\n \"flex min-w-0 flex-1 list-none flex-col gap-1 border-s border-sidebar-border py-0.5 ps-2.5\",\n panel: \"flex min-w-0 flex-1 list-none flex-col gap-1 border-s border-border/60 py-0.5 ps-2.5\",\n}\n\n/** Pull row content onto the guide line — matches `SidebarMenuSubButton` horizontal nudge (inset layout only). */\nexport const OUTLINE_TREE_SUB_ROW_SHIFT_CLASS = \"-translate-x-px rtl:translate-x-px\"\n\n/** `CollapsibleContent` row: spacer width = `px-2` (8px) + half of `size-8` chevron (16px) → guide under chevron center. */\nexport const OUTLINE_TREE_COLLAPSIBLE_CONTENT_RAIL_CLASS = \"flex min-w-0 w-full\"\n\n/** Spacer column — keep in sync with folder row `px-2` + `size-8` chevron. */\nexport const OUTLINE_TREE_CHEVRON_GUIDE_SPACER_CLASS = \"w-6 shrink-0\"\n\n/** Wrap `OutlineTreeSub` with `guideLayout=\"chevronRail\"` so the vertical border meets the chevron center. */\nexport function OutlineTreeCollapsibleContentRail({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CollapsibleContent>) {\n return (\n <CollapsibleContent\n className={cn(OUTLINE_TREE_COLLAPSIBLE_CONTENT_RAIL_CLASS, className)}\n {...props}\n >\n <div className={OUTLINE_TREE_CHEVRON_GUIDE_SPACER_CLASS} aria-hidden />\n {children}\n </CollapsibleContent>\n )\n}\n\n/** Nested list under a folder — vertical guide + indent. */\nexport function OutlineTreeSub({\n surface = \"panel\",\n guideLayout = \"inset\",\n className,\n ...props\n}: React.ComponentProps<\"ul\"> & {\n surface?: OutlineTreeSurface\n guideLayout?: OutlineTreeGuideLayout\n}) {\n return (\n <ul\n data-slot=\"outline-tree-sub\"\n data-guide-layout={guideLayout}\n className={cn(\n guideLayout === \"inset\" && outlineTreeSubInsetClass[surface],\n guideLayout === \"chevronRail\" && outlineTreeSubChevronRailClass[surface],\n className,\n )}\n {...props}\n />\n )\n}\n\n/** Root or nested branch list — matches `SidebarMenu` spacing. */\nexport function OutlineTreeMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"outline-tree-menu\"\n className={cn(\"flex w-full min-w-0 list-none flex-col gap-0\", className)}\n {...props}\n />\n )\n}\n\n/** Expandable folder row wrapper — matches `SidebarMenuItem`. */\nexport function OutlineTreeMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"outline-tree-menu-item\"\n className={cn(\"group/menu-item relative min-w-0 w-full list-none\", className)}\n {...props}\n />\n )\n}\n\n/** Leaf / nested row inside `OutlineTreeSub` — matches `SidebarMenuSubItem`. */\nexport function OutlineTreeSubItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"outline-tree-sub-item\"\n className={cn(\"group/menu-sub-item relative min-w-0 w-full list-none\", className)}\n {...props}\n />\n )\n}\n\nexport interface OutlineTreeLeafButtonProps extends React.ComponentProps<\"button\"> {\n surface?: OutlineTreeSurface\n isActive?: boolean\n /** Inset `OutlineTreeSub` only — nudge like `SidebarMenuSubButton`. Ignored when parent uses `chevronRail`. */\n subGuideAlign?: boolean\n}\n\n/** Selectable leaf row (file / terminal row) — `SidebarMenuSubButton`–aligned rhythm. */\nexport function OutlineTreeLeafButton({\n surface = \"panel\",\n isActive = false,\n subGuideAlign = false,\n className,\n ...props\n}: OutlineTreeLeafButtonProps) {\n return (\n <button\n type=\"button\"\n data-active={isActive || undefined}\n className={cn(\n \"flex min-h-8 w-full min-w-0 cursor-pointer select-none items-center gap-2 overflow-hidden rounded-md px-2 text-start text-sm outline-none ring-ring focus-visible:ring-2 focus-visible:ring-inset [&>svg]:size-4 [&>svg]:shrink-0\",\n subGuideAlign && OUTLINE_TREE_SUB_ROW_SHIFT_CLASS,\n surface === \"panel\" &&\n cn(\n \"text-foreground hover:bg-muted/50\",\n isActive && \"bg-accent font-medium text-accent-foreground\",\n ),\n surface === \"sidebar\" &&\n cn(\n \"text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n isActive && \"bg-sidebar-accent font-medium text-sidebar-accent-foreground\",\n ),\n className,\n )}\n {...props}\n />\n )\n}\n","\"use client\"\n\n/**\n * Windows 11–style folder art (Icons8) + optional FA glyph on the pocket.\n * Static asset: `public/folders/icons8-folder-windows-11.svg`\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Color palette tones shared across folder hubs. Domain-specific palette\n * names (e.g. `QuestionBankFolderColorKey`) are structurally identical to\n * this union and pass through without conversion.\n */\nexport type FolderGlyphColorKey =\n | \"brand\"\n | \"success\"\n | \"warning\"\n | \"destructive\"\n | \"muted\"\n | \"chart1\"\n | \"chart2\"\n | \"chart3\"\n\n/** Default asset path (override via `OsFolderGlyph` `src` prop if you ship a different file). */\nexport const OS_FOLDER_GLYPH_SRC = \"/folders/icons8-folder-windows-11.svg\"\n\n/** Subtle hue tweak so “color” choice still reads on the shared yellow asset. */\nconst COLOR_TINT_FILTER: Record<FolderGlyphColorKey, string> = {\n brand: \"hue-rotate(-42deg) saturate(1.25) brightness(0.97)\",\n success: \"hue-rotate(82deg) saturate(1.2) brightness(0.95)\",\n warning: \"hue-rotate(-5deg) saturate(1.35) brightness(1.02)\",\n destructive: \"hue-rotate(300deg) saturate(1.15) brightness(0.92)\",\n muted: \"saturate(0.15) brightness(1.08)\",\n chart1: \"hue-rotate(200deg) saturate(1.2) brightness(0.96)\",\n chart2: \"hue-rotate(95deg) saturate(1.15) brightness(0.96)\",\n chart3: \"hue-rotate(265deg) saturate(1.2) brightness(0.96)\",\n}\n\nconst SIZE_MAP = {\n /** Compact — folder inspector / column headers (matches ~36px row height). */\n xs: \"h-9 w-[2.6rem]\",\n sm: \"h-[3.35rem] w-[3.85rem]\",\n md: \"h-[4.6rem] w-[5.25rem]\",\n lg: \"h-[6.5rem] w-[7.25rem]\",\n}\n\nconst ICON_TEXT: Record<keyof typeof SIZE_MAP, string> = {\n xs: \"text-[13px] leading-none\",\n sm: \"text-lg\",\n md: \"text-2xl\",\n lg: \"text-4xl\",\n}\n\n/** Darker version of each folder color for punched icon appearance. */\nconst ICON_COLOR: Record<FolderGlyphColorKey, string> = {\n brand: \"text-orange-800 dark:text-orange-600\",\n success: \"text-emerald-800 dark:text-emerald-600\",\n warning: \"text-amber-800 dark:text-amber-600\",\n destructive: \"text-red-800 dark:text-red-600\",\n muted: \"text-slate-600 dark:text-slate-400\",\n chart1: \"text-blue-800 dark:text-blue-600\",\n chart2: \"text-lime-800 dark:text-lime-600\",\n chart3: \"text-purple-800 dark:text-purple-600\",\n}\n\nexport interface OsFolderGlyphProps {\n colorKey: FolderGlyphColorKey\n /** Font Awesome icon classes without weight (e.g. `fa-stethoscope`). */\n icon: string\n size?: keyof typeof SIZE_MAP\n className?: string\n variant?: \"solid\" | \"outline\"\n /**\n * When false, exposes `role=\"img\"` + `aria-label` (use with a short label, e.g. sheet preview).\n * When true (default), hides the glyph from AT — parent control should name the action.\n */\n decorative?: boolean\n /** Required when `decorative={false}` */\n label?: string\n}\n\nexport function OsFolderGlyph({\n colorKey,\n icon,\n size = \"md\",\n className,\n variant = \"solid\",\n decorative = true,\n label,\n}: OsFolderGlyphProps) {\n const outline = variant === \"outline\"\n const tint = COLOR_TINT_FILTER[colorKey]\n\n return (\n <div\n className={cn(\n \"group relative shrink-0 select-none transition-[transform,box-shadow] duration-200 ease-out\",\n \"hover:z-[1] hover:scale-105 motion-reduce:transform-none motion-reduce:hover:scale-100\",\n SIZE_MAP[size],\n className,\n )}\n role={!decorative && label ? \"img\" : undefined}\n aria-label={!decorative ? label : undefined}\n aria-hidden={decorative ? true : undefined}\n >\n {/* Static SVG — design-system ships an HTML `<img>` so non-Next consumers\n (Vite, Remix, plain CRA) can use it without `next/image`. Folder\n grids render many of these at once; lazy-loading lets the browser\n skip off-screen glyphs until they scroll near the viewport. */}\n <img\n src={OS_FOLDER_GLYPH_SRC}\n alt=\"\"\n width={240}\n height={240}\n draggable={false}\n loading=\"lazy\"\n decoding=\"async\"\n className={cn(\n \"h-full w-full object-contain\",\n \"transition-[filter] duration-200\",\n outline && \"opacity-75 saturate-[0.65]\",\n )}\n style={outline ? undefined : { filter: tint }}\n />\n <span\n className={cn(\n \"pointer-events-none absolute inset-0 flex items-center justify-center\",\n size === \"xs\" ? \"translate-y-[0.18rem]\" : \"translate-y-[0.35rem]\",\n ICON_TEXT[size],\n outline\n ? \"text-muted-foreground\"\n : cn(ICON_COLOR[colorKey], \"opacity-100\"),\n )}\n >\n <i className={cn(\"fa-solid\", icon)} aria-hidden=\"true\" />\n </span>\n </div>\n )\n}\n","/**\n * Logs only in development. Use for mock flows (export, submit) instead of\n * raw `console.log`. Bundlers replace `process.env.NODE_ENV` at build time,\n * so the call site disappears entirely in production bundles.\n */\nexport function devLog(...args: unknown[]): void {\n if (process.env.NODE_ENV === \"development\") {\n console.log(...args)\n }\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Slot } from \"radix-ui\"\nimport {\n Controller,\n FormProvider,\n useFormContext,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\n\nconst Form = FormProvider\n\ninterface FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n {} as FormFieldContextValue\n)\n\nfunction FormField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({ ...props }: ControllerProps<TFieldValues, TName>) {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n )\n}\n\nfunction useFormField() {\n const fieldContext = React.useContext(FormFieldContext)\n const itemContext = React.useContext(FormItemContext)\n const { getFieldState, formState } = useFormContext()\n\n const fieldState = getFieldState(fieldContext.name, formState)\n\n if (!fieldContext) throw new Error(\"useFormField must be used inside <FormField>\")\n\n const { id } = itemContext\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n }\n}\n\ninterface FormItemContextValue { id: string }\nconst FormItemContext = React.createContext<FormItemContextValue>({} as FormItemContextValue)\n\nfunction FormItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const id = React.useId()\n return (\n <FormItemContext.Provider value={{ id }}>\n <div data-slot=\"form-item\" className={cn(\"flex flex-col gap-1.5\", className)} {...props} />\n </FormItemContext.Provider>\n )\n}\n\nfunction FormLabel({ className, ...props }: React.ComponentProps<typeof Label>) {\n const { error, formItemId } = useFormField()\n return (\n <Label\n data-slot=\"form-label\"\n data-error={!!error}\n className={cn(\"data-[error=true]:text-destructive\", className)}\n htmlFor={formItemId}\n {...props}\n />\n )\n}\n\nfunction FormControl({ ...props }: React.ComponentProps<typeof Slot.Root>) {\n const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n return (\n <Slot.Root\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={!error ? formDescriptionId : `${formDescriptionId} ${formMessageId}`}\n aria-invalid={!!error}\n {...props}\n />\n )\n}\n\nfunction FormDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n const { formDescriptionId } = useFormField()\n return (\n <p\n data-slot=\"form-description\"\n id={formDescriptionId}\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction FormMessage({ className, children, ...props }: React.ComponentProps<\"p\">) {\n const { error, formMessageId } = useFormField()\n const body = error ? String(error?.message ?? \"\") : children\n if (!body) return null\n return (\n <p\n data-slot=\"form-message\"\n id={formMessageId}\n className={cn(\"text-destructive text-sm\", className)}\n {...props}\n >\n {body}\n </p>\n )\n}\n\nexport {\n useFormField,\n Form,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n FormField,\n}\n","\"use client\"\n\n/**\n * ExportDrawer — floating right-side drawer with export form.\n *\n * Uses the same Sheet pattern as TablePropertiesDrawer:\n * - showCloseButton={false}, showOverlay={false}\n * - Rounded, floating, inset from viewport edges\n * - Button + Tip from our own component library\n *\n * Form fields (shadcn Form + react-hook-form + zod):\n * • File format CSV · Excel · PDF (SelectionTileGrid radio)\n * • Date range From / To (FilterTextValueInput dateMDY — same as Settings / table filters)\n * • Columns All · Visible only (radio)\n * • Apply active filters (checkbox)\n *\n * WCAG 2.1 AA:\n * ✓ All inputs labelled via FormLabel linked to control id (1.3.1)\n * ✓ Error messages linked via aria-describedby (3.3.1)\n * ✓ Focus returns to trigger on close (2.4.3)\n */\n\nimport * as React from \"react\"\nimport { useForm } from \"react-hook-form\"\nimport { z } from \"zod\"\nimport { zodResolver } from \"@hookform/resolvers/zod\"\n\nimport { devLog } from \"../../lib/dev-log\"\nimport { Button } from \"./button\"\nimport { Checkbox } from \"./checkbox\"\nimport { Label } from \"./label\"\nimport { Tip } from \"./tip\"\nimport { Kbd, KbdGroup } from \"./kbd\"\nimport { Shortcut } from \"./dropdown-menu\"\nimport { RadioGroup, RadioGroupItem, RadioGroupLabel } from \"./radio-group\"\nimport { SelectionTileGrid } from \"./selection-tile-grid\"\nimport { FilterTextValueInput } from \"../data-table/filter-text-value-input\"\nimport type { SelectionTileOption } from \"./selection-tile-grid\"\nimport {\n Sheet,\n SheetContent,\n SheetTitle,\n} from \"./sheet\"\nimport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from \"./form\"\n\n/** Parse full MM/DD/YYYY from masked input; partial/invalid → undefined. */\nfunction parseMdyToDate(raw: string | undefined): Date | undefined {\n if (!raw?.trim()) return undefined\n const m = raw.trim().match(/^(\\d{2})\\/(\\d{2})\\/(\\d{4})$/)\n if (!m) return undefined\n const month = Number(m[1])\n const day = Number(m[2])\n const year = Number(m[3])\n if (month < 1 || month > 12 || day < 1 || day > 31) return undefined\n const d = new Date(year, month - 1, day, 12, 0, 0, 0)\n if (d.getFullYear() !== year || d.getMonth() !== month - 1 || d.getDate() !== day) return undefined\n return d\n}\n\n// ── Validation schema ─────────────────────────────────────────────────────────\n\nconst EXPORT_FORMAT_OPTIONS: SelectionTileOption<\"csv\" | \"excel\" | \"pdf\">[] = [\n { value: \"csv\", label: \"CSV\", icon: \"fa-file-csv\" },\n { value: \"excel\", label: \"Excel\", icon: \"fa-file-excel\" },\n { value: \"pdf\", label: \"PDF\", icon: \"fa-file-pdf\" },\n]\n\nconst exportSchema = z\n .object({\n format: z.enum([\"csv\", \"excel\", \"pdf\"]),\n columns: z.enum([\"all\", \"visible\"]),\n dateFrom: z.string().optional(),\n dateTo: z.string().optional(),\n includeFilters: z.boolean(),\n })\n .superRefine((data, ctx) => {\n const from = parseMdyToDate(data.dateFrom)\n const to = parseMdyToDate(data.dateTo)\n if (data.dateFrom?.trim() && !from) {\n ctx.addIssue({ code: \"custom\", message: \"Enter a valid from date\", path: [\"dateFrom\"] })\n }\n if (data.dateTo?.trim() && !to) {\n ctx.addIssue({ code: \"custom\", message: \"Enter a valid to date\", path: [\"dateTo\"] })\n }\n if (from && to && to < from) {\n ctx.addIssue({ code: \"custom\", message: \"End date must be after start date\", path: [\"dateTo\"] })\n }\n })\n\ntype ExportForm = z.infer<typeof exportSchema>\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport interface ExportDrawerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n totalRows?: number\n visibleColumns?: number\n}\n\nexport function ExportDrawer({\n open,\n onOpenChange,\n totalRows = 0,\n visibleColumns,\n}: ExportDrawerProps) {\n const form = useForm<ExportForm>({\n resolver: zodResolver(exportSchema),\n defaultValues: {\n format: \"csv\",\n columns: \"visible\",\n dateFrom: \"\",\n dateTo: \"\",\n includeFilters: true,\n },\n })\n\n const [isExporting, setIsExporting] = React.useState(false)\n\n async function onSubmit(values: ExportForm) {\n setIsExporting(true)\n await new Promise(r => setTimeout(r, 1200))\n devLog(\"Export:\", {\n ...values,\n dateFrom: parseMdyToDate(values.dateFrom)?.toISOString(),\n dateTo: parseMdyToDate(values.dateTo)?.toISOString(),\n })\n setIsExporting(false)\n onOpenChange(false)\n form.reset()\n }\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent\n data-slot=\"export-drawer\"\n side=\"right\"\n showCloseButton={false}\n showOverlay={false}\n className=\"z-[80] w-80 sm:max-w-80 p-0 gap-0 flex flex-col border border-border shadow-xl rounded-xl overflow-hidden\"\n style={{ top: \"0.5rem\", bottom: \"0.5rem\", right: \"0.5rem\", height: \"calc(100vh - 1rem)\" }}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between gap-3 px-4 pt-5 pb-3\">\n <SheetTitle className=\"text-base font-semibold leading-tight\">Export data</SheetTitle>\n <Tip label=\"Close\" side=\"bottom\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-sm\"\n aria-label=\"Close\"\n onClick={() => onOpenChange(false)}\n >\n <i className=\"fa-light fa-xmark text-[13px]\" aria-hidden=\"true\" />\n </Button>\n </Tip>\n </div>\n\n {/* Record count */}\n <p className=\"px-4 pb-3 text-sm text-muted-foreground -mt-1\">\n {totalRows} record{totalRows !== 1 ? \"s\" : \"\"} available for export.\n </p>\n\n {/* Form body */}\n <Form {...form}>\n <form\n id=\"export-form\"\n onSubmit={form.handleSubmit(onSubmit)}\n className=\"flex-1 overflow-y-auto\"\n >\n <div className=\"px-4 pb-4 space-y-5\">\n\n {/* File format */}\n <FormField\n control={form.control}\n name=\"format\"\n render={({ field }) => (\n <FormItem>\n <FormControl>\n <SelectionTileGrid\n sectionLabel=\"File format\"\n options={EXPORT_FORMAT_OPTIONS}\n columns={3}\n value={field.value}\n onValueChange={field.onChange}\n interaction=\"radio\"\n idPrefix=\"export-fmt\"\n itemVariant=\"outline\"\n itemMotion=\"pop\"\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {/* Date range */}\n <fieldset className=\"space-y-2\">\n <legend className=\"text-sm font-medium leading-none mb-2\">\n Date range{\" \"}\n <span className=\"text-muted-foreground font-normal\">(optional)</span>\n </legend>\n <div className=\"grid grid-cols-2 gap-3\">\n <FormField\n control={form.control}\n name=\"dateFrom\"\n render={({ field }) => (\n <FormItem className=\"gap-1\">\n <FormLabel htmlFor=\"export-date-from\" className=\"text-xs text-muted-foreground\">\n From\n </FormLabel>\n <FormControl>\n <FilterTextValueInput\n id=\"export-date-from\"\n mask=\"dateMDY\"\n aria-label=\"Export from date (optional)\"\n placeholder=\"MM/DD/YYYY\"\n value={field.value ?? \"\"}\n onValueChange={field.onChange}\n className=\"h-8 text-sm\"\n />\n </FormControl>\n <FormDescription className=\"text-[11px]\">MM/DD/YYYY</FormDescription>\n <FormMessage />\n </FormItem>\n )}\n />\n <FormField\n control={form.control}\n name=\"dateTo\"\n render={({ field }) => (\n <FormItem className=\"gap-1\">\n <FormLabel htmlFor=\"export-date-to\" className=\"text-xs text-muted-foreground\">\n To\n </FormLabel>\n <FormControl>\n <FilterTextValueInput\n id=\"export-date-to\"\n mask=\"dateMDY\"\n aria-label=\"Export to date (optional)\"\n placeholder=\"MM/DD/YYYY\"\n value={field.value ?? \"\"}\n onValueChange={field.onChange}\n className=\"h-8 text-sm\"\n />\n </FormControl>\n <FormDescription className=\"text-[11px]\">MM/DD/YYYY</FormDescription>\n <FormMessage />\n </FormItem>\n )}\n />\n </div>\n </fieldset>\n\n {/* Columns */}\n <FormField\n control={form.control}\n name=\"columns\"\n render={({ field }) => (\n <FormItem>\n <FormLabel className=\"text-sm font-medium\">Columns</FormLabel>\n <FormControl>\n <RadioGroup\n value={field.value}\n onValueChange={field.onChange}\n className=\"space-y-1.5 mt-1\"\n itemVariant=\"outline\"\n itemMotion=\"pop\"\n >\n {([\n { value: \"all\", label: \"All columns\", sub: null },\n { value: \"visible\", label: \"Visible columns only\", sub: visibleColumns !== undefined ? `${visibleColumns} columns` : null },\n ] as const).map(opt => (\n <div\n key={opt.value}\n className=\"flex items-center gap-2.5 rounded-lg border border-border px-3 py-2.5 transition-colors hover:bg-interactive-hover has-[[data-state=checked]]:border-brand has-[[data-state=checked]]:bg-brand/10 cursor-pointer\"\n >\n <RadioGroupItem value={opt.value} id={`col-${opt.value}`} />\n <RadioGroupLabel\n htmlFor={`col-${opt.value}`}\n className=\"min-h-0 flex-1 cursor-pointer py-0 text-sm font-normal leading-none\"\n >\n {opt.label}\n {opt.sub && (\n <span className=\"text-muted-foreground ms-1.5 font-normal\">({opt.sub})</span>\n )}\n </RadioGroupLabel>\n </div>\n ))}\n </RadioGroup>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n\n {/* Include filters */}\n <FormField\n control={form.control}\n name=\"includeFilters\"\n render={({ field }) => (\n <FormItem>\n <div className=\"flex items-start gap-3 rounded-lg border border-border px-3 py-2.5 transition-colors hover:bg-interactive-hover has-[[data-state=checked]]:border-primary\">\n <FormControl>\n <Checkbox\n id=\"include-filters\"\n checked={field.value}\n onCheckedChange={field.onChange}\n className=\"mt-0.5 shrink-0\"\n />\n </FormControl>\n <div className=\"min-w-0\">\n <Label htmlFor=\"include-filters\" className=\"text-sm cursor-pointer font-medium leading-none\">\n Apply active filters\n </Label>\n <p className=\"text-xs text-muted-foreground mt-1\">\n Export only rows matching current filters\n </p>\n </div>\n </div>\n <FormMessage />\n </FormItem>\n )}\n />\n\n </div>\n </form>\n </Form>\n\n {/* Global bindings — only active while the drawer is open (Sheet unmounts content on close) */}\n <Shortcut keys=\"Enter\" disabled={isExporting} onInvoke={() => form.handleSubmit(onSubmit)()} />\n\n {/* Footer */}\n <div className=\"flex items-center gap-2 px-4 py-3 border-t border-border\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"flex-1\"\n onClick={() => onOpenChange(false)}\n >\n Cancel\n <KbdGroup className=\"ms-1.5\"><Kbd variant=\"bare\">Esc</Kbd></KbdGroup>\n </Button>\n <Button\n type=\"submit\"\n form=\"export-form\"\n className=\"flex-1\"\n disabled={isExporting}\n >\n {isExporting ? (\n <>\n <i className=\"fa-light fa-spinner-third fa-spin text-[13px]\" aria-hidden=\"true\" />\n Exporting…\n </>\n ) : (\n <>\n <i className=\"fa-light fa-arrow-down-to-line text-[13px]\" aria-hidden=\"true\" />\n Export\n <KbdGroup className=\"ms-1.5\"><Kbd variant=\"bare\">⏎</Kbd></KbdGroup>\n </>\n )}\n </Button>\n </div>\n </SheetContent>\n </Sheet>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Dialog as DialogPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { XIcon } from \"lucide-react\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n overlayClassName,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n /** Merged onto `DialogOverlay` (e.g. `bg-transparent` for a palette with no dimmed backdrop). */\n overlayClassName?: string\n}) {\n return (\n <DialogPortal>\n <DialogOverlay className={overlayClassName ?? undefined} />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-1/2 start-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close data-slot=\"dialog-close\" asChild>\n <Button\n variant=\"ghost\"\n className=\"absolute top-2 end-2\"\n size=\"icon-sm\"\n >\n <XIcon\n />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({\n className,\n showCloseButton = false,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showCloseButton?: boolean\n}) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button variant=\"outline\">Close</Button>\n </DialogPrimitive.Close>\n )}\n </div>\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\n \"font-heading text-base leading-none font-medium\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\n/**\n * Segmented “view tabs” control — same visual language as `ListPageTemplate` views toolbar\n * (`bg-muted/60` pill). Uses `role=\"radiogroup\"` + `role=\"radio\"` for exclusive choice (1.3.1).\n *\n * Keyboard: Arrow Left/Right (or Up/Down), Home, End — see onRadioKeyDown.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Tip } from \"./tip\"\n\nexport function viewSegmentedToolbarClass(className?: string) {\n return cn(\n \"inline-flex items-center gap-0.5 rounded-lg bg-muted/60 p-[3px]\",\n className,\n )\n}\n\nexport function viewSegmentedButtonClass(\n isActive: boolean,\n opts?: { iconOnly?: boolean },\n) {\n return cn(\n \"inline-flex items-center rounded-md transition-all whitespace-nowrap\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1\",\n opts?.iconOnly\n ? \"size-8 min-h-8 min-w-8 shrink-0 justify-center p-0 text-xs\"\n : \"gap-1.5 px-2.5 py-1 text-xs min-h-8\",\n isActive\n ? \"bg-background text-foreground font-medium shadow-sm\"\n : \"text-muted-foreground hover:text-interactive-hover-foreground\",\n )\n}\n\nexport interface ViewSegmentOption<T extends string = string> {\n value: T\n label: string\n /** Full `className` for Font Awesome icon (e.g. `fa-light fa-chart-bar`) */\n icon?: string\n}\n\nexport interface ViewSegmentedControlProps<T extends string = string> {\n value: T\n onValueChange: (value: T) => void\n options: readonly ViewSegmentOption<T>[]\n /** Accessible name for the group (required — names the radiogroup) */\n \"aria-label\": string\n /** Optional description id for `aria-describedby` (e.g. helper text) */\n \"aria-describedby\"?: string\n /** Icon-only triggers (labels in `sr-only` or visible text) */\n iconOnly?: boolean\n className?: string\n /** Tooltip on each segment (defaults to `iconOnly` — recommended for icon-only) */\n showTooltips?: boolean\n /** Tooltip position */\n tooltipSide?: \"top\" | \"bottom\" | \"left\" | \"right\"\n}\n\nexport function ViewSegmentedControl<T extends string>({\n value,\n onValueChange,\n options,\n \"aria-label\": ariaLabel,\n \"aria-describedby\": ariaDescribedBy,\n iconOnly = false,\n className,\n showTooltips,\n tooltipSide = \"top\",\n}: ViewSegmentedControlProps<T>) {\n const tips = showTooltips ?? iconOnly\n const itemRefs = React.useRef<(HTMLButtonElement | null)[]>([])\n\n React.useLayoutEffect(() => {\n itemRefs.current = itemRefs.current.slice(0, options.length)\n }, [options.length])\n\n const focusIndex = React.useCallback(\n (index: number) => {\n const len = options.length\n if (len === 0) return\n const i = ((index % len) + len) % len\n onValueChange(options[i].value)\n requestAnimationFrame(() => {\n itemRefs.current[i]?.focus()\n })\n },\n [onValueChange, options],\n )\n\n const onRadioKeyDown = React.useCallback(\n (e: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n const len = options.length\n if (len === 0) return\n if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n e.preventDefault()\n focusIndex(index + 1)\n } else if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n e.preventDefault()\n focusIndex(index - 1)\n } else if (e.key === \"Home\") {\n e.preventDefault()\n focusIndex(0)\n } else if (e.key === \"End\") {\n e.preventDefault()\n focusIndex(len - 1)\n }\n },\n [focusIndex, options.length],\n )\n\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-describedby={ariaDescribedBy}\n data-slot=\"view-segmented-toolbar\"\n className={cn(viewSegmentedToolbarClass(), \"w-fit min-w-0 shrink-0\", className)}\n >\n {options.map((opt, index) => {\n const isActive = opt.value === value\n const tabIndex = isActive ? 0 : -1\n\n const button = (\n <button\n ref={el => {\n itemRefs.current[index] = el\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={isActive}\n aria-label={iconOnly ? opt.label : undefined}\n tabIndex={tabIndex}\n onKeyDown={e => onRadioKeyDown(e, index)}\n onClick={() => onValueChange(opt.value)}\n data-slot=\"view-segmented-item\"\n className={viewSegmentedButtonClass(isActive, { iconOnly })}\n >\n {opt.icon ? (\n <i\n className={cn(opt.icon, iconOnly ? \"text-[13px]\" : \"text-xs\")}\n aria-hidden=\"true\"\n />\n ) : null}\n {!iconOnly ? opt.label : null}\n </button>\n )\n\n return tips ? (\n <Tip key={opt.value} label={opt.label} side={tooltipSide}>\n {button}\n </Tip>\n ) : (\n <React.Fragment key={opt.value}>{button}</React.Fragment>\n )\n })}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * ListPageTemplate — reusable template for any list-based page.\n *\n * Provides: page header slot, optional key metrics, tabbed views\n * (table/list/board/dashboard) with add/remove/configure per-tab,\n * and an export drawer.\n *\n * Usage:\n * <ListPageTemplate\n * header={<MyPageHeader />}\n * metrics={<KeyMetrics ... />}\n * defaultTabs={DEFAULT_TABS}\n * renderContent={(tab) => <MyTable members={MOCK_ROWS} view={tab.viewType} />}\n * />\n *\n * Connected views (table | list | board | dashboard) must share one `useTableState`\n * and pass `tableState.rows` into non-table surfaces — see `docs/data-views-pattern.md`\n * and `AGENTS.md` §4.\n *\n * View chrome is shared with `ViewSegmentedControl` / `viewSegmentedToolbarClass` in\n * `@/components/ui/view-segmented-control` and re-exported from `@/components/data-views`.\n */\n\nimport * as React from \"react\"\nimport { cn } from \"../../lib/utils\"\nimport { Tip } from \"../ui/tip\"\nimport { ExportDrawer } from \"../ui/export-drawer\"\nimport { Button } from \"../ui/button\"\nimport { Input } from \"../ui/input\"\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../ui/dialog\"\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Shortcut,\n} from \"../ui/dropdown-menu\"\nimport type { DataListViewType } from \"../../lib/data-list-view\"\nimport { DATA_LIST_VIEW_TILES, dataListViewAddShortcut } from \"../../lib/data-list-view\"\nimport {\n createListPageEditViewHandler,\n type OpenTablePropertiesHandle,\n} from \"../../lib/list-page-table-properties\"\nimport {\n viewSegmentedToolbarClass,\n viewSegmentedButtonClass,\n} from \"../ui/view-segmented-control\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ViewType = DataListViewType\n\n/** Same labels/icons as Properties drawer `SelectionTileGrid` — single source in `DATA_LIST_VIEW_TILES`. */\nexport const VIEW_TYPES: { type: ViewType; label: string; icon: string }[] = DATA_LIST_VIEW_TILES.map(t => ({\n type: t.value,\n label: t.label,\n icon: t.icon,\n}))\n\nexport interface FilterOption {\n id: string\n label: string\n}\n\nexport interface ViewTab {\n id: string\n label: string\n viewType: ViewType\n icon: string\n /** Optional filter key for lifecycle or category-based filtering */\n filterId: string\n}\n\nexport interface ListPageTemplateProps {\n /** Page header — rendered above metrics */\n header: React.ReactNode\n /** Optional metrics strip — rendered below header */\n metrics?: React.ReactNode\n /** Whether to show metrics (controlled externally) */\n showMetrics?: boolean\n /** Initial tabs (uncontrolled mode) */\n defaultTabs: ViewTab[]\n /**\n * Controlled tabs — when all four are provided, tab state is owned by the parent\n * (e.g. for localStorage). Otherwise `defaultTabs` + internal state are used.\n */\n tabs?: ViewTab[]\n onTabsChange?: (tabs: ViewTab[]) => void\n activeTabId?: string\n onActiveTabChange?: (id: string) => void\n /** Filter options per tab (e.g. All, Upcoming, Ongoing, Completed) */\n filterOptions?: FilterOption[]\n /** Label for the filter sub-menu (default: \"Filter\") */\n filterLabel?: string\n /** Get count for a tab's filter (for badge) */\n getTabCount?: (filterId: string) => number\n /** Render the content for the active tab */\n renderContent: (tab: ViewTab, updateTab: (patch: Partial<ViewTab>) => void) => React.ReactNode\n /** Export drawer props */\n exportOpen?: boolean\n onExportOpenChange?: (open: boolean) => void\n /** Row count for export; if omitted, uses `getTabCount(activeTab.filterId)` when provided */\n exportTotalRows?: number\n /**\n * Tab menu — “Edit” (e.g. open table properties). Parent can switch to table view first, then call ref.\n * Overrides `tablePropertiesRef` when both are set.\n */\n onEditView?: (tab: ViewTab, helpers: { updateTab: (patch: Partial<ViewTab>) => void }) => void\n /**\n * Ref to the active tab’s table surface (`openPropertiesDrawer`). Wires “View → Edit” to\n * `TablePropertiesDrawer` when `onEditView` is omitted.\n */\n tablePropertiesRef?: React.RefObject<OpenTablePropertiesHandle | null>\n /** When true, hide the views tab strip (tabs + add view) — e.g. search landing with a single table surface. */\n hideViewsToolbar?: boolean\n /**\n * Subset of view types the hub actually implements (e.g. List hub omits Dashboard/Folder).\n * When set, the Add view menu and ⌘1–9 shortcuts are filtered so users cannot add a view the\n * hub cannot render. Defaults to all registered view types (`DATA_LIST_VIEW_TILES`).\n *\n * Pair with `TablePropertiesDrawerButton.supportedViewTypes` to keep Properties consistent.\n */\n supportedViewTypes?: readonly DataListViewType[]\n}\n\n/** Collision-proof id for a dynamically-added tab. Module-level counters reset\n * on HMR while React state survives, so we derive from a timestamp + random. */\nfunction makeTabId(type: string): string {\n const rand = Math.random().toString(36).slice(2, 8)\n return `${type}-${Date.now().toString(36)}-${rand}`\n}\n\n/** Count pill on the views toolbar — color by lifecycle/status filter (WCAG: dark text on light inactive; light text on solid active). */\nexport function viewToolbarCountBadgeClass(filterId: string, isActive: boolean): string {\n const palettes: Record<string, { active: string; inactive: string }> = {\n all: {\n active: \"bg-slate-600 text-white dark:bg-slate-500\",\n inactive: \"bg-slate-100 text-slate-800 dark:bg-slate-800/70 dark:text-slate-100\",\n },\n upcoming: {\n active: \"bg-amber-600 text-white\",\n inactive: \"bg-amber-100 text-amber-950 dark:bg-amber-950/45 dark:text-amber-100\",\n },\n ongoing: {\n active: \"bg-blue-600 text-white\",\n inactive: \"bg-blue-100 text-blue-950 dark:bg-blue-950/45 dark:text-blue-100\",\n },\n completed: {\n active: \"bg-emerald-600 text-white\",\n inactive: \"bg-emerald-100 text-emerald-950 dark:bg-emerald-950/45 dark:text-emerald-100\",\n },\n }\n const p = palettes[filterId] ?? palettes.all\n return isActive ? p.active : p.inactive\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport function ListPageTemplate({\n header,\n metrics,\n showMetrics = true,\n defaultTabs,\n tabs: tabsProp,\n onTabsChange,\n activeTabId: activeTabIdProp,\n onActiveTabChange,\n getTabCount,\n renderContent,\n exportOpen = false,\n onExportOpenChange,\n exportTotalRows = 0,\n onEditView,\n tablePropertiesRef,\n hideViewsToolbar = false,\n supportedViewTypes,\n}: ListPageTemplateProps) {\n // When a hub declares the views it implements, both the Add view menu and ⌘1–9 shortcut\n // bindings are filtered to that subset so unsupported views are never offered. Without\n // this, a user could ⌘1 → Dashboard into a hub that cannot render it (would show the\n // not-configured empty state). Memoized because it filters on every render path.\n const addableViewTypes = React.useMemo(() => {\n if (!supportedViewTypes || supportedViewTypes.length === 0) return VIEW_TYPES\n const allowed = new Set(supportedViewTypes)\n return VIEW_TYPES.filter(v => allowed.has(v.type))\n }, [supportedViewTypes])\n const controlled =\n tabsProp !== undefined &&\n onTabsChange !== undefined &&\n activeTabIdProp !== undefined &&\n onActiveTabChange !== undefined\n\n const [internalTabs, setInternalTabs] = React.useState<ViewTab[]>(defaultTabs)\n const [internalActiveId, setInternalActiveId] = React.useState(defaultTabs[0]?.id ?? \"\")\n\n const tabs = controlled ? tabsProp : internalTabs\n const setTabsState = React.useCallback(\n (action: React.SetStateAction<ViewTab[]>) => {\n if (controlled) {\n const next = typeof action === \"function\" ? action(tabsProp!) : action\n onTabsChange!(next)\n } else {\n setInternalTabs(action)\n }\n },\n [controlled, onTabsChange, tabsProp, setInternalTabs],\n )\n const activeTabId = controlled ? activeTabIdProp : internalActiveId\n const setActiveTabId = controlled ? onActiveTabChange : setInternalActiveId\n const [renameOpen, setRenameOpen] = React.useState(false)\n const [renameValue, setRenameValue] = React.useState(\"\")\n const [renameTabId, setRenameTabId] = React.useState<string | null>(null)\n const [reviewOpen, setReviewOpen] = React.useState(false)\n const [reviewTab, setReviewTab] = React.useState<ViewTab | null>(null)\n\n const activeTab = tabs.find(t => t.id === activeTabId) ?? tabs[0]\n\n const editViewFromRef = React.useMemo(\n () => (tablePropertiesRef ? createListPageEditViewHandler(tablePropertiesRef) : undefined),\n [tablePropertiesRef]\n )\n const resolvedOnEditView = onEditView ?? editViewFromRef\n\n function addView(type: ViewType) {\n const def = VIEW_TYPES.find(d => d.type === type)!\n const count = tabs.filter(t => t.viewType === type).length\n const id = makeTabId(type)\n const label = count === 0 ? def.label : `${def.label} ${count + 1}`\n const newTab: ViewTab = { id, label, viewType: type, icon: def.icon, filterId: \"all\" }\n setTabsState(prev => [...prev, newTab])\n setActiveTabId(id)\n }\n\n function removeTab(id: string, e: React.MouseEvent | React.KeyboardEvent) {\n e.stopPropagation()\n setTabsState(prev => {\n const next = prev.filter(t => t.id !== id)\n if (activeTabId === id && next.length > 0) {\n const idx = Math.max(0, prev.findIndex(t => t.id === id) - 1)\n setActiveTabId(next[Math.min(idx, next.length - 1)].id)\n }\n return next\n })\n }\n\n function updateTab(id: string, patch: Partial<ViewTab>) {\n setTabsState(prev => prev.map(t => t.id === id ? { ...t, ...patch } : t))\n }\n\n function duplicateTab(tab: ViewTab) {\n const id = makeTabId(tab.viewType)\n const newTab: ViewTab = {\n id,\n label: `Copy of ${tab.label}`,\n viewType: tab.viewType,\n icon: tab.icon,\n filterId: tab.filterId,\n }\n setTabsState(prev => [...prev, newTab])\n setActiveTabId(id)\n }\n\n function openRename(tab: ViewTab) {\n setRenameTabId(tab.id)\n setRenameValue(tab.label)\n setRenameOpen(true)\n }\n\n function commitRename() {\n if (!renameTabId) return\n const v = renameValue.trim()\n if (v) updateTab(renameTabId, { label: v })\n setRenameOpen(false)\n setRenameTabId(null)\n }\n\n return (\n <>\n {!hideViewsToolbar && addableViewTypes.slice(0, 9).map((v, i) => {\n const keys = dataListViewAddShortcut(i)\n return keys ? (\n <Shortcut\n key={v.type}\n keys={keys}\n onInvoke={() => addView(v.type)}\n />\n ) : null\n })}\n {activeTab && !hideViewsToolbar && (\n <>\n <Shortcut keys=\"F2\" onInvoke={() => openRename(activeTab)} />\n <Shortcut\n keys=\"⌘E\"\n disabled={!resolvedOnEditView}\n onInvoke={() => resolvedOnEditView?.(activeTab, { updateTab: p => updateTab(activeTab.id, p) })}\n />\n <Shortcut keys=\"⌘D\" onInvoke={() => duplicateTab(activeTab)} />\n <Shortcut keys=\"⌘I\" onInvoke={() => { setReviewTab(activeTab); setReviewOpen(true) }} />\n <Shortcut\n keys=\"⌘⌫\"\n disabled={tabs.length <= 1}\n onInvoke={(e) => removeTab(activeTab.id, e as unknown as React.KeyboardEvent)}\n />\n </>\n )}\n {header}\n\n {showMetrics && metrics}\n\n {/* ── Views toolbar (not tablist: settings/close are not tabs — WCAG 1.3.1 / ARIA) ── */}\n {!hideViewsToolbar && (\n <>\n {/* Outer: horizontal scroll only. Inner: vertical padding so ring-offset focus rings are not clipped\n (`overflow-x-auto` forces overflow-y to clip in a single box). */}\n <div className=\"mt-3 shrink-0 overflow-x-auto px-4 lg:px-6\">\n <div className=\"flex w-max items-center gap-1 py-1.5\">\n <div\n role=\"toolbar\"\n aria-label=\"Views\"\n data-slot=\"view-segmented-toolbar\"\n className={viewSegmentedToolbarClass()}\n >\n {tabs.map(tab => {\n const isActive = tab.id === activeTabId\n const isOnly = tabs.length === 1\n const count = getTabCount?.(tab.filterId)\n const tabInner = (\n <>\n <i className={cn(\"fa-light shrink-0 text-xs\", tab.icon)} aria-hidden=\"true\" />\n {tab.label}\n {count !== undefined && (\n <span\n data-slot=\"view-toolbar-count\"\n className={cn(\n \"text-xs tabular-nums rounded-full px-1 py-px min-w-[1.125rem] text-center font-semibold\",\n viewToolbarCountBadgeClass(tab.filterId, isActive),\n )}\n >\n {count}\n </span>\n )}\n </>\n )\n const viewSettingsMenu = (\n <DropdownMenu>\n <Tip label=\"View settings\" side=\"bottom\">\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"inline-flex items-center justify-center min-h-8 min-w-6 shrink-0 rounded-e-md rounded-s-none px-0.5\",\n \"text-muted-foreground hover:text-interactive-hover-foreground hover:bg-foreground/[0.04]\",\n \"transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:z-10\",\n )}\n aria-label=\"View settings\"\n >\n <i className=\"fa-light fa-chevron-down text-xs\" aria-hidden=\"true\" />\n </button>\n </DropdownMenuTrigger>\n </Tip>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuLabel className=\"text-xs text-muted-foreground\">\n View: {VIEW_TYPES.find(v => v.type === tab.viewType)?.label}\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n\n <DropdownMenuItem\n shortcut=\"F2\"\n onSelect={() => openRename(tab)}\n >\n <i className=\"fa-light fa-pen text-xs\" aria-hidden=\"true\" />\n Rename\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={!resolvedOnEditView}\n shortcut=\"⌘E\"\n onSelect={() =>\n resolvedOnEditView?.(tab, { updateTab: patch => updateTab(tab.id, patch) })\n }\n >\n <i className=\"fa-light fa-sliders text-xs\" aria-hidden=\"true\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuItem shortcut=\"⌘D\" onSelect={() => duplicateTab(tab)}>\n <i className=\"fa-light fa-copy text-xs\" aria-hidden=\"true\" />\n Duplicate\n </DropdownMenuItem>\n <DropdownMenuItem\n shortcut=\"⌘I\"\n onSelect={() => { setReviewTab(tab); setReviewOpen(true) }}\n >\n <i className=\"fa-light fa-clipboard-list text-xs\" aria-hidden=\"true\" />\n Review view\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n {!isOnly && (\n <DropdownMenuItem\n shortcut=\"⌘⌫\"\n onSelect={(e) => removeTab(tab.id, e as unknown as React.KeyboardEvent)}\n className=\"text-destructive focus:text-destructive\"\n >\n <i className=\"fa-light fa-trash text-xs\" aria-hidden=\"true\" />\n Remove view\n </DropdownMenuItem>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n return (\n <div key={tab.id} className=\"group relative inline-flex items-center\">\n {isActive ? (\n <div\n className={cn(\n viewSegmentedButtonClass(true),\n \"gap-0 p-0 inline-flex items-stretch\",\n )}\n >\n <button\n type=\"button\"\n aria-pressed={true}\n data-slot=\"view-segmented-item\"\n onClick={() => setActiveTabId(tab.id)}\n className={cn(\n \"inline-flex items-center gap-1.5 ps-2.5 pe-0.5 py-1 text-xs min-h-8\",\n \"rounded-s-md rounded-e-none\",\n \"bg-transparent text-foreground font-medium\",\n \"hover:bg-foreground/[0.04]\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:z-10\",\n )}\n >\n {tabInner}\n </button>\n {viewSettingsMenu}\n </div>\n ) : (\n <button\n type=\"button\"\n aria-pressed={false}\n data-slot=\"view-segmented-item\"\n onClick={() => setActiveTabId(tab.id)}\n className={cn(\n viewSegmentedButtonClass(false),\n /* Tighter trailing edge when remove control follows */\n !isOnly && \"pe-1.5\",\n )}\n >\n {tabInner}\n </button>\n )}\n\n {/* Close on inactive tabs — native button + 24px min target (WCAG 2.5.8) */}\n {!isActive && !isOnly && (\n <Tip side=\"bottom\" label={`Remove ${tab.label} view`}>\n <button\n type=\"button\"\n aria-label={`Remove ${tab.label} view`}\n onClick={e => removeTab(tab.id, e)}\n className=\"inline-flex items-center justify-center size-6 min-h-6 min-w-6 rounded transition-opacity opacity-0 group-hover:opacity-60 hover:!opacity-100 hover:text-destructive focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n )}\n </div>\n )\n })}\n </div>\n\n {/* Add view */}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"shrink-0 text-muted-foreground\"\n >\n <i className=\"fa-light fa-plus text-sm\" aria-hidden=\"true\" />\n Add view\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuLabel className=\"text-xs\">Add a view</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {addableViewTypes.map((v, i) => (\n <DropdownMenuItem\n key={v.type}\n shortcut={dataListViewAddShortcut(i)}\n onSelect={() => addView(v.type)}\n >\n <i className={`fa-light ${v.icon}`} aria-hidden=\"true\" />\n {v.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </>\n )}\n\n {/* ── Content — keyed by tab so each view tab owns its height (no stale min-height). ── */}\n {activeTab ? (\n <div key={activeTab.id} className=\"flex min-h-0 flex-1 flex-col\">\n {renderContent(activeTab, patch => updateTab(activeTab.id, patch))}\n </div>\n ) : null}\n\n {/* ── Export ──────────────────────────────────────────────── */}\n {onExportOpenChange && (\n <ExportDrawer\n open={exportOpen}\n onOpenChange={onExportOpenChange}\n totalRows={exportTotalRows ?? getTabCount?.(activeTab.filterId) ?? 0}\n />\n )}\n\n <Dialog open={renameOpen} onOpenChange={setRenameOpen}>\n <DialogContent className=\"max-w-sm\">\n <DialogHeader>\n <DialogTitle>Rename view</DialogTitle>\n <DialogDescription>Enter a new name for this view.</DialogDescription>\n </DialogHeader>\n <Input\n className=\"mt-3 h-9 text-sm\"\n value={renameValue}\n onChange={e => setRenameValue(e.target.value)}\n onKeyDown={e => { if (e.key === \"Enter\") commitRename() }}\n autoFocus\n aria-label=\"View name\"\n />\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setRenameOpen(false)}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={commitRename}>\n Save\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog\n open={reviewOpen && !!reviewTab}\n onOpenChange={(open) => {\n setReviewOpen(open)\n if (!open) setReviewTab(null)\n }}\n >\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Review view</DialogTitle>\n <DialogDescription>Summary of this view’s configuration.</DialogDescription>\n </DialogHeader>\n {reviewTab && (\n <dl className=\"mt-2 space-y-3 text-sm\">\n <div className=\"flex justify-between gap-4 border-b border-border pb-2\">\n <dt className=\"text-muted-foreground\">Name</dt>\n <dd className=\"font-medium text-foreground text-end\">{reviewTab.label}</dd>\n </div>\n <div className=\"flex justify-between gap-4 border-b border-border pb-2\">\n <dt className=\"text-muted-foreground\">View type</dt>\n <dd className=\"text-foreground text-end\">{VIEW_TYPES.find(v => v.type === reviewTab.viewType)?.label}</dd>\n </div>\n <div className=\"flex justify-between gap-4 border-b border-border pb-2\">\n <dt className=\"text-muted-foreground\">Lifecycle filter</dt>\n <dd className=\"text-foreground text-end capitalize\">{reviewTab.filterId}</dd>\n </div>\n {getTabCount && (\n <div className=\"flex justify-between gap-4\">\n <dt className=\"text-muted-foreground\">Row count</dt>\n <dd className=\"tabular-nums text-foreground text-end\">{getTabCount(reviewTab.filterId)}</dd>\n </div>\n )}\n </dl>\n )}\n <DialogFooter>\n <Button type=\"button\" size=\"sm\" onClick={() => setReviewOpen(false)}>\n Close\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </>\n )\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nexport interface NestedSecondaryPanelShellProps {\n /** When false, the shell is visually hidden (no width). */\n open: boolean\n /** Icon-only rail (same width token as primary `Sidebar` collapsible icon mode). */\n compact: boolean\n children: React.ReactNode\n /** Forwarded to the outer `<nav>`. */\n \"aria-label\"?: string\n className?: string\n}\n\n/**\n * Shared chrome for a nested hub rail — full width vs icon rail.\n * Fill uses `--secondary-panel-bg` — one step lighter than `--sidebar` (elevation 1).\n */\nexport function NestedSecondaryPanelShell({\n open,\n compact,\n children,\n \"aria-label\": ariaLabel = \"Secondary navigation\",\n className,\n}: NestedSecondaryPanelShellProps) {\n return (\n <nav\n aria-label={ariaLabel}\n data-state={open ? \"open\" : \"closed\"}\n data-layout={open ? (compact ? \"icon\" : \"expanded\") : \"closed\"}\n // The Cursor IDE browser preview injects a `data-cursor-ref` attribute\n // on top-level layout roots BEFORE React hydrates (so it can target\n // them for click automation). React then sees an attribute it didn't\n // SSR and emits a hydration warning. Suppressing here only quiets the\n // warning for THIS element's own attributes — children still hydrate\n // normally and any real mismatch inside the panel will still surface.\n // Has zero effect outside the Cursor IDE preview.\n suppressHydrationWarning\n className={cn(\n \"flex flex-col overflow-hidden\",\n \"transition-[width,margin,opacity] duration-200 ease-linear\",\n open\n ? cn(\n // Match the primary sidebar: fill the full viewport height\n // (minus our 0.5rem top + 0.5rem bottom margin from `m-2` →\n // 1rem on desktop where the panel is `md:sticky md:top-2`;\n // 2rem on mobile where the panel scrolls inline and we leave\n // a little more breathing room). No upper cap so tall screens\n // get a fully-extended rail.\n \"shrink-0 m-2 mx-2 rounded-xl ring-1 ring-sidebar-border shadow-sm relative md:sticky md:top-2 bg-[var(--secondary-panel-bg)]\",\n compact\n ? \"w-12 min-w-12 max-w-12 h-[calc(100svh-2rem)] md:h-[calc(100svh-1rem)]\"\n : \"w-64 min-w-64 max-w-64 h-[calc(100svh-2rem)] md:h-[calc(100svh-1rem)]\",\n )\n : \"h-0 min-h-0 shrink overflow-hidden border-0 p-0 m-0 min-w-0 w-0 max-w-0 opacity-0 pointer-events-none\",\n className,\n )}\n >\n <div\n className={cn(\n \"flex flex-1 flex-col overflow-y-auto overflow-x-hidden\",\n open ? \"min-w-0\" : \"hidden min-w-0 w-0 p-0\",\n )}\n >\n {children}\n </div>\n </nav>\n )\n}\n","\"use client\"\n\n/**\n * DotPattern — dot grid revealed by a soft drifting \"cloud\" mask.\n *\n * Inspiration: Google/Apple AI loading states — a diffuse dot field that\n * softly fades in, drifts diagonally across the surface, then fades out.\n * No bright glow cores, no particles — just one or two large soft halos\n * sliding across the grid so the dots appear as an ambient cloud.\n */\n\nimport * as React from \"react\"\nimport { motion } from \"motion/react\"\nimport { cn } from \"../../lib/utils\"\n\ninterface DotPatternProps extends React.SVGProps<SVGSVGElement> {\n width?: number\n height?: number\n x?: number\n y?: number\n cx?: number\n cy?: number\n cr?: number\n className?: string\n glow?: boolean\n /** Number of drifting soft clouds (keep small: 1–2). */\n glowCount?: number\n /** Cloud radius — large values produce a wide, diffuse reveal. */\n glowRadius?: number\n}\n\ntype Cloud = {\n key: number\n xs: string[]\n ys: string[]\n duration: number\n delay: number\n}\n\n/**\n * Tiny deterministic PRNG (mulberry32). We use a seeded RNG instead of\n * `Math.random()` so the SVG attributes emitted on the server match the\n * client's first paint — otherwise React reports a hydration mismatch and\n * has to re-paint every drifting `<motion.circle>` on mount, which is both\n * a perf cost and a visible jump.\n */\nfunction mulberry32(seed: number): () => number {\n let s = seed >>> 0\n return () => {\n s = (s + 0x6d2b79f5) >>> 0\n let t = s\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\nfunction hashString(str: string): number {\n // Cheap FNV-1a-style hash. Stable across SSR + CSR for the same input.\n let h = 2166136261\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i)\n h = Math.imul(h, 16777619)\n }\n return h >>> 0\n}\n\nexport function DotPattern({\n width = 14,\n height = 14,\n x = 0,\n y = 0,\n cx = 1,\n cy = 1,\n cr = 0.8,\n className,\n glow = false,\n glowCount = 2,\n glowRadius = 240,\n ...props\n}: DotPatternProps) {\n const id = React.useId()\n const maskId = `${id}-mask`\n const gradId = `${id}-grad`\n\n const clouds = React.useMemo<Cloud[]>(() => {\n const rng = mulberry32(hashString(`${id}|${glowCount}`))\n const rand = (min: number, max: number) => min + rng() * (max - min)\n return Array.from({ length: glowCount }).map((_, i) => {\n // Drift diagonally: bottom-right → top-left. Start/end partly off-canvas\n // so the cloud enters and exits softly without a visible edge.\n const startX = rand(85, 120)\n const endX = rand(-20, 15)\n const midX = (startX + endX) / 2 + rand(-6, 6)\n\n const startY = rand(85, 115)\n const endY = rand(-15, 10)\n const midY = (startY + endY) / 2 + rand(-4, 4)\n\n const duration = rand(8, 12)\n // Offset clouds by half a cycle so one is arriving as the other leaves.\n const delay = -(i / glowCount) * duration\n\n return {\n key: i,\n xs: [`${startX}%`, `${midX}%`, `${endX}%`],\n ys: [`${startY}%`, `${midY}%`, `${endY}%`],\n duration,\n delay,\n }\n })\n }, [glowCount, id])\n\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(\n \"pointer-events-none absolute inset-0 h-full w-full fill-neutral-400/80\",\n className,\n )}\n {...props}\n >\n <defs>\n <pattern\n id={id}\n width={width}\n height={height}\n patternUnits=\"userSpaceOnUse\"\n patternContentUnits=\"userSpaceOnUse\"\n x={x}\n y={y}\n >\n <circle cx={cx} cy={cy} r={cr} />\n </pattern>\n\n {glow ? (\n <>\n {/* Very soft falloff — no visible ring edge, dots dissolve gradually. */}\n <radialGradient id={gradId}>\n <stop offset=\"0%\" stopColor=\"white\" stopOpacity=\"0.9\" />\n <stop offset=\"40%\" stopColor=\"white\" stopOpacity=\"0.55\" />\n <stop offset=\"75%\" stopColor=\"white\" stopOpacity=\"0.18\" />\n <stop offset=\"100%\" stopColor=\"white\" stopOpacity=\"0\" />\n </radialGradient>\n\n <mask id={maskId}>\n {clouds.map((c) => (\n <motion.circle\n key={`cloud-${c.key}`}\n r={glowRadius}\n fill={`url(#${gradId})`}\n initial={{ cx: c.xs[0], cy: c.ys[0], opacity: 0 }}\n animate={{\n cx: c.xs,\n cy: c.ys,\n // Long hold with soft fade at both ends.\n opacity: [0, 1, 1, 0],\n }}\n transition={{\n duration: c.duration,\n delay: c.delay,\n repeat: Infinity,\n ease: \"linear\",\n times: [0, 0.3, 0.7, 1],\n }}\n />\n ))}\n </mask>\n </>\n ) : null}\n </defs>\n\n {/* Dot grid — only visible inside the drifting soft clouds when glow is on. */}\n <rect\n width=\"100%\"\n height=\"100%\"\n strokeWidth={0}\n fill={`url(#${id})`}\n mask={glow ? `url(#${maskId})` : undefined}\n />\n </svg>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { ListPageViewFrame } from \"../ui/list-page-view-frame\"\nimport { DotPattern } from \"../ui/dot-pattern\"\nimport { cn } from \"../../lib/utils\"\n\nexport interface DedicatedSearchLandingTemplateProps {\n /** Page title — string or rich node (e.g. styled heading). */\n title: React.ReactNode\n /** Primary search control (typically {@link DedicatedSearchUrlComposer}). */\n composer: React.ReactNode\n /** Optional block below composer (e.g. {@link DedicatedSearchRecents}). */\n trailing?: React.ReactNode\n /** Forwarded to {@link ListPageViewFrame}. */\n maxWidthClassName?: string\n frameClassName?: string\n gutterClassName?: string\n}\n\nconst DEFAULT_GUTTER =\n \"mx-auto flex min-h-[min(72vh,36rem)] w-full min-w-0 flex-col justify-center gap-0 px-6 py-8 sm:px-8 sm:py-10 md:px-12 md:py-12 lg:px-16\"\n\n/** Feather into page white / header so the hero never reads as a hard horizontal slab. */\nconst HERO_BACKDROP_MASK =\n \"[mask-image:linear-gradient(to_bottom,transparent_0%,black_5%,black_95%,transparent_100%)] [-webkit-mask-image:linear-gradient(to_bottom,transparent_0%,black_5%,black_95%,transparent_100%)]\"\n\n/**\n * Soft blurred blobs using only Ask Leo surface tints (`--leo-surface-tint-a|b` in `globals.css`).\n */\nfunction DedicatedSearchLandingBackdrop() {\n return (\n <div\n aria-hidden\n className={cn(\n \"pointer-events-none absolute inset-0 -z-10 select-none overflow-hidden\",\n HERO_BACKDROP_MASK,\n )}\n >\n <div\n className=\"absolute -left-[20%] -top-[30%] h-[min(54vmin,27rem)] w-[min(54vmin,27rem)] rounded-full blur-[76px]\"\n style={{\n background: \"radial-gradient(circle at 42% 36%, var(--leo-surface-tint-b) 0%, transparent 68%)\",\n }}\n />\n <div\n className=\"absolute -right-[12%] top-[2%] h-[min(46vmin,23rem)] w-[min(46vmin,23rem)] rounded-full blur-[68px]\"\n style={{\n background: \"radial-gradient(circle at 48% 48%, var(--leo-surface-tint-a) 0%, transparent 66%)\",\n }}\n />\n <div\n className=\"absolute bottom-[-16%] left-[14%] h-[min(50vmin,25rem)] w-[min(50vmin,25rem)] rounded-full blur-[84px]\"\n style={{\n background: \"radial-gradient(circle at 44% 40%, var(--leo-surface-tint-b) 0%, transparent 70%)\",\n }}\n />\n <div\n className=\"absolute bottom-[4%] right-[6%] h-[min(40vmin,20rem)] w-[min(40vmin,20rem)] rounded-full blur-[60px]\"\n style={{\n background: \"radial-gradient(circle at 52% 44%, var(--leo-surface-tint-a) 0%, transparent 72%)\",\n }}\n />\n <div\n className=\"absolute left-[36%] top-[32%] h-[min(38vmin,19rem)] w-[min(38vmin,19rem)] -translate-x-1/2 rounded-full blur-[74px]\"\n style={{\n background: \"radial-gradient(circle at 50% 50%, var(--leo-surface-tint-b) 0%, transparent 68%)\",\n }}\n />\n\n {/* Static dot field — same primitive as `AiThinkingOverlay` (no motion here). */}\n <DotPattern\n width={15}\n height={15}\n cr={0.65}\n className={cn(\n \"absolute inset-0 opacity-[0.34] mix-blend-multiply dark:opacity-[0.22] dark:mix-blend-soft-light\",\n \"fill-[color-mix(in_oklch,var(--brand-color)_14%,var(--background))]\",\n )}\n />\n </div>\n )\n}\n\n/**\n * Centered dedicated-search landing — empty `?q=` shell (hero title + composer + optional trailing).\n */\nexport function DedicatedSearchLandingTemplate({\n title,\n composer,\n trailing,\n maxWidthClassName = \"max-w-5xl\",\n frameClassName = \"min-w-0\",\n gutterClassName = DEFAULT_GUTTER,\n}: DedicatedSearchLandingTemplateProps) {\n return (\n <div className=\"relative isolate min-w-0 w-full overflow-hidden\">\n <DedicatedSearchLandingBackdrop />\n <ListPageViewFrame\n maxWidthClassName={maxWidthClassName}\n className={cn(\"relative z-10\", frameClassName)}\n gutterClassName={gutterClassName}\n >\n <header className=\"min-w-0\">\n {typeof title === \"string\" ? (\n <h1\n className=\"text-balance text-3xl font-semibold tracking-tight text-foreground sm:text-4xl\"\n style={{ fontFamily: \"var(--font-heading)\" }}\n >\n {title}\n </h1>\n ) : (\n title\n )}\n </header>\n\n <div className=\"min-w-0 mt-6 sm:mt-8\">{composer}</div>\n\n {trailing ? <div className=\"min-w-0 mt-10 sm:mt-12 md:mt-14 lg:mt-16\">{trailing}</div> : null}\n </ListPageViewFrame>\n </div>\n )\n}\n","import type { ReactNode } from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\n/** Apply to the hub content wrapper when showing results (list surface under composer). */\nexport const DEDICATED_SEARCH_RESULTS_OUTER_CONTENT_CLASSNAME =\n \"border-t border-border/40 bg-gradient-to-b from-muted/25 via-background to-background\"\n\nexport interface DedicatedSearchResultsHeaderChromeProps {\n children: ReactNode\n className?: string\n}\n\n/**\n * Muted strip wrapping page chrome + composer on the results branch (below site header).\n */\nexport function DedicatedSearchResultsHeaderChrome({ children, className }: DedicatedSearchResultsHeaderChromeProps) {\n return <div className={cn(\"border-b border-border/50 bg-muted/15\", className)}>{children}</div>\n}\n","\"use client\"\n\n/**\n * Accordion — Radix-backed expandable section list.\n *\n * Use for **collapsible groups of secondary content** that would otherwise\n * make the page too long (FAQ, settings categories, glossary, audit\n * timeline grouped by day). Each `AccordionItem` toggles independently\n * when `type=\"multiple\"`, or as a single-open group when `type=\"single\"`.\n *\n * When to choose `Accordion` vs `Collapsible` vs `Tabs`:\n * - **`Accordion`** — multiple siblings, each independently expandable,\n * visible chevron + label that wraps cleanly.\n * - **`Collapsible`** — a single show / hide region with no sibling\n * grouping (used inside lists, inspector panels).\n * - **`Tabs`** — only one panel visible at a time, vertical or\n * horizontal nav, fixed set of named sections.\n *\n * Accessibility:\n * - Each `AccordionTrigger` renders as a `<button>` inside an `<h3>` so\n * screen readers expose the headings + expanded state (WCAG 1.3.1).\n * - Arrow-up / Arrow-down navigate between triggers; Home / End jump to\n * the first / last.\n */\n\nimport * as React from \"react\"\nimport { Accordion as AccordionPrimitive } from \"radix-ui\"\nimport { ChevronDown } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Accordion({\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root>) {\n return <AccordionPrimitive.Root data-slot=\"accordion\" {...props} />\n}\n\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\"border-b last:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-sm font-medium text-foreground outline-none transition-all hover:underline focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>i.accordion-chevron]:rotate-180\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDown\n className=\"accordion-chevron pointer-events-none mt-0.5 size-4 shrink-0 text-muted-foreground transition-transform duration-200\"\n aria-hidden=\"true\"\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n )\n}\n\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"overflow-hidden text-sm text-muted-foreground\"\n {...props}\n >\n <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n </AccordionPrimitive.Content>\n )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n","\"use client\"\n\n/**\n * AlertDialog — blocking confirm dialog backed by Radix `AlertDialog`.\n *\n * Use for **short, blocking** confirms where the user MUST acknowledge before\n * the surface behind can be interacted with again — destructive deletes,\n * irreversible status changes, legal acknowledgements, etc. (See\n * `.cursor/rules/exxat-drawer-vs-dialog.mdc` for the drawer-vs-dialog rule.)\n *\n * Differences from the regular `Dialog` primitive:\n * - Radix sets `role=\"alertdialog\"` automatically — screen readers\n * announce the title + description immediately.\n * - Cannot be dismissed by overlay click or `Esc` (only the explicit\n * `AlertDialogCancel` / `AlertDialogAction` buttons close it).\n * - Ships an `Action` (primary destructive / commit) + `Cancel`\n * (secondary dismiss) pair that map to `Button` variants without\n * additional wiring.\n *\n * Accessibility:\n * - WCAG 4.1.2 — `AlertDialogTitle` is REQUIRED. Hide it visually with\n * `sr-only` if the design omits the heading, but never omit the element.\n * - WCAG 2.1.2 — focus is trapped inside the dialog while open (Radix).\n * - WCAG 3.3.4 — pair destructive actions with explicit, named verbs\n * (\"Delete site\" rather than \"OK\").\n */\n\nimport * as React from \"react\"\nimport { AlertDialog as AlertDialogPrimitive } from \"radix-ui\"\n\nimport { Button, buttonVariants } from \"./button\"\nimport { cn } from \"../../lib/utils\"\n\nfunction AlertDialog({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {\n return <AlertDialogPrimitive.Root data-slot=\"alert-dialog\" {...props} />\n}\n\nfunction AlertDialogTrigger({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {\n return (\n <AlertDialogPrimitive.Trigger data-slot=\"alert-dialog-trigger\" {...props} />\n )\n}\n\nfunction AlertDialogPortal({\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {\n return (\n <AlertDialogPrimitive.Portal data-slot=\"alert-dialog-portal\" {...props} />\n )\n}\n\nfunction AlertDialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {\n return (\n <AlertDialogPrimitive.Overlay\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 isolate z-50 bg-black/15 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogContent({\n className,\n overlayClassName,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {\n /** Merged onto `AlertDialogOverlay` (e.g. `bg-transparent` for an undimmed backdrop). */\n overlayClassName?: string\n}) {\n return (\n <AlertDialogPortal>\n <AlertDialogOverlay className={overlayClassName ?? undefined} />\n <AlertDialogPrimitive.Content\n data-slot=\"alert-dialog-content\"\n className={cn(\n \"fixed top-1/2 start-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 rtl:translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-md data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n />\n </AlertDialogPortal>\n )\n}\n\nfunction AlertDialogHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n )\n}\n\nfunction AlertDialogFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {\n return (\n <AlertDialogPrimitive.Title\n data-slot=\"alert-dialog-title\"\n className={cn(\n \"font-heading text-base leading-none font-medium\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction AlertDialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {\n return (\n <AlertDialogPrimitive.Description\n data-slot=\"alert-dialog-description\"\n className={cn(\n \"text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground\",\n className,\n )}\n {...props}\n />\n )\n}\n\n/**\n * Primary commit button. Defaults to `Button` `default` variant; pass\n * `variant=\"destructive\"` when the action is irreversible (delete, archive\n * with cascade, etc.).\n *\n * Radix marks this as the **submit** button — pressing `Enter` while the\n * dialog has focus invokes it.\n */\nfunction AlertDialogAction({\n className,\n variant,\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Action> &\n React.ComponentProps<typeof Button>) {\n return (\n <AlertDialogPrimitive.Action asChild>\n <Button\n data-slot=\"alert-dialog-action\"\n variant={variant}\n className={className}\n {...props}\n />\n </AlertDialogPrimitive.Action>\n )\n}\n\n/**\n * Secondary dismiss button — closes the dialog without committing the\n * action. Defaults to `Button` `outline` variant for a quieter visual\n * weight next to `AlertDialogAction`.\n */\nfunction AlertDialogCancel({\n className,\n variant = \"outline\",\n ...props\n}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &\n React.ComponentProps<typeof Button>) {\n return (\n <AlertDialogPrimitive.Cancel asChild>\n <Button\n data-slot=\"alert-dialog-cancel\"\n variant={variant}\n className={className}\n {...props}\n />\n </AlertDialogPrimitive.Cancel>\n )\n}\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n // Re-export the button class-variance helper so consumers building\n // ad-hoc footers can match the alert-dialog action styling without\n // importing the Button primitive separately.\n buttonVariants,\n}\n","\"use client\"\n\n/**\n * Banner — two types of banner for system-level and local-level messaging.\n *\n * 1. SystemBanner: full-width strip at the very top of the app (above sidebar).\n * Used for maintenance notices, feature promotions, global alerts.\n *\n * 2. LocalBanner: inline alert within a page section.\n * Used for page-specific errors, warnings, and informational messages.\n *\n * Both support: info, warning, error, success, and promo variants.\n * Both are dismissible and accessible (role=\"alert\" / role=\"status\").\n */\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Tip } from \"./tip\"\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Variant definitions\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst VARIANT_CONFIG = {\n info: {\n icon: \"fa-circle-info\",\n prefix: \"fa-light\",\n role: \"status\" as const,\n live: \"polite\" as const,\n },\n warning: {\n icon: \"fa-triangle-exclamation\",\n prefix: \"fa-light\",\n role: \"alert\" as const,\n live: \"assertive\" as const,\n },\n error: {\n icon: \"fa-circle-exclamation\",\n prefix: \"fa-light\",\n role: \"alert\" as const,\n live: \"assertive\" as const,\n },\n success: {\n icon: \"fa-circle-check\",\n prefix: \"fa-light\",\n role: \"status\" as const,\n live: \"polite\" as const,\n },\n promo: {\n icon: \"fa-star-christmas text-brand\",\n prefix: \"fa-duotone fa-solid\",\n role: \"status\" as const,\n live: \"polite\" as const,\n },\n}\n\ntype BannerVariant = keyof typeof VARIANT_CONFIG\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SystemBanner — inline at the top of the main content area\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst systemBannerVariants = cva(\n // No `overflow-hidden` on root — it clips promo `boxShadow` (glow). Clip `decorativeOverlay` in a nested layer instead.\n \"relative isolate flex rounded-lg border text-sm transition-all\",\n {\n variants: {\n variant: {\n /* Prominent defaults — darker shells + light foreground copy for ≥4.5:1 on the fill. */\n info: \"bg-blue-900 text-blue-50 border-blue-950/35 dark:bg-blue-950 dark:text-blue-50 dark:border-blue-900/60\",\n warning: \"bg-amber-900 text-amber-50 border-amber-950/35 dark:bg-amber-950 dark:text-amber-50 dark:border-amber-900/60\",\n error: \"bg-red-900 text-red-50 border-red-950/35 dark:bg-red-950 dark:text-red-50 dark:border-red-900/60\",\n success: \"bg-emerald-900 text-emerald-50 border-emerald-950/35 dark:bg-emerald-950 dark:text-emerald-50 dark:border-emerald-900/60\",\n promo: \"bg-gradient-to-r from-brand/14 via-brand/8 to-brand/5 text-foreground border-brand/22 dark:from-brand/20 dark:via-brand/12 dark:to-brand/7 dark:border-brand/26\",\n },\n /** Emphasis — \"prominent\" uses dark solid fills; \"subtle\" uses soft tinted bg. */\n emphasis: {\n prominent: \"\",\n subtle: \"\",\n },\n /** Action placement: \"inline\" puts the action to the right; \"bottom\" puts it below the text */\n actionPosition: {\n // flex-wrap so the action button drops to a second line at 200%+ zoom instead of overflowing\n inline: \"flex-wrap items-center gap-3 px-4 py-2.5\",\n bottom: \"flex-col gap-2 px-4 py-3\",\n },\n },\n compoundVariants: [\n { emphasis: \"subtle\", variant: \"info\", class: \"bg-blue-500/5 text-blue-800 border-blue-500/30 dark:bg-blue-500/10 dark:text-blue-200 dark:border-blue-500/20\" },\n { emphasis: \"subtle\", variant: \"warning\", class: \"bg-amber-500/5 text-amber-800 border-amber-500/30 dark:bg-amber-500/10 dark:text-amber-200 dark:border-amber-500/20\" },\n { emphasis: \"subtle\", variant: \"error\", class: \"bg-red-500/5 text-red-800 border-red-500/30 dark:bg-red-500/10 dark:text-red-200 dark:border-red-500/20\" },\n { emphasis: \"subtle\", variant: \"success\", class: \"bg-emerald-500/5 text-emerald-800 border-emerald-500/30 dark:bg-emerald-500/10 dark:text-emerald-200 dark:border-emerald-500/20\" },\n { emphasis: \"subtle\", variant: \"promo\", class: \"bg-brand/5 text-foreground border-brand/30 dark:bg-brand/10 dark:border-brand/20\" },\n ],\n defaultVariants: { variant: \"info\", emphasis: \"prominent\", actionPosition: \"inline\" },\n }\n)\n\nexport interface SystemBannerProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof systemBannerVariants> {\n /** Banner title (optional — adds a bold heading) */\n title?: string\n /** The banner message */\n children: React.ReactNode\n /** Whether the banner can be dismissed */\n dismissible?: boolean\n /** Callback when dismissed */\n onDismiss?: () => void\n /** Optional action — renders as a link-style button. Use href for server components, onClick for client. */\n action?: {\n label: string\n href?: string\n onClick?: () => void\n }\n /** Where to place the action: \"inline\" (right side) or \"bottom\" (below text) */\n actionPosition?: \"inline\" | \"bottom\"\n /** Override the default icon */\n icon?: string\n /** Optional absolutely-positioned decorative layer (e.g. `<AiThinkingOverlay />`). */\n decorativeOverlay?: React.ReactNode\n}\n\nexport function SystemBanner({\n children,\n title,\n variant = \"info\",\n emphasis = \"prominent\",\n dismissible = true,\n onDismiss,\n action,\n actionPosition = \"inline\",\n icon,\n decorativeOverlay,\n className,\n style,\n ...props\n}: SystemBannerProps) {\n const [dismissed, setDismissed] = React.useState(false)\n const config = VARIANT_CONFIG[variant ?? \"info\"]\n\n function handleDismiss() {\n setDismissed(true)\n onDismiss?.()\n }\n\n if (dismissed) return null\n\n const actionEl = action && (\n action.href ? (\n <a\n href={action.href}\n className=\"inline-flex shrink-0 items-center gap-1 text-xs font-semibold underline underline-offset-2 hover:no-underline\"\n suppressHydrationWarning\n >\n {action.label}\n <i className=\"fa-light fa-arrow-right text-xs\" aria-hidden=\"true\" />\n </a>\n ) : (\n <Button\n size=\"xs\"\n variant=\"link\"\n onClick={action.onClick}\n className=\"h-auto shrink-0 px-0 text-xs font-semibold underline underline-offset-2 hover:no-underline\"\n >\n {action.label}\n <i className=\"fa-light fa-arrow-right text-xs ms-0.5\" aria-hidden=\"true\" />\n </Button>\n )\n )\n\n /** Outside-only brand halo (no inset fill — glow does not paint inside the banner). */\n const promoOuterShadow =\n emphasis === \"subtle\"\n ? \"0 10px 36px -6px oklch(from var(--brand-color) l c h / 0.2), 0 2px 12px -4px oklch(from var(--brand-color) l c h / 0.12)\"\n : \"0 14px 48px -8px oklch(from var(--brand-color) l c h / 0.26), 0 4px 18px -4px oklch(from var(--brand-color) l c h / 0.16)\"\n\n return (\n <div\n role={config.role}\n aria-live={config.live}\n className={cn(systemBannerVariants({ variant, emphasis, actionPosition }), className)}\n style={{\n ...(variant === \"promo\" ? { boxShadow: promoOuterShadow } : null),\n ...style,\n }}\n suppressHydrationWarning\n {...props}\n >\n {decorativeOverlay ? (\n <div\n className=\"pointer-events-none absolute inset-0 z-0 overflow-hidden rounded-lg\"\n aria-hidden\n >\n {decorativeOverlay}\n </div>\n ) : null}\n {/* Icon */}\n <i\n className={cn(\n config.prefix,\n icon ?? config.icon,\n \"relative z-[1] shrink-0 text-[14px]\",\n actionPosition === \"bottom\" ? \"mt-0.5\" : \"\",\n )}\n aria-hidden=\"true\"\n />\n\n {/* Content + inline action */}\n {actionPosition === \"inline\" ? (\n <>\n <div className=\"relative z-[1] min-w-0 flex-1\">\n {title && <span className=\"font-semibold me-1.5\">{title}</span>}\n <span className=\"opacity-90\">{children}</span>\n </div>\n {actionEl ? <span className=\"relative z-[1] inline-flex shrink-0\">{actionEl}</span> : null}\n </>\n ) : (\n <div className=\"relative z-[1] min-w-0 flex-1\">\n {title && <p className=\"font-semibold leading-tight mb-0.5\">{title}</p>}\n <p className=\"opacity-90 leading-relaxed\">{children}</p>\n {actionEl && <div className=\"mt-1.5\">{actionEl}</div>}\n </div>\n )}\n\n {/* Dismiss */}\n {dismissible && (\n <Tip label=\"Dismiss\" side=\"bottom\">\n <button\n type=\"button\"\n aria-label=\"Dismiss banner\"\n onClick={handleDismiss}\n className={cn(\n \"relative z-[2] inline-flex size-5 shrink-0 items-center justify-center rounded transition-colors\",\n actionPosition === \"bottom\" ? \"absolute top-2.5 right-2.5\" : \"\",\n \"hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n )}\n </div>\n )\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// LocalBanner — inline, within page sections\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst localBannerVariants = cva(\n \"flex items-start gap-3 rounded-lg border px-4 py-3 text-sm transition-all\",\n {\n variants: {\n variant: {\n info: \"border-blue-500/30 bg-blue-500/5 text-blue-800 dark:bg-blue-500/10 dark:text-blue-200 dark:border-blue-500/20\",\n warning: \"border-amber-500/30 bg-amber-500/5 text-amber-800 dark:bg-amber-500/10 dark:text-amber-200 dark:border-amber-500/20\",\n error: \"border-red-500/30 bg-red-500/5 text-red-800 dark:bg-red-500/10 dark:text-red-200 dark:border-red-500/20\",\n success: \"border-emerald-500/30 bg-emerald-500/5 text-emerald-800 dark:bg-emerald-500/10 dark:text-emerald-200 dark:border-emerald-500/20\",\n promo: \"border-brand/30 bg-brand/5 text-foreground dark:bg-brand/10 dark:border-brand/20\",\n },\n },\n defaultVariants: { variant: \"info\" },\n }\n)\n\nexport interface LocalBannerProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof localBannerVariants> {\n /** Banner title (optional) */\n title?: string\n /** Banner message */\n children: React.ReactNode\n /** Whether the banner can be dismissed */\n dismissible?: boolean\n /** Callback when dismissed */\n onDismiss?: () => void\n /** Optional action — renders as link (href) or button (onClick) */\n action?: {\n label: string\n href?: string\n onClick?: () => void\n }\n /** Optional retry action for error states */\n retry?: {\n label?: string\n onClick: () => void\n }\n /** Override the default icon */\n icon?: string\n}\n\nexport function LocalBanner({\n children,\n title,\n variant = \"info\",\n dismissible = false,\n onDismiss,\n action,\n retry,\n icon,\n className,\n ...props\n}: LocalBannerProps) {\n const [dismissed, setDismissed] = React.useState(false)\n const config = VARIANT_CONFIG[variant ?? \"info\"]\n\n function handleDismiss() {\n setDismissed(true)\n onDismiss?.()\n }\n\n if (dismissed) return null\n\n return (\n <div\n role={config.role}\n aria-live={config.live}\n className={cn(localBannerVariants({ variant }), className)}\n {...props}\n >\n {/* Icon */}\n <i\n className={cn(config.prefix, icon ?? config.icon, \"text-[15px] shrink-0 mt-0.5\")}\n aria-hidden=\"true\"\n />\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <p className=\"font-semibold leading-tight mb-0.5\">{title}</p>\n )}\n <div className=\"text-sm leading-relaxed opacity-90\">{children}</div>\n\n {/* Actions */}\n {(action || retry) && (\n <div className=\"flex items-center gap-2 mt-2.5\">\n {retry && (\n <Button size=\"xs\" variant=\"outline\" onClick={retry.onClick}>\n <i className=\"fa-light fa-arrow-rotate-right text-xs\" aria-hidden=\"true\" />\n {retry.label ?? \"Retry\"}\n </Button>\n )}\n {action && (\n action.href ? (\n <a href={action.href} className=\"inline-flex items-center gap-1 text-xs font-semibold underline underline-offset-2 hover:no-underline\">\n {action.label} <i className=\"fa-light fa-arrow-right text-xs\" aria-hidden=\"true\" />\n </a>\n ) : (\n <Button size=\"xs\" variant=\"outline\" onClick={action.onClick}>\n {action.label}\n </Button>\n )\n )}\n </div>\n )}\n </div>\n\n {/* Dismiss */}\n {dismissible && (\n <Tip label=\"Dismiss\" side=\"left\">\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={handleDismiss}\n className={cn(\n \"inline-flex items-center justify-center size-5 rounded transition-colors shrink-0\",\n \"hover:bg-current/10 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n )}\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </Tip>\n )}\n </div>\n )\n}\n","import * as React from \"react\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Breadcrumb({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n aria-label=\"breadcrumb\"\n data-slot=\"breadcrumb\"\n className={cn(className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbList({ className, ...props }: React.ComponentProps<\"ol\">) {\n return (\n <ol\n data-slot=\"breadcrumb-list\"\n className={cn(\n \"flex flex-wrap items-center gap-1.5 text-sm wrap-break-word text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-item\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbLink({\n asChild,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"breadcrumb-link\"\n className={cn(\"transition-colors hover:text-interactive-hover-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbPage({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-page\"\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn(\"font-normal text-foreground\", className)}\n {...props}\n />\n )\n}\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"breadcrumb-separator\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? (\n <i className=\"fa-light fa-chevron-right rtl:rotate-180\" aria-hidden=\"true\" />\n )}\n </li>\n )\n}\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"breadcrumb-ellipsis\"\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn(\n \"flex size-5 items-center justify-center [&>svg]:size-4\",\n className\n )}\n {...props}\n >\n <i className=\"fa-light fa-ellipsis\" aria-hidden=\"true\" />\n <span className=\"sr-only\">More</span>\n </span>\n )\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as RechartsPrimitive from \"recharts\"\n\nimport { cn } from \"../../lib/utils\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n}\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error(\"useChart must be used within a <ChartContainer />\")\n }\n\n return context\n}\n\nfunction ChartContainer({\n id,\n className,\n children,\n config,\n ...props\n}: React.ComponentProps<\"div\"> & {\n config: ChartConfig\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"]\n}) {\n const uniqueId = React.useId()\n const chartId = `chart-${id || uniqueId.replace(/:/g, \"\")}`\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-slot=\"chart\"\n data-chart={chartId}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-polar-grid_line]:stroke-border/50 [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_line]:stroke-border [&_.recharts-sector]:outline-hidden [&_.recharts-surface]:outline-hidden\",\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n}\n\n/**\n * Conservative validators for the two values interpolated into a `<style>`\n * block via `dangerouslySetInnerHTML`.\n *\n * `ChartConfig.color` is typed as a free `string` and may be authored by\n * downstream consumers of `@exxatdesignux/ui` who could pass user-controlled\n * data. To prevent CSS injection (escaping the property value, closing the\n * block, or injecting `</style>`) we accept only a documented allowlist of\n * CSS color syntaxes and reject anything that contains rule-terminating or\n * markup-sensitive characters.\n *\n * Keys come from `ChartConfig` and become CSS custom-property names, so they\n * are restricted to a safe identifier alphabet.\n */\nconst CSS_KEY_PATTERN = /^[A-Za-z0-9_-]+$/\n\nconst SAFE_COLOR_PATTERN = new RegExp(\n [\n /^#[0-9a-fA-F]{3,8}$/, // #rgb / #rrggbb / #rrggbbaa\n /^rgba?\\([^;{}<>\"'\\\\]*\\)$/, // rgb()/rgba()\n /^hsla?\\([^;{}<>\"'\\\\]*\\)$/, // hsl()/hsla()\n /^hwb\\([^;{}<>\"'\\\\]*\\)$/, // hwb()\n /^lab\\([^;{}<>\"'\\\\]*\\)$/, // lab()\n /^lch\\([^;{}<>\"'\\\\]*\\)$/, // lch()\n /^oklab\\([^;{}<>\"'\\\\]*\\)$/, // oklab()\n /^oklch\\([^;{}<>\"'\\\\]*\\)$/, // oklch()\n /^color\\([^;{}<>\"'\\\\]*\\)$/, // color()\n /^color-mix\\([^;{}<>\"'\\\\]*\\)$/, // color-mix()\n /^var\\(--[A-Za-z0-9_-]+(?:\\s*,[^;{}<>\"'\\\\]+)?\\)$/, // var(--token[, fallback])\n /^[a-zA-Z]+$/, // named colors + currentColor/transparent\n ]\n .map((re) => re.source)\n .join(\"|\"),\n)\n\nfunction sanitizeChartColor(color: string): string | null {\n const trimmed = color.trim()\n if (!trimmed) return null\n // Defence-in-depth: any of these characters could break out of the value\n // and turn the inline `<style>` block into an injection sink.\n if (/[;{}<>\"'\\\\]/.test(trimmed)) return null\n return SAFE_COLOR_PATTERN.test(trimmed) ? trimmed : null\n}\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme || config.color\n )\n\n if (!colorConfig.length) {\n return null\n }\n\n // `id` is generated from `React.useId()` in `ChartContainer`, but consumers\n // can override it via the `id` prop, so we still verify the shape before\n // interpolating it into a CSS selector.\n if (!CSS_KEY_PATTERN.test(id)) {\n return null\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n if (!CSS_KEY_PATTERN.test(key)) return null\n const rawColor =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n itemConfig.color\n if (!rawColor) return null\n const safeColor = sanitizeChartColor(rawColor)\n return safeColor ? ` --color-${key}: ${safeColor};` : null\n })\n .filter(Boolean)\n .join(\"\\n\")}\n}\n`\n )\n .join(\"\\n\"),\n }}\n />\n )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\n/**\n * Returns props for `<ChartTooltip />` keyboard parity.\n *\n * Usage — pass `key` explicitly (React requires it outside the spread):\n * ```tsx\n * const sync = chartTooltipKeyboardSyncProps(activeIndex)\n * <ChartTooltip key={sync.key} {...sync.props} />\n * ```\n */\nfunction chartTooltipKeyboardSyncProps(keyboardActiveIndex: number | null): {\n key: string\n props: { defaultIndex?: number }\n} {\n const hasKbd =\n typeof keyboardActiveIndex === \"number\" && keyboardActiveIndex >= 0\n return {\n key: hasKbd ? `kbd-${keyboardActiveIndex}` : \"kbd-off\",\n props: hasKbd ? { defaultIndex: keyboardActiveIndex } : {},\n }\n}\n\nfunction ChartTooltipContent({\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n}: React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<\"div\"> & {\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: \"line\" | \"dot\" | \"dashed\"\n nameKey?: string\n labelKey?: string\n }) {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = `${labelKey || item?.dataKey || item?.name || \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === \"string\"\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium\", labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n return (\n <div\n className={cn(\n \"grid min-w-32 items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color || item.payload.fill || item.color\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\"\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)\",\n {\n \"h-2.5 w-2.5\": indicator === \"dot\",\n \"w-1\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n }\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\"\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value && (\n <span className=\"font-mono font-medium text-foreground tabular-nums\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nfunction ChartLegendContent({\n className,\n hideIcon = false,\n payload,\n verticalAlign = \"bottom\",\n nameKey,\n}: React.ComponentProps<\"div\"> &\n Pick<RechartsPrimitive.LegendProps, \"payload\" | \"verticalAlign\"> & {\n hideIcon?: boolean\n nameKey?: string\n }) {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-4\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className\n )}\n >\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item) => {\n const key = `${nameKey || item.dataKey || \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n return (\n <div\n key={item.value}\n className={cn(\n \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n )\n })}\n </div>\n )\n}\n\nfunction getPayloadConfigFromPayload(\n config: ChartConfig,\n payload: unknown,\n key: string\n) {\n if (typeof payload !== \"object\" || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n \"payload\" in payload &&\n typeof payload.payload === \"object\" &&\n payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === \"string\"\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string\n }\n\n return configLabelKey in config\n ? config[configLabelKey]\n : config[key as keyof typeof config]\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n chartTooltipKeyboardSyncProps,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n}\n","\"use client\"\n\n/**\n * CoachMark — contextual onboarding / feature-discovery popover\n *\n * Targets elements by CSS selector, scrolls them into view, and positions\n * the popover relative to the target using Radix's virtual anchor.\n *\n * Variants:\n * • single — standalone tip anchored to a target element\n * • flow — multi-step walkthrough with prev/next and step indicator\n * • image — includes a hero image above the content\n * • no-image — text-only (title + description)\n *\n * Brand-colored background with spotlight overlay on the target element.\n *\n * WCAG 2.1 AA:\n * • Focus trapped inside while open\n * • Escape dismisses\n * • aria-labelledby / aria-describedby wired automatically\n * • Step indicator announced via aria-live\n */\n\nimport * as React from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { Popover as PopoverPrimitive } from \"radix-ui\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Button } from \"./button\"\nimport { cn } from \"../../lib/utils\"\nimport type { CoachMarkState } from \"../../hooks/use-coach-mark\"\n\n/* ── Variant styles ─────────────────────────────────────────────────────── */\n\nconst coachMarkVariants = cva(\n \"z-[60] flex flex-col overflow-hidden rounded-xl bg-brand-deep text-white shadow-xl outline-none hc:!bg-background hc:!text-foreground hc:!border-2 hc:!border-foreground hc:!shadow-none\",\n {\n variants: {\n size: {\n default: \"w-[320px]\",\n sm: \"w-[260px]\",\n lg: \"w-[400px]\",\n },\n },\n defaultVariants: {\n size: \"default\",\n },\n }\n)\n\n/* ── Sub-components ─────────────────────────────────────────────────────── */\n\nfunction CoachMarkImage({\n src,\n alt,\n}: {\n src: string\n alt: string\n}) {\n return (\n <div className=\"relative w-full overflow-hidden\">\n <img\n src={src}\n alt={alt}\n className=\"h-[160px] w-full object-cover\"\n />\n </div>\n )\n}\n\nfunction CoachMarkStepIndicator({\n current,\n total,\n}: {\n current: number\n total: number\n}) {\n return (\n <div\n className=\"flex items-center gap-1\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`Step ${current + 1} of ${total}`}\n >\n {Array.from({ length: total }, (_, i) => (\n <span\n key={i}\n className={cn(\n \"h-1.5 rounded-full transition-all duration-200\",\n i === current\n ? \"w-4 bg-white hc:bg-foreground\"\n : \"w-1.5 bg-white/30 hc:bg-foreground/40\"\n )}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n )\n}\n\n/* ── Spotlight overlay — highlights the target element ──────────────────── */\n\nfunction SpotlightOverlay({\n rect,\n maskId,\n}: {\n rect: { x: number; y: number; width: number; height: number }\n /** Unique per coach instance — multiple flows on one page must not duplicate SVG mask ids. */\n maskId: string\n}) {\n const padding = 6\n const borderRadius = 8\n const x = rect.x - padding\n const y = rect.y - padding\n const w = rect.width + padding * 2\n const h = rect.height + padding * 2\n const maskUrl = `url(#${maskId})`\n\n return createPortal(\n <div\n className=\"fixed inset-0 z-[55]\"\n aria-hidden=\"true\"\n >\n {/* Semi-transparent overlay with a cutout for the target */}\n <svg className=\"absolute inset-0 w-full h-full\">\n <defs>\n <mask id={maskId}>\n <rect width=\"100%\" height=\"100%\" fill=\"white\" />\n <rect\n x={x}\n y={y}\n width={w}\n height={h}\n rx={borderRadius}\n ry={borderRadius}\n fill=\"black\"\n />\n </mask>\n </defs>\n <rect\n width=\"100%\"\n height=\"100%\"\n fill=\"rgba(0,0,0,0.5)\"\n mask={maskUrl}\n />\n </svg>\n\n {/* Highlight ring around the target */}\n <div\n className=\"absolute rounded-lg ring-2 ring-brand hc:ring-foreground shadow-[0_0_0_4px_rgba(0,0,0,0.3)] hc:shadow-none\"\n style={{\n left: x,\n top: y,\n width: w,\n height: h,\n borderRadius,\n }}\n />\n </div>,\n document.body\n )\n}\n\n/* ── Main component ─────────────────────────────────────────────────────── */\n\nexport interface CoachMarkProps\n extends VariantProps<typeof coachMarkVariants> {\n /** State from useCoachMark hook */\n state: CoachMarkState\n /** Default popover placement side (step-level side takes priority) */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n /** Default popover alignment (step-level align takes priority) */\n align?: \"start\" | \"center\" | \"end\"\n /** Offset from anchor element in px */\n sideOffset?: number\n /** Label for the primary (next/done) button — defaults to \"Next\" / \"Got it\" */\n nextLabel?: string\n /** Label for the skip button — defaults to \"Skip\" */\n skipLabel?: string\n /** Extra className for the content container */\n className?: string\n}\n\nexport function CoachMark({\n state,\n side = \"bottom\",\n align = \"center\",\n sideOffset = 12,\n nextLabel,\n skipLabel = \"Skip\",\n size,\n className,\n}: CoachMarkProps) {\n const spotlightMaskId = React.useId().replace(/:/g, \"\")\n const {\n isOpen,\n step,\n currentStep,\n totalSteps,\n isFlow,\n isFirst,\n isLast,\n next,\n prev,\n skip,\n anchorRect,\n } = state\n\n if (!isOpen || !step) return null\n if (!anchorRect) return null\n\n const titleId = `coach-mark-title-${step.id}`\n const descId = `coach-mark-desc-${step.id}`\n const hasImage = Boolean(step.image)\n const primaryLabel = nextLabel ?? (isLast ? \"Got it\" : \"Next\")\n const resolvedSide = step.side ?? side\n const resolvedAlign = step.align ?? align\n\n return (\n <>\n {/* Spotlight overlay */}\n <SpotlightOverlay rect={anchorRect} maskId={`coach-spotlight-${spotlightMaskId}`} />\n\n {/* Popover with virtual anchor */}\n <PopoverPrimitive.Root open>\n <PopoverPrimitive.Anchor\n virtualRef={{\n current: {\n getBoundingClientRect: () => ({\n x: anchorRect.x,\n y: anchorRect.y,\n top: anchorRect.y,\n left: anchorRect.x,\n bottom: anchorRect.y + anchorRect.height,\n right: anchorRect.x + anchorRect.width,\n width: anchorRect.width,\n height: anchorRect.height,\n toJSON: () => {},\n }),\n },\n }}\n />\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n data-slot=\"coach-mark\"\n side={resolvedSide}\n align={resolvedAlign}\n sideOffset={sideOffset}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onInteractOutside={(e) => e.preventDefault()}\n onEscapeKeyDown={() => skip()}\n aria-labelledby={titleId}\n aria-describedby={descId}\n className={cn(\n coachMarkVariants({ size }),\n /* animations */\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n \"data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2\",\n className\n )}\n >\n {/* Image (optional) */}\n {hasImage && (\n <CoachMarkImage\n src={step.image!}\n alt={step.imageAlt ?? step.title}\n />\n )}\n\n {/* Body */}\n <div className=\"flex flex-col gap-3 p-4\">\n {/* Title + close */}\n <div className=\"flex items-start gap-2\">\n <div className=\"flex-1 min-w-0\">\n <h3\n id={titleId}\n className=\"text-sm font-semibold text-white leading-snug\"\n >\n {step.title}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={skip}\n className=\"shrink-0 -mt-0.5 -me-1 flex h-6 w-6 items-center justify-center rounded-md text-white/60 hover:bg-white/15 hover:text-white transition-colors focus-visible:outline-2 focus-visible:outline-white hc:!text-foreground hc:hover:!bg-foreground/10\"\n aria-label=\"Dismiss\"\n >\n <i className=\"fa-light fa-xmark text-xs\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Description */}\n <p\n id={descId}\n className=\"text-sm text-white/80 leading-relaxed\"\n >\n {step.description}\n </p>\n\n {/* Footer: step indicator + actions */}\n <div className=\"flex items-center justify-between gap-3 pt-1\">\n {/* Left: step dots (flow only) */}\n <div className=\"flex-1\">\n {isFlow && (\n <CoachMarkStepIndicator\n current={currentStep}\n total={totalSteps}\n />\n )}\n </div>\n\n {/* Right: buttons */}\n <div className=\"flex items-center gap-2 shrink-0\">\n {isFlow && !isLast && (\n <button\n type=\"button\"\n onClick={skip}\n className=\"h-8 px-3 text-xs font-medium text-white/60 hover:text-white transition-colors rounded-md focus-visible:outline-2 focus-visible:outline-white hc:!text-foreground hc:hover:!text-foreground/80\"\n >\n {skipLabel}\n </button>\n )}\n {isFlow && !isFirst && (\n <button\n type=\"button\"\n onClick={prev}\n className=\"inline-flex items-center gap-1.5 h-8 px-3 text-xs font-medium text-white bg-white/15 hover:bg-white/25 rounded-md border border-white/20 transition-colors focus-visible:outline-2 focus-visible:outline-white hc:!bg-background hc:!text-foreground hc:!border-foreground\"\n >\n <i className=\"fa-light fa-arrow-left text-xs\" aria-hidden=\"true\" />\n Back\n </button>\n )}\n <button\n type=\"button\"\n onClick={next}\n className=\"inline-flex items-center gap-1.5 h-8 px-3 text-xs font-medium text-brand-deep bg-white hover:bg-white/90 rounded-md transition-colors focus-visible:outline-2 focus-visible:outline-white hc:!bg-foreground hc:!text-background hc:border hc:border-foreground\"\n >\n {primaryLabel}\n {isFlow && !isLast && (\n <i className=\"fa-light fa-arrow-right text-xs\" aria-hidden=\"true\" />\n )}\n </button>\n </div>\n </div>\n </div>\n\n {/* Arrow */}\n <PopoverPrimitive.Arrow\n className=\"fill-brand-deep drop-shadow-sm hc:fill-background\"\n width={12}\n height={6}\n />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n </>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\n\nimport { cn } from \"../../lib/utils\"\nimport {\n InputGroup,\n InputGroupAddon,\n} from \"./input-group\"\nimport { SearchIcon, CheckIcon } from \"lucide-react\"\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n \"flex size-full flex-col overflow-hidden rounded-xl! bg-popover p-1 text-popover-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = \"Command Palette\",\n description = \"Search for a command to run...\",\n children,\n className,\n overlayClassName,\n showCloseButton: _showCloseButton = false,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root> & {\n title?: string\n description?: string\n className?: string\n /** Backdrop — default is invisible (no dim/blur) but still captures outside clicks for modal behavior */\n overlayClassName?: string\n showCloseButton?: boolean\n}) {\n return (\n <DialogPrimitive.Root {...props}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-transparent data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n overlayClassName,\n )}\n />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"fixed top-[max(1rem,8vh)] start-1/2 z-50 w-full max-w-[min(42rem,calc(100%-2rem))] -translate-x-1/2 rtl:translate-x-1/2 overflow-hidden rounded-xl bg-popover p-0 text-popover-foreground ring-1 ring-foreground/10 shadow-lg sm:max-w-3xl md:max-w-4xl data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n >\n <DialogPrimitive.Title className=\"sr-only\">{title}</DialogPrimitive.Title>\n <DialogPrimitive.Description className=\"sr-only\">{description}</DialogPrimitive.Description>\n {children}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n )\n}\n\nconst CommandInput = React.forwardRef<\n HTMLInputElement,\n React.ComponentProps<typeof CommandPrimitive.Input> & {\n /**\n * `palette` — flat header row (icon + field) for ⌘K dialogs; matches blocks.so command-menu-02.\n * `default` — pill `InputGroup` for embedded / library previews.\n */\n variant?: \"default\" | \"palette\"\n }\n>(function CommandInput({ className, variant = \"default\", ...props }, ref) {\n if (variant === \"palette\") {\n return (\n <div data-slot=\"command-input-wrapper\" className=\"min-w-0 flex-1\">\n <div className=\"flex min-h-10 w-full items-center gap-2\">\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" aria-hidden />\n <CommandPrimitive.Input\n ref={ref}\n data-slot=\"command-input\"\n className={cn(\n // cmdk keeps DOM focus here; rows use accent fill (not rings) so this can match `Input` focus without doubling ring-on-ring with items.\n \"flex h-10 w-full min-w-0 flex-1 border-0 bg-transparent p-0 text-[15px] leading-normal text-foreground shadow-none outline-none ring-0 placeholder:text-muted-foreground focus:outline-none focus-visible:border-transparent focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n </div>\n </div>\n )\n }\n\n return (\n <div data-slot=\"command-input-wrapper\" className=\"p-1 pb-0\">\n <InputGroup className=\"h-8! rounded-lg! border-input/30 bg-input/30 shadow-none! *:data-[slot=input-group-addon]:ps-2!\">\n <CommandPrimitive.Input\n ref={ref}\n data-slot=\"command-input\"\n className={cn(\n \"w-full text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n />\n <InputGroupAddon>\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n </InputGroupAddon>\n </InputGroup>\n </div>\n )\n})\nCommandInput.displayName = \"CommandInput\"\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n \"no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className={cn(\"py-6 text-center text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n \"overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn(\"-mx-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n // Match popover lists (e.g. DropdownMenuItem): accent surface for hover + cmdk selection — same ring language as sidebar rows (ring-ring) is avoided here so input + row don’t read as double focus.\n // NOTE: cmdk sets `data-selected=\"false\"` on every item and `=\"true\"` only on the highlighted one.\n // Tailwind v4's bare `data-selected:` variant matches attribute PRESENCE, so it applies to every\n // item — in HC mode, accent resolves to brand purple and every row looks selected. Match `=true`\n // explicitly. Also dial HC selection to a border+ring affordance so the palette stays readable\n // when only one row is truly active.\n \"group/command-item relative flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-hidden ring-ring transition-colors select-none in-data-[slot=dialog-content]:rounded-lg! data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 hover:bg-accent hover:text-accent-foreground data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[selected=true]:*:[svg]:text-accent-foreground hc:data-[selected=true]:ring-2 hc:data-[selected=true]:ring-ring hc:data-[selected=true]:ring-inset forced-colors:data-[selected=true]:bg-[Highlight] forced-colors:data-[selected=true]:text-[HighlightText]\",\n className\n )}\n {...props}\n >\n {children}\n <CheckIcon className=\"ms-auto opacity-0 group-has-data-[slot=command-shortcut]/command-item:hidden group-data-[checked=true]/command-item:opacity-100\" />\n </CommandPrimitive.Item>\n )\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n \"ms-auto text-xs tracking-widest text-muted-foreground group-data-[selected=true]/command-item:text-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n}\n","\"use client\"\n\n/**\n * ContextMenu — right-click + long-press menu surface backed by Radix\n * `ContextMenu`. Visual surface mirrors `DropdownMenu` so the two read as\n * a consistent menu family across the product (same item heights, same\n * tints, same separator + label rhythm).\n *\n * Use for **secondary, contextual actions** on a specific row, card, or\n * editable region — duplicate, rename, archive, copy link. The primary\n * action SHOULD still be reachable by click / keyboard via a visible\n * trigger; the context menu is an accelerator, not a replacement.\n *\n * Accessibility:\n * - Radix handles the right-click trigger, long-press on touch, the\n * `aria-haspopup` / `aria-expanded` wiring, and arrow-key navigation\n * between items.\n * - Items announce as `role=\"menuitem\"`; `CheckboxItem` and `RadioItem`\n * expose checked / selected state correctly.\n * - Pair with a visible alternative (a `…` overflow `DropdownMenu`) so\n * keyboard-only users can reach the same actions without a pointer.\n */\n\nimport * as React from \"react\"\nimport { ContextMenu as ContextMenuPrimitive } from \"radix-ui\"\nimport { ChevronRight } from \"lucide-react\"\n\nimport { cn } from \"../../lib/utils\"\nimport { DROPDOWN_MENU_CONTENT_SURFACE_CLASS } from \"../../lib/dropdown-menu-surface\"\n\nfunction ContextMenu({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />\n}\n\nfunction ContextMenuTrigger({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return (\n <ContextMenuPrimitive.Trigger\n data-slot=\"context-menu-trigger\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />\n}\n\nfunction ContextMenuPortal({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return (\n <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />\n )\n}\n\nfunction ContextMenuSub({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />\n}\n\nfunction ContextMenuRadioGroup({\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return (\n <ContextMenuPrimitive.RadioGroup\n data-slot=\"context-menu-radio-group\"\n {...props}\n />\n )\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground data-inset:ps-7 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ms-auto size-4 text-muted-foreground\" aria-hidden=\"true\" />\n </ContextMenuPrimitive.SubTrigger>\n )\n}\n\nfunction ContextMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\n \"z-50 min-w-32 origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuContent({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Content>) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\n \"z-50 max-h-(--radix-context-menu-content-available-height) origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n DROPDOWN_MENU_CONTENT_SURFACE_CLASS,\n className,\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n )\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean\n variant?: \"default\" | \"destructive\"\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:ps-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"context-menu-checkbox-item-indicator\"\n >\n <ContextMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n )\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n data-inset={inset}\n className={cn(\n \"relative flex cursor-default items-center gap-1.5 rounded-md py-1 pe-8 ps-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:ps-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_i]:pointer-events-none [&_svg]:shrink-0 [&_i]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span\n className=\"pointer-events-none absolute end-2 flex items-center justify-center\"\n data-slot=\"context-menu-radio-item-indicator\"\n >\n <ContextMenuPrimitive.ItemIndicator>\n <i className=\"fa-light fa-check\" aria-hidden=\"true\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n )\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean\n}) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn(\n \"px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:ps-7\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction ContextMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n )\n}\n\nfunction ContextMenuShortcut({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn(\n \"ms-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioGroup,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Drawer({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Root>) {\n return <DrawerPrimitive.Root data-slot=\"drawer\" {...props} />\n}\n\nfunction DrawerTrigger({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Trigger>) {\n return <DrawerPrimitive.Trigger data-slot=\"drawer-trigger\" {...props} />\n}\n\nfunction DrawerPortal({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Portal>) {\n return <DrawerPrimitive.Portal data-slot=\"drawer-portal\" {...props} />\n}\n\nfunction DrawerClose({\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Close>) {\n return <DrawerPrimitive.Close data-slot=\"drawer-close\" {...props} />\n}\n\nfunction DrawerOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Overlay>) {\n return (\n <DrawerPrimitive.Overlay\n data-slot=\"drawer-overlay\"\n className={cn(\n \"fixed inset-0 z-50 bg-overlay duration-300 ease-out supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Content>) {\n return (\n <DrawerPortal data-slot=\"drawer-portal\">\n <DrawerOverlay />\n <DrawerPrimitive.Content\n data-slot=\"drawer-content\"\n className={cn(\n \"group/drawer-content fixed z-50 flex h-auto flex-col bg-background text-sm duration-300 ease-out outline-none data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-xl data-[vaul-drawer-direction=bottom]:border-t data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:start-0 data-[vaul-drawer-direction=left]:w-3/4 data-[vaul-drawer-direction=left]:rounded-e-xl data-[vaul-drawer-direction=left]:border-e data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:end-0 data-[vaul-drawer-direction=right]:w-3/4 data-[vaul-drawer-direction=right]:rounded-s-xl data-[vaul-drawer-direction=right]:border-s data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-xl data-[vaul-drawer-direction=top]:border-b data-[vaul-drawer-direction=left]:sm:max-w-sm data-[vaul-drawer-direction=right]:sm:max-w-sm\",\n className\n )}\n {...props}\n >\n <div className=\"mx-auto mt-4 hidden h-1 w-[100px] shrink-0 rounded-full bg-muted group-data-[vaul-drawer-direction=bottom]/drawer-content:block\" />\n {children}\n </DrawerPrimitive.Content>\n </DrawerPortal>\n )\n}\n\nfunction DrawerHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-header\"\n className={cn(\n \"flex flex-col gap-0.5 p-4 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-0.5 md:text-start\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"drawer-footer\"\n className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n {...props}\n />\n )\n}\n\nfunction DrawerTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Title>) {\n return (\n <DrawerPrimitive.Title\n data-slot=\"drawer-title\"\n className={cn(\n \"font-heading text-base font-medium text-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DrawerDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Description>) {\n return (\n <DrawerPrimitive.Description\n data-slot=\"drawer-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Drawer,\n DrawerPortal,\n DrawerOverlay,\n DrawerTrigger,\n DrawerClose,\n DrawerContent,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n}\n","\"use client\"\n\n/**\n * HoverCard — richer, persistent hover surface for content too large or\n * interactive for a `Tooltip` (avatars, link previews, user cards, glossary\n * entries).\n *\n * When to choose `HoverCard` vs `Tooltip` vs `Popover`:\n * - **`Tooltip`** — short text label, no interaction, auto-dismiss on\n * mouseout / blur. Pairs with `Tip` for icon-only buttons.\n * - **`HoverCard`** — small interactive content (links, copy buttons,\n * avatars) shown on intentional hover; closes when the pointer leaves.\n * Not focusable / not announced by screen readers — pair with an\n * accessible alternative for keyboard users (visit profile link, etc.).\n * - **`Popover`** — keyboard- and screen-reader-accessible, opens on\n * explicit click. Use this when the surface holds primary content.\n *\n * Accessibility (per Radix):\n * - HoverCard is NOT exposed to screen readers — Radix intentionally\n * treats it as a sighted-mouse-user affordance. The trigger MUST also\n * convey its meaning through its own accessible name and behaviour\n * (e.g. a focusable `<a>` that links to the same content).\n */\n\nimport * as React from \"react\"\nimport { HoverCard as HoverCardPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction HoverCard({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) {\n return <HoverCardPrimitive.Root data-slot=\"hover-card\" {...props} />\n}\n\nfunction HoverCardTrigger({\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Trigger>) {\n return (\n <HoverCardPrimitive.Trigger data-slot=\"hover-card-trigger\" {...props} />\n )\n}\n\nfunction HoverCardContent({\n className,\n align = \"center\",\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Content>) {\n return (\n <HoverCardPrimitive.Portal data-slot=\"hover-card-portal\">\n <HoverCardPrimitive.Content\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-64 origin-(--radix-hover-card-content-transform-origin) rounded-lg bg-popover p-4 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-none data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n )\n}\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch\",\n className,\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","\"use client\"\n\nimport { useMemo } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Label } from \"./label\"\nimport { Separator } from \"./separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-4 has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-1.5 font-medium data-[variant=label]:text-sm data-[variant=legend]:text-base\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-5 data-[slot=checkbox-group]:gap-3 *:data-[slot=field-group]:gap-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n \"group/field flex w-full gap-2 data-[invalid=true]:text-destructive\",\n {\n variants: {\n orientation: {\n vertical: \"flex-col *:w-full [&>.sr-only]:w-auto\",\n horizontal:\n \"flex-row items-center has-[>[data-slot=field-content]]:items-start *:data-[slot=field-label]:flex-auto has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n responsive:\n \"flex-col *:w-full @md/field-group:flex-row @md/field-group:items-center @md/field-group:*:w-auto @md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:*:data-[slot=field-label]:flex-auto [&>.sr-only]:w-auto @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"group/field-content flex flex-1 flex-col gap-0.5 leading-snug\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50 has-data-checked:border-primary/30 has-data-checked:bg-primary/5 has-[>[data-slot=field]]:rounded-lg has-[>[data-slot=field]]:border *:data-[slot=field]:p-2.5 dark:has-data-checked:border-primary/20 dark:has-data-checked:bg-primary/10\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-start text-sm leading-normal font-normal text-muted-foreground group-has-data-horizontal/field:text-balance [[data-variant=legend]+&]:-mt-1.5\",\n \"last:mt-0 nth-last-2:-mt-1\",\n \"[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"relative mx-auto block w-fit bg-background px-2 text-muted-foreground\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ms-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-sm font-normal text-destructive\", className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n","\"use client\"\n\n/**\n * Credit card inputs — matches Shadcn Studio input-mask 03–06 (`react-payment-inputs` + `Input`).\n * One `usePaymentInputs()` instance drives number + expiry + CVC; use this group (or `usePaymentInputs` yourself in a parent).\n */\n\nimport * as React from \"react\"\nimport { CreditCard } from \"lucide-react\"\nimport { usePaymentInputs } from \"react-payment-inputs\"\nimport images, { type CardImages } from \"react-payment-inputs/images\"\n\nimport { cn } from \"../../lib/utils\"\nimport { Input } from \"./input\"\n\nexport { usePaymentInputs } from \"react-payment-inputs\"\nexport type { CardImages }\n\n/** Stacked number + expiry/CVC (Studio 06). Single hook — do not split across separate roots. */\nexport function PaymentCardFieldsGroup({ className }: { className?: string }) {\n const id = React.useId()\n const { meta, getCardNumberProps, getExpiryDateProps, getCVCProps, getCardImageProps } =\n usePaymentInputs()\n\n return (\n <div className={cn(\"w-full max-w-xs space-y-0\", className)}>\n <div className=\"relative focus-within:z-1\">\n <Input\n {...getCardNumberProps()}\n id={`card-number-${id}`}\n className=\"peer rounded-b-none pe-11 shadow-none\"\n />\n <div className=\"text-muted-foreground pointer-events-none absolute inset-y-0 end-0 flex items-center justify-center pe-3 peer-disabled:opacity-50\">\n {meta.cardType ? (\n <svg\n className=\"w-6 overflow-hidden\"\n {...getCardImageProps({\n images: images as unknown as CardImages,\n })}\n />\n ) : (\n <CreditCard className=\"size-4\" aria-hidden />\n )}\n <span className=\"sr-only\">Card network</span>\n </div>\n </div>\n <div className=\"-mt-px flex\">\n <div className=\"min-w-0 flex-1 focus-within:z-1\">\n <Input\n {...getExpiryDateProps()}\n id={`card-expiry-${id}`}\n className=\"rounded-t-none rounded-e-none shadow-none\"\n />\n </div>\n <div className=\"-ms-px min-w-0 flex-1 focus-within:z-1\">\n <Input\n {...getCVCProps()}\n id={`card-cvc-${id}`}\n className=\"rounded-t-none rounded-s-none shadow-none\"\n />\n </div>\n </div>\n </div>\n )\n}\n","\"use client\"\n\n/**\n * KeyMetricsProvider — host-app injection point for the design-system\n * `KeyMetrics` component.\n *\n * `KeyMetrics` itself ships as a pure primitive: it knows how to render\n * a KPI strip, an insight rail, and a default insight CTA, but it does\n * NOT know anything about the host app's AI assistant, command palette,\n * or keyboard-shortcut registry.\n *\n * Consumers (e.g. `apps/web`) mount a `KeyMetricsProvider` near the root\n * of the app and supply two optional injection points:\n *\n * - `defaultInsightAction` — fired when the user clicks the default\n * \"Ask Leo about these metrics\" button in the card-variant header,\n * and the default insight CTA when an individual `MetricInsight` did\n * not supply its own `onAction`. When omitted, the default button is\n * hidden entirely so the primitive stays useful in apps without an\n * AI assistant.\n *\n * - `shortcutHint` — inline React node rendered inside the tooltip\n * alongside the action label (typically a keyboard chord such as\n * `<Kbd>⌘⌥K</Kbd>`). When omitted, the tooltip simply shows the\n * label.\n *\n * - `defaultActionLabel` — visible label + accessible name for the\n * default action button. Defaults to \"Ask Leo\" so the existing\n * Exxat-DS layout reads identically without any consumer changes.\n *\n * This is the SAME injection shape used by Adobe Spectrum\n * (`Provider`-based service injection) and Material UI (`Theme`\n * context). It lets the design-system package ship product patterns\n * without taking on a hard dependency on the host app's AI surface.\n */\n\nimport * as React from \"react\"\n\nexport interface KeyMetricsContextValue {\n /** Click handler for the default \"Ask Leo about these metrics\" CTA. */\n defaultInsightAction?: () => void\n /** Inline kbd chord (or any node) rendered next to the action label inside the tooltip. */\n shortcutHint?: React.ReactNode\n /** Label + aria-label for the default insight action button. Defaults to \"Ask Leo\". */\n defaultActionLabel?: string\n}\n\nconst KeyMetricsContext = React.createContext<KeyMetricsContextValue>({})\n\n/** Read the active `KeyMetricsProvider` value. Returns an empty object if no provider is mounted. */\nexport function useKeyMetricsContext(): KeyMetricsContextValue {\n return React.useContext(KeyMetricsContext)\n}\n\nexport function KeyMetricsProvider({\n value,\n children,\n}: {\n value: KeyMetricsContextValue\n children: React.ReactNode\n}) {\n // Memoize the wrapper so consumers passing fresh object identities\n // (common in client components) do not invalidate every descendant\n // that reads the context.\n const memo = React.useMemo<KeyMetricsContextValue>(\n () => ({\n defaultInsightAction: value.defaultInsightAction,\n shortcutHint: value.shortcutHint,\n defaultActionLabel: value.defaultActionLabel,\n }),\n [value.defaultInsightAction, value.shortcutHint, value.defaultActionLabel],\n )\n return (\n <KeyMetricsContext.Provider value={memo}>\n {children}\n </KeyMetricsContext.Provider>\n )\n}\n","\"use client\"\n\n/**\n * KeyMetrics — WCAG 2.1 AA reusable KPI panel\n *\n * Variants:\n * \"card\" (default) — shadcn Card wrapper with brand gradient fill\n * \"flat\" — full-width soft tint band (brand-tint → background) + bottom glow, no card chrome\n *\n * AA checklist:\n * ✓ Trend text never relies on colour alone — icon + label (WCAG 1.4.1)\n * ✓ `trend` matches signed change; `trendPolarity` flips sentiment when “up” is bad (see `docs/kpi-trend-pattern.md`)\n * ✓ Trend icons have aria-hidden; chip `aria-label` uses `metricTrendAriaQualifier` (1.1.1)\n * ✓ Select has accessible label via aria-label (4.1.2)\n * ✓ Insight action button has descriptive text (4.1.2)\n * ✓ Decorative dividers are aria-hidden (1.1.1)\n * ✓ Contrast: value text foreground ≥ 17:1, trend colours ≥ 4.5:1 (1.4.3)\n */\n\nimport * as React from \"react\"\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from \"./card\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\"\nimport { Separator } from \"./separator\"\nimport { Button } from \"./button\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./tooltip\"\nimport { cn } from \"../../lib/utils\"\nimport { useKeyMetricsContext } from \"./key-metrics-context\"\n\nexport {\n KeyMetricsProvider,\n useKeyMetricsContext,\n type KeyMetricsContextValue,\n} from \"./key-metrics-context\"\n\n/**\n * Tooltip around the default insight CTA. Renders the shortcut hint\n * injected by `KeyMetricsProvider` (typically `⌘⌥K` for Ask Leo) when\n * the CTA still uses the default action label — i.e. the consumer did\n * NOT override `actionLabel` on the individual `MetricInsight`. Any\n * custom `actionLabel` (\"Open ticket\", \"Acknowledge\", …) suppresses\n * the shortcut hint since it no longer maps to the default chord.\n */\nfunction InsightDefaultTooltip({\n actionLabel,\n children,\n}: {\n actionLabel?: string\n children: React.ReactNode\n}) {\n const { shortcutHint, defaultActionLabel = \"Ask Leo\" } = useKeyMetricsContext()\n const label = actionLabel ?? defaultActionLabel\n const showShortcut =\n !!shortcutHint && (!actionLabel || actionLabel === defaultActionLabel)\n if (!showShortcut) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side=\"top\">{label}</TooltipContent>\n </Tooltip>\n )\n }\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent side=\"top\" className=\"flex flex-wrap items-center gap-1.5\">\n <span>{label}</span>\n {shortcutHint}\n </TooltipContent>\n </Tooltip>\n )\n}\n\n/* ── Types ────────────────────────────────────────────────────────────────── */\n\n/**\n * Whether an **up** arrow should read as “good news” for tinting and assistive text.\n * - **`higher_is_better`** (default) — revenue, pass rate, approved count: up = favorable.\n * - **`lower_is_better`** — defects, overdue, **low PBI / quality flags**: more flags + up arrow = unfavorable.\n * - **`informational`** — volume or mix only; keep arrows **muted** (direction without value judgment).\n */\nexport type MetricTrendPolarity = \"higher_is_better\" | \"lower_is_better\" | \"informational\"\n\nexport type MetricTrendTone = \"positive\" | \"negative\" | \"muted\"\n\n/** Maps `trend` + polarity to semantic tone for colours (arrow direction still follows `trend`). */\nexport function metricTrendTone(\n trend: \"up\" | \"down\" | \"neutral\",\n polarity: MetricTrendPolarity = \"higher_is_better\",\n): MetricTrendTone {\n if (trend === \"neutral\") return \"muted\"\n if (polarity === \"informational\") return \"muted\"\n if (polarity === \"higher_is_better\") {\n return trend === \"up\" ? \"positive\" : \"negative\"\n }\n return trend === \"up\" ? \"negative\" : \"positive\"\n}\n\n/** Short clause for `aria-label` on the trend chip (paired with the delta string). */\nexport function metricTrendAriaQualifier(\n trend: \"up\" | \"down\" | \"neutral\",\n polarity: MetricTrendPolarity = \"higher_is_better\",\n): string {\n if (trend === \"neutral\") return \"no net change\"\n if (polarity === \"informational\") {\n return trend === \"up\" ? \"increased\" : \"decreased\"\n }\n if (polarity === \"higher_is_better\") {\n return trend === \"up\" ? \"increased, favorable\" : \"decreased, unfavorable\"\n }\n return trend === \"up\" ? \"increased, unfavorable\" : \"decreased, favorable\"\n}\n\nexport interface MetricItem {\n /** Unique identifier for React keying */\n id: string\n /** Short label shown above the value */\n label: string\n /** Displayed value — e.g. \"23\", \"98%\", \"1,250\" */\n value: string | number\n /**\n * Change **count** for the trend chip — e.g. `\"+5\"`, `\"-3\"`, `\"+12%\"`.\n *\n * Pass an **empty string** (or `0`) when there is no comparison delta to show.\n * In that case the **trend chip is hidden entirely** (the previous `—` placeholder\n * is dropped) — see `MetricCell`. Put contextual prose like\n * `\"left + right\"` / `\"vs last week\"` in `description`, **never** here.\n */\n delta: string | number\n /**\n * Visual trend direction (arrow follows the signed change in the underlying metric).\n * `\"neutral\"` paired with an empty `delta` suppresses the chip — use `description`\n * for any caption you want to show below the value instead.\n */\n trend: \"up\" | \"down\" | \"neutral\"\n /**\n * Optional short caption rendered **below** the value + trend row (muted, small).\n * Use for **what** the number means or **how** it breaks down\n * (e.g. `\"left + right\"`, `\"vs last week\"`, `\"across 4 sites\"`) — NOT for delta counts.\n */\n description?: string\n /**\n * How to **tint** the trend chip. Omit = **`higher_is_better`** (legacy behaviour).\n * Arrows always match `trend`; sentiment colours flip for **`lower_is_better`**.\n */\n trendPolarity?: MetricTrendPolarity\n /** Makes the cell a link */\n href?: string\n /** Makes the cell a button */\n onClick?: () => void\n /**\n * \"hero\" — primary KPI (e.g. total count): larger value, same structure as siblings.\n * \"default\" — standard KPI strip cell.\n */\n metricVariant?: \"default\" | \"hero\"\n}\n\nexport interface MetricInsight {\n /** Optional single line for custom copy; rail prefers `title` + `description` when both are set */\n statement?: string\n /** Card headline */\n title: string\n /** Supporting body copy */\n description?: string\n /** Optional deep-link for the ↗ button */\n href?: string\n /** CTA label — defaults to \"Ask Leo\" */\n actionLabel?: string\n /** Font Awesome class for the CTA icon — defaults to fa-wand-magic-sparkles */\n actionIcon?: string\n /** Callback for the CTA button */\n onAction?: () => void\n /** Severity determines the badge colour (default: warning) */\n severity?: \"warning\" | \"info\" | \"error\"\n}\n\nexport interface PeriodOption {\n value: string\n label: string\n}\n\nexport interface KeyMetricsProps {\n /**\n * \"card\" — shadcn Card with brand gradient (default)\n * \"flat\" — full-width gradient band, no card chrome\n */\n variant?: \"card\" | \"flat\" | \"compact\"\n /** Panel title */\n title?: string\n /** Subtitle / description below title */\n description?: string\n /** Array of KPI items — by default split into rows of 3 */\n metrics: MetricItem[]\n /** When true, all metrics share one horizontal row (md+ and compact mobile grid) */\n metricsSingleRow?: boolean\n /**\n * When true with `metricsSingleRow`, use a 2-column KPI grid so half-width dashboard cards\n * fit 1–4 KPIs without horizontal overflow (pair rows on md+; 2-col grid on small screens).\n * The insight rail (if any) stacks below the KPI grid instead of sitting beside it on md+.\n */\n metricsHalfWidthLayout?: boolean\n /** Optional insight card — see `insightFullWidth` */\n insight?: MetricInsight\n /**\n * When true, the insight sits on its own full-width row under the metrics (not a narrow side rail).\n */\n insightFullWidth?: boolean\n /** Comparison-period options for the Select */\n periods?: PeriodOption[]\n /** Initially-selected period value */\n defaultPeriod?: string\n /** Called with the new period value when the Select changes */\n onPeriodChange?: (period: string) => void\n /** When false, hides the title/description/period-selector header row (default: true) */\n showHeader?: boolean\n /**\n * Tighter insight card: one short title + line of body, no vertical filler;\n * aligns visually with a single-row KPI band.\n */\n insightCompact?: boolean\n className?: string\n}\n\n/**\n * KPI grid column step patterns — Tailwind v4 container-query classes.\n *\n * We deliberately AVOID `repeat(auto-fit, minmax(...))` here because it\n * produces awkward \"N + leftover\" layouts at intermediate widths (e.g. 3\n * tiles in row 1 + 1 lonely tile in row 2 for a 4-KPI strip). Instead we\n * step the column count through values that evenly divide the row size:\n * 1 → 2 → 4 for a 4-KPI strip (3 is skipped on purpose).\n *\n * The breakpoints are container-query based (`@[Xrem]:…`) so they react to\n * the metrics strip's OWN width, not the viewport — that's what makes the\n * 2×2 fallback kick in when the primary sidebar + secondary panel are\n * both open and the strip column is ~360 px wide, even on a 1280 px display.\n *\n * `metricsHalfWidthLayout` = strip shares its row with the insight rail\n * (3fr / 2fr split). Tighter breakpoints because available width is ~60%\n * of the section.\n */\n/**\n * Flat KPI hairlines — cell borders only (no grid gap fill / no surface).\n * Four tiles: default 4-across verticals; 2×2 hairlines only when @container is narrow.\n */\nfunction flatMetricsHairlineClass(\n itemCount: number,\n metricsHalfWidthLayout: boolean,\n): string {\n if (itemCount <= 1) return \"gap-0\"\n\n const childBorder = \"[&>*]:border-[color:var(--key-metrics-flat-divider)]\"\n\n if (itemCount === 2) {\n return cn(\"gap-0\", childBorder, \"[&>*:first-child]:border-r\")\n }\n\n if (itemCount === 4) {\n const narrow2x2 = metricsHalfWidthLayout\n ? \"@[max-width:25.99rem]\"\n : \"@[max-width:29.99rem]\"\n return cn(\n \"gap-0\",\n childBorder,\n /* Wide strip (matches `@[30rem]:grid-cols-4`) — verticals between all tiles, no horizontal */\n \"[&>*:not(:last-child)]:border-r\",\n /* Narrow strip (`@[18rem]`–`@[30rem]` 2×2) */\n `${narrow2x2}:[&>*:not(:last-child)]:border-e-0`,\n `${narrow2x2}:[&>*:nth-child(odd)]:border-r`,\n `${narrow2x2}:[&>*:not(:nth-last-child(-n+2))]:border-b`,\n )\n }\n\n return cn(\"gap-0\", childBorder, \"[&>*:not(:last-child)]:border-r\")\n}\n\nfunction metricsRowColumnsClass(rowLength: number, metricsHalfWidthLayout: boolean): string {\n const half = metricsHalfWidthLayout\n switch (rowLength) {\n case 1:\n return \"grid-cols-1\"\n case 2:\n return half\n ? \"grid-cols-1 @[14rem]:grid-cols-2\"\n : \"grid-cols-1 @[18rem]:grid-cols-2\"\n case 3:\n // 3 tiles divide evenly already — step 1 → 3.\n return half\n ? \"grid-cols-1 @[18rem]:grid-cols-3\"\n : \"grid-cols-1 @[24rem]:grid-cols-3\"\n case 4:\n // Step 1 → 2 (2×2 grid) → 4. Skip 3 — that's the awkward 3+1 layout.\n // Aggressive 4-col thresholds so the strip fits all four tiles even\n // when the primary sidebar + secondary panel + insight rail are all\n // expanded (typical question-bank layout puts the KPI grid at ~27rem).\n return half\n ? \"grid-cols-1 @[14rem]:grid-cols-2 @[26rem]:grid-cols-4\"\n : \"grid-cols-1 @[18rem]:grid-cols-2 @[30rem]:grid-cols-4\"\n default:\n // 5+ KPIs (`exxat-kpi-max-four` caps the strip at 4, but key-metrics\n // is a generic primitive — fall back to a sensible step). 1 → 2 → 3 → 6.\n return half\n ? \"grid-cols-1 @[14rem]:grid-cols-2 @[26rem]:grid-cols-3 @[40rem]:grid-cols-6\"\n : \"grid-cols-1 @[18rem]:grid-cols-2 @[30rem]:grid-cols-3 @[56rem]:grid-cols-6\"\n }\n}\n\n/* ── Default data ─────────────────────────────────────────────────────────── */\n\nconst DEFAULT_PERIODS: PeriodOption[] = [\n { value: \"week\", label: \"vs last week\" },\n { value: \"month\", label: \"vs last month\" },\n { value: \"quarter\", label: \"vs last quarter\" },\n { value: \"year\", label: \"vs last year\" },\n]\n\n/* ── Sub-components ───────────────────────────────────────────────────────── */\n\n/** Single KPI cell inside the metrics grid */\nconst MetricCell = React.memo(function MetricCell({\n label,\n value,\n delta,\n trend,\n trendPolarity = \"higher_is_better\",\n description,\n href,\n onClick,\n metricVariant = \"default\",\n dense = false,\n edgeGutter = true,\n}: Omit<MetricItem, \"id\"> & { dense?: boolean; edgeGutter?: boolean }) {\n const isUp = trend === \"up\"\n const isDown = trend === \"down\"\n const tone = metricTrendTone(trend, trendPolarity)\n const isInteractive = !!(href || onClick)\n const isHero = metricVariant === \"hero\"\n\n // Hide the trend chip entirely when there's no direction *and* no count to\n // surface. This avoids the noisy `—` placeholder for purely informational\n // metrics — see `docs/kpi-trend-pattern.md`.\n const deltaText = typeof delta === \"number\"\n ? (delta === 0 ? \"\" : String(delta))\n : String(delta ?? \"\").trim()\n const showTrendChip = isUp || isDown || deltaText.length > 0\n\n const inner = (\n <>\n {/* Label row — min-height = 2 lines so values align when some titles wrap */}\n <div\n className={cn(\n \"grid grid-cols-[minmax(0,1fr)_auto] items-start gap-x-2 gap-y-0.5\",\n dense ? \"min-h-[2.125rem]\" : \"min-h-[2.625rem]\",\n )}\n >\n <p\n className={cn(\n \"min-w-0 text-muted-foreground leading-snug wrap-break-word\",\n dense ? \"text-xs\" : \"text-sm\",\n isHero && \"font-medium\",\n )}\n >\n {label}\n </p>\n {isInteractive ? (\n <span className=\"mt-0.5 inline-flex shrink-0\" aria-hidden=\"true\">\n <i className=\"fa-light fa-arrow-right text-xs text-foreground/70 transition-colors duration-150 group-hover:text-interactive-hover-foreground sm:group-hover:translate-x-0.5\" />\n </span>\n ) : null}\n </div>\n\n {/* Value + trend badge */}\n <div className=\"flex items-baseline gap-2 flex-wrap\">\n <span\n className={cn(\n \"font-bold tabular-nums leading-none text-foreground\",\n dense\n ? isHero\n ? \"text-lg sm:text-xl\"\n : \"text-base sm:text-lg\"\n : isHero\n ? \"text-2xl sm:text-[1.625rem]\"\n : \"text-xl sm:text-2xl\",\n )}\n >\n {value}\n </span>\n\n {/* Trend chip — icon + count, never colour-only (WCAG 1.4.1).\n Suppressed when both `trend === \"neutral\"` and `delta` is empty\n (see `showTrendChip` above) so informational KPIs render cleanly. */}\n {showTrendChip && (\n <span\n className={cn(\n \"inline-flex items-center gap-1 font-medium leading-none\",\n dense ? \"text-xs sm:text-xs\" : \"text-xs sm:text-sm\",\n tone === \"positive\" && \"text-chart-2\",\n tone === \"negative\" && \"text-destructive\",\n tone === \"muted\" && \"text-muted-foreground\",\n )}\n aria-label={`${metricTrendAriaQualifier(trend, trendPolarity)} ${deltaText}`.trim()}\n >\n {isUp && <i className=\"fa-light fa-arrow-trend-up text-[0.8rem]\" aria-hidden=\"true\" />}\n {isDown && <i className=\"fa-light fa-arrow-trend-down text-[0.8rem]\" aria-hidden=\"true\" />}\n {!isUp && !isDown && deltaText.length > 0 && (\n <i className=\"fa-light fa-minus text-[0.8rem]\" aria-hidden=\"true\" />\n )}\n {deltaText.length > 0 && <span>{deltaText}</span>}\n </span>\n )}\n </div>\n\n {/* Caption — below the value row. Use for what the number means or how\n it breaks down (e.g. \"left + right\", \"vs last week\"). Never the delta. */}\n {description ? (\n <p\n className={cn(\n \"min-w-0 text-muted-foreground leading-snug wrap-break-word\",\n dense ? \"text-[11px]\" : \"text-xs\",\n )}\n >\n {description}\n </p>\n ) : null}\n </>\n )\n\n const sharedClass = cn(\n \"group flex min-w-0 flex-col gap-2 text-start outline-none\",\n edgeGutter && \"first:ps-0 last:pe-0\",\n dense ? \"gap-1.5 px-2 py-2 sm:px-3 sm:py-3\" : \"gap-2 px-3 py-3 sm:px-5 sm:py-4\",\n isHero && \"gap-2.5\",\n isInteractive && [\n \"cursor-pointer transition-colors duration-150\",\n \"hover:bg-foreground/5\",\n \"focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n ]\n )\n\n if (href) {\n return (\n <a href={href} className={sharedClass} aria-label={`${label}: ${value}`}>\n {inner}\n </a>\n )\n }\n\n if (onClick) {\n return (\n <button type=\"button\" onClick={onClick} className={sharedClass} aria-label={`${label}: ${value}`}>\n {inner}\n </button>\n )\n }\n\n return <div className={sharedClass}>{inner}</div>\n})\n\n/** Body line for rail: `description`, else optional `statement` */\nfunction insightRailBody(insight: MetricInsight): string {\n const d = insight.description?.trim()\n if (d) return d\n return insight.statement?.trim() ?? \"\"\n}\n\n/**\n * Rail insight: severity badge + title + description + optional ↗, Ask Leo (no rule between copy and action).\n */\nfunction InsightRailStatementAction({\n insight,\n compact,\n}: {\n insight: MetricInsight\n compact: boolean\n}) {\n const badgeSize = compact ? \"sm\" : \"default\"\n const surface = compact\n ? \"border border-border/50 bg-gradient-to-b from-muted/35 to-card\"\n : \"bg-card\"\n const body = insightRailBody(insight)\n\n return (\n <Card\n role=\"region\"\n aria-label=\"Insight\"\n className={cn(\n \"flex h-full min-h-0 flex-col overflow-hidden rounded-lg border-0 p-0 shadow-none ring-1 ring-foreground/8\",\n surface\n )}\n >\n {/* flex-1 + mt-auto on the CTA: copy stays top-aligned when the rail stretches to KPI height */}\n <div className=\"flex min-h-0 flex-1 flex-col px-3 py-3 sm:px-4 sm:py-4\">\n <div className=\"flex items-start gap-2.5\">\n <InsightBadge severity={insight.severity} size={badgeSize} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold leading-snug text-foreground\">{insight.title}</p>\n {body ? (\n <p className=\"mt-1 text-sm leading-snug text-muted-foreground\">{body}</p>\n ) : null}\n </div>\n {insight.href && (\n <a\n href={insight.href}\n className=\"mt-0.5 shrink-0 text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:rounded-sm focus-visible:outline-2 focus-visible:outline-ring\"\n aria-label={`Open ${insight.title} — details`}\n >\n <i className=\"fa-light fa-arrow-up-right text-xs\" aria-hidden=\"true\" />\n </a>\n )}\n </div>\n\n <div className=\"mt-auto flex shrink-0 justify-end pt-3\">\n <InsightDefaultTooltip actionLabel={insight.actionLabel}>\n <Button\n variant={compact ? \"outline\" : \"ghost\"}\n size=\"sm\"\n className={cn(\n \"h-8 w-full gap-1.5 text-xs sm:w-auto\",\n compact\n ? \"border-border/60 bg-background px-3 text-foreground hover:bg-background\"\n : \"px-3 text-muted-foreground hover:text-interactive-hover-foreground\"\n )}\n onClick={insight.onAction}\n aria-label={insight.actionLabel ?? \"Ask Leo\"}\n >\n <i\n className={\n insight.actionIcon\n ? `fa-light ${insight.actionIcon} text-xs`\n : \"fa-duotone fa-solid fa-star-christmas text-xs text-brand\"\n }\n aria-hidden=\"true\"\n />\n {insight.actionLabel ?? \"Ask Leo\"}\n </Button>\n </InsightDefaultTooltip>\n </div>\n </div>\n </Card>\n )\n}\n\n/** Severity icon badge for the insight card */\n\nfunction InsightBadge({\n severity = \"warning\",\n size = \"default\",\n}: {\n severity?: MetricInsight[\"severity\"]\n size?: \"default\" | \"sm\"\n}) {\n const styles = {\n warning: {\n bg: \"bg-[var(--insight-severity-warning-bg)]\",\n icon: \"fa-circle-exclamation\",\n color: \"text-[var(--insight-severity-warning-fg)]\",\n },\n info: {\n bg: \"bg-[var(--insight-severity-info-bg)]\",\n icon: \"fa-circle-info\",\n color: \"text-[var(--insight-severity-info-fg)]\",\n },\n error: { bg: \"bg-destructive/15\", icon: \"fa-circle-xmark\", color: \"text-destructive\" },\n }[severity]\n\n return (\n <span\n className={cn(\n \"inline-flex shrink-0 items-center justify-center rounded-full\",\n size === \"sm\" ? \"h-6 w-6 text-xs\" : \"h-7 w-7 text-sm\",\n styles.bg,\n styles.color\n )}\n aria-hidden=\"true\"\n >\n <i className={`fa-light ${styles.icon}`} />\n </span>\n )\n}\n\n/* ── Shared inner content ─────────────────────────────────────────────────── */\n\ninterface InnerProps {\n title: string\n description: string\n period: string\n periods: PeriodOption[]\n metrics: MetricItem[]\n rows: MetricItem[][]\n insight?: MetricInsight\n onPeriodChange: (v: string) => void\n /** Extra padding class injected by flat variant */\n innerPadding?: string\n /** When false, the header (title/description/period select) is hidden */\n showHeader?: boolean\n insightCompact?: boolean\n insightFullWidth?: boolean\n metricsSingleRow?: boolean\n /** Tighter KPI cells + 2-col mobile grid (half-width dashboard card). */\n metricsHalfWidthLayout?: boolean\n /** Opaque fill behind each KPI cell when using hairline grid gaps (below `lg`). */\n metricsCellSurfaceClassName?: string\n /** Flat list-page band: softer dividers + tinted cells on a lavender-tinted surface */\n surfaceVariant?: \"default\" | \"flat\"\n}\n\nfunction KeyMetricsInner({\n title,\n description,\n period,\n periods,\n metrics,\n rows,\n insight,\n onPeriodChange,\n innerPadding = \"\",\n showHeader = true,\n insightCompact = false,\n insightFullWidth = false,\n metricsSingleRow = false,\n metricsHalfWidthLayout = false,\n metricsCellSurfaceClassName = \"bg-background\",\n surfaceVariant = \"default\",\n}: InnerProps) {\n const isFlatBand = surfaceVariant === \"flat\"\n const metricsGridClassName = isFlatBand\n ? flatMetricsHairlineClass(metrics.length, metricsHalfWidthLayout)\n : \"gap-px bg-border\"\n /** Side-by-side KPI + insight rail (md+). Disabled for half-width dashboard cards — insight stacks below. */\n const insightSideBySide = insight && !insightFullWidth && !metricsHalfWidthLayout\n const stackedRailInsight = insight && !insightFullWidth && metricsHalfWidthLayout\n\n return (\n <div data-slot=\"key-metrics\" className=\"contents\">\n {/* ── Header ──────────────────────────────────────────────────── */}\n {showHeader && (\n <div className={cn(\n \"flex flex-col gap-2 pb-3\",\n \"sm:flex-row sm:items-center sm:justify-between sm:gap-4\",\n innerPadding\n )}>\n <div>\n <p className=\"text-base font-semibold text-foreground leading-tight\">{title}</p>\n <p className=\"mt-0.5 text-sm text-muted-foreground\">{description}</p>\n </div>\n\n {/* Period selector — align=\"end\" keeps dropdown flush-right */}\n <Select value={period} onValueChange={onPeriodChange}>\n <SelectTrigger\n className=\"h-8 w-full sm:w-auto sm:min-w-[9rem] shrink-0 text-sm\"\n aria-label=\"Select comparison period\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\" sideOffset={4}>\n {periods.map((p) => (\n <SelectItem key={p.value} value={p.value}>\n {p.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* ── Body: metrics grid + optional insight ───────────────────── */}\n <div\n className={cn(\n \"flex flex-col gap-0\",\n /* 60% KPIs / 40% insight (3fr:2fr); lg+ only so phones/tablets stack KPIs + insight */\n insightSideBySide &&\n \"lg:grid lg:grid-cols-[minmax(0,3fr)_minmax(13rem,2fr)] lg:items-stretch lg:gap-x-6 lg:gap-y-0\",\n innerPadding\n )}\n >\n\n {/* Metrics section — self-start so KPI cells don’t stretch when the insight column is taller */}\n <div\n className={cn(\n \"min-w-0 lg:flex lg:min-h-0 lg:flex-col\",\n !insightSideBySide && \"w-full\",\n insightSideBySide && \"lg:self-start\"\n )}\n >\n {/*\n Phone (<md): one column. Tablet (md–lg): 2-column grid (e.g. 2×2 for four KPIs).\n Hairline separators use gap-px + opaque cell surfaces (divide-* breaks for 2-col order).\n Half-width dashboard cards keep divide-x + optional template columns.\n */}\n {metricsHalfWidthLayout ? (\n <div\n className={cn(\n \"@container/metrics-strip grid lg:hidden\",\n metricsSingleRow\n ? metricsRowColumnsClass(metrics.length, /* half */ true)\n : \"grid-cols-2\",\n metricsGridClassName,\n )}\n >\n {metrics.map((m) => (\n <div key={m.id} className={cn(\"min-w-0\", metricsCellSurfaceClassName)}>\n <MetricCell {...m} dense edgeGutter={false} />\n </div>\n ))}\n </div>\n ) : (\n <div\n className={cn(\n \"@container/metrics-strip grid lg:hidden\",\n metricsRowColumnsClass(metrics.length, /* half */ false),\n metricsGridClassName,\n )}\n >\n {metrics.map((m) => (\n <div key={m.id} className={cn(\"min-w-0\", metricsCellSurfaceClassName)}>\n <MetricCell {...m} dense={false} edgeGutter={false} />\n </div>\n ))}\n </div>\n )}\n\n {/*\n lg+: row-by-row container-queried grid. Uses a `gap-px + bg` hairline\n instead of `divide-x` so dividers render correctly when the row wraps\n from 4-across to a 2×2 grid (the awkward 3+1 layout is skipped — see\n `metricsRowColumnsClass`).\n */}\n <div className=\"@container/metrics-strip hidden lg:block\">\n {rows.map((row, rowIdx) => (\n <React.Fragment key={rowIdx}>\n {rowIdx > 0 && !isFlatBand && (\n <Separator aria-hidden=\"true\" className=\"my-1\" />\n )}\n <div\n className={cn(\n \"grid\",\n metricsRowColumnsClass(row.length, metricsHalfWidthLayout),\n isFlatBand\n ? flatMetricsHairlineClass(row.length, metricsHalfWidthLayout)\n : metricsGridClassName,\n )}\n >\n {row.map((m) => (\n <div key={m.id} className={cn(\"min-w-0\", metricsCellSurfaceClassName)}>\n <MetricCell {...m} dense={metricsHalfWidthLayout} edgeGutter={false} />\n </div>\n ))}\n </div>\n </React.Fragment>\n ))}\n </div>\n </div>\n\n {/* Insight card — only rendered when data provided */}\n {insight && (\n <>\n {insightFullWidth ? (\n <Separator\n aria-hidden=\"true\"\n className={cn(\"my-4 w-full\", isFlatBand && \"bg-foreground/[0.06]\")}\n />\n ) : stackedRailInsight ? (\n <Separator\n aria-hidden=\"true\"\n className={cn(\"my-4 w-full\", isFlatBand && \"bg-foreground/[0.06]\")}\n />\n ) : (\n <Separator\n aria-hidden=\"true\"\n className={cn(\"my-3 lg:hidden\", isFlatBand && \"bg-foreground/[0.055]\")}\n />\n )}\n\n <div\n className={cn(\n \"flex min-h-0 min-w-0 w-full flex-col\",\n /* Divider + padding replace vertical Separator so grid stays 2 columns */\n insightSideBySide &&\n !insightFullWidth &&\n cn(\n \"lg:h-full lg:ps-6\",\n /* Flat band: insight card ring is the divider — skip `border-l` (double line). */\n !isFlatBand && \"lg:border-s lg:border-border\",\n )\n )}\n >\n {insight && !insightFullWidth ? (\n <InsightRailStatementAction insight={insight} compact={insightCompact} />\n ) : (\n <Card\n role=\"region\"\n aria-label=\"Insight\"\n className={cn(\n \"overflow-hidden rounded-lg p-0 ring-1 ring-foreground/8 shadow-none\",\n \"flex min-h-0 flex-col bg-muted/25\"\n )}\n >\n {insightCompact ? (\n <div className=\"flex min-h-0 flex-1 flex-col gap-4 p-4 md:flex-row md:items-center md:justify-between md:gap-8 md:p-5\">\n <div className=\"flex min-w-0 flex-1 flex-col gap-2\">\n <div className=\"flex items-start gap-2.5\">\n <InsightBadge severity={insight.severity} size=\"sm\" />\n <div className=\"flex min-w-0 flex-1 items-start justify-between gap-2\">\n <p className=\"text-base font-semibold leading-tight text-foreground\">\n {insight.title}\n </p>\n {insight.href && (\n <a\n href={insight.href}\n className=\"shrink-0 text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:rounded-sm focus-visible:outline-2 focus-visible:outline-ring\"\n aria-label={`Open ${insight.title} — details`}\n >\n <i className=\"fa-light fa-arrow-up-right text-xs\" aria-hidden=\"true\" />\n </a>\n )}\n </div>\n </div>\n {insight.description ? (\n <p className=\"text-sm leading-relaxed text-muted-foreground\">\n {insight.description}\n </p>\n ) : null}\n </div>\n <div className=\"flex w-full shrink-0 md:w-auto\">\n <InsightDefaultTooltip actionLabel={insight.actionLabel}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 w-full gap-1.5 px-4 text-xs text-muted-foreground hover:text-interactive-hover-foreground md:min-w-[8.5rem]\"\n onClick={insight.onAction}\n aria-label={insight.actionLabel ?? \"Ask Leo\"}\n >\n <i\n className={insight.actionIcon ? `fa-light ${insight.actionIcon} text-xs` : \"fa-duotone fa-solid fa-star-christmas text-xs text-brand\"}\n aria-hidden=\"true\"\n />\n {insight.actionLabel ?? \"Ask Leo\"}\n </Button>\n </InsightDefaultTooltip>\n </div>\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1 flex-col gap-4 p-4 md:flex-row md:items-center md:justify-between md:gap-8 md:p-5\">\n <div className=\"flex min-w-0 flex-1 flex-col gap-3\">\n <div className=\"flex items-start gap-3\">\n <InsightBadge severity={insight.severity} />\n <div className=\"flex min-w-0 flex-1 items-start justify-between gap-2\">\n <p className=\"text-base font-semibold leading-snug text-foreground\">\n {insight.title}\n </p>\n {insight.href && (\n <a\n href={insight.href}\n className=\"shrink-0 text-muted-foreground transition-colors hover:text-interactive-hover-foreground focus-visible:rounded-sm focus-visible:outline-2 focus-visible:outline-ring\"\n aria-label={`Open ${insight.title} — details`}\n >\n <i className=\"fa-light fa-arrow-up-right text-xs\" aria-hidden=\"true\" />\n </a>\n )}\n </div>\n </div>\n {insight.description ? (\n <p className=\"text-sm leading-relaxed text-muted-foreground\">\n {insight.description}\n </p>\n ) : null}\n </div>\n <div className=\"flex w-full shrink-0 md:w-auto\">\n <InsightDefaultTooltip actionLabel={insight.actionLabel}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-9 w-full gap-1.5 px-4 text-xs text-muted-foreground hover:text-interactive-hover-foreground md:min-w-[8.5rem]\"\n onClick={insight.onAction}\n aria-label={insight.actionLabel ?? \"Ask Leo\"}\n >\n <i\n className={insight.actionIcon ? `fa-light ${insight.actionIcon} text-xs` : \"fa-duotone fa-solid fa-star-christmas text-xs text-brand\"}\n aria-hidden=\"true\"\n />\n {insight.actionLabel ?? \"Ask Leo\"}\n </Button>\n </InsightDefaultTooltip>\n </div>\n </div>\n )}\n </Card>\n )}\n </div>\n </>\n )}\n </div>\n </div>\n )\n}\n\nfunction chunkMetricPairs(metrics: MetricItem[]): MetricItem[][] {\n const out: MetricItem[][] = []\n for (let i = 0; i < metrics.length; i += 2) out.push(metrics.slice(i, i + 2))\n return out\n}\n\n/* ── Main component ───────────────────────────────────────────────────────── */\n\nexport function KeyMetrics({\n variant = \"card\",\n title = \"Key Metrics\",\n description = \"Overview of performance indicators\",\n metrics = [],\n insight,\n periods = DEFAULT_PERIODS,\n defaultPeriod = \"week\",\n onPeriodChange,\n showHeader = true,\n insightCompact = false,\n insightFullWidth = false,\n metricsSingleRow = false,\n metricsHalfWidthLayout = false,\n className,\n}: KeyMetricsProps) {\n const [period, setPeriod] = React.useState(defaultPeriod)\n // Pull the host app's \"default insight action\" (e.g. toggle Ask Leo\n // sidebar) and label out of `KeyMetricsProvider` instead of\n // hardcoding `useAskLeo()`. When no provider is mounted, the default\n // action button hides entirely so the strip stays useful in apps\n // without an AI assistant.\n const {\n defaultInsightAction,\n defaultActionLabel = \"Ask Leo\",\n } = useKeyMetricsContext()\n\n function handlePeriodChange(v: string) {\n setPeriod(v)\n onPeriodChange?.(v)\n }\n\n /* Split metrics into rows of 3, or paired rows when half-width + single row, else one row */\n const rows: MetricItem[][] = metricsSingleRow\n ? metrics.length\n ? metricsHalfWidthLayout\n ? chunkMetricPairs(metrics)\n : [metrics]\n : []\n : (() => {\n const out: MetricItem[][] = []\n for (let i = 0; i < metrics.length; i += 3) {\n out.push(metrics.slice(i, i + 3))\n }\n return out\n })()\n\n const metricsCellSurfaceClassName =\n variant === \"flat\"\n ? \"bg-transparent\"\n : \"bg-card dark:bg-transparent\"\n\n const innerProps: InnerProps = {\n title,\n description,\n period,\n periods,\n metrics,\n rows,\n insight,\n onPeriodChange: handlePeriodChange,\n insightCompact,\n insightFullWidth,\n metricsSingleRow,\n metricsHalfWidthLayout,\n metricsCellSurfaceClassName,\n surfaceVariant: variant === \"flat\" ? \"flat\" : \"default\",\n }\n\n /*\n * ── GLOW GUIDELINE ────────────────────────────────────────────────────────\n * The bottom-glow treatment is a deliberate design signal. Use it only for:\n *\n * 1. AI / intelligence surfaces — e.g. AI Insights, Ask Leo responses,\n * any card that surfaces machine-generated content.\n * Opacity: 0.12–0.16 (subtle; the glow should not dominate)\n *\n * 2. Designer-designated hero sections — e.g. Key Metrics (the primary\n * KPI band), onboarding completion, or any section the product team\n * explicitly wants to \"elevate\" visually.\n * Opacity: 0.18–0.24 (more pronounced; intentional focal point)\n *\n * Do NOT add glow to:\n * • Standard data/content cards (Tasks, Activity, Learn, Charts…)\n * • Navigation or shell elements\n * • Cards that already use a coloured border or badge for status\n *\n * Implementation:\n * style={{ background: \"radial-gradient(ellipse 110% 90% at 50% 100%,\n * oklch(from var(--brand-color) l c h / <opacity>) 0%, transparent 68%)\" }}\n * + className=\"overflow-hidden\" ← required to clip the gradient\n * ─────────────────────────────────────────────────────────────────────────\n */\n const glowStyle: React.CSSProperties = {\n background: \"var(--key-metrics-card-glow-radial)\",\n }\n\n /** List-page KPI band — transparent; only `--key-metrics-flat-band-radial` glow. */\n const flatBandStyle: React.CSSProperties = {\n background: \"var(--key-metrics-flat-band-radial)\",\n boxShadow: \"var(--key-metrics-flat-band-shadow)\",\n }\n\n /* ── Card variant — ChartCard-style chrome ───────────────────────────── */\n if (variant === \"card\") {\n return (\n <Card className={cn(\"shadow-xs overflow-hidden flex flex-col\", className)} style={glowStyle}>\n <CardHeader className={cn(\"shrink-0 pb-2\", metricsHalfWidthLayout && \"space-y-2\")}>\n <div\n className={cn(\n \"flex gap-2\",\n metricsHalfWidthLayout\n ? \"flex-col min-[400px]:flex-row min-[400px]:items-start min-[400px]:justify-between\"\n : \"items-start\",\n )}\n >\n <div className=\"flex-1 min-w-0\">\n <CardTitle className=\"text-sm font-semibold leading-tight\">{title}</CardTitle>\n <CardDescription className=\"text-xs mt-0.5\">{description}</CardDescription>\n </div>\n <div className=\"flex flex-wrap items-center gap-1.5 shrink-0\">\n {defaultInsightAction ? (\n <InsightDefaultTooltip actionLabel={defaultActionLabel}>\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 shrink-0 text-xs gap-1.5 px-2\"\n aria-label={`${defaultActionLabel} about these metrics`}\n onClick={defaultInsightAction}\n type=\"button\"\n >\n <i className=\"fa-duotone fa-solid fa-star-christmas text-xs text-brand\" aria-hidden=\"true\" />\n <span>{defaultActionLabel}</span>\n </Button>\n </InsightDefaultTooltip>\n ) : null}\n <Select value={period} onValueChange={handlePeriodChange}>\n <SelectTrigger\n size=\"sm\"\n className=\"w-auto min-w-[9rem] shrink-0 text-sm\"\n aria-label=\"Select comparison period\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\" sideOffset={4}>\n {periods.map((p) => (\n <SelectItem key={p.value} value={p.value}>\n {p.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"flex-1 pb-4\">\n <KeyMetricsInner {...innerProps} showHeader={false} />\n </CardContent>\n </Card>\n )\n }\n\n /* ── Compact variant — card chrome, no header, metrics only ──────────── */\n if (variant === \"compact\") {\n return (\n <Card className={cn(\"shadow-xs overflow-hidden\", className)} style={glowStyle}>\n <CardContent className=\"py-3 px-4\">\n <KeyMetricsInner {...innerProps} showHeader={false} />\n </CardContent>\n </Card>\n )\n }\n\n /* ── Flat variant — no surface; bottom brand glow only ── */\n return (\n <section\n aria-label={title}\n className={cn(\"relative w-full overflow-hidden pt-5 pb-8\", className)}\n style={flatBandStyle}\n >\n <KeyMetricsInner\n {...innerProps}\n innerPadding=\"px-4 lg:px-6\"\n showHeader={showHeader}\n />\n </section>\n )\n}\n\n/**\n * KeyMetricsContent — renders just the metrics grid + optional insight panel.\n * No card wrapper, no header, no period selector.\n * Designed for embedding inside a ChartCard with tabOptions period tabs.\n */\nexport function KeyMetricsContent({\n metrics = [],\n insight,\n insightCompact = false,\n insightFullWidth = false,\n}: Pick<KeyMetricsProps, \"metrics\" | \"insight\" | \"insightCompact\" | \"insightFullWidth\">) {\n const rows: MetricItem[][] = []\n for (let i = 0; i < metrics.length; i += 3) rows.push(metrics.slice(i, i + 3))\n\n return (\n <KeyMetricsInner\n title=\"\"\n description=\"\"\n period=\"\"\n periods={[]}\n metrics={metrics}\n rows={rows}\n insight={insight}\n onPeriodChange={() => {}}\n showHeader={false}\n insightCompact={insightCompact}\n insightFullWidth={insightFullWidth}\n metricsCellSurfaceClassName=\"bg-card dark:bg-transparent\"\n />\n )\n}\n","\"use client\"\n\n/**\n * PageHeader — Full-width content area header.\n *\n * Sits at the top of a page's main content, BELOW the breadcrumb / topbar.\n * Uses Ivy Presto (Adobe Fonts) for the title via the `--font-heading`\n * CSS variable.\n *\n * **Variant `collaboration`** — optional access line + collaborator faces\n * (or **Add collaborator** when the roster is empty) ahead of the primary\n * `actions` slot. The full **Invite people** flow lives in the consuming\n * page's `actions` overflow menu — this primitive only renders the face row.\n *\n * WCAG 2.1 AA:\n * - `<h1>` landmark — one per page (WCAG 1.3.1)\n * - Sufficient colour contrast >= 4.5:1 on title + subtitle (SC 1.4.3)\n * - Face row: `role=\"group\"` + aggregate `aria-label`; each face has a\n * `Tooltip` name (SC 4.1.2)\n *\n * Promotion note: this file lived at `apps/web/components/page-header.tsx`\n * until 2026-05-20. It moved into `@exxatdesignux/ui` so other apps (and\n * future docs sites) can compose hub headers without duplicating the\n * collaboration variant, h1 styling, or face-row a11y wiring. The\n * `CollaboratorAccessRole` union is duplicated here as a narrow string\n * literal so the primitive stays free of `apps/web/lib/` couplings — the\n * authoritative role labels / icons / capability helpers continue to live\n * in `apps/web/lib/collaborator-access.ts`.\n */\n\nimport * as React from \"react\"\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"./avatar\"\nimport { Button } from \"./button\"\nimport { Separator } from \"./separator\"\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\"\nimport { cn } from \"../../lib/utils\"\n\n/**\n * Library access role for shared hubs. Mirrors\n * `apps/web/lib/collaborator-access.ts > CollaboratorAccessRole` — kept\n * structurally identical so the apps/web type and this type are mutually\n * assignable wherever consumers pass collaborator rosters to `PageHeader`.\n */\nexport type PageHeaderCollaboratorAccessRole =\n | \"owner\"\n | \"editor\"\n | \"commenter\"\n | \"viewer\"\n\nexport type PageHeaderVariant = \"default\" | \"collaboration\"\n\nexport interface PageHeaderCollaborator {\n id: string\n name: string\n imageUrl?: string | null\n initials?: string\n email?: string\n access?: PageHeaderCollaboratorAccessRole\n /** Org / directory role tags (e.g. Faculty, Program coordinator). */\n roles?: string[]\n}\n\nexport interface PageHeaderProps {\n /** Primary page title — rendered as `<h1>` in Ivy Presto serif. */\n title: string\n /** Short descriptor or date shown below the title (and below `accessInfo` when set). */\n subtitle?: React.ReactNode\n /** Layout preset — `collaboration` enables access line + face row ahead of `actions`. */\n variant?: PageHeaderVariant\n /**\n * Role / access copy or badges — rendered between the title and subtitle\n * when `variant=\"collaboration\"` (e.g. lock icon + \"Editors can modify\").\n */\n accessInfo?: React.ReactNode\n /** People with access — shown as a horizontal row of faces when `variant=\"collaboration\"`. */\n collaborators?: PageHeaderCollaborator[]\n /** Max faces before a `+N` chip — default 3. */\n collaboratorDisplayLimit?: number\n /** Opens the invite collaborators sheet when a face, overflow chip, or empty-state CTA is activated. */\n onCollaboratorsOpen?: () => void\n /** Label for the empty-roster header control — default `\"Add collaborator\"`. */\n addCollaboratorLabel?: string\n /** Optional slot for right-aligned actions (buttons, selectors, etc.). */\n actions?: React.ReactNode\n /** Extra className for the outer wrapper. */\n className?: string\n /** When false, the title + subtitle are visually hidden (actions remain). */\n showTitleBlock?: boolean\n}\n\nfunction PageHeaderCollaborationAccess({\n people,\n limit,\n onOpenCollaborators,\n addCollaboratorLabel,\n}: {\n people: PageHeaderCollaborator[]\n limit: number\n onOpenCollaborators?: () => void\n addCollaboratorLabel: string\n}) {\n if (people.length === 0) {\n return (\n <div\n role=\"group\"\n aria-label=\"People with access\"\n className=\"flex shrink-0 items-center\"\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"lg\"\n onClick={onOpenCollaborators}\n disabled={!onOpenCollaborators}\n >\n <i className=\"fa-light fa-user-plus\" aria-hidden=\"true\" />\n {addCollaboratorLabel}\n </Button>\n </div>\n )\n }\n\n const visible = people.slice(0, limit)\n const overflow = Math.max(0, people.length - visible.length)\n const names = people.map((p) => p.name).join(\", \")\n\n return (\n <div\n role=\"group\"\n aria-label={names ? `People with access: ${names}` : \"People with access\"}\n className=\"flex shrink-0 items-center gap-2 sm:gap-2.5\"\n >\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {visible.map((c) => (\n <Tooltip key={c.id}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"relative shrink-0 rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n aria-label={`Open collaborators — ${c.name}`}\n onClick={onOpenCollaborators}\n disabled={!onOpenCollaborators}\n >\n <Avatar size=\"sm\" shape=\"circle\" className=\"pointer-events-none\">\n {c.imageUrl ? (\n <AvatarImage src={c.imageUrl} alt=\"\" referrerPolicy=\"no-referrer\" />\n ) : null}\n <AvatarFallback className=\"text-xs font-semibold\">\n {(c.initials ?? c.name.slice(0, 2)).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{c.name}</TooltipContent>\n </Tooltip>\n ))}\n {overflow > 0 && (\n <button\n type=\"button\"\n className=\"flex size-6 shrink-0 items-center justify-center rounded-full bg-muted text-[11px] font-semibold tabular-nums text-muted-foreground ring-1 ring-border/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n aria-label={`Open collaborators — ${overflow} more people with access`}\n onClick={onOpenCollaborators}\n disabled={!onOpenCollaborators}\n >\n +{overflow}\n </button>\n )}\n </div>\n </div>\n )\n}\n\nexport function PageHeader({\n title,\n subtitle,\n variant = \"default\",\n accessInfo,\n collaborators,\n collaboratorDisplayLimit = 3,\n onCollaboratorsOpen,\n addCollaboratorLabel = \"Add collaborator\",\n actions,\n className,\n showTitleBlock = true,\n}: PageHeaderProps) {\n const isCollaboration = variant === \"collaboration\"\n const showAccess = Boolean(isCollaboration && accessInfo)\n const showCollaborationAccess = isCollaboration\n const showActionsColumn = Boolean(actions) || showCollaborationAccess\n const showCollaboratorActionsSeparator =\n showCollaborationAccess && Boolean(actions)\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-1 px-4 pt-2 pb-4 lg:px-6\",\n \"sm:flex-row sm:items-end sm:gap-4\",\n showTitleBlock ? \"sm:justify-between\" : \"sm:justify-end\",\n className,\n )}\n >\n {/* Title block — hidden visually when showTitleBlock is false; keep h1 for a11y. */}\n <div className={cn(\"flex min-w-0 flex-col gap-0.5\", !showTitleBlock && \"sr-only\")}>\n <h1\n className=\"text-2xl font-semibold tracking-tight leading-tight text-foreground\"\n style={{ fontFamily: \"var(--font-heading)\" }}\n suppressHydrationWarning\n >\n {title}\n </h1>\n {showAccess && (\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs leading-snug text-muted-foreground\">\n {accessInfo}\n </div>\n )}\n {subtitle && (\n <p className=\"text-sm text-muted-foreground leading-none\">{subtitle}</p>\n )}\n </div>\n\n {showActionsColumn && (\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3 shrink-0 sm:ms-auto sm:justify-end\">\n {showCollaborationAccess ? (\n <PageHeaderCollaborationAccess\n people={collaborators ?? []}\n limit={collaboratorDisplayLimit}\n onOpenCollaborators={onCollaboratorsOpen}\n addCollaboratorLabel={addCollaboratorLabel}\n />\n ) : null}\n {showCollaboratorActionsSeparator ? (\n <Separator\n orientation=\"vertical\"\n decorative\n className=\"h-8 shrink-0\"\n />\n ) : null}\n {actions}\n </div>\n )}\n </div>\n )\n}\n","\"use client\"\n\n/**\n * ScrollArea — Radix-backed scroll container with always-visible-on-hover\n * scrollbars that respect platform conventions.\n *\n * Use when you need an **explicitly bounded** scrolling region (lists in\n * popovers, sidebar nav trees, long config panels) and the default\n * browser scrollbar is too coarse or visually noisy.\n *\n * Accessibility:\n * - Radix manages keyboard scrolling parity with native overflow.\n * - The viewport is `role=\"region\"`-compatible — give the wrapper an\n * `aria-label` when the content is a meaningful landmark.\n */\n\nimport * as React from \"react\"\nimport { ScrollArea as ScrollAreaPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n )\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none p-px transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-s border-s-transparent\",\n orientation === \"horizontal\" &&\n \"h-2.5 w-full flex-col border-t border-t-transparent\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-border hover:bg-border/80\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n )\n}\n\nexport { ScrollArea, ScrollBar }\n","import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n/** Matches Tailwind `max-md` / desktop branch `md:` (min-width: 768px). */\nconst MOBILE_MQ = `(max-width: ${MOBILE_BREAKPOINT - 1}px)`\n\nexport function useIsMobile() {\n const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n React.useLayoutEffect(() => {\n const read = () => {\n setIsMobile(window.matchMedia(MOBILE_MQ).matches)\n }\n\n const mql = window.matchMedia(MOBILE_MQ)\n mql.addEventListener(\"change\", read)\n window.addEventListener(\"resize\", read)\n const vv = window.visualViewport\n vv?.addEventListener(\"resize\", read)\n\n read()\n\n return () => {\n mql.removeEventListener(\"change\", read)\n window.removeEventListener(\"resize\", read)\n vv?.removeEventListener(\"resize\", read)\n }\n }, [])\n\n return !!isMobile\n}\n","import { cn } from \"../../lib/utils\"\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { useIsMobile } from \"../../hooks/use-mobile\"\nimport { cn } from \"../../lib/utils\"\nimport { Button } from \"./button\"\nimport { Input } from \"./input\"\nimport { Separator } from \"./separator\"\nimport { Skeleton } from \"./skeleton\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./tooltip\"\n\n/**\n * Cookie persisting the user's explicit expanded/collapsed preference.\n *\n * Versioned (`_v2`) on 2026-05-21 to drop stale values written by the\n * pre-fix code where incidental layout collapses (secondary panel open,\n * route auto-collapse) would clobber the user's preference on every\n * navigation. Anyone on the old `sidebar_state` cookie falls back to\n * the `defaultOpen` default (expanded), and the next explicit toggle\n * starts persisting under the new name. The old cookie self-expires\n * by `max-age` within a week; if you want immediate cleanup, the\n * client clears it explicitly on first mount (see `useLayoutEffect`\n * below).\n */\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state_v2\"\nconst SIDEBAR_COOKIE_LEGACY_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\n/** Matches `useIsMobile` / Tailwind `md:` — do not apply desktop cookie to mobile overlay. */\nconst SIDEBAR_COOKIE_VIEWPORT_MQ = \"(max-width: 767px)\"\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\n/**\n * Options for {@link SidebarContextProps.setOpen}.\n *\n * `persist: false` updates the visual sidebar state **without** writing the\n * `sidebar_state` cookie. Pass it from incidental layout effects — e.g. a\n * secondary panel taking the rail space, a route-level auto-collapse — so\n * the user's explicit preference (their ⌘B toggle / sidebar button) is the\n * only thing that ever rewrites the cookie. Defaults to `true` for\n * backward compatibility with the toggle button and existing callsites.\n */\ntype SetOpenOptions = { persist?: boolean }\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\"\n open: boolean\n setOpen: (\n open: boolean | ((value: boolean) => boolean),\n opts?: SetOpenOptions,\n ) => void\n openMobile: boolean\n setOpenMobile: (open: boolean) => void\n isMobile: boolean\n toggleSidebar: () => void\n /**\n * Snap the rail back to the user's saved preference — the value persisted in\n * `sidebar_state_v2`, or `defaultOpen` if no cookie was ever written. Use\n * this from incidental-collapse cleanups (secondary panel closing, route\n * leaves) so the rail doesn't stay stuck in its incidental state once the\n * thing that caused the collapse is gone. Always uses `persist: false`.\n */\n restoreSavedOpen: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext)\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n }\n\n return context\n}\n\nfunction readSidebarStateCookie(): boolean | undefined {\n if (typeof document === \"undefined\") return undefined\n const m = document.cookie.match(new RegExp(`(?:^|; )${SIDEBAR_COOKIE_NAME}=(true|false)(?:;|$)`))\n if (!m) return undefined\n return m[1] === \"true\"\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}) {\n const isMobile = useIsMobile()\n const [openMobile, setOpenMobile] = React.useState(false)\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen)\n const open = openProp ?? _open\n\n // `setOpen` already persists `sidebar_state_v2` to a cookie on desktop; restore it on mount so\n // full reloads and new tabs keep the rail expanded/collapsed. Skip when controlled or on mobile.\n // Also actively drop the legacy `sidebar_state` cookie (pre-2026-05-21) so stale\n // collapsed-by-default values written by the old incidental-collapse bug don't linger.\n //\n // MOUNT-ONLY: deps are `[]` so this runs once per `SidebarProvider` mount, NOT\n // every time `open` flips. That matters because incidental collapses\n // (`setOpen(false, { persist: false })` from a secondary panel opening or\n // `SidebarAutoCollapse` route) must NOT trigger a re-reconcile that reads the\n // saved cookie back as \"expanded\" and snaps the rail open again.\n // The functional setter avoids closing over a stale `open` value.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n React.useLayoutEffect(() => {\n if (typeof window === \"undefined\") return\n if (typeof document !== \"undefined\" && document.cookie.includes(`${SIDEBAR_COOKIE_LEGACY_NAME}=`)) {\n document.cookie = `${SIDEBAR_COOKIE_LEGACY_NAME}=; path=/; max-age=0`\n }\n if (openProp !== undefined) return\n if (window.matchMedia(SIDEBAR_COOKIE_VIEWPORT_MQ).matches) return\n const fromCookie = readSidebarStateCookie()\n if (fromCookie === undefined) return\n _setOpen((prev) => (prev === fromCookie ? prev : fromCookie))\n }, [])\n\n const setOpen = React.useCallback(\n (\n value: boolean | ((value: boolean) => boolean),\n opts?: SetOpenOptions,\n ) => {\n const openState = typeof value === \"function\" ? value(open) : value\n if (setOpenProp) {\n setOpenProp(openState)\n } else {\n _setOpen(openState)\n }\n\n // Persist on desktop only — zooming in and closing shouldn't clobber the\n // desktop state. Callers can also opt out explicitly (`persist: false`)\n // for incidental layout collapses such as a secondary panel opening or\n // an auto-collapse route; those visual side-effects must not overwrite\n // the user's saved expanded/collapsed preference.\n if (!isMobile && opts?.persist !== false) {\n document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n }\n },\n [setOpenProp, open, isMobile]\n )\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n setOpen((open) => !open)\n }, [setOpen])\n\n /**\n * Snap the rail back to the user's saved preference. Called when a secondary\n * panel closes or an auto-collapse route is left — so an incidental collapse\n * doesn't persist beyond the page that caused it. `persist: false` because\n * this restore is itself incidental; the only writes to the cookie should\n * still come from real user gestures (⌘B, sidebar button).\n */\n const restoreSavedOpen = React.useCallback(() => {\n if (typeof window === \"undefined\") return\n const fromCookie = readSidebarStateCookie()\n const target = fromCookie ?? defaultOpen\n setOpen(target, { persist: false })\n }, [defaultOpen, setOpen])\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {\n event.preventDefault()\n toggleSidebar()\n return\n }\n // WCAG 2.1.1 — Escape closes the floating sidebar on mobile/high-zoom\n if (event.key === \"Escape\" && isMobile && open) {\n event.preventDefault()\n setOpen(false)\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [toggleSidebar, isMobile, open, setOpen])\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\"\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n restoreSavedOpen,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar, restoreSavedOpen]\n )\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <div\n data-slot=\"sidebar-wrapper\"\n data-state={state}\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n // min-h-svh: shell is at least viewport-tall so the main inset can stretch when page\n // content is short. Inner layout rows use min-h-0 where scroll containment is needed.\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n </SidebarContext.Provider>\n )\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n dir,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\"\n variant?: \"sidebar\" | \"floating\" | \"inset\"\n collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n}) {\n const { isMobile, state, setOpen } = useSidebar()\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar text-sidebar-foreground\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n\n return (\n <div\n className={cn(\n \"group peer text-sidebar-foreground\",\n // Always in the DOM so peer/group selectors work; gap is hidden on mobile\n isMobile ? \"block\" : \"hidden md:block\",\n )}\n data-state={state}\n data-collapsible={state === \"collapsed\" ? (isMobile ? \"offcanvas\" : collapsible) : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* Layout gap — pushes page content right on desktop; zero on mobile (sidebar floats) */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n isMobile\n ? \"hidden\"\n : cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-200 ease-linear\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n )\n )}\n />\n {/* Mobile scrim — closes the floating sidebar when tapping outside it */}\n {isMobile && state === \"expanded\" && (\n <div\n aria-hidden=\"true\"\n className=\"fixed inset-0 z-40\"\n onClick={() => setOpen(false)}\n />\n )}\n <div\n data-slot=\"sidebar-container\"\n data-side={side}\n className={cn(\n \"fixed w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear\",\n // Desktop\n !isMobile && cn(\n \"hidden inset-y-0 h-svh z-10 md:flex\",\n \"data-[side=left]:left-0 data-[side=right]:right-0\",\n \"data-[side=left]:group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\",\n \"data-[side=right]:group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-e group-data-[side=right]:border-s\",\n ),\n // Mobile / high-zoom: floating panel with rounded corners and inset margins\n isMobile && cn(\n \"flex z-50 top-2 h-[calc(100dvh-1rem)] overflow-hidden\",\n side === \"left\"\n ? \"left-2 group-data-[collapsible=offcanvas]:left-[calc(-1*(var(--sidebar-width)+0.5rem))]\"\n : \"right-2 group-data-[collapsible=offcanvas]:right-[calc(-1*(var(--sidebar-width)+0.5rem))]\",\n \"rounded-2xl border border-border/60 shadow-2xl ring-1 ring-border/20\",\n ),\n className\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className={cn(\n \"flex size-full flex-col bg-sidebar\",\n !isMobile && \"group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:shadow-sm group-data-[variant=floating]:ring-1 group-data-[variant=floating]:ring-sidebar-border\",\n )}\n >\n {children}\n </div>\n </div>\n </div>\n )\n}\n\nfunction SidebarTrigger({\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon-sm\"\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event)\n toggleSidebar()\n }}\n {...props}\n >\n <i className=\"fa-light fa-sidebar rtl:rotate-180\" aria-hidden=\"true\" />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n )\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar()\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2\",\n \"in-data-[side=left]:cursor-w-resize rtl:in-data-[side=left]:cursor-e-resize in-data-[side=right]:cursor-e-resize rtl:in-data-[side=right]:cursor-w-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize rtl:[[data-side=left][data-state=collapsed]_&]:cursor-w-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize rtl:[[data-side=right][data-state=collapsed]_&]:cursor-e-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 rtl:group-data-[collapsible=offcanvas]:-translate-x-0 group-data-[collapsible=offcanvas]:after:start-full hover:group-data-[collapsible=offcanvas]:bg-sidebar\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-end-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-start-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n // flex-1 + min-h-0: stretch with the app row so main is at least viewport height (minus banner)\n // when content is short; inner column scrolls via min-h-0 flex children.\n // Below md (incl. desktop at high zoom): symmetric horizontal inset so the card is not flush left.\n // md+ inset variant: ms-0 aligns with the sidebar gap; collapsed rail adds ms-2.\n \"relative flex min-h-0 w-full min-w-0 flex-1 flex-col self-stretch bg-background pb-6 rounded-xl shadow-sm my-1.5 mx-2 md:peer-data-[variant=inset]:my-2 md:peer-data-[variant=inset]:mx-2 md:peer-data-[variant=inset]:ms-0 md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ms-2\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarInput({\n className,\n ...props\n}: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex shrink-0 flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex shrink-0 flex-col gap-2 p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"no-scrollbar flex min-h-0 flex-1 flex-col gap-0 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"p\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"p\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"m-0 flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-section-label ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-200 ease-linear group-data-[collapsible=icon]:hidden focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 end-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarGroupContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-0\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n suppressHydrationWarning\n className={cn(\n \"group/menu-item relative\",\n /* Icon rail: center the square menu control in the column (footer + primary). */\n \"group-data-[collapsible=icon]:flex group-data-[collapsible=icon]:justify-center\",\n className,\n )}\n {...props}\n />\n )\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button group/menu-button flex w-full group-data-[collapsible=icon]:w-8 cursor-pointer select-none items-center gap-2 overflow-hidden rounded-md p-2 text-start text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pe-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-background data-active:font-medium data-active:text-foreground data-active:shadow-sm data-active:ring-1 data-active:ring-sidebar-border data-active:hover:bg-background data-active:hover:text-foreground data-active:hc:border data-active:hc:border-foreground data-active:forced-colors:border data-active:forced-colors:border-[Highlight] [&_svg:not([data-product-logo]):not([data-product-logo-mark])]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:gap-0 group-data-[collapsible=icon]:[&>*:not(:first-child)]:hidden\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nconst SidebarMenuButton = React.forwardRef<\n HTMLButtonElement,\n React.ComponentPropsWithoutRef<\"button\"> & {\n asChild?: boolean\n isActive?: boolean\n tooltip?: string | React.ComponentProps<typeof TooltipContent>\n } & VariantProps<typeof sidebarMenuButtonVariants>\n>(function SidebarMenuButton(\n {\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n },\n ref,\n) {\n const Comp = asChild ? Slot.Root : \"button\"\n const { isMobile, state } = useSidebar()\n\n const button = (\n <Comp\n ref={ref}\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive || undefined}\n className={cn(\n sidebarMenuButtonVariants({ variant, size }),\n className,\n // `asChild` merges the child (e.g. Next `<Link className=\"w-full\">`) onto this node —\n // plain `w-full` can win over `group-data-[collapsible=icon]:w-8` in the stylesheet and\n // squash the icon rail to a non-square hit target (WCAG 2.5.8).\n \"group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!min-w-8 group-data-[collapsible=icon]:!max-w-8 group-data-[collapsible=icon]:shrink-0\",\n )}\n {...props}\n />\n )\n\n if (!tooltip) {\n return button\n }\n\n const tooltipProps: React.ComponentProps<typeof TooltipContent> =\n typeof tooltip === \"string\" ? { children: tooltip } : tooltip\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltipProps}\n />\n </Tooltip>\n )\n})\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean\n showOnHover?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 end-1 flex aspect-square w-5 cursor-pointer items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 after:absolute after:-inset-2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 md:after:hidden [&>svg]:size-4 [&>svg]:shrink-0\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-active/menu-button:text-sidebar-accent-foreground aria-expanded:opacity-100 md:opacity-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuBadge({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute end-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean\n}) {\n // Random width between 50 to 90%.\n const [width] = React.useState(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`\n })\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && (\n <Skeleton\n className=\"size-4 rounded-md\"\n data-sidebar=\"menu-skeleton-icon\"\n />\n )}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n )\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px rtl:-translate-x-px flex-col gap-1 border-s border-sidebar-border px-2.5 py-0.5 group-data-[collapsible=icon]:hidden\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubItem({\n className,\n ...props\n}: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n )\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean\n size?: \"sm\" | \"md\"\n isActive?: boolean\n}) {\n const Comp = asChild ? Slot.Root : \"a\"\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive || undefined}\n className={cn(\n \"flex h-7 min-w-0 cursor-pointer select-none -translate-x-px rtl:translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-background data-active:text-foreground data-active:shadow-sm data-active:ring-1 data-active:ring-sidebar-border data-active:hc:border data-active:hc:border-foreground data-active:forced-colors:border data-active:forced-colors:border-[Highlight] [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n useSidebar,\n}\n","\"use client\"\n\n/**\n * Slider — Radix-backed range input with token-aligned track + thumb\n * styling.\n *\n * Use for **continuous numeric ranges** with a clear visual track: brand\n * brightness, threshold sliders, audio scrubbing, density / scale\n * pickers. For discrete enumerable values (3 sizes, low / med / high),\n * prefer `ToggleGroup` or `RadioGroup` instead — sliders imply continuity.\n *\n * Pass `value` / `defaultValue` as `number[]` for either a single thumb\n * (`[value]`) or a range (`[min, max]`). Two thumbs share a track.\n *\n * Accessibility (per Radix):\n * - Each thumb is a focusable `role=\"slider\"` with proper ARIA value\n * text. Pair with a visible label / `aria-label` when there is no\n * surrounding form field.\n * - Arrow keys nudge by `step`; Page Up / Down nudge by 10×; Home / End\n * jump to bounds.\n */\n\nimport * as React from \"react\"\nimport { Slider as SliderPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Slider({\n className,\n defaultValue,\n value,\n min = 0,\n max = 100,\n ...props\n}: React.ComponentProps<typeof SliderPrimitive.Root>) {\n // `_values` drives how many `Thumb` elements we render so the same\n // component handles both single-thumb and dual-thumb ranges without\n // a separate prop. Falls back to `[min, max]` if nothing was supplied\n // (Radix accepts this — the slider just sits at the full range).\n const _values = React.useMemo<number[]>(\n () =>\n Array.isArray(value)\n ? value\n : Array.isArray(defaultValue)\n ? defaultValue\n : [min, max],\n [value, defaultValue, min, max],\n )\n\n return (\n <SliderPrimitive.Root\n data-slot=\"slider\"\n defaultValue={defaultValue}\n value={value}\n min={min}\n max={max}\n className={cn(\n \"relative flex w-full touch-none select-none items-center data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className=\"relative grow overflow-hidden rounded-full bg-muted data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5\"\n >\n <SliderPrimitive.Range\n data-slot=\"slider-range\"\n className=\"absolute bg-primary data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full\"\n />\n </SliderPrimitive.Track>\n {_values.map((_, idx) => (\n <SliderPrimitive.Thumb\n key={idx}\n data-slot=\"slider-thumb\"\n className=\"block size-4 shrink-0 rounded-full border border-primary bg-background shadow-sm transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:pointer-events-none disabled:opacity-50\"\n />\n ))}\n </SliderPrimitive.Root>\n )\n}\n\nexport { Slider }\n","\"use client\"\n\n/** Shadcn Sonner wrapper — do **not** use for product `toast()` calls; see **`AGENTS.md` §6.5** and **`.cursor/rules/exxat-no-toast.mdc`**. */\nimport { useTheme } from \"next-themes\"\nimport { Toaster as Sonner, type ToasterProps } from \"sonner\"\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { theme = \"system\" } = useTheme()\n\n return (\n <Sonner\n theme={theme as ToasterProps[\"theme\"]}\n className=\"toaster group\"\n icons={{\n success: <i className=\"fa-light fa-circle-check size-4\" aria-hidden=\"true\" />,\n info: <i className=\"fa-light fa-circle-info size-4\" aria-hidden=\"true\" />,\n warning: <i className=\"fa-light fa-triangle-exclamation size-4\" aria-hidden=\"true\" />,\n error: <i className=\"fa-light fa-octagon-xmark size-4\" aria-hidden=\"true\" />,\n loading: <i className=\"fa-light fa-spinner size-4 animate-spin\" aria-hidden=\"true\" />,\n }}\n style={\n {\n \"--normal-bg\": \"var(--popover)\",\n \"--normal-text\": \"var(--popover-foreground)\",\n \"--normal-border\": \"var(--border)\",\n \"--border-radius\": \"var(--radius)\",\n } as React.CSSProperties\n }\n toastOptions={{\n classNames: {\n toast: \"cn-toast\",\n },\n }}\n {...props}\n />\n )\n}\n\nexport { Toaster }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\n/**\n * StatusBadge — the small \"Beta\"/\"New\"/\"Alpha\" chip we ship in the sidebar,\n * lifted into a reusable primitive so it can decorate any surface: tabs,\n * buttons, table headers, card titles, chart cards, panels.\n *\n * Why a dedicated component (instead of reusing generic `<Badge>`): each\n * status has a canonical color + accessible announcement. Hard-coding the\n * Tailwind classes at every callsite drifts; consumers should pass `status`\n * and let the primitive handle visuals + `aria-label`.\n *\n * Usage:\n * <StatusBadge status=\"beta\" /> // pill, default size\n * <StatusBadge status=\"new\" size=\"sm\" />\n * <StatusBadge status=\"beta\" variant=\"dot\" /> // small dot (e.g. in collapsed sidebar)\n *\n * // Anchor on a target element:\n * <span className=\"relative inline-flex\">\n * Tab label\n * <StatusBadge status=\"beta\" className=\"ml-1.5\" />\n * </span>\n */\n\nconst statusBadgeVariants = cva(\n \"inline-flex shrink-0 items-center justify-center font-semibold leading-none tracking-wide uppercase select-none border border-transparent\",\n {\n variants: {\n status: {\n beta:\n // Warm yellow — matches sidebar Beta. HC/forced-colors fall back to\n // system tokens so the chip stays visible under custom contrast.\n \"bg-yellow-400 text-yellow-950 hc:bg-transparent hc:border-foreground hc:text-foreground forced-colors:bg-[Canvas] forced-colors:text-[CanvasText] forced-colors:border-[CanvasText]\",\n new:\n \"bg-brand text-brand-foreground hc:bg-transparent hc:border-foreground hc:text-foreground forced-colors:bg-[Highlight] forced-colors:text-[HighlightText] forced-colors:border-[HighlightText]\",\n alpha:\n \"bg-orange-500 text-white hc:bg-transparent hc:border-foreground hc:text-foreground forced-colors:bg-[Canvas] forced-colors:text-[CanvasText] forced-colors:border-[CanvasText]\",\n preview:\n \"bg-sky-500 text-white hc:bg-transparent hc:border-foreground hc:text-foreground forced-colors:bg-[Canvas] forced-colors:text-[CanvasText] forced-colors:border-[CanvasText]\",\n deprecated:\n \"bg-muted text-muted-foreground border-border hc:border-foreground forced-colors:bg-[Canvas] forced-colors:text-[GrayText] forced-colors:border-[GrayText]\",\n },\n size: {\n xs: \"h-3.5 min-w-3.5 px-1 text-[9px] rounded-sm\",\n sm: \"h-4 min-w-4 px-1.5 text-[10px] rounded-full\",\n md: \"h-5 min-w-5 px-1.5 text-[11px] rounded-full\",\n },\n variant: {\n pill: \"\",\n // `dot` — same color, no label, for collapsed sidebars or tight chips.\n dot: \"h-2 w-2 min-w-0 p-0 rounded-full\",\n },\n },\n defaultVariants: {\n status: \"beta\",\n size: \"sm\",\n variant: \"pill\",\n },\n },\n)\n\nconst STATUS_LABEL: Record<NonNullable<StatusBadgeProps[\"status\"]>, string> = {\n beta: \"Beta\",\n new: \"New\",\n alpha: \"Alpha\",\n preview: \"Preview\",\n deprecated: \"Deprecated\",\n}\n\nexport interface StatusBadgeProps\n extends Omit<React.ComponentProps<\"span\">, \"children\">,\n VariantProps<typeof statusBadgeVariants> {\n /** Override the visible label (still keeps status color). */\n label?: string\n}\n\nexport function StatusBadge({\n className,\n status = \"beta\",\n size = \"sm\",\n variant = \"pill\",\n label,\n \"aria-label\": ariaLabel,\n ...props\n}: StatusBadgeProps) {\n const visibleLabel = label ?? STATUS_LABEL[status!]\n // Dot variant has no visible text — keep the accessible name.\n const a11yLabel = ariaLabel ?? visibleLabel\n\n return (\n <span\n data-slot=\"status-badge\"\n data-status={status}\n data-variant={variant}\n aria-label={a11yLabel}\n className={cn(statusBadgeVariants({ status, size, variant }), className)}\n {...props}\n >\n {variant === \"dot\" ? <span className=\"sr-only\">{a11yLabel}</span> : visibleLabel}\n </span>\n )\n}\n\nexport { statusBadgeVariants }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div\n data-slot=\"table-container\"\n className=\"relative w-full overflow-x-auto\"\n >\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\n \"border-t bg-interactive-hover-subtle font-medium [&>tr]:last:border-b-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\n \"border-b transition-colors hover:bg-interactive-hover-subtle data-[state=selected]:bg-interactive-hover\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, scope = \"col\", ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n scope={scope}\n className={cn(\n \"h-10 px-2 text-start align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pe-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n \"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pe-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Tabs as TabsPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Root>) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"group/tabs flex gap-2 data-horizontal:flex-col\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst tabsListVariants = cva(\n \"group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none\",\n {\n variants: {\n variant: {\n default: \"bg-[var(--brand-color)]/12\",\n line: \"gap-1 bg-transparent\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction TabsList({\n className,\n variant = \"default\",\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.List> &\n 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({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n \"relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-interactive-hover-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 dark:text-muted-foreground dark:hover:text-interactive-hover-foreground group-data-[variant=default]/tabs-list:data-active:shadow-sm group-data-[variant=line]/tabs-list:data-active:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\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 \"data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground\",\n \"after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-end-1 group-data-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({\n className,\n ...props\n}: React.ComponentProps<typeof TabsPrimitive.Content>) {\n return (\n <TabsPrimitive.Content\n data-slot=\"tabs-content\"\n className={cn(\"flex-1 text-sm outline-none\", className)}\n {...props}\n />\n )\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Toggle as TogglePrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst toggleVariants = cva(\n // Unselected: dark foreground text (matches primary text, not blue)\n // Selected : solid primary fill + white text — looks like a filled button\n \"group/toggle inline-flex items-center justify-center gap-1 rounded-lg text-sm font-medium whitespace-nowrap transition-all outline-none text-foreground hover:bg-interactive-hover hover:text-interactive-hover-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-primary data-[state=on]:text-primary-foreground data-[state=on]:shadow-xs dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline: \"border border-[var(--brand-color)]/30 bg-transparent hover:border-[var(--brand-color)]/60\",\n },\n size: {\n default: \"h-8 min-w-8 px-2\",\n sm: \"h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-1.5 text-[0.8rem]\",\n lg: \"h-9 min-w-9 px-2.5\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Toggle({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { type VariantProps } from \"class-variance-authority\"\nimport { ToggleGroup as ToggleGroupPrimitive } from \"radix-ui\"\n\nimport { cn } from \"../../lib/utils\"\nimport { toggleVariants } from \"./toggle\"\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: \"horizontal\" | \"vertical\"\n }\n>({\n size: \"default\",\n variant: \"default\",\n spacing: 0,\n orientation: \"horizontal\",\n})\n\nfunction ToggleGroup({\n className,\n variant,\n size,\n spacing = 0,\n orientation = \"horizontal\",\n children,\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &\n VariantProps<typeof toggleVariants> & {\n spacing?: number\n orientation?: \"horizontal\" | \"vertical\"\n }) {\n return (\n <ToggleGroupPrimitive.Root\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n data-spacing={spacing}\n data-orientation={orientation}\n style={{ \"--gap\": spacing } as React.CSSProperties}\n className={cn(\n \"group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch\",\n className\n )}\n {...props}\n >\n <ToggleGroupContext.Provider\n value={{ variant, size, spacing, orientation }}\n >\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n )\n}\n\nfunction ToggleGroupItem({\n className,\n children,\n variant = \"default\",\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof ToggleGroupPrimitive.Item> &\n VariantProps<typeof toggleVariants>) {\n const context = React.useContext(ToggleGroupContext)\n\n return (\n <ToggleGroupPrimitive.Item\n data-slot=\"toggle-group-item\"\n data-variant={context.variant || variant}\n data-size={context.size || size}\n data-spacing={context.spacing}\n className={cn(\n \"shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 focus:z-10 focus-visible:z-10 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-s-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-e-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-s-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-s group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t\",\n toggleVariants({\n variant: context.variant || variant,\n size: context.size || size,\n }),\n className\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n","{\n \"$comment\": \"In-app “Windows (JSON)” contrast mode. Edit hex or oklch() strings to match a Windows Contrast theme (Settings → Accessibility → Contrast themes) or an exported .theme file. Keys are Exxat semantic CSS variables on <html>. Light/dark follow the app’s light/dark mode (next-themes).\",\n \"windowsSettingsLabels\": {\n \"Background\": \"Canvas — maps to --background, surfaces, sidebar base\",\n \"Text\": \"Text — maps to --foreground and readable copy tokens\",\n \"Hyperlink\": \"Hyperlinks — mapped to --primary / focus via --ring where useful\",\n \"Selected text\": \"Selected text — maps to --accent and --accent-foreground\",\n \"Button text\": \"Button text — maps to --primary / --primary-foreground pair\",\n \"Disabled text\": \"Disabled text — maps to --muted / --muted-foreground\"\n },\n \"light\": {\n \"--hc-highlight\": \"#0000ff\",\n \"--hc-highlight-text\": \"#ffffff\",\n \"--background\": \"#ffffff\",\n \"--foreground\": \"#000000\",\n \"--card\": \"#ffffff\",\n \"--card-foreground\": \"#000000\",\n \"--popover\": \"#ffffff\",\n \"--popover-foreground\": \"#000000\",\n \"--primary\": \"#0000ff\",\n \"--primary-foreground\": \"#ffffff\",\n \"--secondary\": \"#ffffff\",\n \"--secondary-foreground\": \"#000000\",\n \"--muted\": \"#e8e8e8\",\n \"--muted-foreground\": \"#3b3b3b\",\n \"--accent\": \"#0000ff\",\n \"--accent-foreground\": \"#ffffff\",\n \"--destructive\": \"#b5200d\",\n \"--destructive-foreground\": \"#ffffff\",\n \"--border\": \"#000000\",\n \"--border-control\": \"#000000\",\n \"--border-control-3\": \"#000000\",\n \"--border-control-35\": \"#000000\",\n \"--control-border\": \"#000000\",\n \"--input\": \"#000000\",\n \"--input-background\": \"#ffffff\",\n \"--ring\": \"#0000ff\",\n \"--sidebar\": \"#ffffff\",\n \"--sidebar-foreground\": \"#000000\",\n \"--sidebar-primary\": \"#000000\",\n \"--sidebar-primary-foreground\": \"#ffffff\",\n \"--sidebar-accent\": \"#d9d9d9\",\n \"--sidebar-accent-foreground\": \"#000000\",\n \"--sidebar-border\": \"#000000\",\n \"--sidebar-ring\": \"#0000ff\",\n \"--sidebar-section-label-foreground\": \"#515151\",\n \"--brand-tint\": \"#f0f0f0\",\n \"--brand-tint-light\": \"#f7f7f7\",\n \"--brand-tint-subtle\": \"#fafafa\",\n \"--chart-1\": \"#000000\",\n \"--chart-2\": \"#3b3b3b\",\n \"--chart-3\": \"#6e6e6e\",\n \"--chart-4\": \"#a0a0a0\",\n \"--chart-5\": \"#d1d1d1\",\n \"--chip-1\": \"#000000\",\n \"--chip-2\": \"#000000\",\n \"--chip-3\": \"#000000\",\n \"--chip-4\": \"#000000\",\n \"--chip-5\": \"#000000\",\n \"--chip-destructive\": \"#b5200d\",\n \"--interactive-hover\": \"#e0e0e0\",\n \"--interactive-hover-foreground\": \"#000000\",\n \"--interactive-hover-subtle\": \"#ebebeb\",\n \"--interactive-hover-soft\": \"#ebebeb\",\n \"--interactive-hover-medium\": \"#d5d5d5\",\n \"--interactive-hover-strong\": \"#cccccc\",\n \"--interactive-hover-row\": \"#e0e0e0\",\n \"--overlay\": \"color-mix(in srgb, #000000 18%, transparent)\",\n \"--dt-row-bg\": \"#ffffff\",\n \"--dt-row-hover\": \"#ebebeb\",\n \"--dt-row-selected\": \"#0000ff\",\n \"--dt-row-selected-fg\": \"#ffffff\",\n \"--dt-header-bg\": \"#ffffff\",\n \"--dt-group-bg\": \"#ebebeb\",\n \"--dt-new-row-bg\": \"#ffffff\",\n \"--dt-new-row-border\": \"#000000\",\n \"--theme-color-chrome\": \"#ffffff\"\n },\n \"dark\": {\n \"--hc-highlight\": \"#ffff00\",\n \"--hc-highlight-text\": \"#000000\",\n \"--background\": \"#000000\",\n \"--foreground\": \"#ffffff\",\n \"--card\": \"#000000\",\n \"--card-foreground\": \"#ffffff\",\n \"--popover\": \"#0a0a0a\",\n \"--popover-foreground\": \"#ffffff\",\n \"--primary\": \"#00ffff\",\n \"--primary-foreground\": \"#000000\",\n \"--secondary\": \"#000000\",\n \"--secondary-foreground\": \"#ffffff\",\n \"--muted\": \"#1a1a1a\",\n \"--muted-foreground\": \"#ffffff\",\n \"--accent\": \"#ffff00\",\n \"--accent-foreground\": \"#000000\",\n \"--destructive\": \"#ff8080\",\n \"--destructive-foreground\": \"#000000\",\n \"--border\": \"#ffffff\",\n \"--border-control\": \"#ffffff\",\n \"--border-control-3\": \"#ffffff\",\n \"--border-control-35\": \"#ffffff\",\n \"--control-border\": \"#ffffff\",\n \"--input\": \"#ffffff\",\n \"--input-background\": \"#000000\",\n \"--ring\": \"#ffff00\",\n \"--sidebar\": \"#000000\",\n \"--sidebar-foreground\": \"#ffffff\",\n \"--sidebar-primary\": \"#ffffff\",\n \"--sidebar-primary-foreground\": \"#000000\",\n \"--sidebar-accent\": \"#1a1a1a\",\n \"--sidebar-accent-foreground\": \"#ffffff\",\n \"--sidebar-border\": \"#ffffff\",\n \"--sidebar-ring\": \"#ffff00\",\n \"--sidebar-section-label-foreground\": \"#c8c8c8\",\n \"--brand-tint\": \"#1a1a1a\",\n \"--brand-tint-light\": \"#141414\",\n \"--brand-tint-subtle\": \"#101010\",\n \"--chart-1\": \"#ffffff\",\n \"--chart-2\": \"#c8c8c8\",\n \"--chart-3\": \"#8e8e8e\",\n \"--chart-4\": \"#5a5a5a\",\n \"--chart-5\": \"#2e2e2e\",\n \"--chip-1\": \"#ffffff\",\n \"--chip-2\": \"#ffffff\",\n \"--chip-3\": \"#ffffff\",\n \"--chip-4\": \"#ffffff\",\n \"--chip-5\": \"#ffffff\",\n \"--chip-destructive\": \"#ff8080\",\n \"--interactive-hover\": \"#262626\",\n \"--interactive-hover-foreground\": \"#ffffff\",\n \"--interactive-hover-subtle\": \"#1f1f1f\",\n \"--interactive-hover-soft\": \"#1f1f1f\",\n \"--interactive-hover-medium\": \"#2e2e2e\",\n \"--interactive-hover-strong\": \"#383838\",\n \"--interactive-hover-row\": \"#262626\",\n \"--overlay\": \"color-mix(in srgb, #ffffff 22%, transparent)\",\n \"--dt-row-bg\": \"#000000\",\n \"--dt-row-hover\": \"#1a1a1a\",\n \"--dt-row-selected\": \"#ffff00\",\n \"--dt-row-selected-fg\": \"#000000\",\n \"--dt-header-bg\": \"#000000\",\n \"--dt-group-bg\": \"#1a1a1a\",\n \"--dt-new-row-bg\": \"#000000\",\n \"--dt-new-row-border\": \"#ffffff\",\n \"--theme-color-chrome\": \"#000000\"\n }\n}\n","import windowsContrastTheme from \"./windows-contrast-theme.json\"\n\ntype WindowsContrastFile = {\n light: Record<string, string>\n dark: Record<string, string>\n}\n\nconst file = windowsContrastTheme as WindowsContrastFile\n\nconst WINDOWS_VAR_KEYS = new Set([\n ...Object.keys(file.light),\n ...Object.keys(file.dark),\n])\n\nexport function applyWindowsContrastTheme() {\n const el = document.documentElement\n const isDark = el.classList.contains(\"dark\")\n const map = isDark ? file.dark : file.light\n for (const [prop, val] of Object.entries(map)) {\n el.style.setProperty(prop, val)\n }\n}\n\nexport function clearWindowsContrastTheme() {\n const el = document.documentElement\n for (const key of WINDOWS_VAR_KEYS) {\n el.style.removeProperty(key)\n }\n}\n","\"use client\"\n\n/**\n * useAppTheme — Manages theme dimensions beyond light/dark:\n * • Brand : \"one\" (Lavender) | \"prism\" (Rose)\n * • Contrast : \"system\" | \"normal\" | \"high\" | \"windows\" (JSON-driven palette)\n * • Text size : \"compact\" | \"default\" | \"large\" — root rem scale (industry pattern:\n * iOS “Larger Text”, Android font scale, Gmail/Slack density). Default keeps\n * 16px root; compact/large adjust modestly with xs clamped to 11px in CSS.\n *\n * Persists to localStorage; applies class / data-* on <html>.\n * Use alongside `useTheme()` from next-themes for light / dark / system.\n */\n\nimport { useCallback, useEffect, useState } from \"react\"\n\nimport {\n applyWindowsContrastTheme,\n clearWindowsContrastTheme,\n} from \"../theme/apply-windows-contrast-theme\"\n\nexport type Brand = \"one\" | \"prism\"\n\nconst CONTRAST_PREFS = [\"system\", \"normal\", \"high\", \"windows\"] as const\n\n/** What the user explicitly picks (or \"system\" to follow OS). */\nexport type ContrastPreference = (typeof CONTRAST_PREFS)[number]\n\n/** The resolved mode actually applied to the DOM. */\nexport type ContrastMode = \"normal\" | \"high\" | \"windows\"\n\n/** UI text scale at the document root (rem-based UI tracks together). */\nexport type TextSizePreference = \"compact\" | \"default\" | \"large\"\n\nconst BRAND_KEY = \"exxat-brand\"\nconst CONTRAST_KEY = \"exxat-contrast\"\nconst TEXT_SIZE_KEY = \"exxat-text-size\"\n\nconst MQ = \"(prefers-contrast: more)\"\n\nfunction getOsContrast(): ContrastMode {\n if (typeof window === \"undefined\") return \"normal\"\n return window.matchMedia(MQ).matches ? \"high\" : \"normal\"\n}\n\nfunction resolveContrast(pref: ContrastPreference): ContrastMode {\n if (pref === \"system\") return getOsContrast()\n return pref\n}\n\nfunction normalizeContrastPref(raw: string | null): ContrastPreference {\n if (raw && (CONTRAST_PREFS as readonly string[]).includes(raw)) {\n return raw as ContrastPreference\n }\n return \"system\"\n}\n\nfunction applyBrand(brand: Brand) {\n const html = document.documentElement\n html.classList.remove(\"theme-one\", \"theme-prism\")\n html.classList.add(`theme-${brand}`)\n}\n\nfunction applyContrast(mode: ContrastMode) {\n if (mode === \"windows\") {\n document.documentElement.setAttribute(\"data-contrast\", \"windows\")\n applyWindowsContrastTheme()\n return\n }\n clearWindowsContrastTheme()\n document.documentElement.setAttribute(\n \"data-contrast\",\n mode === \"high\" ? \"high\" : \"off\",\n )\n}\n\nfunction applyTextSize(pref: TextSizePreference) {\n const html = document.documentElement\n if (pref === \"default\") {\n html.removeAttribute(\"data-text-size\")\n } else {\n html.setAttribute(\"data-text-size\", pref)\n }\n}\n\nexport function useAppTheme() {\n const [brand, setBrandState] = useState<Brand>(\"one\")\n const [contrastPref, setContrastPrefState] = useState<ContrastPreference>(\"system\")\n const [resolvedContrast, setResolvedContrast] = useState<ContrastMode>(\"normal\")\n const [textSizePref, setTextSizePrefState] = useState<TextSizePreference>(\"default\")\n const [mounted, setMounted] = useState(false)\n\n /* Hydrate from localStorage on first client render */\n useEffect(() => {\n setMounted(true)\n const storedBrand = (localStorage.getItem(BRAND_KEY) as Brand) ?? \"one\"\n const storedPref = normalizeContrastPref(localStorage.getItem(CONTRAST_KEY))\n const storedText =\n (localStorage.getItem(TEXT_SIZE_KEY) as TextSizePreference | null) ?? \"default\"\n\n setBrandState(storedBrand)\n setContrastPrefState(storedPref)\n setTextSizePrefState(storedText)\n applyBrand(storedBrand)\n\n const resolved = resolveContrast(storedPref)\n setResolvedContrast(resolved)\n applyContrast(resolved)\n applyTextSize(storedText)\n }, [])\n\n /* Listen for OS contrast changes when preference is \"system\" */\n useEffect(() => {\n if (contrastPref !== \"system\") return\n\n const mql = window.matchMedia(MQ)\n function onChange() {\n const resolved = getOsContrast()\n setResolvedContrast(resolved)\n applyContrast(resolved)\n }\n mql.addEventListener(\"change\", onChange)\n return () => mql.removeEventListener(\"change\", onChange)\n }, [contrastPref])\n\n /* Re-apply Windows JSON palette when light/dark class toggles (next-themes). */\n useEffect(() => {\n if (resolvedContrast !== \"windows\") return\n applyWindowsContrastTheme()\n const html = document.documentElement\n const obs = new MutationObserver(() => {\n applyWindowsContrastTheme()\n })\n obs.observe(html, { attributes: true, attributeFilter: [\"class\"] })\n return () => obs.disconnect()\n }, [resolvedContrast])\n\n const setBrand = useCallback((b: Brand) => {\n setBrandState(b)\n localStorage.setItem(BRAND_KEY, b)\n applyBrand(b)\n }, [])\n\n const setContrast = useCallback((pref: ContrastPreference) => {\n setContrastPrefState(pref)\n localStorage.setItem(CONTRAST_KEY, pref)\n const resolved = resolveContrast(pref)\n setResolvedContrast(resolved)\n applyContrast(resolved)\n }, [])\n\n const setTextSize = useCallback((pref: TextSizePreference) => {\n setTextSizePrefState(pref)\n localStorage.setItem(TEXT_SIZE_KEY, pref)\n applyTextSize(pref)\n }, [])\n\n return {\n brand,\n setBrand,\n /** The user's preference: \"system\" | \"normal\" | \"high\" | \"windows\" */\n contrastPref,\n /** The resolved contrast mode actually applied to the DOM. */\n contrast: resolvedContrast,\n /** Set the contrast preference. */\n setContrast,\n /** Text scale: \"compact\" | \"default\" | \"large\" */\n textSizePref,\n setTextSize,\n mounted,\n }\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\n/* ═══════════════════════════════════════════════════════════════════════════\n useCoachMark — Flow & single-step coach-mark state manager\n ═══════════════════════════════════════════════════════════════════════════\n Handles:\n • Multi-step flows (next / prev / skip / complete)\n • Single coach marks (show / dismiss)\n • Per-step CSS selector targeting — scrolls element into view\n • localStorage persistence so dismissed marks don't reappear\n • Delay before first show (avoids layout flash)\n ═══════════════════════════════════════════════════════════════════════════ */\n\nconst STORAGE_PREFIX = \"exxat-coach-mark:\"\n\nexport interface CoachMarkStep {\n /** Unique key — also used for localStorage persistence */\n id: string\n /** CSS selector for the target element this step attaches to */\n target: string\n /** Popover placement side for this step */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\"\n /** Popover alignment for this step */\n align?: \"start\" | \"center\" | \"end\"\n /** Title shown in the coach mark */\n title: string\n /** Body text / description */\n description: string\n /** Optional image URL shown above the content */\n image?: string\n /** Image alt text (required when image is provided) */\n imageAlt?: string\n}\n\n/** Fired on `window` when any coach flow completes (skip or last step). `detail.flowId` is the completed flow. */\nexport const COACH_MARK_FLOW_COMPLETED_EVENT = \"exxat-coach-mark-flow-completed\" as const\n\nexport interface UseCoachMarkOptions {\n /** Unique ID for the entire flow (used as localStorage key) */\n flowId: string\n /** Steps in order — single-item array for a standalone coach mark */\n steps: CoachMarkStep[]\n /** Delay in ms before the coach mark appears (default 500) */\n delay?: number\n /** Called when the entire flow is completed or skipped */\n onComplete?: () => void\n /** If true, always show even if previously dismissed (dev mode) */\n force?: boolean\n /**\n * When false, the auto-open timer does not run (e.g. until the user switches to a view where the target exists).\n * Default true.\n */\n enabled?: boolean\n /**\n * If set, auto-open only runs after this flow id is dismissed (localStorage) or completes (same-tab via\n * `COACH_MARK_FLOW_COMPLETED_EVENT`). Used to run a follow-up tour after another flow finishes.\n */\n dependsOnDismissedFlowId?: string\n}\n\nexport interface CoachMarkState {\n /** Whether the coach mark is currently visible */\n isOpen: boolean\n /** Current step index (0-based) */\n currentStep: number\n /** Total number of steps */\n totalSteps: number\n /** The current step data */\n step: CoachMarkStep | null\n /** The resolved target element for the current step */\n targetEl: HTMLElement | null\n /** Virtual anchor rect for Radix positioning */\n anchorRect: { x: number; y: number; width: number; height: number } | null\n /** Whether this is a multi-step flow */\n isFlow: boolean\n /** Whether we're on the first step */\n isFirst: boolean\n /** Whether we're on the last step */\n isLast: boolean\n /** Advance to the next step (or complete if last) */\n next: () => void\n /** Go back to the previous step */\n prev: () => void\n /** Skip/dismiss the entire flow */\n skip: () => void\n /** Programmatically open the coach mark */\n open: () => void\n /** Reset the flow (clears persistence and starts over) */\n reset: () => void\n}\n\nfunction isDismissed(flowId: string): boolean {\n if (typeof window === \"undefined\") return false\n try {\n return localStorage.getItem(`${STORAGE_PREFIX}${flowId}`) === \"dismissed\"\n } catch {\n return false\n }\n}\n\nfunction setDismissed(flowId: string) {\n if (typeof window === \"undefined\") return\n try {\n localStorage.setItem(`${STORAGE_PREFIX}${flowId}`, \"dismissed\")\n } catch {\n /* storage full or blocked — silently ignore */\n }\n}\n\nfunction clearDismissed(flowId: string) {\n if (typeof window === \"undefined\") return\n try {\n localStorage.removeItem(`${STORAGE_PREFIX}${flowId}`)\n } catch {\n /* ignore */\n }\n}\n\n/** Exported for the Settings page — list all coach mark keys in localStorage */\nexport function getAllCoachMarkKeys(): string[] {\n if (typeof window === \"undefined\") return []\n const keys: string[] = []\n try {\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n if (key?.startsWith(STORAGE_PREFIX)) {\n keys.push(key.replace(STORAGE_PREFIX, \"\"))\n }\n }\n } catch { /* ignore */ }\n return keys\n}\n\n/** Exported for the Settings page — reset a specific flow */\nexport function resetCoachMarkFlow(flowId: string) {\n clearDismissed(flowId)\n}\n\n/** Exported for the Settings page — reset ALL coach marks */\nexport function resetAllCoachMarks() {\n if (typeof window === \"undefined\") return\n try {\n const toRemove: string[] = []\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i)\n if (key?.startsWith(STORAGE_PREFIX)) toRemove.push(key)\n }\n toRemove.forEach((k) => localStorage.removeItem(k))\n } catch { /* ignore */ }\n}\n\nexport function useCoachMark({\n flowId,\n steps,\n delay = 500,\n onComplete,\n force = false,\n enabled = true,\n dependsOnDismissedFlowId,\n}: UseCoachMarkOptions): CoachMarkState {\n const [isOpen, setIsOpen] = React.useState(false)\n const [currentStep, setCurrentStep] = React.useState(0)\n const [targetEl, setTargetEl] = React.useState<HTMLElement | null>(null)\n const [anchorRect, setAnchorRect] = React.useState<{\n x: number; y: number; width: number; height: number\n } | null>(null)\n\n const [prereqMet, setPrereqMet] = React.useState(() => {\n if (!dependsOnDismissedFlowId) return true\n return isDismissed(dependsOnDismissedFlowId)\n })\n\n React.useEffect(() => {\n if (!dependsOnDismissedFlowId) {\n setPrereqMet(true)\n return\n }\n setPrereqMet(isDismissed(dependsOnDismissedFlowId))\n }, [dependsOnDismissedFlowId])\n\n React.useEffect(() => {\n if (!dependsOnDismissedFlowId) return\n const handler = (e: Event) => {\n const d = (e as CustomEvent<{ flowId?: string }>).detail\n if (d?.flowId === dependsOnDismissedFlowId) setPrereqMet(true)\n }\n window.addEventListener(COACH_MARK_FLOW_COMPLETED_EVENT, handler as EventListener)\n return () => window.removeEventListener(COACH_MARK_FLOW_COMPLETED_EVENT, handler as EventListener)\n }, [dependsOnDismissedFlowId])\n\n const totalSteps = steps.length\n const isFlow = totalSteps > 1\n const step = steps[currentStep] ?? null\n const isFirst = currentStep === 0\n const isLast = currentStep === totalSteps - 1\n\n /* Auto-show after delay (unless previously dismissed) */\n React.useEffect(() => {\n if (enabled === false) return\n if (dependsOnDismissedFlowId && !prereqMet) return\n if (!force && isDismissed(flowId)) return\n const timer = setTimeout(() => setIsOpen(true), delay)\n return () => clearTimeout(timer)\n }, [flowId, delay, force, enabled, dependsOnDismissedFlowId, prereqMet])\n\n /* Resolve target element + scroll into view when step changes.\n Retries: toolbar controls (e.g. last tour step on “Properties”) often mount after layout;\n a single query was easy to miss → no anchorRect → coach UI vanished on that step. */\n React.useEffect(() => {\n if (!isOpen || !step?.target) {\n return\n }\n\n let cancelled = false\n const timeouts: ReturnType<typeof setTimeout>[] = []\n const schedule = (fn: () => void, ms: number) => {\n const id = setTimeout(fn, ms)\n timeouts.push(id)\n return id\n }\n\n setAnchorRect(null)\n setTargetEl(null)\n\n let attempts = 0\n const maxAttempts = 30\n const intervalMs = 100\n\n const tryResolve = () => {\n if (cancelled) return\n const el = document.querySelector<HTMLElement>(step.target)\n if (!el) {\n attempts += 1\n if (attempts < maxAttempts) schedule(tryResolve, intervalMs)\n return\n }\n\n el.scrollIntoView({ behavior: \"smooth\", block: \"center\", inline: \"nearest\" })\n\n schedule(() => {\n if (cancelled) return\n const rect = el.getBoundingClientRect()\n setAnchorRect({\n x: rect.left,\n y: rect.top,\n width: rect.width,\n height: rect.height,\n })\n setTargetEl(el)\n }, 350)\n }\n\n schedule(tryResolve, 100)\n\n return () => {\n cancelled = true\n timeouts.forEach(clearTimeout)\n }\n }, [isOpen, step?.target, currentStep])\n\n /* Re-measure on scroll/resize while open */\n React.useEffect(() => {\n if (!isOpen || !targetEl) return\n\n const measure = () => {\n if (!targetEl.isConnected) return\n const rect = targetEl.getBoundingClientRect()\n setAnchorRect({\n x: rect.left,\n y: rect.top,\n width: rect.width,\n height: rect.height,\n })\n }\n\n window.addEventListener(\"scroll\", measure, { passive: true, capture: true })\n window.addEventListener(\"resize\", measure, { passive: true })\n return () => {\n window.removeEventListener(\"scroll\", measure, true)\n window.removeEventListener(\"resize\", measure)\n }\n }, [isOpen, targetEl])\n\n const complete = React.useCallback(() => {\n setIsOpen(false)\n setTargetEl(null)\n setAnchorRect(null)\n setDismissed(flowId)\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent(COACH_MARK_FLOW_COMPLETED_EVENT, { detail: { flowId } }),\n )\n }\n onComplete?.()\n }, [flowId, onComplete])\n\n const next = React.useCallback(() => {\n if (isLast) {\n complete()\n } else {\n setCurrentStep((s) => s + 1)\n }\n }, [isLast, complete])\n\n const prev = React.useCallback(() => {\n setCurrentStep((s) => Math.max(0, s - 1))\n }, [])\n\n const skip = React.useCallback(() => {\n complete()\n }, [complete])\n\n const open = React.useCallback(() => {\n setCurrentStep(0)\n setIsOpen(true)\n }, [])\n\n const reset = React.useCallback(() => {\n clearDismissed(flowId)\n setCurrentStep(0)\n setIsOpen(true)\n }, [flowId])\n\n return {\n isOpen,\n currentStep,\n totalSteps,\n step,\n targetEl,\n anchorRect,\n isFlow,\n isFirst,\n isLast,\n next,\n prev,\n skip,\n open,\n reset,\n }\n}\n"]}