@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,49 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface DetailBreadcrumbItem {
3
+ id: string;
4
+ label: ReactNode;
5
+ icon?: ReactNode;
6
+ current?: boolean;
7
+ onSelect?: () => void;
8
+ ariaLabel?: string;
9
+ title?: string;
10
+ className?: string;
11
+ truncate?: 'end' | 'middle';
12
+ /** Sits beside this segment rather than at the end of the trail, for state that belongs to this segment alone. */
13
+ trailing?: ReactNode;
14
+ }
15
+ export interface DetailBreadcrumbProps {
16
+ items: DetailBreadcrumbItem[];
17
+ ariaLabel: string;
18
+ className?: string;
19
+ separator?: ReactNode;
20
+ collapseMiddle?: boolean;
21
+ tailItems?: number;
22
+ collapsedAriaLabel?: string;
23
+ dataTestId?: string;
24
+ }
25
+ export interface DetailTopBarProps {
26
+ title?: ReactNode;
27
+ trail?: ReactNode;
28
+ meta?: ReactNode;
29
+ actions?: ReactNode;
30
+ className?: string;
31
+ contentClassName?: string;
32
+ leftClassName?: string;
33
+ actionsClassName?: string;
34
+ chromeFont?: string;
35
+ headingFont?: string;
36
+ dataTestId?: string;
37
+ /**
38
+ * The trailing fade only reads as a soft edge when content actually scrolls up under the bar.
39
+ * Above fixed chrome — a toolbar, a canvas, an embedded frame — it washes over something that
40
+ * never moves, so those surfaces turn it off.
41
+ */
42
+ fade?: boolean;
43
+ }
44
+ export declare function DetailTopBar({ title, trail, meta, actions, className, contentClassName, leftClassName, actionsClassName, chromeFont, headingFont, dataTestId, fade, }: DetailTopBarProps): import("react").JSX.Element;
45
+ export declare function DetailBreadcrumb({ items, ariaLabel, className, separator, collapseMiddle, tailItems, collapsedAriaLabel, dataTestId, }: DetailBreadcrumbProps): import("react").JSX.Element;
46
+ export declare const COLLAPSED_BREADCRUMB_TEST_ID = "detail-breadcrumb-collapsed";
47
+ export declare function detailTopBarButtonClass(className?: string, opts?: {
48
+ iconOnly?: boolean;
49
+ }): string;
@@ -0,0 +1,41 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { cn } from '../lib/cn.js';
4
+ import { Button } from './button.js';
5
+ import { collapseMiddleItems, collapsedMiddleItems } from './detail-breadcrumb-utils.js';
6
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from './dropdown-menu.js';
7
+ import { MiddleTruncate } from './middle-truncate.js';
8
+ import { StickyHeaderFade } from './sticky-header-fade.js';
9
+ export function DetailTopBar({ title, trail, meta, actions, className, contentClassName, leftClassName, actionsClassName, chromeFont, headingFont, dataTestId, fade = true, }) {
10
+ return (_jsxs("div", { className: cn('bg-background/95 sticky top-0 z-50 flex h-10 items-center justify-between gap-3 px-3 backdrop-blur', chromeFont, className), "data-slot": "detail-top-bar", "data-testid": dataTestId, children: [_jsxs("div", { className: cn('flex min-w-0 flex-1 items-center gap-3 overflow-hidden', contentClassName), children: [_jsx("div", { className: cn('flex min-w-0 flex-1 items-center overflow-hidden', leftClassName), children: trail ?? (_jsx("h1", { className: cn('text-foreground min-w-0 truncate text-[13px] leading-5 font-medium', headingFont), children: title })) }), meta ? (_jsx("div", { className: "text-muted-foreground min-w-0 shrink truncate font-mono text-[11.5px]", children: meta })) : null] }), actions ? (_jsx("div", { className: cn('flex shrink-0 items-center gap-1', actionsClassName), children: actions })) : null, fade ? _jsx(StickyHeaderFade, { "data-slot": "detail-top-bar-fade" }) : null] }));
11
+ }
12
+ export function DetailBreadcrumb({ items, ariaLabel, className, separator = '/', collapseMiddle = false, tailItems = 2, collapsedAriaLabel, dataTestId, }) {
13
+ const collapsedItems = collapseMiddle ? collapsedMiddleItems(items, tailItems) : [];
14
+ const visibleItems = collapseMiddle
15
+ ? collapseMiddleItems(items, { id: COLLAPSED_BREADCRUMB_ID, label: ELLIPSIS }, tailItems)
16
+ : items;
17
+ return (_jsx("nav", { "aria-label": ariaLabel, className: cn('flex w-full min-w-0 items-center gap-2 text-[13px]', className), "data-slot": "detail-breadcrumb", "data-testid": dataTestId, children: visibleItems.map((item, index) => (_jsxs("span", { className: cn('flex min-w-0 items-center gap-2', item.current && 'flex-1'), "data-current": item.current || undefined, children: [index > 0 ? (_jsx("span", { className: "text-muted-foreground/45 shrink-0", "aria-hidden": true, children: separator })) : null, item.id === COLLAPSED_BREADCRUMB_ID ? (_jsx(CollapsedBreadcrumbMenu, { items: collapsedItems, ariaLabel: collapsedAriaLabel })) : (_jsx(DetailBreadcrumbItemView, { item: item })), item.trailing ? (_jsx("span", { className: "flex shrink-0 items-center", children: item.trailing })) : null] }, item.id))) }));
18
+ }
19
+ function DetailBreadcrumbItemView({ item }) {
20
+ const content = (_jsxs(_Fragment, { children: [item.icon, item.truncate === 'middle' && typeof item.label === 'string' ? (_jsx(MiddleTruncate, { text: item.label, className: "min-w-0 flex-1" })) : (_jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }))] }));
21
+ const className = cn('flex min-w-0 items-center gap-1.5 rounded-sm transition-colors', item.current && 'flex-1', item.current
22
+ ? 'text-foreground font-medium'
23
+ : 'text-muted-foreground hover:text-foreground focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none', !item.current && item.onSelect && 'cursor-pointer', item.className);
24
+ if (!item.current && item.onSelect) {
25
+ return (_jsx("button", { type: "button", onClick: item.onSelect, className: className, "aria-label": item.ariaLabel, title: item.title, children: content }));
26
+ }
27
+ return (_jsx("span", { className: className, title: item.title, children: content }));
28
+ }
29
+ /**
30
+ * The segments the trail had to drop are not gone, only folded: the ellipsis opens them in
31
+ * path order so a reader can step back out to any ancestor without retyping the path.
32
+ */
33
+ function CollapsedBreadcrumbMenu({ items, ariaLabel, }) {
34
+ return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { type: "button", variant: "ghost", size: "icon-xs", className: "text-muted-foreground hover:text-foreground shrink-0 text-[13px] font-normal", "aria-label": ariaLabel, "data-testid": COLLAPSED_BREADCRUMB_TEST_ID, children: ELLIPSIS }) }), _jsx(DropdownMenuContent, { align: "start", className: "max-w-72 min-w-44", children: items.map((item) => (_jsxs(DropdownMenuItem, { onSelect: item.onSelect, disabled: !item.onSelect, children: [item.icon, _jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label })] }, item.id))) })] }));
35
+ }
36
+ const ELLIPSIS = '…';
37
+ export const COLLAPSED_BREADCRUMB_TEST_ID = 'detail-breadcrumb-collapsed';
38
+ const COLLAPSED_BREADCRUMB_ID = '__detail-breadcrumb-collapsed__';
39
+ export function detailTopBarButtonClass(className, opts = {}) {
40
+ return cn('inline-flex h-7 shrink-0 items-center justify-center rounded-md border border-transparent bg-transparent text-[12px] text-muted-foreground transition-colors', 'hover:border-border/60 hover:bg-muted/50 hover:text-foreground', 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-offset-background focus-visible:outline-none', 'disabled:pointer-events-none disabled:opacity-45', opts.iconOnly ? 'w-7 px-0' : 'gap-1.5 px-2', className);
41
+ }
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+ import { Dialog as DialogPrimitive } from 'radix-ui';
3
+ declare function Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>): React.JSX.Element;
4
+ declare function DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>): React.JSX.Element;
5
+ declare function DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>): React.JSX.Element;
6
+ declare function DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>): React.JSX.Element;
7
+ declare function DialogOverlay({ className, blur, ...props }: React.ComponentProps<typeof DialogPrimitive.Overlay> & {
8
+ blur?: boolean;
9
+ }): React.JSX.Element;
10
+ declare function DialogContent({ className, children, showCloseButton, closeLabel, overlayBlur, overlayClassName, onInteractOutside, ...props }: React.ComponentProps<typeof DialogPrimitive.Content> & {
11
+ showCloseButton?: boolean;
12
+ closeLabel?: string;
13
+ overlayBlur?: boolean;
14
+ overlayClassName?: string;
15
+ }): React.JSX.Element;
16
+ declare function DialogHeader({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
17
+ declare function DialogFooter({ className, showCloseButton, children, ...props }: React.ComponentProps<'div'> & {
18
+ showCloseButton?: boolean;
19
+ }): React.JSX.Element;
20
+ declare function DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>): React.JSX.Element;
21
+ declare function DialogDescription({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Description>): React.JSX.Element;
22
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, };
@@ -0,0 +1,51 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { Dialog as DialogPrimitive } from 'radix-ui';
5
+ import { X } from 'lucide-react';
6
+ import { cn } from '../lib/cn.js';
7
+ import { Button } from './button.js';
8
+ function Dialog({ ...props }) {
9
+ return _jsx(DialogPrimitive.Root, { "data-slot": "dialog", ...props });
10
+ }
11
+ function DialogTrigger({ ...props }) {
12
+ return _jsx(DialogPrimitive.Trigger, { "data-slot": "dialog-trigger", ...props });
13
+ }
14
+ function DialogPortal({ ...props }) {
15
+ return _jsx(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props });
16
+ }
17
+ function DialogClose({ ...props }) {
18
+ return _jsx(DialogPrimitive.Close, { "data-slot": "dialog-close", ...props });
19
+ }
20
+ function DialogOverlay({ className, blur = true, ...props }) {
21
+ return (_jsx(DialogPrimitive.Overlay, { "data-slot": "dialog-overlay", className: cn('data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0 fixed inset-0 isolate z-50 bg-black/10 duration-100 motion-reduce:animate-none', blur && 'supports-backdrop-filter:backdrop-blur-xs', className), ...props }));
22
+ }
23
+ function isInteractionInsidePopper(target) {
24
+ return target instanceof Element && target.closest('[data-radix-popper-content-wrapper]') !== null;
25
+ }
26
+ function dismissPopoverWithoutClosing(onInteractOutside) {
27
+ return (event) => {
28
+ if (isInteractionInsidePopper(event.detail.originalEvent.target)) {
29
+ event.preventDefault();
30
+ return;
31
+ }
32
+ onInteractOutside?.(event);
33
+ };
34
+ }
35
+ function DialogContent({ className, children, showCloseButton = true, closeLabel = 'Close', overlayBlur = true, overlayClassName, onInteractOutside, ...props }) {
36
+ const handleInteractOutside = dismissPopoverWithoutClosing(onInteractOutside);
37
+ return (_jsxs(DialogPortal, { children: [_jsx(DialogOverlay, { blur: overlayBlur, className: overlayClassName }), _jsxs(DialogPrimitive.Content, { "data-slot": "dialog-content", className: cn('bg-popover text-popover-foreground ring-foreground/10 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 fixed top-1/2 left-1/2 z-50 grid max-h-[calc(100dvh-2rem)] w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 overflow-y-auto rounded-xl p-4 text-sm ring-1 duration-100 outline-none motion-reduce:animate-none sm:max-w-sm', className), onInteractOutside: handleInteractOutside, ...props, children: [children, showCloseButton && (_jsxs(DialogPrimitive.Close, { "data-slot": "dialog-close", "aria-label": closeLabel, className: "hover:bg-muted focus-visible:ring-ring/50 absolute top-3 right-3 z-10 inline-flex size-8 items-center justify-center rounded-md transition-colors outline-none focus-visible:ring-1 sm:size-auto sm:hover:bg-transparent", children: [_jsx(X, { className: "text-muted-foreground size-4 sm:hidden", "aria-hidden": true }), _jsx("kbd", { className: "border-border/60 bg-muted/50 text-muted-foreground/85 hover:bg-muted hover:text-foreground hidden h-[18px] min-w-[18px] cursor-pointer items-center justify-center rounded-md border px-1.5 font-mono text-[10px] leading-none transition-colors sm:inline-flex", children: "esc" }), _jsx("span", { className: "sr-only", children: closeLabel })] }))] })] }));
38
+ }
39
+ function DialogHeader({ className, ...props }) {
40
+ return (_jsx("div", { "data-slot": "dialog-header", className: cn('flex flex-col gap-2', className), ...props }));
41
+ }
42
+ function DialogFooter({ className, showCloseButton = false, children, ...props }) {
43
+ return (_jsxs("div", { "data-slot": "dialog-footer", className: cn('bg-muted/50 -mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t p-4 sm:flex-row sm:justify-end', className), ...props, children: [children, showCloseButton && (_jsx(DialogPrimitive.Close, { asChild: true, children: _jsx(Button, { variant: "outline", children: "Close" }) }))] }));
44
+ }
45
+ function DialogTitle({ className, ...props }) {
46
+ return (_jsx(DialogPrimitive.Title, { "data-slot": "dialog-title", className: cn('font-heading text-base leading-none font-medium', className), ...props }));
47
+ }
48
+ function DialogDescription({ className, ...props }) {
49
+ return (_jsx(DialogPrimitive.Description, { "data-slot": "dialog-description", className: cn('text-muted-foreground *:[a]:hover:text-foreground text-sm *:[a]:underline *:[a]:underline-offset-3', className), ...props }));
50
+ }
51
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, };
@@ -0,0 +1,29 @@
1
+ import * as React from "react";
2
+ import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
3
+ declare function DropdownMenu({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>): React.JSX.Element;
4
+ declare function DropdownMenuPortal({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>): React.JSX.Element;
5
+ declare function DropdownMenuTrigger({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>): React.JSX.Element;
6
+ declare function DropdownMenuContent({ className, align, sideOffset, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Content>): React.JSX.Element;
7
+ declare function DropdownMenuGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>): React.JSX.Element;
8
+ declare function DropdownMenuItem({ className, inset, variant, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
9
+ inset?: boolean;
10
+ variant?: "default" | "destructive";
11
+ }): React.JSX.Element;
12
+ declare function DropdownMenuCheckboxItem({ className, children, checked, inset, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem> & {
13
+ inset?: boolean;
14
+ }): React.JSX.Element;
15
+ declare function DropdownMenuRadioGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>): React.JSX.Element;
16
+ declare function DropdownMenuRadioItem({ className, children, inset, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem> & {
17
+ inset?: boolean;
18
+ }): React.JSX.Element;
19
+ declare function DropdownMenuLabel({ className, inset, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {
20
+ inset?: boolean;
21
+ }): React.JSX.Element;
22
+ declare function DropdownMenuSeparator({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>): React.JSX.Element;
23
+ declare function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
24
+ declare function DropdownMenuSub({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>): React.JSX.Element;
25
+ declare function DropdownMenuSubTrigger({ className, inset, children, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
26
+ inset?: boolean;
27
+ }): React.JSX.Element;
28
+ declare function DropdownMenuSubContent({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>): React.JSX.Element;
29
+ export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, };
@@ -0,0 +1,52 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
5
+ import { cn } from '../lib/cn.js';
6
+ import { CheckIcon, ChevronRightIcon } from "lucide-react";
7
+ function DropdownMenu({ ...props }) {
8
+ return _jsx(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
9
+ }
10
+ function DropdownMenuPortal({ ...props }) {
11
+ return (_jsx(DropdownMenuPrimitive.Portal, { "data-slot": "dropdown-menu-portal", ...props }));
12
+ }
13
+ function DropdownMenuTrigger({ ...props }) {
14
+ return (_jsx(DropdownMenuPrimitive.Trigger, { "data-slot": "dropdown-menu-trigger", ...props }));
15
+ }
16
+ function DropdownMenuContent({ className, align = "start", sideOffset = 4, ...props }) {
17
+ return (_jsx(DropdownMenuPrimitive.Portal, { children: _jsx(DropdownMenuPrimitive.Content, { "data-slot": "dropdown-menu-content", sideOffset: sideOffset, align: align, className: cn("z-50 max-h-(--radix-dropdown-menu-content-available-height) w-max min-w-32 max-w-[calc(100vw-2rem)] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-lg bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:overflow-hidden data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className), ...props }) }));
18
+ }
19
+ function DropdownMenuGroup({ ...props }) {
20
+ return (_jsx(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props }));
21
+ }
22
+ function DropdownMenuItem({ className, inset, variant = "default", ...props }) {
23
+ return (_jsx(DropdownMenuPrimitive.Item, { "data-slot": "dropdown-menu-item", "data-inset": inset, "data-variant": variant, className: cn("group/dropdown-menu-item relative flex cursor-pointer items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 data-[variant=destructive]:*:[svg]:text-destructive", className), ...props }));
24
+ }
25
+ function DropdownMenuCheckboxItem({ className, children, checked, inset, ...props }) {
26
+ return (_jsxs(DropdownMenuPrimitive.CheckboxItem, { "data-slot": "dropdown-menu-checkbox-item", "data-inset": inset, className: cn("relative flex cursor-pointer items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), checked: checked, ...props, children: [_jsx("span", { className: "pointer-events-none absolute right-2 flex items-center justify-center", "data-slot": "dropdown-menu-checkbox-item-indicator", children: _jsx(DropdownMenuPrimitive.ItemIndicator, { children: _jsx(CheckIcon, {}) }) }), children] }));
27
+ }
28
+ function DropdownMenuRadioGroup({ ...props }) {
29
+ return (_jsx(DropdownMenuPrimitive.RadioGroup, { "data-slot": "dropdown-menu-radio-group", ...props }));
30
+ }
31
+ function DropdownMenuRadioItem({ className, children, inset, ...props }) {
32
+ return (_jsxs(DropdownMenuPrimitive.RadioItem, { "data-slot": "dropdown-menu-radio-item", "data-inset": inset, className: cn("relative flex cursor-pointer items-center gap-1.5 rounded-md py-1 pr-8 pl-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground focus:**:text-accent-foreground data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), ...props, children: [_jsx("span", { className: "pointer-events-none absolute right-2 flex items-center justify-center", "data-slot": "dropdown-menu-radio-item-indicator", children: _jsx(DropdownMenuPrimitive.ItemIndicator, { children: _jsx(CheckIcon, {}) }) }), children] }));
33
+ }
34
+ function DropdownMenuLabel({ className, inset, ...props }) {
35
+ return (_jsx(DropdownMenuPrimitive.Label, { "data-slot": "dropdown-menu-label", "data-inset": inset, className: cn("px-1.5 py-1 text-xs font-medium text-muted-foreground data-inset:pl-7", className), ...props }));
36
+ }
37
+ function DropdownMenuSeparator({ className, ...props }) {
38
+ return (_jsx(DropdownMenuPrimitive.Separator, { "data-slot": "dropdown-menu-separator", className: cn("-mx-1 my-1 h-px bg-border", className), ...props }));
39
+ }
40
+ function DropdownMenuShortcut({ className, ...props }) {
41
+ return (_jsx("span", { "data-slot": "dropdown-menu-shortcut", className: cn("ml-auto text-xs tracking-widest text-muted-foreground group-focus/dropdown-menu-item:text-accent-foreground", className), ...props }));
42
+ }
43
+ function DropdownMenuSub({ ...props }) {
44
+ return _jsx(DropdownMenuPrimitive.Sub, { "data-slot": "dropdown-menu-sub", ...props });
45
+ }
46
+ function DropdownMenuSubTrigger({ className, inset, children, ...props }) {
47
+ return (_jsxs(DropdownMenuPrimitive.SubTrigger, { "data-slot": "dropdown-menu-sub-trigger", "data-inset": inset, className: cn("flex cursor-pointer items-center gap-1.5 rounded-md px-1.5 py-1 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground data-inset:pl-7 data-open:bg-accent data-open:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), ...props, children: [children, _jsx(ChevronRightIcon, { className: "ml-auto" })] }));
48
+ }
49
+ function DropdownMenuSubContent({ className, ...props }) {
50
+ return (_jsx(DropdownMenuPrimitive.SubContent, { "data-slot": "dropdown-menu-sub-content", className: cn("z-50 w-max min-w-32 max-w-[calc(100vw-2rem)] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-lg bg-popover p-1 text-popover-foreground shadow-lg ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className), ...props }));
51
+ }
52
+ export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, };
@@ -0,0 +1,17 @@
1
+ export interface EditableDocTitleHandle {
2
+ focus: () => void;
3
+ focusEnd: () => void;
4
+ select: () => void;
5
+ }
6
+ export interface EditableDocTitleProps {
7
+ value: string;
8
+ placeholder: string;
9
+ ariaLabel: string;
10
+ onCommit: (next: string) => void;
11
+ onEnter?: () => void;
12
+ headingFont?: string;
13
+ className?: string;
14
+ dataTestId?: string;
15
+ readOnly?: boolean;
16
+ }
17
+ export declare const EditableDocTitle: import("react").ForwardRefExoticComponent<EditableDocTitleProps & import("react").RefAttributes<EditableDocTitleHandle>>;
@@ -0,0 +1,147 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useImperativeHandle, useLayoutEffect, useRef, forwardRef, } from 'react';
4
+ import { cn } from '../lib/cn.js';
5
+ import { useFlushOnHide } from '../hooks/use-flush-on-hide.js';
6
+ function fitHeightToContent(el) {
7
+ el.style.height = 'auto';
8
+ el.style.height = `${el.scrollHeight}px`;
9
+ }
10
+ function useAutosizeTextArea() {
11
+ const ref = useRef(null);
12
+ const rafRef = useRef(0);
13
+ const fit = useCallback(() => {
14
+ if (ref.current)
15
+ fitHeightToContent(ref.current);
16
+ }, []);
17
+ const scheduleFit = useCallback(() => {
18
+ if (rafRef.current)
19
+ return;
20
+ if (typeof requestAnimationFrame === 'undefined') {
21
+ fit();
22
+ return;
23
+ }
24
+ rafRef.current = requestAnimationFrame(() => {
25
+ rafRef.current = 0;
26
+ fit();
27
+ });
28
+ }, [fit]);
29
+ useLayoutEffect(() => {
30
+ fit();
31
+ }, [fit]);
32
+ useEffect(() => {
33
+ const el = ref.current;
34
+ if (!el || typeof ResizeObserver === 'undefined')
35
+ return;
36
+ let lastWidth = el.clientWidth;
37
+ const observer = new ResizeObserver((entries) => {
38
+ const width = entries[0]?.contentRect.width;
39
+ if (width === lastWidth)
40
+ return;
41
+ lastWidth = width ?? lastWidth;
42
+ fitHeightToContent(el);
43
+ });
44
+ observer.observe(el);
45
+ return () => observer.disconnect();
46
+ }, []);
47
+ useEffect(() => () => {
48
+ if (!rafRef.current)
49
+ return;
50
+ cancelAnimationFrame(rafRef.current);
51
+ rafRef.current = 0;
52
+ }, []);
53
+ return { ref, fit, scheduleFit };
54
+ }
55
+ export const EditableDocTitle = forwardRef(function EditableDocTitle({ value, placeholder, ariaLabel, onCommit, onEnter, headingFont, className, dataTestId, readOnly = false, }, ref) {
56
+ const draftRef = useRef(value);
57
+ const committedValueRef = useRef(value);
58
+ const dirtyRef = useRef(false);
59
+ const { ref: inputRef, fit, scheduleFit } = useAutosizeTextArea();
60
+ useEffect(() => {
61
+ committedValueRef.current = value;
62
+ if (dirtyRef.current)
63
+ return;
64
+ draftRef.current = value;
65
+ const input = inputRef.current;
66
+ if (!input || input.value === value)
67
+ return;
68
+ input.value = value;
69
+ fit();
70
+ }, [fit, inputRef, value]);
71
+ useEffect(() => {
72
+ if (!readOnly)
73
+ return;
74
+ dirtyRef.current = false;
75
+ draftRef.current = committedValueRef.current;
76
+ if (inputRef.current)
77
+ inputRef.current.value = committedValueRef.current;
78
+ fit();
79
+ }, [fit, inputRef, readOnly]);
80
+ useImperativeHandle(ref, () => ({
81
+ focus: () => inputRef.current?.focus(),
82
+ focusEnd: () => {
83
+ const input = inputRef.current;
84
+ if (!input)
85
+ return;
86
+ const end = input.value.length;
87
+ input.focus();
88
+ input.setSelectionRange(end, end);
89
+ },
90
+ select: () => {
91
+ inputRef.current?.focus();
92
+ inputRef.current?.select();
93
+ },
94
+ }), [inputRef]);
95
+ const reset = () => {
96
+ dirtyRef.current = false;
97
+ draftRef.current = committedValueRef.current;
98
+ if (inputRef.current)
99
+ inputRef.current.value = committedValueRef.current;
100
+ fit();
101
+ };
102
+ const commit = () => {
103
+ if (readOnly) {
104
+ reset();
105
+ return;
106
+ }
107
+ const trimmed = draftRef.current.trim();
108
+ if (!trimmed) {
109
+ reset();
110
+ return;
111
+ }
112
+ dirtyRef.current = false;
113
+ draftRef.current = trimmed;
114
+ if (inputRef.current && inputRef.current.value !== trimmed)
115
+ inputRef.current.value = trimmed;
116
+ fit();
117
+ if (trimmed !== committedValueRef.current) {
118
+ committedValueRef.current = trimmed;
119
+ onCommit(trimmed);
120
+ }
121
+ };
122
+ useFlushOnHide(() => {
123
+ if (readOnly)
124
+ return;
125
+ const trimmed = draftRef.current.trim();
126
+ if (trimmed && trimmed !== committedValueRef.current)
127
+ onCommit(trimmed);
128
+ });
129
+ return (_jsx("textarea", { ref: inputRef, rows: 1, defaultValue: value, readOnly: readOnly, onChange: (e) => {
130
+ draftRef.current = e.target.value;
131
+ dirtyRef.current = true;
132
+ scheduleFit();
133
+ }, onBlur: commit, onKeyDown: (e) => {
134
+ if (readOnly)
135
+ return;
136
+ if (e.key === 'Enter') {
137
+ e.preventDefault();
138
+ inputRef.current?.blur();
139
+ onEnter?.();
140
+ }
141
+ else if (e.key === 'Escape') {
142
+ e.preventDefault();
143
+ reset();
144
+ inputRef.current?.blur();
145
+ }
146
+ }, "aria-label": ariaLabel, placeholder: placeholder, className: cn('w-full resize-none overflow-hidden border-0 bg-transparent outline-none focus:ring-0', 'text-[28px] leading-tight tracking-tight', 'placeholder:text-muted-foreground/55', headingFont ?? 'font-semibold', className), "data-testid": dataTestId }));
147
+ });
@@ -0,0 +1,12 @@
1
+ import type { LucideIcon } from 'lucide-react';
2
+ import type { ReactNode } from 'react';
3
+ export interface EmptyStateProps {
4
+ icon?: LucideIcon;
5
+ title: string;
6
+ description?: string;
7
+ action?: ReactNode;
8
+ className?: string;
9
+ /** Spins the icon, for a state the surface is waiting on rather than one it has settled in. */
10
+ busy?: boolean;
11
+ }
12
+ export declare function EmptyState({ icon: Icon, title, description, action, className, busy, }: EmptyStateProps): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { cn } from '../lib/cn.js';
4
+ export function EmptyState({ icon: Icon, title, description, action, className, busy, }) {
5
+ return (_jsxs("div", { role: "status", className: cn('flex flex-col items-center justify-center gap-2 py-10 px-6 text-center', className), children: [Icon ? (_jsx(Icon, { className: cn('size-6 text-muted-foreground/60', busy && 'animate-spin motion-reduce:animate-none'), strokeWidth: 1.5, "aria-hidden": true })) : null, _jsx("div", { className: "text-[13px] font-medium text-foreground", children: title }), description ? (_jsx("div", { className: "text-[12px] text-muted-foreground max-w-[36ch]", children: description })) : null, action ? _jsx("div", { className: "mt-2", children: action }) : null] }));
6
+ }
@@ -0,0 +1,18 @@
1
+ import { type FilterEditorCtx, type FilterEditorLabels } from './view-query-controls.js';
2
+ import { type FilterCondition, type FilterValue } from '../lib/view-query/index.js';
3
+ export interface FilterConditionEditorProps {
4
+ condition: FilterCondition;
5
+ ctx: FilterEditorCtx;
6
+ labels: FilterEditorLabels;
7
+ onChange: (next: FilterCondition) => void;
8
+ }
9
+ /** One clause as a stacked form: the field it reads, its verb, then a value editor per kind. */
10
+ export declare function FilterConditionEditor({ condition, ctx, labels, onChange, }: FilterConditionEditorProps): React.ReactElement | null;
11
+ export interface FilterValueEditorProps {
12
+ condition: FilterCondition;
13
+ ctx: FilterEditorCtx;
14
+ labels: FilterEditorLabels;
15
+ onChange: (value: FilterValue) => void;
16
+ }
17
+ /** The value half of a clause, shaped by the field's kind and the chosen verb. */
18
+ export declare function FilterValueEditor({ condition, ctx, labels, onChange, }: FilterValueEditorProps): React.ReactElement | null;
@@ -0,0 +1,102 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { Button } from './button.js';
5
+ import { DatePickerPopover } from './date-picker.js';
6
+ import { Input } from './input.js';
7
+ import { MultiCombobox } from './multi-combobox.js';
8
+ import { PropertySelector } from './property-selector.js';
9
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './select.js';
10
+ import { filterEditorOptions, } from './view-query-controls.js';
11
+ import { defaultValueFor, } from '../lib/view-query/index.js';
12
+ import { resolveDateTimeFormat } from '../lib/date-time-format.js';
13
+ import { cn } from '../lib/cn.js';
14
+ /** One clause as a stacked form: the field it reads, its verb, then a value editor per kind. */
15
+ export function FilterConditionEditor({ condition, ctx, labels, onChange, }) {
16
+ const meta = ctx.registry.meta[condition.field];
17
+ if (!meta)
18
+ return null;
19
+ const fieldLabel = ctx.fieldLabel(condition.field);
20
+ return (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "text-foreground/80 text-[11px] font-medium", children: fieldLabel }), _jsx(FilterChoiceSelect, { value: condition.operator, options: meta.operators.map((operator) => ({
21
+ id: operator,
22
+ label: ctx.operatorLabel(operator),
23
+ })), label: fieldLabel, onChange: (next) => onChange({
24
+ ...condition,
25
+ operator: next,
26
+ value: defaultValueFor(meta, next),
27
+ }) }), _jsx(FilterValueEditor, { condition: condition, ctx: ctx, labels: labels, onChange: (value) => onChange({ ...condition, value }) })] }));
28
+ }
29
+ /** The value half of a clause, shaped by the field's kind and the chosen verb. */
30
+ export function FilterValueEditor({ condition, ctx, labels, onChange, }) {
31
+ const { operator, value } = condition;
32
+ const meta = ctx.registry.meta[condition.field];
33
+ if (!meta || operator === 'is_set' || operator === 'is_not_set')
34
+ return null;
35
+ if (meta.kind === 'text') {
36
+ return (_jsx(Input, { type: "text", value: value.kind === 'text' ? value.text : '', onChange: (event) => onChange({ kind: 'text', text: event.target.value }), placeholder: labels.valuePlaceholder, "aria-label": labels.filterValue, className: "h-7 text-[12px]" }));
37
+ }
38
+ if (meta.kind === 'number') {
39
+ const n = value.kind === 'number' ? value.n : (meta.defaultNumber ?? 0);
40
+ const scale = filterEditorOptions(ctx, condition.field);
41
+ if (scale.length === 0) {
42
+ return (_jsx(Input, { type: "number", value: n, onChange: (event) => onChange({ kind: 'number', n: Number(event.target.value) }), "aria-label": labels.filterValue, className: "h-7 text-[12px]" }));
43
+ }
44
+ return (_jsx(FilterChoiceSelect, { value: String(n), options: scale, label: labels.filterValue, onChange: (next) => onChange({ kind: 'number', n: Number(next) }) }));
45
+ }
46
+ if (meta.kind === 'boolean') {
47
+ return (_jsx(FilterChoiceSelect, { value: String(value.kind === 'boolean' ? value.value : true), options: [
48
+ { id: 'true', label: labels.booleanTrue },
49
+ { id: 'false', label: labels.booleanFalse },
50
+ ], label: labels.filterValue, onChange: (next) => onChange({ kind: 'boolean', value: next === 'true' }) }));
51
+ }
52
+ if (meta.kind === 'date') {
53
+ if (operator === 'within_next' || operator === 'within_last') {
54
+ return (_jsx(Input, { type: "number", min: 0, value: value.kind === 'relative_days' ? value.days : 7, onChange: (event) => onChange({ kind: 'relative_days', days: Math.max(0, Number(event.target.value)) }), "aria-label": labels.relativeDays, className: "h-7 text-[12px]" }));
55
+ }
56
+ if (operator === 'between') {
57
+ const range = value.kind === 'date_range' ? value : { from: null, to: null };
58
+ return (_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(FilterDateField, { value: range.from, label: labels.filterValue, format: ctx.format, onChange: (iso) => onChange({ kind: 'date_range', from: iso, to: range.to }) }), _jsx("span", { className: "text-muted-foreground text-[11px]", children: "\u2192" }), _jsx(FilterDateField, { value: range.to, label: labels.filterValue, format: ctx.format, onChange: (iso) => onChange({ kind: 'date_range', from: range.from, to: iso }) })] }));
59
+ }
60
+ return (_jsx(FilterDateField, { value: value.kind === 'date' ? value.iso : null, label: labels.filterValue, format: ctx.format, onChange: (iso) => onChange({ kind: 'date', iso }) }));
61
+ }
62
+ return (_jsx(FilterOptionPicker, { options: filterEditorOptions(ctx, condition.field), values: value.kind === 'ids' ? value.ids : [], multiple: operator === 'is_any_of' || operator === 'is_none_of', labels: labels, onChange: (ids) => onChange({ kind: 'ids', ids }) }));
63
+ }
64
+ function FilterChoiceSelect({ value, options, label, onChange, }) {
65
+ return (_jsxs(Select, { value: value, onValueChange: onChange, children: [_jsx(SelectTrigger, { size: "sm", "aria-label": label, className: "w-full text-[12px]", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: options.map((option) => (_jsx(SelectItem, { value: option.id, className: "text-[12px]", children: option.label }, option.id))) })] }));
66
+ }
67
+ const filterOptionListClass = '[&_input]:text-[12px] [&_[role=option]]:min-h-7 [&_[role=option]]:rounded-md [&_[role=option]]:px-1.5 [&_[role=option]]:py-1 [&_[role=option]]:text-[12px]';
68
+ function FilterOptionPicker({ options, values, multiple, labels, onChange, }) {
69
+ const [open, setOpen] = useState(false);
70
+ const selected = values
71
+ .map((id) => options.find((option) => option.id === id)?.label)
72
+ .filter((label) => Boolean(label));
73
+ const summary = selected.length === 0
74
+ ? labels.emptyFilterValue
75
+ : selected.length === 1
76
+ ? (selected[0] ?? labels.emptyFilterValue)
77
+ : `${selected[0]} +${selected.length - 1}`;
78
+ const trigger = (_jsx(Button, { type: "button", variant: "outline", size: "sm", "aria-label": labels.filterValue, className: "border-border/60 text-foreground/90 min-h-7 w-full justify-start px-2 text-[12px] font-normal", children: _jsx("span", { className: "truncate", children: summary }) }));
79
+ if (multiple) {
80
+ return (_jsx(MultiCombobox, { open: open, onOpenChange: setOpen, triggerAsChild: true, items: [...options], values: values, onChange: onChange, searchPlaceholder: labels.searchValues, contentClassName: cn('w-[240px]', filterOptionListClass), children: trigger }));
81
+ }
82
+ return (_jsx(PropertySelector, { open: open, onOpenChange: setOpen, items: options.map((option) => ({ ...option, selected: values[0] === option.id })), onSelect: (option) => onChange(values[0] === option.id ? [] : [option.id]), searchPlaceholder: labels.searchValues, labels: { noMatches: labels.noValues }, contentClassName: cn('w-[240px]', filterOptionListClass), "aria-label": labels.filterValue, children: trigger }));
83
+ }
84
+ function FilterDateField({ value, label, format, onChange, }) {
85
+ const day = value ? value.slice(0, 10) : null;
86
+ const civil = parseCivilDay(day);
87
+ return (_jsx(DatePickerPopover, { value: day, format: format, onSelect: (next) => onChange(next ? new Date(`${next}T00:00:00Z`).toISOString() : null), children: _jsx(Button, { type: "button", variant: "outline", size: "sm", "aria-label": label, className: "border-border/60 text-foreground/90 min-w-[96px] justify-start px-2 text-[12px] font-normal", children: civil
88
+ ? resolveDateTimeFormat(format, undefined)(civil, {
89
+ year: 'numeric',
90
+ month: 'short',
91
+ day: 'numeric',
92
+ })
93
+ : '—' }) }));
94
+ }
95
+ function parseCivilDay(day) {
96
+ if (!day)
97
+ return null;
98
+ const [year, month, date] = day.split('-').map(Number);
99
+ if (!year || !month || !date)
100
+ return null;
101
+ return new Date(year, month - 1, date);
102
+ }
@@ -0,0 +1,30 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface FormDialogLabels {
3
+ cancel: string;
4
+ close: string;
5
+ saving: string;
6
+ }
7
+ export interface FormDialogProps {
8
+ open: boolean;
9
+ onOpenChange: (open: boolean) => void;
10
+ title: string;
11
+ description?: string;
12
+ onSubmit: () => void;
13
+ submitLabel: string;
14
+ labels: FormDialogLabels;
15
+ submitting?: boolean;
16
+ canSubmit?: boolean;
17
+ /** Render a single "Close" action instead of Cancel + submit (e.g. a read-only view). */
18
+ hideSubmit?: boolean;
19
+ footerLeft?: ReactNode;
20
+ children: ReactNode;
21
+ contentClassName?: string;
22
+ 'data-testid'?: string;
23
+ }
24
+ export declare function FormDialog({ open, onOpenChange, title, description, onSubmit, submitLabel, labels, submitting, canSubmit, hideSubmit, footerLeft, children, contentClassName, 'data-testid': testId, }: FormDialogProps): import("react").JSX.Element;
25
+ export declare function FormDialogCreateMoreToggle({ checked, onCheckedChange, label, id, }: {
26
+ checked: boolean;
27
+ onCheckedChange: (next: boolean) => void;
28
+ label: string;
29
+ id?: string;
30
+ }): import("react").JSX.Element;