@lapismd/design-core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1256) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/LICENSE.md +4 -0
  3. package/README.md +260 -0
  4. package/package.json +290 -0
  5. package/spec/src/styling-and-themes.md +188 -0
  6. package/src/lib/data-ui-contract.ts +263 -0
  7. package/src/lib/data-ui-host-catalog.ts +278 -0
  8. package/src/lib/data-ui-host.ts +69 -0
  9. package/src/lib/hooks/is-mobile.svelte.ts +9 -0
  10. package/src/lib/overlay-portal-context.ts +57 -0
  11. package/src/lib/utils.ts +18 -0
  12. package/src/shared/ai/chat.css +1551 -0
  13. package/src/shared/ai/chat.tokens.ts +25 -0
  14. package/src/shared/ai/chat.ts +70 -0
  15. package/src/shared/ai/composer/Composer.svelte +195 -0
  16. package/src/shared/ai/composer/index.ts +1 -0
  17. package/src/shared/ai/composer-behavior.ts +57 -0
  18. package/src/shared/ai/composer-drawer/ComposerDrawer.svelte +61 -0
  19. package/src/shared/ai/composer-drawer/index.ts +1 -0
  20. package/src/shared/ai/composer-input/ComposerInput.svelte +511 -0
  21. package/src/shared/ai/composer-input/index.ts +1 -0
  22. package/src/shared/ai/composer-token/ComposerToken.svelte +34 -0
  23. package/src/shared/ai/composer-token/index.ts +1 -0
  24. package/src/shared/ai/composer-tokens.ts +468 -0
  25. package/src/shared/ai/context.svelte.ts +83 -0
  26. package/src/shared/ai/dictation-button/DictationButton.svelte +77 -0
  27. package/src/shared/ai/dictation-button/index.ts +1 -0
  28. package/src/shared/ai/experimental/emoji-picker/EmojiPicker.svelte +177 -0
  29. package/src/shared/ai/experimental/emoji-picker/index.ts +5 -0
  30. package/src/shared/ai/experimental/index.ts +22 -0
  31. package/src/shared/ai/experimental/reaction-bar/ReactionBar.svelte +84 -0
  32. package/src/shared/ai/experimental/reaction-bar/index.ts +1 -0
  33. package/src/shared/ai/experimental/reasoning/Reasoning.svelte +70 -0
  34. package/src/shared/ai/experimental/reasoning/index.ts +1 -0
  35. package/src/shared/ai/experimental/typing-indicator/TypingIndicator.svelte +41 -0
  36. package/src/shared/ai/experimental/typing-indicator/index.ts +1 -0
  37. package/src/shared/ai/experimental/unread-divider/UnreadDivider.svelte +26 -0
  38. package/src/shared/ai/experimental/unread-divider/index.ts +1 -0
  39. package/src/shared/ai/index.ts +2 -0
  40. package/src/shared/ai/layout/Layout.svelte +141 -0
  41. package/src/shared/ai/layout/index.ts +1 -0
  42. package/src/shared/ai/layout-scroll-button/LayoutScrollButton.svelte +48 -0
  43. package/src/shared/ai/layout-scroll-button/index.ts +1 -0
  44. package/src/shared/ai/message/Message.svelte +71 -0
  45. package/src/shared/ai/message/index.ts +1 -0
  46. package/src/shared/ai/message-bubble/MessageBubble.svelte +62 -0
  47. package/src/shared/ai/message-bubble/index.ts +1 -0
  48. package/src/shared/ai/message-list/MessageList.svelte +133 -0
  49. package/src/shared/ai/message-list/index.ts +1 -0
  50. package/src/shared/ai/message-metadata/MessageMetadata.svelte +90 -0
  51. package/src/shared/ai/message-metadata/index.ts +1 -0
  52. package/src/shared/ai/new-messages.svelte.ts +80 -0
  53. package/src/shared/ai/send-button/SendButton.svelte +51 -0
  54. package/src/shared/ai/send-button/index.ts +1 -0
  55. package/src/shared/ai/speech-recognition.svelte.ts +329 -0
  56. package/src/shared/ai/stream-scroll.svelte.ts +238 -0
  57. package/src/shared/ai/system-message/SystemMessage.svelte +43 -0
  58. package/src/shared/ai/system-message/index.ts +1 -0
  59. package/src/shared/ai/tokenized-text/TokenizedText.svelte +76 -0
  60. package/src/shared/ai/tokenized-text/index.ts +1 -0
  61. package/src/shared/ai/tool-calls/ToolCalls.svelte +185 -0
  62. package/src/shared/ai/tool-calls/index.ts +1 -0
  63. package/src/shared/ai/trigger-menu.ts +154 -0
  64. package/src/shared/ai/types.ts +144 -0
  65. package/src/shared/diff/core/file-tree.ts +83 -0
  66. package/src/shared/diff/core/index.ts +58 -0
  67. package/src/shared/diff/core/merge/ATTRIBUTION.mergeweave.md +12 -0
  68. package/src/shared/diff/core/merge/actions.ts +142 -0
  69. package/src/shared/diff/core/merge/blocks.ts +120 -0
  70. package/src/shared/diff/core/merge/diff.ts +67 -0
  71. package/src/shared/diff/core/merge/index.ts +32 -0
  72. package/src/shared/diff/core/merge/inline-diff.ts +35 -0
  73. package/src/shared/diff/core/merge/lines.ts +44 -0
  74. package/src/shared/diff/core/merge/one-way.ts +101 -0
  75. package/src/shared/diff/core/merge/options.ts +25 -0
  76. package/src/shared/diff/core/merge/render-model.ts +591 -0
  77. package/src/shared/diff/core/merge/three-way.ts +267 -0
  78. package/src/shared/diff/core/merge/types.ts +61 -0
  79. package/src/shared/diff/core/unified-diff.ts +577 -0
  80. package/src/shared/diff/diff.tokens.css +59 -0
  81. package/src/shared/diff/diff.tokens.ts +23 -0
  82. package/src/shared/diff/file-change-stats/FileChangeStats.css +20 -0
  83. package/src/shared/diff/file-change-stats/FileChangeStats.svelte +35 -0
  84. package/src/shared/diff/file-change-stats/format-diff-delta.ts +3 -0
  85. package/src/shared/diff/file-change-stats/index.ts +2 -0
  86. package/src/shared/diff/file-diff/FileDiff.css +234 -0
  87. package/src/shared/diff/file-diff/FileDiff.svelte +381 -0
  88. package/src/shared/diff/file-diff/FileDiffComposer.svelte +61 -0
  89. package/src/shared/diff/file-diff/expand.ts +43 -0
  90. package/src/shared/diff/file-diff/highlight.ts +178 -0
  91. package/src/shared/diff/file-diff/index.ts +9 -0
  92. package/src/shared/diff/file-diff/language.ts +49 -0
  93. package/src/shared/diff/file-diff/types.ts +24 -0
  94. package/src/shared/diff/file-listing/FileListing.css +74 -0
  95. package/src/shared/diff/file-listing/FileListing.svelte +235 -0
  96. package/src/shared/diff/file-listing/FileListingViewModeToggle.css +14 -0
  97. package/src/shared/diff/file-listing/FileListingViewModeToggle.svelte +50 -0
  98. package/src/shared/diff/file-listing/file-icon.ts +35 -0
  99. package/src/shared/diff/file-listing/index.ts +9 -0
  100. package/src/shared/diff/file-listing/types.ts +25 -0
  101. package/src/shared/diff/index.ts +31 -0
  102. package/src/shared/diff/merge-editor/MergeEditor.css +481 -0
  103. package/src/shared/diff/merge-editor/MergeEditor.svelte +702 -0
  104. package/src/shared/diff/merge-editor/MergeEditorDemo.css +41 -0
  105. package/src/shared/diff/merge-editor/MergeEditorDemo.svelte +91 -0
  106. package/src/shared/diff/merge-editor/connector.ts +94 -0
  107. package/src/shared/diff/merge-editor/demo-fixtures.ts +428 -0
  108. package/src/shared/diff/merge-editor/index.ts +9 -0
  109. package/src/shared/diff/merge-editor/mismerge-quicksort-fixture.ts +12 -0
  110. package/src/shared/diff/merge-editor/quicksort-fixture.ts +6 -0
  111. package/src/shared/diff/merge-editor/types.ts +11 -0
  112. package/src/shared/filter/demo-ledger-filter-syntax.ts +132 -0
  113. package/src/shared/filter/filter-query/filters.ts +375 -0
  114. package/src/shared/filter/filter-query/highlight.ts +21 -0
  115. package/src/shared/filter/filter-query/index.ts +23 -0
  116. package/src/shared/filter/filter-query/parser.ts +710 -0
  117. package/src/shared/filter/filter-query/query.d.ts +3 -0
  118. package/src/shared/filter/filter-query/query.grammar +150 -0
  119. package/src/shared/filter/filter-query/query.js +60 -0
  120. package/src/shared/filter/filter-query/query.terms.js +32 -0
  121. package/src/shared/filter/index.ts +35 -0
  122. package/src/shared/filter/power-search/PowerSearch.css +245 -0
  123. package/src/shared/filter/power-search/PowerSearch.svelte +245 -0
  124. package/src/shared/filter/power-search/PowerSearchFieldCombobox.svelte +162 -0
  125. package/src/shared/filter/power-search/index.ts +10 -0
  126. package/src/shared/filter/power-search/power-search.ts +106 -0
  127. package/src/shared/filter/search-filter-bar/SearchFilterAutocompleteScrollArea.svelte +29 -0
  128. package/src/shared/filter/search-filter-bar/SearchFilterBar.css +924 -0
  129. package/src/shared/filter/search-filter-bar/SearchFilterBar.svelte +246 -0
  130. package/src/shared/filter/search-filter-bar/SearchFilterFieldAutocomplete.svelte +182 -0
  131. package/src/shared/filter/search-filter-bar/SearchFilterInput.svelte +412 -0
  132. package/src/shared/filter/search-filter-bar/SearchFilterPredicateEditor.svelte +270 -0
  133. package/src/shared/filter/search-filter-bar/SearchFilterValueAutocomplete.svelte +127 -0
  134. package/src/shared/filter/search-filter-bar/index.ts +15 -0
  135. package/src/shared/filter/search-filter-bar/search-filter-highlight.ts +56 -0
  136. package/src/shared/filter/search-filter-bar/search-filter-predicate-chips.ts +410 -0
  137. package/src/shared/filter/search-filter-bar/search-filter-syntax.ts +334 -0
  138. package/src/shared/forms/add-section-chooser/AddSectionChooser.css +135 -0
  139. package/src/shared/forms/add-section-chooser/AddSectionChooser.svelte +118 -0
  140. package/src/shared/forms/add-section-chooser/index.ts +1 -0
  141. package/src/shared/forms/autocomplete-input/AutocompleteInput.css +86 -0
  142. package/src/shared/forms/autocomplete-input/AutocompleteInput.svelte +253 -0
  143. package/src/shared/forms/autocomplete-input/index.ts +1 -0
  144. package/src/shared/forms/chip-autocomplete/ChipAutocomplete.css +142 -0
  145. package/src/shared/forms/chip-autocomplete/ChipAutocomplete.svelte +156 -0
  146. package/src/shared/forms/chip-autocomplete/index.ts +1 -0
  147. package/src/shared/forms/code-editor/CodeEditor.css +42 -0
  148. package/src/shared/forms/code-editor/CodeEditor.svelte +60 -0
  149. package/src/shared/forms/code-editor/code-editor-language.ts +63 -0
  150. package/src/shared/forms/code-editor/code-editor-syntax.ts +25 -0
  151. package/src/shared/forms/code-editor/index.ts +1 -0
  152. package/src/shared/forms/code-highlighter/CodeHighlighter.css +54 -0
  153. package/src/shared/forms/code-highlighter/CodeHighlighter.svelte +57 -0
  154. package/src/shared/forms/code-highlighter/code-highlighter.ts +36 -0
  155. package/src/shared/forms/code-highlighter/index.ts +2 -0
  156. package/src/shared/forms/collapsible-item-list/CollapsibleItemList.css +99 -0
  157. package/src/shared/forms/collapsible-item-list/CollapsibleItemList.svelte +56 -0
  158. package/src/shared/forms/collapsible-item-list/index.ts +1 -0
  159. package/src/shared/forms/color-picker/ColorPicker.css +150 -0
  160. package/src/shared/forms/color-picker/ColorPicker.svelte +149 -0
  161. package/src/shared/forms/color-picker/color-value.ts +36 -0
  162. package/src/shared/forms/color-picker/index.ts +6 -0
  163. package/src/shared/forms/complete-cv-form/CompleteCvForm.css +264 -0
  164. package/src/shared/forms/complete-cv-form/CompleteCvForm.svelte +305 -0
  165. package/src/shared/forms/complete-cv-form/PLAN.md +225 -0
  166. package/src/shared/forms/complete-cv-form/complete-cv-form.model.ts +387 -0
  167. package/src/shared/forms/complete-cv-form/complete-cv-form.typed-config.ts +1767 -0
  168. package/src/shared/forms/complete-cv-form/complete-cv-form.types.ts +255 -0
  169. package/src/shared/forms/complete-cv-form/sample-cv.fixture.ts +11 -0
  170. package/src/shared/forms/complete-cv-form/sample-cv.fixture.yml +211 -0
  171. package/src/shared/forms/core/autosize-textarea.ts +35 -0
  172. package/src/shared/forms/core/builders.ts +291 -0
  173. package/src/shared/forms/core/code-language-options.ts +28 -0
  174. package/src/shared/forms/core/core.ts +157 -0
  175. package/src/shared/forms/core/date-utils.ts +219 -0
  176. package/src/shared/forms/core/field-review.ts +15 -0
  177. package/src/shared/forms/core/form-controller.svelte.ts +449 -0
  178. package/src/shared/forms/core/index.ts +1 -0
  179. package/src/shared/forms/core/json-patch.ts +128 -0
  180. package/src/shared/forms/core/markdown-format.ts +39 -0
  181. package/src/shared/forms/core/patch-review.ts +591 -0
  182. package/src/shared/forms/core/path-config.ts +428 -0
  183. package/src/shared/forms/core/path-runtime.ts +70 -0
  184. package/src/shared/forms/core/path-types.ts +132 -0
  185. package/src/shared/forms/core/path-utils.ts +102 -0
  186. package/src/shared/forms/core/reference-utils.ts +168 -0
  187. package/src/shared/forms/core/registry.ts +101 -0
  188. package/src/shared/forms/core/review-diff.ts +199 -0
  189. package/src/shared/forms/core/types.ts +135 -0
  190. package/src/shared/forms/core/yaml-review-play.ts +16 -0
  191. package/src/shared/forms/cycle-picker/CyclePicker.css +89 -0
  192. package/src/shared/forms/cycle-picker/CyclePicker.svelte +165 -0
  193. package/src/shared/forms/cycle-picker/index.ts +2 -0
  194. package/src/shared/forms/date-picker/DatePicker.css +193 -0
  195. package/src/shared/forms/date-picker/DatePicker.svelte +251 -0
  196. package/src/shared/forms/date-picker/index.ts +17 -0
  197. package/src/shared/forms/entry-actions/EntryActions.css +93 -0
  198. package/src/shared/forms/entry-actions/EntryActions.svelte +62 -0
  199. package/src/shared/forms/entry-actions/index.ts +1 -0
  200. package/src/shared/forms/field-review-actions/FieldReviewActions.css +38 -0
  201. package/src/shared/forms/field-review-actions/FieldReviewActions.svelte +42 -0
  202. package/src/shared/forms/field-review-actions/index.ts +1 -0
  203. package/src/shared/forms/filter-command-picker/FilterCommandPicker.css +321 -0
  204. package/src/shared/forms/filter-command-picker/FilterCommandPicker.svelte +382 -0
  205. package/src/shared/forms/filter-command-picker/index.ts +10 -0
  206. package/src/shared/forms/filter-command-picker/picker-options.ts +13 -0
  207. package/src/shared/forms/filter-command-picker/picker-search.ts +123 -0
  208. package/src/shared/forms/form-add-button/FormAddButton.css +56 -0
  209. package/src/shared/forms/form-add-button/FormAddButton.svelte +28 -0
  210. package/src/shared/forms/form-control-row/FormControlRow.css +153 -0
  211. package/src/shared/forms/form-control-row/index.ts +2 -0
  212. package/src/shared/forms/form-field/FormField.css +156 -0
  213. package/src/shared/forms/form-field/FormField.svelte +87 -0
  214. package/src/shared/forms/form-field/index.ts +1 -0
  215. package/src/shared/forms/form-placeholder/FormPlaceholder.css +14 -0
  216. package/src/shared/forms/form-placeholder/FormPlaceholder.svelte +21 -0
  217. package/src/shared/forms/form-review/ReviewedStringListFormField.svelte +44 -0
  218. package/src/shared/forms/form-review/ReviewedTextFormField.svelte +64 -0
  219. package/src/shared/forms/form-review/index.ts +5 -0
  220. package/src/shared/forms/form-section-header/FormSectionHeader.css +177 -0
  221. package/src/shared/forms/form-section-header/FormSectionHeader.svelte +135 -0
  222. package/src/shared/forms/form-section-header/index.ts +1 -0
  223. package/src/shared/forms/form-sheet/FormSheet.css +99 -0
  224. package/src/shared/forms/form-sheet/FormSheet.svelte +132 -0
  225. package/src/shared/forms/form-toolbar/FormToolbar.css +49 -0
  226. package/src/shared/forms/form-toolbar/FormToolbar.svelte +59 -0
  227. package/src/shared/forms/form.tokens.css +41 -0
  228. package/src/shared/forms/form.tokens.ts +58 -0
  229. package/src/shared/forms/index.ts +131 -0
  230. package/src/shared/forms/inline-option-picker/InlineOptionPicker.css +147 -0
  231. package/src/shared/forms/inline-option-picker/InlineOptionPicker.svelte +153 -0
  232. package/src/shared/forms/inline-option-picker/index.ts +1 -0
  233. package/src/shared/forms/json-backed-form/JsonBackedForm.css +52 -0
  234. package/src/shared/forms/json-backed-form/JsonBackedForm.svelte +106 -0
  235. package/src/shared/forms/json-backed-form/index.ts +1 -0
  236. package/src/shared/forms/list-editor/ListEditor.css +171 -0
  237. package/src/shared/forms/list-editor/ListEditor.svelte +232 -0
  238. package/src/shared/forms/password-input/PasswordInput.css +48 -0
  239. package/src/shared/forms/password-input/PasswordInput.svelte +57 -0
  240. package/src/shared/forms/password-input/index.ts +1 -0
  241. package/src/shared/forms/patchable-form/PatchableForm.svelte +136 -0
  242. package/src/shared/forms/patchable-form/field-review-context.ts +78 -0
  243. package/src/shared/forms/patchable-form/index.ts +2 -0
  244. package/src/shared/forms/reference-picker/ReferencePicker.css +338 -0
  245. package/src/shared/forms/reference-picker/ReferencePicker.svelte +422 -0
  246. package/src/shared/forms/reference-picker/ReferencePreview.css +126 -0
  247. package/src/shared/forms/reference-picker/ReferencePreview.svelte +71 -0
  248. package/src/shared/forms/reference-picker/index.ts +1 -0
  249. package/src/shared/forms/secret-field/SecretField.css +29 -0
  250. package/src/shared/forms/secret-field/SecretField.svelte +101 -0
  251. package/src/shared/forms/secret-field/index.ts +8 -0
  252. package/src/shared/forms/secret-field/secret-field-value.ts +35 -0
  253. package/src/shared/forms/segmented-control/SegmentedControl.css +80 -0
  254. package/src/shared/forms/segmented-control/SegmentedControl.svelte +51 -0
  255. package/src/shared/forms/segmented-control/index.ts +1 -0
  256. package/src/shared/forms/sortable-array-item/SortableArrayItem.css +144 -0
  257. package/src/shared/forms/sortable-array-item/SortableArrayItem.svelte +94 -0
  258. package/src/shared/forms/structured-form/ConfiguredFormField.svelte +407 -0
  259. package/src/shared/forms/structured-form/ConfiguredFormGroup.svelte +100 -0
  260. package/src/shared/forms/structured-form/CurrencyFormControl.story.svelte +31 -0
  261. package/src/shared/forms/structured-form/FormFieldRenderer.css +86 -0
  262. package/src/shared/forms/structured-form/FormFieldRenderer.svelte +180 -0
  263. package/src/shared/forms/structured-form/FormViewRenderer.svelte +38 -0
  264. package/src/shared/forms/structured-form/RegisteredFieldControl.svelte +221 -0
  265. package/src/shared/forms/structured-form/StructuredForm.currency-kind.story.ts +9 -0
  266. package/src/shared/forms/structured-form/StructuredForm.svelte +128 -0
  267. package/src/shared/forms/structured-form/disclosure-policy.ts +19 -0
  268. package/src/shared/forms/structured-form/form-renderer-registry.ts +130 -0
  269. package/src/shared/forms/structured-form/index.ts +3 -0
  270. package/src/shared/forms/structured-form/structured-form.css +191 -0
  271. package/src/shared/forms/structured-form/wrapping-text-input.ts +20 -0
  272. package/src/shared/forms/task-due-calendar/TaskDueCalendar.css +117 -0
  273. package/src/shared/forms/task-due-calendar/TaskDueCalendar.svelte +72 -0
  274. package/src/shared/forms/task-due-calendar/index.ts +1 -0
  275. package/src/shared/forms/time-picker/TimePicker.css +76 -0
  276. package/src/shared/forms/time-picker/TimePicker.svelte +88 -0
  277. package/src/shared/forms/time-picker/index.ts +1 -0
  278. package/src/shared/forms/unified-review-diff/UnifiedReviewDiff.css +72 -0
  279. package/src/shared/forms/unified-review-diff/UnifiedReviewDiff.svelte +57 -0
  280. package/src/shared/forms/unified-review-diff/index.ts +1 -0
  281. package/src/shared/forms/yaml-backed-form/YamlBackedForm.css +52 -0
  282. package/src/shared/forms/yaml-backed-form/YamlBackedForm.svelte +112 -0
  283. package/src/shared/forms/yaml-backed-form/index.ts +1 -0
  284. package/src/shared/forms/yaml-editor/YamlEditor.css +50 -0
  285. package/src/shared/forms/yaml-editor/YamlEditor.svelte +407 -0
  286. package/src/shared/forms/yaml-editor/index.ts +1 -0
  287. package/src/shared/forms/yaml-editor/yaml-editor-runtime.ts +65 -0
  288. package/src/shared/shadcn/accordion/Accordion.story-sources.ts +12 -0
  289. package/src/shared/shadcn/accordion/accordion-content.svelte +28 -0
  290. package/src/shared/shadcn/accordion/accordion-item.svelte +18 -0
  291. package/src/shared/shadcn/accordion/accordion-trigger.svelte +70 -0
  292. package/src/shared/shadcn/accordion/accordion.docs-body.md +24 -0
  293. package/src/shared/shadcn/accordion/accordion.docs.md +30 -0
  294. package/src/shared/shadcn/accordion/accordion.provenance.json +52 -0
  295. package/src/shared/shadcn/accordion/accordion.svelte +408 -0
  296. package/src/shared/shadcn/accordion/accordion.tokens.css +13 -0
  297. package/src/shared/shadcn/accordion/accordion.tokens.ts +10 -0
  298. package/src/shared/shadcn/accordion/examples/preview.svelte +50 -0
  299. package/src/shared/shadcn/accordion/index.ts +21 -0
  300. package/src/shared/shadcn/alert/alert-action.svelte +22 -0
  301. package/src/shared/shadcn/alert/alert-description.svelte +22 -0
  302. package/src/shared/shadcn/alert/alert-title.svelte +22 -0
  303. package/src/shared/shadcn/alert/alert.docs-body.md +22 -0
  304. package/src/shared/shadcn/alert/alert.docs.md +28 -0
  305. package/src/shared/shadcn/alert/alert.provenance.json +52 -0
  306. package/src/shared/shadcn/alert/alert.svelte +307 -0
  307. package/src/shared/shadcn/alert/alert.tokens.css +13 -0
  308. package/src/shared/shadcn/alert/alert.tokens.ts +9 -0
  309. package/src/shared/shadcn/alert/examples/preview.svelte +36 -0
  310. package/src/shared/shadcn/alert/index.ts +19 -0
  311. package/src/shared/shadcn/alert-dialog/alert-dialog-action.svelte +29 -0
  312. package/src/shared/shadcn/alert-dialog/alert-dialog-cancel.svelte +29 -0
  313. package/src/shared/shadcn/alert-dialog/alert-dialog-content.svelte +623 -0
  314. package/src/shared/shadcn/alert-dialog/alert-dialog-description.svelte +18 -0
  315. package/src/shared/shadcn/alert-dialog/alert-dialog-footer.svelte +22 -0
  316. package/src/shared/shadcn/alert-dialog/alert-dialog-header.svelte +22 -0
  317. package/src/shared/shadcn/alert-dialog/alert-dialog-media.svelte +22 -0
  318. package/src/shared/shadcn/alert-dialog/alert-dialog-overlay.svelte +18 -0
  319. package/src/shared/shadcn/alert-dialog/alert-dialog-portal.svelte +7 -0
  320. package/src/shared/shadcn/alert-dialog/alert-dialog-title.svelte +18 -0
  321. package/src/shared/shadcn/alert-dialog/alert-dialog-trigger.svelte +14 -0
  322. package/src/shared/shadcn/alert-dialog/alert-dialog.docs-body.md +32 -0
  323. package/src/shared/shadcn/alert-dialog/alert-dialog.docs.md +38 -0
  324. package/src/shared/shadcn/alert-dialog/alert-dialog.provenance.json +84 -0
  325. package/src/shared/shadcn/alert-dialog/alert-dialog.svelte +10 -0
  326. package/src/shared/shadcn/alert-dialog/alert-dialog.tokens.css +13 -0
  327. package/src/shared/shadcn/alert-dialog/alert-dialog.tokens.ts +10 -0
  328. package/src/shared/shadcn/alert-dialog/examples/preview.svelte +25 -0
  329. package/src/shared/shadcn/alert-dialog/index.ts +44 -0
  330. package/src/shared/shadcn/badge/badge.docs-body.md +29 -0
  331. package/src/shared/shadcn/badge/badge.docs.md +35 -0
  332. package/src/shared/shadcn/badge/badge.provenance.json +40 -0
  333. package/src/shared/shadcn/badge/badge.svelte +491 -0
  334. package/src/shared/shadcn/badge/badge.tokens.css +13 -0
  335. package/src/shared/shadcn/badge/badge.tokens.ts +9 -0
  336. package/src/shared/shadcn/badge/examples/preview.svelte +35 -0
  337. package/src/shared/shadcn/badge/index.ts +4 -0
  338. package/src/shared/shadcn/breadcrumb/breadcrumb-ellipsis.svelte +30 -0
  339. package/src/shared/shadcn/breadcrumb/breadcrumb-item.svelte +22 -0
  340. package/src/shared/shadcn/breadcrumb/breadcrumb-link.svelte +33 -0
  341. package/src/shared/shadcn/breadcrumb/breadcrumb-list.svelte +22 -0
  342. package/src/shared/shadcn/breadcrumb/breadcrumb-page.svelte +25 -0
  343. package/src/shared/shadcn/breadcrumb/breadcrumb-separator.svelte +29 -0
  344. package/src/shared/shadcn/breadcrumb/breadcrumb.docs-body.md +150 -0
  345. package/src/shared/shadcn/breadcrumb/breadcrumb.docs.md +156 -0
  346. package/src/shared/shadcn/breadcrumb/breadcrumb.provenance.json +76 -0
  347. package/src/shared/shadcn/breadcrumb/breadcrumb.svelte +200 -0
  348. package/src/shared/shadcn/breadcrumb/breadcrumb.tokens.css +13 -0
  349. package/src/shared/shadcn/breadcrumb/breadcrumb.tokens.ts +10 -0
  350. package/src/shared/shadcn/breadcrumb/examples/collapsed.svelte +25 -0
  351. package/src/shared/shadcn/breadcrumb/examples/custom-separator.svelte +26 -0
  352. package/src/shared/shadcn/breadcrumb/examples/dropdown.svelte +38 -0
  353. package/src/shared/shadcn/breadcrumb/examples/link-component.svelte +21 -0
  354. package/src/shared/shadcn/breadcrumb/examples/preview.svelte +36 -0
  355. package/src/shared/shadcn/breadcrumb/index.ts +30 -0
  356. package/src/shared/shadcn/button/button.docs-body.md +287 -0
  357. package/src/shared/shadcn/button/button.docs.md +297 -0
  358. package/src/shared/shadcn/button/button.provenance.json +58 -0
  359. package/src/shared/shadcn/button/button.svelte +703 -0
  360. package/src/shared/shadcn/button/button.tokens.css +17 -0
  361. package/src/shared/shadcn/button/button.tokens.ts +14 -0
  362. package/src/shared/shadcn/button/examples/default.svelte +7 -0
  363. package/src/shared/shadcn/button/examples/destructive.svelte +7 -0
  364. package/src/shared/shadcn/button/examples/ghost.svelte +7 -0
  365. package/src/shared/shadcn/button/examples/icon.svelte +10 -0
  366. package/src/shared/shadcn/button/examples/link.svelte +7 -0
  367. package/src/shared/shadcn/button/examples/outline.svelte +7 -0
  368. package/src/shared/shadcn/button/examples/preview.svelte +13 -0
  369. package/src/shared/shadcn/button/examples/rounded.svelte +12 -0
  370. package/src/shared/shadcn/button/examples/secondary.svelte +7 -0
  371. package/src/shared/shadcn/button/examples/size.svelte +27 -0
  372. package/src/shared/shadcn/button/examples/spinner.svelte +11 -0
  373. package/src/shared/shadcn/button/examples/with-icon.svelte +10 -0
  374. package/src/shared/shadcn/button/index.ts +22 -0
  375. package/src/shared/shadcn/button-group/button-group-separator.svelte +20 -0
  376. package/src/shared/shadcn/button-group/button-group-text.svelte +35 -0
  377. package/src/shared/shadcn/button-group/button-group.docs-body.md +426 -0
  378. package/src/shared/shadcn/button-group/button-group.docs.md +432 -0
  379. package/src/shared/shadcn/button-group/button-group.provenance.json +60 -0
  380. package/src/shared/shadcn/button-group/button-group.svelte +358 -0
  381. package/src/shared/shadcn/button-group/button-group.tokens.css +13 -0
  382. package/src/shared/shadcn/button-group/button-group.tokens.ts +10 -0
  383. package/src/shared/shadcn/button-group/examples/dropdown-menu.svelte +63 -0
  384. package/src/shared/shadcn/button-group/examples/input-group.svelte +51 -0
  385. package/src/shared/shadcn/button-group/examples/input.svelte +15 -0
  386. package/src/shared/shadcn/button-group/examples/nested.svelte +26 -0
  387. package/src/shared/shadcn/button-group/examples/orientation.svelte +21 -0
  388. package/src/shared/shadcn/button-group/examples/popover.svelte +49 -0
  389. package/src/shared/shadcn/button-group/examples/preview.svelte +100 -0
  390. package/src/shared/shadcn/button-group/examples/select.svelte +50 -0
  391. package/src/shared/shadcn/button-group/examples/separator.svelte +12 -0
  392. package/src/shared/shadcn/button-group/examples/size.svelte +34 -0
  393. package/src/shared/shadcn/button-group/examples/split.svelte +15 -0
  394. package/src/shared/shadcn/button-group/index.ts +23 -0
  395. package/src/shared/shadcn/card/card-action.svelte +22 -0
  396. package/src/shared/shadcn/card/card-content.svelte +22 -0
  397. package/src/shared/shadcn/card/card-description.svelte +22 -0
  398. package/src/shared/shadcn/card/card-footer.svelte +22 -0
  399. package/src/shared/shadcn/card/card-header.svelte +22 -0
  400. package/src/shared/shadcn/card/card-title.svelte +22 -0
  401. package/src/shared/shadcn/card/card.docs-body.md +112 -0
  402. package/src/shared/shadcn/card/card.docs.md +118 -0
  403. package/src/shared/shadcn/card/card.provenance.json +64 -0
  404. package/src/shared/shadcn/card/card.svelte +400 -0
  405. package/src/shared/shadcn/card/card.tokens.css +13 -0
  406. package/src/shared/shadcn/card/card.tokens.ts +9 -0
  407. package/src/shared/shadcn/card/examples/image.svelte +28 -0
  408. package/src/shared/shadcn/card/examples/preview-2.svelte +46 -0
  409. package/src/shared/shadcn/card/examples/preview.svelte +46 -0
  410. package/src/shared/shadcn/card/examples/spacing-2.svelte +42 -0
  411. package/src/shared/shadcn/card/examples/spacing.svelte +93 -0
  412. package/src/shared/shadcn/card/index.ts +27 -0
  413. package/src/shared/shadcn/checkbox/checkbox.docs-body.md +17 -0
  414. package/src/shared/shadcn/checkbox/checkbox.docs.md +23 -0
  415. package/src/shared/shadcn/checkbox/checkbox.provenance.json +40 -0
  416. package/src/shared/shadcn/checkbox/checkbox.svelte +425 -0
  417. package/src/shared/shadcn/checkbox/checkbox.tokens.css +13 -0
  418. package/src/shared/shadcn/checkbox/checkbox.tokens.ts +10 -0
  419. package/src/shared/shadcn/checkbox/examples/preview.svelte +41 -0
  420. package/src/shared/shadcn/checkbox/index.ts +8 -0
  421. package/src/shared/shadcn/code/Code.svelte +39 -0
  422. package/src/shared/shadcn/code/code.css +30 -0
  423. package/src/shared/shadcn/code/code.docs.md +33 -0
  424. package/src/shared/shadcn/code/code.tokens.css +14 -0
  425. package/src/shared/shadcn/code/code.tokens.ts +12 -0
  426. package/src/shared/shadcn/code/index.ts +3 -0
  427. package/src/shared/shadcn/code-block/CodeBlock.svelte +456 -0
  428. package/src/shared/shadcn/code-block/code-block-helpers.ts +91 -0
  429. package/src/shared/shadcn/code-block/code-block.css +298 -0
  430. package/src/shared/shadcn/code-block/code-block.docs.md +48 -0
  431. package/src/shared/shadcn/code-block/code-block.tokens.css +48 -0
  432. package/src/shared/shadcn/code-block/code-block.tokens.ts +25 -0
  433. package/src/shared/shadcn/code-block/highlightRanges.ts +451 -0
  434. package/src/shared/shadcn/code-block/highlightStyles.ts +76 -0
  435. package/src/shared/shadcn/code-block/index.ts +59 -0
  436. package/src/shared/shadcn/code-block/syntax/SyntaxTheme.svelte +32 -0
  437. package/src/shared/shadcn/code-block/syntax/THIRD_PARTY_LICENSES.md +72 -0
  438. package/src/shared/shadcn/code-block/syntax/defineSyntaxTheme.ts +111 -0
  439. package/src/shared/shadcn/code-block/syntax/index.ts +39 -0
  440. package/src/shared/shadcn/code-block/syntax/presets.ts +293 -0
  441. package/src/shared/shadcn/code-block/syntax/syntax-theme-context.svelte.ts +17 -0
  442. package/src/shared/shadcn/code-block/syntax/tokens.css +20 -0
  443. package/src/shared/shadcn/code-block/syntax/tokens.ts +28 -0
  444. package/src/shared/shadcn/code-block/tokenizer.ts +534 -0
  445. package/src/shared/shadcn/collapsible/collapsible-content.svelte +16 -0
  446. package/src/shared/shadcn/collapsible/collapsible-trigger.svelte +16 -0
  447. package/src/shared/shadcn/collapsible/collapsible.docs-body.md +23 -0
  448. package/src/shared/shadcn/collapsible/collapsible.docs.md +29 -0
  449. package/src/shared/shadcn/collapsible/collapsible.provenance.json +49 -0
  450. package/src/shared/shadcn/collapsible/collapsible.svelte +18 -0
  451. package/src/shared/shadcn/collapsible/collapsible.tokens.css +13 -0
  452. package/src/shared/shadcn/collapsible/collapsible.tokens.ts +10 -0
  453. package/src/shared/shadcn/collapsible/examples/preview.svelte +30 -0
  454. package/src/shared/shadcn/collapsible/index.ts +18 -0
  455. package/src/shared/shadcn/column-canvas/RESPONSIVE_SCROLL_PLAN.md +167 -0
  456. package/src/shared/shadcn/column-canvas/STICKY_COLUMNS_PLAN.md +84 -0
  457. package/src/shared/shadcn/column-canvas/column-canvas-body.svelte +53 -0
  458. package/src/shared/shadcn/column-canvas/column-canvas-close.svelte +43 -0
  459. package/src/shared/shadcn/column-canvas/column-canvas-collapsed-column.svelte +57 -0
  460. package/src/shared/shadcn/column-canvas/column-canvas-column-context.svelte.ts +31 -0
  461. package/src/shared/shadcn/column-canvas/column-canvas-column.svelte +609 -0
  462. package/src/shared/shadcn/column-canvas/column-canvas-controller.svelte.ts +701 -0
  463. package/src/shared/shadcn/column-canvas/column-canvas-count.svelte +33 -0
  464. package/src/shared/shadcn/column-canvas/column-canvas-header-actions.svelte +27 -0
  465. package/src/shared/shadcn/column-canvas/column-canvas-header.svelte +27 -0
  466. package/src/shared/shadcn/column-canvas/column-canvas-item.svelte +32 -0
  467. package/src/shared/shadcn/column-canvas/column-canvas-layout.ts +156 -0
  468. package/src/shared/shadcn/column-canvas/column-canvas-persistence.ts +165 -0
  469. package/src/shared/shadcn/column-canvas/column-canvas-title.svelte +31 -0
  470. package/src/shared/shadcn/column-canvas/column-canvas-toggle.svelte +115 -0
  471. package/src/shared/shadcn/column-canvas/column-canvas-types.ts +20 -0
  472. package/src/shared/shadcn/column-canvas/column-canvas.css +498 -0
  473. package/src/shared/shadcn/column-canvas/column-canvas.demo-data.ts +192 -0
  474. package/src/shared/shadcn/column-canvas/column-canvas.docs.md +530 -0
  475. package/src/shared/shadcn/column-canvas/column-canvas.showcase-data.ts +606 -0
  476. package/src/shared/shadcn/column-canvas/column-canvas.svelte +997 -0
  477. package/src/shared/shadcn/column-canvas/column-canvas.tokens.css +48 -0
  478. package/src/shared/shadcn/column-canvas/column-canvas.tokens.ts +30 -0
  479. package/src/shared/shadcn/column-canvas/context.svelte.ts +70 -0
  480. package/src/shared/shadcn/column-canvas/index.ts +96 -0
  481. package/src/shared/shadcn/command/command-dialog.svelte +48 -0
  482. package/src/shared/shadcn/command/command-empty.svelte +18 -0
  483. package/src/shared/shadcn/command/command-group.svelte +35 -0
  484. package/src/shared/shadcn/command/command-input.svelte +34 -0
  485. package/src/shared/shadcn/command/command-item.svelte +27 -0
  486. package/src/shared/shadcn/command/command-link-item.svelte +18 -0
  487. package/src/shared/shadcn/command/command-list.svelte +18 -0
  488. package/src/shared/shadcn/command/command-loading.svelte +8 -0
  489. package/src/shared/shadcn/command/command-separator.svelte +18 -0
  490. package/src/shared/shadcn/command/command-shortcut.svelte +22 -0
  491. package/src/shared/shadcn/command/command.docs-body.md +79 -0
  492. package/src/shared/shadcn/command/command.docs.md +85 -0
  493. package/src/shared/shadcn/command/command.provenance.json +86 -0
  494. package/src/shared/shadcn/command/command.svelte +536 -0
  495. package/src/shared/shadcn/command/command.tokens.css +13 -0
  496. package/src/shared/shadcn/command/command.tokens.ts +10 -0
  497. package/src/shared/shadcn/command/examples/preview.svelte +50 -0
  498. package/src/shared/shadcn/command/index.ts +39 -0
  499. package/src/shared/shadcn/command-view/command-view-empty.svelte +13 -0
  500. package/src/shared/shadcn/command-view/command-view-filters.svelte +44 -0
  501. package/src/shared/shadcn/command-view/command-view-footer.svelte +13 -0
  502. package/src/shared/shadcn/command-view/command-view-group.svelte +8 -0
  503. package/src/shared/shadcn/command-view/command-view-input.svelte +41 -0
  504. package/src/shared/shadcn/command-view/command-view-item-description.svelte +22 -0
  505. package/src/shared/shadcn/command-view/command-view-item-icon.svelte +22 -0
  506. package/src/shared/shadcn/command-view/command-view-item-label.svelte +22 -0
  507. package/src/shared/shadcn/command-view/command-view-item.svelte +21 -0
  508. package/src/shared/shadcn/command-view/command-view-list.svelte +36 -0
  509. package/src/shared/shadcn/command-view/command-view-shortcut.svelte +22 -0
  510. package/src/shared/shadcn/command-view/command-view.css +210 -0
  511. package/src/shared/shadcn/command-view/command-view.docs.md +60 -0
  512. package/src/shared/shadcn/command-view/command-view.provenance.json +8 -0
  513. package/src/shared/shadcn/command-view/command-view.svelte +30 -0
  514. package/src/shared/shadcn/command-view/command-view.tokens.css +21 -0
  515. package/src/shared/shadcn/command-view/command-view.tokens.ts +20 -0
  516. package/src/shared/shadcn/command-view/index.ts +46 -0
  517. package/src/shared/shadcn/context-menu/context-menu-checkbox-item.svelte +704 -0
  518. package/src/shared/shadcn/context-menu/context-menu-content.svelte +42 -0
  519. package/src/shared/shadcn/context-menu/context-menu-group-heading.svelte +22 -0
  520. package/src/shared/shadcn/context-menu/context-menu-group.svelte +12 -0
  521. package/src/shared/shadcn/context-menu/context-menu-item.svelte +25 -0
  522. package/src/shared/shadcn/context-menu/context-menu-label.svelte +26 -0
  523. package/src/shared/shadcn/context-menu/context-menu-portal.svelte +7 -0
  524. package/src/shared/shadcn/context-menu/context-menu-radio-group.svelte +18 -0
  525. package/src/shared/shadcn/context-menu/context-menu-radio-item.svelte +38 -0
  526. package/src/shared/shadcn/context-menu/context-menu-separator.svelte +18 -0
  527. package/src/shared/shadcn/context-menu/context-menu-shortcut.svelte +22 -0
  528. package/src/shared/shadcn/context-menu/context-menu-sub-content.svelte +18 -0
  529. package/src/shared/shadcn/context-menu/context-menu-sub-trigger.svelte +36 -0
  530. package/src/shared/shadcn/context-menu/context-menu-sub.svelte +8 -0
  531. package/src/shared/shadcn/context-menu/context-menu-trigger.svelte +32 -0
  532. package/src/shared/shadcn/context-menu/context-menu.docs-body.md +25 -0
  533. package/src/shared/shadcn/context-menu/context-menu.docs.md +31 -0
  534. package/src/shared/shadcn/context-menu/context-menu.provenance.json +106 -0
  535. package/src/shared/shadcn/context-menu/context-menu.svelte +17 -0
  536. package/src/shared/shadcn/context-menu/context-menu.tokens.css +7 -0
  537. package/src/shared/shadcn/context-menu/context-menu.tokens.ts +10 -0
  538. package/src/shared/shadcn/context-menu/index.ts +57 -0
  539. package/src/shared/shadcn/dialog/dialog-close.svelte +16 -0
  540. package/src/shared/shadcn/dialog/dialog-content.svelte +539 -0
  541. package/src/shared/shadcn/dialog/dialog-description.svelte +18 -0
  542. package/src/shared/shadcn/dialog/dialog-footer.svelte +34 -0
  543. package/src/shared/shadcn/dialog/dialog-header.svelte +22 -0
  544. package/src/shared/shadcn/dialog/dialog-overlay.svelte +18 -0
  545. package/src/shared/shadcn/dialog/dialog-portal.svelte +7 -0
  546. package/src/shared/shadcn/dialog/dialog-title.svelte +18 -0
  547. package/src/shared/shadcn/dialog/dialog-trigger.svelte +16 -0
  548. package/src/shared/shadcn/dialog/dialog.docs-body.md +101 -0
  549. package/src/shared/shadcn/dialog/dialog.docs.md +107 -0
  550. package/src/shared/shadcn/dialog/dialog.provenance.json +76 -0
  551. package/src/shared/shadcn/dialog/dialog.svelte +8 -0
  552. package/src/shared/shadcn/dialog/dialog.tokens.css +14 -0
  553. package/src/shared/shadcn/dialog/dialog.tokens.ts +11 -0
  554. package/src/shared/shadcn/dialog/examples/custom-close-button.svelte +36 -0
  555. package/src/shared/shadcn/dialog/examples/preview.svelte +46 -0
  556. package/src/shared/shadcn/dialog/index.ts +35 -0
  557. package/src/shared/shadcn/drawer/drawer-close.svelte +8 -0
  558. package/src/shared/shadcn/drawer/drawer-content.svelte +440 -0
  559. package/src/shared/shadcn/drawer/drawer-description.svelte +18 -0
  560. package/src/shared/shadcn/drawer/drawer-footer.svelte +22 -0
  561. package/src/shared/shadcn/drawer/drawer-header.svelte +22 -0
  562. package/src/shared/shadcn/drawer/drawer-nested.svelte +17 -0
  563. package/src/shared/shadcn/drawer/drawer-overlay.svelte +18 -0
  564. package/src/shared/shadcn/drawer/drawer-portal.svelte +7 -0
  565. package/src/shared/shadcn/drawer/drawer-title.svelte +18 -0
  566. package/src/shared/shadcn/drawer/drawer-trigger.svelte +8 -0
  567. package/src/shared/shadcn/drawer/drawer.docs-body.md +92 -0
  568. package/src/shared/shadcn/drawer/drawer.docs.md +98 -0
  569. package/src/shared/shadcn/drawer/drawer.provenance.json +86 -0
  570. package/src/shared/shadcn/drawer/drawer.svelte +17 -0
  571. package/src/shared/shadcn/drawer/drawer.tokens.css +7 -0
  572. package/src/shared/shadcn/drawer/drawer.tokens.ts +10 -0
  573. package/src/shared/shadcn/drawer/examples/preview.svelte +71 -0
  574. package/src/shared/shadcn/drawer/examples/sides.svelte +50 -0
  575. package/src/shared/shadcn/drawer/index.ts +40 -0
  576. package/src/shared/shadcn/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  577. package/src/shared/shadcn/dropdown-menu/dropdown-menu-checkbox-item.svelte +735 -0
  578. package/src/shared/shadcn/dropdown-menu/dropdown-menu-content.svelte +47 -0
  579. package/src/shared/shadcn/dropdown-menu/dropdown-menu-group-heading.svelte +23 -0
  580. package/src/shared/shadcn/dropdown-menu/dropdown-menu-group.svelte +14 -0
  581. package/src/shared/shadcn/dropdown-menu/dropdown-menu-item.svelte +25 -0
  582. package/src/shared/shadcn/dropdown-menu/dropdown-menu-label.svelte +26 -0
  583. package/src/shared/shadcn/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  584. package/src/shared/shadcn/dropdown-menu/dropdown-menu-radio-group.svelte +16 -0
  585. package/src/shared/shadcn/dropdown-menu/dropdown-menu-radio-item.svelte +34 -0
  586. package/src/shared/shadcn/dropdown-menu/dropdown-menu-separator.svelte +18 -0
  587. package/src/shared/shadcn/dropdown-menu/dropdown-menu-shortcut.svelte +22 -0
  588. package/src/shared/shadcn/dropdown-menu/dropdown-menu-sub-content.svelte +18 -0
  589. package/src/shared/shadcn/dropdown-menu/dropdown-menu-sub-trigger.svelte +27 -0
  590. package/src/shared/shadcn/dropdown-menu/dropdown-menu-sub.svelte +10 -0
  591. package/src/shared/shadcn/dropdown-menu/dropdown-menu-trigger.svelte +28 -0
  592. package/src/shared/shadcn/dropdown-menu/dropdown-menu.docs-body.md +189 -0
  593. package/src/shared/shadcn/dropdown-menu/dropdown-menu.docs.md +195 -0
  594. package/src/shared/shadcn/dropdown-menu/dropdown-menu.provenance.json +104 -0
  595. package/src/shared/shadcn/dropdown-menu/dropdown-menu.svelte +17 -0
  596. package/src/shared/shadcn/dropdown-menu/dropdown-menu.tokens.css +13 -0
  597. package/src/shared/shadcn/dropdown-menu/dropdown-menu.tokens.ts +10 -0
  598. package/src/shared/shadcn/dropdown-menu/examples/checkboxes.svelte +33 -0
  599. package/src/shared/shadcn/dropdown-menu/examples/dialog.svelte +95 -0
  600. package/src/shared/shadcn/dropdown-menu/examples/preview.svelte +61 -0
  601. package/src/shared/shadcn/dropdown-menu/examples/radio-group.svelte +27 -0
  602. package/src/shared/shadcn/dropdown-menu/index.ts +59 -0
  603. package/src/shared/shadcn/empty/empty-content.svelte +22 -0
  604. package/src/shared/shadcn/empty/empty-description.svelte +22 -0
  605. package/src/shared/shadcn/empty/empty-header.svelte +22 -0
  606. package/src/shared/shadcn/empty/empty-media.svelte +39 -0
  607. package/src/shared/shadcn/empty/empty-title.svelte +22 -0
  608. package/src/shared/shadcn/empty/empty.docs-body.md +103 -0
  609. package/src/shared/shadcn/empty/empty.docs.md +109 -0
  610. package/src/shared/shadcn/empty/empty.provenance.json +76 -0
  611. package/src/shared/shadcn/empty/empty.svelte +257 -0
  612. package/src/shared/shadcn/empty/empty.tokens.css +13 -0
  613. package/src/shared/shadcn/empty/empty.tokens.ts +9 -0
  614. package/src/shared/shadcn/empty/examples/background.svelte +28 -0
  615. package/src/shared/shadcn/empty/examples/outline.svelte +22 -0
  616. package/src/shared/shadcn/empty/examples/preview.svelte +32 -0
  617. package/src/shared/shadcn/empty/index.ts +24 -0
  618. package/src/shared/shadcn/field/examples/checkbox.svelte +64 -0
  619. package/src/shared/shadcn/field/examples/field-group.svelte +48 -0
  620. package/src/shared/shadcn/field/examples/fieldset.svelte +31 -0
  621. package/src/shared/shadcn/field/examples/input.svelte +27 -0
  622. package/src/shared/shadcn/field/examples/preview.svelte +136 -0
  623. package/src/shared/shadcn/field/examples/responsive-layout.svelte +50 -0
  624. package/src/shared/shadcn/field/examples/select.svelte +43 -0
  625. package/src/shared/shadcn/field/examples/switch.svelte +19 -0
  626. package/src/shared/shadcn/field/examples/textarea.svelte +24 -0
  627. package/src/shared/shadcn/field/field-content.svelte +22 -0
  628. package/src/shared/shadcn/field/field-description.svelte +22 -0
  629. package/src/shared/shadcn/field/field-error.svelte +66 -0
  630. package/src/shared/shadcn/field/field-group.svelte +22 -0
  631. package/src/shared/shadcn/field/field-label.svelte +22 -0
  632. package/src/shared/shadcn/field/field-legend.svelte +26 -0
  633. package/src/shared/shadcn/field/field-separator.svelte +42 -0
  634. package/src/shared/shadcn/field/field-set.svelte +22 -0
  635. package/src/shared/shadcn/field/field-title.svelte +22 -0
  636. package/src/shared/shadcn/field/field.docs-body.md +412 -0
  637. package/src/shared/shadcn/field/field.docs.md +418 -0
  638. package/src/shared/shadcn/field/field.provenance.json +102 -0
  639. package/src/shared/shadcn/field/field.svelte +540 -0
  640. package/src/shared/shadcn/field/field.tokens.css +13 -0
  641. package/src/shared/shadcn/field/field.tokens.ts +9 -0
  642. package/src/shared/shadcn/field/index.ts +35 -0
  643. package/src/shared/shadcn/hover-card/examples/basic.svelte +12 -0
  644. package/src/shared/shadcn/hover-card/hover-card-content.svelte +348 -0
  645. package/src/shared/shadcn/hover-card/hover-card-portal.svelte +7 -0
  646. package/src/shared/shadcn/hover-card/hover-card-trigger.svelte +26 -0
  647. package/src/shared/shadcn/hover-card/hover-card.docs-body.md +22 -0
  648. package/src/shared/shadcn/hover-card/hover-card.docs.md +28 -0
  649. package/src/shared/shadcn/hover-card/hover-card.provenance.json +58 -0
  650. package/src/shared/shadcn/hover-card/hover-card.svelte +15 -0
  651. package/src/shared/shadcn/hover-card/hover-card.tokens.css +14 -0
  652. package/src/shared/shadcn/hover-card/hover-card.tokens.ts +11 -0
  653. package/src/shared/shadcn/hover-card/index.ts +20 -0
  654. package/src/shared/shadcn/input/examples/default.svelte +7 -0
  655. package/src/shared/shadcn/input/examples/disabled.svelte +7 -0
  656. package/src/shared/shadcn/input/examples/file.svelte +11 -0
  657. package/src/shared/shadcn/input/examples/preview.svelte +7 -0
  658. package/src/shared/shadcn/input/examples/with-button.svelte +11 -0
  659. package/src/shared/shadcn/input/examples/with-label.svelte +13 -0
  660. package/src/shared/shadcn/input/index.ts +11 -0
  661. package/src/shared/shadcn/input/input.docs-body.md +83 -0
  662. package/src/shared/shadcn/input/input.docs.md +89 -0
  663. package/src/shared/shadcn/input/input.provenance.json +47 -0
  664. package/src/shared/shadcn/input/input.svelte +398 -0
  665. package/src/shared/shadcn/input/input.tokens.css +13 -0
  666. package/src/shared/shadcn/input/input.tokens.ts +9 -0
  667. package/src/shared/shadcn/input-group/examples/custom-input.svelte +20 -0
  668. package/src/shared/shadcn/input-group/examples/dropdown.svelte +58 -0
  669. package/src/shared/shadcn/input-group/examples/icon.svelte +42 -0
  670. package/src/shared/shadcn/input-group/examples/label.svelte +43 -0
  671. package/src/shared/shadcn/input-group/examples/preview.svelte +95 -0
  672. package/src/shared/shadcn/input-group/examples/spinner.svelte +40 -0
  673. package/src/shared/shadcn/input-group/examples/text.svelte +40 -0
  674. package/src/shared/shadcn/input-group/examples/textarea.svelte +37 -0
  675. package/src/shared/shadcn/input-group/examples/tooltip.svelte +79 -0
  676. package/src/shared/shadcn/input-group/index.ts +27 -0
  677. package/src/shared/shadcn/input-group/input-group-addon.svelte +51 -0
  678. package/src/shared/shadcn/input-group/input-group-button.svelte +46 -0
  679. package/src/shared/shadcn/input-group/input-group-input.svelte +20 -0
  680. package/src/shared/shadcn/input-group/input-group-text.svelte +22 -0
  681. package/src/shared/shadcn/input-group/input-group-textarea.svelte +20 -0
  682. package/src/shared/shadcn/input-group/input-group.docs-body.md +431 -0
  683. package/src/shared/shadcn/input-group/input-group.docs.md +437 -0
  684. package/src/shared/shadcn/input-group/input-group.provenance.json +81 -0
  685. package/src/shared/shadcn/input-group/input-group.svelte +628 -0
  686. package/src/shared/shadcn/input-group/input-group.tokens.css +13 -0
  687. package/src/shared/shadcn/input-group/input-group.tokens.ts +10 -0
  688. package/src/shared/shadcn/label/examples/preview.svelte +13 -0
  689. package/src/shared/shadcn/label/index.ts +9 -0
  690. package/src/shared/shadcn/label/label.docs-body.md +17 -0
  691. package/src/shared/shadcn/label/label.docs.md +23 -0
  692. package/src/shared/shadcn/label/label.provenance.json +40 -0
  693. package/src/shared/shadcn/label/label.svelte +169 -0
  694. package/src/shared/shadcn/label/label.tokens.css +13 -0
  695. package/src/shared/shadcn/label/label.tokens.ts +9 -0
  696. package/src/shared/shadcn/pagination/examples/preview.svelte +34 -0
  697. package/src/shared/shadcn/pagination/index.ts +36 -0
  698. package/src/shared/shadcn/pagination/pagination-content.svelte +22 -0
  699. package/src/shared/shadcn/pagination/pagination-ellipsis.svelte +29 -0
  700. package/src/shared/shadcn/pagination/pagination-item.svelte +14 -0
  701. package/src/shared/shadcn/pagination/pagination-link.svelte +40 -0
  702. package/src/shared/shadcn/pagination/pagination-next-button.svelte +39 -0
  703. package/src/shared/shadcn/pagination/pagination-next.svelte +25 -0
  704. package/src/shared/shadcn/pagination/pagination-prev-button.svelte +39 -0
  705. package/src/shared/shadcn/pagination/pagination-previous.svelte +25 -0
  706. package/src/shared/shadcn/pagination/pagination.docs-body.md +39 -0
  707. package/src/shared/shadcn/pagination/pagination.docs.md +45 -0
  708. package/src/shared/shadcn/pagination/pagination.provenance.json +72 -0
  709. package/src/shared/shadcn/pagination/pagination.svelte +215 -0
  710. package/src/shared/shadcn/pagination/pagination.tokens.css +13 -0
  711. package/src/shared/shadcn/pagination/pagination.tokens.ts +10 -0
  712. package/src/shared/shadcn/popover/examples/preview.svelte +42 -0
  713. package/src/shared/shadcn/popover/index.ts +30 -0
  714. package/src/shared/shadcn/popover/popover-close.svelte +8 -0
  715. package/src/shared/shadcn/popover/popover-content.svelte +376 -0
  716. package/src/shared/shadcn/popover/popover-description.svelte +22 -0
  717. package/src/shared/shadcn/popover/popover-header.svelte +22 -0
  718. package/src/shared/shadcn/popover/popover-portal.svelte +7 -0
  719. package/src/shared/shadcn/popover/popover-title.svelte +22 -0
  720. package/src/shared/shadcn/popover/popover-trigger.svelte +32 -0
  721. package/src/shared/shadcn/popover/popover.docs-body.md +20 -0
  722. package/src/shared/shadcn/popover/popover.docs.md +26 -0
  723. package/src/shared/shadcn/popover/popover.provenance.json +68 -0
  724. package/src/shared/shadcn/popover/popover.svelte +15 -0
  725. package/src/shared/shadcn/popover/popover.tokens.css +17 -0
  726. package/src/shared/shadcn/popover/popover.tokens.ts +13 -0
  727. package/src/shared/shadcn/progress/examples/preview.svelte +15 -0
  728. package/src/shared/shadcn/progress/index.ts +9 -0
  729. package/src/shared/shadcn/progress/progress.docs-body.md +17 -0
  730. package/src/shared/shadcn/progress/progress.docs.md +23 -0
  731. package/src/shared/shadcn/progress/progress.provenance.json +40 -0
  732. package/src/shared/shadcn/progress/progress.svelte +173 -0
  733. package/src/shared/shadcn/progress/progress.tokens.css +10 -0
  734. package/src/shared/shadcn/progress/progress.tokens.ts +10 -0
  735. package/src/shared/shadcn/resizable/examples/handle.svelte +22 -0
  736. package/src/shared/shadcn/resizable/examples/preview.svelte +29 -0
  737. package/src/shared/shadcn/resizable/examples/vertical.svelte +22 -0
  738. package/src/shared/shadcn/resizable/index.ts +18 -0
  739. package/src/shared/shadcn/resizable/resizable-handle.svelte +401 -0
  740. package/src/shared/shadcn/resizable/resizable-pane-group.svelte +22 -0
  741. package/src/shared/shadcn/resizable/resizable-pane.svelte +23 -0
  742. package/src/shared/shadcn/resizable/resizable.docs-body.md +82 -0
  743. package/src/shared/shadcn/resizable/resizable.docs.md +88 -0
  744. package/src/shared/shadcn/resizable/resizable.provenance.json +44 -0
  745. package/src/shared/shadcn/resizable/resizable.tokens.css +17 -0
  746. package/src/shared/shadcn/resizable/resizable.tokens.ts +14 -0
  747. package/src/shared/shadcn/scroll-area/ScrollArea.local-example-sources.ts +30 -0
  748. package/src/shared/shadcn/scroll-area/ScrollAreaBehaviorFixture.svelte +152 -0
  749. package/src/shared/shadcn/scroll-area/ScrollAreaScrollableList.svelte +49 -0
  750. package/src/shared/shadcn/scroll-area/examples/horizontal-scrolling.svelte +52 -0
  751. package/src/shared/shadcn/scroll-area/examples/preview.svelte +22 -0
  752. package/src/shared/shadcn/scroll-area/index.ts +20 -0
  753. package/src/shared/shadcn/scroll-area/scroll-area-model.ts +122 -0
  754. package/src/shared/shadcn/scroll-area/scroll-area-overlay-scrollbar.svelte +362 -0
  755. package/src/shared/shadcn/scroll-area/scroll-area-scrollbar.svelte +30 -0
  756. package/src/shared/shadcn/scroll-area/scroll-area.docs-body.md +81 -0
  757. package/src/shared/shadcn/scroll-area/scroll-area.docs.md +87 -0
  758. package/src/shared/shadcn/scroll-area/scroll-area.provenance.json +44 -0
  759. package/src/shared/shadcn/scroll-area/scroll-area.svelte +544 -0
  760. package/src/shared/shadcn/scroll-area/scroll-area.tokens.css +13 -0
  761. package/src/shared/shadcn/scroll-area/scroll-area.tokens.ts +10 -0
  762. package/src/shared/shadcn/select/examples/scrollable.svelte +62 -0
  763. package/src/shared/shadcn/select/index.ts +39 -0
  764. package/src/shared/shadcn/select/select-content.svelte +764 -0
  765. package/src/shared/shadcn/select/select-group-heading.svelte +22 -0
  766. package/src/shared/shadcn/select/select-group.svelte +18 -0
  767. package/src/shared/shadcn/select/select-item.svelte +47 -0
  768. package/src/shared/shadcn/select/select-label.svelte +22 -0
  769. package/src/shared/shadcn/select/select-portal.svelte +7 -0
  770. package/src/shared/shadcn/select/select-scroll-down-button.svelte +22 -0
  771. package/src/shared/shadcn/select/select-scroll-up-button.svelte +22 -0
  772. package/src/shared/shadcn/select/select-separator.svelte +19 -0
  773. package/src/shared/shadcn/select/select-trigger.svelte +46 -0
  774. package/src/shared/shadcn/select/select.docs-body.md +92 -0
  775. package/src/shared/shadcn/select/select.docs.md +98 -0
  776. package/src/shared/shadcn/select/select.provenance.json +86 -0
  777. package/src/shared/shadcn/select/select.svelte +18 -0
  778. package/src/shared/shadcn/select/select.tokens.css +13 -0
  779. package/src/shared/shadcn/select/select.tokens.ts +10 -0
  780. package/src/shared/shadcn/separator/examples/preview.svelte +22 -0
  781. package/src/shared/shadcn/separator/index.ts +14 -0
  782. package/src/shared/shadcn/separator/separator.docs-body.md +17 -0
  783. package/src/shared/shadcn/separator/separator.docs.md +23 -0
  784. package/src/shared/shadcn/separator/separator.provenance.json +40 -0
  785. package/src/shared/shadcn/separator/separator.svelte +150 -0
  786. package/src/shared/shadcn/separator/separator.tokens.css +13 -0
  787. package/src/shared/shadcn/separator/separator.tokens.ts +10 -0
  788. package/src/shared/shadcn/sheet/examples/preview.svelte +39 -0
  789. package/src/shared/shadcn/sheet/index.ts +36 -0
  790. package/src/shared/shadcn/sheet/sheet-close.svelte +8 -0
  791. package/src/shared/shadcn/sheet/sheet-content.svelte +593 -0
  792. package/src/shared/shadcn/sheet/sheet-description.svelte +18 -0
  793. package/src/shared/shadcn/sheet/sheet-footer.svelte +22 -0
  794. package/src/shared/shadcn/sheet/sheet-header.svelte +22 -0
  795. package/src/shared/shadcn/sheet/sheet-overlay.svelte +18 -0
  796. package/src/shared/shadcn/sheet/sheet-portal.svelte +7 -0
  797. package/src/shared/shadcn/sheet/sheet-title.svelte +18 -0
  798. package/src/shared/shadcn/sheet/sheet-trigger.svelte +8 -0
  799. package/src/shared/shadcn/sheet/sheet.docs-body.md +53 -0
  800. package/src/shared/shadcn/sheet/sheet.docs.md +59 -0
  801. package/src/shared/shadcn/sheet/sheet.provenance.json +76 -0
  802. package/src/shared/shadcn/sheet/sheet.svelte +8 -0
  803. package/src/shared/shadcn/sheet/sheet.tokens.css +13 -0
  804. package/src/shared/shadcn/sheet/sheet.tokens.ts +9 -0
  805. package/src/shared/shadcn/sidebar/constants.ts +6 -0
  806. package/src/shared/shadcn/sidebar/context.svelte.ts +81 -0
  807. package/src/shared/shadcn/sidebar/examples/collapsible-sidebar-group.svelte +50 -0
  808. package/src/shared/shadcn/sidebar/examples/collapsible-sidebar-menu.svelte +179 -0
  809. package/src/shared/shadcn/sidebar/examples/controlled-sidebar.svelte +81 -0
  810. package/src/shared/shadcn/sidebar/examples/dropdownmenu.svelte +86 -0
  811. package/src/shared/shadcn/sidebar/examples/sidebar-footer.svelte +52 -0
  812. package/src/shared/shadcn/sidebar/examples/sidebar-group.svelte +33 -0
  813. package/src/shared/shadcn/sidebar/examples/sidebar-groupaction.svelte +60 -0
  814. package/src/shared/shadcn/sidebar/examples/sidebar-header.svelte +44 -0
  815. package/src/shared/shadcn/sidebar/examples/sidebar-menu.svelte +63 -0
  816. package/src/shared/shadcn/sidebar/examples/sidebar-menubadge.svelte +72 -0
  817. package/src/shared/shadcn/sidebar/examples/sidebar-menusub.svelte +170 -0
  818. package/src/shared/shadcn/sidebar/examples/your-first-sidebar.svelte +70 -0
  819. package/src/shared/shadcn/sidebar/index.ts +75 -0
  820. package/src/shared/shadcn/sidebar/sidebar-content.svelte +23 -0
  821. package/src/shared/shadcn/sidebar/sidebar-footer.svelte +23 -0
  822. package/src/shared/shadcn/sidebar/sidebar-group-action.svelte +38 -0
  823. package/src/shared/shadcn/sidebar/sidebar-group-content.svelte +23 -0
  824. package/src/shared/shadcn/sidebar/sidebar-group-label.svelte +38 -0
  825. package/src/shared/shadcn/sidebar/sidebar-group.svelte +23 -0
  826. package/src/shared/shadcn/sidebar/sidebar-header.svelte +23 -0
  827. package/src/shared/shadcn/sidebar/sidebar-input.svelte +21 -0
  828. package/src/shared/shadcn/sidebar/sidebar-inset.svelte +22 -0
  829. package/src/shared/shadcn/sidebar/sidebar-menu-action.svelte +41 -0
  830. package/src/shared/shadcn/sidebar/sidebar-menu-badge.svelte +23 -0
  831. package/src/shared/shadcn/sidebar/sidebar-menu-button.svelte +111 -0
  832. package/src/shared/shadcn/sidebar/sidebar-menu-item.svelte +23 -0
  833. package/src/shared/shadcn/sidebar/sidebar-menu-skeleton.svelte +43 -0
  834. package/src/shared/shadcn/sidebar/sidebar-menu-sub-button.svelte +44 -0
  835. package/src/shared/shadcn/sidebar/sidebar-menu-sub-item.svelte +23 -0
  836. package/src/shared/shadcn/sidebar/sidebar-menu-sub.svelte +23 -0
  837. package/src/shared/shadcn/sidebar/sidebar-menu.svelte +26 -0
  838. package/src/shared/shadcn/sidebar/sidebar-provider.svelte +52 -0
  839. package/src/shared/shadcn/sidebar/sidebar-rail.svelte +33 -0
  840. package/src/shared/shadcn/sidebar/sidebar-separator.svelte +19 -0
  841. package/src/shared/shadcn/sidebar/sidebar-trigger.svelte +36 -0
  842. package/src/shared/shadcn/sidebar/sidebar.docs-body.md +1634 -0
  843. package/src/shared/shadcn/sidebar/sidebar.docs.md +1648 -0
  844. package/src/shared/shadcn/sidebar/sidebar.provenance.json +149 -0
  845. package/src/shared/shadcn/sidebar/sidebar.svelte +1431 -0
  846. package/src/shared/shadcn/sidebar/sidebar.tokens.ts +22 -0
  847. package/src/shared/shadcn/skeleton/examples/card.svelte +13 -0
  848. package/src/shared/shadcn/skeleton/examples/preview.svelte +13 -0
  849. package/src/shared/shadcn/skeleton/index.ts +9 -0
  850. package/src/shared/shadcn/skeleton/skeleton.docs-body.md +35 -0
  851. package/src/shared/shadcn/skeleton/skeleton.docs.md +41 -0
  852. package/src/shared/shadcn/skeleton/skeleton.provenance.json +40 -0
  853. package/src/shared/shadcn/skeleton/skeleton.svelte +131 -0
  854. package/src/shared/shadcn/skeleton/skeleton.tokens.css +13 -0
  855. package/src/shared/shadcn/skeleton/skeleton.tokens.ts +10 -0
  856. package/src/shared/shadcn/slider/index.ts +9 -0
  857. package/src/shared/shadcn/slider/slider.docs-body.md +18 -0
  858. package/src/shared/shadcn/slider/slider.docs.md +24 -0
  859. package/src/shared/shadcn/slider/slider.provenance.json +46 -0
  860. package/src/shared/shadcn/slider/slider.svelte +399 -0
  861. package/src/shared/shadcn/slider/slider.tokens.css +11 -0
  862. package/src/shared/shadcn/slider/slider.tokens.ts +11 -0
  863. package/src/shared/shadcn/spinner/examples/badge.svelte +21 -0
  864. package/src/shared/shadcn/spinner/examples/button.svelte +21 -0
  865. package/src/shared/shadcn/spinner/examples/color.svelte +13 -0
  866. package/src/shared/shadcn/spinner/examples/customization.svelte +18 -0
  867. package/src/shared/shadcn/spinner/examples/empty.svelte +22 -0
  868. package/src/shared/shadcn/spinner/examples/input-group.svelte +26 -0
  869. package/src/shared/shadcn/spinner/examples/size.svelte +12 -0
  870. package/src/shared/shadcn/spinner/index.ts +3 -0
  871. package/src/shared/shadcn/spinner/spinner.docs-body.md +189 -0
  872. package/src/shared/shadcn/spinner/spinner.docs.md +195 -0
  873. package/src/shared/shadcn/spinner/spinner.provenance.json +59 -0
  874. package/src/shared/shadcn/spinner/spinner.svelte +50 -0
  875. package/src/shared/shadcn/spinner/spinner.tokens.css +13 -0
  876. package/src/shared/shadcn/spinner/spinner.tokens.ts +10 -0
  877. package/src/shared/shadcn/swipe-item/index.ts +30 -0
  878. package/src/shared/shadcn/swipe-item/swipe-item-action.svelte +40 -0
  879. package/src/shared/shadcn/swipe-item/swipe-item-actions.svelte +68 -0
  880. package/src/shared/shadcn/swipe-item/swipe-item-content.svelte +32 -0
  881. package/src/shared/shadcn/swipe-item/swipe-item-context.svelte.ts +612 -0
  882. package/src/shared/shadcn/swipe-item/swipe-item-gesture.ts +137 -0
  883. package/src/shared/shadcn/swipe-item/swipe-item-trigger.svelte +44 -0
  884. package/src/shared/shadcn/swipe-item/swipe-item.css +80 -0
  885. package/src/shared/shadcn/swipe-item/swipe-item.docs.md +75 -0
  886. package/src/shared/shadcn/swipe-item/swipe-item.svelte +76 -0
  887. package/src/shared/shadcn/swipe-item/swipe-item.tokens.css +15 -0
  888. package/src/shared/shadcn/swipe-item/swipe-item.tokens.ts +14 -0
  889. package/src/shared/shadcn/swipe-item/types.ts +31 -0
  890. package/src/shared/shadcn/switch/examples/preview.svelte +11 -0
  891. package/src/shared/shadcn/switch/index.ts +9 -0
  892. package/src/shared/shadcn/switch/switch.docs-body.md +17 -0
  893. package/src/shared/shadcn/switch/switch.docs.md +23 -0
  894. package/src/shared/shadcn/switch/switch.provenance.json +40 -0
  895. package/src/shared/shadcn/switch/switch.svelte +542 -0
  896. package/src/shared/shadcn/switch/switch.tokens.css +13 -0
  897. package/src/shared/shadcn/switch/switch.tokens.ts +10 -0
  898. package/src/shared/shadcn/table/examples/preview.svelte +78 -0
  899. package/src/shared/shadcn/table/index.ts +30 -0
  900. package/src/shared/shadcn/table/table-body.svelte +22 -0
  901. package/src/shared/shadcn/table/table-caption.svelte +22 -0
  902. package/src/shared/shadcn/table/table-cell.svelte +22 -0
  903. package/src/shared/shadcn/table/table-footer.svelte +22 -0
  904. package/src/shared/shadcn/table/table-head.svelte +22 -0
  905. package/src/shared/shadcn/table/table-header.svelte +22 -0
  906. package/src/shared/shadcn/table/table-row.svelte +22 -0
  907. package/src/shared/shadcn/table/table.docs-body.md +43 -0
  908. package/src/shared/shadcn/table/table.docs.md +49 -0
  909. package/src/shared/shadcn/table/table.provenance.json +68 -0
  910. package/src/shared/shadcn/table/table.svelte +249 -0
  911. package/src/shared/shadcn/table/table.tokens.css +13 -0
  912. package/src/shared/shadcn/table/table.tokens.ts +9 -0
  913. package/src/shared/shadcn/tabs/examples/preview.svelte +64 -0
  914. package/src/shared/shadcn/tabs/index.ts +23 -0
  915. package/src/shared/shadcn/tabs/tabs-content.svelte +18 -0
  916. package/src/shared/shadcn/tabs/tabs-list.svelte +35 -0
  917. package/src/shared/shadcn/tabs/tabs-trigger.svelte +18 -0
  918. package/src/shared/shadcn/tabs/tabs.docs-body.md +26 -0
  919. package/src/shared/shadcn/tabs/tabs.docs.md +32 -0
  920. package/src/shared/shadcn/tabs/tabs.provenance.json +52 -0
  921. package/src/shared/shadcn/tabs/tabs.svelte +748 -0
  922. package/src/shared/shadcn/tabs/tabs.tokens.css +13 -0
  923. package/src/shared/shadcn/tabs/tabs.tokens.ts +9 -0
  924. package/src/shared/shadcn/textarea/examples/default.svelte +7 -0
  925. package/src/shared/shadcn/textarea/examples/disabled.svelte +7 -0
  926. package/src/shared/shadcn/textarea/examples/preview.svelte +7 -0
  927. package/src/shared/shadcn/textarea/examples/with-button.svelte +11 -0
  928. package/src/shared/shadcn/textarea/examples/with-label.svelte +11 -0
  929. package/src/shared/shadcn/textarea/examples/with-text.svelte +14 -0
  930. package/src/shared/shadcn/textarea/index.ts +9 -0
  931. package/src/shared/shadcn/textarea/textarea.docs-body.md +84 -0
  932. package/src/shared/shadcn/textarea/textarea.docs.md +90 -0
  933. package/src/shared/shadcn/textarea/textarea.provenance.json +47 -0
  934. package/src/shared/shadcn/textarea/textarea.svelte +345 -0
  935. package/src/shared/shadcn/textarea/textarea.tokens.css +13 -0
  936. package/src/shared/shadcn/textarea/textarea.tokens.ts +10 -0
  937. package/src/shared/shadcn/toggle/examples/default.svelte +16 -0
  938. package/src/shared/shadcn/toggle/examples/disabled.svelte +10 -0
  939. package/src/shared/shadcn/toggle/examples/large.svelte +10 -0
  940. package/src/shared/shadcn/toggle/examples/outline.svelte +10 -0
  941. package/src/shared/shadcn/toggle/examples/preview.svelte +16 -0
  942. package/src/shared/shadcn/toggle/examples/small.svelte +10 -0
  943. package/src/shared/shadcn/toggle/examples/with-text.svelte +11 -0
  944. package/src/shared/shadcn/toggle/index.ts +15 -0
  945. package/src/shared/shadcn/toggle/toggle.docs-body.md +104 -0
  946. package/src/shared/shadcn/toggle/toggle.docs.md +110 -0
  947. package/src/shared/shadcn/toggle/toggle.provenance.json +48 -0
  948. package/src/shared/shadcn/toggle/toggle.svelte +411 -0
  949. package/src/shared/shadcn/toggle/toggle.tokens.css +13 -0
  950. package/src/shared/shadcn/toggle/toggle.tokens.ts +10 -0
  951. package/src/shared/shadcn/toggle-group/examples/disabled.svelte +20 -0
  952. package/src/shared/shadcn/toggle-group/examples/large.svelte +20 -0
  953. package/src/shared/shadcn/toggle-group/examples/outline.svelte +20 -0
  954. package/src/shared/shadcn/toggle-group/examples/single.svelte +20 -0
  955. package/src/shared/shadcn/toggle-group/examples/small.svelte +20 -0
  956. package/src/shared/shadcn/toggle-group/examples/spacing-2.svelte +35 -0
  957. package/src/shared/shadcn/toggle-group/examples/spacing.svelte +35 -0
  958. package/src/shared/shadcn/toggle-group/index.ts +15 -0
  959. package/src/shared/shadcn/toggle-group/toggle-group-item.svelte +164 -0
  960. package/src/shared/shadcn/toggle-group/toggle-group.docs-body.md +178 -0
  961. package/src/shared/shadcn/toggle-group/toggle-group.docs.md +184 -0
  962. package/src/shared/shadcn/toggle-group/toggle-group.provenance.json +52 -0
  963. package/src/shared/shadcn/toggle-group/toggle-group.svelte +436 -0
  964. package/src/shared/shadcn/toggle-group/toggle-group.tokens.css +13 -0
  965. package/src/shared/shadcn/toggle-group/toggle-group.tokens.ts +10 -0
  966. package/src/shared/shadcn/tooltip/examples/preview.svelte +17 -0
  967. package/src/shared/shadcn/tooltip/index.ts +21 -0
  968. package/src/shared/shadcn/tooltip/tooltip-content.svelte +369 -0
  969. package/src/shared/shadcn/tooltip/tooltip-portal.svelte +7 -0
  970. package/src/shared/shadcn/tooltip/tooltip-provider.svelte +8 -0
  971. package/src/shared/shadcn/tooltip/tooltip-trigger.svelte +24 -0
  972. package/src/shared/shadcn/tooltip/tooltip.docs-body.md +56 -0
  973. package/src/shared/shadcn/tooltip/tooltip.docs.md +62 -0
  974. package/src/shared/shadcn/tooltip/tooltip.provenance.json +56 -0
  975. package/src/shared/shadcn/tooltip/tooltip.svelte +15 -0
  976. package/src/shared/shadcn/tooltip/tooltip.tokens.css +13 -0
  977. package/src/shared/shadcn/tooltip/tooltip.tokens.ts +10 -0
  978. package/src/shared/shell/PLAN.md +121 -0
  979. package/src/shared/shell/app-shell/AppShell.css +579 -0
  980. package/src/shared/shell/app-shell/AppShellBody.svelte +72 -0
  981. package/src/shared/shell/app-shell/AppShellBodyContent.svelte +46 -0
  982. package/src/shared/shell/app-shell/AppShellBodySidebar.svelte +116 -0
  983. package/src/shared/shell/app-shell/AppShellBodyToggle.svelte +112 -0
  984. package/src/shared/shell/app-shell/AppShellMain.svelte +35 -0
  985. package/src/shared/shell/app-shell/AppShellMobilePanelSelector.svelte +63 -0
  986. package/src/shared/shell/app-shell/AppShellRoot.svelte +565 -0
  987. package/src/shared/shell/app-shell/AppShellSidebar.svelte +493 -0
  988. package/src/shared/shell/app-shell/AppShellSidebarBody.svelte +29 -0
  989. package/src/shared/shell/app-shell/AppShellSidebarClose.svelte +100 -0
  990. package/src/shared/shell/app-shell/AppShellSidebarFooter.svelte +26 -0
  991. package/src/shared/shell/app-shell/AppShellSidebarHeader.svelte +26 -0
  992. package/src/shared/shell/app-shell/AppShellSidebarToggle.svelte +242 -0
  993. package/src/shared/shell/app-shell/AppShellToolbar.svelte +29 -0
  994. package/src/shared/shell/app-shell/app-shell-body-context.svelte.ts +39 -0
  995. package/src/shared/shell/app-shell/app-shell-context.svelte.ts +27 -0
  996. package/src/shared/shell/app-shell/app-shell-controller.svelte.ts +683 -0
  997. package/src/shared/shell/app-shell/app-shell-persistence.ts +70 -0
  998. package/src/shared/shell/app-shell/app-shell-sidebar-context.svelte.ts +34 -0
  999. package/src/shared/shell/app-shell/app-shell-teleport.ts +38 -0
  1000. package/src/shared/shell/app-shell/examples/AppShellBodyDemo.svelte +28 -0
  1001. package/src/shared/shell/app-shell/examples/AppShellCompleteDemo.svelte +123 -0
  1002. package/src/shared/shell/app-shell/examples/AppShellConversationDemo.svelte +143 -0
  1003. package/src/shared/shell/app-shell/examples/AppShellFilesSidebarDemo.svelte +70 -0
  1004. package/src/shared/shell/app-shell/examples/AppShellMarkdownDocumentDemo.svelte +112 -0
  1005. package/src/shared/shell/app-shell/examples/AppShellMarkdownFilesDemo.svelte +67 -0
  1006. package/src/shared/shell/app-shell/examples/AppShellModeSwitchDemo.svelte +42 -0
  1007. package/src/shared/shell/app-shell/examples/AppShellProjectSidebarDemo.svelte +121 -0
  1008. package/src/shared/shell/app-shell/examples/AppShellSidebarDemo.svelte +142 -0
  1009. package/src/shared/shell/app-shell/examples/AppShellToolbarDemo.svelte +26 -0
  1010. package/src/shared/shell/app-shell/index.ts +73 -0
  1011. package/src/shared/shell/index.ts +1 -0
  1012. package/src/shared/shell/shell.tokens.css +22 -0
  1013. package/src/shared/shell/shell.tokens.ts +39 -0
  1014. package/src/shared/workspace/PLAN.md +1052 -0
  1015. package/src/shared/workspace/REFERENCE.md +122 -0
  1016. package/src/shared/workspace/about-dialog/WorkspaceAboutDialog.css +163 -0
  1017. package/src/shared/workspace/about-dialog/WorkspaceAboutDialog.svelte +113 -0
  1018. package/src/shared/workspace/about-dialog/index.ts +1 -0
  1019. package/src/shared/workspace/app-shell/AppShellAboutDialog.svelte +23 -0
  1020. package/src/shared/workspace/app-shell/AppShellBottomPanel.svelte +15 -0
  1021. package/src/shared/workspace/app-shell/AppShellCommandPalette.svelte +13 -0
  1022. package/src/shared/workspace/app-shell/AppShellCorePluginsSettings.svelte +8 -0
  1023. package/src/shared/workspace/app-shell/AppShellDesktopLayout.css +81 -0
  1024. package/src/shared/workspace/app-shell/AppShellDesktopLayout.svelte +33 -0
  1025. package/src/shared/workspace/app-shell/AppShellFloatingLayer.svelte +20 -0
  1026. package/src/shared/workspace/app-shell/AppShellHotkeySettings.svelte +8 -0
  1027. package/src/shared/workspace/app-shell/AppShellLeftSidebar.svelte +146 -0
  1028. package/src/shared/workspace/app-shell/AppShellMain.svelte +14 -0
  1029. package/src/shared/workspace/app-shell/AppShellNoticeToasts.svelte +41 -0
  1030. package/src/shared/workspace/app-shell/AppShellNotices.svelte +8 -0
  1031. package/src/shared/workspace/app-shell/AppShellOverlayLayer.svelte +34 -0
  1032. package/src/shared/workspace/app-shell/AppShellPluginLayer.svelte +17 -0
  1033. package/src/shared/workspace/app-shell/AppShellRibbon.svelte +10 -0
  1034. package/src/shared/workspace/app-shell/AppShellRightSidebar.svelte +8 -0
  1035. package/src/shared/workspace/app-shell/AppShellRoot.css +101 -0
  1036. package/src/shared/workspace/app-shell/AppShellRoot.svelte +125 -0
  1037. package/src/shared/workspace/app-shell/AppShellSettings.svelte +8 -0
  1038. package/src/shared/workspace/app-shell/AppShellSettingsDialog.css +80 -0
  1039. package/src/shared/workspace/app-shell/AppShellSettingsDialog.svelte +110 -0
  1040. package/src/shared/workspace/app-shell/AppShellSidebar.svelte +10 -0
  1041. package/src/shared/workspace/app-shell/AppShellStatusBar.svelte +8 -0
  1042. package/src/shared/workspace/app-shell/AppShellSurface.svelte +139 -0
  1043. package/src/shared/workspace/app-shell/AppShellTabs.svelte +29 -0
  1044. package/src/shared/workspace/app-shell/AppShellWorkspace.css +19 -0
  1045. package/src/shared/workspace/app-shell/AppShellWorkspace.svelte +67 -0
  1046. package/src/shared/workspace/app-shell/app-shell-context.svelte.ts +37 -0
  1047. package/src/shared/workspace/app-shell/index.ts +79 -0
  1048. package/src/shared/workspace/app-shell/workspace-navigation.ts +16 -0
  1049. package/src/shared/workspace/bottom-panel/WorkspaceBottomPanel.css +406 -0
  1050. package/src/shared/workspace/bottom-panel/WorkspaceBottomPanel.svelte +412 -0
  1051. package/src/shared/workspace/bottom-panel/WorkspaceBottomPanelEmpty.svelte +38 -0
  1052. package/src/shared/workspace/bottom-panel/WorkspaceBottomPanelGroup.svelte +313 -0
  1053. package/src/shared/workspace/bottom-panel/WorkspaceBottomPanelStoryView.svelte +21 -0
  1054. package/src/shared/workspace/bottom-panel/WorkspaceBottomPanelToggle.svelte +68 -0
  1055. package/src/shared/workspace/bottom-panel/index.ts +3 -0
  1056. package/src/shared/workspace/command-palette/WorkspaceCommandPalette.css +33 -0
  1057. package/src/shared/workspace/command-palette/WorkspaceCommandPalette.svelte +183 -0
  1058. package/src/shared/workspace/command-palette/index.ts +1 -0
  1059. package/src/shared/workspace/core/app-shell-controller.svelte.ts +687 -0
  1060. package/src/shared/workspace/core/app-shell-ui-registry.svelte.ts +165 -0
  1061. package/src/shared/workspace/core/app-workspace.ts +484 -0
  1062. package/src/shared/workspace/core/built-in-settings.svelte.ts +467 -0
  1063. package/src/shared/workspace/core/command-manager.svelte.ts +752 -0
  1064. package/src/shared/workspace/core/editor-view-registry.ts +232 -0
  1065. package/src/shared/workspace/core/event-dispatcher.ts +91 -0
  1066. package/src/shared/workspace/core/index.ts +21 -0
  1067. package/src/shared/workspace/core/layout.ts +463 -0
  1068. package/src/shared/workspace/core/managed-plugin-settings.svelte.ts +142 -0
  1069. package/src/shared/workspace/core/notice-manager.svelte.ts +122 -0
  1070. package/src/shared/workspace/core/notification-manager.svelte.ts +631 -0
  1071. package/src/shared/workspace/core/persistence.ts +21 -0
  1072. package/src/shared/workspace/core/plugin-manager.svelte.ts +463 -0
  1073. package/src/shared/workspace/core/popout.ts +38 -0
  1074. package/src/shared/workspace/core/serializable.ts +16 -0
  1075. package/src/shared/workspace/core/types.ts +357 -0
  1076. package/src/shared/workspace/core/view-registry.ts +21 -0
  1077. package/src/shared/workspace/core/workspace-controller.svelte.ts +1509 -0
  1078. package/src/shared/workspace/core/workspace-json.ts +429 -0
  1079. package/src/shared/workspace/core/workspace-menu.ts +121 -0
  1080. package/src/shared/workspace/core/workspace-view.ts +241 -0
  1081. package/src/shared/workspace/demo/ReusableFrameworkDemo.css +52 -0
  1082. package/src/shared/workspace/demo/ReusableFrameworkDemo.svelte +19 -0
  1083. package/src/shared/workspace/demo/framework-demo.ts +482 -0
  1084. package/src/shared/workspace/demo/index.ts +5 -0
  1085. package/src/shared/workspace/drag/index.ts +9 -0
  1086. package/src/shared/workspace/drag/workspace-drag.svelte.ts +354 -0
  1087. package/src/shared/workspace/drag/workspace-pointer-drag-policy.ts +18 -0
  1088. package/src/shared/workspace/drop-overlay/WorkspaceDropOverlay.css +24 -0
  1089. package/src/shared/workspace/drop-overlay/WorkspaceDropOverlay.svelte +48 -0
  1090. package/src/shared/workspace/drop-overlay/WorkspaceTabsDrop.svelte +146 -0
  1091. package/src/shared/workspace/drop-overlay/index.ts +7 -0
  1092. package/src/shared/workspace/drop-overlay/workspace-tabs-drop.ts +59 -0
  1093. package/src/shared/workspace/empty/WorkspaceEmpty.css +42 -0
  1094. package/src/shared/workspace/empty/WorkspaceEmpty.svelte +88 -0
  1095. package/src/shared/workspace/empty/index.ts +1 -0
  1096. package/src/shared/workspace/empty/workspace-empty-actions.ts +127 -0
  1097. package/src/shared/workspace/explorer/WorkspaceExplorer.css +275 -0
  1098. package/src/shared/workspace/explorer/WorkspaceExplorer.svelte +662 -0
  1099. package/src/shared/workspace/explorer/create-explorer-view.ts +31 -0
  1100. package/src/shared/workspace/explorer/explorer-controller.svelte.ts +423 -0
  1101. package/src/shared/workspace/explorer/index.ts +45 -0
  1102. package/src/shared/workspace/explorer/memory-adapter.ts +290 -0
  1103. package/src/shared/workspace/explorer/path.ts +37 -0
  1104. package/src/shared/workspace/explorer/tree.ts +164 -0
  1105. package/src/shared/workspace/explorer/types.ts +134 -0
  1106. package/src/shared/workspace/floating-layer/WorkspaceFloatingLayer.css +19 -0
  1107. package/src/shared/workspace/floating-layer/WorkspaceFloatingLayer.svelte +68 -0
  1108. package/src/shared/workspace/floating-layer/index.ts +1 -0
  1109. package/src/shared/workspace/floating-window/WorkspaceFloatingWindow.css +205 -0
  1110. package/src/shared/workspace/floating-window/WorkspaceFloatingWindow.svelte +353 -0
  1111. package/src/shared/workspace/floating-window/index.ts +1 -0
  1112. package/src/shared/workspace/icon/WorkspaceIcon.css +21 -0
  1113. package/src/shared/workspace/icon/WorkspaceIcon.svelte +38 -0
  1114. package/src/shared/workspace/icon/WorkspaceIconPicker.css +69 -0
  1115. package/src/shared/workspace/icon/WorkspaceIconPicker.svelte +168 -0
  1116. package/src/shared/workspace/icon/icons.ts +92 -0
  1117. package/src/shared/workspace/icon/index.ts +10 -0
  1118. package/src/shared/workspace/index.ts +49 -0
  1119. package/src/shared/workspace/menu/WorkspaceContextMenuItems.svelte +83 -0
  1120. package/src/shared/workspace/menu/WorkspaceMenuItems.css +58 -0
  1121. package/src/shared/workspace/menu/WorkspaceMenuItems.svelte +83 -0
  1122. package/src/shared/workspace/menu/index.ts +2 -0
  1123. package/src/shared/workspace/mobile/WorkspaceMobile.css +417 -0
  1124. package/src/shared/workspace/mobile/WorkspaceMobile.svelte +429 -0
  1125. package/src/shared/workspace/mobile/WorkspaceMobileActionSheet.css +101 -0
  1126. package/src/shared/workspace/mobile/WorkspaceMobileActionSheet.svelte +59 -0
  1127. package/src/shared/workspace/mobile/WorkspaceMobileActionsDrawer.svelte +133 -0
  1128. package/src/shared/workspace/mobile/WorkspaceMobileDock.svelte +109 -0
  1129. package/src/shared/workspace/mobile/WorkspaceMobileSidebar.svelte +144 -0
  1130. package/src/shared/workspace/mobile/WorkspaceMobileTabTile.svelte +71 -0
  1131. package/src/shared/workspace/mobile/WorkspaceMobileTabs.svelte +102 -0
  1132. package/src/shared/workspace/mobile/WorkspaceMobileTabsActions.svelte +62 -0
  1133. package/src/shared/workspace/mobile/WorkspaceMobileViewActions.svelte +56 -0
  1134. package/src/shared/workspace/mobile/index.ts +9 -0
  1135. package/src/shared/workspace/plugins/f-mode/FModeOverlay.css +158 -0
  1136. package/src/shared/workspace/plugins/f-mode/FModeOverlay.svelte +210 -0
  1137. package/src/shared/workspace/plugins/f-mode/f-mode-plugin.ts +152 -0
  1138. package/src/shared/workspace/plugins/f-mode/f-mode-session.svelte.ts +57 -0
  1139. package/src/shared/workspace/plugins/f-mode/hint-labels.ts +123 -0
  1140. package/src/shared/workspace/plugins/f-mode/index.ts +6 -0
  1141. package/src/shared/workspace/plugins/f-mode/settings.ts +191 -0
  1142. package/src/shared/workspace/plugins/f-mode/types.ts +29 -0
  1143. package/src/shared/workspace/plugins/notifications/NotificationCenter.svelte +225 -0
  1144. package/src/shared/workspace/plugins/notifications/NotificationStatus.svelte +41 -0
  1145. package/src/shared/workspace/plugins/notifications/NotificationToasts.svelte +41 -0
  1146. package/src/shared/workspace/plugins/notifications/Notifications.css +331 -0
  1147. package/src/shared/workspace/plugins/notifications/NotificationsOverlay.svelte +23 -0
  1148. package/src/shared/workspace/plugins/notifications/NotificationsStorySurface.svelte +15 -0
  1149. package/src/shared/workspace/plugins/notifications/index.ts +12 -0
  1150. package/src/shared/workspace/plugins/notifications/notification-presentation.svelte.ts +15 -0
  1151. package/src/shared/workspace/plugins/notifications/notification-status-model.ts +137 -0
  1152. package/src/shared/workspace/plugins/notifications/notifications-plugin.ts +101 -0
  1153. package/src/shared/workspace/plugins/notifications/types.ts +10 -0
  1154. package/src/shared/workspace/popout/AppShellPopoutLayer.svelte +92 -0
  1155. package/src/shared/workspace/popout/WorkspaceOverlayPortalFixture.svelte +49 -0
  1156. package/src/shared/workspace/popout/WorkspacePopoutSurface.css +16 -0
  1157. package/src/shared/workspace/popout/WorkspacePopoutSurface.svelte +50 -0
  1158. package/src/shared/workspace/popout/index.ts +2 -0
  1159. package/src/shared/workspace/problems/ProblemsQuickFix.svelte +53 -0
  1160. package/src/shared/workspace/problems/WorkspaceProblems.css +568 -0
  1161. package/src/shared/workspace/problems/WorkspaceProblems.svelte +352 -0
  1162. package/src/shared/workspace/problems/WorkspaceProblemsTable.svelte +190 -0
  1163. package/src/shared/workspace/problems/diagnostics-manager.svelte.ts +326 -0
  1164. package/src/shared/workspace/problems/index.ts +43 -0
  1165. package/src/shared/workspace/problems/problems-controller.svelte.ts +346 -0
  1166. package/src/shared/workspace/problems/problems-plugin.ts +206 -0
  1167. package/src/shared/workspace/problems/types.ts +151 -0
  1168. package/src/shared/workspace/ribbon/WorkspaceRibbon.css +107 -0
  1169. package/src/shared/workspace/ribbon/WorkspaceRibbon.svelte +89 -0
  1170. package/src/shared/workspace/ribbon/index.ts +1 -0
  1171. package/src/shared/workspace/settings/AppSettingsContent.svelte +210 -0
  1172. package/src/shared/workspace/settings/AppSettingsNavigation.svelte +59 -0
  1173. package/src/shared/workspace/settings/AppSettingsRoot.svelte +36 -0
  1174. package/src/shared/workspace/settings/AppSettingsSearch.svelte +37 -0
  1175. package/src/shared/workspace/settings/AppSettingsSection.svelte +72 -0
  1176. package/src/shared/workspace/settings/AppShellHotkeySettings.svelte +403 -0
  1177. package/src/shared/workspace/settings/AppShellPluginsSettings.svelte +104 -0
  1178. package/src/shared/workspace/settings/WorkspaceSettingAddButton.svelte +24 -0
  1179. package/src/shared/workspace/settings/WorkspaceSettingField.svelte +436 -0
  1180. package/src/shared/workspace/settings/WorkspaceSettingList.svelte +95 -0
  1181. package/src/shared/workspace/settings/WorkspaceSettingMultiSelect.svelte +147 -0
  1182. package/src/shared/workspace/settings/WorkspaceSettingObjectTable.svelte +212 -0
  1183. package/src/shared/workspace/settings/WorkspaceSettingSelect.svelte +120 -0
  1184. package/src/shared/workspace/settings/WorkspaceSettingToggleTable.svelte +63 -0
  1185. package/src/shared/workspace/settings/WorkspaceSettings.css +1190 -0
  1186. package/src/shared/workspace/settings/WorkspaceSettingsStoryCustomField.svelte +17 -0
  1187. package/src/shared/workspace/settings/WorkspaceSettingsSurface.svelte +28 -0
  1188. package/src/shared/workspace/settings/app-settings-context.svelte.ts +33 -0
  1189. package/src/shared/workspace/settings/configuration.ts +90 -0
  1190. package/src/shared/workspace/settings/index.ts +39 -0
  1191. package/src/shared/workspace/settings/multiselect.ts +40 -0
  1192. package/src/shared/workspace/settings/object-collection.ts +54 -0
  1193. package/src/shared/workspace/settings/persistence.ts +24 -0
  1194. package/src/shared/workspace/settings/plugin-settings-target.ts +33 -0
  1195. package/src/shared/workspace/settings/search-hit.ts +2 -0
  1196. package/src/shared/workspace/settings/settings-controller.svelte.ts +629 -0
  1197. package/src/shared/workspace/settings/types.ts +254 -0
  1198. package/src/shared/workspace/sidebar/WorkspaceSidebar.css +368 -0
  1199. package/src/shared/workspace/sidebar/WorkspaceSidebar.svelte +398 -0
  1200. package/src/shared/workspace/sidebar/index.ts +1 -0
  1201. package/src/shared/workspace/sidebar-empty/WorkspaceSidebarEmpty.css +50 -0
  1202. package/src/shared/workspace/sidebar-empty/WorkspaceSidebarEmpty.svelte +48 -0
  1203. package/src/shared/workspace/sidebar-empty/index.ts +1 -0
  1204. package/src/shared/workspace/sidebar-group/WorkspaceSidebarGroup.css +214 -0
  1205. package/src/shared/workspace/sidebar-group/WorkspaceSidebarGroup.svelte +339 -0
  1206. package/src/shared/workspace/sidebar-group/WorkspaceSidebarGroupEditor.css +46 -0
  1207. package/src/shared/workspace/sidebar-group/WorkspaceSidebarGroupEditor.svelte +164 -0
  1208. package/src/shared/workspace/sidebar-group/WorkspaceSidebarGroupVisibilityDialog.css +18 -0
  1209. package/src/shared/workspace/sidebar-group/WorkspaceSidebarGroupVisibilityDialog.svelte +97 -0
  1210. package/src/shared/workspace/sidebar-group/index.ts +11 -0
  1211. package/src/shared/workspace/sidebar-group/workspace-sidebar-layout.ts +82 -0
  1212. package/src/shared/workspace/sidebar-toggle/WorkspaceSidebarToggle.css +74 -0
  1213. package/src/shared/workspace/sidebar-toggle/WorkspaceSidebarToggle.svelte +68 -0
  1214. package/src/shared/workspace/sidebar-toggle/index.ts +1 -0
  1215. package/src/shared/workspace/split/WorkspaceSplit.css +110 -0
  1216. package/src/shared/workspace/split/WorkspaceSplit.svelte +64 -0
  1217. package/src/shared/workspace/split/index.ts +1 -0
  1218. package/src/shared/workspace/stacked-tabs/WorkspaceStackedTabs.css +297 -0
  1219. package/src/shared/workspace/stacked-tabs/WorkspaceStackedTabs.svelte +519 -0
  1220. package/src/shared/workspace/stacked-tabs/index.ts +1 -0
  1221. package/src/shared/workspace/startup/WorkspaceStartup.css +201 -0
  1222. package/src/shared/workspace/startup/WorkspaceStartup.svelte +216 -0
  1223. package/src/shared/workspace/startup/index.ts +7 -0
  1224. package/src/shared/workspace/status-bar/WorkspaceStatusBar.css +40 -0
  1225. package/src/shared/workspace/status-bar/WorkspaceStatusBar.svelte +36 -0
  1226. package/src/shared/workspace/status-bar/index.ts +1 -0
  1227. package/src/shared/workspace/status-item/WorkspaceStatusItem.css +67 -0
  1228. package/src/shared/workspace/status-item/WorkspaceStatusItem.svelte +97 -0
  1229. package/src/shared/workspace/status-item/index.ts +1 -0
  1230. package/src/shared/workspace/tabs/WorkspaceTabs.css +467 -0
  1231. package/src/shared/workspace/tabs/WorkspaceTabs.svelte +627 -0
  1232. package/src/shared/workspace/tabs/WorkspaceTabsMove.svelte +152 -0
  1233. package/src/shared/workspace/tabs/index.ts +2 -0
  1234. package/src/shared/workspace/tree/WorkspaceTree.css +11 -0
  1235. package/src/shared/workspace/tree/WorkspaceTree.svelte +86 -0
  1236. package/src/shared/workspace/tree/index.ts +1 -0
  1237. package/src/shared/workspace/view-header/WorkspaceViewHeader.css +170 -0
  1238. package/src/shared/workspace/view-header/WorkspaceViewHeader.svelte +282 -0
  1239. package/src/shared/workspace/view-header/WorkspaceViewLabel.css +48 -0
  1240. package/src/shared/workspace/view-header/WorkspaceViewLabel.svelte +61 -0
  1241. package/src/shared/workspace/view-header/index.ts +2 -0
  1242. package/src/shared/workspace/view-header/workspace-view-label.ts +61 -0
  1243. package/src/shared/workspace/view-host/ExampleWorkspaceView.svelte +35 -0
  1244. package/src/shared/workspace/view-host/WorkspaceImperativeView.svelte +32 -0
  1245. package/src/shared/workspace/view-host/WorkspaceViewHost.css +23 -0
  1246. package/src/shared/workspace/view-host/WorkspaceViewHost.svelte +94 -0
  1247. package/src/shared/workspace/view-host/index.ts +2 -0
  1248. package/src/shared/workspace/workspace-desktop-drag.css +9 -0
  1249. package/src/shared/workspace/workspace.tokens.css +181 -0
  1250. package/src/shared/workspace/workspace.tokens.ts +224 -0
  1251. package/src/storybook/catalog-layout.ts +28 -0
  1252. package/src/storybook/visual-capture.ts +9 -0
  1253. package/src/storybook.css +46 -0
  1254. package/src/styles.css +81 -0
  1255. package/src/theme.css +122 -0
  1256. package/src/themes/lapis.css +225 -0
