@atmos.build/ui 0.1.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 (431) hide show
  1. package/README.md +45 -0
  2. package/dist/components/alert-dialog.d.ts +14 -0
  3. package/dist/components/alert-dialog.js +40 -0
  4. package/dist/components/at-search.d.ts +35 -0
  5. package/dist/components/at-search.js +57 -0
  6. package/dist/components/attachment-thumbnail-stack.d.ts +13 -0
  7. package/dist/components/attachment-thumbnail-stack.js +23 -0
  8. package/dist/components/audio-preview.d.ts +33 -0
  9. package/dist/components/audio-preview.js +176 -0
  10. package/dist/components/avatar-uploader.d.ts +29 -0
  11. package/dist/components/avatar-uploader.js +67 -0
  12. package/dist/components/avatar.d.ts +12 -0
  13. package/dist/components/avatar.js +38 -0
  14. package/dist/components/badge.d.ts +9 -0
  15. package/dist/components/badge.js +25 -0
  16. package/dist/components/button-group.d.ts +12 -0
  17. package/dist/components/button-group.js +29 -0
  18. package/dist/components/button.d.ts +10 -0
  19. package/dist/components/button.js +42 -0
  20. package/dist/components/calendar.d.ts +26 -0
  21. package/dist/components/calendar.js +154 -0
  22. package/dist/components/channel-list.d.ts +33 -0
  23. package/dist/components/channel-list.js +40 -0
  24. package/dist/components/charts/area-chart.d.ts +2 -0
  25. package/dist/components/charts/area-chart.js +5 -0
  26. package/dist/components/charts/bar-chart.d.ts +2 -0
  27. package/dist/components/charts/bar-chart.js +58 -0
  28. package/dist/components/charts/colors.d.ts +2 -0
  29. package/dist/components/charts/colors.js +42 -0
  30. package/dist/components/charts/hover.d.ts +20 -0
  31. package/dist/components/charts/hover.js +31 -0
  32. package/dist/components/charts/index.d.ts +10 -0
  33. package/dist/components/charts/index.js +9 -0
  34. package/dist/components/charts/layout.d.ts +35 -0
  35. package/dist/components/charts/layout.js +101 -0
  36. package/dist/components/charts/legend.d.ts +6 -0
  37. package/dist/components/charts/legend.js +7 -0
  38. package/dist/components/charts/line-area-chart.d.ts +4 -0
  39. package/dist/components/charts/line-area-chart.js +86 -0
  40. package/dist/components/charts/line-chart.d.ts +2 -0
  41. package/dist/components/charts/line-chart.js +5 -0
  42. package/dist/components/charts/pie-chart.d.ts +2 -0
  43. package/dist/components/charts/pie-chart.js +22 -0
  44. package/dist/components/charts/radar-chart.d.ts +2 -0
  45. package/dist/components/charts/radar-chart.js +29 -0
  46. package/dist/components/charts/radial-chart.d.ts +2 -0
  47. package/dist/components/charts/radial-chart.js +19 -0
  48. package/dist/components/charts/scatter-chart.d.ts +2 -0
  49. package/dist/components/charts/scatter-chart.js +16 -0
  50. package/dist/components/charts/story-data.d.ts +24 -0
  51. package/dist/components/charts/story-data.js +48 -0
  52. package/dist/components/charts/types.d.ts +43 -0
  53. package/dist/components/charts/types.js +1 -0
  54. package/dist/components/checkbox.d.ts +4 -0
  55. package/dist/components/checkbox.js +10 -0
  56. package/dist/components/chip.d.ts +25 -0
  57. package/dist/components/chip.js +36 -0
  58. package/dist/components/code-editor-theme.d.ts +19 -0
  59. package/dist/components/code-editor-theme.js +100 -0
  60. package/dist/components/collapsible-section-header.d.ts +82 -0
  61. package/dist/components/collapsible-section-header.js +82 -0
  62. package/dist/components/collection-view/collection-view-group-settings.d.ts +73 -0
  63. package/dist/components/collection-view/collection-view-group-settings.js +55 -0
  64. package/dist/components/collection-view/collection-view-settings.d.ts +115 -0
  65. package/dist/components/collection-view/collection-view-settings.js +146 -0
  66. package/dist/components/collection-view/collection-view.d.ts +87 -0
  67. package/dist/components/collection-view/collection-view.js +95 -0
  68. package/dist/components/collection-view/index.d.ts +6 -0
  69. package/dist/components/collection-view/index.js +6 -0
  70. package/dist/components/collection-view/use-collection-detail-navigation.d.ts +11 -0
  71. package/dist/components/collection-view/use-collection-detail-navigation.js +12 -0
  72. package/dist/components/collection-view/use-collection-escape.d.ts +9 -0
  73. package/dist/components/collection-view/use-collection-escape.js +20 -0
  74. package/dist/components/collection-view/use-collection-selection.d.ts +42 -0
  75. package/dist/components/collection-view/use-collection-selection.js +203 -0
  76. package/dist/components/color-picker.d.ts +18 -0
  77. package/dist/components/color-picker.js +77 -0
  78. package/dist/components/color-swatch-list.d.ts +16 -0
  79. package/dist/components/color-swatch-list.js +60 -0
  80. package/dist/components/combobox/combobox.d.ts +4 -0
  81. package/dist/components/combobox/combobox.js +70 -0
  82. package/dist/components/combobox/compound.d.ts +68 -0
  83. package/dist/components/combobox/compound.js +151 -0
  84. package/dist/components/combobox/context.d.ts +34 -0
  85. package/dist/components/combobox/context.js +123 -0
  86. package/dist/components/combobox/create-step.d.ts +12 -0
  87. package/dist/components/combobox/create-step.js +8 -0
  88. package/dist/components/combobox/index.d.ts +10 -0
  89. package/dist/components/combobox/index.js +5 -0
  90. package/dist/components/combobox/inline-create-form.d.ts +24 -0
  91. package/dist/components/combobox/inline-create-form.js +43 -0
  92. package/dist/components/combobox/types.d.ts +57 -0
  93. package/dist/components/combobox/types.js +10 -0
  94. package/dist/components/command.d.ts +35 -0
  95. package/dist/components/command.js +76 -0
  96. package/dist/components/comment-pin.d.ts +13 -0
  97. package/dist/components/comment-pin.js +33 -0
  98. package/dist/components/confidence-meter.d.ts +11 -0
  99. package/dist/components/confidence-meter.js +24 -0
  100. package/dist/components/context-menu.d.ts +31 -0
  101. package/dist/components/context-menu.js +54 -0
  102. package/dist/components/copy-button.d.ts +12 -0
  103. package/dist/components/copy-button.js +32 -0
  104. package/dist/components/date-picker.d.ts +29 -0
  105. package/dist/components/date-picker.js +86 -0
  106. package/dist/components/date-tile.d.ts +11 -0
  107. package/dist/components/date-tile.js +16 -0
  108. package/dist/components/date-time-picker.d.ts +25 -0
  109. package/dist/components/date-time-picker.js +153 -0
  110. package/dist/components/detail-breadcrumb-utils.d.ts +2 -0
  111. package/dist/components/detail-breadcrumb-utils.js +18 -0
  112. package/dist/components/detail-nav-bar.d.ts +28 -0
  113. package/dist/components/detail-nav-bar.js +28 -0
  114. package/dist/components/detail-top-bar.d.ts +49 -0
  115. package/dist/components/detail-top-bar.js +41 -0
  116. package/dist/components/dialog.d.ts +22 -0
  117. package/dist/components/dialog.js +51 -0
  118. package/dist/components/dropdown-menu.d.ts +29 -0
  119. package/dist/components/dropdown-menu.js +52 -0
  120. package/dist/components/editable-doc-title.d.ts +17 -0
  121. package/dist/components/editable-doc-title.js +147 -0
  122. package/dist/components/empty-state.d.ts +12 -0
  123. package/dist/components/empty-state.js +6 -0
  124. package/dist/components/filter-condition-editor.d.ts +18 -0
  125. package/dist/components/filter-condition-editor.js +102 -0
  126. package/dist/components/form-dialog.d.ts +30 -0
  127. package/dist/components/form-dialog.js +52 -0
  128. package/dist/components/formula-editor.d.ts +18 -0
  129. package/dist/components/formula-editor.js +154 -0
  130. package/dist/components/hover-card.d.ts +52 -0
  131. package/dist/components/hover-card.js +51 -0
  132. package/dist/components/icon-button.d.ts +15 -0
  133. package/dist/components/icon-button.js +18 -0
  134. package/dist/components/inline-alert.d.ts +11 -0
  135. package/dist/components/inline-alert.js +17 -0
  136. package/dist/components/input.d.ts +3 -0
  137. package/dist/components/input.js +7 -0
  138. package/dist/components/kanban-board.d.ts +27 -0
  139. package/dist/components/kanban-board.js +145 -0
  140. package/dist/components/kbd.d.ts +3 -0
  141. package/dist/components/kbd.js +8 -0
  142. package/dist/components/label.d.ts +4 -0
  143. package/dist/components/label.js +9 -0
  144. package/dist/components/markdown-editor/index.d.ts +4 -0
  145. package/dist/components/markdown-editor/index.js +2 -0
  146. package/dist/components/markdown-editor/markdown-editor.d.ts +16 -0
  147. package/dist/components/markdown-editor/markdown-editor.js +53 -0
  148. package/dist/components/markdown-editor/serialize.d.ts +12 -0
  149. package/dist/components/markdown-editor/serialize.js +122 -0
  150. package/dist/components/markdown-editor/vim.d.ts +8 -0
  151. package/dist/components/markdown-editor/vim.js +394 -0
  152. package/dist/components/metric-grid.d.ts +41 -0
  153. package/dist/components/metric-grid.js +39 -0
  154. package/dist/components/microphone-priority.d.ts +29 -0
  155. package/dist/components/microphone-priority.js +15 -0
  156. package/dist/components/middle-truncate.d.ts +6 -0
  157. package/dist/components/middle-truncate.js +15 -0
  158. package/dist/components/multi-combobox.d.ts +48 -0
  159. package/dist/components/multi-combobox.js +221 -0
  160. package/dist/components/naut-avatar-engine.d.ts +83 -0
  161. package/dist/components/naut-avatar-engine.js +803 -0
  162. package/dist/components/naut-avatar.d.ts +31 -0
  163. package/dist/components/naut-avatar.js +108 -0
  164. package/dist/components/navigable-list.d.ts +4 -0
  165. package/dist/components/navigable-list.js +20 -0
  166. package/dist/components/note-icon-picker.d.ts +20 -0
  167. package/dist/components/note-icon-picker.js +84 -0
  168. package/dist/components/note-icon.d.ts +690 -0
  169. package/dist/components/note-icon.js +353 -0
  170. package/dist/components/note-row.d.ts +33 -0
  171. package/dist/components/note-row.js +29 -0
  172. package/dist/components/overlapping-dots.d.ts +10 -0
  173. package/dist/components/overlapping-dots.js +13 -0
  174. package/dist/components/overview-card.d.ts +12 -0
  175. package/dist/components/overview-card.js +9 -0
  176. package/dist/components/panel-header.d.ts +8 -0
  177. package/dist/components/panel-header.js +6 -0
  178. package/dist/components/panel-section-states.d.ts +9 -0
  179. package/dist/components/panel-section-states.js +10 -0
  180. package/dist/components/person-avatar.d.ts +10 -0
  181. package/dist/components/person-avatar.js +23 -0
  182. package/dist/components/photo-avatar.d.ts +11 -0
  183. package/dist/components/photo-avatar.js +24 -0
  184. package/dist/components/picker-field.d.ts +23 -0
  185. package/dist/components/picker-field.js +24 -0
  186. package/dist/components/popover-stack.d.ts +26 -0
  187. package/dist/components/popover-stack.js +89 -0
  188. package/dist/components/popover.d.ts +12 -0
  189. package/dist/components/popover.js +31 -0
  190. package/dist/components/portal-login-barrier.d.ts +12 -0
  191. package/dist/components/portal-login-barrier.js +41 -0
  192. package/dist/components/presence-dot.d.ts +8 -0
  193. package/dist/components/presence-dot.js +15 -0
  194. package/dist/components/presence-overlay.d.ts +27 -0
  195. package/dist/components/presence-overlay.js +34 -0
  196. package/dist/components/property-list.d.ts +64 -0
  197. package/dist/components/property-list.js +313 -0
  198. package/dist/components/property-panel.d.ts +54 -0
  199. package/dist/components/property-panel.js +87 -0
  200. package/dist/components/property-selector.d.ts +36 -0
  201. package/dist/components/property-selector.js +141 -0
  202. package/dist/components/provenance-chip.d.ts +12 -0
  203. package/dist/components/provenance-chip.js +17 -0
  204. package/dist/components/qr-code.d.ts +13 -0
  205. package/dist/components/qr-code.js +42 -0
  206. package/dist/components/qr-encode.d.ts +2 -0
  207. package/dist/components/qr-encode.js +469 -0
  208. package/dist/components/quantity-stepper.d.ts +25 -0
  209. package/dist/components/quantity-stepper.js +43 -0
  210. package/dist/components/radio-group.d.ts +5 -0
  211. package/dist/components/radio-group.js +13 -0
  212. package/dist/components/rename-dialog.d.ts +19 -0
  213. package/dist/components/rename-dialog.js +35 -0
  214. package/dist/components/row-surface.d.ts +1 -0
  215. package/dist/components/row-surface.js +5 -0
  216. package/dist/components/row-trailing.d.ts +30 -0
  217. package/dist/components/row-trailing.js +59 -0
  218. package/dist/components/run-status-badge.d.ts +16 -0
  219. package/dist/components/run-status-badge.js +43 -0
  220. package/dist/components/scroll-area.d.ts +5 -0
  221. package/dist/components/scroll-area.js +12 -0
  222. package/dist/components/select.d.ts +15 -0
  223. package/dist/components/select.js +39 -0
  224. package/dist/components/selectable-card.d.ts +33 -0
  225. package/dist/components/selectable-card.js +66 -0
  226. package/dist/components/separator.d.ts +3 -0
  227. package/dist/components/separator.js +8 -0
  228. package/dist/components/settings-dialog-shell.d.ts +46 -0
  229. package/dist/components/settings-dialog-shell.js +48 -0
  230. package/dist/components/shimmer-text.d.ts +8 -0
  231. package/dist/components/shimmer-text.js +26 -0
  232. package/dist/components/side-panel-tokens.d.ts +27 -0
  233. package/dist/components/side-panel-tokens.js +26 -0
  234. package/dist/components/side-panel.d.ts +94 -0
  235. package/dist/components/side-panel.js +106 -0
  236. package/dist/components/skeleton.d.ts +2 -0
  237. package/dist/components/skeleton.js +6 -0
  238. package/dist/components/sortable.d.ts +65 -0
  239. package/dist/components/sortable.js +110 -0
  240. package/dist/components/spec-strip.d.ts +18 -0
  241. package/dist/components/spec-strip.js +15 -0
  242. package/dist/components/speech-playback.d.ts +25 -0
  243. package/dist/components/speech-playback.js +35 -0
  244. package/dist/components/sql-editor.d.ts +13 -0
  245. package/dist/components/sql-editor.js +228 -0
  246. package/dist/components/stat-tile.d.ts +7 -0
  247. package/dist/components/stat-tile.js +6 -0
  248. package/dist/components/status-badge.d.ts +17 -0
  249. package/dist/components/status-badge.js +8 -0
  250. package/dist/components/status-tone.d.ts +9 -0
  251. package/dist/components/status-tone.js +10 -0
  252. package/dist/components/sticky-header-fade.d.ts +8 -0
  253. package/dist/components/sticky-header-fade.js +11 -0
  254. package/dist/components/swatch-button.d.ts +14 -0
  255. package/dist/components/swatch-button.js +25 -0
  256. package/dist/components/switch.d.ts +6 -0
  257. package/dist/components/switch.js +9 -0
  258. package/dist/components/system-load/index.d.ts +6 -0
  259. package/dist/components/system-load/index.js +6 -0
  260. package/dist/components/system-load/load-block.d.ts +20 -0
  261. package/dist/components/system-load/load-block.js +23 -0
  262. package/dist/components/system-load/load-grid.d.ts +16 -0
  263. package/dist/components/system-load/load-grid.js +23 -0
  264. package/dist/components/system-load/load-meter.d.ts +25 -0
  265. package/dist/components/system-load/load-meter.js +29 -0
  266. package/dist/components/system-load/load-tone.d.ts +21 -0
  267. package/dist/components/system-load/load-tone.js +29 -0
  268. package/dist/components/system-load/meter-row.d.ts +31 -0
  269. package/dist/components/system-load/meter-row.js +29 -0
  270. package/dist/components/system-load/resource-meter.d.ts +19 -0
  271. package/dist/components/system-load/resource-meter.js +15 -0
  272. package/dist/components/tab-title-bar.d.ts +12 -0
  273. package/dist/components/tab-title-bar.js +9 -0
  274. package/dist/components/table.d.ts +10 -0
  275. package/dist/components/table.js +29 -0
  276. package/dist/components/tabs.d.ts +11 -0
  277. package/dist/components/tabs.js +97 -0
  278. package/dist/components/template-chip-input.d.ts +36 -0
  279. package/dist/components/template-chip-input.js +271 -0
  280. package/dist/components/template-input.d.ts +24 -0
  281. package/dist/components/template-input.js +57 -0
  282. package/dist/components/terminal-spinner.d.ts +11 -0
  283. package/dist/components/terminal-spinner.js +48 -0
  284. package/dist/components/textarea.d.ts +3 -0
  285. package/dist/components/textarea.js +7 -0
  286. package/dist/components/time-column.d.ts +24 -0
  287. package/dist/components/time-column.js +60 -0
  288. package/dist/components/timestamped-transcript.d.ts +38 -0
  289. package/dist/components/timestamped-transcript.js +29 -0
  290. package/dist/components/timezone-picker.d.ts +22 -0
  291. package/dist/components/timezone-picker.js +60 -0
  292. package/dist/components/tooltip.d.ts +11 -0
  293. package/dist/components/tooltip.js +29 -0
  294. package/dist/components/transcription-overlay.d.ts +47 -0
  295. package/dist/components/transcription-overlay.js +30 -0
  296. package/dist/components/usage-bar.d.ts +17 -0
  297. package/dist/components/usage-bar.js +26 -0
  298. package/dist/components/view-query-bar.d.ts +13 -0
  299. package/dist/components/view-query-bar.js +13 -0
  300. package/dist/components/view-query-controls.d.ts +159 -0
  301. package/dist/components/view-query-controls.js +109 -0
  302. package/dist/components/view-save-menu.d.ts +20 -0
  303. package/dist/components/view-save-menu.js +13 -0
  304. package/dist/components/view-sort-editor.d.ts +40 -0
  305. package/dist/components/view-sort-editor.js +47 -0
  306. package/dist/components/voice-line.d.ts +37 -0
  307. package/dist/components/voice-line.js +293 -0
  308. package/dist/components/weekly-schedule-editor.d.ts +15 -0
  309. package/dist/components/weekly-schedule-editor.js +28 -0
  310. package/dist/flow/canvas/canvas-frame.d.ts +160 -0
  311. package/dist/flow/canvas/canvas-frame.js +521 -0
  312. package/dist/flow/canvas/collaborator-layer.d.ts +12 -0
  313. package/dist/flow/canvas/collaborator-layer.js +43 -0
  314. package/dist/flow/canvas/connector-edge.d.ts +22 -0
  315. package/dist/flow/canvas/connector-edge.js +61 -0
  316. package/dist/flow/canvas/editor-context.d.ts +23 -0
  317. package/dist/flow/canvas/editor-context.js +6 -0
  318. package/dist/flow/canvas/graph-core.d.ts +60 -0
  319. package/dist/flow/canvas/graph-core.js +296 -0
  320. package/dist/flow/canvas/minimap-sticky-overlay.d.ts +4 -0
  321. package/dist/flow/canvas/minimap-sticky-overlay.js +45 -0
  322. package/dist/flow/canvas/node-card.d.ts +46 -0
  323. package/dist/flow/canvas/node-card.js +56 -0
  324. package/dist/flow/canvas/node-library.d.ts +40 -0
  325. package/dist/flow/canvas/node-library.js +54 -0
  326. package/dist/flow/canvas/sticky-notes.d.ts +25 -0
  327. package/dist/flow/canvas/sticky-notes.js +101 -0
  328. package/dist/flow/collaborative-graph-presence.d.ts +28 -0
  329. package/dist/flow/collaborative-graph-presence.js +55 -0
  330. package/dist/flow/collaborative-graph-sync.d.ts +40 -0
  331. package/dist/flow/collaborative-graph-sync.js +127 -0
  332. package/dist/flow/editor/adapter.d.ts +64 -0
  333. package/dist/flow/editor/adapter.js +1 -0
  334. package/dist/flow/editor/command-registry.d.ts +10 -0
  335. package/dist/flow/editor/command-registry.js +35 -0
  336. package/dist/flow/editor/dag-canvas.d.ts +18 -0
  337. package/dist/flow/editor/dag-canvas.js +33 -0
  338. package/dist/flow/editor/flow-editor.d.ts +54 -0
  339. package/dist/flow/editor/flow-editor.js +199 -0
  340. package/dist/flow/editor/issues-popover.d.ts +11 -0
  341. package/dist/flow/editor/issues-popover.js +70 -0
  342. package/dist/flow/editor/library-rail.d.ts +19 -0
  343. package/dist/flow/editor/library-rail.js +25 -0
  344. package/dist/flow/editor/make-controller.d.ts +18 -0
  345. package/dist/flow/editor/make-controller.js +44 -0
  346. package/dist/flow/editor/node-chip.d.ts +2 -0
  347. package/dist/flow/editor/node-chip.js +16 -0
  348. package/dist/flow/editor/save-publish-bar.d.ts +27 -0
  349. package/dist/flow/editor/save-publish-bar.js +14 -0
  350. package/dist/flow/editor/settings-dialog.d.ts +11 -0
  351. package/dist/flow/editor/settings-dialog.js +11 -0
  352. package/dist/flow/editor/settings-shell.d.ts +21 -0
  353. package/dist/flow/editor/settings-shell.js +20 -0
  354. package/dist/flow/editor/side-rail.d.ts +22 -0
  355. package/dist/flow/editor/side-rail.js +15 -0
  356. package/dist/flow/editor/use-dag-editor.d.ts +94 -0
  357. package/dist/flow/editor/use-dag-editor.js +502 -0
  358. package/dist/flow/index.d.ts +25 -0
  359. package/dist/flow/index.js +25 -0
  360. package/dist/flow/presence-motion.d.ts +10 -0
  361. package/dist/flow/presence-motion.js +88 -0
  362. package/dist/flow/styles.css +1 -0
  363. package/dist/flow/use-collaborative-graph.d.ts +61 -0
  364. package/dist/flow/use-collaborative-graph.js +396 -0
  365. package/dist/flow/use-debounced-value.d.ts +1 -0
  366. package/dist/flow/use-debounced-value.js +10 -0
  367. package/dist/hooks/use-detail-nav.d.ts +11 -0
  368. package/dist/hooks/use-detail-nav.js +49 -0
  369. package/dist/hooks/use-flush-on-hide.d.ts +1 -0
  370. package/dist/hooks/use-flush-on-hide.js +21 -0
  371. package/dist/hooks/use-media-query.d.ts +1 -0
  372. package/dist/hooks/use-media-query.js +20 -0
  373. package/dist/hooks/use-virtualizer.d.ts +1 -0
  374. package/dist/hooks/use-virtualizer.js +1 -0
  375. package/dist/index.d.ts +139 -0
  376. package/dist/index.js +139 -0
  377. package/dist/lib/brand-style.d.ts +6 -0
  378. package/dist/lib/brand-style.js +16 -0
  379. package/dist/lib/cn.d.ts +2 -0
  380. package/dist/lib/cn.js +5 -0
  381. package/dist/lib/composited-glint.d.ts +7 -0
  382. package/dist/lib/composited-glint.js +98 -0
  383. package/dist/lib/date-time-format.d.ts +2 -0
  384. package/dist/lib/date-time-format.js +21 -0
  385. package/dist/lib/disclosure-state.d.ts +11 -0
  386. package/dist/lib/disclosure-state.js +22 -0
  387. package/dist/lib/label-swatches.d.ts +10 -0
  388. package/dist/lib/label-swatches.js +24 -0
  389. package/dist/lib/local-ui-state.d.ts +10 -0
  390. package/dist/lib/local-ui-state.js +95 -0
  391. package/dist/lib/parse-loose-datetime.d.ts +1 -0
  392. package/dist/lib/parse-loose-datetime.js +180 -0
  393. package/dist/lib/parse-loose-time.d.ts +6 -0
  394. package/dist/lib/parse-loose-time.js +53 -0
  395. package/dist/lib/parse-loose.d.ts +1 -0
  396. package/dist/lib/parse-loose.js +170 -0
  397. package/dist/lib/react-19-jsx.d.ts +8 -0
  398. package/dist/lib/react-19-jsx.js +1 -0
  399. package/dist/lib/view-chrome.d.ts +5 -0
  400. package/dist/lib/view-chrome.js +5 -0
  401. package/dist/lib/view-query/config.d.ts +26 -0
  402. package/dist/lib/view-query/config.js +162 -0
  403. package/dist/lib/view-query/evaluate.d.ts +11 -0
  404. package/dist/lib/view-query/evaluate.js +196 -0
  405. package/dist/lib/view-query/group-order.d.ts +25 -0
  406. package/dist/lib/view-query/group-order.js +49 -0
  407. package/dist/lib/view-query/index.d.ts +6 -0
  408. package/dist/lib/view-query/index.js +6 -0
  409. package/dist/lib/view-query/model.d.ts +34 -0
  410. package/dist/lib/view-query/model.js +88 -0
  411. package/dist/lib/view-query/sort.d.ts +7 -0
  412. package/dist/lib/view-query/sort.js +30 -0
  413. package/dist/lib/view-query/types.d.ts +70 -0
  414. package/dist/lib/view-query/types.js +12 -0
  415. package/dist/lib/weekly-schedule.d.ts +8 -0
  416. package/dist/lib/weekly-schedule.js +10 -0
  417. package/dist/mcp-app/index.d.ts +4 -0
  418. package/dist/mcp-app/index.js +3 -0
  419. package/dist/mcp-app/shadcn.css +629 -0
  420. package/dist/mcp-app/styles.css +72 -0
  421. package/dist/mcp-app/theme.d.ts +2 -0
  422. package/dist/mcp-app/theme.js +62 -0
  423. package/dist/mcp-app/use-atmos-mcp-app.d.ts +109 -0
  424. package/dist/mcp-app/use-atmos-mcp-app.js +30 -0
  425. package/dist/mcp-app/vite.d.ts +7 -0
  426. package/dist/mcp-app/vite.js +30 -0
  427. package/dist/tokens/index.d.ts +7 -0
  428. package/dist/tokens/index.js +7 -0
  429. package/dist/tokens/semantic.css +110 -0
  430. package/dist/tokens/tokens.css +195 -0
  431. package/package.json +98 -0
