@lostgradient/cinder 0.3.0 → 0.4.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 (921) hide show
  1. package/CHANGELOG.md +146 -0
  2. package/README.md +2 -2
  3. package/components.json +138 -86
  4. package/dist/_internal/locale-context.d.ts +9 -0
  5. package/dist/_internal/text-direction.d.ts +4 -0
  6. package/dist/_internal/tree-context.d.ts +2 -0
  7. package/dist/api-contract.d.ts +1 -1
  8. package/dist/components/_internal/create-command-list-state.svelte.d.ts +43 -0
  9. package/dist/components/_internal/create-sliding-dialog-state.svelte.d.ts +26 -0
  10. package/dist/components/access-gate/index.js +379 -513
  11. package/dist/components/alert/alert.css +1 -1
  12. package/dist/components/alert/alert.schema.js +4 -4
  13. package/dist/components/alert/alert.types.d.ts +4 -4
  14. package/dist/components/alert/index.js +4 -4
  15. package/dist/components/alert-dialog/index.js +9 -3
  16. package/dist/components/approval-card/approval-card-state.d.ts +3 -0
  17. package/dist/components/approval-card/approval-card.css +239 -0
  18. package/dist/components/approval-card/approval-card.schema.js +236 -0
  19. package/dist/components/approval-card/approval-card.svelte.d.ts +21 -0
  20. package/dist/components/approval-card/approval-card.types.d.ts +155 -0
  21. package/dist/components/{subscription-badge/subscription-badge.variables.js → approval-card/approval-card.variables.js} +4 -4
  22. package/dist/components/approval-card/index.d.ts +5 -0
  23. package/dist/components/approval-card/index.js +3794 -0
  24. package/dist/components/autocomplete/autocomplete.css +12 -1
  25. package/dist/components/autocomplete/index.js +106 -81
  26. package/dist/components/avatar-group/index.js +3 -2
  27. package/dist/components/badge/badge.schema.js +6 -3
  28. package/dist/components/badge/badge.svelte.d.ts +4 -0
  29. package/dist/components/badge/badge.types.d.ts +18 -4
  30. package/dist/components/badge/index.d.ts +1 -1
  31. package/dist/components/badge/index.js +99 -3
  32. package/dist/components/banner/banner.schema.js +2 -2
  33. package/dist/components/banner/banner.types.d.ts +1 -1
  34. package/dist/components/banner/index.js +3 -3
  35. package/dist/components/button/button.css +1 -1
  36. package/dist/components/capability-gate/capability-gate.css +15 -2
  37. package/dist/components/capability-gate/capability-gate.schema.js +4 -4
  38. package/dist/components/capability-gate/capability-gate.types.d.ts +6 -6
  39. package/dist/components/capability-gate/index.js +7 -7
  40. package/dist/components/chat/chat.schema.js +11 -26
  41. package/dist/components/chat/chat.types.d.ts +30 -15
  42. package/dist/components/chat/container/chat-events.d.ts +2 -2
  43. package/dist/components/chat/container/chat-history-trigger.svelte.d.ts +1 -1
  44. package/dist/components/chat/container/chat.svelte.d.ts +1 -1
  45. package/dist/components/chat/container/use-chat-scroll-state.svelte.d.ts +4 -4
  46. package/dist/components/chat/container/use-chat-unread-state.svelte.d.ts +6 -6
  47. package/dist/components/chat/index.d.ts +1 -1
  48. package/dist/components/chat/index.js +2257 -1913
  49. package/dist/components/chat/input/chat-input.svelte.d.ts +3 -1
  50. package/dist/components/chat-conversation-header/index.js +261 -29
  51. package/dist/components/chat-conversation-list/chat-conversation-list.css +13 -0
  52. package/dist/components/checkbox/checkbox.css +3 -0
  53. package/dist/components/checkbox/checkbox.schema.js +6 -1
  54. package/dist/components/checkbox/checkbox.types.d.ts +2 -0
  55. package/dist/components/checkbox/index.js +78 -22
  56. package/dist/components/checkbox-group/checkbox-group.css +3 -0
  57. package/dist/components/checkbox-group/checkbox-group.schema.js +4 -4
  58. package/dist/components/checkbox-group/checkbox-group.types.d.ts +12 -7
  59. package/dist/components/checkbox-group/index.js +50 -21
  60. package/dist/components/choice-grid/index.js +2 -2
  61. package/dist/components/choice-grid-item/index.js +2 -2
  62. package/dist/components/click-away-listener/click-away-listener.schema.js +3 -3
  63. package/dist/components/click-away-listener/click-away-listener.types.d.ts +3 -3
  64. package/dist/components/click-away-listener/index.js +3 -3
  65. package/dist/components/code-block/code-block.css +4 -3
  66. package/dist/components/code-block/index.js +6 -5
  67. package/dist/components/collapsible/collapsible.schema.js +2 -2
  68. package/dist/components/collapsible/collapsible.types.d.ts +2 -2
  69. package/dist/components/collapsible/index.js +3 -3
  70. package/dist/components/color-field/color-field.schema.js +3 -3
  71. package/dist/components/color-field/color-field.types.d.ts +2 -2
  72. package/dist/components/color-field/index.js +133 -69
  73. package/dist/components/color-picker/index.js +29 -18
  74. package/dist/components/color-swatch-picker/index.js +29 -18
  75. package/dist/components/combobox/combobox.schema.js +6 -2
  76. package/dist/components/combobox/combobox.types.d.ts +7 -1
  77. package/dist/components/combobox/index.js +112 -60
  78. package/dist/components/command-item/command-item.css +10 -0
  79. package/dist/components/command-item/command-item.schema.js +9 -1
  80. package/dist/components/command-item/command-item.types.d.ts +4 -0
  81. package/dist/components/command-item/index.js +9 -1
  82. package/dist/components/command-menu/index.js +257 -161
  83. package/dist/components/command-palette/command-palette.schema.js +2 -3
  84. package/dist/components/command-palette/command-palette.types.d.ts +1 -2
  85. package/dist/components/command-palette/index.js +282 -192
  86. package/dist/components/confirm-dialog/index.js +9 -3
  87. package/dist/components/context-menu/context-menu.context.d.ts +2 -0
  88. package/dist/components/context-menu/index.js +300 -40
  89. package/dist/components/context-menu-trigger/index.js +11 -8
  90. package/dist/components/copy-button/index.js +6 -5
  91. package/dist/components/data-grid/_internal/column-model.svelte.d.ts +1 -0
  92. package/dist/components/data-grid/data-grid.css +25 -0
  93. package/dist/components/data-grid/data-grid.schema.js +3 -3
  94. package/dist/components/data-grid/data-grid.types.d.ts +8 -2
  95. package/dist/components/data-grid/index.js +11 -8
  96. package/dist/components/data-list/data-list.schema.js +7 -10
  97. package/dist/components/data-list/data-list.types.d.ts +5 -9
  98. package/dist/components/data-list/index.js +15 -39
  99. package/dist/components/data-table/data-table.css +13 -0
  100. package/dist/components/data-table/index.js +32 -19
  101. package/dist/components/date-range-field/date-range-field.schema.js +7 -3
  102. package/dist/components/date-range-field/date-range-field.svelte.d.ts +2 -2
  103. package/dist/components/date-range-field/date-range-field.types.d.ts +15 -10
  104. package/dist/components/date-range-field/index.d.ts +1 -1
  105. package/dist/components/date-range-field/index.js +160 -17
  106. package/dist/components/diff-viewer/diff-front-matter.svelte.d.ts +2 -2
  107. package/dist/components/diff-viewer/diff-line.svelte.d.ts +2 -2
  108. package/dist/components/diff-viewer/diff-toolbar.svelte.d.ts +2 -2
  109. package/dist/components/diff-viewer/diff-viewer.svelte.d.ts +1 -1
  110. package/dist/components/diff-viewer/diff-viewer.types.d.ts +3 -3
  111. package/dist/components/diff-viewer/index.d.ts +1 -1
  112. package/dist/components/diff-viewer/index.js +171 -67
  113. package/dist/components/drawer/index.js +353 -283
  114. package/dist/components/dropdown/dropdown.css +7 -1
  115. package/dist/components/dropdown/dropdown.types.d.ts +3 -0
  116. package/dist/components/dropdown/index.js +267 -35
  117. package/dist/components/dropdown-group/dropdown-group.schema.js +4 -4
  118. package/dist/components/dropdown-group/dropdown-group.types.d.ts +4 -4
  119. package/dist/components/dropdown-group/index.js +7 -7
  120. package/dist/components/dropdown-item/dropdown-item.schema.js +9 -1
  121. package/dist/components/dropdown-item/dropdown-item.types.d.ts +5 -0
  122. package/dist/components/dropdown-item/index.js +13 -8
  123. package/dist/components/dropdown-menu/index.js +236 -14
  124. package/dist/components/dropdown-trigger/index.js +11 -12
  125. package/dist/components/event-stream-viewer/event-stream-viewer-keys.d.ts +6 -0
  126. package/dist/components/event-stream-viewer/event-stream-viewer.css +46 -0
  127. package/dist/components/event-stream-viewer/event-stream-viewer.schema.js +83 -10
  128. package/dist/components/event-stream-viewer/event-stream-viewer.svelte.d.ts +3 -3
  129. package/dist/components/event-stream-viewer/event-stream-viewer.types.d.ts +124 -3
  130. package/dist/components/event-stream-viewer/index.d.ts +1 -1
  131. package/dist/components/event-stream-viewer/index.js +764 -409
  132. package/dist/components/faceted-filter-bar/faceted-filter-bar.css +9 -0
  133. package/dist/components/faceted-filter-bar/index.js +25 -6
  134. package/dist/components/file-upload/file-upload.css +5 -5
  135. package/dist/components/floating-action-button/floating-action-button.css +22 -22
  136. package/dist/components/floating-action-button/floating-action-button.schema.js +5 -5
  137. package/dist/components/floating-action-button/floating-action-button.svelte.d.ts +1 -1
  138. package/dist/components/floating-action-button/floating-action-button.types.d.ts +21 -21
  139. package/dist/components/floating-action-button/index.d.ts +1 -1
  140. package/dist/components/floating-action-button/index.js +8 -8
  141. package/dist/components/form-field/form-field.css +3 -13
  142. package/dist/components/form-field/index.js +2 -2
  143. package/dist/components/hover-card/index.js +3 -2
  144. package/dist/components/input/index.js +131 -67
  145. package/dist/components/input/input.schema.js +6 -1
  146. package/dist/components/input/input.types.d.ts +2 -0
  147. package/dist/components/invocation-rule-builder/index.d.ts +1 -1
  148. package/dist/components/invocation-rule-builder/index.js +184 -107
  149. package/dist/components/invocation-rule-builder/invocation-rule-builder.css +63 -6
  150. package/dist/components/invocation-rule-builder/invocation-rule-builder.schema.js +133 -35
  151. package/dist/components/invocation-rule-builder/invocation-rule-builder.svelte.d.ts +2 -2
  152. package/dist/components/invocation-rule-builder/invocation-rule-builder.types.d.ts +85 -8
  153. package/dist/components/json-schema-editor/form-view.svelte.d.ts +1 -0
  154. package/dist/components/json-schema-editor/index.js +677 -357
  155. package/dist/components/json-schema-editor/json-schema-editor.css +6 -1
  156. package/dist/components/json-schema-editor/json-schema-toolbar.svelte.d.ts +1 -0
  157. package/dist/components/json-schema-editor/property-editor.svelte.d.ts +2 -0
  158. package/dist/components/json-schema-editor/property-list-validation.d.ts +1 -0
  159. package/dist/components/json-schema-editor/property-list.svelte.d.ts +1 -0
  160. package/dist/components/json-viewer/_json-viewer-node.svelte.d.ts +3 -0
  161. package/dist/components/json-viewer/index.js +112 -26
  162. package/dist/components/json-viewer/json-viewer.css +11 -0
  163. package/dist/components/kanban-board/index.js +18 -13
  164. package/dist/components/kanban-board/kanban-board.css +56 -3
  165. package/dist/components/keyboard-shortcuts/index.js +2 -2
  166. package/dist/components/keyboard-shortcuts/keyboard-shortcuts.css +2 -2
  167. package/dist/components/label/index.js +2 -2
  168. package/dist/components/label/label.css +2 -9
  169. package/dist/components/load-more/index.js +4 -4
  170. package/dist/components/load-more/load-more.css +13 -5
  171. package/dist/components/load-more/load-more.schema.js +4 -4
  172. package/dist/components/load-more/load-more.types.d.ts +3 -3
  173. package/dist/components/locale-provider/index.d.ts +4 -0
  174. package/dist/components/locale-provider/index.js +76 -0
  175. package/dist/components/{connection-indicator/connection-indicator.schema.js → locale-provider/locale-provider.schema.js} +18 -14
  176. package/dist/components/locale-provider/locale-provider.svelte.d.ts +17 -0
  177. package/dist/components/locale-provider/locale-provider.types.d.ts +17 -0
  178. package/dist/components/{connection-indicator/connection-indicator.variables.js → locale-provider/locale-provider.variables.js} +4 -4
  179. package/dist/components/markdown-editor/editor-toolbar/editor-toolbar.svelte.d.ts +2 -0
  180. package/dist/components/markdown-editor/index.js +437 -128
  181. package/dist/components/markdown-editor/markdown-editor.schema.js +4 -4
  182. package/dist/components/markdown-editor/markdown-editor.types.d.ts +4 -4
  183. package/dist/components/masonry/masonry.schema.js +4 -3
  184. package/dist/components/masonry/masonry.types.d.ts +13 -2
  185. package/dist/components/matrix-chart/index.js +245 -224
  186. package/dist/components/media-controls/index.js +7 -7
  187. package/dist/components/media-controls/media-controls.css +15 -4
  188. package/dist/components/media-controls/media-controls.schema.js +4 -4
  189. package/dist/components/media-controls/media-controls.types.d.ts +7 -7
  190. package/dist/components/menu-bar/menu-bar.css +11 -0
  191. package/dist/components/menu-bar/menu-bar.svelte.d.ts +1 -0
  192. package/dist/components/modal/index.js +9 -3
  193. package/dist/components/navigation-bar/index.js +4 -4
  194. package/dist/components/navigation-bar/navigation-bar.schema.js +2 -2
  195. package/dist/components/navigation-bar/navigation-bar.types.d.ts +1 -1
  196. package/dist/components/number-input/index.js +88 -42
  197. package/dist/components/number-input/number-input.schema.js +4 -3
  198. package/dist/components/number-input/number-input.types.d.ts +16 -5
  199. package/dist/components/payload-inspector/index.d.ts +1 -1
  200. package/dist/components/payload-inspector/index.js +271 -64
  201. package/dist/components/payload-inspector/payload-inspector.css +6 -0
  202. package/dist/components/payload-inspector/payload-inspector.schema.js +27 -15
  203. package/dist/components/payload-inspector/payload-inspector.svelte.d.ts +2 -2
  204. package/dist/components/payload-inspector/payload-inspector.types.d.ts +52 -3
  205. package/dist/components/permission-matrix/permission-matrix.css +10 -0
  206. package/dist/components/phone-input/index.js +56 -33
  207. package/dist/components/phone-input/phone-input.schema.js +2 -2
  208. package/dist/components/phone-input/phone-input.types.d.ts +3 -2
  209. package/dist/components/pin-input/index.js +46 -41
  210. package/dist/components/pin-input/pin-input.schema.js +9 -2
  211. package/dist/components/pin-input/pin-input.types.d.ts +10 -1
  212. package/dist/components/popover/index.js +11 -4
  213. package/dist/components/portal/index.js +3 -2
  214. package/dist/components/pricing-card/index.js +22 -7
  215. package/dist/components/radio-group/index.js +51 -21
  216. package/dist/components/radio-group/radio-group.css +3 -0
  217. package/dist/components/radio-group/radio-group.schema.js +3 -3
  218. package/dist/components/radio-group/radio-group.types.d.ts +6 -2
  219. package/dist/components/rating/index.js +1 -6
  220. package/dist/components/rating/rating.schema.js +9 -2
  221. package/dist/components/rating/rating.types.d.ts +6 -0
  222. package/dist/components/review-editor/comment-list.svelte.d.ts +1 -1
  223. package/dist/components/review-editor/index.d.ts +1 -1
  224. package/dist/components/review-editor/index.js +789 -314
  225. package/dist/components/review-editor/review-editor-controls.svelte.d.ts +1 -1
  226. package/dist/components/review-editor/review-editor-impl.svelte.d.ts +4 -4
  227. package/dist/components/review-editor/review-editor-selection-types.d.ts +1 -1
  228. package/dist/components/review-editor/review-editor-state.svelte.d.ts +1 -1
  229. package/dist/components/review-editor/review-editor-threads.svelte.d.ts +2 -2
  230. package/dist/components/review-editor/review-editor.svelte.d.ts +2 -1
  231. package/dist/components/review-editor/review-editor.types.d.ts +77 -3
  232. package/dist/components/review-editor/thread-popover.svelte.d.ts +1 -1
  233. package/dist/components/run-step-timeline/index.d.ts +1 -1
  234. package/dist/components/run-step-timeline/index.js +747 -273
  235. package/dist/components/run-step-timeline/run-step-timeline.css +25 -5
  236. package/dist/components/run-step-timeline/run-step-timeline.schema.js +351 -21
  237. package/dist/components/run-step-timeline/run-step-timeline.svelte.d.ts +1 -1
  238. package/dist/components/run-step-timeline/run-step-timeline.types.d.ts +184 -3
  239. package/dist/components/schema-form/index.d.ts +1 -1
  240. package/dist/components/schema-form/index.js +1916 -474
  241. package/dist/components/schema-form/schema-form-async.fixture.d.ts +1 -0
  242. package/dist/components/schema-form/schema-form-body.svelte.d.ts +25 -0
  243. package/dist/components/schema-form/schema-form-model.d.ts +1 -4
  244. package/dist/components/schema-form/schema-form-validation.d.ts +1 -2
  245. package/dist/components/schema-form/schema-form.css +12 -74
  246. package/dist/components/schema-form/schema-form.schema.js +10 -3
  247. package/dist/components/schema-form/schema-form.svelte.d.ts +3 -3
  248. package/dist/components/schema-form/schema-form.types.d.ts +15 -8
  249. package/dist/components/scroll-area/index.js +3 -3
  250. package/dist/components/scroll-area/scroll-area.schema.js +2 -2
  251. package/dist/components/scroll-area/scroll-area.types.d.ts +1 -1
  252. package/dist/components/secret-value-field/index.js +10 -4
  253. package/dist/components/secret-value-field/secret-value-field.svelte.d.ts +1 -1
  254. package/dist/components/segmented-control/segmented-control.css +22 -1
  255. package/dist/components/select/index.js +37 -24
  256. package/dist/components/select/select.css +9 -2
  257. package/dist/components/selection-popover/index.js +11 -4
  258. package/dist/components/share-card/index.js +3 -4
  259. package/dist/components/share-card/share-card.css +15 -4
  260. package/dist/components/sheet/index.js +365 -300
  261. package/dist/components/shortcut-hint/index.js +3 -3
  262. package/dist/components/sidebar/index.js +423 -353
  263. package/dist/components/sidebar/sidebar.schema.js +2 -2
  264. package/dist/components/sidebar/sidebar.types.d.ts +1 -1
  265. package/dist/components/slider/index.js +211 -9
  266. package/dist/components/slider/slider.css +14 -9
  267. package/dist/components/sortable-list/sortable-list.css +1 -1
  268. package/dist/components/spectrogram/index.js +224 -203
  269. package/dist/components/spectrum-chart/index.js +208 -187
  270. package/dist/components/speed-dial/index.js +11 -11
  271. package/dist/components/speed-dial/speed-dial.css +3 -3
  272. package/dist/components/speed-dial-action/index.js +9 -9
  273. package/dist/components/stat/index.js +26 -4
  274. package/dist/components/stat/stat.schema.js +2 -2
  275. package/dist/components/stat/stat.types.d.ts +2 -2
  276. package/dist/components/stat-group/index.js +26 -4
  277. package/dist/components/stat-group/stat-group.css +1 -1
  278. package/dist/components/status-dot/index.d.ts +1 -1
  279. package/dist/components/status-dot/index.js +47 -8
  280. package/dist/components/status-dot/status-dot.css +45 -1
  281. package/dist/components/status-dot/status-dot.schema.js +12 -5
  282. package/dist/components/status-dot/status-dot.svelte.d.ts +5 -1
  283. package/dist/components/status-dot/status-dot.types.d.ts +16 -6
  284. package/dist/components/steps/steps.css +3 -3
  285. package/dist/components/table/index.js +23 -17
  286. package/dist/components/table/table.css +10 -0
  287. package/dist/components/table/table.types.d.ts +3 -3
  288. package/dist/components/table-header/index.js +5 -5
  289. package/dist/components/table-header/table-header.schema.js +3 -3
  290. package/dist/components/table-header/table-header.types.d.ts +2 -2
  291. package/dist/components/table-header-cell/index.js +11 -5
  292. package/dist/components/table-row/index.js +7 -7
  293. package/dist/components/table-row/table-row.schema.js +3 -3
  294. package/dist/components/table-row/table-row.types.d.ts +6 -6
  295. package/dist/components/tabs/index.js +17 -4
  296. package/dist/components/tabs/tabs.schema.js +6 -1
  297. package/dist/components/tabs/tabs.types.d.ts +2 -0
  298. package/dist/components/textarea/index.js +37 -24
  299. package/dist/components/textarea/textarea.css +16 -1
  300. package/dist/components/time-field/index.d.ts +5 -0
  301. package/dist/components/time-field/index.js +456 -0
  302. package/dist/components/time-field/time-field.css +60 -0
  303. package/dist/components/time-field/time-field.schema.d.ts +3 -0
  304. package/dist/components/time-field/time-field.schema.js +107 -0
  305. package/dist/components/time-field/time-field.svelte.d.ts +18 -0
  306. package/dist/components/time-field/time-field.types.d.ts +63 -0
  307. package/dist/components/time-field/time-field.variables.d.ts +2 -0
  308. package/dist/components/{experimental/connection-indicator/index.js → time-field/time-field.variables.js} +5 -14
  309. package/dist/components/toggle/index.js +39 -7
  310. package/dist/components/toggle/toggle.schema.js +11 -2
  311. package/dist/components/toggle/toggle.types.d.ts +2 -0
  312. package/dist/components/tooltip/index.js +3 -2
  313. package/dist/components/transfer-list/index.js +41 -11
  314. package/dist/components/transfer-list/transfer-list.css +22 -0
  315. package/dist/components/transfer-list/transfer-list.schema.js +2 -2
  316. package/dist/components/transfer-list/transfer-list.types.d.ts +2 -2
  317. package/dist/components/tree/index.js +238 -153
  318. package/dist/components/tree/tree.css +69 -0
  319. package/dist/components/tree/tree.schema.js +3 -3
  320. package/dist/components/tree/tree.types.d.ts +2 -2
  321. package/dist/components/tree-item/index.js +107 -68
  322. package/dist/components/tree-item/tree-item.schema.js +5 -5
  323. package/dist/components/tree-item/tree-item.types.d.ts +4 -4
  324. package/dist/components/virtual-list/index.js +98 -63
  325. package/dist/components/waveform/index.js +185 -164
  326. package/dist/editor/attach.d.ts +2 -2
  327. package/dist/editor/attach.js +10 -16
  328. package/dist/editor/editor.js +6 -6
  329. package/dist/editor/keymap-plugin.d.ts +2 -2
  330. package/dist/editor/keymap-plugin.js +4 -4
  331. package/dist/editor/types.d.ts +11 -11
  332. package/dist/index.d.ts +14 -12
  333. package/dist/index.js +106 -105
  334. package/dist/server/components/access-gate/index.js +176 -305
  335. package/dist/server/components/alert/alert.schema.js +4 -4
  336. package/dist/server/components/alert/index.css +1 -1
  337. package/dist/server/components/alert/index.js +4 -4
  338. package/dist/server/components/alert-dialog/index.js +9 -3
  339. package/dist/server/components/approval-card/approval-card.schema.js +217 -0
  340. package/dist/server/components/approval-card/approval-card.variables.js +12 -0
  341. package/dist/server/components/approval-card/index.css +1767 -0
  342. package/dist/server/components/approval-card/index.js +2499 -0
  343. package/dist/server/components/autocomplete/index.css +12 -1
  344. package/dist/server/components/autocomplete/index.js +34 -24
  345. package/dist/server/components/badge/badge.schema.js +6 -3
  346. package/dist/server/components/badge/index.js +71 -4
  347. package/dist/server/components/banner/banner.schema.js +2 -2
  348. package/dist/server/components/banner/index.js +3 -3
  349. package/dist/server/components/button/index.css +1 -1
  350. package/dist/server/components/capability-gate/capability-gate.schema.js +4 -4
  351. package/dist/server/components/capability-gate/index.css +10 -2
  352. package/dist/server/components/capability-gate/index.js +5 -5
  353. package/dist/server/components/chat/chat.schema.js +11 -26
  354. package/dist/server/components/chat/index.js +695 -438
  355. package/dist/server/components/chat-conversation-header/index.css +7 -1
  356. package/dist/server/components/chat-conversation-header/index.js +215 -17
  357. package/dist/server/components/chat-conversation-list/index.css +8 -0
  358. package/dist/server/components/checkbox/checkbox.schema.js +6 -1
  359. package/dist/server/components/checkbox/index.css +3 -0
  360. package/dist/server/components/checkbox/index.js +41 -4
  361. package/dist/server/components/checkbox-group/checkbox-group.schema.js +4 -4
  362. package/dist/server/components/checkbox-group/index.css +3 -0
  363. package/dist/server/components/checkbox-group/index.js +23 -4
  364. package/dist/server/components/choice-grid/index.js +2 -2
  365. package/dist/server/components/choice-grid-item/index.js +2 -2
  366. package/dist/server/components/click-away-listener/click-away-listener.schema.js +3 -3
  367. package/dist/server/components/click-away-listener/index.js +2 -2
  368. package/dist/server/components/code-block/index.css +4 -3
  369. package/dist/server/components/code-block/index.js +1 -6
  370. package/dist/server/components/collapsible/collapsible.schema.js +2 -2
  371. package/dist/server/components/collapsible/index.js +3 -3
  372. package/dist/server/components/color-field/color-field.schema.js +3 -3
  373. package/dist/server/components/color-field/index.js +61 -17
  374. package/dist/server/components/color-picker/index.js +29 -12
  375. package/dist/server/components/color-swatch-picker/index.js +29 -12
  376. package/dist/server/components/combobox/combobox.schema.js +6 -2
  377. package/dist/server/components/combobox/index.js +61 -12
  378. package/dist/server/components/command-item/command-item.schema.js +9 -1
  379. package/dist/server/components/command-item/index.css +1 -0
  380. package/dist/server/components/command-item/index.js +10 -2
  381. package/dist/server/components/command-menu/index.css +1 -0
  382. package/dist/server/components/command-menu/index.js +193 -102
  383. package/dist/server/components/command-palette/command-palette.schema.js +2 -3
  384. package/dist/server/components/command-palette/index.css +1 -0
  385. package/dist/server/components/command-palette/index.js +190 -106
  386. package/dist/server/components/confirm-dialog/index.js +9 -3
  387. package/dist/server/components/context-menu/index.css +7 -1
  388. package/dist/server/components/context-menu/index.js +244 -26
  389. package/dist/server/components/context-menu-trigger/index.js +7 -4
  390. package/dist/server/components/copy-button/index.js +1 -6
  391. package/dist/server/components/data-grid/data-grid.schema.js +3 -3
  392. package/dist/server/components/data-grid/index.css +23 -0
  393. package/dist/server/components/data-grid/index.js +9 -7
  394. package/dist/server/components/data-list/data-list.schema.js +7 -10
  395. package/dist/server/components/data-list/index.js +7 -21
  396. package/dist/server/components/data-table/index.css +20 -0
  397. package/dist/server/components/data-table/index.js +26 -16
  398. package/dist/server/components/date-range-field/date-range-field.schema.js +7 -3
  399. package/dist/server/components/date-range-field/index.js +146 -12
  400. package/dist/server/components/diff-viewer/index.js +79 -7
  401. package/dist/server/components/drawer/index.js +260 -193
  402. package/dist/server/components/dropdown/index.css +7 -1
  403. package/dist/server/components/dropdown/index.js +221 -23
  404. package/dist/server/components/dropdown-group/dropdown-group.schema.js +4 -4
  405. package/dist/server/components/dropdown-group/index.js +7 -7
  406. package/dist/server/components/dropdown-item/dropdown-item.schema.js +9 -1
  407. package/dist/server/components/dropdown-item/index.js +12 -7
  408. package/dist/server/components/dropdown-menu/index.js +197 -13
  409. package/dist/server/components/dropdown-trigger/index.js +5 -2
  410. package/dist/server/components/event-stream-viewer/event-stream-viewer.schema.js +83 -10
  411. package/dist/server/components/event-stream-viewer/index.css +323 -0
  412. package/dist/server/components/event-stream-viewer/index.js +406 -139
  413. package/dist/server/components/faceted-filter-bar/index.css +10 -1
  414. package/dist/server/components/faceted-filter-bar/index.js +24 -6
  415. package/dist/server/components/file-upload/index.css +3 -3
  416. package/dist/server/components/floating-action-button/floating-action-button.schema.js +5 -5
  417. package/dist/server/components/floating-action-button/index.css +16 -16
  418. package/dist/server/components/floating-action-button/index.js +5 -5
  419. package/dist/server/components/form-field/index.css +0 -10
  420. package/dist/server/components/form-field/index.js +2 -2
  421. package/dist/server/components/input/index.js +59 -15
  422. package/dist/server/components/input/input.schema.js +6 -1
  423. package/dist/server/components/invocation-rule-builder/index.css +51 -6
  424. package/dist/server/components/invocation-rule-builder/index.js +56 -17
  425. package/dist/server/components/invocation-rule-builder/invocation-rule-builder.schema.js +133 -35
  426. package/dist/server/components/json-schema-editor/index.css +4 -1
  427. package/dist/server/components/json-schema-editor/index.js +282 -52
  428. package/dist/server/components/json-viewer/index.css +7 -1
  429. package/dist/server/components/json-viewer/index.js +83 -11
  430. package/dist/server/components/kanban-board/index.css +42 -3
  431. package/dist/server/components/kanban-board/index.js +7 -6
  432. package/dist/server/components/keyboard-shortcuts/index.css +2 -2
  433. package/dist/server/components/keyboard-shortcuts/index.js +2 -2
  434. package/dist/server/components/label/index.css +0 -10
  435. package/dist/server/components/label/index.js +2 -2
  436. package/dist/server/components/load-more/index.css +12 -4
  437. package/dist/server/components/load-more/index.js +5 -5
  438. package/dist/server/components/load-more/load-more.schema.js +4 -4
  439. package/dist/server/components/locale-provider/index.js +55 -0
  440. package/dist/server/components/locale-provider/locale-provider.schema.js +35 -0
  441. package/dist/server/components/locale-provider/locale-provider.variables.js +12 -0
  442. package/dist/server/components/markdown-editor/index.js +297 -60
  443. package/dist/server/components/markdown-editor/markdown-editor.schema.js +4 -4
  444. package/dist/server/components/masonry/masonry.schema.js +4 -3
  445. package/dist/server/components/matrix-chart/index.js +62 -39
  446. package/dist/server/components/media-controls/index.css +11 -3
  447. package/dist/server/components/media-controls/index.js +7 -7
  448. package/dist/server/components/media-controls/media-controls.schema.js +4 -4
  449. package/dist/server/components/menu-bar/index.css +15 -1
  450. package/dist/server/components/modal/index.js +9 -3
  451. package/dist/server/components/navigation-bar/index.js +3 -3
  452. package/dist/server/components/navigation-bar/navigation-bar.schema.js +2 -2
  453. package/dist/server/components/number-input/index.js +56 -18
  454. package/dist/server/components/number-input/number-input.schema.js +4 -3
  455. package/dist/server/components/payload-inspector/index.css +616 -0
  456. package/dist/server/components/payload-inspector/index.js +181 -22
  457. package/dist/server/components/payload-inspector/payload-inspector.schema.js +27 -15
  458. package/dist/server/components/permission-matrix/index.css +8 -0
  459. package/dist/server/components/phone-input/index.js +21 -3
  460. package/dist/server/components/phone-input/phone-input.schema.js +2 -2
  461. package/dist/server/components/pin-input/index.js +12 -7
  462. package/dist/server/components/pin-input/pin-input.schema.js +9 -2
  463. package/dist/server/components/popover/index.js +9 -3
  464. package/dist/server/components/pricing-card/index.js +22 -7
  465. package/dist/server/components/radio-group/index.css +3 -0
  466. package/dist/server/components/radio-group/index.js +24 -3
  467. package/dist/server/components/radio-group/radio-group.schema.js +3 -3
  468. package/dist/server/components/rating/rating.schema.js +9 -2
  469. package/dist/server/components/review-editor/index.js +426 -80
  470. package/dist/server/components/run-step-timeline/index.css +503 -6
  471. package/dist/server/components/run-step-timeline/index.js +455 -109
  472. package/dist/server/components/run-step-timeline/run-step-timeline.schema.js +351 -21
  473. package/dist/server/components/schema-form/index.css +11 -69
  474. package/dist/server/components/schema-form/index.js +1291 -218
  475. package/dist/server/components/schema-form/schema-form.schema.js +10 -3
  476. package/dist/server/components/scroll-area/index.js +3 -3
  477. package/dist/server/components/scroll-area/scroll-area.schema.js +2 -2
  478. package/dist/server/components/secret-value-field/index.js +4 -4
  479. package/dist/server/components/segmented-control/index.css +15 -1
  480. package/dist/server/components/select/index.css +9 -2
  481. package/dist/server/components/select/index.js +9 -2
  482. package/dist/server/components/selection-popover/index.js +9 -3
  483. package/dist/server/components/share-card/index.css +11 -3
  484. package/dist/server/components/share-card/index.js +1 -5
  485. package/dist/server/components/sheet/index.js +265 -195
  486. package/dist/server/components/sidebar/index.js +274 -207
  487. package/dist/server/components/sidebar/sidebar.schema.js +2 -2
  488. package/dist/server/components/slider/index.css +13 -9
  489. package/dist/server/components/slider/index.js +173 -4
  490. package/dist/server/components/sortable-list/index.css +1 -1
  491. package/dist/server/components/spectrogram/index.js +68 -45
  492. package/dist/server/components/spectrum-chart/index.js +54 -31
  493. package/dist/server/components/speed-dial/index.css +3 -3
  494. package/dist/server/components/speed-dial/index.js +8 -8
  495. package/dist/server/components/speed-dial-action/index.js +6 -6
  496. package/dist/server/components/stat/index.js +26 -4
  497. package/dist/server/components/stat/stat.schema.js +2 -2
  498. package/dist/server/components/stat-group/index.css +1 -1
  499. package/dist/server/components/stat-group/index.js +26 -4
  500. package/dist/server/components/status-dot/index.css +45 -1
  501. package/dist/server/components/status-dot/index.js +35 -7
  502. package/dist/server/components/status-dot/status-dot.schema.js +12 -5
  503. package/dist/server/components/steps/index.css +3 -3
  504. package/dist/server/components/table/index.css +8 -0
  505. package/dist/server/components/table/index.js +22 -16
  506. package/dist/server/components/table-header/index.js +6 -6
  507. package/dist/server/components/table-header/table-header.schema.js +3 -3
  508. package/dist/server/components/table-header-cell/index.js +9 -3
  509. package/dist/server/components/table-row/index.js +7 -7
  510. package/dist/server/components/table-row/table-row.schema.js +3 -3
  511. package/dist/server/components/tabs/index.js +18 -4
  512. package/dist/server/components/tabs/tabs.schema.js +6 -1
  513. package/dist/server/components/textarea/index.css +16 -1
  514. package/dist/server/components/textarea/index.js +9 -2
  515. package/dist/server/components/time-field/index.css +58 -0
  516. package/dist/server/components/time-field/index.js +291 -0
  517. package/dist/server/components/time-field/time-field.schema.js +88 -0
  518. package/dist/server/components/time-field/time-field.variables.js +12 -0
  519. package/dist/server/components/toggle/index.js +40 -7
  520. package/dist/server/components/toggle/toggle.schema.js +11 -2
  521. package/dist/server/components/transfer-list/index.css +16 -0
  522. package/dist/server/components/transfer-list/index.js +37 -11
  523. package/dist/server/components/transfer-list/transfer-list.schema.js +2 -2
  524. package/dist/server/components/tree/index.css +68 -0
  525. package/dist/server/components/tree/index.js +67 -20
  526. package/dist/server/components/tree/tree.schema.js +3 -3
  527. package/dist/server/components/tree-item/index.js +34 -13
  528. package/dist/server/components/tree-item/tree-item.schema.js +5 -5
  529. package/dist/server/components/virtual-list/index.js +36 -13
  530. package/dist/server/components/waveform/index.js +51 -28
  531. package/dist/server/editor/attach.d.ts +2 -2
  532. package/dist/server/editor/attach.js +10 -16
  533. package/dist/server/editor/editor.js +6 -6
  534. package/dist/server/editor/keymap-plugin.d.ts +2 -2
  535. package/dist/server/editor/keymap-plugin.js +4 -4
  536. package/dist/server/editor/types.d.ts +11 -11
  537. package/dist/server/index.css +2033 -1463
  538. package/dist/server/index.js +7203 -5135
  539. package/dist/utilities/attachments.d.ts +6 -6
  540. package/dist/utilities/value-change.d.ts +2 -0
  541. package/package.json +96 -63
  542. package/src/_internal/locale-context.ts +21 -0
  543. package/src/_internal/text-direction.ts +213 -0
  544. package/src/_internal/tree-context.ts +2 -0
  545. package/src/components/_internal/create-command-list-state.svelte.ts +171 -0
  546. package/src/components/_internal/create-sliding-dialog-state.svelte.ts +170 -0
  547. package/src/components/_radio/README.md +1 -1
  548. package/src/components/access-gate/access-gate-inline.svelte +3 -1
  549. package/src/components/alert/README.md +8 -8
  550. package/src/components/alert/alert.css +1 -1
  551. package/src/components/alert/alert.examples.json +4 -4
  552. package/src/components/alert/alert.svelte +3 -5
  553. package/src/components/alert/alert.types.ts +4 -4
  554. package/src/components/approval-card/README.md +92 -0
  555. package/src/components/approval-card/approval-card-state.ts +24 -0
  556. package/src/components/approval-card/approval-card.css +239 -0
  557. package/src/components/approval-card/approval-card.examples.json +25 -0
  558. package/src/components/approval-card/approval-card.svelte +583 -0
  559. package/src/components/approval-card/approval-card.types.ts +180 -0
  560. package/src/components/approval-card/index.ts +16 -0
  561. package/src/components/autocomplete/autocomplete.css +12 -1
  562. package/src/components/autocomplete/autocomplete.svelte +53 -27
  563. package/src/components/badge/README.md +8 -7
  564. package/src/components/badge/badge.svelte +80 -3
  565. package/src/components/badge/badge.types.ts +36 -13
  566. package/src/components/badge/index.ts +1 -1
  567. package/src/components/banner/README.md +2 -2
  568. package/src/components/banner/banner.examples.json +19 -0
  569. package/src/components/banner/banner.svelte +2 -2
  570. package/src/components/banner/banner.types.ts +1 -1
  571. package/src/components/button/button.css +1 -1
  572. package/src/components/callout/callout.examples.json +19 -0
  573. package/src/components/capability-gate/README.md +3 -3
  574. package/src/components/capability-gate/capability-gate.css +15 -2
  575. package/src/components/capability-gate/capability-gate.examples.json +1 -1
  576. package/src/components/capability-gate/capability-gate.svelte +7 -7
  577. package/src/components/capability-gate/capability-gate.types.ts +6 -6
  578. package/src/components/chat/README.md +6 -10
  579. package/src/components/chat/chat.examples.json +8 -8
  580. package/src/components/chat/chat.types.ts +31 -15
  581. package/src/components/chat/container/chat-events.ts +2 -2
  582. package/src/components/chat/container/chat-history-trigger.svelte +9 -1
  583. package/src/components/chat/container/chat.svelte +47 -46
  584. package/src/components/chat/container/use-chat-scroll-state.svelte.ts +21 -18
  585. package/src/components/chat/container/use-chat-unread-state.svelte.ts +19 -19
  586. package/src/components/chat/index.ts +1 -1
  587. package/src/components/chat/input/chat-input.svelte +35 -13
  588. package/src/components/chat/message/image-lightbox.svelte +38 -15
  589. package/src/components/chat/message/message-attachments.svelte +1 -1
  590. package/src/components/chat/message/parts/reasoning-part.svelte +8 -0
  591. package/src/components/chat/message/parts/tool-approval-part.svelte +22 -9
  592. package/src/components/chat-conversation-list/chat-conversation-list.css +13 -0
  593. package/src/components/checkbox/README.md +1 -0
  594. package/src/components/checkbox/checkbox.css +3 -0
  595. package/src/components/checkbox/checkbox.svelte +44 -2
  596. package/src/components/checkbox/checkbox.types.ts +2 -0
  597. package/src/components/checkbox-group/README.md +2 -2
  598. package/src/components/checkbox-group/checkbox-group.css +3 -0
  599. package/src/components/checkbox-group/checkbox-group.examples.json +13 -0
  600. package/src/components/checkbox-group/checkbox-group.svelte +23 -2
  601. package/src/components/checkbox-group/checkbox-group.types.ts +12 -7
  602. package/src/components/choice-grid-item/choice-grid-item.svelte +1 -1
  603. package/src/components/click-away-listener/README.md +2 -2
  604. package/src/components/click-away-listener/click-away-listener.examples.json +1 -1
  605. package/src/components/click-away-listener/click-away-listener.svelte +2 -2
  606. package/src/components/click-away-listener/click-away-listener.types.ts +3 -3
  607. package/src/components/code-block/code-block.css +4 -3
  608. package/src/components/collapsible/README.md +2 -2
  609. package/src/components/collapsible/collapsible.svelte +2 -2
  610. package/src/components/collapsible/collapsible.types.ts +5 -2
  611. package/src/components/color-field/README.md +18 -18
  612. package/src/components/color-field/color-field.svelte +2 -2
  613. package/src/components/color-field/color-field.types.ts +2 -2
  614. package/src/components/color-swatch-picker/color-swatch-picker.examples.json +13 -0
  615. package/src/components/color-swatch-picker/color-swatch-picker.svelte +38 -24
  616. package/src/components/combobox/README.md +2 -1
  617. package/src/components/combobox/combobox.svelte +38 -17
  618. package/src/components/combobox/combobox.types.ts +7 -1
  619. package/src/components/command-item/README.md +13 -11
  620. package/src/components/command-item/command-item.css +10 -0
  621. package/src/components/command-item/command-item.svelte +11 -0
  622. package/src/components/command-item/command-item.types.ts +4 -0
  623. package/src/components/command-menu/command-menu.svelte +21 -102
  624. package/src/components/command-palette/README.md +12 -12
  625. package/src/components/command-palette/command-palette.examples.json +3 -3
  626. package/src/components/command-palette/command-palette.svelte +17 -134
  627. package/src/components/command-palette/command-palette.types.ts +1 -2
  628. package/src/components/context-menu/context-menu.context.ts +2 -0
  629. package/src/components/context-menu/context-menu.svelte +35 -9
  630. package/src/components/context-menu-trigger/context-menu-trigger.svelte +9 -6
  631. package/src/components/copy-button/copy-button.svelte +4 -3
  632. package/src/components/data-grid/README.md +3 -3
  633. package/src/components/data-grid/_internal/column-model.svelte.ts +2 -0
  634. package/src/components/data-grid/data-grid.css +25 -0
  635. package/src/components/data-grid/data-grid.svelte +7 -7
  636. package/src/components/data-grid/data-grid.types.ts +8 -2
  637. package/src/components/data-list/README.md +9 -9
  638. package/src/components/data-list/data-list.examples.json +1 -1
  639. package/src/components/data-list/data-list.svelte +3 -9
  640. package/src/components/data-list/data-list.types.ts +5 -9
  641. package/src/components/data-table/data-table.css +13 -0
  642. package/src/components/data-table/data-table.svelte +13 -3
  643. package/src/components/date-range-field/README.md +9 -8
  644. package/src/components/date-range-field/date-range-field.svelte +193 -19
  645. package/src/components/date-range-field/date-range-field.types.ts +16 -10
  646. package/src/components/date-range-field/index.ts +1 -0
  647. package/src/components/diff-viewer/diff-front-matter.svelte +2 -2
  648. package/src/components/diff-viewer/diff-line.svelte +32 -8
  649. package/src/components/diff-viewer/diff-toolbar.svelte +3 -3
  650. package/src/components/diff-viewer/diff-viewer.svelte +4 -4
  651. package/src/components/diff-viewer/diff-viewer.types.ts +3 -3
  652. package/src/components/diff-viewer/index.ts +1 -1
  653. package/src/components/drawer/drawer.svelte +26 -145
  654. package/src/components/dropdown/dropdown.css +7 -1
  655. package/src/components/dropdown/dropdown.types.ts +3 -0
  656. package/src/components/dropdown-group/README.md +6 -6
  657. package/src/components/dropdown-group/dropdown-group.svelte +8 -8
  658. package/src/components/dropdown-group/dropdown-group.types.ts +4 -4
  659. package/src/components/dropdown-item/README.md +2 -0
  660. package/src/components/dropdown-item/dropdown-item.svelte +14 -11
  661. package/src/components/dropdown-item/dropdown-item.types.ts +5 -0
  662. package/src/components/dropdown-menu/dropdown-menu.svelte +42 -9
  663. package/src/components/dropdown-trigger/dropdown-trigger.svelte +4 -6
  664. package/src/components/event-stream-viewer/README.md +38 -16
  665. package/src/components/event-stream-viewer/event-stream-viewer-keys.ts +74 -0
  666. package/src/components/event-stream-viewer/event-stream-viewer.css +46 -0
  667. package/src/components/event-stream-viewer/event-stream-viewer.examples.json +6 -0
  668. package/src/components/event-stream-viewer/event-stream-viewer.svelte +262 -69
  669. package/src/components/event-stream-viewer/event-stream-viewer.types.ts +130 -3
  670. package/src/components/event-stream-viewer/index.ts +6 -0
  671. package/src/components/faceted-filter-bar/faceted-filter-bar.css +9 -0
  672. package/src/components/faceted-filter-bar/faceted-filter-bar.svelte +31 -5
  673. package/src/components/file-upload/file-upload.css +5 -5
  674. package/src/components/file-upload/file-upload.examples.json +13 -0
  675. package/src/components/floating-action-button/README.md +9 -9
  676. package/src/components/floating-action-button/floating-action-button.css +22 -22
  677. package/src/components/floating-action-button/floating-action-button.examples.json +1 -1
  678. package/src/components/floating-action-button/floating-action-button.svelte +7 -7
  679. package/src/components/floating-action-button/floating-action-button.types.ts +21 -21
  680. package/src/components/floating-action-button/index.ts +1 -1
  681. package/src/components/form-field/form-field.css +3 -13
  682. package/src/components/form-field/form-field.svelte +4 -1
  683. package/src/components/image/image.examples.json +13 -0
  684. package/src/components/input/README.md +16 -15
  685. package/src/components/input/input.examples.json +1 -1
  686. package/src/components/input/input.svelte +65 -28
  687. package/src/components/input/input.types.ts +2 -0
  688. package/src/components/invocation-rule-builder/README.md +14 -14
  689. package/src/components/invocation-rule-builder/index.ts +1 -0
  690. package/src/components/invocation-rule-builder/invocation-rule-builder.css +63 -6
  691. package/src/components/invocation-rule-builder/invocation-rule-builder.svelte +73 -16
  692. package/src/components/invocation-rule-builder/invocation-rule-builder.types.ts +99 -8
  693. package/src/components/json-schema-editor/form-view.svelte +3 -1
  694. package/src/components/json-schema-editor/json-schema-editor-impl.svelte +30 -18
  695. package/src/components/json-schema-editor/json-schema-editor.css +6 -1
  696. package/src/components/json-schema-editor/json-schema-toolbar.svelte +6 -0
  697. package/src/components/json-schema-editor/json-view.svelte +1 -1
  698. package/src/components/json-schema-editor/property-editor.svelte +38 -2
  699. package/src/components/json-schema-editor/property-list-validation.ts +10 -0
  700. package/src/components/json-schema-editor/property-list.svelte +48 -3
  701. package/src/components/json-viewer/_json-viewer-node.svelte +55 -9
  702. package/src/components/json-viewer/json-viewer.css +11 -0
  703. package/src/components/json-viewer/json-viewer.svelte +63 -1
  704. package/src/components/kanban-board/kanban-board.css +56 -3
  705. package/src/components/kanban-board/kanban-board.svelte +10 -3
  706. package/src/components/keyboard-shortcuts/keyboard-shortcuts.css +2 -2
  707. package/src/components/keyboard-shortcuts/keyboard-shortcuts.svelte +1 -1
  708. package/src/components/label/README.md +1 -1
  709. package/src/components/label/label.css +2 -9
  710. package/src/components/label/label.svelte +4 -2
  711. package/src/components/load-more/README.md +4 -4
  712. package/src/components/load-more/load-more.css +13 -5
  713. package/src/components/load-more/load-more.examples.json +2 -2
  714. package/src/components/load-more/load-more.svelte +4 -4
  715. package/src/components/load-more/load-more.types.ts +3 -3
  716. package/src/components/locale-provider/README.md +43 -0
  717. package/src/components/locale-provider/index.ts +5 -0
  718. package/src/components/locale-provider/locale-provider.svelte +40 -0
  719. package/src/components/locale-provider/locale-provider.types.ts +21 -0
  720. package/src/components/markdown-editor/README.md +3 -3
  721. package/src/components/markdown-editor/editor-toolbar/editor-toolbar.svelte +5 -2
  722. package/src/components/markdown-editor/editor-toolbar/link-popover.svelte +13 -0
  723. package/src/components/markdown-editor/editor-toolbar/toolbar-dropdown.svelte +2 -0
  724. package/src/components/markdown-editor/markdown-editor.svelte +14 -12
  725. package/src/components/markdown-editor/markdown-editor.types.ts +4 -4
  726. package/src/components/masonry/README.md +7 -7
  727. package/src/components/masonry/masonry.types.ts +24 -2
  728. package/src/components/matrix-chart/matrix-chart.svelte +7 -21
  729. package/src/components/media-controls/README.md +3 -3
  730. package/src/components/media-controls/media-controls.css +15 -4
  731. package/src/components/media-controls/media-controls.examples.json +1 -1
  732. package/src/components/media-controls/media-controls.svelte +6 -6
  733. package/src/components/media-controls/media-controls.types.ts +10 -7
  734. package/src/components/menu-bar/menu-bar.css +11 -0
  735. package/src/components/menu-bar/menu-bar.svelte +81 -12
  736. package/src/components/navigation-bar/README.md +1 -1
  737. package/src/components/navigation-bar/navigation-bar.examples.json +1 -1
  738. package/src/components/navigation-bar/navigation-bar.svelte +2 -2
  739. package/src/components/navigation-bar/navigation-bar.types.ts +1 -1
  740. package/src/components/number-input/README.md +18 -18
  741. package/src/components/number-input/number-input.examples.json +13 -0
  742. package/src/components/number-input/number-input.svelte +77 -38
  743. package/src/components/number-input/number-input.types.ts +15 -5
  744. package/src/components/pagination/README.md +3 -1
  745. package/src/components/payload-inspector/README.md +11 -11
  746. package/src/components/payload-inspector/index.ts +2 -0
  747. package/src/components/payload-inspector/payload-inspector.css +6 -0
  748. package/src/components/payload-inspector/payload-inspector.svelte +22 -4
  749. package/src/components/payload-inspector/payload-inspector.types.ts +54 -3
  750. package/src/components/permission-matrix/permission-matrix.css +10 -0
  751. package/src/components/phone-input/README.md +1 -1
  752. package/src/components/phone-input/phone-input.svelte +7 -1
  753. package/src/components/phone-input/phone-input.types.ts +3 -2
  754. package/src/components/pin-input/README.md +19 -19
  755. package/src/components/pin-input/pin-input.svelte +16 -12
  756. package/src/components/pin-input/pin-input.types.ts +10 -1
  757. package/src/components/portal/portal.utilities.svelte.ts +4 -1
  758. package/src/components/pricing-card/pricing-card.svelte +26 -1
  759. package/src/components/radio-group/README.md +12 -12
  760. package/src/components/radio-group/radio-group.css +3 -0
  761. package/src/components/radio-group/radio-group.examples.json +3 -3
  762. package/src/components/radio-group/radio-group.svelte +22 -2
  763. package/src/components/radio-group/radio-group.types.ts +6 -2
  764. package/src/components/rating/README.md +18 -18
  765. package/src/components/rating/rating.svelte +0 -8
  766. package/src/components/rating/rating.types.ts +6 -0
  767. package/src/components/review-editor/comment-list.svelte +1 -1
  768. package/src/components/review-editor/index.ts +1 -1
  769. package/src/components/review-editor/review-editor-controls.svelte +8 -3
  770. package/src/components/review-editor/review-editor-impl.svelte +11 -7
  771. package/src/components/review-editor/review-editor-selection-types.ts +1 -1
  772. package/src/components/review-editor/review-editor-selection.svelte.ts +1 -1
  773. package/src/components/review-editor/review-editor-state.svelte.ts +1 -1
  774. package/src/components/review-editor/review-editor-threads.svelte.ts +2 -2
  775. package/src/components/review-editor/review-editor.types.ts +91 -3
  776. package/src/components/review-editor/thread-popover.svelte +1 -1
  777. package/src/components/run-step-timeline/README.md +53 -6
  778. package/src/components/run-step-timeline/index.ts +6 -0
  779. package/src/components/run-step-timeline/run-step-timeline.css +25 -5
  780. package/src/components/run-step-timeline/run-step-timeline.examples.json +3 -3
  781. package/src/components/run-step-timeline/run-step-timeline.svelte +314 -78
  782. package/src/components/run-step-timeline/run-step-timeline.types.ts +190 -3
  783. package/src/components/schema-form/README.md +9 -9
  784. package/src/components/schema-form/index.ts +0 -1
  785. package/src/components/schema-form/schema-form-async.fixture.ts +101 -0
  786. package/src/components/schema-form/schema-form-body.svelte +646 -0
  787. package/src/components/schema-form/schema-form-model.ts +4 -44
  788. package/src/components/schema-form/schema-form-validation.ts +83 -46
  789. package/src/components/schema-form/schema-form.css +12 -74
  790. package/src/components/schema-form/schema-form.examples.json +0 -6
  791. package/src/components/schema-form/schema-form.svelte +30 -598
  792. package/src/components/schema-form/schema-form.types.ts +16 -12
  793. package/src/components/scroll-area/README.md +1 -1
  794. package/src/components/scroll-area/scroll-area.examples.json +3 -3
  795. package/src/components/scroll-area/scroll-area.svelte +5 -5
  796. package/src/components/scroll-area/scroll-area.types.ts +1 -1
  797. package/src/components/secret-value-field/secret-value-field.svelte +10 -6
  798. package/src/components/segmented-control/segmented-control.css +22 -1
  799. package/src/components/segmented-control/segmented-control.examples.json +2 -2
  800. package/src/components/select/select.css +9 -2
  801. package/src/components/select/select.svelte +6 -1
  802. package/src/components/selection-popover/selection-popover.examples.json +1 -1
  803. package/src/components/share-card/share-card.css +15 -4
  804. package/src/components/share-card/share-card.svelte +2 -4
  805. package/src/components/sheet/sheet.svelte +30 -145
  806. package/src/components/shortcut-hint/shortcut-hint.svelte +1 -1
  807. package/src/components/side-navigation/side-navigation.examples.json +1 -1
  808. package/src/components/sidebar/README.md +6 -2
  809. package/src/components/sidebar/sidebar.examples.json +1 -1
  810. package/src/components/sidebar/sidebar.svelte +4 -4
  811. package/src/components/sidebar/sidebar.types.ts +1 -1
  812. package/src/components/slider/slider.css +14 -9
  813. package/src/components/slider/slider.svelte +33 -2
  814. package/src/components/sortable-list/README.md +18 -1
  815. package/src/components/sortable-list/sortable-list.css +1 -1
  816. package/src/components/sortable-list/sortable-list.examples.json +13 -0
  817. package/src/components/spectrogram/spectrogram.examples.json +1 -0
  818. package/src/components/spectrogram/spectrogram.svelte +7 -19
  819. package/src/components/spectrum-chart/spectrum-chart.svelte +8 -20
  820. package/src/components/speed-dial/speed-dial.css +3 -3
  821. package/src/components/speed-dial/speed-dial.examples.json +1 -1
  822. package/src/components/speed-dial/speed-dial.svelte +2 -2
  823. package/src/components/speed-dial-action/speed-dial-action.svelte +1 -1
  824. package/src/components/stacked-list-item/stacked-list-item.examples.json +1 -1
  825. package/src/components/stat/README.md +1 -1
  826. package/src/components/stat/stat.svelte +7 -2
  827. package/src/components/stat/stat.types.ts +2 -2
  828. package/src/components/stat-group/stat-group.css +1 -1
  829. package/src/components/status-dot/README.md +9 -7
  830. package/src/components/status-dot/index.ts +6 -1
  831. package/src/components/status-dot/status-dot.css +45 -1
  832. package/src/components/status-dot/status-dot.examples.json +1 -1
  833. package/src/components/status-dot/status-dot.svelte +57 -8
  834. package/src/components/status-dot/status-dot.types.ts +17 -6
  835. package/src/components/steps/steps.css +3 -3
  836. package/src/components/table/table.css +10 -0
  837. package/src/components/table/table.examples.json +1 -1
  838. package/src/components/table/table.svelte +2 -2
  839. package/src/components/table/table.types.ts +3 -3
  840. package/src/components/table-header/README.md +2 -2
  841. package/src/components/table-header/table-header.svelte +5 -5
  842. package/src/components/table-header/table-header.types.ts +2 -2
  843. package/src/components/table-header-cell/table-header-cell.svelte +13 -2
  844. package/src/components/table-row/README.md +2 -2
  845. package/src/components/table-row/table-row.svelte +6 -6
  846. package/src/components/table-row/table-row.types.ts +6 -6
  847. package/src/components/tabs/README.md +1 -0
  848. package/src/components/tabs/tabs.svelte +11 -3
  849. package/src/components/tabs/tabs.types.ts +2 -0
  850. package/src/components/textarea/textarea.css +16 -1
  851. package/src/components/textarea/textarea.svelte +6 -1
  852. package/src/components/time-field/README.md +60 -0
  853. package/src/components/time-field/index.ts +6 -0
  854. package/src/components/time-field/time-field.css +60 -0
  855. package/src/components/time-field/time-field.examples.json +13 -0
  856. package/src/components/time-field/time-field.svelte +277 -0
  857. package/src/components/time-field/time-field.types.ts +70 -0
  858. package/src/components/toggle/README.md +12 -11
  859. package/src/components/toggle/toggle.svelte +19 -6
  860. package/src/components/toggle/toggle.types.ts +2 -0
  861. package/src/components/transfer-list/README.md +1 -1
  862. package/src/components/transfer-list/transfer-list.css +22 -0
  863. package/src/components/transfer-list/transfer-list.svelte +44 -10
  864. package/src/components/transfer-list/transfer-list.types.ts +5 -2
  865. package/src/components/tree/README.md +2 -2
  866. package/src/components/tree/tree.css +69 -0
  867. package/src/components/tree/tree.examples.json +1 -1
  868. package/src/components/tree/tree.svelte +52 -9
  869. package/src/components/tree/tree.types.ts +2 -2
  870. package/src/components/tree-item/README.md +4 -4
  871. package/src/components/tree-item/tree-item.svelte +42 -12
  872. package/src/components/tree-item/tree-item.types.ts +4 -4
  873. package/src/components/virtual-list/virtual-list.svelte +5 -5
  874. package/src/components/waveform/waveform.svelte +7 -19
  875. package/src/index.ts +40 -16
  876. package/src/styles/components/_field-label.css +20 -0
  877. package/src/styles/components/_input-frame.css +2 -1
  878. package/src/styles/components.css +3 -2
  879. package/src/styles/index.css +1 -0
  880. package/src/styles/tokens-base.css +3 -0
  881. package/src/utilities/attachments.ts +15 -12
  882. package/src/utilities/value-change.ts +11 -0
  883. package/dist/components/connection-indicator/connection-indicator.css +0 -63
  884. package/dist/components/connection-indicator/connection-indicator.svelte.d.ts +0 -18
  885. package/dist/components/connection-indicator/connection-indicator.types.d.ts +0 -14
  886. package/dist/components/connection-indicator/index.d.ts +0 -5
  887. package/dist/components/connection-indicator/index.js +0 -75
  888. package/dist/components/experimental/connection-indicator/index.d.ts +0 -2
  889. package/dist/components/review-editor/review-editor-types.d.ts +0 -77
  890. package/dist/components/subscription-badge/index.d.ts +0 -5
  891. package/dist/components/subscription-badge/index.js +0 -353
  892. package/dist/components/subscription-badge/subscription-badge.css +0 -18
  893. package/dist/components/subscription-badge/subscription-badge.schema.js +0 -47
  894. package/dist/components/subscription-badge/subscription-badge.svelte.d.ts +0 -19
  895. package/dist/components/subscription-badge/subscription-badge.types.d.ts +0 -28
  896. package/dist/server/components/connection-indicator/connection-indicator.schema.js +0 -31
  897. package/dist/server/components/connection-indicator/connection-indicator.variables.js +0 -12
  898. package/dist/server/components/connection-indicator/index.css +0 -60
  899. package/dist/server/components/connection-indicator/index.js +0 -42
  900. package/dist/server/components/experimental/connection-indicator/index.js +0 -23
  901. package/dist/server/components/subscription-badge/index.css +0 -2
  902. package/dist/server/components/subscription-badge/index.js +0 -308
  903. package/dist/server/components/subscription-badge/subscription-badge.schema.js +0 -28
  904. package/dist/server/components/subscription-badge/subscription-badge.variables.js +0 -12
  905. package/src/components/connection-indicator/README.md +0 -41
  906. package/src/components/connection-indicator/connection-indicator.css +0 -63
  907. package/src/components/connection-indicator/connection-indicator.svelte +0 -44
  908. package/src/components/connection-indicator/connection-indicator.types.ts +0 -18
  909. package/src/components/connection-indicator/index.ts +0 -6
  910. package/src/components/experimental/connection-indicator/index.ts +0 -20
  911. package/src/components/review-editor/review-editor-types.ts +0 -92
  912. package/src/components/subscription-badge/README.md +0 -50
  913. package/src/components/subscription-badge/index.ts +0 -6
  914. package/src/components/subscription-badge/subscription-badge.css +0 -18
  915. package/src/components/subscription-badge/subscription-badge.examples.json +0 -19
  916. package/src/components/subscription-badge/subscription-badge.svelte +0 -69
  917. package/src/components/subscription-badge/subscription-badge.types.ts +0 -37
  918. /package/dist/components/{connection-indicator/connection-indicator.schema.d.ts → approval-card/approval-card.schema.d.ts} +0 -0
  919. /package/dist/components/{connection-indicator/connection-indicator.variables.d.ts → approval-card/approval-card.variables.d.ts} +0 -0
  920. /package/dist/components/{subscription-badge/subscription-badge.schema.d.ts → locale-provider/locale-provider.schema.d.ts} +0 -0
  921. /package/dist/components/{subscription-badge/subscription-badge.variables.d.ts → locale-provider/locale-provider.variables.d.ts} +0 -0
