@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,146 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Children, createContext, useCallback, useContext, useDeferredValue, useId, useMemo, useRef, useState, } from 'react';
4
+ import { DragHandle, SortableList, reorderById } from '../sortable.js';
5
+ import { ArrowDown, ArrowLeft, ArrowUp, ChevronRight, Plus, Search, Settings2, X, } from 'lucide-react';
6
+ import { StackedPopover, StackedPopoverContent, StackedPopoverTrigger, useStackedPopoverNavigation, } from '../popover-stack.js';
7
+ import { Button } from '../button.js';
8
+ import { Input } from '../input.js';
9
+ import { cn } from '../../lib/cn.js';
10
+ const rootPage = '__collection-view-settings-root__';
11
+ const CollectionViewSettingsNavigationContext = createContext(null);
12
+ export function useCollectionViewSettingsNavigation() {
13
+ const context = useContext(CollectionViewSettingsNavigationContext);
14
+ if (!context) {
15
+ throw new Error('useCollectionViewSettingsNavigation must be used inside CollectionViewSettings');
16
+ }
17
+ return context;
18
+ }
19
+ export function CollectionViewSettings({ labels, sections, identity, open: controlledOpen, defaultOpen = false, onOpenChange, align = 'end', triggerTestId, triggerClassName, contentClassName, showTriggerLabel = true, }) {
20
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
21
+ const headingId = useId();
22
+ const open = controlledOpen ?? uncontrolledOpen;
23
+ const navigation = useStackedPopoverNavigation(rootPage);
24
+ const resetNavigation = navigation.reset;
25
+ const activeSection = sections.find((section) => section.id === navigation.page);
26
+ const showRoot = navigation.page === rootPage || !activeSection;
27
+ const setOpen = useCallback((next) => {
28
+ if (controlledOpen === undefined)
29
+ setUncontrolledOpen(next);
30
+ onOpenChange?.(next);
31
+ if (!next)
32
+ resetNavigation();
33
+ }, [controlledOpen, onOpenChange, resetNavigation]);
34
+ const navigationContext = useMemo(() => ({
35
+ page: navigation.page,
36
+ openPage: navigation.pushPage,
37
+ replacePage: navigation.replacePage,
38
+ goBack: navigation.goBack,
39
+ close: () => setOpen(false),
40
+ }), [navigation.page, navigation.pushPage, navigation.replacePage, navigation.goBack, setOpen]);
41
+ const title = showRoot ? labels.settings : activeSection.label;
42
+ return (_jsx(CollectionViewSettingsNavigationContext.Provider, { value: navigationContext, children: _jsxs(StackedPopover, { kind: "dialog", modal: true, open: open, onOpenChange: setOpen, children: [_jsx(StackedPopoverTrigger, { asChild: true, children: _jsxs(Button, { type: "button", size: showTriggerLabel ? 'sm' : 'icon-sm', variant: showTriggerLabel ? 'outline' : 'ghost', className: cn('gap-1.5', triggerClassName), "aria-label": labels.settings, "data-testid": triggerTestId, children: [_jsx(Settings2, { className: "size-3.5", strokeWidth: 1.5 }), showTriggerLabel ? labels.settings : null] }) }), _jsxs(StackedPopoverContent, { align: align, "aria-labelledby": headingId, onEscapeKeyDown: navigation.onEscapeKeyDown, className: cn('w-[340px] max-w-[calc(100vw-1rem)] gap-0 p-0', contentClassName), children: [_jsx(CollectionViewSettingsHeader, { headingId: headingId, title: title, backLabel: labels.back, closeLabel: labels.close, canGoBack: !showRoot && navigation.canGoBack, onBack: navigation.goBack, onClose: () => setOpen(false) }), showRoot ? (_jsx(CollectionViewSettingsRoot, { identity: identity, sections: sections, onOpenSection: navigation.page === rootPage ? navigation.pushPage : navigation.replacePage })) : (_jsx(CollectionViewSettingsPage, { padding: activeSection.contentPadding, children: activeSection.content }))] })] }) }));
43
+ }
44
+ function CollectionViewSettingsHeader({ headingId, title, backLabel, closeLabel, canGoBack, onBack, onClose, }) {
45
+ return (_jsxs("header", { className: "border-border/60 flex h-11 items-center gap-2 border-b px-2.5", children: [canGoBack ? (_jsx(Button, { type: "button", size: "icon-xs", variant: "ghost", "aria-label": backLabel, onClick: onBack, children: _jsx(ArrowLeft, { className: "size-4", strokeWidth: 1.5 }) })) : null, _jsx("h2", { id: headingId, className: "min-w-0 flex-1 truncate text-sm font-semibold", children: title }), _jsx(Button, { type: "button", size: "icon-xs", variant: "ghost", "aria-label": closeLabel, onClick: onClose, children: _jsx(X, { className: "size-4", strokeWidth: 1.5 }) })] }));
46
+ }
47
+ function CollectionViewSettingsRoot({ identity, sections, onOpenSection, }) {
48
+ return (_jsxs("div", { className: "grid gap-1 p-2", children: [identity ? _jsx(CollectionViewSettingsIdentity, { ...identity }) : null, sections
49
+ .filter((section) => section.showInRoot !== false)
50
+ .map((section) => (_jsx(CollectionViewSettingsSectionRow, { ...section, onClick: () => onOpenSection(section.id) }, section.id)))] }));
51
+ }
52
+ export function CollectionViewSettingsIdentity({ name, icon, renameLabel, readOnly = false, onRename, }) {
53
+ const [edit, setEdit] = useState(null);
54
+ const [saving, setSaving] = useState(false);
55
+ const cancelBlurRef = useRef(false);
56
+ const value = edit?.base === name ? edit.value : name;
57
+ const editable = Boolean(onRename) && !readOnly;
58
+ const commit = async () => {
59
+ if (cancelBlurRef.current) {
60
+ cancelBlurRef.current = false;
61
+ return;
62
+ }
63
+ const next = value.trim();
64
+ if (!next || next === name || !onRename) {
65
+ setEdit(null);
66
+ return;
67
+ }
68
+ setSaving(true);
69
+ try {
70
+ await onRename(next);
71
+ setEdit({ base: name, value: next });
72
+ }
73
+ catch {
74
+ setEdit(null);
75
+ }
76
+ finally {
77
+ setSaving(false);
78
+ }
79
+ };
80
+ return (_jsxs("div", { className: "border-border/60 mb-1 flex min-h-9 items-center gap-2 border-b px-2 pb-2 text-sm font-medium", children: [icon ? (_jsx("span", { className: "text-muted-foreground flex size-6 shrink-0 items-center justify-center [&>svg]:size-4", children: icon })) : null, editable ? (_jsx(Input, { value: value, disabled: saving, onChange: (event) => setEdit({ base: name, value: event.target.value }), onBlur: () => void commit(), onKeyDown: (event) => {
81
+ if (event.key === 'Enter')
82
+ event.currentTarget.blur();
83
+ if (event.key === 'Escape') {
84
+ event.stopPropagation();
85
+ cancelBlurRef.current = true;
86
+ setEdit(null);
87
+ event.currentTarget.blur();
88
+ }
89
+ }, "aria-label": renameLabel, className: "h-8 text-sm" })) : (_jsx("span", { className: "truncate", children: name }))] }));
90
+ }
91
+ export function CollectionViewSettingsChoiceGroup({ value, choices, onChange, columns = 2, presentation = 'row', testIdPrefix, className, }) {
92
+ return (_jsx("div", { className: cn('grid gap-1.5', columns === 3 ? 'grid-cols-3' : 'grid-cols-2', className), children: choices.map((choice) => (_jsxs(Button, { type: "button", size: "sm", variant: value === choice.value ? 'secondary' : 'outline', "aria-pressed": value === choice.value, onClick: () => onChange(choice.value), "data-testid": testIdPrefix ? `${testIdPrefix}-${choice.value}` : undefined, className: cn('gap-2', presentation === 'tile' ? 'h-[72px] flex-col justify-center' : 'justify-start'), children: [choice.icon ? (_jsx("span", { className: "text-muted-foreground [&>svg]:size-4", children: choice.icon })) : null, choice.label] }, choice.value))) }));
93
+ }
94
+ export function CollectionViewSettingsSectionRow({ label, icon, summary, disabled, testId, onClick, }) {
95
+ return (_jsxs("button", { type: "button", disabled: disabled, "data-testid": testId, onClick: onClick, className: "hover:bg-accent hover:text-accent-foreground focus-visible:ring-ring flex min-h-9 w-full items-center gap-2 rounded-md px-2 text-left text-sm outline-none focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50", children: [icon ? (_jsx("span", { className: "text-muted-foreground flex size-4 shrink-0 items-center justify-center [&>svg]:size-4 [&>svg]:stroke-[1.5]", children: icon })) : null, _jsx("span", { className: "min-w-0 flex-1 truncate", children: label }), summary !== undefined ? (_jsx("span", { className: "text-muted-foreground max-w-[45%] truncate text-xs", children: summary })) : null, _jsx(ChevronRight, { className: "text-muted-foreground size-3.5 shrink-0", strokeWidth: 1.5 })] }));
96
+ }
97
+ export function CollectionViewSettingsPage({ className, padding = 'default', ...props }) {
98
+ return (_jsx("div", { className: cn('grid max-h-[min(440px,70vh)] gap-2 overflow-y-auto', padding === 'none' ? 'p-0' : 'p-2', className), ...props }));
99
+ }
100
+ export function CollectionViewSettingsAddAction({ children, className, ...props }) {
101
+ return (_jsxs(Button, { type: "button", variant: "outline", size: "xs", className: cn('w-fit gap-1.5', className), ...props, children: [_jsx(Plus, { className: "size-3.5", strokeWidth: 1.5 }), children] }));
102
+ }
103
+ export function CollectionViewSettingsFieldPicker({ fields, labels, onSelect, selectedField, selectedFields, className, }) {
104
+ const [query, setQuery] = useState('');
105
+ const listboxId = useId();
106
+ const deferredQuery = useDeferredValue(query);
107
+ const normalizedQuery = deferredQuery.trim().toLocaleLowerCase();
108
+ const searchableFields = useMemo(() => fields.map((field) => ({
109
+ field,
110
+ searchText: [field.label, field.id, ...(field.keywords ?? [])]
111
+ .join(' ')
112
+ .toLocaleLowerCase(),
113
+ })), [fields]);
114
+ const matchingFields = useMemo(() => searchableFields.filter(({ searchText }) => searchText.includes(normalizedQuery)), [normalizedQuery, searchableFields]);
115
+ const visibleFields = matchingFields.slice(0, 100);
116
+ const hasMoreFields = matchingFields.length > visibleFields.length;
117
+ return (_jsxs("div", { className: cn('grid gap-1', className), children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground pointer-events-none absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2", strokeWidth: 1.5 }), _jsx(Input, { value: query, onChange: (event) => setQuery(event.target.value), "aria-label": labels.searchFields, "aria-controls": listboxId, placeholder: labels.searchFields, className: "h-8 pl-8 text-xs" })] }), _jsx("div", { id: listboxId, role: "listbox", "aria-label": labels.searchFields, "aria-multiselectable": selectedFields ? true : undefined, className: "grid gap-0.5", children: visibleFields.length > 0 ? (visibleFields.map(({ field }, index) => (_jsxs("button", { type: "button", role: "option", "aria-selected": selectedField === field.id || selectedFields?.has(field.id) === true, disabled: field.disabled, onClick: () => onSelect(field.id), className: "hover:bg-accent aria-selected:bg-accent focus-visible:ring-ring flex min-h-8 items-center gap-2 rounded-md px-2 text-left text-sm outline-none focus-visible:ring-2 disabled:pointer-events-none disabled:opacity-50", children: [field.icon ? (_jsx("span", { className: "text-muted-foreground flex size-4 shrink-0 items-center justify-center [&>svg]:size-3.5", children: Children.toArray(field.icon) })) : null, _jsx("span", { className: "truncate", children: field.label })] }, `${field.id}-${index}`)))) : (_jsx("p", { className: "text-muted-foreground py-5 text-center text-xs", children: labels.noFields })) }), hasMoreFields ? (_jsx("p", { role: "status", className: "text-muted-foreground px-2 py-1 text-xs", children: labels.refineSearch })) : null] }));
118
+ }
119
+ export function CollectionViewSettingsSortPage({ sorts, fields, labels, onChange, createSort, className, addButtonTestId, noFieldsLabel = labels.searchFields, refineSearchLabel, }) {
120
+ const [picker, setPicker] = useState(null);
121
+ const editingSort = picker?.kind === 'edit' ? sorts.find((sort) => sort.id === picker.sortId) : undefined;
122
+ const usedFields = useMemo(() => new Set(sorts.map((sort) => sort.field)), [sorts]);
123
+ const pickerFields = useMemo(() => fields.filter((field) => field.id === editingSort?.field || !usedFields.has(field.id)), [editingSort?.field, fields, usedFields]);
124
+ const fieldsById = useMemo(() => new Map(fields.map((field) => [field.id, field])), [fields]);
125
+ if (picker) {
126
+ return (_jsx(CollectionViewSettingsFieldPicker, { fields: pickerFields, labels: {
127
+ searchFields: labels.searchFields,
128
+ noFields: noFieldsLabel,
129
+ refineSearch: refineSearchLabel,
130
+ }, selectedField: editingSort?.field, onSelect: (field) => {
131
+ if (picker.kind === 'new')
132
+ onChange([...sorts, createSort(field)]);
133
+ else
134
+ onChange(sorts.map((sort) => (sort.id === picker.sortId ? { ...sort, field } : sort)));
135
+ setPicker(null);
136
+ } }));
137
+ }
138
+ return (_jsxs("div", { className: cn('grid gap-2', className), children: [_jsx(SortableList, { items: [...sorts], keyOf: (sort) => sort.id, orientation: "vertical", handle: true, onReorder: (movedId, { beforeId }) => onChange(reorderById([...sorts], movedId, beforeId)), className: "flex flex-col gap-1.5", renderItem: (sort, { dragHandleProps, isDragging }) => {
139
+ const field = fieldsById.get(sort.field);
140
+ const DirectionIcon = sort.dir === 'asc' ? ArrowUp : ArrowDown;
141
+ const directionLabel = sort.dir === 'asc' ? labels.ascending : labels.descending;
142
+ return (_jsxs("div", { className: cn('border-border bg-background flex min-h-9 items-center gap-1 rounded-lg border p-1', isDragging && 'ring-ring shadow-md ring-1'), children: [_jsx(DragHandle, { dragHandleProps: dragHandleProps, "aria-label": labels.reorder }), _jsxs(Button, { type: "button", variant: "ghost", size: "xs", className: "min-w-0 flex-1 justify-start gap-1.5 font-normal", onClick: () => setPicker({ kind: 'edit', sortId: sort.id }), children: [field?.icon ? (_jsx("span", { className: "text-muted-foreground [&>svg]:size-3.5", children: field.icon })) : null, _jsx("span", { className: "truncate", children: field?.label ?? sort.field })] }), _jsxs(Button, { type: "button", variant: "ghost", size: "xs", "aria-label": directionLabel, className: "gap-1 font-normal", onClick: () => onChange(sorts.map((candidate) => candidate.id === sort.id
143
+ ? { ...candidate, dir: candidate.dir === 'asc' ? 'desc' : 'asc' }
144
+ : candidate)), children: [_jsx(DirectionIcon, { className: "size-3.5", strokeWidth: 1.5 }), directionLabel] }), _jsx(Button, { type: "button", variant: "ghost", size: "icon-xs", "aria-label": labels.remove, onClick: () => onChange(sorts.filter((candidate) => candidate.id !== sort.id)), children: _jsx(X, { className: "size-3.5", strokeWidth: 1.5 }) })] }));
145
+ } }), pickerFields.length > 0 ? (_jsx(CollectionViewSettingsAddAction, { onClick: () => setPicker({ kind: 'new' }), "data-testid": addButtonTestId, children: labels.addSort })) : null] }));
146
+ }
@@ -0,0 +1,87 @@
1
+ import { type ComponentProps, type ReactNode, type Ref } from 'react';
2
+ import type { CollectionPointerModifiers } from './use-collection-selection.js';
3
+ export declare function CollectionView({ className, ...props }: ComponentProps<'section'>): import("react").JSX.Element;
4
+ export declare function CollectionHeader({ className, ...props }: ComponentProps<'header'>): import("react").JSX.Element;
5
+ export interface CollectionTitleProps extends Omit<ComponentProps<'div'>, 'title'> {
6
+ icon?: ReactNode;
7
+ title: ReactNode;
8
+ description?: ReactNode;
9
+ }
10
+ export declare function CollectionTitle({ icon, title, description, className, ...props }: CollectionTitleProps): import("react").JSX.Element;
11
+ export declare function CollectionHeaderActions({ className, ...props }: ComponentProps<'div'>): import("react").JSX.Element;
12
+ export interface CollectionQueryControlsProps extends ComponentProps<'div'> {
13
+ filter?: ReactNode;
14
+ sort?: ReactNode;
15
+ trailing?: ReactNode;
16
+ }
17
+ export declare function CollectionQueryControls({ filter, sort, trailing, children, className, ...props }: CollectionQueryControlsProps): import("react").JSX.Element;
18
+ export declare function CollectionQueryIndicator({ icon, label, className, ...props }: ComponentProps<'span'> & {
19
+ icon?: ReactNode;
20
+ label: ReactNode;
21
+ }): import("react").JSX.Element;
22
+ export interface CollectionSelectionBarProps extends ComponentProps<'div'> {
23
+ summary: ReactNode;
24
+ actions?: ReactNode;
25
+ summaryTone?: 'foreground' | 'muted';
26
+ chromeFont?: string;
27
+ }
28
+ export declare function CollectionSelectionBar({ summary, actions, summaryTone, chromeFont, children, className, ...props }: CollectionSelectionBarProps): import("react").JSX.Element;
29
+ export declare function CollectionViewport({ className, ...props }: ComponentProps<'div'>): import("react").JSX.Element;
30
+ /** `motion` consumes the drag and animation callbacks under `animate` rather than forwarding them
31
+ * to the DOM, so the section cannot honour them. */
32
+ type CollectionGroupSectionDomProps = Omit<ComponentProps<'section'>, 'title' | 'onDrag' | 'onDragStart' | 'onDragEnd' | 'onAnimationStart'>;
33
+ export interface CollectionGroupSectionProps extends CollectionGroupSectionDomProps {
34
+ groupKey: string;
35
+ label: string;
36
+ icon?: ReactNode;
37
+ /** Overrides the child count shown next to the label. `null` hides the count entirely. */
38
+ count?: number | null;
39
+ collapsed?: boolean;
40
+ onToggleCollapse?: () => void;
41
+ hideHeader?: boolean;
42
+ /** Applied to the wrapper holding both the collapse control and `actions`, so a tint
43
+ * covers the whole header row. Not the same element as `headerClassName`. */
44
+ tintClassName?: string;
45
+ headerClassName?: string;
46
+ chromeFont?: string;
47
+ actions?: ReactNode;
48
+ /** Drop-target ref for the whole section, paired with `isOver`. */
49
+ droppableRef?: Ref<HTMLElement>;
50
+ /** Reveals `emptyDropTarget` and tints it while a dragged item hovers the section. */
51
+ isOver?: boolean;
52
+ /** Rendered instead of children while the section is empty and expanded. */
53
+ emptyDropTarget?: ReactNode;
54
+ /** Opts into layout animation: the section animates its position, its body its size. */
55
+ animate?: boolean;
56
+ children?: ReactNode;
57
+ }
58
+ export declare function CollectionGroupSection({ groupKey, label, icon, count, collapsed, onToggleCollapse, hideHeader, tintClassName, headerClassName, chromeFont, actions, droppableRef, isOver, emptyDropTarget, animate, children, className, ...props }: CollectionGroupSectionProps): import("react").JSX.Element;
59
+ export interface CollectionRowProps extends ComponentProps<'div'> {
60
+ /** Draws a hairline along the row's top edge, so the multi-line row styles read as
61
+ * discrete records instead of one run of text. Inset past the selection gutter so the
62
+ * rule starts at the content, and drawn as a pseudo-element to stay out of the layout. */
63
+ separatedAbove?: boolean;
64
+ }
65
+ export declare function CollectionRow({ separatedAbove, className, ...props }: CollectionRowProps): import("react").JSX.Element;
66
+ export declare function CollectionRowSelection({ className, ...props }: ComponentProps<'div'>): import("react").JSX.Element;
67
+ export declare function CollectionRowContent({ className, ...props }: ComponentProps<'div'>): import("react").JSX.Element;
68
+ export interface CollectionRowStateOptions {
69
+ selected?: boolean;
70
+ active?: boolean;
71
+ selectedAbove?: boolean;
72
+ selectedBelow?: boolean;
73
+ }
74
+ /** Row chrome shared by every collection list: hover/active/selected tints and the
75
+ * squared-off corners that fuse a contiguous selection into one block. Each state
76
+ * publishes its surface as --row-surface so ringed children can match it. The
77
+ * focus-visible ring is 2px accent so a row holding real DOM focus stays
78
+ * distinguishable from the 1px border ring that merely marks the pointer cursor. */
79
+ export declare function collectionRowStateClass({ selected, active, selectedAbove, selectedBelow, }: CollectionRowStateOptions): string;
80
+ export interface CollectionRowCheckboxProps extends Omit<ComponentProps<'button'>, 'onSelect' | 'onToggle'> {
81
+ selected: boolean;
82
+ active?: boolean;
83
+ onToggle: (modifiers: CollectionPointerModifiers) => void;
84
+ }
85
+ /** Selection control for list rows: hidden until the row is hovered, focused, or selected. */
86
+ export declare function CollectionRowCheckbox({ selected, active, onToggle, className, ...props }: CollectionRowCheckboxProps): import("react").JSX.Element;
87
+ export {};
@@ -0,0 +1,95 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Children } from 'react';
3
+ import { Check, ChevronRight } from 'lucide-react';
4
+ import { motion, useReducedMotion } from 'motion/react';
5
+ import { cn } from '../../lib/cn.js';
6
+ /** Square gutter: matches the compact row height (h-9) so the checkbox is inset equally on every side. */
7
+ const COLLECTION_ROW_GUTTER = '[--collection-row-gutter:2.25rem]';
8
+ export function CollectionView({ className, ...props }) {
9
+ return (_jsx("section", { "data-slot": "collection-view", className: cn('bg-background text-foreground relative flex min-h-0 flex-1 flex-col', className), ...props }));
10
+ }
11
+ export function CollectionHeader({ className, ...props }) {
12
+ return (_jsx("header", { "data-slot": "collection-header", className: cn('mx-auto flex h-auto w-full max-w-5xl shrink-0 items-center gap-3 px-6 pt-3 pb-1', className), ...props }));
13
+ }
14
+ export function CollectionTitle({ icon, title, description, className, ...props }) {
15
+ return (_jsxs("div", { "data-slot": "collection-title", className: cn('flex min-w-0 flex-1 items-center gap-2', className), ...props, children: [icon ? (_jsx("span", { "data-slot": "collection-title-icon", className: "flex size-5 shrink-0 items-center justify-center", children: icon })) : null, _jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "truncate text-[18px] leading-7 font-semibold", children: title }), description ? (_jsx("p", { className: "text-muted-foreground truncate text-xs leading-4", children: description })) : null] })] }));
16
+ }
17
+ export function CollectionHeaderActions({ className, ...props }) {
18
+ return (_jsx("div", { "data-slot": "collection-header-actions", className: cn('ml-auto flex shrink-0 items-center gap-1.5', className), ...props }));
19
+ }
20
+ export function CollectionQueryControls({ filter, sort, trailing, children, className, ...props }) {
21
+ return (_jsxs("div", { "data-slot": "collection-query-controls", className: cn('border-border/60 flex min-h-10 shrink-0 items-center gap-1.5 border-b px-6', className), ...props, children: [filter ? _jsx("div", { "data-slot": "collection-filter-control", children: filter }) : null, sort ? _jsx("div", { "data-slot": "collection-sort-control", children: sort }) : null, children, trailing ? (_jsx("div", { "data-slot": "collection-query-trailing", className: "ml-auto flex items-center gap-1.5", children: trailing })) : null] }));
22
+ }
23
+ export function CollectionQueryIndicator({ icon, label, className, ...props }) {
24
+ return (_jsxs("span", { "data-slot": "collection-query-indicator", className: cn('border-border/70 bg-muted/45 text-foreground inline-flex h-7 min-w-0 items-center gap-1.5 rounded-lg border px-2 text-xs', className), ...props, children: [icon ? _jsx("span", { className: "text-muted-foreground [&>svg]:size-3.5", children: icon }) : null, _jsx("span", { className: "max-w-[24ch] truncate", children: label })] }));
25
+ }
26
+ export function CollectionSelectionBar({ summary, actions, summaryTone = 'foreground', chromeFont, children, className, ...props }) {
27
+ const hasControls = Boolean(children) || Boolean(actions);
28
+ return (_jsxs("div", { "data-slot": "collection-selection-bar", role: "toolbar", className: cn('border-border/60 bg-popover/95 ring-foreground/5 pointer-events-auto absolute bottom-6 left-1/2 z-40 flex max-w-[calc(100%-2rem)] -translate-x-1/2 items-center gap-1.5 rounded-xl border px-2.5 py-1.5 shadow-lg ring-1 backdrop-blur', className), ...props, children: [_jsx("span", { role: "status", className: cn('shrink-0 px-1 text-[12px] font-medium whitespace-nowrap tabular-nums', summaryTone === 'muted' ? 'text-muted-foreground' : 'text-foreground', chromeFont), children: summary }), hasControls ? _jsx("span", { className: "bg-border/70 h-5 w-px shrink-0", "aria-hidden": true }) : null, children, actions ? (_jsx("div", { "data-slot": "collection-selection-actions", className: "flex items-center gap-1.5", children: actions })) : null] }));
29
+ }
30
+ export function CollectionViewport({ className, ...props }) {
31
+ return (_jsx("div", { "data-slot": "collection-viewport", className: cn('min-h-0 flex-1 overflow-auto', className), ...props }));
32
+ }
33
+ export function CollectionGroupSection({ groupKey, label, icon, count, collapsed = false, onToggleCollapse, hideHeader, tintClassName, headerClassName, chromeFont, actions, droppableRef, isOver = false, emptyDropTarget, animate = false, children, className, ...props }) {
34
+ const reduceMotion = useReducedMotion();
35
+ const layoutTransition = reduceMotion
36
+ ? { duration: 0 }
37
+ : { duration: 0.16, ease: [0.2, 0, 0, 1] };
38
+ const childCount = Children.count(children);
39
+ const resolvedCount = count === undefined ? childCount : count;
40
+ const isEmpty = (resolvedCount ?? childCount) === 0;
41
+ const heading = (_jsxs(_Fragment, { children: [onToggleCollapse ? (_jsx(ChevronRight, { "aria-hidden": true, strokeWidth: 1.5, className: cn('text-muted-foreground/55 size-3.5 shrink-0 transition-transform motion-reduce:transition-none', !collapsed && 'rotate-90') })) : null, icon ? _jsx("span", { className: "inline-flex shrink-0 items-center", children: icon }) : null, _jsx("span", { className: "text-foreground/80 truncate font-medium", children: label }), resolvedCount === null ? null : (_jsx("span", { className: cn('text-muted-foreground/45 tabular-nums', !chromeFont && 'font-mono'), children: resolvedCount }))] }));
42
+ const header = hideHeader ? (_jsx("div", { className: "h-2", "aria-hidden": true })) : (_jsx("div", { className: "bg-background/95 sticky top-0 z-10 px-2 pt-2 pb-1 backdrop-blur-sm", children: _jsxs("div", { "data-slot": "collection-group-header", className: cn('group/gh flex h-7 min-w-0 items-center gap-1 rounded-lg', tintClassName, chromeFont), children: [onToggleCollapse ? (_jsx("button", { type: "button", onClick: onToggleCollapse, "aria-expanded": !collapsed, className: cn('hover:bg-muted/40 focus-visible:ring-ring flex h-7 min-w-0 flex-1 items-center gap-2 rounded-lg px-2 text-left text-[12px] focus-visible:ring-2 focus-visible:ring-offset-2', headerClassName), children: heading })) : (_jsx("div", { className: cn('flex h-7 min-w-0 flex-1 items-center gap-2 px-2 text-[12px]', headerClassName), children: heading })), actions ? (_jsx("div", { className: "flex shrink-0 items-center gap-1 pr-1.5 opacity-0 group-focus-within/gh:opacity-100 group-hover/gh:opacity-100", children: actions })) : null] }) }));
43
+ const body = collapsed ? null : emptyDropTarget !== undefined && isEmpty ? (_jsx("div", { "data-slot": "collection-group-empty-drop", "data-over": isOver ? '' : undefined, className: cn('mx-2 my-1 flex h-9 items-center rounded-lg transition-colors motion-reduce:transition-none', isOver ? 'bg-muted/45 ring-border/70 ring-1 ring-inset' : 'hidden'), children: emptyDropTarget })) : (children);
44
+ const sectionProps = {
45
+ role: 'group',
46
+ 'aria-label': label,
47
+ className: cn('scroll-mt-8', className),
48
+ ...props,
49
+ ref: droppableRef ?? props.ref,
50
+ };
51
+ if (!animate) {
52
+ return (_jsxs("section", { "data-slot": "collection-group-section", "data-group": groupKey, ...sectionProps, children: [header, body] }));
53
+ }
54
+ return (_jsxs(motion.section, { "data-slot": "collection-group-section", "data-group": groupKey, layout: "position", transition: layoutTransition, ...sectionProps, children: [header, _jsx(motion.div, { layout: "size", transition: layoutTransition, children: body })] }));
55
+ }
56
+ export function CollectionRow({ separatedAbove = false, className, ...props }) {
57
+ return (_jsx("div", { "data-slot": "collection-row", "data-separated-above": separatedAbove ? '' : undefined, className: cn(COLLECTION_ROW_GUTTER, 'relative mr-2 min-w-0', separatedAbove &&
58
+ "before:bg-border/60 before:absolute before:top-0 before:right-3 before:left-8 before:h-px before:content-['']", className), ...props }));
59
+ }
60
+ export function CollectionRowSelection({ className, ...props }) {
61
+ return (_jsx("div", { "data-slot": "collection-row-selection", className: cn('absolute inset-y-0 left-0 flex w-(--collection-row-gutter) items-center justify-center', className), ...props }));
62
+ }
63
+ export function CollectionRowContent({ className, ...props }) {
64
+ return (_jsx("div", { "data-slot": "collection-row-content", className: cn('min-w-0 flex-1 pr-2 pl-(--collection-row-gutter)', className), ...props }));
65
+ }
66
+ const COLLECTION_ROW_HOVER_SURFACE = 'hover:bg-(--collection-row-hover-surface) hover:[--row-surface:var(--collection-row-hover-surface)]';
67
+ const COLLECTION_ROW_ACTIVE_SURFACE = 'bg-(--collection-row-active-surface) [--row-surface:var(--collection-row-active-surface)]';
68
+ const COLLECTION_ROW_SELECTED_SURFACE = cn('bg-(--collection-row-selected-surface) [--row-surface:var(--collection-row-selected-surface)]', 'hover:bg-(--collection-row-selected-hover-surface) hover:[--row-surface:var(--collection-row-selected-hover-surface)]');
69
+ /** Row chrome shared by every collection list: hover/active/selected tints and the
70
+ * squared-off corners that fuse a contiguous selection into one block. Each state
71
+ * publishes its surface as --row-surface so ringed children can match it. The
72
+ * focus-visible ring is 2px accent so a row holding real DOM focus stays
73
+ * distinguishable from the 1px border ring that merely marks the pointer cursor. */
74
+ export function collectionRowStateClass({ selected = false, active = false, selectedAbove = false, selectedBelow = false, }) {
75
+ return cn('group/row cursor-pointer select-none', 'outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring', !selected || (!selectedAbove && !selectedBelow)
76
+ ? 'rounded-lg'
77
+ : selectedAbove && selectedBelow
78
+ ? 'rounded-none'
79
+ : selectedAbove
80
+ ? 'rounded-t-none rounded-b-lg'
81
+ : 'rounded-b-none rounded-t-lg', active && 'ring-border ring-1 ring-inset', selected
82
+ ? COLLECTION_ROW_SELECTED_SURFACE
83
+ : active
84
+ ? cn(COLLECTION_ROW_ACTIVE_SURFACE, COLLECTION_ROW_HOVER_SURFACE)
85
+ : COLLECTION_ROW_HOVER_SURFACE);
86
+ }
87
+ /** Selection control for list rows: hidden until the row is hovered, focused, or selected. */
88
+ export function CollectionRowCheckbox({ selected, active = false, onToggle, className, ...props }) {
89
+ return (_jsx("button", { type: "button", "data-slot": "collection-row-checkbox", "data-row-checkbox": true, "aria-pressed": selected, onPointerDown: (event) => event.stopPropagation(), onClick: (event) => {
90
+ event.stopPropagation();
91
+ onToggle({ metaKey: true, shiftKey: event.shiftKey });
92
+ }, className: cn('grid size-4 place-items-center rounded border transition-all', selected
93
+ ? 'bg-primary border-primary text-primary-foreground opacity-100'
94
+ : 'border-muted-foreground/40 text-transparent opacity-0 group-hover/row:opacity-100', active && !selected && 'opacity-100', className), ...props, children: _jsx(Check, { className: "size-3", strokeWidth: 3 }) }));
95
+ }
@@ -0,0 +1,6 @@
1
+ export { CollectionGroupSection, CollectionHeader, CollectionHeaderActions, CollectionQueryControls, CollectionQueryIndicator, CollectionRow, CollectionRowCheckbox, CollectionRowContent, CollectionRowSelection, CollectionSelectionBar, CollectionTitle, CollectionView, CollectionViewport, collectionRowStateClass, type CollectionGroupSectionProps, type CollectionRowCheckboxProps, type CollectionRowProps, type CollectionRowStateOptions, type CollectionQueryControlsProps, type CollectionSelectionBarProps, type CollectionTitleProps, } from './collection-view.js';
2
+ export { useCollectionEscape, type CollectionEscapeOptions } from './use-collection-escape.js';
3
+ export { CollectionViewSettings, CollectionViewSettingsAddAction, CollectionViewSettingsChoiceGroup, CollectionViewSettingsFieldPicker, CollectionViewSettingsIdentity, CollectionViewSettingsPage, CollectionViewSettingsSectionRow, CollectionViewSettingsSortPage, useCollectionViewSettingsNavigation, type CollectionViewSettingsChoice, type CollectionViewSettingsChoiceGroupProps, type CollectionViewSettingsField, type CollectionViewSettingsFieldPickerProps, type CollectionViewSettingsIdentityProps, type CollectionViewSettingsLabels, type CollectionViewSettingsNavigation, type CollectionViewSettingsProps, type CollectionViewSettingsSection, type CollectionViewSettingsSort, type CollectionViewSettingsSortPageProps, } from './collection-view-settings.js';
4
+ export { CollectionViewSettingsGroupAxisPage, CollectionViewSettingsGroupPage, CollectionViewSettingsSelectRow, collectionViewSettingsRowClass, type CollectionViewSettingsGroupAxis, type CollectionViewSettingsGroupAxisPageLabels, type CollectionViewSettingsGroupAxisPageProps, type CollectionViewSettingsGroupItem, type CollectionViewSettingsGroupLabels, type CollectionViewSettingsGroupPageProps, type CollectionViewSettingsSelectRowOption, type CollectionViewSettingsSelectRowProps, } from './collection-view-group-settings.js';
5
+ export { useCollectionSelection, type CollectionKeyboardInput, type CollectionPointerModifiers, type CollectionSelectionChange, type CollectionSelectionOptions, } from './use-collection-selection.js';
6
+ export { useCollectionDetailNavigation, type CollectionDetailNavigationOptions, } from './use-collection-detail-navigation.js';
@@ -0,0 +1,6 @@
1
+ export { CollectionGroupSection, CollectionHeader, CollectionHeaderActions, CollectionQueryControls, CollectionQueryIndicator, CollectionRow, CollectionRowCheckbox, CollectionRowContent, CollectionRowSelection, CollectionSelectionBar, CollectionTitle, CollectionView, CollectionViewport, collectionRowStateClass, } from './collection-view.js';
2
+ export { useCollectionEscape } from './use-collection-escape.js';
3
+ export { CollectionViewSettings, CollectionViewSettingsAddAction, CollectionViewSettingsChoiceGroup, CollectionViewSettingsFieldPicker, CollectionViewSettingsIdentity, CollectionViewSettingsPage, CollectionViewSettingsSectionRow, CollectionViewSettingsSortPage, useCollectionViewSettingsNavigation, } from './collection-view-settings.js';
4
+ export { CollectionViewSettingsGroupAxisPage, CollectionViewSettingsGroupPage, CollectionViewSettingsSelectRow, collectionViewSettingsRowClass, } from './collection-view-group-settings.js';
5
+ export { useCollectionSelection, } from './use-collection-selection.js';
6
+ export { useCollectionDetailNavigation, } from './use-collection-detail-navigation.js';
@@ -0,0 +1,11 @@
1
+ export interface CollectionDetailNavigationOptions {
2
+ activeId?: string | null;
3
+ onOpen: (id: string) => void;
4
+ onClose?: () => void;
5
+ onBack?: () => void;
6
+ }
7
+ export declare function useCollectionDetailNavigation({ activeId, onOpen, onClose, onBack, }: CollectionDetailNavigationOptions): {
8
+ activeId: string | null;
9
+ open: (id: string) => void;
10
+ close: () => boolean;
11
+ };
@@ -0,0 +1,12 @@
1
+ import { useCallback, useMemo } from 'react';
2
+ export function useCollectionDetailNavigation({ activeId, onOpen, onClose, onBack, }) {
3
+ const close = useCallback(() => {
4
+ if (activeId && onClose) {
5
+ onClose();
6
+ return true;
7
+ }
8
+ onBack?.();
9
+ return Boolean(onBack);
10
+ }, [activeId, onBack, onClose]);
11
+ return useMemo(() => ({ activeId: activeId ?? null, open: onOpen, close }), [activeId, close, onOpen]);
12
+ }
@@ -0,0 +1,9 @@
1
+ export interface CollectionEscapeOptions {
2
+ closeOverlay?: () => boolean;
3
+ detailOpen?: boolean;
4
+ closeDetail?: () => void;
5
+ hasSelection?: boolean;
6
+ clearSelection?: () => void;
7
+ fallback?: () => void;
8
+ }
9
+ export declare function useCollectionEscape(options: CollectionEscapeOptions): () => boolean;
@@ -0,0 +1,20 @@
1
+ import { useCallback } from 'react';
2
+ export function useCollectionEscape(options) {
3
+ return useCallback(() => {
4
+ if (options.closeOverlay?.())
5
+ return true;
6
+ if (options.detailOpen && options.closeDetail) {
7
+ options.closeDetail();
8
+ return true;
9
+ }
10
+ if (options.hasSelection && options.clearSelection) {
11
+ options.clearSelection();
12
+ return true;
13
+ }
14
+ if (options.fallback) {
15
+ options.fallback();
16
+ return true;
17
+ }
18
+ return false;
19
+ }, [options]);
20
+ }
@@ -0,0 +1,42 @@
1
+ export type CollectionSelectionChange = ReadonlySet<string>;
2
+ export interface CollectionSelectionOptions {
3
+ itemIds: readonly string[];
4
+ isSelectable?: (id: string) => boolean;
5
+ selectedIds?: CollectionSelectionChange;
6
+ defaultSelectedIds?: Iterable<string>;
7
+ defaultFocusedId?: string;
8
+ onSelectionChange?: (selectedIds: CollectionSelectionChange) => void;
9
+ onOpen?: (id: string) => void;
10
+ onDelete?: (ids: readonly string[]) => void;
11
+ }
12
+ export interface CollectionPointerModifiers {
13
+ metaKey?: boolean;
14
+ ctrlKey?: boolean;
15
+ shiftKey?: boolean;
16
+ }
17
+ export interface CollectionKeyboardInput {
18
+ key: string;
19
+ metaKey?: boolean;
20
+ ctrlKey?: boolean;
21
+ shiftKey?: boolean;
22
+ preventDefault?: () => void;
23
+ }
24
+ export declare function useCollectionSelection({ itemIds, isSelectable, selectedIds: controlledSelection, defaultSelectedIds, defaultFocusedId, onSelectionChange, onOpen, onDelete, }: CollectionSelectionOptions): {
25
+ selectedIds: Set<string>;
26
+ focusedId: string | undefined;
27
+ anchorId: string | undefined;
28
+ focusItem: (id: string | undefined, options?: {
29
+ establishAnchor?: boolean;
30
+ }) => void;
31
+ select: (id: string, modifiers?: CollectionPointerModifiers) => void;
32
+ activate: (id: string, modifiers?: CollectionPointerModifiers) => void;
33
+ handleKeyDown: (event: CollectionKeyboardInput) => void;
34
+ clearSelection: () => void;
35
+ getItemProps: (id: string) => {
36
+ role: "option";
37
+ 'aria-selected': boolean;
38
+ tabIndex: number;
39
+ onClick: (modifiers: CollectionPointerModifiers) => void;
40
+ onKeyDown: (event: CollectionKeyboardInput) => void;
41
+ };
42
+ };