@@ -0,0 +1,1509 @@
1
+ import {
2
+ cloneWorkspaceLayout,
3
+ createDefaultWorkspaceLayout,
4
+ createWorkspaceId,
5
+ createWorkspaceSplit,
6
+ createWorkspaceTabs,
7
+ findWorkspacePane,
8
+ findWorkspaceTab,
9
+ firstWorkspaceTab,
10
+ normalizeWorkspaceLayout,
11
+ normalizeWorkspaceTree,
12
+ replaceWorkspaceNode,
13
+ } from "./layout.js";
14
+ import {
15
+ createCancelableEvent,
16
+ WorkspaceEventDispatcher,
17
+ type WorkspaceEventRef,
18
+ } from "./event-dispatcher.js";
19
+ import { createWorkspaceViewRegistry } from "./view-registry.js";
20
+ import { WorkspaceMenu } from "./workspace-menu.js";
21
+ import type {
22
+ WorkspaceControllerOptions,
23
+ WorkspaceDisplayMode,
24
+ WorkspaceDockPosition,
25
+ WorkspaceDropPosition,
26
+ WorkspaceEventMap,
27
+ WorkspaceFocusModeState,
28
+ WorkspaceLayoutChangeEvent,
29
+ WorkspaceLayoutDropEvent,
30
+ WorkspaceLayout,
31
+ WorkspaceIconName,
32
+ WorkspaceNode,
33
+ WorkspacePopoutHandle,
34
+ WorkspacePopoutHost,
35
+ WorkspaceRibbonItem,
36
+ WorkspaceAction,
37
+ WorkspaceSidebarGroup,
38
+ WorkspaceSide,
39
+ WorkspaceStatusItem,
40
+ WorkspaceTab,
41
+ WorkspaceTabsNode,
42
+ WorkspaceViewRegistry,
43
+ WorkspaceWindow,
44
+ WorkspaceWindowBounds,
45
+ WorkspaceWindowMode,
46
+ WorkspaceWindowState,
47
+ } from "./types.js";
48
+
49
+ function walkWorkspaceTabs(
50
+ node: WorkspaceNode,
51
+ visitor: (pane: WorkspaceTabsNode) => void,
52
+ ): void {
53
+ if (node.kind === "tabs") {
54
+ visitor(node);
55
+ return;
56
+ }
57
+ for (const child of node.children) walkWorkspaceTabs(child, visitor);
58
+ }
59
+
60
+ function workspaceNodeContains(node: WorkspaceNode, nodeId: string): boolean {
61
+ if (node.id === nodeId) return true;
62
+ return (
63
+ node.kind === "split" &&
64
+ node.children.some((child) => workspaceNodeContains(child, nodeId))
65
+ );
66
+ }
67
+
68
+ function firstWorkspaceTabsNode(node: WorkspaceNode): WorkspaceTabsNode | null {
69
+ if (node.kind === "tabs") return node;
70
+ for (const child of node.children) {
71
+ const match = firstWorkspaceTabsNode(child);
72
+ if (match) return match;
73
+ }
74
+ return null;
75
+ }
76
+
77
+ function pruneEmptyWorkspacePane(
78
+ root: WorkspaceNode,
79
+ paneId: string,
80
+ ): WorkspaceNode {
81
+ const prune = (
82
+ node: WorkspaceNode,
83
+ preserveRoot: boolean,
84
+ ): WorkspaceNode | null => {
85
+ if (node.kind === "tabs") {
86
+ if (!preserveRoot && node.id === paneId && node.items.length === 0) {
87
+ return null;
88
+ }
89
+ return node;
90
+ }
91
+
92
+ const children = node.children
93
+ .map((child) => prune(child, false))
94
+ .filter((child): child is WorkspaceNode => child !== null);
95
+ if (children.length === 0) {
96
+ return preserveRoot
97
+ ? createWorkspaceTabs([], { id: node.id, presentation: "top" })
98
+ : null;
99
+ }
100
+ if (children.length === 1) return children[0]!;
101
+ return normalizeWorkspaceTree({ ...node, children });
102
+ };
103
+
104
+ return (
105
+ prune(root, true) ??
106
+ createWorkspaceTabs([], { id: root.id, presentation: "top" })
107
+ );
108
+ }
109
+
110
+ export class WorkspaceItemRegistry<
111
+ T extends { id: string; priority?: number },
112
+ > {
113
+ items = $state<T[]>([]);
114
+
115
+ addItem(item: T): () => void {
116
+ this.removeItem(item.id);
117
+ this.items.push(item);
118
+ this.items.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));
119
+ return () => this.removeItem(item.id);
120
+ }
121
+
122
+ removeItem(id: string): void {
123
+ const index = this.items.findIndex((item) => item.id === id);
124
+ if (index >= 0) this.items.splice(index, 1);
125
+ }
126
+
127
+ clear(): void {
128
+ this.items.splice(0);
129
+ }
130
+ }
131
+
132
+ export class WorkspaceShellController {
133
+ layout = $state<WorkspaceLayout>(createDefaultWorkspaceLayout());
134
+ displayMode = $state<WorkspaceDisplayMode>("desktop");
135
+ focusMode = $state<WorkspaceFocusModeState | null>(null);
136
+ // Match appearance-setting defaults until AppShell syncs configuration.
137
+ showTabTitleBar = $state(true);
138
+ showInlineTitle = $state(false);
139
+ activateNewTabs = $state(true);
140
+ layoutReady = $state(false);
141
+ readonly registry: WorkspaceViewRegistry;
142
+ readonly statusBar = new WorkspaceItemRegistry<WorkspaceStatusItem>();
143
+ readonly ribbon = new WorkspaceItemRegistry<WorkspaceRibbonItem>();
144
+ readonly emptyViewActions = new WorkspaceItemRegistry<WorkspaceAction>();
145
+
146
+ readonly #events = new WorkspaceEventDispatcher<WorkspaceEventMap>();
147
+ readonly #persistence;
148
+ readonly #saveDebounceMs: number;
149
+ #saveTimer: ReturnType<typeof setTimeout> | null = null;
150
+ #pendingSaveEvent: WorkspaceLayoutChangeEvent | null = null;
151
+ #saveChain: Promise<void> = Promise.resolve();
152
+ #hydrating = false;
153
+ #popoutHost: WorkspacePopoutHost | null = null;
154
+ readonly #popoutHandles = new Map<string, WorkspacePopoutHandle>();
155
+
156
+ constructor(options: WorkspaceControllerOptions = {}) {
157
+ this.registry = options.registry ?? createWorkspaceViewRegistry();
158
+ this.#persistence = options.persistence;
159
+ this.#saveDebounceMs = Math.max(0, options.saveDebounceMs ?? 1000);
160
+ this.layout = normalizeWorkspaceLayout(
161
+ options.layout ?? createDefaultWorkspaceLayout(),
162
+ );
163
+ if (!this.#persistence) {
164
+ this.layoutReady = true;
165
+ queueMicrotask(() => this.#events.trigger("layout-ready"));
166
+ }
167
+ }
168
+
169
+ get activeHostId(): string {
170
+ return this.layout.active.hostId;
171
+ }
172
+
173
+ get activePaneId(): string | null {
174
+ return this.layout.active.paneId;
175
+ }
176
+
177
+ get activeTabId(): string | null {
178
+ return this.layout.active.tabId;
179
+ }
180
+
181
+ get activeTab(): WorkspaceTab | null {
182
+ return this.activeTabId
183
+ ? (findWorkspaceTab(this.layout, this.activeTabId)?.tab ?? null)
184
+ : null;
185
+ }
186
+
187
+ get activeWindow(): WorkspaceWindow | null {
188
+ if (this.layout.active.hostId === "root") return null;
189
+ return (
190
+ this.layout.windows.find(
191
+ (workspaceWindow) => workspaceWindow.id === this.layout.active.hostId,
192
+ ) ?? null
193
+ );
194
+ }
195
+
196
+ on<Name extends keyof WorkspaceEventMap>(
197
+ name: Name,
198
+ listener: (...args: WorkspaceEventMap[Name]) => void,
199
+ ): WorkspaceEventRef<WorkspaceEventMap, Name> {
200
+ return this.#events.on(name, listener);
201
+ }
202
+
203
+ once<Name extends keyof WorkspaceEventMap>(
204
+ name: Name,
205
+ listener: (...args: WorkspaceEventMap[Name]) => void,
206
+ ): WorkspaceEventRef<WorkspaceEventMap, Name> {
207
+ return this.#events.once(name, listener);
208
+ }
209
+
210
+ off<Name extends keyof WorkspaceEventMap>(
211
+ name: Name,
212
+ listener: (...args: WorkspaceEventMap[Name]) => void,
213
+ ): void {
214
+ this.#events.off(name, listener);
215
+ }
216
+
217
+ offref<Name extends keyof WorkspaceEventMap>(
218
+ ref: WorkspaceEventRef<WorkspaceEventMap, Name>,
219
+ ): void {
220
+ this.#events.offref(ref);
221
+ }
222
+
223
+ onChange(
224
+ listener: (
225
+ layout: WorkspaceLayout,
226
+ event: WorkspaceLayoutChangeEvent,
227
+ ) => void,
228
+ ): () => void {
229
+ const ref = this.on("layout-change", (event) =>
230
+ listener(this.getLayout(), event),
231
+ );
232
+ return () => this.offref(ref);
233
+ }
234
+
235
+ onLayoutReady(listener: () => void): () => void {
236
+ const ref = this.on("layout-ready", listener);
237
+ if (this.layoutReady) queueMicrotask(listener);
238
+ return () => this.offref(ref);
239
+ }
240
+
241
+ getLayout(): WorkspaceLayout {
242
+ return cloneWorkspaceLayout(this.layout);
243
+ }
244
+
245
+ toJSON(): WorkspaceLayout {
246
+ return this.getLayout();
247
+ }
248
+
249
+ changeLayout(
250
+ value: unknown,
251
+ event: WorkspaceLayoutChangeEvent = { source: "layout-replace" },
252
+ ): void {
253
+ this.exitFocusMode();
254
+ this.layout = normalizeWorkspaceLayout(value, this.layout);
255
+ this.#events.trigger("active-tab-change", this.activeTab);
256
+ this.#commit(event);
257
+ }
258
+
259
+ async restoreLayout(): Promise<void> {
260
+ if (this.layoutReady) return;
261
+ this.exitFocusMode();
262
+ this.#hydrating = true;
263
+ try {
264
+ const value = await this.#persistence?.load();
265
+ if (value !== null && value !== undefined) {
266
+ this.layout = normalizeWorkspaceLayout(value, this.layout);
267
+ }
268
+ if (this.#persistence) {
269
+ this.#events.trigger("persistence-success", { operation: "load" });
270
+ }
271
+ } catch (error) {
272
+ this.#events.trigger("persistence-error", { operation: "load", error });
273
+ } finally {
274
+ this.#hydrating = false;
275
+ this.layoutReady = true;
276
+ this.#events.trigger("active-tab-change", this.activeTab);
277
+ this.#events.trigger("layout-ready");
278
+ }
279
+ }
280
+
281
+ requestSaveLayout(event: WorkspaceLayoutChangeEvent): void {
282
+ if (!this.#persistence || this.#hydrating) return;
283
+ this.#pendingSaveEvent = event;
284
+ if (this.#saveTimer) clearTimeout(this.#saveTimer);
285
+ this.#saveTimer = setTimeout(() => {
286
+ this.#saveTimer = null;
287
+ void this.flushSave();
288
+ }, this.#saveDebounceMs);
289
+ }
290
+
291
+ async flushSave(): Promise<void> {
292
+ if (this.#saveTimer) {
293
+ clearTimeout(this.#saveTimer);
294
+ this.#saveTimer = null;
295
+ }
296
+ const event = this.#pendingSaveEvent;
297
+ this.#pendingSaveEvent = null;
298
+ if (!event || !this.#persistence) return this.#saveChain;
299
+ const snapshot = this.getLayout();
300
+ this.#saveChain = this.#saveChain.then(async () => {
301
+ try {
302
+ await this.#persistence?.save(snapshot, event);
303
+ this.#events.trigger("persistence-success", { operation: "save" });
304
+ } catch (error) {
305
+ this.#events.trigger("persistence-error", { operation: "save", error });
306
+ }
307
+ });
308
+ return this.#saveChain;
309
+ }
310
+
311
+ setDisplayMode(mode: WorkspaceDisplayMode): void {
312
+ if (mode === this.displayMode) return;
313
+ this.displayMode = mode;
314
+ this.#events.trigger("display-mode-change", mode);
315
+ this.#commit({ source: "display-mode" });
316
+ }
317
+
318
+ selectTab(tabId: string): boolean {
319
+ const location = findWorkspaceTab(this.layout, tabId);
320
+ if (!location) return false;
321
+ // Leaf content pointerdown calls selectTab on every editor click. Skip the
322
+ // layout-change commit when the tab is already active so CodeMirror fold
323
+ // (and other in-view) interactions are not reset by layout projection.
324
+ const alreadyActive =
325
+ this.layout.active?.tabId === tabId &&
326
+ this.layout.active?.paneId === location.pane.id &&
327
+ this.layout.active?.hostId === location.hostId &&
328
+ location.pane.activeItemId === location.item.id;
329
+ if (alreadyActive) return true;
330
+ if (!this.#activateTab(tabId)) return false;
331
+ this.#commit({ source: "tab-select", id: tabId });
332
+ return true;
333
+ }
334
+
335
+ enterFocusMode(tabId: string | null = this.activeTabId): boolean {
336
+ if (!tabId) return false;
337
+ const location = findWorkspaceTab(this.layout, tabId);
338
+ if (
339
+ !location ||
340
+ !workspaceNodeContains(this.layout.main, location.pane.id)
341
+ ) {
342
+ return false;
343
+ }
344
+ if (
345
+ this.focusMode?.tabId === tabId &&
346
+ this.focusMode.paneId === location.pane.id
347
+ ) {
348
+ return false;
349
+ }
350
+ if (this.activeTabId !== tabId) this.#activateTab(tabId);
351
+ const state = { tabId, paneId: location.pane.id };
352
+ this.focusMode = state;
353
+ this.#events.trigger("focus-mode-change", state);
354
+ return true;
355
+ }
356
+
357
+ exitFocusMode(): boolean {
358
+ if (!this.focusMode) return false;
359
+ this.focusMode = null;
360
+ this.#events.trigger("focus-mode-change", null);
361
+ return true;
362
+ }
363
+
364
+ clearFocusModeForTab(tabId: string): boolean {
365
+ return this.focusMode?.tabId === tabId ? this.exitFocusMode() : false;
366
+ }
367
+
368
+ isFocusModeForPane(paneId: string): boolean {
369
+ return this.focusMode?.paneId === paneId;
370
+ }
371
+
372
+ addTab(paneId: string, tab: WorkspaceTab, activate = true): boolean {
373
+ const pane = findWorkspacePane(this.layout, paneId);
374
+ if (!pane || findWorkspaceTab(this.layout, tab.id)) return false;
375
+ pane.items.push(tab);
376
+ if (activate) this.#activateTab(tab.id);
377
+ this.layout = cloneWorkspaceLayout(this.layout);
378
+ this.#commit({ source: "tab-add", id: tab.id });
379
+ return true;
380
+ }
381
+
382
+ addCreatedTab(paneId: string, tab: WorkspaceTab): boolean {
383
+ return this.addTab(paneId, tab, this.activateNewTabs);
384
+ }
385
+
386
+ closeTab(tabId: string): boolean {
387
+ const location = findWorkspaceTab(this.layout, tabId);
388
+ if (!location || location.tab.closable === false) return false;
389
+ this.clearFocusModeForTab(tabId);
390
+ const sourcePaneId = location.pane.id;
391
+ const sourceHostId = location.hostId;
392
+ if (location.group) {
393
+ const index = location.group.tabs.findIndex((tab) => tab.id === tabId);
394
+ location.group.tabs.splice(index, 1);
395
+ location.group.hiddenTabIds = location.group.hiddenTabIds.filter(
396
+ (id) => id !== tabId,
397
+ );
398
+ delete location.group.collapsedByTabId[tabId];
399
+ delete location.group.panelSizesByTabId[tabId];
400
+ if (location.group.tabs.length === 0) {
401
+ const groupIndex = location.pane.items.findIndex(
402
+ (item) => item.id === location.group?.id,
403
+ );
404
+ if (groupIndex >= 0) location.pane.items.splice(groupIndex, 1);
405
+ }
406
+ } else {
407
+ const index = location.pane.items.findIndex((item) => item.id === tabId);
408
+ location.pane.items.splice(index, 1);
409
+ }
410
+ if (location.pane.activeItemId === location.item.id) {
411
+ location.pane.activeItemId = location.pane.items[0]?.id ?? null;
412
+ }
413
+ this.#pruneEmptyPane(sourceHostId, sourcePaneId);
414
+ this.#pruneEmptyWindow(sourceHostId);
415
+ if (this.layout.active.tabId === tabId) this.#activateFallback();
416
+ this.#commit({ source: "tab-close", id: tabId });
417
+ return true;
418
+ }
419
+
420
+ updateViewState(tabId: string, state: Record<string, unknown>): boolean {
421
+ const location = findWorkspaceTab(this.layout, tabId);
422
+ if (!location) return false;
423
+ location.tab.view.state = state;
424
+ this.#commit({ source: "view-state", id: tabId });
425
+ return true;
426
+ }
427
+
428
+ splitPane(
429
+ paneId: string,
430
+ position: Exclude<WorkspaceDropPosition, "center">,
431
+ tab: WorkspaceTab,
432
+ commit = true,
433
+ ): boolean {
434
+ const location = this.#findPaneHost(paneId);
435
+ if (!location) return false;
436
+ if (this.#dockForPane(paneId) === "bottom") return false;
437
+ if (this.focusMode?.paneId === paneId) this.exitFocusMode();
438
+ const newPane = createWorkspaceTabs([tab], { activeItemId: tab.id });
439
+ const direction =
440
+ position === "left" || position === "right" ? "horizontal" : "vertical";
441
+ const before = position === "left" || position === "top";
442
+ const replacement = createWorkspaceSplit(
443
+ direction,
444
+ before ? [newPane, location.pane] : [location.pane, newPane],
445
+ );
446
+ this.#replaceHostNode(location.hostId, paneId, replacement);
447
+ this.layout.active = {
448
+ hostId: location.hostId,
449
+ paneId: newPane.id,
450
+ tabId: tab.id,
451
+ };
452
+ this.#events.trigger("active-tab-change", tab);
453
+ if (commit) {
454
+ this.#commit({ source: "split", id: newPane.id, operation: position });
455
+ }
456
+ return true;
457
+ }
458
+
459
+ willShowDropOverlay(
460
+ input: Omit<
461
+ WorkspaceLayoutDropEvent,
462
+ "defaultPrevented" | "preventDefault"
463
+ >,
464
+ ): WorkspaceLayoutDropEvent {
465
+ const event = createCancelableEvent(input);
466
+ this.#events.trigger("layout-will-show-overlay", event);
467
+ return event;
468
+ }
469
+
470
+ dropTab(
471
+ tabId: string,
472
+ targetPaneId: string,
473
+ position: WorkspaceDropPosition,
474
+ source: WorkspaceLayoutDropEvent["source"] = "api",
475
+ targetIndex?: number,
476
+ ): boolean {
477
+ const sourceLocation = findWorkspaceTab(this.layout, tabId);
478
+ const targetPane = findWorkspacePane(this.layout, targetPaneId);
479
+ if (!sourceLocation || !targetPane) return false;
480
+ if (position !== "center" && this.#dockForPane(targetPaneId) === "bottom") {
481
+ return false;
482
+ }
483
+ const boundedTargetIndex = Math.min(
484
+ Math.max(0, targetIndex ?? targetPane.items.length),
485
+ targetPane.items.length,
486
+ );
487
+ const sourceItemIndex =
488
+ position === "center" &&
489
+ sourceLocation.pane.id === targetPaneId &&
490
+ !sourceLocation.group &&
491
+ sourceLocation.item.kind === "tab"
492
+ ? sourceLocation.pane.items.indexOf(sourceLocation.item)
493
+ : -1;
494
+ const insertionIndex =
495
+ sourceItemIndex >= 0 && sourceItemIndex < boundedTargetIndex
496
+ ? boundedTargetIndex - 1
497
+ : boundedTargetIndex;
498
+ if (sourceItemIndex >= 0 && insertionIndex === sourceItemIndex) {
499
+ return false;
500
+ }
501
+ const event = createCancelableEvent({
502
+ tabId,
503
+ targetPaneId,
504
+ position,
505
+ source,
506
+ operation: position === "center" ? "tab-drop" : "split-drop",
507
+ } as const);
508
+ this.#events.trigger("layout-will-drop", event);
509
+ if (event.defaultPrevented) return false;
510
+
511
+ const tab = sourceLocation.tab;
512
+ const sourceHostId = sourceLocation.hostId;
513
+ const sourcePaneId = sourceLocation.pane.id;
514
+ const targetHostId = this.#findPaneHost(targetPaneId)?.hostId ?? "root";
515
+ this.#detachTab(sourceLocation);
516
+ if (sourcePaneId !== targetPaneId) {
517
+ this.#pruneEmptyPane(sourceHostId, sourcePaneId);
518
+ }
519
+ if (sourceHostId !== targetHostId) this.#pruneEmptyWindow(sourceHostId);
520
+ if (position === "center") {
521
+ targetPane.items.splice(insertionIndex, 0, tab);
522
+ targetPane.activeItemId = tab.id;
523
+ const targetHost = this.#findPaneHost(targetPaneId)?.hostId ?? "root";
524
+ this.layout.active = { hostId: targetHost, paneId: targetPaneId, tabId };
525
+ } else {
526
+ this.splitPane(targetPaneId, position, tab, false);
527
+ }
528
+ this.#events.trigger("layout-did-drop", event);
529
+ this.#events.trigger("active-tab-change", tab);
530
+ this.#commit({ source: "drag-drop", id: tabId, operation: position });
531
+ return true;
532
+ }
533
+
534
+ dropTabIntoSidebarGroup(
535
+ tabId: string,
536
+ groupId: string,
537
+ targetIndex: number,
538
+ position: Exclude<WorkspaceDropPosition, "center">,
539
+ source: WorkspaceLayoutDropEvent["source"] = "api",
540
+ ): boolean {
541
+ const sourceLocation = findWorkspaceTab(this.layout, tabId);
542
+ const groupLocation = this.#findSidebarGroupLocation(groupId);
543
+ if (!sourceLocation || !groupLocation) return false;
544
+ const event = createCancelableEvent({
545
+ tabId,
546
+ targetPaneId: groupLocation.pane.id,
547
+ position,
548
+ source,
549
+ operation: "tab-drop",
550
+ } as const);
551
+ this.#events.trigger("layout-will-drop", event);
552
+ if (event.defaultPrevented) return false;
553
+ this.clearFocusModeForTab(tabId);
554
+
555
+ const tab = sourceLocation.tab;
556
+ const sourceHostId = sourceLocation.hostId;
557
+ const sourcePaneId = sourceLocation.pane.id;
558
+ const targetGroup = groupLocation.group;
559
+ let insertion = Math.min(Math.max(0, targetIndex), targetGroup.tabs.length);
560
+
561
+ if (sourceLocation.group?.id === targetGroup.id) {
562
+ const currentIndex = targetGroup.tabs.findIndex(
563
+ (candidate) => candidate.id === tabId,
564
+ );
565
+ if (currentIndex < 0) return false;
566
+ targetGroup.tabs.splice(currentIndex, 1);
567
+ if (currentIndex < insertion) insertion -= 1;
568
+ } else {
569
+ this.#detachTab(sourceLocation);
570
+ this.#pruneEmptyPane(sourceHostId, sourcePaneId);
571
+ this.#pruneEmptyWindow(sourceHostId);
572
+ targetGroup.hiddenTabIds = targetGroup.hiddenTabIds.filter(
573
+ (id) => id !== tabId,
574
+ );
575
+ targetGroup.collapsedByTabId[tabId] = false;
576
+ targetGroup.panelSizesByTabId[tabId] =
577
+ targetGroup.tabs.length > 0 ? 100 / (targetGroup.tabs.length + 1) : 100;
578
+ }
579
+
580
+ targetGroup.tabs.splice(insertion, 0, tab);
581
+ groupLocation.pane.activeItemId = targetGroup.id;
582
+ this.layout.active = {
583
+ hostId: "root",
584
+ paneId: groupLocation.pane.id,
585
+ tabId,
586
+ };
587
+ this.#events.trigger("layout-did-drop", event);
588
+ this.#events.trigger("active-tab-change", tab);
589
+ this.#commit({
590
+ source: "drag-drop",
591
+ id: tabId,
592
+ operation: "sidebar-group-reorder",
593
+ });
594
+ return true;
595
+ }
596
+
597
+ setSidebarOpen(side: WorkspaceSide, open: boolean): void {
598
+ this.setDockOpen(side, open);
599
+ }
600
+
601
+ setDockOpen(position: WorkspaceDockPosition, open: boolean): void {
602
+ this.layout[position].open = open;
603
+ this.#commit({
604
+ source: position === "bottom" ? "bottom-panel" : "sidebar",
605
+ id: position,
606
+ operation: open ? "open" : "close",
607
+ });
608
+ }
609
+
610
+ setSplitSizes(splitId: string, sizes: number[], commit = true): boolean {
611
+ const node = this.#findNode(splitId);
612
+ if (
613
+ !node ||
614
+ node.kind !== "split" ||
615
+ sizes.length !== node.children.length
616
+ ) {
617
+ return false;
618
+ }
619
+ const normalized = sizes.map((size) => Math.max(1, size));
620
+ const total = normalized.reduce((sum, size) => sum + size, 0);
621
+ node.sizes = normalized.map((size) => (size / total) * 100);
622
+ if (commit) {
623
+ this.#events.trigger("resize", splitId);
624
+ this.#commit({ source: "resize", id: splitId, operation: "split" });
625
+ }
626
+ return true;
627
+ }
628
+
629
+ setTabsPresentation(
630
+ paneId: string,
631
+ presentation: WorkspaceTabsNode["presentation"],
632
+ ): boolean {
633
+ const pane = findWorkspacePane(this.layout, paneId);
634
+ if (!pane || pane.presentation === presentation) return Boolean(pane);
635
+ pane.presentation = presentation;
636
+ this.#commit({
637
+ source: "layout-replace",
638
+ id: paneId,
639
+ operation: `presentation:${presentation}`,
640
+ });
641
+ return true;
642
+ }
643
+
644
+ beginDrag(tabId: string, source: "html5" | "pointer"): void {
645
+ this.#events.trigger("layout-drag-start", { tabId, source });
646
+ }
647
+
648
+ endDrag(tabId: string, source: "html5" | "pointer"): void {
649
+ this.#events.trigger("layout-drag-end", { tabId, source });
650
+ }
651
+
652
+ setSidebarSize(side: WorkspaceSide, size: number): void {
653
+ this.setDockSize(side, size);
654
+ }
655
+
656
+ setDockSize(position: WorkspaceDockPosition, size: number): void {
657
+ const minimum = position === "bottom" ? 120 : 180;
658
+ this.layout[position].size = Math.min(640, Math.max(minimum, size));
659
+ this.#events.trigger("resize", position);
660
+ this.#commit({ source: "resize", id: position });
661
+ }
662
+
663
+ setSidebarGroupCollapsed(
664
+ groupId: string,
665
+ tabId: string,
666
+ collapsed: boolean,
667
+ ): boolean {
668
+ const group = this.#findSidebarGroup(groupId);
669
+ if (!group || !group.tabs.some((tab) => tab.id === tabId)) return false;
670
+ group.collapsedByTabId[tabId] = collapsed;
671
+ this.#commit({
672
+ source: "sidebar-group",
673
+ id: groupId,
674
+ operation: "collapse",
675
+ });
676
+ return true;
677
+ }
678
+
679
+ updateSidebarGroup(
680
+ groupId: string,
681
+ changes: { title?: string; icon?: WorkspaceIconName | null },
682
+ ): boolean {
683
+ const group = this.#findSidebarGroup(groupId);
684
+ if (!group) return false;
685
+
686
+ const title =
687
+ changes.title === undefined
688
+ ? group.title
689
+ : changes.title.trim() || group.id;
690
+ const icon =
691
+ "icon" in changes ? changes.icon?.trim() || undefined : group.icon;
692
+ if (title === group.title && icon === group.icon) return true;
693
+
694
+ group.title = title;
695
+ group.icon = icon;
696
+ this.#commit({
697
+ source: "sidebar-group",
698
+ id: groupId,
699
+ operation: "metadata",
700
+ });
701
+ return true;
702
+ }
703
+
704
+ groupSidebarTabs(
705
+ side: WorkspaceSide,
706
+ tabIds: string[],
707
+ options: { id?: string; title?: string; icon?: string } = {},
708
+ ): WorkspaceSidebarGroup | null {
709
+ return this.groupDockTabs(side, tabIds, options);
710
+ }
711
+
712
+ groupDockTabs(
713
+ position: WorkspaceDockPosition,
714
+ tabIds: string[],
715
+ options: { id?: string; title?: string; icon?: string } = {},
716
+ ): WorkspaceSidebarGroup | null {
717
+ const locations = tabIds
718
+ .map((tabId) => findWorkspaceTab(this.layout, tabId))
719
+ .filter((location) => location !== null);
720
+ if (
721
+ !locations.length ||
722
+ locations.length !== tabIds.length ||
723
+ locations.some(
724
+ (location) =>
725
+ location.group ||
726
+ location.hostId !== "root" ||
727
+ this.#dockForPane(location.pane.id) !== position,
728
+ )
729
+ ) {
730
+ return null;
731
+ }
732
+ const pane = locations[0]!.pane;
733
+ if (locations.some((location) => location.pane !== pane)) return null;
734
+ const indexes = locations.map((location) =>
735
+ pane.items.findIndex((item) => item.id === location.item.id),
736
+ );
737
+ if (indexes.some((index) => index < 0)) return null;
738
+ const insertion = Math.min(...indexes);
739
+ const tabs = locations.map((location) => location.tab);
740
+ for (const index of [...indexes].sort((a, b) => b - a)) {
741
+ pane.items.splice(index, 1);
742
+ }
743
+ const first = tabs[0]!;
744
+ const group: WorkspaceSidebarGroup = {
745
+ kind: "sidebar-group",
746
+ id: options.id ?? createWorkspaceId("sidebar-group"),
747
+ title: options.title ?? first.title,
748
+ icon: options.icon ?? first.icon,
749
+ tabs,
750
+ hiddenTabIds: [],
751
+ collapsedByTabId: Object.fromEntries(tabs.map((tab) => [tab.id, false])),
752
+ panelSizesByTabId: Object.fromEntries(
753
+ tabs.map((tab) => [tab.id, 100 / tabs.length]),
754
+ ),
755
+ };
756
+ pane.items.splice(insertion, 0, group);
757
+ pane.activeItemId = group.id;
758
+ this.layout.active = {
759
+ hostId: "root",
760
+ paneId: pane.id,
761
+ tabId: first.id,
762
+ };
763
+ this.#events.trigger("active-tab-change", first);
764
+ this.#commit({
765
+ source: "sidebar-group",
766
+ id: group.id,
767
+ operation: "group",
768
+ });
769
+ return group;
770
+ }
771
+
772
+ ungroupSidebarGroup(groupId: string): WorkspaceTab[] {
773
+ const location = this.#findSidebarGroupLocation(groupId);
774
+ if (!location) return [];
775
+ const { pane, group } = location;
776
+ const index = pane.items.findIndex((item) => item.id === group.id);
777
+ if (index < 0) return [];
778
+ const tabs = [...group.tabs];
779
+ pane.items.splice(index, 1, ...tabs);
780
+ pane.activeItemId = tabs[0]?.id ?? pane.items[0]?.id ?? null;
781
+ if (tabs[0]) {
782
+ this.layout.active = {
783
+ hostId: "root",
784
+ paneId: pane.id,
785
+ tabId: tabs[0].id,
786
+ };
787
+ this.#events.trigger("active-tab-change", tabs[0]);
788
+ } else {
789
+ this.#activateFallback();
790
+ }
791
+ this.#commit({
792
+ source: "sidebar-group",
793
+ id: groupId,
794
+ operation: "ungroup",
795
+ });
796
+ return tabs;
797
+ }
798
+
799
+ moveSidebarPanelToTabs(groupId: string, tabId: string): boolean {
800
+ const location = this.#findSidebarGroupLocation(groupId);
801
+ if (!location) return false;
802
+ const { group, pane } = location;
803
+ const tabIndex = group.tabs.findIndex((tab) => tab.id === tabId);
804
+ const groupIndex = pane.items.findIndex((item) => item.id === groupId);
805
+ if (tabIndex < 0 || groupIndex < 0) return false;
806
+
807
+ const [tab] = group.tabs.splice(tabIndex, 1);
808
+ if (!tab) return false;
809
+ group.hiddenTabIds = group.hiddenTabIds.filter((id) => id !== tabId);
810
+ delete group.collapsedByTabId[tabId];
811
+ delete group.panelSizesByTabId[tabId];
812
+
813
+ if (group.tabs.length) {
814
+ pane.items.splice(groupIndex + 1, 0, tab);
815
+ } else {
816
+ pane.items.splice(groupIndex, 1, tab);
817
+ }
818
+ pane.activeItemId = tab.id;
819
+ this.layout.active = {
820
+ hostId: "root",
821
+ paneId: pane.id,
822
+ tabId: tab.id,
823
+ };
824
+ this.#events.trigger("active-tab-change", tab);
825
+ this.#commit({
826
+ source: "sidebar-group",
827
+ id: groupId,
828
+ operation: "move-panel",
829
+ });
830
+ return true;
831
+ }
832
+
833
+ closeHiddenSidebarPanels(groupId: string): number {
834
+ const group = this.#findSidebarGroup(groupId);
835
+ if (!group) return 0;
836
+ const hiddenIds = [...group.hiddenTabIds];
837
+ return hiddenIds.reduce(
838
+ (closed, tabId) => closed + Number(this.closeTab(tabId)),
839
+ 0,
840
+ );
841
+ }
842
+
843
+ closeSidebarGroup(groupId: string): number {
844
+ const group = this.#findSidebarGroup(groupId);
845
+ if (!group) return 0;
846
+ const tabIds = group.tabs.map((tab) => tab.id);
847
+ return tabIds.reduce(
848
+ (closed, tabId) => closed + Number(this.closeTab(tabId)),
849
+ 0,
850
+ );
851
+ }
852
+
853
+ setSidebarPanelSize(groupId: string, tabId: string, size: number): boolean {
854
+ return this.setSidebarPanelSizes(groupId, { [tabId]: size });
855
+ }
856
+
857
+ /** @internal Used by the source-shaped grouped sidebar to commit one layout. */
858
+ setSidebarPanelSizes(
859
+ groupId: string,
860
+ sizesByTabId: Readonly<Record<string, number>>,
861
+ ): boolean {
862
+ const group = this.#findSidebarGroup(groupId);
863
+ if (!group) return false;
864
+ const tabIds = new Set(group.tabs.map((tab) => tab.id));
865
+ const entries = Object.entries(sizesByTabId)
866
+ .filter(
867
+ ([tabId, size]) =>
868
+ tabIds.has(tabId) && Number.isFinite(size) && size > 0,
869
+ )
870
+ .map(([tabId, size]) => [tabId, Number(size.toFixed(4))] as const);
871
+ if (!entries.length) return false;
872
+ const changes = entries.filter(
873
+ ([tabId, size]) => group.panelSizesByTabId[tabId] !== size,
874
+ );
875
+ if (!changes.length) return true;
876
+ for (const [tabId, size] of changes) {
877
+ group.panelSizesByTabId[tabId] = size;
878
+ this.#events.trigger("resize", tabId);
879
+ }
880
+ this.#commit({ source: "resize", id: groupId, operation: "sidebar-panel" });
881
+ return true;
882
+ }
883
+
884
+ setSidebarPanelHidden(
885
+ groupId: string,
886
+ tabId: string,
887
+ hidden: boolean,
888
+ ): boolean {
889
+ const group = this.#findSidebarGroup(groupId);
890
+ if (!group || !group.tabs.some((tab) => tab.id === tabId)) return false;
891
+ const ids = new Set(group.hiddenTabIds);
892
+ if (hidden) ids.add(tabId);
893
+ else ids.delete(tabId);
894
+ group.hiddenTabIds = [...ids];
895
+ this.#commit({
896
+ source: "sidebar-group",
897
+ id: tabId,
898
+ operation: "visibility",
899
+ });
900
+ return true;
901
+ }
902
+
903
+ openWindow(
904
+ tab: WorkspaceTab,
905
+ mode: WorkspaceWindowMode = "floating",
906
+ bounds: Partial<WorkspaceWindowBounds> = {},
907
+ ): WorkspaceWindow | null {
908
+ const workspaceWindow: WorkspaceWindow = {
909
+ id: createWorkspaceId("window"),
910
+ mode,
911
+ state: "normal",
912
+ bounds: {
913
+ x: bounds.x ?? 120,
914
+ y: bounds.y ?? 90,
915
+ width: Math.max(280, bounds.width ?? 560),
916
+ height: Math.max(180, bounds.height ?? 420),
917
+ },
918
+ root: createWorkspaceTabs([tab], { activeItemId: tab.id }),
919
+ };
920
+ if (mode === "popout" && !this.#openPopout(workspaceWindow, tab.title)) {
921
+ return null;
922
+ }
923
+ this.layout.windows.push(workspaceWindow);
924
+ this.layout.active = {
925
+ hostId: workspaceWindow.id,
926
+ paneId: workspaceWindow.root.id,
927
+ tabId: tab.id,
928
+ };
929
+ this.#events.trigger("active-tab-change", tab);
930
+ this.#commit({
931
+ source: "window-open",
932
+ id: workspaceWindow.id,
933
+ operation: mode,
934
+ });
935
+ return workspaceWindow;
936
+ }
937
+
938
+ moveTabToDock(tabId: string, position: WorkspaceDockPosition): boolean {
939
+ const location = findWorkspaceTab(this.layout, tabId);
940
+ const target = this.#dockTabsPane(position);
941
+ if (!location || !target) return false;
942
+ if (this.#dockForPane(location.pane.id) === position) return false;
943
+ this.setDockOpen(position, true);
944
+ return this.dropTab(tabId, target.id, "center");
945
+ }
946
+
947
+ floatTab(
948
+ tabId: string,
949
+ bounds: Partial<WorkspaceWindowBounds> = {},
950
+ ): WorkspaceWindow | null {
951
+ const location = findWorkspaceTab(this.layout, tabId);
952
+ if (!location) return null;
953
+ this.clearFocusModeForTab(tabId);
954
+ const tab = location.tab;
955
+ const sourceHostId = location.hostId;
956
+ const sourcePaneId = location.pane.id;
957
+ this.#detachTab(location);
958
+ this.#pruneEmptyPane(sourceHostId, sourcePaneId);
959
+ this.#pruneEmptyWindow(sourceHostId);
960
+ return this.openWindow(tab, "floating", bounds);
961
+ }
962
+
963
+ popoutTab(tabId: string): WorkspaceWindow | null {
964
+ const location = findWorkspaceTab(this.layout, tabId);
965
+ if (!location) return null;
966
+ const tab = location.tab;
967
+ const workspaceWindow = this.openWindow(tab, "popout");
968
+ if (workspaceWindow) {
969
+ const sourcePaneId = location.pane.id;
970
+ this.#detachTab(location);
971
+ this.#pruneEmptyPane(location.hostId, sourcePaneId);
972
+ this.#pruneEmptyWindow(location.hostId);
973
+ }
974
+ return workspaceWindow;
975
+ }
976
+
977
+ setWindowBounds(
978
+ windowId: string,
979
+ bounds: WorkspaceWindowBounds,
980
+ commit = true,
981
+ ): boolean {
982
+ const workspaceWindow = this.#window(windowId);
983
+ if (!workspaceWindow) return false;
984
+ workspaceWindow.bounds = {
985
+ x: Math.max(0, bounds.x),
986
+ y: Math.max(0, bounds.y),
987
+ width: Math.max(280, bounds.width),
988
+ height: Math.max(180, bounds.height),
989
+ };
990
+ if (commit) {
991
+ this.#events.trigger("resize", windowId);
992
+ this.#commit({ source: "window-bounds", id: windowId });
993
+ }
994
+ return true;
995
+ }
996
+
997
+ setWindowState(windowId: string, state: WorkspaceWindowState): boolean {
998
+ const workspaceWindow = this.#window(windowId);
999
+ if (!workspaceWindow) return false;
1000
+ workspaceWindow.state = state;
1001
+ this.#commit({ source: "window-state", id: windowId, operation: state });
1002
+ return true;
1003
+ }
1004
+
1005
+ focusWindow(windowId: string): boolean {
1006
+ const workspaceWindow = this.#window(windowId);
1007
+ if (!workspaceWindow) return false;
1008
+ this.#bringWindowToFront(windowId);
1009
+ const first = firstWorkspaceTab({
1010
+ ...this.layout,
1011
+ main: workspaceWindow.root,
1012
+ left: { ...this.layout.left, root: createWorkspaceTabs([]) },
1013
+ right: { ...this.layout.right, root: createWorkspaceTabs([]) },
1014
+ windows: [],
1015
+ });
1016
+ if (first) {
1017
+ this.layout.active = {
1018
+ hostId: windowId,
1019
+ paneId: first.pane.id,
1020
+ tabId: first.tab.id,
1021
+ };
1022
+ this.#events.trigger("active-tab-change", first.tab);
1023
+ }
1024
+ this.#popoutHandles.get(windowId)?.focus();
1025
+ this.#commit({ source: "window-focus", id: windowId });
1026
+ return true;
1027
+ }
1028
+
1029
+ closeWindow(windowId: string): boolean {
1030
+ const index = this.layout.windows.findIndex(
1031
+ (workspaceWindow) => workspaceWindow.id === windowId,
1032
+ );
1033
+ if (index < 0) return false;
1034
+ this.layout.windows.splice(index, 1);
1035
+ this.#popoutHandles.get(windowId)?.close();
1036
+ this.#popoutHandles.delete(windowId);
1037
+ if (this.layout.active.hostId === windowId) this.#activateFallback();
1038
+ this.#commit({ source: "window-close", id: windowId });
1039
+ return true;
1040
+ }
1041
+
1042
+ dockWindow(windowId: string, targetPaneId: string): boolean {
1043
+ const workspaceWindow = this.#window(windowId);
1044
+ const target = findWorkspacePane(this.layout, targetPaneId);
1045
+ if (!workspaceWindow || !target) return false;
1046
+ const tabs: WorkspaceTab[] = [];
1047
+ const collect = (node: WorkspaceNode) => {
1048
+ if (node.kind === "split") return node.children.forEach(collect);
1049
+ for (const item of node.items) {
1050
+ if (item.kind === "tab") tabs.push(item);
1051
+ else tabs.push(...item.tabs);
1052
+ }
1053
+ };
1054
+ collect(workspaceWindow.root);
1055
+ target.items.push(...tabs);
1056
+ target.activeItemId = tabs.at(-1)?.id ?? target.activeItemId;
1057
+ this.closeWindow(windowId);
1058
+ if (tabs.length) this.selectTab(tabs.at(-1)!.id);
1059
+ return true;
1060
+ }
1061
+
1062
+ setPopoutHost(host: WorkspacePopoutHost | null): void {
1063
+ this.#popoutHost = host;
1064
+ }
1065
+
1066
+ supportsPopoutWindows(): boolean {
1067
+ return Boolean(this.#popoutHost);
1068
+ }
1069
+
1070
+ getPopoutHandle(windowId: string): WorkspacePopoutHandle | null {
1071
+ return this.#popoutHandles.get(windowId) ?? null;
1072
+ }
1073
+
1074
+ createPaneMenu(
1075
+ tabId: string,
1076
+ context: "pane" | "sidebar-group-panel" = "pane",
1077
+ ): WorkspaceMenu {
1078
+ const location = findWorkspaceTab(this.layout, tabId);
1079
+ const menu = new WorkspaceMenu();
1080
+ if (!location) return menu;
1081
+ menu.addGroups([
1082
+ (group) =>
1083
+ group
1084
+ .addItem((item) =>
1085
+ item
1086
+ .setTitle("Split right")
1087
+ .setIcon("separator-vertical")
1088
+ .onClick(() => {
1089
+ const duplicate = {
1090
+ ...location.tab,
1091
+ id: createWorkspaceId("tab"),
1092
+ };
1093
+ this.splitPane(location.pane.id, "right", duplicate);
1094
+ }),
1095
+ )
1096
+ .addItem((item) =>
1097
+ item
1098
+ .setTitle("Split down")
1099
+ .setIcon("separator-horizontal")
1100
+ .onClick(() => {
1101
+ const duplicate = {
1102
+ ...location.tab,
1103
+ id: createWorkspaceId("tab"),
1104
+ };
1105
+ this.splitPane(location.pane.id, "bottom", duplicate);
1106
+ }),
1107
+ ),
1108
+ (group) =>
1109
+ group
1110
+ .addMenu(
1111
+ "Move to",
1112
+ (submenu) => {
1113
+ const currentDock = this.#dockForPane(location.pane.id);
1114
+ for (const destination of [
1115
+ {
1116
+ position: "left" as const,
1117
+ title: "Left Sidebar",
1118
+ icon: "panel-left",
1119
+ },
1120
+ {
1121
+ position: "right" as const,
1122
+ title: "Right Sidebar",
1123
+ icon: "panel-right",
1124
+ },
1125
+ {
1126
+ position: "bottom" as const,
1127
+ title: "Bottom Sidebar",
1128
+ icon: "panel-bottom",
1129
+ },
1130
+ ]) {
1131
+ submenu.addItem((item) =>
1132
+ item
1133
+ .setTitle(destination.title)
1134
+ .setIcon(destination.icon)
1135
+ .setDisabled(currentDock === destination.position)
1136
+ .onClick(() => {
1137
+ this.moveTabToDock(tabId, destination.position);
1138
+ }),
1139
+ );
1140
+ }
1141
+ },
1142
+ { icon: "move" },
1143
+ )
1144
+ .addItem((item) =>
1145
+ item
1146
+ .setTitle("Move to floating window")
1147
+ .setIcon("picture-in-picture")
1148
+ .onClick(() => {
1149
+ this.floatTab(tabId);
1150
+ }),
1151
+ )
1152
+ .addItem((item) =>
1153
+ item
1154
+ .setTitle("Open in new window")
1155
+ .setIcon("panel-top-open")
1156
+ .setDisabled(!this.#popoutHost)
1157
+ .onClick(() => {
1158
+ this.popoutTab(tabId);
1159
+ }),
1160
+ ),
1161
+ (group) =>
1162
+ group.addItem((item) =>
1163
+ item
1164
+ .setTitle("Close")
1165
+ .setIcon("x")
1166
+ .setDisabled(location.tab.closable === false)
1167
+ .onClick(() => {
1168
+ this.closeTab(tabId);
1169
+ }),
1170
+ ),
1171
+ ]);
1172
+ const dock = this.#dockForPane(location.pane.id);
1173
+ if (dock) {
1174
+ const dockLabel = dock === "bottom" ? "panel" : "sidebar";
1175
+ menu.addSeparator();
1176
+ if (location.group) {
1177
+ if (context === "sidebar-group-panel") {
1178
+ menu
1179
+ .addItem((item) =>
1180
+ item.setTitle("Hide this panel").onClick(() => {
1181
+ this.setSidebarPanelHidden(location.group!.id, tabId, true);
1182
+ }),
1183
+ )
1184
+ .addItem((item) =>
1185
+ item.setTitle(`Move to normal ${dockLabel} tabs`).onClick(() => {
1186
+ this.moveSidebarPanelToTabs(location.group!.id, tabId);
1187
+ }),
1188
+ );
1189
+ } else {
1190
+ menu.addItem((item) =>
1191
+ item.setTitle(`Ungroup into ${dockLabel} tabs`).onClick(() => {
1192
+ this.ungroupSidebarGroup(location.group!.id);
1193
+ }),
1194
+ );
1195
+ }
1196
+ } else {
1197
+ menu.addItem((item) =>
1198
+ item.setTitle(`Convert to ${dockLabel} group`).onClick(() => {
1199
+ this.groupDockTabs(dock, [tabId]);
1200
+ }),
1201
+ );
1202
+ }
1203
+ }
1204
+ const definition = this.registry.resolve(location.tab.view.type);
1205
+ definition
1206
+ ?.getChrome?.({
1207
+ tab: location.tab,
1208
+ hostId: location.hostId,
1209
+ paneId: location.pane.id,
1210
+ active: this.activeTabId === tabId,
1211
+ showInlineTitle: this.showInlineTitle,
1212
+ activate: () => this.selectTab(tabId),
1213
+ close: () => this.closeTab(tabId),
1214
+ setState: (state) => this.updateViewState(tabId, state),
1215
+ })
1216
+ .buildPaneMenu?.(menu, {
1217
+ tab: location.tab,
1218
+ hostId: location.hostId,
1219
+ paneId: location.pane.id,
1220
+ active: this.activeTabId === tabId,
1221
+ showInlineTitle: this.showInlineTitle,
1222
+ activate: () => this.selectTab(tabId),
1223
+ close: () => this.closeTab(tabId),
1224
+ setState: (state) => this.updateViewState(tabId, state),
1225
+ });
1226
+ return menu;
1227
+ }
1228
+
1229
+ destroy(): void {
1230
+ if (this.#saveTimer) clearTimeout(this.#saveTimer);
1231
+ for (const handle of this.#popoutHandles.values()) handle.close();
1232
+ this.#popoutHandles.clear();
1233
+ this.#events.clear();
1234
+ }
1235
+
1236
+ #commit(event: WorkspaceLayoutChangeEvent): void {
1237
+ this.#events.trigger("layout-change", event);
1238
+ this.requestSaveLayout(event);
1239
+ }
1240
+
1241
+ #activateTab(tabId: string): boolean {
1242
+ const location = findWorkspaceTab(this.layout, tabId);
1243
+ if (!location) return false;
1244
+ location.pane.activeItemId = location.item.id;
1245
+ this.layout.active = {
1246
+ hostId: location.hostId,
1247
+ paneId: location.pane.id,
1248
+ tabId,
1249
+ };
1250
+ if (location.hostId !== "root") this.#bringWindowToFront(location.hostId);
1251
+ this.#events.trigger("active-tab-change", location.tab);
1252
+ if (
1253
+ this.focusMode?.paneId === location.pane.id &&
1254
+ this.focusMode.tabId !== tabId
1255
+ ) {
1256
+ const state = { tabId, paneId: location.pane.id };
1257
+ this.focusMode = state;
1258
+ this.#events.trigger("focus-mode-change", state);
1259
+ }
1260
+ return true;
1261
+ }
1262
+
1263
+ #activateFallback(): void {
1264
+ const first = firstWorkspaceTab(this.layout);
1265
+ this.layout.active = first
1266
+ ? { hostId: first.hostId, paneId: first.pane.id, tabId: first.tab.id }
1267
+ : { hostId: "root", paneId: null, tabId: null };
1268
+ this.#events.trigger("active-tab-change", first?.tab ?? null);
1269
+ }
1270
+
1271
+ #pruneEmptyWindow(hostId: string): void {
1272
+ if (hostId === "root") return;
1273
+ const index = this.layout.windows.findIndex((entry) => entry.id === hostId);
1274
+ if (index < 0) return;
1275
+ const workspaceWindow = this.layout.windows[index]!;
1276
+ const hasTabs = (node: WorkspaceNode): boolean =>
1277
+ node.kind === "split"
1278
+ ? node.children.some(hasTabs)
1279
+ : node.items.some((item) =>
1280
+ item.kind === "tab" ? true : item.tabs.length > 0,
1281
+ );
1282
+ if (hasTabs(workspaceWindow.root)) return;
1283
+ this.layout.windows.splice(index, 1);
1284
+ this.#popoutHandles.get(hostId)?.close();
1285
+ this.#popoutHandles.delete(hostId);
1286
+ }
1287
+
1288
+ #pruneEmptyPane(hostId: string, paneId: string): void {
1289
+ if (hostId !== "root") {
1290
+ const workspaceWindow = this.#window(hostId);
1291
+ if (!workspaceWindow) return;
1292
+ workspaceWindow.root = pruneEmptyWorkspacePane(
1293
+ workspaceWindow.root,
1294
+ paneId,
1295
+ );
1296
+ return;
1297
+ }
1298
+ if (workspaceNodeContains(this.layout.main, paneId)) {
1299
+ this.layout.main = pruneEmptyWorkspacePane(this.layout.main, paneId);
1300
+ return;
1301
+ }
1302
+ for (const side of ["left", "right"] as const) {
1303
+ if (!workspaceNodeContains(this.layout[side].root, paneId)) continue;
1304
+ this.layout[side].root = pruneEmptyWorkspacePane(
1305
+ this.layout[side].root,
1306
+ paneId,
1307
+ );
1308
+ return;
1309
+ }
1310
+ if (workspaceNodeContains(this.layout.bottom.root, paneId)) {
1311
+ this.layout.bottom.root = pruneEmptyWorkspacePane(
1312
+ this.layout.bottom.root,
1313
+ paneId,
1314
+ ) as WorkspaceTabsNode;
1315
+ }
1316
+ }
1317
+
1318
+ #detachTab(location: NonNullable<ReturnType<typeof findWorkspaceTab>>): void {
1319
+ this.clearFocusModeForTab(location.tab.id);
1320
+ if (location.group) {
1321
+ location.group.tabs.splice(
1322
+ location.group.tabs.findIndex((tab) => tab.id === location.tab.id),
1323
+ 1,
1324
+ );
1325
+ location.group.hiddenTabIds = location.group.hiddenTabIds.filter(
1326
+ (id) => id !== location.tab.id,
1327
+ );
1328
+ delete location.group.collapsedByTabId[location.tab.id];
1329
+ delete location.group.panelSizesByTabId[location.tab.id];
1330
+ if (location.group.tabs.length === 0) {
1331
+ const groupIndex = location.pane.items.findIndex(
1332
+ (item) => item.id === location.group?.id,
1333
+ );
1334
+ if (groupIndex >= 0) location.pane.items.splice(groupIndex, 1);
1335
+ }
1336
+ } else {
1337
+ location.pane.items.splice(
1338
+ location.pane.items.findIndex((item) => item.id === location.item.id),
1339
+ 1,
1340
+ );
1341
+ }
1342
+ if (location.pane.activeItemId === location.item.id) {
1343
+ location.pane.activeItemId = location.pane.items[0]?.id ?? null;
1344
+ }
1345
+ }
1346
+
1347
+ #findPaneHost(
1348
+ paneId: string,
1349
+ ): { hostId: string; pane: WorkspaceTabsNode } | null {
1350
+ const pane = findWorkspacePane(this.layout, paneId);
1351
+ if (!pane) return null;
1352
+ let hostId = "root";
1353
+ for (const workspaceWindow of this.layout.windows) {
1354
+ const synthetic: WorkspaceLayout = {
1355
+ ...this.layout,
1356
+ main: workspaceWindow.root,
1357
+ left: { ...this.layout.left, root: createWorkspaceTabs([]) },
1358
+ right: { ...this.layout.right, root: createWorkspaceTabs([]) },
1359
+ bottom: {
1360
+ ...this.layout.bottom,
1361
+ root: createWorkspaceTabs([]),
1362
+ },
1363
+ windows: [],
1364
+ };
1365
+ if (findWorkspacePane(synthetic, paneId)) hostId = workspaceWindow.id;
1366
+ }
1367
+ return { hostId, pane };
1368
+ }
1369
+
1370
+ #replaceHostNode(
1371
+ hostId: string,
1372
+ nodeId: string,
1373
+ replacement: WorkspaceNode,
1374
+ ): void {
1375
+ if (hostId === "root") {
1376
+ if (workspaceNodeContains(this.layout.main, nodeId)) {
1377
+ this.layout.main = normalizeWorkspaceTree(
1378
+ replaceWorkspaceNode(this.layout.main, nodeId, replacement),
1379
+ );
1380
+ return;
1381
+ }
1382
+ for (const side of ["left", "right"] as const) {
1383
+ if (!workspaceNodeContains(this.layout[side].root, nodeId)) continue;
1384
+ this.layout[side].root = normalizeWorkspaceTree(
1385
+ replaceWorkspaceNode(this.layout[side].root, nodeId, replacement),
1386
+ );
1387
+ return;
1388
+ }
1389
+ if (
1390
+ replacement.kind === "tabs" &&
1391
+ workspaceNodeContains(this.layout.bottom.root, nodeId)
1392
+ ) {
1393
+ this.layout.bottom.root = replacement;
1394
+ }
1395
+ return;
1396
+ }
1397
+ const workspaceWindow = this.#window(hostId);
1398
+ if (workspaceWindow) {
1399
+ workspaceWindow.root = normalizeWorkspaceTree(
1400
+ replaceWorkspaceNode(workspaceWindow.root, nodeId, replacement),
1401
+ );
1402
+ }
1403
+ }
1404
+
1405
+ #findSidebarGroup(groupId: string): WorkspaceSidebarGroup | null {
1406
+ return this.#findSidebarGroupLocation(groupId)?.group ?? null;
1407
+ }
1408
+
1409
+ #findSidebarGroupLocation(groupId: string): {
1410
+ side: WorkspaceDockPosition;
1411
+ pane: WorkspaceTabsNode;
1412
+ group: WorkspaceSidebarGroup;
1413
+ } | null {
1414
+ for (const side of ["left", "right", "bottom"] as const) {
1415
+ let match: {
1416
+ side: WorkspaceDockPosition;
1417
+ pane: WorkspaceTabsNode;
1418
+ group: WorkspaceSidebarGroup;
1419
+ } | null = null;
1420
+ walkWorkspaceTabs(this.layout[side].root, (pane) => {
1421
+ const group = pane.items.find(
1422
+ (item): item is WorkspaceSidebarGroup =>
1423
+ item.kind === "sidebar-group" && item.id === groupId,
1424
+ );
1425
+ if (group) match = { side, pane, group };
1426
+ });
1427
+ if (match) return match;
1428
+ }
1429
+ return null;
1430
+ }
1431
+
1432
+ #dockTabsPane(position: WorkspaceDockPosition): WorkspaceTabsNode | null {
1433
+ const preferredId =
1434
+ position === "left"
1435
+ ? "left-sidebar"
1436
+ : position === "right"
1437
+ ? "right-sidebar"
1438
+ : "bottom-panel";
1439
+ const preferred = findWorkspacePane(this.layout, preferredId);
1440
+ if (preferred && this.#dockForPane(preferred.id) === position) {
1441
+ return preferred;
1442
+ }
1443
+ return firstWorkspaceTabsNode(this.layout[position].root);
1444
+ }
1445
+
1446
+ #dockForPane(paneId: string): WorkspaceDockPosition | null {
1447
+ if (workspaceNodeContains(this.layout.left.root, paneId)) return "left";
1448
+ if (workspaceNodeContains(this.layout.right.root, paneId)) return "right";
1449
+ if (workspaceNodeContains(this.layout.bottom.root, paneId)) return "bottom";
1450
+ return null;
1451
+ }
1452
+
1453
+ #findNode(nodeId: string): WorkspaceNode | null {
1454
+ const find = (node: WorkspaceNode): WorkspaceNode | null => {
1455
+ if (node.id === nodeId) return node;
1456
+ if (node.kind === "tabs") return null;
1457
+ for (const child of node.children) {
1458
+ const match = find(child);
1459
+ if (match) return match;
1460
+ }
1461
+ return null;
1462
+ };
1463
+ const main = find(this.layout.main);
1464
+ if (main) return main;
1465
+ const left = find(this.layout.left.root);
1466
+ if (left) return left;
1467
+ const right = find(this.layout.right.root);
1468
+ if (right) return right;
1469
+ const bottom = find(this.layout.bottom.root);
1470
+ if (bottom) return bottom;
1471
+ for (const workspaceWindow of this.layout.windows) {
1472
+ const match = find(workspaceWindow.root);
1473
+ if (match) return match;
1474
+ }
1475
+ return null;
1476
+ }
1477
+
1478
+ #window(windowId: string): WorkspaceWindow | null {
1479
+ return (
1480
+ this.layout.windows.find(
1481
+ (workspaceWindow) => workspaceWindow.id === windowId,
1482
+ ) ?? null
1483
+ );
1484
+ }
1485
+
1486
+ #bringWindowToFront(windowId: string): void {
1487
+ const index = this.layout.windows.findIndex(
1488
+ (workspaceWindow) => workspaceWindow.id === windowId,
1489
+ );
1490
+ if (index < 0 || index === this.layout.windows.length - 1) return;
1491
+ const [workspaceWindow] = this.layout.windows.splice(index, 1);
1492
+ this.layout.windows.push(workspaceWindow);
1493
+ }
1494
+
1495
+ #openPopout(workspaceWindow: WorkspaceWindow, title: string): boolean {
1496
+ const handle = this.#popoutHost?.open({
1497
+ id: workspaceWindow.id,
1498
+ title,
1499
+ bounds: workspaceWindow.bounds,
1500
+ });
1501
+ if (!handle) return false;
1502
+ this.#popoutHandles.set(workspaceWindow.id, handle);
1503
+ handle.onClose(() => {
1504
+ if (this.#window(workspaceWindow.id))
1505
+ this.closeWindow(workspaceWindow.id);
1506
+ });
1507
+ return true;
1508
+ }
1509
+ }