@@ -0,0 +1,35 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useRef, useState } from 'react';
4
+ import { Button } from "./button.js";
5
+ import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from './dialog.js';
6
+ import { Input } from "./input.js";
7
+ import { Label } from "./label.js";
8
+ export function RenameDialog({ open, value, title, label, confirmLabel, cancelLabel, onOpenChange, onSubmit, description, placeholder, busy = false, error, requiredError, detail, detailPlacement = 'bottom', }) {
9
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsx(RenameDialogContent, { value: value, title: title, label: label, confirmLabel: confirmLabel, cancelLabel: cancelLabel, onOpenChange: onOpenChange, onSubmit: onSubmit, description: description, placeholder: placeholder, busy: busy, error: error, requiredError: requiredError, detail: detail, detailPlacement: detailPlacement }, `${open ? 'open' : 'closed'}:${value}`) }));
10
+ }
11
+ function RenameDialogContent({ value, title, label, confirmLabel, cancelLabel, onOpenChange, onSubmit, description, placeholder, busy, error, requiredError, detail, detailPlacement = 'bottom', }) {
12
+ const [draft, setDraft] = useState(value);
13
+ const [localError, setLocalError] = useState(null);
14
+ const inputRef = useRef(null);
15
+ const submit = (event) => {
16
+ event.preventDefault();
17
+ const trimmed = draft.trim();
18
+ if (!trimmed) {
19
+ setLocalError(requiredError ?? null);
20
+ return;
21
+ }
22
+ setLocalError(null);
23
+ void onSubmit(trimmed);
24
+ };
25
+ return (_jsx(DialogContent, { className: "sm:max-w-sm", onOpenAutoFocus: (event) => {
26
+ event.preventDefault();
27
+ requestAnimationFrame(() => {
28
+ inputRef.current?.focus();
29
+ inputRef.current?.select();
30
+ });
31
+ }, children: _jsxs("form", { onSubmit: submit, children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: title }), description ? (_jsx(DialogDescription, { children: description })) : (_jsx(DialogDescription, { className: "sr-only", children: title }))] }), detail && detailPlacement === 'top' ? _jsx("div", { className: "mt-4", children: detail }) : null, _jsxs("div", { className: "mt-4 space-y-2", children: [_jsx(Label, { htmlFor: "rename-dialog-input", className: "text-[12px]", children: label }), _jsx(Input, { ref: inputRef, id: "rename-dialog-input", value: draft, disabled: busy, placeholder: placeholder, "aria-invalid": Boolean(localError || error), onChange: (event) => {
32
+ setDraft(event.target.value);
33
+ setLocalError(null);
34
+ } }), localError || error ? (_jsx("p", { className: "text-destructive text-[12px]", children: localError ?? error })) : null] }), detail && detailPlacement === 'bottom' ? _jsx("div", { className: "mt-4", children: detail }) : null, _jsxs(DialogFooter, { className: "mt-5", children: [_jsx(Button, { type: "button", variant: "ghost", onClick: () => onOpenChange(false), disabled: busy, children: cancelLabel }), _jsx(Button, { type: "submit", disabled: busy, children: confirmLabel })] })] }) }));
35
+ }
@@ -0,0 +1 @@
1
+ export declare const rowSurfaceRingClassName = "ring-(--row-surface)";
@@ -0,0 +1,5 @@
1
+ // A row paints a solid surface and publishes it as --row-surface, so children
2
+ // that fake a cut-out — overlapping avatar rings, dot stacks — repaint the exact
3
+ // row colour instead of the page background and keep the illusion on hover and
4
+ // selection.
5
+ export const rowSurfaceRingClassName = 'ring-(--row-surface)';
@@ -0,0 +1,30 @@
1
+ import { type ComponentPropsWithoutRef, type ReactNode } from 'react';
2
+ export declare const rowTrailingGroupClassName = "group/side-panel-item";
3
+ /**
4
+ * Resting content that hover actions displace out of flow, for rows whose resting
5
+ * marks live outside {@link RowTrailing} (a stacked trailing column, say) but must
6
+ * still yield to the same reveal.
7
+ */
8
+ export declare const rowTrailingConcealedClassName = "flex group-hover/side-panel-item:hidden group-focus-visible/side-panel-item:hidden group-has-[:focus-visible]/side-panel-item:hidden group-has-[[data-slot=row-actions]_[data-state=open]]/side-panel-item:hidden group-data-[context-menu-open]/side-panel-item:hidden group-data-[context-menu-open]/context-menu:hidden";
9
+ export type RowTrailingReveal = 'replace' | 'slide';
10
+ export interface RowTrailingProps extends Omit<ComponentPropsWithoutRef<'span'>, 'children'> {
11
+ resting?: ReactNode;
12
+ actions?: ReactNode;
13
+ reveal?: RowTrailingReveal;
14
+ restingClassName?: string;
15
+ actionsClassName?: string;
16
+ }
17
+ /**
18
+ * The trailing slot of a `rowTrailingGroupClassName` row: resting content (unread
19
+ * badge, timestamp, spinner) and the actions a hover reveals.
20
+ *
21
+ * `replace` swaps one for the other, so exactly one side is in flow at a time, the
22
+ * visible side is flush to the row's padding, and the row's `flex-1 truncate` label
23
+ * shortens against whichever is showing. `slide` keeps the resting content in place
24
+ * and glides the buttons in from the row's right edge instead, pushing the resting
25
+ * content left — right for a stacked resting column, which would otherwise re-centre
26
+ * itself around a taller button the moment the pointer arrives.
27
+ *
28
+ * Coarse pointers have no hover to reveal with, so they get both.
29
+ */
30
+ export declare const RowTrailing: import("react").ForwardRefExoticComponent<RowTrailingProps & import("react").RefAttributes<HTMLSpanElement>>;
@@ -0,0 +1,59 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../lib/cn.js';
5
+ export const rowTrailingGroupClassName = 'group/side-panel-item';
6
+ // Spelled out rather than composed from a shared list: Tailwind only emits classes
7
+ // it finds as literal strings in source. A row whose context menu is open counts as
8
+ // hovered: the menu suppresses pointer events, so its own actions would otherwise
9
+ // collapse out from under the pointer that opened it.
10
+ const revealedClassName = 'hidden group-hover/side-panel-item:flex group-focus-visible/side-panel-item:flex group-has-[:focus-visible]/side-panel-item:flex group-has-[[data-slot=row-actions]_[data-state=open]]/side-panel-item:flex group-data-[context-menu-open]/side-panel-item:flex group-data-[context-menu-open]/context-menu:flex pointer-coarse:flex';
11
+ /**
12
+ * Resting content that hover actions displace out of flow, for rows whose resting
13
+ * marks live outside {@link RowTrailing} (a stacked trailing column, say) but must
14
+ * still yield to the same reveal.
15
+ */
16
+ export const rowTrailingConcealedClassName = 'flex group-hover/side-panel-item:hidden group-focus-visible/side-panel-item:hidden group-has-[:focus-visible]/side-panel-item:hidden group-has-[[data-slot=row-actions]_[data-state=open]]/side-panel-item:hidden group-data-[context-menu-open]/side-panel-item:hidden group-data-[context-menu-open]/context-menu:hidden';
17
+ // The same row states as `revealedClassName`, in the two halves a slide needs: a track
18
+ // that grows from no width to the buttons' own width, and the buttons themselves
19
+ // travelling in from beyond the row's edge. `0fr`/`1fr` is the one pair a browser
20
+ // interpolates smoothly towards intrinsic content width, so the buttons need no
21
+ // measured size.
22
+ const slideTrackOpenClassName = 'group-hover/side-panel-item:grid-cols-[1fr] group-hover/side-panel-item:opacity-100 group-focus-visible/side-panel-item:grid-cols-[1fr] group-focus-visible/side-panel-item:opacity-100 group-has-[:focus-visible]/side-panel-item:grid-cols-[1fr] group-has-[:focus-visible]/side-panel-item:opacity-100 group-has-[[data-slot=row-actions]_[data-state=open]]/side-panel-item:grid-cols-[1fr] group-has-[[data-slot=row-actions]_[data-state=open]]/side-panel-item:opacity-100 group-data-[context-menu-open]/side-panel-item:grid-cols-[1fr] group-data-[context-menu-open]/side-panel-item:opacity-100 group-data-[context-menu-open]/context-menu:grid-cols-[1fr] group-data-[context-menu-open]/context-menu:opacity-100 pointer-coarse:grid-cols-[1fr] pointer-coarse:opacity-100';
23
+ const slideActionsOpenClassName = 'group-hover/side-panel-item:translate-x-0 group-focus-visible/side-panel-item:translate-x-0 group-has-[:focus-visible]/side-panel-item:translate-x-0 group-has-[[data-slot=row-actions]_[data-state=open]]/side-panel-item:translate-x-0 group-data-[context-menu-open]/side-panel-item:translate-x-0 group-data-[context-menu-open]/context-menu:translate-x-0 pointer-coarse:translate-x-0';
24
+ // Both motion tokens carry their own value as a fallback, the way globals.css does:
25
+ // only the color half of the token layer reaches the app, so a bare
26
+ // var(--duration-slide) computes to nothing and drops the transition to 0s.
27
+ const slideMotionClassName = 'duration-[var(--duration-slide,180ms)] ease-[var(--ease-out-expo,cubic-bezier(0.32,0.72,0,1))] motion-reduce:transition-none';
28
+ /**
29
+ * The trailing slot of a `rowTrailingGroupClassName` row: resting content (unread
30
+ * badge, timestamp, spinner) and the actions a hover reveals.
31
+ *
32
+ * `replace` swaps one for the other, so exactly one side is in flow at a time, the
33
+ * visible side is flush to the row's padding, and the row's `flex-1 truncate` label
34
+ * shortens against whichever is showing. `slide` keeps the resting content in place
35
+ * and glides the buttons in from the row's right edge instead, pushing the resting
36
+ * content left — right for a stacked resting column, which would otherwise re-centre
37
+ * itself around a taller button the moment the pointer arrives.
38
+ *
39
+ * Coarse pointers have no hover to reveal with, so they get both.
40
+ */
41
+ export const RowTrailing = forwardRef(function RowTrailing({ resting, actions, reveal = 'replace', restingClassName, actionsClassName, className, ...props }, ref) {
42
+ if (!resting && !actions)
43
+ return null;
44
+ const slides = reveal === 'slide';
45
+ const actionsSlot = actions ? (_jsx("span", { "data-slot": "row-actions", role: "presentation",
46
+ // A portaled menu still bubbles through the React tree, so without this an
47
+ // item click inside a row's own dropdown would also activate the row.
48
+ onClick: (event) => event.stopPropagation(), onKeyDown: (event) => {
49
+ if (event.key === 'Enter' || event.key === ' ')
50
+ event.stopPropagation();
51
+ }, className: cn('items-center gap-0.5', slides ? 'flex min-w-0 justify-end' : revealedClassName, actionsClassName), children: slides ? (
52
+ // Padding here rather than on the collapsing box, whose own padding would floor
53
+ // the closed track at its width and shove the resting content permanently left.
54
+ _jsx("span", { className: cn('flex translate-x-2 items-center gap-0.5 pl-1.5 transition-transform', slideMotionClassName, slideActionsOpenClassName), children: actions })) : (actions) })) : null;
55
+ return (_jsxs("span", { ref: ref, "data-slot": "row-trailing", className: cn('ml-auto flex shrink-0 items-center', className), ...props, children: [resting ? (_jsx("span", { "data-slot": "row-resting", className: cn('items-center gap-1.5', slides ? 'flex' : rowTrailingConcealedClassName, restingClassName), children: resting })) : null, slides && actionsSlot ? (_jsx("span", { "data-slot": "row-actions-reveal", className: cn(
56
+ // The clip that hides the not-yet-arrived buttons would also cut a focused
57
+ // button's ring, so the frame borrows the room back off the row's padding.
58
+ 'grid grid-cols-[0fr] overflow-hidden opacity-0 transition-[grid-template-columns,opacity]', '-my-1 -mr-1 py-1 pr-1', slideMotionClassName, slideTrackOpenClassName), children: actionsSlot })) : (actionsSlot)] }));
59
+ });
@@ -0,0 +1,16 @@
1
+ export type RunStatus = 'pending' | 'running' | 'paused_for_approval' | 'waiting_for_user' | 'succeeded' | 'failed' | 'canceled';
2
+ interface RunStatusBadgeBaseProps {
3
+ status: RunStatus;
4
+ className?: string;
5
+ detail?: string;
6
+ label?: string;
7
+ }
8
+ export type RunStatusBadgeProps = RunStatusBadgeBaseProps & ({
9
+ iconOnly: true;
10
+ ariaLabel: string;
11
+ } | {
12
+ iconOnly?: false;
13
+ ariaLabel?: string;
14
+ });
15
+ export declare function RunStatusBadge({ status, className, detail, label: labelOverride, ariaLabel, iconOnly, }: RunStatusBadgeProps): import("react").JSX.Element;
16
+ export {};
@@ -0,0 +1,43 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Ban, Check, Clock, Loader2, MessageCircleQuestion, ShieldAlert, X, } from 'lucide-react';
4
+ import { cn } from '../lib/cn.js';
5
+ const runTone = {
6
+ pending: { bg: 'bg-muted', text: 'text-muted-foreground' },
7
+ running: { bg: 'bg-muted', text: 'text-muted-foreground' },
8
+ paused_for_approval: {
9
+ bg: 'bg-amber-500/15',
10
+ text: 'text-amber-600 dark:text-amber-400',
11
+ },
12
+ waiting_for_user: { bg: 'bg-sky-500/15', text: 'text-sky-600 dark:text-sky-400' },
13
+ succeeded: { bg: 'bg-emerald-500/15', text: 'text-emerald-600 dark:text-emerald-400' },
14
+ failed: { bg: 'bg-rose-500/15', text: 'text-rose-600 dark:text-rose-400' },
15
+ canceled: { bg: 'bg-muted', text: 'text-muted-foreground' },
16
+ };
17
+ const runGlyph = {
18
+ pending: Clock,
19
+ running: Loader2,
20
+ paused_for_approval: ShieldAlert,
21
+ waiting_for_user: MessageCircleQuestion,
22
+ succeeded: Check,
23
+ failed: X,
24
+ canceled: Ban,
25
+ };
26
+ const label = {
27
+ pending: 'pending',
28
+ running: 'running',
29
+ paused_for_approval: 'awaiting approval',
30
+ waiting_for_user: 'waiting for user',
31
+ succeeded: 'done',
32
+ failed: 'failed',
33
+ canceled: 'canceled',
34
+ };
35
+ export function RunStatusBadge({ status, className, detail, label: labelOverride, ariaLabel, iconOnly, }) {
36
+ const tone = runTone[status];
37
+ const text = labelOverride ?? label[status];
38
+ const Glyph = runGlyph[status];
39
+ if (iconOnly) {
40
+ return (_jsx("span", { "data-status": status, role: "img", "aria-label": ariaLabel, title: ariaLabel, className: cn('inline-flex size-5 shrink-0 items-center justify-center rounded-full', status === 'running' ? 'bg-primary/12 text-foreground' : cn(tone.bg, tone.text), className), children: _jsx(Glyph, { "aria-hidden": true, strokeWidth: 1.5, className: cn('size-3 shrink-0', status === 'running' && 'animate-spin') }) }));
41
+ }
42
+ return (_jsxs("span", { "data-status": status, "aria-label": ariaLabel ?? `Run status: ${text}`, className: cn('inline-flex items-center gap-1 whitespace-nowrap px-2 py-0.5 rounded-full text-[11px]', status === 'running' ? 'bg-primary/12 text-foreground' : cn(tone.bg, tone.text), className), children: [_jsx(Glyph, { "aria-hidden": true, strokeWidth: 1.5, className: cn('size-3 shrink-0', status === 'running' && 'animate-spin') }), _jsx("span", { children: text }), detail ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground/60", children: "\u00B7" }), _jsx("span", { className: "font-mono tabular-nums text-[10.5px]", children: detail })] })) : null] }));
43
+ }
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+ import { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';
3
+ declare function ScrollArea({ className, children, ...props }: React.ComponentProps<typeof ScrollAreaPrimitive.Root>): React.JSX.Element;
4
+ declare function ScrollBar({ className, orientation, ...props }: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>): React.JSX.Element;
5
+ export { ScrollArea, ScrollBar };
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';
5
+ import { cn } from '../lib/cn.js';
6
+ function ScrollArea({ className, children, ...props }) {
7
+ return (_jsxs(ScrollAreaPrimitive.Root, { "data-slot": "scroll-area", className: cn('relative', className), ...props, children: [_jsx(ScrollAreaPrimitive.Viewport, { "data-slot": "scroll-area-viewport", className: "size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1", children: children }), _jsx(ScrollBar, {}), _jsx(ScrollAreaPrimitive.Corner, {})] }));
8
+ }
9
+ function ScrollBar({ className, orientation = 'vertical', ...props }) {
10
+ return (_jsx(ScrollAreaPrimitive.ScrollAreaScrollbar, { "data-slot": "scroll-area-scrollbar", "data-orientation": orientation, orientation: orientation, className: cn('flex touch-none p-px transition-colors select-none data-[orientation=horizontal]:h-2.5 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:border-t data-[orientation=horizontal]:border-t-transparent data-[orientation=vertical]:h-full data-[orientation=vertical]:w-2.5 data-[orientation=vertical]:border-l data-[orientation=vertical]:border-l-transparent', className), ...props, children: _jsx(ScrollAreaPrimitive.ScrollAreaThumb, { "data-slot": "scroll-area-thumb", className: "relative flex-1 rounded-full bg-border" }) }));
11
+ }
12
+ export { ScrollArea, ScrollBar };
@@ -0,0 +1,15 @@
1
+ import * as React from "react";
2
+ import { Select as SelectPrimitive } from "radix-ui";
3
+ declare function Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>): React.JSX.Element;
4
+ declare function SelectGroup({ ...props }: React.ComponentProps<typeof SelectPrimitive.Group>): React.JSX.Element;
5
+ declare function SelectValue({ ...props }: React.ComponentProps<typeof SelectPrimitive.Value>): React.JSX.Element;
6
+ declare function SelectTrigger({ className, size, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
7
+ size?: "sm" | "default";
8
+ }): React.JSX.Element;
9
+ declare function SelectContent({ className, children, position, ...props }: React.ComponentProps<typeof SelectPrimitive.Content>): React.JSX.Element;
10
+ declare function SelectLabel({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Label>): React.JSX.Element;
11
+ declare function SelectItem({ className, children, ...props }: React.ComponentProps<typeof SelectPrimitive.Item>): React.JSX.Element;
12
+ declare function SelectSeparator({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.Separator>): React.JSX.Element;
13
+ declare function SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>): React.JSX.Element;
14
+ declare function SelectScrollDownButton({ className, ...props }: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>): React.JSX.Element;
15
+ export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };
@@ -0,0 +1,39 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Select as SelectPrimitive } from "radix-ui";
5
+ import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react";
6
+ import { cn } from "../lib/cn.js";
7
+ function Select({ ...props }) {
8
+ return _jsx(SelectPrimitive.Root, { "data-slot": "select", ...props });
9
+ }
10
+ function SelectGroup({ ...props }) {
11
+ return _jsx(SelectPrimitive.Group, { "data-slot": "select-group", ...props });
12
+ }
13
+ function SelectValue({ ...props }) {
14
+ return _jsx(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
15
+ }
16
+ function SelectTrigger({ className, size = "default", children, ...props }) {
17
+ return (_jsxs(SelectPrimitive.Trigger, { "data-slot": "select-trigger", "data-size": size, className: cn("flex w-fit items-center justify-between gap-2 rounded-lg border border-input bg-transparent px-2.5 py-1 text-sm whitespace-nowrap shadow-none transition-colors outline-none data-[size=default]:h-8 data-[size=sm]:h-7 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 hover:bg-muted/50 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 data-placeholder:text-muted-foreground aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:bg-input/30 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 [&_svg:not([class*='text-'])]:text-muted-foreground", className), ...props, children: [children, _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDownIcon, { className: "size-4 opacity-50" }) })] }));
18
+ }
19
+ function SelectContent({ className, children, position = "popper", ...props }) {
20
+ return (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { "data-slot": "select-content", className: cn("relative z-50 max-h-(--radix-select-content-available-height) w-max min-w-[8rem] max-w-[calc(100vw-2rem)] origin-(--radix-select-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", position === "popper" &&
21
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className), position: position, ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.Viewport, { className: cn("p-0", position === "popper" &&
22
+ "h-(--radix-select-trigger-height) w-max min-w-[max(8rem,var(--radix-select-trigger-width))] scroll-my-1"), children: children }), _jsx(SelectScrollDownButton, {})] }) }));
23
+ }
24
+ function SelectLabel({ className, ...props }) {
25
+ return (_jsx(SelectPrimitive.Label, { "data-slot": "select-label", className: cn("px-2 py-1.5 text-xs font-medium text-muted-foreground", className), ...props }));
26
+ }
27
+ function SelectItem({ className, children, ...props }) {
28
+ return (_jsxs(SelectPrimitive.Item, { "data-slot": "select-item", className: cn("relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 data-highlighted:bg-muted data-highlighted:text-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground", className), ...props, children: [_jsx("span", { className: "absolute right-2 flex size-3.5 items-center justify-center", children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(CheckIcon, { className: "size-4" }) }) }), _jsx(SelectPrimitive.ItemText, { children: children })] }));
29
+ }
30
+ function SelectSeparator({ className, ...props }) {
31
+ return (_jsx(SelectPrimitive.Separator, { "data-slot": "select-separator", className: cn("-mx-1 my-1 h-px bg-border", className), ...props }));
32
+ }
33
+ function SelectScrollUpButton({ className, ...props }) {
34
+ return (_jsx(SelectPrimitive.ScrollUpButton, { "data-slot": "select-scroll-up-button", className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: _jsx(ChevronUpIcon, { className: "size-4" }) }));
35
+ }
36
+ function SelectScrollDownButton({ className, ...props }) {
37
+ return (_jsx(SelectPrimitive.ScrollDownButton, { "data-slot": "select-scroll-down-button", className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: _jsx(ChevronDownIcon, { className: "size-4" }) }));
38
+ }
39
+ export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+ import { type VariantProps } from 'class-variance-authority';
3
+ declare const selectableCardVariants: (props?: ({
4
+ layout?: "grid" | "row" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ type SelectableCardOwnProps = {
7
+ selected?: boolean;
8
+ onSelect?: (next: boolean) => void;
9
+ icon?: React.ReactNode;
10
+ title?: React.ReactNode;
11
+ description?: React.ReactNode;
12
+ trailing?: React.ReactNode;
13
+ hideIndicator?: boolean;
14
+ indicator?: 'check' | 'radio';
15
+ role?: 'radio' | 'checkbox';
16
+ className?: string;
17
+ children?: React.ReactNode;
18
+ };
19
+ export type SelectableCardProps = Omit<React.ComponentPropsWithoutRef<'button'>, keyof SelectableCardOwnProps | 'value'> & SelectableCardOwnProps & VariantProps<typeof selectableCardVariants>;
20
+ declare const SelectableCard: React.ForwardRefExoticComponent<Omit<Omit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "value" | keyof SelectableCardOwnProps> & SelectableCardOwnProps & VariantProps<(props?: ({
21
+ layout?: "grid" | "row" | null | undefined;
22
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & React.RefAttributes<HTMLButtonElement>>;
23
+ export type SelectableCardGroupProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'onChange'> & {
24
+ value?: string | null;
25
+ onChange?: (value: string) => void;
26
+ orientation?: 'vertical' | 'horizontal' | 'both';
27
+ children?: React.ReactNode;
28
+ };
29
+ declare function SelectableCardGroup({ value, onChange, orientation, className, children, onKeyDown, ...props }: SelectableCardGroupProps): React.JSX.Element;
30
+ declare const SelectableCardGroupItem: React.ForwardRefExoticComponent<Omit<SelectableCardProps, "role" | "selected"> & {
31
+ value: string;
32
+ } & React.RefAttributes<HTMLButtonElement>>;
33
+ export { SelectableCard, SelectableCardGroup, SelectableCardGroupItem, selectableCardVariants, };
@@ -0,0 +1,66 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { cva } from 'class-variance-authority';
5
+ import { Check } from 'lucide-react';
6
+ import { cn } from '../lib/cn.js';
7
+ const selectableCardVariants = cva([
8
+ 'group/selectable-card relative flex min-h-8 w-full cursor-pointer select-none rounded-lg border border-border/60 bg-card bg-clip-padding text-left outline-none transition-all',
9
+ 'hover:border-primary/35 hover:bg-accent/50 focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:ring-offset-2 focus-visible:ring-offset-background',
10
+ 'disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50',
11
+ 'data-[selected=true]:border-primary/60 data-[selected=true]:bg-primary/5 data-[selected=true]:shadow-sm data-[selected=true]:ring-1 data-[selected=true]:ring-primary/20',
12
+ ], {
13
+ variants: {
14
+ layout: { row: 'items-center gap-3 p-3', grid: 'flex-col items-start gap-2 p-4' },
15
+ },
16
+ defaultVariants: { layout: 'row' },
17
+ });
18
+ const SelectableCard = React.forwardRef(function SelectableCard({ selected = false, onSelect, icon, title, description, trailing, hideIndicator = false, indicator = 'check', role = 'radio', layout = 'row', disabled, className, children, onClick, onKeyDown, ...props }, ref) {
19
+ const handleClick = (event) => {
20
+ onClick?.(event);
21
+ if (!event.defaultPrevented && !disabled)
22
+ onSelect?.(role === 'checkbox' ? !selected : true);
23
+ };
24
+ const handleKeyDown = (event) => {
25
+ onKeyDown?.(event);
26
+ if (event.defaultPrevented || disabled || event.key !== ' ')
27
+ return;
28
+ event.preventDefault();
29
+ onSelect?.(role === 'checkbox' ? !selected : true);
30
+ };
31
+ const showIndicator = !hideIndicator && trailing === undefined;
32
+ const trailingNode = trailing ??
33
+ (showIndicator && indicator === 'radio' ? (_jsx("span", { "aria-hidden": true, className: cn('flex size-[18px] shrink-0 items-center justify-center rounded-full border transition-colors', layout === 'grid' && 'absolute end-3 top-3', selected ? 'border-primary' : 'border-border group-hover/selectable-card:border-primary/50'), children: _jsx("span", { className: cn('size-2.5 rounded-full bg-primary transition-transform', selected ? 'scale-100' : 'scale-0') }) })) : showIndicator ? (_jsx(Check, { "aria-hidden": true, className: cn('size-4 shrink-0 text-primary transition-opacity', layout === 'grid' && 'absolute end-3 top-3', selected ? 'opacity-100' : 'opacity-0'), strokeWidth: 2 })) : null);
34
+ return (_jsxs("button", { ref: ref, type: "button", role: role, "aria-checked": selected, "aria-disabled": disabled || undefined, disabled: disabled, "data-slot": "selectable-card", "data-selected": selected, "data-layout": layout, onClick: handleClick, onKeyDown: handleKeyDown, className: cn(selectableCardVariants({ layout }), className), ...props, children: [icon != null ? (_jsx("span", { "data-slot": "selectable-card-icon", className: "flex shrink-0 items-center justify-center [&_svg:not([class*='size-'])]:size-4", children: icon })) : null, children, title != null || description != null ? (_jsxs("span", { "data-slot": "selectable-card-body", className: "min-w-0 flex-1", children: [title != null ? _jsx("span", { className: "block truncate text-sm font-medium", children: title }) : null, description != null ? (_jsx("span", { className: "mt-0.5 block text-xs leading-snug text-muted-foreground", children: description })) : null] })) : null, trailingNode] }));
35
+ });
36
+ const SelectableCardGroupContext = React.createContext(null);
37
+ function SelectableCardGroup({ value, onChange, orientation = 'vertical', className, children, onKeyDown, ...props }) {
38
+ const rootRef = React.useRef(null);
39
+ const handleKeyDown = (event) => {
40
+ onKeyDown?.(event);
41
+ if (event.defaultPrevented)
42
+ return;
43
+ const vertical = orientation === 'vertical' || orientation === 'both';
44
+ const horizontal = orientation === 'horizontal' || orientation === 'both';
45
+ const forward = (vertical && event.key === 'ArrowDown') || (horizontal && event.key === 'ArrowRight');
46
+ const backward = (vertical && event.key === 'ArrowUp') || (horizontal && event.key === 'ArrowLeft');
47
+ if (!forward && !backward)
48
+ return;
49
+ const cards = Array.from(rootRef.current?.querySelectorAll('[data-slot="selectable-card"]:not([disabled])') ?? []);
50
+ if (cards.length === 0)
51
+ return;
52
+ event.preventDefault();
53
+ const current = cards.findIndex((card) => card === document.activeElement);
54
+ const from = current === -1 ? (forward ? -1 : 0) : current;
55
+ cards[(from + (forward ? 1 : -1) + cards.length) % cards.length]?.focus();
56
+ };
57
+ return (_jsx(SelectableCardGroupContext.Provider, { value: { value, onChange }, children: _jsx("div", { ref: rootRef, role: "radiogroup", tabIndex: -1, "data-slot": "selectable-card-group", "aria-orientation": orientation === 'both' ? undefined : orientation, className: cn('flex flex-col gap-2', className), onKeyDown: handleKeyDown, ...props, children: children }) }));
58
+ }
59
+ const SelectableCardGroupItem = React.forwardRef(function SelectableCardGroupItem({ value, onSelect, ...props }, ref) {
60
+ const context = React.useContext(SelectableCardGroupContext);
61
+ return (_jsx(SelectableCard, { ref: ref, role: "radio", selected: context?.value === value, onSelect: (next) => {
62
+ onSelect?.(next);
63
+ context?.onChange?.(value);
64
+ }, ...props }));
65
+ });
66
+ export { SelectableCard, SelectableCardGroup, SelectableCardGroupItem, selectableCardVariants, };
@@ -0,0 +1,3 @@
1
+ import * as React from 'react';
2
+ import { Separator as SeparatorPrimitive } from 'radix-ui';
3
+ export declare function Separator({ className, orientation, decorative, ...props }: React.ComponentProps<typeof SeparatorPrimitive.Root>): React.JSX.Element;
@@ -0,0 +1,8 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Separator as SeparatorPrimitive } from 'radix-ui';
5
+ import { cn } from '../lib/cn.js';
6
+ export function Separator({ className, orientation = 'horizontal', decorative = true, ...props }) {
7
+ return _jsx(SeparatorPrimitive.Root, { "data-slot": "separator", decorative: decorative, orientation: orientation, className: cn('shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:w-px data-[orientation=vertical]:self-stretch', className), ...props });
8
+ }
@@ -0,0 +1,46 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * Shared building blocks for the standard two-pane settings dialog (sidebar nav
4
+ * + content pane). The app-wide settings dialog and the calendar booking
5
+ * settings dialog compose these so they read as one system rather than each
6
+ * hand-rolling its own shell.
7
+ */
8
+ export declare function SettingsDialogShell({ title, description, nav, children, testId, contentClassName, }: {
9
+ title: string;
10
+ description?: string;
11
+ nav: ReactNode;
12
+ children: ReactNode;
13
+ testId?: string;
14
+ contentClassName?: string;
15
+ }): import("react").JSX.Element;
16
+ export declare function SettingsNavAside({ children }: {
17
+ children: ReactNode;
18
+ }): import("react").JSX.Element;
19
+ export declare function SettingsNavItem({ icon, label, active, onClick, }: {
20
+ icon: ReactNode;
21
+ label: string;
22
+ active: boolean;
23
+ onClick: () => void;
24
+ }): import("react").JSX.Element;
25
+ export declare function SettingsSectionHeader({ title, hint }: {
26
+ title: string;
27
+ hint?: string;
28
+ }): import("react").JSX.Element;
29
+ /**
30
+ * The "slide over to a sub-page" pattern. A section renders its list inside a
31
+ * scope; opening an editor pushes a sub-page that slides in over the whole
32
+ * content pane (back button + editor), instead of stacking a nested dialog.
33
+ * The list stays mounted underneath so its state (selection, scroll) survives a
34
+ * round-trip.
35
+ */
36
+ type SettingsSubpageApi = {
37
+ subpage: ReactNode | null;
38
+ open: (node: ReactNode) => void;
39
+ close: () => void;
40
+ };
41
+ export declare function useSettingsSubpage(): Pick<SettingsSubpageApi, 'open' | 'close'>;
42
+ export declare function SettingsSubpageScope({ children, className, }: {
43
+ children: ReactNode;
44
+ className?: string;
45
+ }): import("react").JSX.Element;
46
+ export {};
@@ -0,0 +1,48 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { createContext, useCallback, useContext, useMemo, useRef, useState, } from 'react';
4
+ import { cn } from '../lib/cn.js';
5
+ import { DialogContent, DialogDescription, DialogTitle } from './dialog.js';
6
+ /**
7
+ * Shared building blocks for the standard two-pane settings dialog (sidebar nav
8
+ * + content pane). The app-wide settings dialog and the calendar booking
9
+ * settings dialog compose these so they read as one system rather than each
10
+ * hand-rolling its own shell.
11
+ */
12
+ export function SettingsDialogShell({ title, description, nav, children, testId, contentClassName, }) {
13
+ return (_jsxs(DialogContent, { showCloseButton: true, "data-testid": testId, className: cn('gap-0 overflow-hidden p-0', 'h-[min(900px,94vh)] sm:max-w-[min(1180px,94vw)]', 'grid grid-cols-[260px_1fr] grid-rows-1'), children: [_jsx(DialogTitle, { className: "sr-only", children: title }), description ? (_jsx(DialogDescription, { className: "sr-only", children: description })) : null, nav, _jsx("div", { className: cn('bg-background min-w-0', contentClassName), children: children })] }));
14
+ }
15
+ export function SettingsNavAside({ children }) {
16
+ return (_jsx("aside", { className: "border-border bg-sidebar flex min-h-0 flex-col border-r", children: children }));
17
+ }
18
+ export function SettingsNavItem({ icon, label, active, onClick, }) {
19
+ return (_jsx("li", { children: _jsxs("button", { type: "button", onClick: onClick, "data-active": active || undefined, "aria-current": active ? 'page' : undefined, className: cn('flex h-7 w-full cursor-pointer items-center gap-2 rounded-md px-2 text-[12.5px] transition-colors', active
20
+ ? 'bg-sidebar-accent text-sidebar-accent-foreground'
21
+ : 'text-sidebar-foreground/85 hover:bg-sidebar-accent/60 hover:text-sidebar-foreground'), children: [_jsx("span", { className: cn('shrink-0', active ? 'text-primary' : 'text-muted-foreground'), children: icon }), _jsx("span", { className: "truncate", children: label })] }) }));
22
+ }
23
+ export function SettingsSectionHeader({ title, hint }) {
24
+ return (_jsxs("header", { className: "mb-6", children: [_jsx("h2", { className: "text-[22px] font-semibold tracking-tight", children: title }), hint ? (_jsx("p", { className: "text-muted-foreground mt-1.5 text-[13px] leading-relaxed", children: hint })) : null] }));
25
+ }
26
+ const NOOP_SUBPAGE = {
27
+ open: () => { },
28
+ close: () => { },
29
+ };
30
+ const SettingsSubpageContext = createContext(null);
31
+ export function useSettingsSubpage() {
32
+ return useContext(SettingsSubpageContext) ?? NOOP_SUBPAGE;
33
+ }
34
+ export function SettingsSubpageScope({ children, className, }) {
35
+ const [subpage, setSubpage] = useState(null);
36
+ const triggerRef = useRef(null);
37
+ const open = useCallback((node) => {
38
+ triggerRef.current =
39
+ document.activeElement instanceof HTMLElement ? document.activeElement : null;
40
+ setSubpage(node);
41
+ }, []);
42
+ const close = useCallback(() => {
43
+ setSubpage(null);
44
+ requestAnimationFrame(() => triggerRef.current?.focus());
45
+ }, []);
46
+ const api = useMemo(() => ({ subpage, open, close }), [close, open, subpage]);
47
+ return (_jsx(SettingsSubpageContext.Provider, { value: api, children: _jsxs("div", { className: cn('relative flex min-h-0 flex-1 flex-col', className), children: [_jsx("div", { "aria-hidden": subpage != null ? true : undefined, inert: subpage != null ? true : undefined, className: "flex min-h-0 flex-1 flex-col", children: children }), subpage != null ? (_jsx("div", { role: "group", "data-testid": "settings-subpage", className: "bg-background animate-in fade-in-0 slide-in-from-right-4 absolute inset-0 z-10 flex min-h-0 flex-col overflow-y-auto px-10 py-8 duration-200 motion-reduce:animate-none", children: subpage })) : null] }) }));
48
+ }
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ import { type HTMLMotionProps } from 'motion/react';
3
+ export interface ShimmerTextProps extends Omit<HTMLMotionProps<'span'>, 'children'> {
4
+ children: string | number;
5
+ duration?: number;
6
+ spread?: number;
7
+ }
8
+ export declare const ShimmerText: React.NamedExoticComponent<Omit<ShimmerTextProps, "ref"> & React.RefAttributes<HTMLSpanElement>>;
@@ -0,0 +1,26 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { motion, useReducedMotion } from 'motion/react';
5
+ import { cn } from '../lib/cn.js';
6
+ const ShimmerTextComponent = React.forwardRef(function ShimmerText({ children, className, duration = 2, spread = 2, style, ...props }, forwardedRef) {
7
+ const reducedMotion = useReducedMotion();
8
+ const dynamicSpread = React.useMemo(() => `${String(children).length * spread}px`, [children, spread]);
9
+ const backgroundImage = reducedMotion
10
+ ? 'linear-gradient(var(--base-color), var(--base-color))'
11
+ : 'var(--bg), linear-gradient(var(--base-color), var(--base-color))';
12
+ return (_jsx(motion.span, { ref: forwardedRef, "data-slot": "shimmer-text", className: cn('relative inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent', '[--base-color:color-mix(in_oklch,var(--foreground)_30%,transparent)] [--base-gradient-color:var(--foreground)]', '[background-repeat:no-repeat,padding-box]', '[--bg:linear-gradient(90deg,transparent_calc(50%-var(--spread)),var(--base-gradient-color),transparent_calc(50%+var(--spread)))]', className),
13
+ // Keyframes, not an initial→animate delta: nested under an AnimatePresence
14
+ // the presence context suppresses `initial`, which would freeze the sweep
15
+ // at its end position and leave the text flat.
16
+ animate: reducedMotion ? undefined : { backgroundPosition: ['100% center', '0% center'] }, transition: {
17
+ repeat: Number.POSITIVE_INFINITY,
18
+ duration,
19
+ ease: 'linear',
20
+ }, style: {
21
+ '--spread': dynamicSpread,
22
+ backgroundImage,
23
+ ...style,
24
+ }, ...props, children: children }));
25
+ });
26
+ export const ShimmerText = React.memo(ShimmerTextComponent);
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The ring means focus and only focus. It also stands in while a menu the row opened
3
+ * holds focus in the row's place — its own context menu, or a menu among its trailing
4
+ * actions — so right-clicking a row never reads as losing your place in the list. The
5
+ * context menu is read from `ContextMenuTrigger`, whether the row is the trigger or
6
+ * sits inside one.
7
+ *
8
+ * It deliberately ignores the row's own `data-state`: a hover card stamps that same
9
+ * attribute on the row it opens from, and hovering is not focus.
10
+ */
11
+ export declare const sidePanelRowFocusClassName: string;
12
+ export declare const sidePanelRowBaseClassName: string;
13
+ export declare const sidePanelRowInactiveTextClassName = "text-muted-foreground";
14
+ export declare const sidePanelRowActiveTextClassName = "text-foreground";
15
+ export declare const sidePanelRowIdleClassName: string;
16
+ export declare const sidePanelRowSelectedClassName: string;
17
+ /**
18
+ * Keeps a row wearing its hover surface for as long as the hover card it triggers is
19
+ * open, so the row and the card read as one thing instead of two. Pairs with
20
+ * `HoverCardTrigger`, which supplies the `group/hover-card` this hangs off.
21
+ */
22
+ export declare const sidePanelRowHoverCardOpenClassName: string;
23
+ export declare function sidePanelRowClassName({ selected, interactive, className, }?: {
24
+ selected?: boolean;
25
+ interactive?: boolean;
26
+ className?: string;
27
+ }): string;
@@ -0,0 +1,26 @@
1
+ import { cn } from '../lib/cn.js';
2
+ /**
3
+ * The ring means focus and only focus. It also stands in while a menu the row opened
4
+ * holds focus in the row's place — its own context menu, or a menu among its trailing
5
+ * actions — so right-clicking a row never reads as losing your place in the list. The
6
+ * context menu is read from `ContextMenuTrigger`, whether the row is the trigger or
7
+ * sits inside one.
8
+ *
9
+ * It deliberately ignores the row's own `data-state`: a hover card stamps that same
10
+ * attribute on the row it opens from, and hovering is not focus.
11
+ */
12
+ export const sidePanelRowFocusClassName = cn('outline-none', 'focus-within:ring-ring focus-within:ring-1 focus-within:ring-inset', 'data-[context-menu-open]:ring-ring data-[context-menu-open]:ring-1 data-[context-menu-open]:ring-inset', 'group-data-[context-menu-open]/context-menu:ring-ring group-data-[context-menu-open]/context-menu:ring-1 group-data-[context-menu-open]/context-menu:ring-inset', 'has-[[data-slot=row-actions]_[data-state=open]]:ring-ring has-[[data-slot=row-actions]_[data-state=open]]:ring-1 has-[[data-slot=row-actions]_[data-state=open]]:ring-inset');
13
+ export const sidePanelRowBaseClassName = cn('relative flex h-7 w-full items-center gap-1.5 rounded-md px-2 text-left text-[12.5px] transition-colors [--row-surface:var(--side-panel-row-surface)]', sidePanelRowFocusClassName);
14
+ export const sidePanelRowInactiveTextClassName = 'text-muted-foreground';
15
+ export const sidePanelRowActiveTextClassName = 'text-foreground';
16
+ export const sidePanelRowIdleClassName = cn(sidePanelRowInactiveTextClassName, 'hover:bg-(--side-panel-row-hover-surface) hover:[--side-panel-row-surface:var(--side-panel-row-hover-surface)] hover:text-foreground', 'focus-within:bg-(--side-panel-row-hover-surface) focus-within:[--side-panel-row-surface:var(--side-panel-row-hover-surface)] focus-within:text-foreground', 'data-[state=open]:bg-(--side-panel-row-hover-surface) data-[state=open]:[--side-panel-row-surface:var(--side-panel-row-hover-surface)] data-[state=open]:text-foreground', 'has-[[data-state=open]]:bg-(--side-panel-row-hover-surface) has-[[data-state=open]]:[--side-panel-row-surface:var(--side-panel-row-hover-surface)] has-[[data-state=open]]:text-foreground', 'data-[context-menu-open]:bg-(--side-panel-row-hover-surface) data-[context-menu-open]:[--side-panel-row-surface:var(--side-panel-row-hover-surface)] data-[context-menu-open]:text-foreground', 'group-data-[context-menu-open]/context-menu:bg-(--side-panel-row-hover-surface) group-data-[context-menu-open]/context-menu:[--side-panel-row-surface:var(--side-panel-row-hover-surface)] group-data-[context-menu-open]/context-menu:text-foreground');
17
+ export const sidePanelRowSelectedClassName = cn('bg-(--side-panel-row-selected-surface) [--side-panel-row-surface:var(--side-panel-row-selected-surface)]', 'hover:bg-(--side-panel-row-selected-surface) hover:[--side-panel-row-surface:var(--side-panel-row-selected-surface)]', 'focus-within:bg-(--side-panel-row-selected-surface) focus-within:[--side-panel-row-surface:var(--side-panel-row-selected-surface)]', 'data-[state=open]:bg-(--side-panel-row-selected-surface) data-[state=open]:[--side-panel-row-surface:var(--side-panel-row-selected-surface)]', 'has-[[data-state=open]]:bg-(--side-panel-row-selected-surface) has-[[data-state=open]]:[--side-panel-row-surface:var(--side-panel-row-selected-surface)]', 'data-[context-menu-open]:bg-(--side-panel-row-selected-surface) data-[context-menu-open]:[--side-panel-row-surface:var(--side-panel-row-selected-surface)]', 'group-data-[context-menu-open]/context-menu:bg-(--side-panel-row-selected-surface) group-data-[context-menu-open]/context-menu:[--side-panel-row-surface:var(--side-panel-row-selected-surface)]', sidePanelRowActiveTextClassName);
18
+ /**
19
+ * Keeps a row wearing its hover surface for as long as the hover card it triggers is
20
+ * open, so the row and the card read as one thing instead of two. Pairs with
21
+ * `HoverCardTrigger`, which supplies the `group/hover-card` this hangs off.
22
+ */
23
+ export const sidePanelRowHoverCardOpenClassName = cn('group-data-[state=open]/hover-card:bg-(--side-panel-row-hover-surface)', 'group-data-[state=open]/hover-card:[--side-panel-row-surface:var(--side-panel-row-hover-surface)]', 'group-data-[state=open]/hover-card:text-foreground');
24
+ export function sidePanelRowClassName({ selected, interactive = true, className, } = {}) {
25
+ return cn(sidePanelRowBaseClassName, interactive && 'cursor-pointer', selected ? sidePanelRowSelectedClassName : sidePanelRowIdleClassName, className);
26
+ }