@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,104 @@
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ function cn(...inputs) {
7
+ return twMerge(clsx(inputs));
8
+ }
9
+ var OS_FOLDER_GLYPH_SRC = "/folders/icons8-folder-windows-11.svg";
10
+ var COLOR_TINT_FILTER = {
11
+ brand: "hue-rotate(-42deg) saturate(1.25) brightness(0.97)",
12
+ success: "hue-rotate(82deg) saturate(1.2) brightness(0.95)",
13
+ warning: "hue-rotate(-5deg) saturate(1.35) brightness(1.02)",
14
+ destructive: "hue-rotate(300deg) saturate(1.15) brightness(0.92)",
15
+ muted: "saturate(0.15) brightness(1.08)",
16
+ chart1: "hue-rotate(200deg) saturate(1.2) brightness(0.96)",
17
+ chart2: "hue-rotate(95deg) saturate(1.15) brightness(0.96)",
18
+ chart3: "hue-rotate(265deg) saturate(1.2) brightness(0.96)"
19
+ };
20
+ var SIZE_MAP = {
21
+ /** Compact — folder inspector / column headers (matches ~36px row height). */
22
+ xs: "h-9 w-[2.6rem]",
23
+ sm: "h-[3.35rem] w-[3.85rem]",
24
+ md: "h-[4.6rem] w-[5.25rem]",
25
+ lg: "h-[6.5rem] w-[7.25rem]"
26
+ };
27
+ var ICON_TEXT = {
28
+ xs: "text-[13px] leading-none",
29
+ sm: "text-lg",
30
+ md: "text-2xl",
31
+ lg: "text-4xl"
32
+ };
33
+ var ICON_COLOR = {
34
+ brand: "text-orange-800 dark:text-orange-600",
35
+ success: "text-emerald-800 dark:text-emerald-600",
36
+ warning: "text-amber-800 dark:text-amber-600",
37
+ destructive: "text-red-800 dark:text-red-600",
38
+ muted: "text-slate-600 dark:text-slate-400",
39
+ chart1: "text-blue-800 dark:text-blue-600",
40
+ chart2: "text-lime-800 dark:text-lime-600",
41
+ chart3: "text-purple-800 dark:text-purple-600"
42
+ };
43
+ function OsFolderGlyph({
44
+ colorKey,
45
+ icon,
46
+ size = "md",
47
+ className,
48
+ variant = "solid",
49
+ decorative = true,
50
+ label
51
+ }) {
52
+ const outline = variant === "outline";
53
+ const tint = COLOR_TINT_FILTER[colorKey];
54
+ return /* @__PURE__ */ jsxs(
55
+ "div",
56
+ {
57
+ className: cn(
58
+ "group relative shrink-0 select-none transition-[transform,box-shadow] duration-200 ease-out",
59
+ "hover:z-[1] hover:scale-105 motion-reduce:transform-none motion-reduce:hover:scale-100",
60
+ SIZE_MAP[size],
61
+ className
62
+ ),
63
+ role: !decorative && label ? "img" : void 0,
64
+ "aria-label": !decorative ? label : void 0,
65
+ "aria-hidden": decorative ? true : void 0,
66
+ children: [
67
+ /* @__PURE__ */ jsx(
68
+ "img",
69
+ {
70
+ src: OS_FOLDER_GLYPH_SRC,
71
+ alt: "",
72
+ width: 240,
73
+ height: 240,
74
+ draggable: false,
75
+ loading: "lazy",
76
+ decoding: "async",
77
+ className: cn(
78
+ "h-full w-full object-contain",
79
+ "transition-[filter] duration-200",
80
+ outline && "opacity-75 saturate-[0.65]"
81
+ ),
82
+ style: outline ? void 0 : { filter: tint }
83
+ }
84
+ ),
85
+ /* @__PURE__ */ jsx(
86
+ "span",
87
+ {
88
+ className: cn(
89
+ "pointer-events-none absolute inset-0 flex items-center justify-center",
90
+ size === "xs" ? "translate-y-[0.18rem]" : "translate-y-[0.35rem]",
91
+ ICON_TEXT[size],
92
+ outline ? "text-muted-foreground" : cn(ICON_COLOR[colorKey], "opacity-100")
93
+ ),
94
+ children: /* @__PURE__ */ jsx("i", { className: cn("fa-solid", icon), "aria-hidden": "true" })
95
+ }
96
+ )
97
+ ]
98
+ }
99
+ );
100
+ }
101
+
102
+ export { OS_FOLDER_GLYPH_SRC, OsFolderGlyph };
103
+ //# sourceMappingURL=os-folder-glyph.js.map
104
+ //# sourceMappingURL=os-folder-glyph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/data-views/os-folder-glyph.tsx"],"names":[],"mappings":"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","file":"os-folder-glyph.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","\"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"]}
@@ -0,0 +1,36 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { CollapsibleContent } from '../ui/collapsible.js';
4
+ import 'radix-ui';
5
+
6
+ type OutlineTreeSurface = "sidebar" | "panel";
7
+ type OutlineTreeGuideLayout = "inset" | "chevronRail";
8
+ /** Pull row content onto the guide line — matches `SidebarMenuSubButton` horizontal nudge (inset layout only). */
9
+ declare const OUTLINE_TREE_SUB_ROW_SHIFT_CLASS = "-translate-x-px rtl:translate-x-px";
10
+ /** `CollapsibleContent` row: spacer width = `px-2` (8px) + half of `size-8` chevron (16px) → guide under chevron center. */
11
+ declare const OUTLINE_TREE_COLLAPSIBLE_CONTENT_RAIL_CLASS = "flex min-w-0 w-full";
12
+ /** Spacer column — keep in sync with folder row `px-2` + `size-8` chevron. */
13
+ declare const OUTLINE_TREE_CHEVRON_GUIDE_SPACER_CLASS = "w-6 shrink-0";
14
+ /** Wrap `OutlineTreeSub` with `guideLayout="chevronRail"` so the vertical border meets the chevron center. */
15
+ declare function OutlineTreeCollapsibleContentRail({ className, children, ...props }: React.ComponentProps<typeof CollapsibleContent>): react_jsx_runtime.JSX.Element;
16
+ /** Nested list under a folder — vertical guide + indent. */
17
+ declare function OutlineTreeSub({ surface, guideLayout, className, ...props }: React.ComponentProps<"ul"> & {
18
+ surface?: OutlineTreeSurface;
19
+ guideLayout?: OutlineTreeGuideLayout;
20
+ }): react_jsx_runtime.JSX.Element;
21
+ /** Root or nested branch list — matches `SidebarMenu` spacing. */
22
+ declare function OutlineTreeMenu({ className, ...props }: React.ComponentProps<"ul">): react_jsx_runtime.JSX.Element;
23
+ /** Expandable folder row wrapper — matches `SidebarMenuItem`. */
24
+ declare function OutlineTreeMenuItem({ className, ...props }: React.ComponentProps<"li">): react_jsx_runtime.JSX.Element;
25
+ /** Leaf / nested row inside `OutlineTreeSub` — matches `SidebarMenuSubItem`. */
26
+ declare function OutlineTreeSubItem({ className, ...props }: React.ComponentProps<"li">): react_jsx_runtime.JSX.Element;
27
+ interface OutlineTreeLeafButtonProps extends React.ComponentProps<"button"> {
28
+ surface?: OutlineTreeSurface;
29
+ isActive?: boolean;
30
+ /** Inset `OutlineTreeSub` only — nudge like `SidebarMenuSubButton`. Ignored when parent uses `chevronRail`. */
31
+ subGuideAlign?: boolean;
32
+ }
33
+ /** Selectable leaf row (file / terminal row) — `SidebarMenuSubButton`–aligned rhythm. */
34
+ declare function OutlineTreeLeafButton({ surface, isActive, subGuideAlign, className, ...props }: OutlineTreeLeafButtonProps): react_jsx_runtime.JSX.Element;
35
+
36
+ export { OUTLINE_TREE_CHEVRON_GUIDE_SPACER_CLASS, OUTLINE_TREE_COLLAPSIBLE_CONTENT_RAIL_CLASS, OUTLINE_TREE_SUB_ROW_SHIFT_CLASS, OutlineTreeCollapsibleContentRail, type OutlineTreeGuideLayout, OutlineTreeLeafButton, type OutlineTreeLeafButtonProps, OutlineTreeMenu, OutlineTreeMenuItem, OutlineTreeSub, OutlineTreeSubItem, type OutlineTreeSurface };
@@ -0,0 +1,131 @@
1
+ "use client";
2
+ import { Collapsible } from 'radix-ui';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+ import { clsx } from 'clsx';
5
+ import { twMerge } from 'tailwind-merge';
6
+
7
+ function CollapsibleContent({
8
+ ...props
9
+ }) {
10
+ return /* @__PURE__ */ jsx(
11
+ Collapsible.CollapsibleContent,
12
+ {
13
+ "data-slot": "collapsible-content",
14
+ ...props
15
+ }
16
+ );
17
+ }
18
+ function cn(...inputs) {
19
+ return twMerge(clsx(inputs));
20
+ }
21
+ var outlineTreeSubInsetClass = {
22
+ sidebar: "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",
23
+ panel: "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"
24
+ };
25
+ var outlineTreeSubChevronRailClass = {
26
+ sidebar: "flex min-w-0 flex-1 list-none flex-col gap-1 border-s border-sidebar-border py-0.5 ps-2.5",
27
+ panel: "flex min-w-0 flex-1 list-none flex-col gap-1 border-s border-border/60 py-0.5 ps-2.5"
28
+ };
29
+ var OUTLINE_TREE_SUB_ROW_SHIFT_CLASS = "-translate-x-px rtl:translate-x-px";
30
+ var OUTLINE_TREE_COLLAPSIBLE_CONTENT_RAIL_CLASS = "flex min-w-0 w-full";
31
+ var OUTLINE_TREE_CHEVRON_GUIDE_SPACER_CLASS = "w-6 shrink-0";
32
+ function OutlineTreeCollapsibleContentRail({
33
+ className,
34
+ children,
35
+ ...props
36
+ }) {
37
+ return /* @__PURE__ */ jsxs(
38
+ CollapsibleContent,
39
+ {
40
+ className: cn(OUTLINE_TREE_COLLAPSIBLE_CONTENT_RAIL_CLASS, className),
41
+ ...props,
42
+ children: [
43
+ /* @__PURE__ */ jsx("div", { className: OUTLINE_TREE_CHEVRON_GUIDE_SPACER_CLASS, "aria-hidden": true }),
44
+ children
45
+ ]
46
+ }
47
+ );
48
+ }
49
+ function OutlineTreeSub({
50
+ surface = "panel",
51
+ guideLayout = "inset",
52
+ className,
53
+ ...props
54
+ }) {
55
+ return /* @__PURE__ */ jsx(
56
+ "ul",
57
+ {
58
+ "data-slot": "outline-tree-sub",
59
+ "data-guide-layout": guideLayout,
60
+ className: cn(
61
+ guideLayout === "inset" && outlineTreeSubInsetClass[surface],
62
+ guideLayout === "chevronRail" && outlineTreeSubChevronRailClass[surface],
63
+ className
64
+ ),
65
+ ...props
66
+ }
67
+ );
68
+ }
69
+ function OutlineTreeMenu({ className, ...props }) {
70
+ return /* @__PURE__ */ jsx(
71
+ "ul",
72
+ {
73
+ "data-slot": "outline-tree-menu",
74
+ className: cn("flex w-full min-w-0 list-none flex-col gap-0", className),
75
+ ...props
76
+ }
77
+ );
78
+ }
79
+ function OutlineTreeMenuItem({ className, ...props }) {
80
+ return /* @__PURE__ */ jsx(
81
+ "li",
82
+ {
83
+ "data-slot": "outline-tree-menu-item",
84
+ className: cn("group/menu-item relative min-w-0 w-full list-none", className),
85
+ ...props
86
+ }
87
+ );
88
+ }
89
+ function OutlineTreeSubItem({ className, ...props }) {
90
+ return /* @__PURE__ */ jsx(
91
+ "li",
92
+ {
93
+ "data-slot": "outline-tree-sub-item",
94
+ className: cn("group/menu-sub-item relative min-w-0 w-full list-none", className),
95
+ ...props
96
+ }
97
+ );
98
+ }
99
+ function OutlineTreeLeafButton({
100
+ surface = "panel",
101
+ isActive = false,
102
+ subGuideAlign = false,
103
+ className,
104
+ ...props
105
+ }) {
106
+ return /* @__PURE__ */ jsx(
107
+ "button",
108
+ {
109
+ type: "button",
110
+ "data-active": isActive || void 0,
111
+ className: cn(
112
+ "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",
113
+ subGuideAlign && OUTLINE_TREE_SUB_ROW_SHIFT_CLASS,
114
+ surface === "panel" && cn(
115
+ "text-foreground hover:bg-muted/50",
116
+ isActive && "bg-accent font-medium text-accent-foreground"
117
+ ),
118
+ surface === "sidebar" && cn(
119
+ "text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
120
+ isActive && "bg-sidebar-accent font-medium text-sidebar-accent-foreground"
121
+ ),
122
+ className
123
+ ),
124
+ ...props
125
+ }
126
+ );
127
+ }
128
+
129
+ export { OUTLINE_TREE_CHEVRON_GUIDE_SPACER_CLASS, OUTLINE_TREE_COLLAPSIBLE_CONTENT_RAIL_CLASS, OUTLINE_TREE_SUB_ROW_SHIFT_CLASS, OutlineTreeCollapsibleContentRail, OutlineTreeLeafButton, OutlineTreeMenu, OutlineTreeMenuItem, OutlineTreeSub, OutlineTreeSubItem };
130
+ //# sourceMappingURL=outline-tree-menu.js.map
131
+ //# sourceMappingURL=outline-tree-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/ui/collapsible.tsx","../../../src/lib/utils.ts","../../../src/components/data-views/outline-tree-menu.tsx"],"names":["CollapsiblePrimitive","jsx"],"mappings":";;;;;AAqBA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,GAAG;AACL,CAAA,EAAyE;AACvE,EAAA,uBACE,GAAA;AAAA,IAACA,WAAA,CAAqB,kBAAA;AAAA,IAArB;AAAA,MACC,WAAA,EAAU,qBAAA;AAAA,MACf,GAAG;AAAA;AAAA,GACA;AAEJ;AC3BO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACkBA,IAAM,wBAAA,GAA+D;AAAA,EACnE,OAAA,EACE,8HAAA;AAAA,EACF,KAAA,EACE;AACJ,CAAA;AAEA,IAAM,8BAAA,GAAqE;AAAA,EACzE,OAAA,EACE,2FAAA;AAAA,EACF,KAAA,EAAO;AACT,CAAA;AAGO,IAAM,gCAAA,GAAmC;AAGzC,IAAM,2CAAA,GAA8C;AAGpD,IAAM,uCAAA,GAA0C;AAGhD,SAAS,iCAAA,CAAkC;AAAA,EAChD,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAoD;AAClD,EAAA,uBACE,IAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA,CAAG,2CAAA,EAA6C,SAAS,CAAA;AAAA,MACnE,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,uCAAA,EAAyC,eAAW,IAAA,EAAC,CAAA;AAAA,QACpE;AAAA;AAAA;AAAA,GACH;AAEJ;AAGO,SAAS,cAAA,CAAe;AAAA,EAC7B,OAAA,GAAU,OAAA;AAAA,EACV,WAAA,GAAc,OAAA;AAAA,EACd,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAGG;AACD,EAAA,uBACEA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,kBAAA;AAAA,MACV,mBAAA,EAAmB,WAAA;AAAA,MACnB,SAAA,EAAW,EAAA;AAAA,QACT,WAAA,KAAgB,OAAA,IAAW,wBAAA,CAAyB,OAAO,CAAA;AAAA,QAC3D,WAAA,KAAgB,aAAA,IAAiB,8BAAA,CAA+B,OAAO,CAAA;AAAA,QACvE;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAGO,SAAS,eAAA,CAAgB,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AACnF,EAAA,uBACEA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,mBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,8CAAA,EAAgD,SAAS,CAAA;AAAA,MACtE,GAAG;AAAA;AAAA,GACN;AAEJ;AAGO,SAAS,mBAAA,CAAoB,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AACvF,EAAA,uBACEA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,wBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,mDAAA,EAAqD,SAAS,CAAA;AAAA,MAC3E,GAAG;AAAA;AAAA,GACN;AAEJ;AAGO,SAAS,kBAAA,CAAmB,EAAE,SAAA,EAAW,GAAG,OAAM,EAA+B;AACtF,EAAA,uBACEA,GAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,uBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,uDAAA,EAAyD,SAAS,CAAA;AAAA,MAC/E,GAAG;AAAA;AAAA,GACN;AAEJ;AAUO,SAAS,qBAAA,CAAsB;AAAA,EACpC,OAAA,GAAU,OAAA;AAAA,EACV,QAAA,GAAW,KAAA;AAAA,EACX,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA+B;AAC7B,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,eAAa,QAAA,IAAY,MAAA;AAAA,MACzB,SAAA,EAAW,EAAA;AAAA,QACT,mOAAA;AAAA,QACA,aAAA,IAAiB,gCAAA;AAAA,QACjB,YAAY,OAAA,IACV,EAAA;AAAA,UACE,mCAAA;AAAA,UACA,QAAA,IAAY;AAAA,SACd;AAAA,QACF,YAAY,SAAA,IACV,EAAA;AAAA,UACE,sFAAA;AAAA,UACA,QAAA,IAAY;AAAA,SACd;AAAA,QACF;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"outline-tree-menu.js","sourcesContent":["\"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","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\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"]}
@@ -0,0 +1,22 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+
4
+ interface ColumnRowProps {
5
+ label: string;
6
+ isFirst: boolean;
7
+ isLast: boolean;
8
+ visible: boolean;
9
+ onToggleVisible: () => void;
10
+ onMoveUp: () => void;
11
+ onMoveDown: () => void;
12
+ draggable: true;
13
+ onDragStart: React.DragEventHandler;
14
+ onDragOver: React.DragEventHandler;
15
+ onDrop: React.DragEventHandler;
16
+ onDragEnd: React.DragEventHandler;
17
+ isDragging: boolean;
18
+ isOver: boolean;
19
+ }
20
+ declare function ColumnRow({ label, isFirst, isLast, visible, onToggleVisible, onMoveUp, onMoveDown, draggable, onDragStart, onDragOver, onDrop, onDragEnd, isDragging, isOver, }: ColumnRowProps): react_jsx_runtime.JSX.Element;
21
+
22
+ export { ColumnRow, type ColumnRowProps };
@@ -0,0 +1,153 @@
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { Tooltip as Tooltip$1 } from 'radix-ui';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ function cn(...inputs) {
8
+ return twMerge(clsx(inputs));
9
+ }
10
+ function Tooltip({
11
+ ...props
12
+ }) {
13
+ return /* @__PURE__ */ jsx(Tooltip$1.Root, { "data-slot": "tooltip", ...props });
14
+ }
15
+ function TooltipTrigger({
16
+ className,
17
+ ...props
18
+ }) {
19
+ return /* @__PURE__ */ jsx(
20
+ Tooltip$1.Trigger,
21
+ {
22
+ "data-slot": "tooltip-trigger",
23
+ suppressHydrationWarning: true,
24
+ className: cn("cursor-pointer", className),
25
+ ...props
26
+ }
27
+ );
28
+ }
29
+ function TooltipContent({
30
+ className,
31
+ sideOffset = 0,
32
+ children,
33
+ ...props
34
+ }) {
35
+ return /* @__PURE__ */ jsx(Tooltip$1.Portal, { children: /* @__PURE__ */ jsxs(
36
+ Tooltip$1.Content,
37
+ {
38
+ "data-slot": "tooltip-content",
39
+ sideOffset,
40
+ className: cn(
41
+ "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",
42
+ className
43
+ ),
44
+ ...props,
45
+ children: [
46
+ children,
47
+ /* @__PURE__ */ jsx(Tooltip$1.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground" })
48
+ ]
49
+ }
50
+ ) });
51
+ }
52
+ function Tip({ label, children, side = "top" }) {
53
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
54
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children }),
55
+ /* @__PURE__ */ jsx(TooltipContent, { side, className: "flex flex-wrap items-center gap-1.5", children: label })
56
+ ] });
57
+ }
58
+ function DragHandleGripIcon({ className }) {
59
+ return /* @__PURE__ */ jsx("i", { className: cn("fa-solid fa-grip-dots-vertical shrink-0", className), "aria-hidden": "true" });
60
+ }
61
+ function ToggleSwitch({ checked, onChange, id }) {
62
+ return /* @__PURE__ */ jsx(
63
+ "button",
64
+ {
65
+ id,
66
+ type: "button",
67
+ role: "switch",
68
+ "aria-checked": checked,
69
+ onClick: () => onChange(!checked),
70
+ className: cn(
71
+ "relative inline-flex h-5 w-9 shrink-0 cursor-pointer rounded-full border-2 border-input transition-colors",
72
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1",
73
+ checked ? "bg-primary" : "bg-input"
74
+ ),
75
+ children: /* @__PURE__ */ jsx("span", { className: cn(
76
+ "pointer-events-none inline-block size-4 rounded-full bg-primary-foreground shadow-sm transition-transform",
77
+ checked ? "translate-x-4" : "translate-x-0"
78
+ ) })
79
+ }
80
+ );
81
+ }
82
+ function ColumnRow({
83
+ label,
84
+ isFirst,
85
+ isLast,
86
+ visible,
87
+ onToggleVisible,
88
+ onMoveUp,
89
+ onMoveDown,
90
+ draggable,
91
+ onDragStart,
92
+ onDragOver,
93
+ onDrop,
94
+ onDragEnd,
95
+ isDragging,
96
+ isOver
97
+ }) {
98
+ return /* @__PURE__ */ jsxs(
99
+ "div",
100
+ {
101
+ role: "listitem",
102
+ draggable,
103
+ onDragStart,
104
+ onDragOver,
105
+ onDrop,
106
+ onDragEnd,
107
+ className: cn(
108
+ "flex items-center gap-2 px-2 py-2 rounded-lg group hover:bg-interactive-hover-subtle transition-colors cursor-grab active:cursor-grabbing",
109
+ isDragging && "opacity-40",
110
+ isOver && "ring-2 ring-ring bg-accent/30"
111
+ ),
112
+ children: [
113
+ /* @__PURE__ */ jsx(DragHandleGripIcon, { className: "text-[13px] text-muted-foreground/40 transition-colors group-hover:text-muted-foreground" }),
114
+ /* @__PURE__ */ jsx("span", { className: "flex-1 text-sm text-foreground", children: label }),
115
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity", children: [
116
+ /* @__PURE__ */ jsx(Tip, { label: `Move ${label} up`, side: "top", children: /* @__PURE__ */ jsx(
117
+ "button",
118
+ {
119
+ type: "button",
120
+ "aria-label": `Move ${label} up`,
121
+ disabled: isFirst,
122
+ onClick: onMoveUp,
123
+ 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",
124
+ children: /* @__PURE__ */ jsx("i", { className: "fa-light fa-chevron-up text-xs", "aria-hidden": "true" })
125
+ }
126
+ ) }),
127
+ /* @__PURE__ */ jsx(Tip, { label: `Move ${label} down`, side: "top", children: /* @__PURE__ */ jsx(
128
+ "button",
129
+ {
130
+ type: "button",
131
+ "aria-label": `Move ${label} down`,
132
+ disabled: isLast,
133
+ onClick: onMoveDown,
134
+ 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",
135
+ children: /* @__PURE__ */ jsx("i", { className: "fa-light fa-chevron-down text-xs", "aria-hidden": "true" })
136
+ }
137
+ ) })
138
+ ] }),
139
+ /* @__PURE__ */ jsx(
140
+ ToggleSwitch,
141
+ {
142
+ checked: visible,
143
+ onChange: onToggleVisible
144
+ }
145
+ )
146
+ ]
147
+ }
148
+ );
149
+ }
150
+
151
+ export { ColumnRow };
152
+ //# sourceMappingURL=column-row.js.map
153
+ //# sourceMappingURL=column-row.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/tooltip.tsx","../../../src/components/ui/tip.tsx","../../../src/components/ui/drag-handle-grip.tsx","../../../src/components/ui/toggle-switch.tsx","../../../src/components/table-properties/column-row.tsx"],"names":["TooltipPrimitive","jsxs","jsx"],"mappings":"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","file":"column-row.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","\"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","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 { 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 { 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"]}
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+
3
+ /**
4
+ * useDraggableList — pointer-driven reorder hook used by drawer sort cards,
5
+ * column rows, and conditional-rule lists. Generic over item shape via
6
+ * `getId(item) => string | number`.
7
+ */
8
+
9
+ interface DraggableListHandle {
10
+ dragId: string | null;
11
+ overId: string | null;
12
+ getItemProps: (id: string) => {
13
+ draggable: true;
14
+ onDragStart: (e: React.DragEvent) => void;
15
+ onDragOver: (e: React.DragEvent) => void;
16
+ onDrop: (e: React.DragEvent) => void;
17
+ onDragEnd: () => void;
18
+ "data-dragging": boolean;
19
+ "data-over": boolean;
20
+ };
21
+ }
22
+ declare function useDraggableList<T>(items: T[], getId: (item: T) => string, onReorder: (newItems: T[]) => void): DraggableListHandle;
23
+
24
+ export { type DraggableListHandle, useDraggableList };
@@ -0,0 +1,53 @@
1
+ import * as React from 'react';
2
+
3
+ // src/components/table-properties/draggable-list.ts
4
+ function useDraggableList(items, getId, onReorder) {
5
+ const [dragId, setDragId] = React.useState(null);
6
+ const [overId, setOverId] = React.useState(null);
7
+ function getItemProps(id) {
8
+ return {
9
+ draggable: true,
10
+ onDragStart: (e) => {
11
+ e.dataTransfer.effectAllowed = "move";
12
+ setDragId(id);
13
+ },
14
+ onDragOver: (e) => {
15
+ e.preventDefault();
16
+ e.dataTransfer.dropEffect = "move";
17
+ setOverId(id);
18
+ },
19
+ onDrop: (e) => {
20
+ e.preventDefault();
21
+ if (!dragId || dragId === id) {
22
+ setDragId(null);
23
+ setOverId(null);
24
+ return;
25
+ }
26
+ const from = items.findIndex((i) => getId(i) === dragId);
27
+ const to = items.findIndex((i) => getId(i) === id);
28
+ if (from === -1 || to === -1) {
29
+ setDragId(null);
30
+ setOverId(null);
31
+ return;
32
+ }
33
+ const next = [...items];
34
+ const [moved] = next.splice(from, 1);
35
+ next.splice(to, 0, moved);
36
+ onReorder(next);
37
+ setDragId(null);
38
+ setOverId(null);
39
+ },
40
+ onDragEnd: () => {
41
+ setDragId(null);
42
+ setOverId(null);
43
+ },
44
+ "data-dragging": dragId === id,
45
+ "data-over": overId === id && dragId !== id
46
+ };
47
+ }
48
+ return { dragId, overId, getItemProps };
49
+ }
50
+
51
+ export { useDraggableList };
52
+ //# sourceMappingURL=draggable-list.js.map
53
+ //# sourceMappingURL=draggable-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/table-properties/draggable-list.ts"],"names":[],"mappings":";;;AAqBO,SAAS,gBAAA,CACd,KAAA,EACA,KAAA,EACA,SAAA,EACqB;AACrB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,eAAwB,IAAI,CAAA;AAC9D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,eAAwB,IAAI,CAAA;AAE9D,EAAA,SAAS,aAAa,EAAA,EAAY;AAChC,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAa,CAAC,CAAA,KAAuB;AAAE,QAAA,CAAA,CAAE,aAAa,aAAA,GAAgB,MAAA;AAAQ,QAAA,SAAA,CAAU,EAAE,CAAA;AAAA,MAAE,CAAA;AAAA,MAC5F,UAAA,EAAY,CAAC,CAAA,KAAuB;AAAE,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,CAAA,CAAE,aAAa,UAAA,GAAa,MAAA;AAAQ,QAAA,SAAA,CAAU,EAAE,CAAA;AAAA,MAAE,CAAA;AAAA,MAC5G,MAAA,EAAQ,CAAC,CAAA,KAAuB;AAC9B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,CAAC,MAAA,IAAU,MAAA,KAAW,EAAA,EAAI;AAAE,UAAA,SAAA,CAAU,IAAI,CAAA;AAAG,UAAA,SAAA,CAAU,IAAI,CAAA;AAAG,UAAA;AAAA,QAAO;AACzE,QAAA,MAAM,OAAO,KAAA,CAAM,SAAA,CAAU,OAAK,KAAA,CAAM,CAAC,MAAM,MAAM,CAAA;AACrD,QAAA,MAAM,KAAO,KAAA,CAAM,SAAA,CAAU,OAAK,KAAA,CAAM,CAAC,MAAM,EAAE,CAAA;AACjD,QAAA,IAAI,IAAA,KAAS,EAAA,IAAM,EAAA,KAAO,EAAA,EAAI;AAAE,UAAA,SAAA,CAAU,IAAI,CAAA;AAAG,UAAA,SAAA,CAAU,IAAI,CAAA;AAAG,UAAA;AAAA,QAAO;AACzE,QAAA,MAAM,IAAA,GAAO,CAAC,GAAG,KAAK,CAAA;AACtB,QAAA,MAAM,CAAC,KAAK,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AACnC,QAAA,IAAA,CAAK,MAAA,CAAO,EAAA,EAAI,CAAA,EAAG,KAAK,CAAA;AACxB,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,SAAA,CAAU,IAAI,CAAA;AAAG,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MACjC,CAAA;AAAA,MACA,WAAW,MAAM;AAAE,QAAA,SAAA,CAAU,IAAI,CAAA;AAAG,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MAAE,CAAA;AAAA,MACpD,iBAAiB,MAAA,KAAW,EAAA;AAAA,MAC5B,WAAA,EAAa,MAAA,KAAW,EAAA,IAAM,MAAA,KAAW;AAAA,KAC3C;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,YAAA,EAAa;AACxC","file":"draggable-list.js","sourcesContent":["/**\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"]}