@@ -29,12 +29,8 @@
29
29
 
30
30
  import { createAnchoredOverlay } from '../../_internal/anchored-overlay.svelte.ts';
31
31
  import { classNames } from '../../utilities/class-names.ts';
32
- import { inDocumentOrder } from '../../utilities/document-order.ts';
33
- import {
34
- setCommandListContext,
35
- type CommandItemRegistrationInput,
36
- type CommandListContext,
37
- } from '../_internal/command-list-context.ts';
32
+ import { setCommandListContext } from '../_internal/command-list-context.ts';
33
+ import { createCommandListState } from '../_internal/create-command-list-state.svelte.ts';
38
34
  import { createPortalAttachment } from '../portal/index.ts';
39
35
 
40
36
  const listboxId = $props.id();
@@ -55,7 +51,6 @@
55
51
  class: className,
56
52
  }: CommandMenuProps = $props();
57
53
 
58
- type RegistrationRecord = CommandItemRegistrationInput & { id: string; node: HTMLElement };
59
54
  const portalAttachment = createPortalAttachment({
60
55
  target: () => document.body,
61
56
  inheritAttributes: true,
@@ -64,19 +59,11 @@
64
59
 
65
60
  let mounted = $state(false);
66
61
  let listElement: HTMLElement | undefined = $state();
67
- let registrations = $state<RegistrationRecord[]>([]);
68
- let activeItemId = $state<string | null>(null);
69
- let itemCounter = 0;
70
- let registrationsReady = $state(false);
71
- let readyCycle = 0;
62
+ const commandList = createCommandListState(listboxId);
72
63
 
73
- const enabledIds = $derived.by(() => {
74
- return inDocumentOrder(registrations)
75
- .filter((registration) => !registration.getDisabled())
76
- .map((registration) => registration.id);
77
- });
78
-
79
- const showEmpty = $derived(mounted && open && registrationsReady && registrations.length === 0);
64
+ const showEmpty = $derived(
65
+ mounted && open && commandList.registrationsReady && commandList.registrations.length === 0,
66
+ );
80
67
  const caretAnchor = $derived.by<VirtualElement | null>(() => {
81
68
  const anchorElement = anchor;
82
69
  const currentCaretIndex = caretIndex;
@@ -104,76 +91,34 @@
104
91
  });
105
92
 
106
93
  $effect(() => {
107
- const ids = enabledIds;
108
94
  if (!open) {
109
- activeItemId = null;
95
+ commandList.resetActiveItem();
110
96
  return;
111
97
  }
112
- if (activeItemId !== null && ids.includes(activeItemId)) return;
113
- activeItemId = ids[0] ?? null;
114
98
  });
115
99
 
116
100
  $effect(() => {
117
101
  void query;
118
- registrationsReady = false;
119
- const cycle = ++readyCycle;
120
- queueMicrotask(() => {
121
- if (cycle === readyCycle) registrationsReady = true;
122
- });
102
+ commandList.refreshRegistrationsReady();
123
103
  });
124
104
 
125
105
  $effect(() => {
126
- onstatechange?.({ listboxId, activeItemId: open ? activeItemId : null });
106
+ onstatechange?.({ listboxId, activeItemId: open ? commandList.activeItemId : null });
127
107
  });
128
108
 
129
109
  $effect(() => {
130
- if (activeItemId === null) return;
131
- document.getElementById(activeItemId)?.scrollIntoView({ block: 'nearest' });
110
+ commandList.scrollActiveItemIntoView();
132
111
  });
133
112
 
134
113
  function activateItemById(id: string) {
135
- const record = registrations.find((registration) => registration.id === id);
136
- if (!record || record.getDisabled()) return;
137
- // Fire the per-item `onselect` callback first (matching command-palette's
138
- // shared-context contract), then the menu-level `onselect` prop. Without the
139
- // first call, an item's own onselect is silently dropped on activation.
140
- record.getOnselect()();
114
+ const record = commandList.activateItemById(id);
115
+ if (!record) return;
116
+ // The command list activates the item callback first; the menu-level
117
+ // `onselect` prop then receives the committed value and query.
141
118
  onselect?.({ value: record.getValue(), query });
142
119
  }
143
120
 
144
- const context: CommandListContext = {
145
- get listboxId() {
146
- return listboxId;
147
- },
148
- get activeItemId() {
149
- return activeItemId;
150
- },
151
- register(input: CommandItemRegistrationInput, node: HTMLElement) {
152
- const id = `${listboxId}-item-${++itemCounter}`;
153
- registrations = [
154
- ...registrations,
155
- {
156
- id,
157
- node,
158
- getValue: input.getValue,
159
- getOnselect: input.getOnselect,
160
- getDisabled: input.getDisabled,
161
- },
162
- ];
163
- return {
164
- id,
165
- unregister: () => {
166
- registrations = registrations.filter((registration) => registration.id !== id);
167
- },
168
- };
169
- },
170
- setActiveById(id: string) {
171
- activeItemId = id;
172
- },
173
- activateItemById,
174
- };
175
-
176
- setCommandListContext(context);
121
+ setCommandListContext(commandList.createContext(activateItemById));
177
122
 
178
123
  function dismiss() {
179
124
  if (!open) return;
@@ -183,38 +128,12 @@
183
128
 
184
129
  function handleKeydown(event: KeyboardEvent) {
185
130
  if (!open) return;
186
- if (event.isComposing || event.keyCode === 229) return;
187
- const ids = enabledIds;
188
-
189
- if (event.key === 'ArrowDown') {
190
- if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;
191
- event.preventDefault();
192
- if (ids.length === 0) return;
193
- const index = activeItemId === null ? -1 : ids.indexOf(activeItemId);
194
- activeItemId = ids[(index + 1) % ids.length] ?? null;
195
- } else if (event.key === 'ArrowUp') {
196
- if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;
197
- event.preventDefault();
198
- if (ids.length === 0) return;
199
- const index = activeItemId === null ? 0 : ids.indexOf(activeItemId);
200
- activeItemId = ids[index <= 0 ? ids.length - 1 : index - 1] ?? null;
201
- } else if (event.key === 'Home') {
202
- if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;
203
- event.preventDefault();
204
- activeItemId = ids[0] ?? null;
205
- } else if (event.key === 'End') {
206
- if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;
207
- event.preventDefault();
208
- activeItemId = ids[ids.length - 1] ?? null;
209
- } else if (event.key === 'Enter' && activeItemId !== null) {
210
- event.preventDefault();
211
- event.stopPropagation();
212
- activateItemById(activeItemId);
213
- } else if (event.key === 'Escape') {
214
- event.preventDefault();
215
- event.stopPropagation();
216
- dismiss();
217
- }
131
+ commandList.handleKeydown({
132
+ event,
133
+ onEnter: activateItemById,
134
+ onEscape: dismiss,
135
+ ignoreModifiedNavigation: true,
136
+ });
218
137
  }
219
138
 
220
139
  function handleDocumentPointerdown(event: PointerEvent) {
@@ -34,18 +34,18 @@ Command items register with the palette by DOM node, so grouped results can use
34
34
 
35
35
  <!-- generated:props:start -->
36
36
 
37
- | Prop | Type | Required | Default | Description |
38
- | ------------- | ---------- | -------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
39
- | `class` | `string` | no | — | Class merged onto the palette panel. |
40
- | `label` | `string` | no | — | Accessible name for the dialog, wired via `aria-label`. |
41
- | `open` | `boolean` | yes | — | Bindable open state. The component mutates `open = false` on Escape, backdrop click, or any explicit close path, then fires `onclose`. |
42
- | `placeholder` | `string` | no | — | Placeholder rendered inside the search input. |
43
- | `query` | `string` | no | — | Bindable search query. Mutated by the input's oninput handler. Exposed to the items snippet so consumers can filter. Note: query is NOT reset on close — consumers who want a fresh query on each open should reset it in their `onclose` callback. |
44
- | `empty` | `(opaque)` | no | — | Rendered when zero items are registered after filtering. Not expressible in JSON Schema; see the component types for the signature. |
45
- | `footer` | `(opaque)` | no | — | Optional footer, e.g. for keybinding hints. Not part of the listbox. Not expressible in JSON Schema; see the component types for the signature. |
46
- | `items` | `(opaque)` | yes | — | Receives the current query so consumers can filter. Not expressible in JSON Schema; see the component types for the signature. |
47
- | `onclose` | `(opaque)` | no | — | Fired after any close path routed through the palette close lifecycle. Not expressible in JSON Schema; see the component types for the signature. |
48
- | `triggerRef` | `(opaque)` | no | — | Element to restore focus to on close. Falls back to `captureFocus()`. Not expressible in JSON Schema; see the component types for the signature. |
37
+ | Prop | Type | Required | Default | Description |
38
+ | ------------- | ---------- | -------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
39
+ | `class` | `string` | no | — | Class merged onto the palette panel. |
40
+ | `label` | `string` | no | — | Accessible name for the dialog, wired via `aria-label`. |
41
+ | `open` | `boolean` | yes | — | Bindable open state. The component mutates `open = false` on Escape, backdrop click, or any explicit close path, then fires `onclose`. |
42
+ | `placeholder` | `string` | no | — | Placeholder rendered inside the search input. |
43
+ | `query` | `string` | no | — | Bindable search query. Mutated by the input's oninput handler. Exposed to the items snippet so consumers can filter. Reset to an empty string each time the palette opens. |
44
+ | `empty` | `(opaque)` | no | — | Rendered when zero items are registered after filtering. Not expressible in JSON Schema; see the component types for the signature. |
45
+ | `footer` | `(opaque)` | no | — | Optional footer, e.g. for keybinding hints. Not part of the listbox. Not expressible in JSON Schema; see the component types for the signature. |
46
+ | `items` | `(opaque)` | yes | — | Receives the current query so consumers can filter. Not expressible in JSON Schema; see the component types for the signature. |
47
+ | `onclose` | `(opaque)` | no | — | Fired after any close path routed through the palette close lifecycle. Not expressible in JSON Schema; see the component types for the signature. |
48
+ | `triggerRef` | `(opaque)` | no | — | Element to restore focus to on close. Falls back to `captureFocus()`. Not expressible in JSON Schema; see the component types for the signature. |
49
49
 
50
50
  <!-- generated:props:end -->
51
51
 
@@ -7,19 +7,19 @@
7
7
  "id": "basic",
8
8
  "title": "Basic command palette",
9
9
  "description": "A minimal palette with three items opened by a button.",
10
- "code": "<script lang=\"ts\">\n import { Button } from '@lostgradient/cinder/button';\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n\n let open = $state(false);\n let triggerRef: HTMLElement | null = $state(null);\n let lastSelected = $state('');\n\n const commands = [\n { value: 'new-file', label: 'New file' },\n { value: 'open-settings', label: 'Open settings' },\n { value: 'sign-out', label: 'Sign out' },\n ];\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n</script>\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <Button\n label=\"Open palette\"\n onclick={(event) => {\n triggerRef = event.currentTarget as HTMLElement;\n open = true;\n }}\n />\n\n {#if lastSelected}\n <p style=\"font-size: 0.875rem; color: var(--cinder-text-muted);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open label=\"Basic palette\" {triggerRef}>\n {#snippet items({ query })}\n {@const filteredCommands = commands.filter((command) =>\n command.label.toLowerCase().includes(query.toLowerCase()),\n )}\n {#each filteredCommands as command (command.value)}\n <CommandItem value={command.value} onselect={() => select(command.label)}>\n {command.label}\n </CommandItem>\n {/each}\n {/snippet}\n\n {#snippet empty()}\n No commands found.\n {/snippet}\n</CommandPalette>\n"
10
+ "code": "<script lang=\"ts\">\n import { Button } from '@lostgradient/cinder/button';\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n\n let open = $state(false);\n let triggerRef: HTMLElement | null = $state(null);\n let lastSelected = $state('');\n\n const commands = [\n { value: 'new-file', label: 'New file' },\n { value: 'open-settings', label: 'Open settings' },\n { value: 'sign-out', label: 'Sign out' },\n ];\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n</script>\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <Button\n label=\"Open palette\"\n onclick={(event) => {\n triggerRef = event.currentTarget as HTMLElement;\n open = true;\n }}\n />\n\n {#if lastSelected}\n <p style=\"font-size: 0.875rem; color: var(--cinder-text-muted);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open label=\"Basic palette\" {triggerRef}>\n {#snippet items({ query })}\n {@const filteredCommands = commands.filter((command) =>\n command.label.toLowerCase().includes(query.toLowerCase()),\n )}\n {#each filteredCommands as command (command.value)}\n <CommandItem\n value={command.value}\n accessibleLabel={command.label}\n onselect={() => select(command.label)}\n >\n {command.label}\n </CommandItem>\n {/each}\n {/snippet}\n\n {#snippet empty()}\n No commands found.\n {/snippet}\n</CommandPalette>\n"
11
11
  },
12
12
  {
13
13
  "id": "grouped",
14
14
  "title": "Grouped command palette",
15
15
  "description": "Command items grouped with named listbox sections.",
16
- "code": "<script lang=\"ts\">\n import { Button } from '@lostgradient/cinder/button';\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n\n let open = $state(false);\n let triggerRef: HTMLElement | null = $state(null);\n let lastSelected = $state('');\n\n const recentItems = [\n { id: 'roadmap', label: 'Roadmap' },\n { id: 'release-notes', label: 'Release notes' },\n ];\n\n const actions = [\n { id: 'new-project', label: 'New project', description: 'Create a workspace project.' },\n { id: 'invite-teammate', label: 'Invite teammate', description: 'Add a collaborator.' },\n { id: 'open-settings', label: 'Open settings', description: 'Manage preferences.' },\n ];\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n\n function matchesQuery(label: string, query: string): boolean {\n return label.toLowerCase().includes(query.toLowerCase());\n }\n</script>\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <Button\n label=\"Open palette\"\n onclick={(event) => {\n triggerRef = event.currentTarget as HTMLElement;\n open = true;\n }}\n />\n\n {#if lastSelected}\n <p style=\"margin: 0; color: var(--cinder-text-muted); font-size: var(--cinder-text-sm);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open label=\"Grouped command palette\" {triggerRef}>\n {#snippet items({ query })}\n {@const filteredRecentItems = recentItems.filter((item) => matchesQuery(item.label, query))}\n {@const filteredActions = actions.filter((action) => matchesQuery(action.label, query))}\n\n {#if filteredRecentItems.length > 0}\n <li role=\"presentation\" class=\"cinder-command-group\">\n <span class=\"cinder-command-group__label\">Recent files</span>\n <ul role=\"group\" aria-label=\"Recent files\">\n {#each filteredRecentItems as item (item.id)}\n <CommandItem value={item.id} onselect={() => select(item.label)}>\n {item.label}\n </CommandItem>\n {/each}\n </ul>\n </li>\n {/if}\n\n {#if filteredActions.length > 0}\n <li role=\"presentation\" class=\"cinder-command-group\">\n <span class=\"cinder-command-group__label\">Actions</span>\n <ul role=\"group\" aria-label=\"Actions\">\n {#each filteredActions as action (action.id)}\n <CommandItem\n value={action.id}\n description={action.description}\n onselect={() => select(action.label)}\n >\n {action.label}\n </CommandItem>\n {/each}\n </ul>\n </li>\n {/if}\n {/snippet}\n\n {#snippet empty()}\n No commands found.\n {/snippet}\n</CommandPalette>\n"
16
+ "code": "<script lang=\"ts\">\n import { Button } from '@lostgradient/cinder/button';\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n\n let open = $state(false);\n let triggerRef: HTMLElement | null = $state(null);\n let lastSelected = $state('');\n\n const recentItems = [\n { id: 'roadmap', label: 'Roadmap' },\n { id: 'release-notes', label: 'Release notes' },\n ];\n\n const actions = [\n { id: 'new-project', label: 'New project', description: 'Create a workspace project.' },\n { id: 'invite-teammate', label: 'Invite teammate', description: 'Add a collaborator.' },\n { id: 'open-settings', label: 'Open settings', description: 'Manage preferences.' },\n ];\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n\n function matchesQuery(label: string, query: string): boolean {\n return label.toLowerCase().includes(query.toLowerCase());\n }\n</script>\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <Button\n label=\"Open palette\"\n onclick={(event) => {\n triggerRef = event.currentTarget as HTMLElement;\n open = true;\n }}\n />\n\n {#if lastSelected}\n <p style=\"margin: 0; color: var(--cinder-text-muted); font-size: var(--cinder-text-sm);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open label=\"Grouped command palette\" {triggerRef}>\n {#snippet items({ query })}\n {@const filteredRecentItems = recentItems.filter((item) => matchesQuery(item.label, query))}\n {@const filteredActions = actions.filter((action) => matchesQuery(action.label, query))}\n\n {#if filteredRecentItems.length > 0}\n <li role=\"presentation\" class=\"cinder-command-group\">\n <span id=\"recent-files-heading\" class=\"cinder-command-group__label\">Recent files</span>\n <ul role=\"group\" aria-labelledby=\"recent-files-heading\">\n {#each filteredRecentItems as item (item.id)}\n <CommandItem\n value={item.id}\n accessibleLabel={item.label}\n onselect={() => select(item.label)}\n >\n {item.label}\n </CommandItem>\n {/each}\n </ul>\n </li>\n {/if}\n\n {#if filteredActions.length > 0}\n <li role=\"presentation\" class=\"cinder-command-group\">\n <span id=\"actions-heading\" class=\"cinder-command-group__label\">Actions</span>\n <ul role=\"group\" aria-labelledby=\"actions-heading\">\n {#each filteredActions as action (action.id)}\n <CommandItem\n value={action.id}\n description={action.description}\n accessibleLabel={action.label}\n onselect={() => select(action.label)}\n >\n {action.label}\n </CommandItem>\n {/each}\n </ul>\n </li>\n {/if}\n {/snippet}\n\n {#snippet empty()}\n No commands found.\n {/snippet}\n</CommandPalette>\n"
17
17
  },
18
18
  {
19
19
  "id": "search-recent-actions",
20
20
  "title": "Search, recent, and keyed actions",
21
21
  "description": "Cmd+K opens the palette. Three sections: filtered search results, recent items, and keyed actions separated by visual group headers.",
22
- "code": "<script lang=\"ts\">\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n // ── State ──────────────────────────────────────────────────────────────\n let open = $state(false);\n let query = $state('');\n let lastSelected = $state('');\n let triggerRef: HTMLElement | null = $state(null);\n\n // ── Data ──────────────────────────────────────────────────────────────\n const allPages = [\n { id: 'dashboard', label: 'Dashboard', description: 'View product and team metrics.' },\n { id: 'settings', label: 'Settings', description: 'Manage workspace preferences.' },\n { id: 'billing', label: 'Billing', description: 'Review invoices and payment methods.' },\n { id: 'team', label: 'Team members', description: 'Invite or remove collaborators.' },\n { id: 'api-keys', label: 'API keys', description: 'Create and rotate access tokens.' },\n { id: 'integrations', label: 'Integrations', description: 'Connect external services.' },\n ];\n\n const recentItems = [\n { id: 'recent-dashboard', label: 'Dashboard' },\n { id: 'recent-billing', label: 'Billing' },\n ];\n\n const actions = [\n {\n id: 'action-new-project',\n label: 'New project',\n description: 'Create a blank project for a new body of work.',\n icon: '+',\n kbd: '⌘N',\n },\n {\n id: 'action-invite',\n label: 'Invite teammate',\n description: 'Send an invitation to join this workspace.',\n icon: '@',\n kbd: '⌘I',\n },\n {\n id: 'action-sign-out',\n label: 'Sign out',\n description: 'End this browser session.',\n icon: '↪',\n kbd: '',\n },\n ];\n\n // ── Filtering ──────────────────────────────────────────────────────────\n const filteredPages = $derived(\n query ? allPages.filter((p) => p.label.toLowerCase().includes(query.toLowerCase())) : [],\n );\n\n const filteredActions = $derived(\n query ? actions.filter((a) => a.label.toLowerCase().includes(query.toLowerCase())) : actions,\n );\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n\n // ── Cmd+K / Ctrl+K listener ────────────────────────────────────────────\n function handleGlobalKeydown(event: KeyboardEvent) {\n if ((event.metaKey || event.ctrlKey) && event.key === 'k') {\n event.preventDefault();\n open = true;\n }\n }\n</script>\n\n<svelte:window onkeydown={handleGlobalKeydown} />\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <button\n bind:this={triggerRef}\n type=\"button\"\n onclick={() => (open = true)}\n style=\"\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n border: 1px solid var(--cinder-border);\n border-radius: var(--cinder-radius-md);\n background: var(--cinder-surface);\n color: var(--cinder-text-muted);\n font-size: 0.875rem;\n cursor: pointer;\n \"\n >\n Search…\n <kbd style=\"font-size: 0.75rem; opacity: 0.7;\">⌘K</kbd>\n </button>\n\n {#if lastSelected}\n <p style=\"font-size: 0.875rem; color: var(--cinder-text-muted);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open bind:query label=\"Command palette\" {triggerRef}>\n {#snippet items({ query: paletteQuery })}\n {@const headerBase =\n 'font-size: 0.6875rem; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase; color: var(--cinder-text-muted); pointer-events: none;'}\n {@const headerFirst = 'padding: 0.625rem 1.25rem 0.375rem;'}\n {@const headerWithDivider =\n 'padding: 0.625rem 1.25rem 0.375rem 1.25rem; padding-block-start: 0.625rem; margin-block-start: 0.25rem; border-block-start: 1px solid var(--cinder-border);'}\n {@const showPages = filteredPages.length > 0}\n {@const showRecent = !paletteQuery}\n {@const showActions = filteredActions.length > 0}\n <!--\n Search results section — only shown while typing.\n `paletteQuery` comes from the snippet parameter and mirrors CommandPalette's query.\n using the snippet parameter keeps the pattern explicit for consumers.\n -->\n {#if showPages}\n <li role=\"none\" style=\"{headerBase} {headerFirst}\">Pages</li>\n {#each filteredPages as page (page.id)}\n <CommandItem\n value={page.id}\n description={page.description}\n onselect={() => select(page.label)}\n >\n {page.label}\n </CommandItem>\n {/each}\n {/if}\n\n <!--\n Recent section — shown only when query is empty.\n Uses `role=\"none\"` for the group label (purely visual; children remain in the AT).\n -->\n {#if showRecent}\n <li role=\"none\" style=\"{headerBase} {showPages ? headerWithDivider : headerFirst}\">Recent</li>\n {#each recentItems as item (item.id)}\n <CommandItem value={item.id} onselect={() => select(item.label)}>\n {item.label}\n </CommandItem>\n {/each}\n {/if}\n\n <!--\n Actions section — always visible (filtered when typing).\n -->\n {#if showActions}\n <li\n role=\"none\"\n style=\"{headerBase} {showPages || showRecent ? headerWithDivider : headerFirst}\"\n >\n Actions\n </li>\n {#each filteredActions as action (action.id)}\n <CommandItem\n value={action.id}\n description={action.description}\n onselect={() => select(action.label)}\n >\n {#snippet leading()}\n <span style=\"font-size: 0.875rem; font-weight: 700; line-height: 1;\">{action.icon}</span\n >\n {/snippet}\n {action.label}\n {#snippet trailing()}\n {#if action.kbd}\n <kbd>{action.kbd}</kbd>\n {/if}\n {/snippet}\n </CommandItem>\n {/each}\n {/if}\n {/snippet}\n\n {#snippet empty()}\n No results for \"<strong>{query}</strong>\".\n {/snippet}\n\n {#snippet footer()}\n <span>\n <kbd>↑↓</kbd> navigate &nbsp; <kbd>↵</kbd> select &nbsp; <kbd>Esc</kbd> close\n </span>\n {/snippet}\n</CommandPalette>\n"
22
+ "code": "<script lang=\"ts\">\n import { CommandItem } from '@lostgradient/cinder/command-item';\n import { CommandPalette } from '@lostgradient/cinder/command-palette';\n // ── State ──────────────────────────────────────────────────────────────\n let open = $state(false);\n let query = $state('');\n let lastSelected = $state('');\n let triggerRef: HTMLElement | null = $state(null);\n\n // ── Data ──────────────────────────────────────────────────────────────\n const allPages = [\n { id: 'dashboard', label: 'Dashboard', description: 'View product and team metrics.' },\n { id: 'settings', label: 'Settings', description: 'Manage workspace preferences.' },\n { id: 'billing', label: 'Billing', description: 'Review invoices and payment methods.' },\n { id: 'team', label: 'Team members', description: 'Invite or remove collaborators.' },\n { id: 'api-keys', label: 'API keys', description: 'Create and rotate access tokens.' },\n { id: 'integrations', label: 'Integrations', description: 'Connect external services.' },\n ];\n\n const recentItems = [\n { id: 'recent-dashboard', label: 'Dashboard' },\n { id: 'recent-billing', label: 'Billing' },\n ];\n\n const actions = [\n {\n id: 'action-new-project',\n label: 'New project',\n description: 'Create a blank project for a new body of work.',\n icon: '+',\n kbd: '⌘N',\n },\n {\n id: 'action-invite',\n label: 'Invite teammate',\n description: 'Send an invitation to join this workspace.',\n icon: '@',\n kbd: '⌘I',\n },\n {\n id: 'action-sign-out',\n label: 'Sign out',\n description: 'End this browser session.',\n icon: '↪',\n kbd: '',\n },\n ];\n\n // ── Filtering ──────────────────────────────────────────────────────────\n const filteredPages = $derived(\n query ? allPages.filter((p) => p.label.toLowerCase().includes(query.toLowerCase())) : [],\n );\n\n const filteredActions = $derived(\n query ? actions.filter((a) => a.label.toLowerCase().includes(query.toLowerCase())) : actions,\n );\n\n function select(label: string) {\n lastSelected = label;\n open = false;\n }\n\n // ── Cmd+K / Ctrl+K listener ────────────────────────────────────────────\n function handleGlobalKeydown(event: KeyboardEvent) {\n if ((event.metaKey || event.ctrlKey) && event.key === 'k') {\n event.preventDefault();\n open = true;\n }\n }\n</script>\n\n<svelte:window onkeydown={handleGlobalKeydown} />\n\n<div style=\"display: flex; flex-direction: column; gap: 1rem; align-items: flex-start;\">\n <button\n bind:this={triggerRef}\n type=\"button\"\n onclick={() => (open = true)}\n style=\"\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem 0.75rem;\n border: 1px solid var(--cinder-border);\n border-radius: var(--cinder-radius-md);\n background: var(--cinder-surface);\n color: var(--cinder-text-muted);\n font-size: 0.875rem;\n cursor: pointer;\n \"\n >\n Search…\n <kbd style=\"font-size: 0.75rem; opacity: 0.7;\">⌘K</kbd>\n </button>\n\n {#if lastSelected}\n <p style=\"font-size: 0.875rem; color: var(--cinder-text-muted);\">\n Selected: <strong>{lastSelected}</strong>\n </p>\n {/if}\n</div>\n\n<CommandPalette bind:open bind:query label=\"Command palette\" {triggerRef}>\n {#snippet items({ query: paletteQuery })}\n {@const headerBase =\n 'font-size: 0.6875rem; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase; color: var(--cinder-text-muted); pointer-events: none;'}\n {@const headerFirst = 'padding: 0.625rem 1.25rem 0.375rem;'}\n {@const headerWithDivider =\n 'padding: 0.625rem 1.25rem 0.375rem 1.25rem; padding-block-start: 0.625rem; margin-block-start: 0.25rem; border-block-start: 1px solid var(--cinder-border);'}\n {@const showPages = filteredPages.length > 0}\n {@const showRecent = !paletteQuery}\n {@const showActions = filteredActions.length > 0}\n <!--\n Search results section — only shown while typing.\n `paletteQuery` comes from the snippet parameter and mirrors CommandPalette's query.\n using the snippet parameter keeps the pattern explicit for consumers.\n -->\n {#if showPages}\n <li role=\"none\" style=\"{headerBase} {headerFirst}\">Pages</li>\n {#each filteredPages as page (page.id)}\n <CommandItem\n value={page.id}\n description={page.description}\n accessibleLabel={page.label}\n onselect={() => select(page.label)}\n >\n {page.label}\n </CommandItem>\n {/each}\n {/if}\n\n <!--\n Recent section — shown only when query is empty.\n Uses `role=\"none\"` for the group label (purely visual; children remain in the AT).\n -->\n {#if showRecent}\n <li role=\"none\" style=\"{headerBase} {showPages ? headerWithDivider : headerFirst}\">Recent</li>\n {#each recentItems as item (item.id)}\n <CommandItem\n value={item.id}\n accessibleLabel={item.label}\n onselect={() => select(item.label)}\n >\n {item.label}\n </CommandItem>\n {/each}\n {/if}\n\n <!--\n Actions section — always visible (filtered when typing).\n -->\n {#if showActions}\n <li\n role=\"none\"\n style=\"{headerBase} {showPages || showRecent ? headerWithDivider : headerFirst}\"\n >\n Actions\n </li>\n {#each filteredActions as action (action.id)}\n <CommandItem\n value={action.id}\n description={action.description}\n accessibleLabel={action.label}\n keyboardShortcut={action.kbd === '⌘N'\n ? 'Meta+N'\n : action.kbd === '⌘I'\n ? 'Meta+I'\n : undefined}\n onselect={() => select(action.label)}\n >\n {#snippet leading()}\n <span style=\"font-size: 0.875rem; font-weight: 700; line-height: 1;\">{action.icon}</span\n >\n {/snippet}\n {action.label}\n {#snippet trailing()}\n {#if action.kbd}\n <kbd>{action.kbd}</kbd>\n {/if}\n {/snippet}\n </CommandItem>\n {/each}\n {/if}\n {/snippet}\n\n {#snippet empty()}\n No results for \"<strong>{query}</strong>\".\n {/snippet}\n\n {#snippet footer()}\n <span>\n <kbd>↑↓</kbd> navigate &nbsp; <kbd>↵</kbd> select &nbsp; <kbd>Esc</kbd> close\n </span>\n {/snippet}\n</CommandPalette>\n"
23
23
  }
24
24
  ]
25
25
  }
@@ -21,13 +21,9 @@
21
21
 
22
22
  import { captureFocus, pushEscapeHandler } from '../../_internal/overlay.ts';
23
23
  import { classNames } from '../../utilities/class-names.ts';
24
- import { inDocumentOrder } from '../../utilities/document-order.ts';
25
24
  import { restoreFocusTo } from '../../utilities/focus.ts';
26
- import {
27
- setCommandListContext,
28
- type CommandItemRegistrationInput,
29
- type CommandListContext,
30
- } from '../_internal/command-list-context.ts';
25
+ import { setCommandListContext } from '../_internal/command-list-context.ts';
26
+ import { createCommandListState } from '../_internal/create-command-list-state.svelte.ts';
31
27
 
32
28
  let {
33
29
  open = $bindable(false),
@@ -62,58 +58,12 @@
62
58
  // ── Focus capture ─────────────────────────────────────────────────────────
63
59
  let capturedFocus: HTMLElement | null = null;
64
60
 
65
- // ── Item registration ─────────────────────────────────────────────────────
66
- type RegistrationRecord = CommandItemRegistrationInput & { id: string; node: HTMLElement };
67
- let registrations = $state<RegistrationRecord[]>([]);
68
-
69
- // Stable incrementing counter for item ids within this palette instance.
70
- let itemCounter = 0;
71
-
72
- // ── Active item (virtual focus) ───────────────────────────────────────────
73
- // `intendedActiveId` is the user's last navigation/hover intent. The resolved
74
- // `activeItemId` clamps that intent to the currently-enabled set, so it is a
75
- // pure function of intent + enabledIds rather than a value repaired one tick
76
- // late inside an $effect. Keyboard/hover handlers write intent; everything
77
- // downstream reads the resolved derived.
78
- let intendedActiveId = $state<string | null>(null);
79
-
80
- // Ordered list of non-disabled item ids. Derived so arrow-key navigation
81
- // always walks the current set, including after prop changes (e.g. toggling
82
- // disabled on a mounted item).
83
- const enabledIds = $derived.by(() => {
84
- return inDocumentOrder(registrations)
85
- .filter((r) => !r.getDisabled())
86
- .map((r) => r.id);
87
- });
88
-
89
- // Resolved active id: preserve the user's intent if it's still in the enabled
90
- // set, otherwise fall back to the first enabled item (or null). This collapses
91
- // the previous read-then-write $effect into a single synchronous derivation.
92
- const activeItemId = $derived(
93
- intendedActiveId !== null && enabledIds.includes(intendedActiveId)
94
- ? intendedActiveId
95
- : (enabledIds[0] ?? null),
96
- );
97
-
98
- // ── Empty-state flash prevention ─────────────────────────────────────────
99
- // `registrationsReady` prevents the empty snippet from flashing on initial
100
- // open or when a query change causes a full key-swap of items. It is set
101
- // true after one microtask (giving children's $effect registrations time to
102
- // settle), and reset on every query change.
103
- //
104
- // A cycle counter guards against stale microtasks: if the query changes
105
- // twice in quick succession, only the most recent microtask sets ready=true.
106
- let registrationsReady = $state(false);
107
- let readyCycle = 0;
61
+ const commandList = createCommandListState(listboxId);
108
62
 
109
63
  $effect(() => {
110
64
  // Track query so this re-runs on every query change.
111
65
  void query;
112
- registrationsReady = false;
113
- const cycle = ++readyCycle;
114
- queueMicrotask(() => {
115
- if (cycle === readyCycle) registrationsReady = true;
116
- });
66
+ commandList.refreshRegistrationsReady();
117
67
  });
118
68
 
119
69
  // ── Escape stack ──────────────────────────────────────────────────────────
@@ -155,6 +105,8 @@
155
105
  $effect(() => {
156
106
  if (!dialogElement) return;
157
107
  if (open && !dialogElement.open) {
108
+ query = '';
109
+ commandList.resetActiveItem();
158
110
  capturedFocus = captureFocus();
159
111
  dialogElement.showModal();
160
112
  inputElement?.focus();
@@ -193,40 +145,11 @@
193
145
 
194
146
  // ── Keyboard routing ──────────────────────────────────────────────────────
195
147
  function handleKeydown(event: KeyboardEvent) {
196
- const ids = enabledIds;
197
-
198
- if (event.key === 'ArrowDown') {
199
- event.preventDefault();
200
- if (ids.length === 0) return;
201
- if (activeItemId === null) {
202
- const firstId = ids[0];
203
- if (firstId !== undefined) intendedActiveId = firstId;
204
- } else {
205
- const index = ids.indexOf(activeItemId);
206
- const nextId = ids[(index + 1) % ids.length];
207
- if (nextId !== undefined) intendedActiveId = nextId;
208
- }
209
- } else if (event.key === 'ArrowUp') {
210
- event.preventDefault();
211
- if (ids.length === 0) return;
212
- if (activeItemId === null) {
213
- const lastId = ids[ids.length - 1];
214
- if (lastId !== undefined) intendedActiveId = lastId;
215
- } else {
216
- const index = ids.indexOf(activeItemId);
217
- const previousId = ids[index <= 0 ? ids.length - 1 : index - 1];
218
- if (previousId !== undefined) intendedActiveId = previousId;
219
- }
220
- } else if (event.key === 'Home') {
221
- event.preventDefault();
222
- intendedActiveId = ids[0] ?? null;
223
- } else if (event.key === 'End') {
224
- event.preventDefault();
225
- intendedActiveId = ids[ids.length - 1] ?? null;
226
- } else if (event.key === 'Enter') {
227
- event.preventDefault();
228
- if (activeItemId !== null) context.activateItemById(activeItemId);
229
- }
148
+ commandList.handleKeydown({
149
+ event,
150
+ onEnter: (id) => commandList.activateItemById(id),
151
+ preventDefaultOnEmptyEnter: true,
152
+ });
230
153
  }
231
154
 
232
155
  function handleInput(event: Event) {
@@ -235,55 +158,15 @@
235
158
  }
236
159
 
237
160
  $effect(() => {
238
- if (activeItemId === null) return;
239
- // Use the node captured at registration time rather than
240
- // document.getElementById, which assumes globally-unique ids and breaks in
241
- // shadow DOM, iframes, or multi-instance scenarios.
242
- const record = registrations.find((r) => r.id === activeItemId);
243
- record?.node.scrollIntoView({ block: 'nearest' });
161
+ commandList.scrollActiveItemIntoView();
244
162
  });
245
163
 
246
164
  // ── Context ───────────────────────────────────────────────────────────────
247
- const context: CommandListContext = {
248
- get listboxId() {
249
- return listboxId;
250
- },
251
- get activeItemId() {
252
- return activeItemId;
253
- },
254
- register(input: CommandItemRegistrationInput, node: HTMLElement) {
255
- const id = `${listboxId}-item-${++itemCounter}`;
256
- // Mutate in place: $state wraps the array in a deep reactive proxy that
257
- // tracks push/splice, so we avoid allocating a fresh array per register.
258
- registrations.push({
259
- id,
260
- node,
261
- getValue: input.getValue,
262
- getOnselect: input.getOnselect,
263
- getDisabled: input.getDisabled,
264
- });
265
- return {
266
- id,
267
- unregister: () => {
268
- const index = registrations.findIndex((r) => r.id === id);
269
- if (index !== -1) registrations.splice(index, 1);
270
- },
271
- };
272
- },
273
- setActiveById(id: string) {
274
- intendedActiveId = id;
275
- },
276
- activateItemById(id: string) {
277
- const record = registrations.find((r) => r.id === id);
278
- if (record && !record.getDisabled()) {
279
- record.getOnselect()();
280
- }
281
- },
282
- };
283
-
284
- setCommandListContext(context);
165
+ setCommandListContext(commandList.createContext());
285
166
 
286
- const showEmpty = $derived(mounted && registrationsReady && registrations.length === 0);
167
+ const showEmpty = $derived(
168
+ mounted && commandList.registrationsReady && commandList.registrations.length === 0,
169
+ );
287
170
  </script>
288
171
 
289
172
  {#if mounted || open}
@@ -327,7 +210,7 @@
327
210
  aria-autocomplete="list"
328
211
  aria-expanded="true"
329
212
  aria-controls={listboxId}
330
- aria-activedescendant={activeItemId ?? undefined}
213
+ aria-activedescendant={commandList.activeItemId ?? undefined}
331
214
  oninput={handleInput}
332
215
  onkeydown={handleKeydown}
333
216
  />
@@ -12,8 +12,7 @@ export type CommandPaletteProps = {
12
12
  /**
13
13
  * Bindable search query. Mutated by the input's oninput handler.
14
14
  * Exposed to the items snippet so consumers can filter.
15
- * Note: query is NOT reset on close consumers who want a fresh query on
16
- * each open should reset it in their `onclose` callback.
15
+ * Reset to an empty string each time the palette opens.
17
16
  */
18
17
  query?: string;
19
18
  /** Fired after any close path routed through the palette close lifecycle. */
@@ -1,9 +1,11 @@
1
1
  import { createContext } from 'svelte';
2
+ import type { TextDirection } from '../../_internal/locale-context.ts';
2
3
 
3
4
  export type ContextMenuContext = {
4
5
  get disabled(): boolean;
5
6
  get isOpen(): boolean;
6
7
  get longPressDelay(): number;
8
+ get direction(): TextDirection | undefined;
7
9
  openAt: (x: number, y: number) => void;
8
10
  close: () => void;
9
11
  };
@@ -19,7 +19,9 @@
19
19
  import type { ContextMenuProps } from './context-menu.types.ts';
20
20
  import type { VirtualElement } from '@floating-ui/dom';
21
21
  import { createAnchoredOverlay } from '../../_internal/anchored-overlay.svelte.ts';
22
+ import { getLocaleContext } from '../../_internal/locale-context.ts';
22
23
  import { captureFocus } from '../../_internal/overlay.ts';
24
+ import { observeTextDirection, resolveTextDirection } from '../../_internal/text-direction.ts';
23
25
  import { classNames } from '../../utilities/class-names.ts';
24
26
  import { restoreFocusTo } from '../../utilities/focus.ts';
25
27
  import { createClickOutside } from '../../utilities/attachments.ts';
@@ -47,7 +49,9 @@
47
49
  let capturedFocus: HTMLElement | null = null;
48
50
  let requestedX = $state(0);
49
51
  let requestedY = $state(0);
52
+ let directionRevision = $state(0);
50
53
  let previouslyOpen = false;
54
+ const localeContext = getLocaleContext();
51
55
 
52
56
  function setOpen(nextOpen: boolean) {
53
57
  if (open === nextOpen) return;
@@ -103,12 +107,22 @@
103
107
  const virtualReference: VirtualElement | null = $derived(
104
108
  open ? makeVirtualReference(anchorPoint?.x ?? requestedX, anchorPoint?.y ?? requestedY) : null,
105
109
  );
110
+ const resolvedDirection = $derived.by(() => {
111
+ directionRevision;
112
+ return resolveTextDirection(triggerElement, localeContext?.direction);
113
+ });
114
+
115
+ $effect(() => {
116
+ return observeTextDirection(triggerElement, () => {
117
+ directionRevision += 1;
118
+ });
119
+ });
106
120
 
107
121
  const anchoredOverlay = createAnchoredOverlay({
108
122
  open: () => open,
109
123
  anchor: () => virtualReference,
110
124
  panel: () => menuElement,
111
- placement: () => 'right-start',
125
+ placement: () => (resolvedDirection === 'rtl' ? 'left-start' : 'right-start'),
112
126
  offset: () => 0,
113
127
  widthMode: () => 'menu',
114
128
  });
@@ -133,6 +147,18 @@
133
147
  get supportsPopover() {
134
148
  return false;
135
149
  },
150
+ get anchorElement() {
151
+ return triggerElement;
152
+ },
153
+ get fallbackAnchorElement() {
154
+ return null;
155
+ },
156
+ get fallbackPositionStyle() {
157
+ return anchoredOverlay.positionStyle;
158
+ },
159
+ get fallbackPositionReady() {
160
+ return anchoredOverlay.positionReady;
161
+ },
136
162
  get initialFocus() {
137
163
  return 'first' as const;
138
164
  },
@@ -152,6 +178,9 @@
152
178
  get longPressDelay() {
153
179
  return longPressDelay;
154
180
  },
181
+ get direction() {
182
+ return resolvedDirection;
183
+ },
155
184
  openAt,
156
185
  close,
157
186
  });
@@ -161,17 +190,14 @@
161
190
  const x = anchorPoint?.x ?? requestedX;
162
191
  const y = anchorPoint?.y ?? requestedY;
163
192
  const menu = menuElement;
164
- if (anchoredOverlay.positionStyle) {
165
- menu.setAttribute('style', anchoredOverlay.positionStyle);
166
- } else {
167
- menu.removeAttribute('style');
168
- }
169
- menu.setAttribute('data-cinder-position-ready', String(anchoredOverlay.positionReady));
170
193
  menu.setAttribute('data-cinder-requested-x', String(x));
171
194
  menu.setAttribute('data-cinder-requested-y', String(y));
195
+ const ownsDirection = menu.dataset['cinderExplicitDirection'] !== 'true';
196
+ if (ownsDirection && resolvedDirection) {
197
+ menu.setAttribute('dir', resolvedDirection);
198
+ }
172
199
  return () => {
173
- menu.removeAttribute('style');
174
- menu.removeAttribute('data-cinder-position-ready');
200
+ if (ownsDirection) menu.removeAttribute('dir');
175
201
  menu.removeAttribute('data-cinder-requested-x');
176
202
  menu.removeAttribute('data-cinder-requested-y');
177
203
  };