@orbit-work/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (755) hide show
  1. package/README.md +110 -0
  2. package/dist/about-window.cjs +1 -0
  3. package/dist/about-window.d.cts +12 -0
  4. package/dist/about-window.d.ts +12 -0
  5. package/dist/about-window.js +1 -0
  6. package/dist/appearance-D5uQ53j3.d.cts +210 -0
  7. package/dist/appearance-D5uQ53j3.d.ts +210 -0
  8. package/dist/appearance.cjs +1 -0
  9. package/dist/appearance.d.cts +1 -0
  10. package/dist/appearance.d.ts +1 -0
  11. package/dist/appearance.js +1 -0
  12. package/dist/browser-annotation-popup.cjs +1 -0
  13. package/dist/browser-annotation-popup.d.cts +48 -0
  14. package/dist/browser-annotation-popup.d.ts +48 -0
  15. package/dist/browser-annotation-popup.js +1 -0
  16. package/dist/chunk-3KT7IU4X.js +13 -0
  17. package/dist/chunk-5VLBKOG7.cjs +194 -0
  18. package/dist/chunk-7YJY64LZ.js +82 -0
  19. package/dist/chunk-EF2BSN3K.cjs +13 -0
  20. package/dist/chunk-GMMYDILD.cjs +82 -0
  21. package/dist/chunk-VG7FQQ7K.js +194 -0
  22. package/dist/fonts/JetBrainsMono-Medium.ttf +0 -0
  23. package/dist/fonts/JetBrainsMono-Regular.ttf +0 -0
  24. package/dist/fonts/SpaceGrotesk-500-latin-ext.woff2 +0 -0
  25. package/dist/fonts/SpaceGrotesk-500-latin.woff2 +0 -0
  26. package/dist/fonts/SpaceGrotesk-700-latin-ext.woff2 +0 -0
  27. package/dist/fonts/SpaceGrotesk-700-latin.woff2 +0 -0
  28. package/dist/fonts/ibm-plex-mono-latin-400-italic.woff2 +0 -0
  29. package/dist/fonts/ibm-plex-mono-latin-400.woff2 +0 -0
  30. package/dist/fonts/ibm-plex-mono-latin-500.woff2 +0 -0
  31. package/dist/fonts/ibm-plex-mono-latin-ext-400-italic.woff2 +0 -0
  32. package/dist/fonts/ibm-plex-mono-latin-ext-400.woff2 +0 -0
  33. package/dist/fonts/ibm-plex-mono-latin-ext-500.woff2 +0 -0
  34. package/dist/index.cjs +32 -0
  35. package/dist/index.css +1 -0
  36. package/dist/index.d.cts +10345 -0
  37. package/dist/index.d.ts +10345 -0
  38. package/dist/index.js +32 -0
  39. package/dist/orbitwork.css +22134 -0
  40. package/package.json +119 -0
  41. package/src/components/Layout/AppLayout/AppLayout.stories.tsx +246 -0
  42. package/src/components/Layout/AppLayout/AppLayoutSource.test.mjs +37 -0
  43. package/src/components/Layout/AppLayout/index.tsx +122 -0
  44. package/src/components/Layout/Sidebar/index.tsx +13 -0
  45. package/src/components/Layout/SidebarShell/SidebarShell.stories.tsx +676 -0
  46. package/src/components/Layout/SidebarShell/SidebarShellSource.test.mjs +161 -0
  47. package/src/components/Layout/SidebarShell/index.tsx +326 -0
  48. package/src/components/Layout/index.ts +10 -0
  49. package/src/components/composite/ActionBar/ActionBar.stories.tsx +26 -0
  50. package/src/components/composite/ActionBar/index.tsx +31 -0
  51. package/src/components/composite/ActionStatus/ActionStatus.stories.tsx +60 -0
  52. package/src/components/composite/ActionStatus/index.tsx +21 -0
  53. package/src/components/composite/AskQuestionCardView/AskQuestionCardView.stories.tsx +175 -0
  54. package/src/components/composite/AskQuestionCardView/AskQuestionCardViewSource.test.mjs +92 -0
  55. package/src/components/composite/AskQuestionCardView/index.tsx +119 -0
  56. package/src/components/composite/AssistantChannelCard/AssistantChannelCard.stories.tsx +265 -0
  57. package/src/components/composite/AssistantChannelCard/AssistantChannelCardSource.test.mjs +45 -0
  58. package/src/components/composite/AssistantChannelCard/index.tsx +102 -0
  59. package/src/components/composite/AssistantToggleRow/AssistantToggleRow.stories.tsx +197 -0
  60. package/src/components/composite/AssistantToggleRow/index.tsx +35 -0
  61. package/src/components/composite/AttachmentCard/AttachmentCard.stories.tsx +125 -0
  62. package/src/components/composite/AttachmentCard/index.tsx +80 -0
  63. package/src/components/composite/BackButton/BackButton.stories.tsx +93 -0
  64. package/src/components/composite/BackButton/BackButtonSource.test.mjs +29 -0
  65. package/src/components/composite/BackButton/index.tsx +48 -0
  66. package/src/components/composite/Banner/Banner.stories.tsx +180 -0
  67. package/src/components/composite/Banner/BannerSource.test.mjs +67 -0
  68. package/src/components/composite/Banner/index.tsx +125 -0
  69. package/src/components/composite/BeaconIcons/BeaconIcons.stories.tsx +153 -0
  70. package/src/components/composite/BeaconIcons/index.tsx +265 -0
  71. package/src/components/composite/BeaconSpinner/BeaconSpinner.stories.tsx +144 -0
  72. package/src/components/composite/BeaconSpinner/index.tsx +185 -0
  73. package/src/components/composite/CatalogStates/CatalogEmptyState.stories.tsx +108 -0
  74. package/src/components/composite/CatalogStates/CatalogStates.stories.tsx +53 -0
  75. package/src/components/composite/CatalogStates/CatalogStatesSource.test.mjs +149 -0
  76. package/src/components/composite/CatalogStates/index.tsx +113 -0
  77. package/src/components/composite/Charts/Charts.stories.tsx +174 -0
  78. package/src/components/composite/Charts/ChartsSource.test.mjs +111 -0
  79. package/src/components/composite/Charts/index.tsx +385 -0
  80. package/src/components/composite/CodeBlock/CodeBlock.stories.tsx +308 -0
  81. package/src/components/composite/CodeBlock/CodeFaceSource.test.mjs +89 -0
  82. package/src/components/composite/CodeBlock/index.tsx +300 -0
  83. package/src/components/composite/CodeDiff/CodeDiff.stories.tsx +169 -0
  84. package/src/components/composite/CodeDiff/index.tsx +373 -0
  85. package/src/components/composite/CodePreview/CodePreview.stories.tsx +127 -0
  86. package/src/components/composite/CodePreview/CodePreviewSource.test.mjs +43 -0
  87. package/src/components/composite/CodePreview/index.tsx +98 -0
  88. package/src/components/composite/CommandPalette/CommandPalette.stories.tsx +89 -0
  89. package/src/components/composite/CommandPalette/CommandPaletteSource.test.mjs +61 -0
  90. package/src/components/composite/CommandPalette/index.tsx +310 -0
  91. package/src/components/composite/ContentRecommendation/ContentRecommendation.stories.tsx +300 -0
  92. package/src/components/composite/ContentRecommendation/ContentRecommendationSource.test.mjs +48 -0
  93. package/src/components/composite/ContentRecommendation/index.tsx +116 -0
  94. package/src/components/composite/ContextChip/ContextChip.stories.tsx +123 -0
  95. package/src/components/composite/ContextChip/ContextChipSource.test.mjs +24 -0
  96. package/src/components/composite/ContextChip/index.tsx +25 -0
  97. package/src/components/composite/ContextUsageIndicatorView/ContextUsageIndicatorSizeSource.test.mjs +15 -0
  98. package/src/components/composite/ContextUsageIndicatorView/ContextUsageIndicatorView.stories.tsx +110 -0
  99. package/src/components/composite/ContextUsageIndicatorView/ContextUsageLoadingSource.test.mjs +23 -0
  100. package/src/components/composite/ContextUsageIndicatorView/index.tsx +139 -0
  101. package/src/components/composite/Controls/Controls.stories.tsx +227 -0
  102. package/src/components/composite/Controls/index.tsx +15 -0
  103. package/src/components/composite/CreateProjectDialog/CreateProjectDialog.stories.tsx +56 -0
  104. package/src/components/composite/CreateProjectDialog/index.tsx +70 -0
  105. package/src/components/composite/DataManagementSectionView/DataManagementSectionView.stories.tsx +123 -0
  106. package/src/components/composite/DataManagementSectionView/DataManagementSectionViewSource.test.mjs +45 -0
  107. package/src/components/composite/DataManagementSectionView/index.tsx +110 -0
  108. package/src/components/composite/DataTable/DataTable.stories.tsx +159 -0
  109. package/src/components/composite/DataTable/DataTableSource.test.mjs +96 -0
  110. package/src/components/composite/DataTable/index.tsx +373 -0
  111. package/src/components/composite/DetailChrome/DetailChrome.stories.tsx +61 -0
  112. package/src/components/composite/DetailChrome/DetailChromeSource.test.mjs +31 -0
  113. package/src/components/composite/DetailChrome/index.tsx +94 -0
  114. package/src/components/composite/DetailPanel/DetailPanel.stories.tsx +185 -0
  115. package/src/components/composite/DetailPanel/DetailPanelSource.test.mjs +49 -0
  116. package/src/components/composite/DetailPanel/index.tsx +120 -0
  117. package/src/components/composite/DetailScaffold/DetailScaffold.stories.tsx +203 -0
  118. package/src/components/composite/DetailScaffold/DetailScaffoldSource.test.mjs +38 -0
  119. package/src/components/composite/DetailScaffold/index.tsx +114 -0
  120. package/src/components/composite/Dialog/Dialog.stories.tsx +343 -0
  121. package/src/components/composite/Dialog/DialogSource.test.mjs +130 -0
  122. package/src/components/composite/Dialog/index.tsx +333 -0
  123. package/src/components/composite/DropZone/DropZone.stories.tsx +105 -0
  124. package/src/components/composite/DropZone/DropZoneSource.test.mjs +68 -0
  125. package/src/components/composite/DropZone/index.tsx +196 -0
  126. package/src/components/composite/FSelect/FSelect.stories.tsx +64 -0
  127. package/src/components/composite/FSelect/index.tsx +29 -0
  128. package/src/components/composite/FeedbackContextMenuView/FeedbackContextMenuView.stories.tsx +106 -0
  129. package/src/components/composite/FeedbackContextMenuView/index.tsx +51 -0
  130. package/src/components/composite/FeedbackDialogView/FeedbackDialogView.stories.tsx +291 -0
  131. package/src/components/composite/FeedbackDialogView/index.tsx +95 -0
  132. package/src/components/composite/FileReferenceCard/FileReferenceCard.stories.tsx +364 -0
  133. package/src/components/composite/FileReferenceCard/FileReferenceCardSource.test.mjs +48 -0
  134. package/src/components/composite/FileReferenceCard/index.tsx +122 -0
  135. package/src/components/composite/FilterBar/FilterBar.stories.tsx +167 -0
  136. package/src/components/composite/FilterBar/FilterBarSource.test.mjs +75 -0
  137. package/src/components/composite/FilterBar/index.tsx +206 -0
  138. package/src/components/composite/FormField/FormField.stories.tsx +158 -0
  139. package/src/components/composite/FormField/FormFieldSource.test.mjs +56 -0
  140. package/src/components/composite/FormField/index.tsx +219 -0
  141. package/src/components/composite/HomeBackdrop/HomeBackdrop.stories.tsx +54 -0
  142. package/src/components/composite/HomeBackdrop/HomeBackdropSource.test.mjs +50 -0
  143. package/src/components/composite/HomeBackdrop/index.tsx +53 -0
  144. package/src/components/composite/Icons/Icons.stories.tsx +153 -0
  145. package/src/components/composite/Icons/IconsSource.test.mjs +23 -0
  146. package/src/components/composite/Icons/index.tsx +1347 -0
  147. package/src/components/composite/ImageCard/ImageCard.stories.tsx +54 -0
  148. package/src/components/composite/ImageCard/index.tsx +33 -0
  149. package/src/components/composite/ImagePreview/ImagePreview.stories.tsx +172 -0
  150. package/src/components/composite/ImagePreview/ImagePreviewSource.test.mjs +95 -0
  151. package/src/components/composite/ImagePreview/index.tsx +339 -0
  152. package/src/components/composite/ListRow/ListRow.stories.tsx +257 -0
  153. package/src/components/composite/ListRow/ListRowSource.test.mjs +101 -0
  154. package/src/components/composite/ListRow/index.tsx +309 -0
  155. package/src/components/composite/Markdown/Markdown.stories.tsx +192 -0
  156. package/src/components/composite/Markdown/MarkdownSource.test.mjs +126 -0
  157. package/src/components/composite/Markdown/MarkdownStyleSource.test.mjs +152 -0
  158. package/src/components/composite/Markdown/index.tsx +702 -0
  159. package/src/components/composite/MarkdownPreview/MarkdownPreview.stories.tsx +174 -0
  160. package/src/components/composite/MarkdownPreview/MarkdownPreviewTabsSource.test.mjs +31 -0
  161. package/src/components/composite/MarkdownPreview/MarkdownRenderedStyleSource.test.mjs +84 -0
  162. package/src/components/composite/MarkdownPreview/index.tsx +140 -0
  163. package/src/components/composite/MarkdownPreviewModalView/MarkdownPreviewModalView.stories.tsx +104 -0
  164. package/src/components/composite/MarkdownPreviewModalView/index.tsx +85 -0
  165. package/src/components/composite/MessageFeedbackDialog/MessageFeedbackDialog.stories.tsx +66 -0
  166. package/src/components/composite/MessageFeedbackDialog/index.tsx +115 -0
  167. package/src/components/composite/ModelCatalogErrorState/ModelCatalogErrorState.stories.tsx +101 -0
  168. package/src/components/composite/ModelCatalogErrorState/ModelCatalogRetrySource.test.mjs +86 -0
  169. package/src/components/composite/ModelCatalogErrorState/index.tsx +59 -0
  170. package/src/components/composite/ModelModalityFlow/ModelModalityFlow.stories.tsx +224 -0
  171. package/src/components/composite/ModelModalityFlow/ModelModalityFlowSource.test.mjs +56 -0
  172. package/src/components/composite/ModelModalityFlow/index.tsx +113 -0
  173. package/src/components/composite/ModelPickerList/ModelPickerList.stories.tsx +313 -0
  174. package/src/components/composite/ModelPickerList/index.tsx +142 -0
  175. package/src/components/composite/ModelSelect/ModelSelect.stories.tsx +90 -0
  176. package/src/components/composite/ModelSelect/index.tsx +148 -0
  177. package/src/components/composite/ModelsSettingsSectionView/ModelsSettingsSectionView.stories.tsx +170 -0
  178. package/src/components/composite/ModelsSettingsSectionView/index.tsx +139 -0
  179. package/src/components/composite/NativeControls/NativeControls.stories.tsx +386 -0
  180. package/src/components/composite/NativeControls/NativeControlsStyleSource.test.mjs +63 -0
  181. package/src/components/composite/NativeControls/index.tsx +97 -0
  182. package/src/components/composite/NavMenu/NavMenu.stories.tsx +383 -0
  183. package/src/components/composite/NavMenu/NavMenuSource.test.mjs +56 -0
  184. package/src/components/composite/NavMenu/index.tsx +142 -0
  185. package/src/components/composite/NoPlanPanelView/NoPlanPanelView.stories.tsx +344 -0
  186. package/src/components/composite/NoPlanPanelView/NoPlanPanelViewSource.test.mjs +34 -0
  187. package/src/components/composite/NoPlanPanelView/index.tsx +97 -0
  188. package/src/components/composite/OpenWithButton/OpenWithButton.stories.tsx +78 -0
  189. package/src/components/composite/OpenWithButton/index.tsx +46 -0
  190. package/src/components/composite/OrbitworkLogo/OrbitworkLogo.stories.tsx +192 -0
  191. package/src/components/composite/OrbitworkLogo/index.tsx +207 -0
  192. package/src/components/composite/OrbitworkModal/OrbitworkModal.stories.tsx +58 -0
  193. package/src/components/composite/OrbitworkModal/index.tsx +31 -0
  194. package/src/components/composite/PageHead/PageHead.stories.tsx +235 -0
  195. package/src/components/composite/PageHead/PageHeadSource.test.mjs +76 -0
  196. package/src/components/composite/PageHead/index.tsx +128 -0
  197. package/src/components/composite/PlanFeatureIcon/PlanFeatureIcon.stories.tsx +205 -0
  198. package/src/components/composite/PlanFeatureIcon/PlanFeatureIconSource.test.mjs +38 -0
  199. package/src/components/composite/PlanFeatureIcon/index.tsx +48 -0
  200. package/src/components/composite/PlanSettingsSectionView/PlanSettingsSectionView.stories.tsx +231 -0
  201. package/src/components/composite/PlanSettingsSectionView/PlanSettingsSectionViewSource.test.mjs +85 -0
  202. package/src/components/composite/PlanSettingsSectionView/index.tsx +264 -0
  203. package/src/components/composite/Popover/Popover.stories.tsx +175 -0
  204. package/src/components/composite/Popover/PopoverSource.test.mjs +59 -0
  205. package/src/components/composite/Popover/index.tsx +176 -0
  206. package/src/components/composite/PptxRenderer/ElementDispatcher/index.tsx +70 -0
  207. package/src/components/composite/PptxRenderer/PptxChromeStyleSource.test.mjs +36 -0
  208. package/src/components/composite/PptxRenderer/PptxRenderer.stories.tsx +128 -0
  209. package/src/components/composite/PptxRenderer/PptxSlide/index.tsx +48 -0
  210. package/src/components/composite/PptxRenderer/constants.ts +2 -0
  211. package/src/components/composite/PptxRenderer/elements/AudioElement/index.tsx +48 -0
  212. package/src/components/composite/PptxRenderer/elements/ChartElement/index.tsx +172 -0
  213. package/src/components/composite/PptxRenderer/elements/DiagramElement/index.tsx +46 -0
  214. package/src/components/composite/PptxRenderer/elements/GroupElement/index.tsx +28 -0
  215. package/src/components/composite/PptxRenderer/elements/ImageElement/index.tsx +61 -0
  216. package/src/components/composite/PptxRenderer/elements/MathElement/index.tsx +57 -0
  217. package/src/components/composite/PptxRenderer/elements/ShapeElement/index.tsx +327 -0
  218. package/src/components/composite/PptxRenderer/elements/TableElement/index.tsx +90 -0
  219. package/src/components/composite/PptxRenderer/elements/TextElement/index.tsx +57 -0
  220. package/src/components/composite/PptxRenderer/elements/VideoElement/index.tsx +43 -0
  221. package/src/components/composite/PptxRenderer/index.ts +24 -0
  222. package/src/components/composite/PptxRenderer/types.ts +326 -0
  223. package/src/components/composite/PptxRenderer/utils.ts +129 -0
  224. package/src/components/composite/ProjectSelect/ProjectSelect.stories.tsx +112 -0
  225. package/src/components/composite/ProjectSelect/ProjectSelectSource.test.mjs +34 -0
  226. package/src/components/composite/ProjectSelect/index.tsx +155 -0
  227. package/src/components/composite/RadioCard/RadioCard.stories.tsx +130 -0
  228. package/src/components/composite/RadioCard/RadioCardSource.test.mjs +42 -0
  229. package/src/components/composite/RadioCard/index.tsx +171 -0
  230. package/src/components/composite/RowOverflowMenu/RowOverflowMenu.stories.tsx +113 -0
  231. package/src/components/composite/RowOverflowMenu/RowOverflowMenuSource.test.mjs +59 -0
  232. package/src/components/composite/RowOverflowMenu/index.tsx +101 -0
  233. package/src/components/composite/SandboxPermissionPrompt/SandboxPermissionPrompt.stories.tsx +159 -0
  234. package/src/components/composite/SandboxPermissionPrompt/SandboxPermissionPromptSource.test.mjs +71 -0
  235. package/src/components/composite/SandboxPermissionPrompt/index.tsx +157 -0
  236. package/src/components/composite/SearchInput/SearchInput.stories.tsx +127 -0
  237. package/src/components/composite/SearchInput/index.tsx +91 -0
  238. package/src/components/composite/SearchResult/SearchResult.stories.tsx +305 -0
  239. package/src/components/composite/SearchResult/SearchResultSource.test.mjs +45 -0
  240. package/src/components/composite/SearchResult/index.tsx +148 -0
  241. package/src/components/composite/Section/Section.stories.tsx +148 -0
  242. package/src/components/composite/Section/SectionSource.test.mjs +59 -0
  243. package/src/components/composite/Section/index.tsx +105 -0
  244. package/src/components/composite/SelectionBulkBar/SelectionBulkBar.stories.tsx +111 -0
  245. package/src/components/composite/SelectionBulkBar/SelectionBulkBarSource.test.mjs +44 -0
  246. package/src/components/composite/SelectionBulkBar/index.tsx +99 -0
  247. package/src/components/composite/ShareStrip/ShareStrip.stories.tsx +123 -0
  248. package/src/components/composite/ShareStrip/index.tsx +83 -0
  249. package/src/components/composite/ShortcutSheet/ShortcutSheet.stories.tsx +90 -0
  250. package/src/components/composite/ShortcutSheet/ShortcutSheetSource.test.mjs +49 -0
  251. package/src/components/composite/ShortcutSheet/index.tsx +163 -0
  252. package/src/components/composite/SitesArtifactCardView/SitesArtifactCardView.stories.tsx +328 -0
  253. package/src/components/composite/SitesArtifactCardView/SitesArtifactCardViewSource.test.mjs +45 -0
  254. package/src/components/composite/SitesArtifactCardView/index.tsx +100 -0
  255. package/src/components/composite/Skeleton/Skeleton.stories.tsx +188 -0
  256. package/src/components/composite/Skeleton/SkeletonSource.test.mjs +25 -0
  257. package/src/components/composite/Skeleton/index.tsx +152 -0
  258. package/src/components/composite/Splash/Splash.stories.tsx +150 -0
  259. package/src/components/composite/Splash/index.tsx +229 -0
  260. package/src/components/composite/StatusTag/StatusTag.stories.tsx +66 -0
  261. package/src/components/composite/StatusTag/StatusTagSource.test.mjs +64 -0
  262. package/src/components/composite/StatusTag/index.tsx +78 -0
  263. package/src/components/composite/StepList/StepList.stories.tsx +352 -0
  264. package/src/components/composite/StepList/index.tsx +23 -0
  265. package/src/components/composite/Tag/Tag.stories.tsx +279 -0
  266. package/src/components/composite/Tag/TagSource.test.mjs +67 -0
  267. package/src/components/composite/Tag/index.tsx +229 -0
  268. package/src/components/composite/TimePicker/TimePicker.stories.tsx +91 -0
  269. package/src/components/composite/TimePicker/TimePickerSource.test.mjs +98 -0
  270. package/src/components/composite/TimePicker/index.tsx +208 -0
  271. package/src/components/composite/TitleBar/TitleBar.stories.tsx +329 -0
  272. package/src/components/composite/TitleBar/TitleBarSource.test.mjs +140 -0
  273. package/src/components/composite/TitleBar/index.tsx +350 -0
  274. package/src/components/composite/Toast/Toast.stories.tsx +304 -0
  275. package/src/components/composite/Toast/ToastSource.test.mjs +63 -0
  276. package/src/components/composite/Toast/index.tsx +135 -0
  277. package/src/components/composite/Tooltip/Tooltip.stories.tsx +304 -0
  278. package/src/components/composite/Tooltip/TooltipSource.test.mjs +34 -0
  279. package/src/components/composite/Tooltip/index.tsx +204 -0
  280. package/src/components/composite/TranscriptDividers/TranscriptDividers.stories.tsx +160 -0
  281. package/src/components/composite/TranscriptDividers/TranscriptDividersSource.test.mjs +90 -0
  282. package/src/components/composite/TranscriptDividers/index.tsx +352 -0
  283. package/src/components/composite/WCardShell/WCardShell.stories.tsx +228 -0
  284. package/src/components/composite/WCardShell/index.tsx +101 -0
  285. package/src/components/composite/index.ts +81 -0
  286. package/src/components/domain/artifacts/ArtifactPreviewSidebarView/ArtifactPreviewSidebarView.stories.tsx +128 -0
  287. package/src/components/domain/artifacts/ArtifactPreviewSidebarView/ArtifactPreviewSidebarViewSource.test.mjs +69 -0
  288. package/src/components/domain/artifacts/ArtifactPreviewSidebarView/index.tsx +212 -0
  289. package/src/components/domain/artifacts/index.ts +1 -0
  290. package/src/components/domain/browser/BrowserAnnotationPopupView/BrowserAnnotationPopupView.stories.tsx +211 -0
  291. package/src/components/domain/browser/BrowserAnnotationPopupView/BrowserAnnotationPopupViewSource.test.mjs +82 -0
  292. package/src/components/domain/browser/BrowserAnnotationPopupView/index.tsx +235 -0
  293. package/src/components/domain/browser/BrowserDeviceToolbarView/BrowserDeviceToolbarView.stories.tsx +260 -0
  294. package/src/components/domain/browser/BrowserDeviceToolbarView/BrowserDeviceToolbarViewSource.test.mjs +12 -0
  295. package/src/components/domain/browser/BrowserDeviceToolbarView/index.tsx +154 -0
  296. package/src/components/domain/browser/BrowserFindBarView/BrowserFindBarView.stories.tsx +52 -0
  297. package/src/components/domain/browser/BrowserFindBarView/index.tsx +111 -0
  298. package/src/components/domain/browser/BrowserImportDialogView/BrowserImportDialogView.stories.tsx +89 -0
  299. package/src/components/domain/browser/BrowserImportDialogView/index.tsx +155 -0
  300. package/src/components/domain/browser/BrowserLoadErrorView/BrowserLoadErrorView.stories.tsx +197 -0
  301. package/src/components/domain/browser/BrowserLoadErrorView/BrowserLoadErrorViewSource.test.mjs +29 -0
  302. package/src/components/domain/browser/BrowserLoadErrorView/index.tsx +45 -0
  303. package/src/components/domain/browser/BrowserMoreMenuView/BrowserMoreMenuView.stories.tsx +66 -0
  304. package/src/components/domain/browser/BrowserMoreMenuView/index.tsx +268 -0
  305. package/src/components/domain/browser/BrowserNavBarView/BrowserNavBarView.stories.tsx +149 -0
  306. package/src/components/domain/browser/BrowserNavBarView/index.tsx +156 -0
  307. package/src/components/domain/browser/BrowserTabBarView/index.tsx +18 -0
  308. package/src/components/domain/browser/SubAgentPane/SubAgentPane.stories.tsx +96 -0
  309. package/src/components/domain/browser/SubAgentPane/SubAgentPaneSource.test.mjs +48 -0
  310. package/src/components/domain/browser/SubAgentPane/index.tsx +121 -0
  311. package/src/components/domain/browser/TerminalPane/TerminalPane.stories.tsx +95 -0
  312. package/src/components/domain/browser/TerminalPane/TerminalPaneSource.test.mjs +52 -0
  313. package/src/components/domain/browser/TerminalPane/index.tsx +75 -0
  314. package/src/components/domain/browser/WebPreview/WebPreview.stories.tsx +71 -0
  315. package/src/components/domain/browser/WebPreview/index.tsx +141 -0
  316. package/src/components/domain/browser/WebPreviewConsole/WebPreviewConsole.stories.tsx +61 -0
  317. package/src/components/domain/browser/WebPreviewConsole/WebPreviewConsoleSource.test.mjs +66 -0
  318. package/src/components/domain/browser/WebPreviewConsole/index.tsx +239 -0
  319. package/src/components/domain/browser/WebPreviewDialog/WebPreviewDialog.stories.tsx +288 -0
  320. package/src/components/domain/browser/WebPreviewDialog/WebPreviewDialogSource.test.mjs +62 -0
  321. package/src/components/domain/browser/WebPreviewDialog/index.tsx +82 -0
  322. package/src/components/domain/browser/WebPreviewNav/WebPreviewNav.stories.tsx +462 -0
  323. package/src/components/domain/browser/WebPreviewNav/WebPreviewNavSource.test.mjs +353 -0
  324. package/src/components/domain/browser/WebPreviewNav/index.tsx +351 -0
  325. package/src/components/domain/browser/WebPreviewShell/WebPreviewShell.stories.tsx +226 -0
  326. package/src/components/domain/browser/WebPreviewShell/WebPreviewShellSource.test.mjs +172 -0
  327. package/src/components/domain/browser/WebPreviewShell/index.tsx +324 -0
  328. package/src/components/domain/browser/index.ts +45 -0
  329. package/src/components/domain/chat/AgentLoopSegment/AgentLoopSegment.stories.tsx +107 -0
  330. package/src/components/domain/chat/AgentLoopSegment/AgentLoopSegmentSource.test.mjs +45 -0
  331. package/src/components/domain/chat/AgentLoopSegment/index.tsx +29 -0
  332. package/src/components/domain/chat/AgentTurn/AgentTurn.stories.tsx +162 -0
  333. package/src/components/domain/chat/AgentTurn/AgentTurnSource.test.mjs +98 -0
  334. package/src/components/domain/chat/AgentTurn/beaconContext.ts +37 -0
  335. package/src/components/domain/chat/AgentTurn/index.tsx +226 -0
  336. package/src/components/domain/chat/ArtifactCard/ArtifactCard.stories.tsx +127 -0
  337. package/src/components/domain/chat/ArtifactCard/index.tsx +249 -0
  338. package/src/components/domain/chat/Attachment/Attachment.stories.tsx +235 -0
  339. package/src/components/domain/chat/Attachment/AttachmentSource.test.mjs +160 -0
  340. package/src/components/domain/chat/Attachment/index.tsx +857 -0
  341. package/src/components/domain/chat/AuthorizationCard/AuthorizationCard.stories.tsx +53 -0
  342. package/src/components/domain/chat/AuthorizationCard/AuthorizationCardSource.test.mjs +80 -0
  343. package/src/components/domain/chat/AuthorizationCard/index.tsx +89 -0
  344. package/src/components/domain/chat/ChatBubble/ChatBubble.stories.tsx +32 -0
  345. package/src/components/domain/chat/ChatBubble/index.tsx +24 -0
  346. package/src/components/domain/chat/ChatMessage/ChatMessage.stories.tsx +31 -0
  347. package/src/components/domain/chat/ChatMessage/index.tsx +23 -0
  348. package/src/components/domain/chat/ChatR2ReviewSource.test.mjs +98 -0
  349. package/src/components/domain/chat/ChatThinking/ChatThinking.stories.tsx +125 -0
  350. package/src/components/domain/chat/ChatThinking/index.tsx +55 -0
  351. package/src/components/domain/chat/Chatbot/Chatbot.stories.tsx +49 -0
  352. package/src/components/domain/chat/Chatbot/index.tsx +37 -0
  353. package/src/components/domain/chat/Composer/Composer.stories.tsx +227 -0
  354. package/src/components/domain/chat/Composer/ComposerSource.test.mjs +175 -0
  355. package/src/components/domain/chat/Composer/index.tsx +450 -0
  356. package/src/components/domain/chat/Composer/parts/ComposerAudioSpectrum.stories.tsx +203 -0
  357. package/src/components/domain/chat/Composer/parts/ComposerAudioSpectrum.tsx +110 -0
  358. package/src/components/domain/chat/Composer/parts/ComposerAudioSpectrumSource.test.mjs +54 -0
  359. package/src/components/domain/chat/Composer/parts/ComposerAuthorization.stories.tsx +155 -0
  360. package/src/components/domain/chat/Composer/parts/ComposerAuthorization.tsx +108 -0
  361. package/src/components/domain/chat/Composer/parts/ComposerMentions.stories.tsx +76 -0
  362. package/src/components/domain/chat/Composer/parts/ComposerMentions.tsx +83 -0
  363. package/src/components/domain/chat/Composer/parts/ComposerMentionsSource.test.mjs +85 -0
  364. package/src/components/domain/chat/Composer/parts/ComposerMenu.stories.tsx +266 -0
  365. package/src/components/domain/chat/Composer/parts/ComposerMenu.tsx +232 -0
  366. package/src/components/domain/chat/Composer/parts/ComposerMenuPopover.stories.tsx +166 -0
  367. package/src/components/domain/chat/Composer/parts/ComposerMenuPopover.tsx +87 -0
  368. package/src/components/domain/chat/Composer/parts/ComposerMenuPopoverSource.test.mjs +56 -0
  369. package/src/components/domain/chat/Composer/parts/ComposerPopover.stories.tsx +257 -0
  370. package/src/components/domain/chat/Composer/parts/ComposerPopover.tsx +221 -0
  371. package/src/components/domain/chat/Composer/parts/ComposerPopoverSource.test.mjs +71 -0
  372. package/src/components/domain/chat/Composer/parts/ComposerProjectPicker.stories.tsx +260 -0
  373. package/src/components/domain/chat/Composer/parts/ComposerProjectPicker.tsx +246 -0
  374. package/src/components/domain/chat/Composer/parts/ComposerProjectPickerSource.test.mjs +46 -0
  375. package/src/components/domain/chat/Composer/parts/ComposerQueue.stories.tsx +275 -0
  376. package/src/components/domain/chat/Composer/parts/ComposerQueue.tsx +155 -0
  377. package/src/components/domain/chat/Composer/parts/ComposerQueueSource.test.mjs +95 -0
  378. package/src/components/domain/chat/Composer/parts/ComposerVoiceInput.stories.tsx +77 -0
  379. package/src/components/domain/chat/Composer/parts/ComposerVoiceInput.tsx +70 -0
  380. package/src/components/domain/chat/Composer/parts/mountChip.ts +21 -0
  381. package/src/components/domain/chat/ContextUsage/ContextUsage.stories.tsx +62 -0
  382. package/src/components/domain/chat/ContextUsage/index.tsx +69 -0
  383. package/src/components/domain/chat/ExecutionSummary/ExecutionSummary.stories.tsx +238 -0
  384. package/src/components/domain/chat/ExecutionSummary/ExecutionSummarySource.test.mjs +210 -0
  385. package/src/components/domain/chat/ExecutionSummary/index.tsx +487 -0
  386. package/src/components/domain/chat/Message/Message.stories.tsx +264 -0
  387. package/src/components/domain/chat/Message/index.tsx +44 -0
  388. package/src/components/domain/chat/MessageActions/MessageActions.stories.tsx +132 -0
  389. package/src/components/domain/chat/MessageActions/MessageActionsSource.test.mjs +79 -0
  390. package/src/components/domain/chat/MessageActions/index.tsx +186 -0
  391. package/src/components/domain/chat/PlanCard/PlanCard.stories.tsx +87 -0
  392. package/src/components/domain/chat/PlanCard/index.tsx +170 -0
  393. package/src/components/domain/chat/RichContent/RichContent.stories.tsx +102 -0
  394. package/src/components/domain/chat/RichContent/RichContentSource.test.mjs +82 -0
  395. package/src/components/domain/chat/RichContent/index.tsx +465 -0
  396. package/src/components/domain/chat/SubAgentThread/SubAgentThread.stories.tsx +119 -0
  397. package/src/components/domain/chat/SubAgentThread/index.tsx +104 -0
  398. package/src/components/domain/chat/Thinking/Thinking.stories.tsx +196 -0
  399. package/src/components/domain/chat/Thinking/ThinkingInlineSource.test.mjs +154 -0
  400. package/src/components/domain/chat/Thinking/index.tsx +237 -0
  401. package/src/components/domain/chat/ToolCallRow/ToolCallRow.stories.tsx +105 -0
  402. package/src/components/domain/chat/ToolCallRow/ToolCallRowSource.test.mjs +83 -0
  403. package/src/components/domain/chat/ToolCallRow/index.tsx +113 -0
  404. package/src/components/domain/chat/Transcript/Transcript.stories.tsx +296 -0
  405. package/src/components/domain/chat/Transcript/TranscriptSource.test.mjs +189 -0
  406. package/src/components/domain/chat/Transcript/index.tsx +187 -0
  407. package/src/components/domain/chat/TranscriptSpine/TranscriptSpine.stories.tsx +124 -0
  408. package/src/components/domain/chat/TranscriptSpine/index.tsx +245 -0
  409. package/src/components/domain/chat/UserTurn/UserTurn.stories.tsx +176 -0
  410. package/src/components/domain/chat/UserTurn/UserTurnSource.test.mjs +150 -0
  411. package/src/components/domain/chat/UserTurn/index.tsx +194 -0
  412. package/src/components/domain/chat/index.ts +22 -0
  413. package/src/components/domain/desktop/DesktopAccountMenuView/DesktopAccountMenuView.stories.tsx +116 -0
  414. package/src/components/domain/desktop/DesktopAccountMenuView/DesktopAccountMenuViewSource.test.mjs +80 -0
  415. package/src/components/domain/desktop/DesktopAccountMenuView/index.tsx +355 -0
  416. package/src/components/domain/desktop/DesktopAppearanceSettings/DesktopAppearanceSettings.stories.tsx +96 -0
  417. package/src/components/domain/desktop/DesktopAppearanceSettings/DesktopAppearanceSettingsSource.test.mjs +89 -0
  418. package/src/components/domain/desktop/DesktopAppearanceSettings/index.tsx +155 -0
  419. package/src/components/domain/desktop/DesktopAssistantConfigView/DesktopAssistantConfigView.stories.tsx +275 -0
  420. package/src/components/domain/desktop/DesktopAssistantConfigView/DesktopAssistantConfigViewSource.test.mjs +37 -0
  421. package/src/components/domain/desktop/DesktopAssistantConfigView/index.tsx +221 -0
  422. package/src/components/domain/desktop/DesktopCatalogView/DesktopCatalogView.stories.tsx +537 -0
  423. package/src/components/domain/desktop/DesktopCatalogView/DesktopCatalogViewSource.test.mjs +339 -0
  424. package/src/components/domain/desktop/DesktopCatalogView/index.tsx +1074 -0
  425. package/src/components/domain/desktop/DesktopChatBranchDivider/DesktopChatBranchDivider.stories.tsx +58 -0
  426. package/src/components/domain/desktop/DesktopChatBranchDivider/index.tsx +33 -0
  427. package/src/components/domain/desktop/DesktopChatEmptyStateView/DesktopChatEmptyStateView.stories.tsx +75 -0
  428. package/src/components/domain/desktop/DesktopChatEmptyStateView/DesktopChatEmptyStateViewSource.test.mjs +54 -0
  429. package/src/components/domain/desktop/DesktopChatEmptyStateView/index.tsx +64 -0
  430. package/src/components/domain/desktop/DesktopChatHeaderView/DesktopChatHeaderView.stories.tsx +83 -0
  431. package/src/components/domain/desktop/DesktopChatHeaderView/DesktopChatHeaderViewSource.test.mjs +126 -0
  432. package/src/components/domain/desktop/DesktopChatHeaderView/index.tsx +169 -0
  433. package/src/components/domain/desktop/DesktopChatMessageView/DesktopChatMessageView.stories.tsx +170 -0
  434. package/src/components/domain/desktop/DesktopChatMessageView/DesktopChatMessageViewSource.test.mjs +47 -0
  435. package/src/components/domain/desktop/DesktopChatMessageView/index.tsx +213 -0
  436. package/src/components/domain/desktop/DesktopChatTurnView/DesktopChatTurnView.stories.tsx +498 -0
  437. package/src/components/domain/desktop/DesktopChatTurnView/DesktopChatTurnViewSource.test.mjs +187 -0
  438. package/src/components/domain/desktop/DesktopChatTurnView/index.tsx +490 -0
  439. package/src/components/domain/desktop/DesktopComposer/DesktopComposer.stories.tsx +195 -0
  440. package/src/components/domain/desktop/DesktopComposer/DesktopComposerModelPickerSource.test.mjs +132 -0
  441. package/src/components/domain/desktop/DesktopComposer/DesktopComposerMountChipSource.test.mjs +43 -0
  442. package/src/components/domain/desktop/DesktopComposer/DesktopComposerResponsiveSource.test.mjs +44 -0
  443. package/src/components/domain/desktop/DesktopComposer/DesktopMcpFormThemeSource.test.mjs +30 -0
  444. package/src/components/domain/desktop/DesktopComposer/index.tsx +206 -0
  445. package/src/components/domain/desktop/DesktopConnectorDetailView/DesktopConnectorDetailView.stories.tsx +72 -0
  446. package/src/components/domain/desktop/DesktopConnectorDetailView/DesktopConnectorDetailViewSource.test.mjs +81 -0
  447. package/src/components/domain/desktop/DesktopConnectorDetailView/index.tsx +301 -0
  448. package/src/components/domain/desktop/DesktopHomeView/DesktopHomeView.stories.tsx +103 -0
  449. package/src/components/domain/desktop/DesktopHomeView/DesktopHomeViewSource.test.mjs +51 -0
  450. package/src/components/domain/desktop/DesktopHomeView/index.tsx +122 -0
  451. package/src/components/domain/desktop/DesktopLibraryAuthorizationDialog/DesktopLibraryAuthorizationDialog.stories.tsx +55 -0
  452. package/src/components/domain/desktop/DesktopLibraryAuthorizationDialog/index.tsx +156 -0
  453. package/src/components/domain/desktop/DesktopLibraryPageView/DesktopLibraryPageView.stories.tsx +42 -0
  454. package/src/components/domain/desktop/DesktopLibraryPageView/index.tsx +35 -0
  455. package/src/components/domain/desktop/DesktopLoginView/DesktopLoginView.css +75 -0
  456. package/src/components/domain/desktop/DesktopLoginView/DesktopLoginView.stories.tsx +230 -0
  457. package/src/components/domain/desktop/DesktopLoginView/DesktopLoginViewSource.test.mjs +149 -0
  458. package/src/components/domain/desktop/DesktopLoginView/index.tsx +418 -0
  459. package/src/components/domain/desktop/DesktopOnboardingTourView/DesktopOnboardingTourView.stories.tsx +103 -0
  460. package/src/components/domain/desktop/DesktopOnboardingTourView/DesktopOnboardingTourViewSource.test.mjs +57 -0
  461. package/src/components/domain/desktop/DesktopOnboardingTourView/index.tsx +189 -0
  462. package/src/components/domain/desktop/DesktopPet/DesktopPet.fixture.ts +243 -0
  463. package/src/components/domain/desktop/DesktopPet/DesktopPet.stories.tsx +337 -0
  464. package/src/components/domain/desktop/DesktopPet/DesktopPetSource.test.mjs +191 -0
  465. package/src/components/domain/desktop/DesktopPet/index.tsx +591 -0
  466. package/src/components/domain/desktop/DesktopPetSettings/DesktopPetSettings.stories.tsx +159 -0
  467. package/src/components/domain/desktop/DesktopPetSettings/DesktopPetSettingsSource.test.mjs +76 -0
  468. package/src/components/domain/desktop/DesktopPetSettings/index.tsx +140 -0
  469. package/src/components/domain/desktop/DesktopRunStatusView/DesktopRunStatusView.stories.tsx +166 -0
  470. package/src/components/domain/desktop/DesktopRunStatusView/DesktopRunStatusViewSource.test.mjs +51 -0
  471. package/src/components/domain/desktop/DesktopRunStatusView/index.tsx +34 -0
  472. package/src/components/domain/desktop/DesktopSelectionCard/DesktopSelectionCard.stories.tsx +122 -0
  473. package/src/components/domain/desktop/DesktopSelectionCard/DesktopSelectionCardSource.test.mjs +42 -0
  474. package/src/components/domain/desktop/DesktopSelectionCard/index.tsx +75 -0
  475. package/src/components/domain/desktop/DesktopSettingsMemorySection/DesktopSettingsMemorySection.stories.tsx +225 -0
  476. package/src/components/domain/desktop/DesktopSettingsMemorySection/DesktopSettingsMemorySectionSource.test.mjs +105 -0
  477. package/src/components/domain/desktop/DesktopSettingsMemorySection/index.tsx +340 -0
  478. package/src/components/domain/desktop/DesktopSettingsView/DesktopSettingsView.stories.tsx +177 -0
  479. package/src/components/domain/desktop/DesktopSettingsView/DesktopSettingsViewSource.test.mjs +195 -0
  480. package/src/components/domain/desktop/DesktopSettingsView/index.tsx +176 -0
  481. package/src/components/domain/desktop/DesktopShareSelectionBarView/DesktopShareSelectionBarView.stories.tsx +77 -0
  482. package/src/components/domain/desktop/DesktopShareSelectionBarView/DesktopShareSelectionBarViewSource.test.mjs +76 -0
  483. package/src/components/domain/desktop/DesktopShareSelectionBarView/index.tsx +55 -0
  484. package/src/components/domain/desktop/DesktopSidebarView/DesktopSidebarView.stories.tsx +454 -0
  485. package/src/components/domain/desktop/DesktopSidebarView/DesktopSidebarViewSource.test.mjs +386 -0
  486. package/src/components/domain/desktop/DesktopSidebarView/index.tsx +1072 -0
  487. package/src/components/domain/desktop/DesktopSiteReleasesView/DesktopSiteReleasesView.stories.tsx +369 -0
  488. package/src/components/domain/desktop/DesktopSiteReleasesView/DesktopSiteReleasesViewSource.test.mjs +123 -0
  489. package/src/components/domain/desktop/DesktopSiteReleasesView/index.tsx +392 -0
  490. package/src/components/domain/desktop/DesktopSitesListView/DesktopSitesListView.stories.tsx +244 -0
  491. package/src/components/domain/desktop/DesktopSitesListView/DesktopSitesListViewSource.test.mjs +198 -0
  492. package/src/components/domain/desktop/DesktopSitesListView/index.tsx +417 -0
  493. package/src/components/domain/desktop/DesktopSkillsPageView/DesktopSkillsPageView.stories.tsx +230 -0
  494. package/src/components/domain/desktop/DesktopSkillsPageView/DesktopSkillsPageViewSource.test.mjs +149 -0
  495. package/src/components/domain/desktop/DesktopSkillsPageView/index.tsx +235 -0
  496. package/src/components/domain/desktop/DesktopTaskDetailView/index.tsx +111 -0
  497. package/src/components/domain/desktop/DesktopToolCallView/DesktopToolCallListViewSource.test.mjs +302 -0
  498. package/src/components/domain/desktop/DesktopToolCallView/DesktopToolCallView.stories.tsx +409 -0
  499. package/src/components/domain/desktop/DesktopToolCallView/index.tsx +388 -0
  500. package/src/components/domain/desktop/DesktopWorkbenchShell/DesktopWorkbenchShell.stories.tsx +418 -0
  501. package/src/components/domain/desktop/DesktopWorkbenchShell/DesktopWorkbenchShellSource.test.mjs +151 -0
  502. package/src/components/domain/desktop/DesktopWorkbenchShell/index.tsx +167 -0
  503. package/src/components/domain/desktop/DesktopWorkspacePageView/DesktopWorkspacePageView.stories.tsx +135 -0
  504. package/src/components/domain/desktop/DesktopWorkspacePageView/DesktopWorkspacePageViewSource.test.mjs +57 -0
  505. package/src/components/domain/desktop/DesktopWorkspacePageView/index.tsx +114 -0
  506. package/src/components/domain/desktop/DesktopWorkspaceView/DesktopWorkspaceView.stories.tsx +227 -0
  507. package/src/components/domain/desktop/DesktopWorkspaceView/DesktopWorkspaceViewSource.test.mjs +175 -0
  508. package/src/components/domain/desktop/DesktopWorkspaceView/index.tsx +580 -0
  509. package/src/components/domain/desktop/ResourceManagement/ResourceManagement.stories.tsx +19 -0
  510. package/src/components/domain/desktop/ResourceManagement/ResourceManagementSource.test.mjs +54 -0
  511. package/src/components/domain/desktop/ResourceManagement/SharesList.tsx +323 -0
  512. package/src/components/domain/desktop/ResourceManagement/SnapshotViews.tsx +92 -0
  513. package/src/components/domain/desktop/ResourceManagement/SnapshotViewsSource.test.mjs +15 -0
  514. package/src/components/domain/desktop/ResourceManagement/index.tsx +246 -0
  515. package/src/components/domain/desktop/ShareSettingsDialogView/index.tsx +234 -0
  516. package/src/components/domain/desktop/SidePanelEmpty/SidePanelEmpty.stories.tsx +100 -0
  517. package/src/components/domain/desktop/SidePanelEmpty/SidePanelEmptySource.test.mjs +67 -0
  518. package/src/components/domain/desktop/SidePanelEmpty/index.tsx +113 -0
  519. package/src/components/domain/desktop/StarterCapsules/StarterCapsules.stories.tsx +65 -0
  520. package/src/components/domain/desktop/StarterCapsules/StarterCapsulesSource.test.mjs +43 -0
  521. package/src/components/domain/desktop/StarterCapsules/index.tsx +90 -0
  522. package/src/components/domain/desktop/WorkbenchSidePanel/WorkbenchSidePanel.stories.tsx +59 -0
  523. package/src/components/domain/desktop/WorkbenchSidePanel/WorkbenchSidePanelSource.test.mjs +51 -0
  524. package/src/components/domain/desktop/WorkbenchSidePanel/index.tsx +74 -0
  525. package/src/components/domain/desktop/WorkspaceMigrateConfirm/WorkspaceMigrateConfirm.stories.tsx +79 -0
  526. package/src/components/domain/desktop/WorkspaceMigrateConfirm/WorkspaceMigrateConfirmSource.test.mjs +34 -0
  527. package/src/components/domain/desktop/WorkspaceMigrateConfirm/index.tsx +92 -0
  528. package/src/components/domain/desktop/index.ts +64 -0
  529. package/src/components/domain/files/FileBrowser/FileBrowser.stories.tsx +397 -0
  530. package/src/components/domain/files/FileBrowser/FileBrowserSource.test.mjs +75 -0
  531. package/src/components/domain/files/FileBrowser/index.tsx +221 -0
  532. package/src/components/domain/files/FileIcon/FileIcon.stories.tsx +207 -0
  533. package/src/components/domain/files/FileIcon/FileIconSource.test.mjs +39 -0
  534. package/src/components/domain/files/FileIcon/index.tsx +133 -0
  535. package/src/components/domain/files/FilePreviewContentView/FilePreviewContentView.stories.tsx +242 -0
  536. package/src/components/domain/files/FilePreviewContentView/FilePreviewContentViewSource.test.mjs +44 -0
  537. package/src/components/domain/files/FilePreviewContentView/index.tsx +125 -0
  538. package/src/components/domain/files/FileTree/FileTree.stories.tsx +204 -0
  539. package/src/components/domain/files/FileTree/FileTreeSource.test.mjs +18 -0
  540. package/src/components/domain/files/FileTree/index.tsx +106 -0
  541. package/src/components/domain/files/PreviewDialog/PreviewDialog.stories.tsx +178 -0
  542. package/src/components/domain/files/PreviewDialog/PreviewDialogSource.test.mjs +92 -0
  543. package/src/components/domain/files/PreviewDialog/index.tsx +294 -0
  544. package/src/components/domain/files/index.ts +5 -0
  545. package/src/components/domain/index.ts +8 -0
  546. package/src/components/domain/office/CsvPreview/CsvPreview.stories.tsx +264 -0
  547. package/src/components/domain/office/CsvPreview/CsvPreviewSource.test.mjs +77 -0
  548. package/src/components/domain/office/CsvPreview/index.tsx +224 -0
  549. package/src/components/domain/office/OfficePreview/OfficePreview.stories.tsx +265 -0
  550. package/src/components/domain/office/OfficePreview/OfficePreviewDialog.stories.tsx +71 -0
  551. package/src/components/domain/office/OfficePreview/OfficePreviewDialog.tsx +43 -0
  552. package/src/components/domain/office/OfficePreview/OfficePreviewSource.test.mjs +126 -0
  553. package/src/components/domain/office/OfficePreview/index.tsx +782 -0
  554. package/src/components/domain/office/PdfPreview/PdfPreview.stories.tsx +280 -0
  555. package/src/components/domain/office/PdfPreview/PdfPreviewDialog.stories.tsx +61 -0
  556. package/src/components/domain/office/PdfPreview/PdfPreviewDialog.tsx +61 -0
  557. package/src/components/domain/office/PdfPreview/PdfPreviewSource.test.mjs +70 -0
  558. package/src/components/domain/office/PdfPreview/index.tsx +217 -0
  559. package/src/components/domain/office/index.ts +5 -0
  560. package/src/components/domain/skills/McpServerListView/McpServerListView.stories.tsx +510 -0
  561. package/src/components/domain/skills/McpServerListView/McpServerListViewSource.test.mjs +101 -0
  562. package/src/components/domain/skills/McpServerListView/index.tsx +250 -0
  563. package/src/components/domain/skills/SkillAvatarView/SkillAvatarView.stories.tsx +121 -0
  564. package/src/components/domain/skills/SkillAvatarView/SkillAvatarViewSource.test.mjs +67 -0
  565. package/src/components/domain/skills/SkillAvatarView/index.tsx +112 -0
  566. package/src/components/domain/skills/SkillCardView/SkillCardView.stories.tsx +374 -0
  567. package/src/components/domain/skills/SkillCardView/SkillCardViewSource.test.mjs +35 -0
  568. package/src/components/domain/skills/SkillCardView/index.tsx +88 -0
  569. package/src/components/domain/skills/SkillDetailPanelView/SkillDetailPanelView.stories.tsx +113 -0
  570. package/src/components/domain/skills/SkillDetailPanelView/index.tsx +115 -0
  571. package/src/components/domain/skills/SkillDetailView/SkillDetailView.stories.tsx +274 -0
  572. package/src/components/domain/skills/SkillDetailView/index.tsx +121 -0
  573. package/src/components/domain/skills/SkillImportDialogView/SkillImportDialogView.stories.tsx +128 -0
  574. package/src/components/domain/skills/SkillImportDialogView/SkillImportDialogViewSource.test.mjs +11 -0
  575. package/src/components/domain/skills/SkillImportDialogView/index.tsx +147 -0
  576. package/src/components/domain/skills/ToolDetailModalView/ToolDetailModalView.stories.tsx +160 -0
  577. package/src/components/domain/skills/ToolDetailModalView/ToolDetailModalViewSource.test.mjs +99 -0
  578. package/src/components/domain/skills/ToolDetailModalView/index.tsx +160 -0
  579. package/src/components/domain/skills/index.ts +7 -0
  580. package/src/components/domain/tasks/ScheduledTaskCardView/ScheduledTaskCardView.stories.tsx +120 -0
  581. package/src/components/domain/tasks/ScheduledTaskCardView/ScheduledTaskCardViewSource.test.mjs +40 -0
  582. package/src/components/domain/tasks/ScheduledTaskCardView/index.tsx +135 -0
  583. package/src/components/domain/tasks/ScheduledTaskDeleteDialog/ScheduledTaskDeleteDialog.stories.tsx +56 -0
  584. package/src/components/domain/tasks/ScheduledTaskDeleteDialog/ScheduledTaskDeleteDialogSource.test.mjs +35 -0
  585. package/src/components/domain/tasks/ScheduledTaskDeleteDialog/index.tsx +73 -0
  586. package/src/components/domain/tasks/ScheduledTaskDetailView/ScheduledTaskDetailView.stories.tsx +121 -0
  587. package/src/components/domain/tasks/ScheduledTaskDetailView/ScheduledTaskDetailViewSource.test.mjs +115 -0
  588. package/src/components/domain/tasks/ScheduledTaskDetailView/index.tsx +223 -0
  589. package/src/components/domain/tasks/ScheduledTasksSpaceView/ScheduledTasksSpaceView.stories.tsx +526 -0
  590. package/src/components/domain/tasks/ScheduledTasksSpaceView/ScheduledTasksSpaceViewSource.test.mjs +85 -0
  591. package/src/components/domain/tasks/ScheduledTasksSpaceView/index.tsx +118 -0
  592. package/src/components/domain/tasks/index.ts +4 -0
  593. package/src/components/domain/theme/SkinManager.stories.tsx +43 -0
  594. package/src/components/domain/theme/SkinManagerUI.tsx +382 -0
  595. package/src/components/domain/theme/ThemeDemo.stories.tsx +12 -0
  596. package/src/components/domain/theme/ThemeDemo.tsx +224 -0
  597. package/src/components/index.ts +11 -0
  598. package/src/components/primitives/Avatar/Avatar.stories.tsx +170 -0
  599. package/src/components/primitives/Avatar/AvatarSource.test.mjs +37 -0
  600. package/src/components/primitives/Avatar/index.tsx +180 -0
  601. package/src/components/primitives/BackTop/BackTop.stories.tsx +122 -0
  602. package/src/components/primitives/BackTop/BackTopSource.test.mjs +61 -0
  603. package/src/components/primitives/BackTop/index.tsx +93 -0
  604. package/src/components/primitives/Badge/Badge.stories.tsx +376 -0
  605. package/src/components/primitives/Badge/BadgeSource.test.mjs +27 -0
  606. package/src/components/primitives/Badge/index.tsx +65 -0
  607. package/src/components/primitives/Button/Button.stories.tsx +287 -0
  608. package/src/components/primitives/Button/ButtonSource.test.mjs +84 -0
  609. package/src/components/primitives/Button/index.tsx +216 -0
  610. package/src/components/primitives/Card/Card.stories.tsx +186 -0
  611. package/src/components/primitives/Card/CardSource.test.mjs +73 -0
  612. package/src/components/primitives/Card/index.tsx +137 -0
  613. package/src/components/primitives/Checkbox/Checkbox.stories.tsx +79 -0
  614. package/src/components/primitives/Checkbox/CheckboxSource.test.mjs +43 -0
  615. package/src/components/primitives/Checkbox/index.tsx +87 -0
  616. package/src/components/primitives/Chip/Chip.stories.tsx +149 -0
  617. package/src/components/primitives/Chip/ChipSource.test.mjs +73 -0
  618. package/src/components/primitives/Chip/index.tsx +252 -0
  619. package/src/components/primitives/Divider/Divider.stories.tsx +68 -0
  620. package/src/components/primitives/Divider/DividerSource.test.mjs +26 -0
  621. package/src/components/primitives/Divider/index.tsx +65 -0
  622. package/src/components/primitives/Dropdown/Dropdown.stories.tsx +38 -0
  623. package/src/components/primitives/Dropdown/DropdownSource.test.mjs +23 -0
  624. package/src/components/primitives/Dropdown/index.tsx +29 -0
  625. package/src/components/primitives/EmptyState/EmptyState.stories.tsx +159 -0
  626. package/src/components/primitives/EmptyState/EmptyStateSource.test.mjs +169 -0
  627. package/src/components/primitives/EmptyState/index.tsx +185 -0
  628. package/src/components/primitives/ErrorCard/ErrorCard.stories.tsx +50 -0
  629. package/src/components/primitives/ErrorCard/index.tsx +78 -0
  630. package/src/components/primitives/Field/Field.stories.tsx +208 -0
  631. package/src/components/primitives/Field/FieldSource.test.mjs +70 -0
  632. package/src/components/primitives/Field/index.tsx +297 -0
  633. package/src/components/primitives/InlineMessage/InlineMessage.stories.tsx +137 -0
  634. package/src/components/primitives/InlineMessage/InlineMessageSource.test.mjs +50 -0
  635. package/src/components/primitives/InlineMessage/index.tsx +141 -0
  636. package/src/components/primitives/Input/Input.stories.tsx +30 -0
  637. package/src/components/primitives/Input/index.tsx +12 -0
  638. package/src/components/primitives/Keycap/Keycap.stories.tsx +93 -0
  639. package/src/components/primitives/Keycap/KeycapSource.test.mjs +30 -0
  640. package/src/components/primitives/Keycap/index.tsx +67 -0
  641. package/src/components/primitives/Menu/Menu.stories.tsx +416 -0
  642. package/src/components/primitives/Menu/MenuEmptySource.test.mjs +23 -0
  643. package/src/components/primitives/Menu/MenuSource.test.mjs +207 -0
  644. package/src/components/primitives/Menu/index.tsx +922 -0
  645. package/src/components/primitives/Pagination/Pagination.stories.tsx +77 -0
  646. package/src/components/primitives/Pagination/PaginationSource.test.mjs +24 -0
  647. package/src/components/primitives/Pagination/index.tsx +85 -0
  648. package/src/components/primitives/Pagination/pagination.ts +25 -0
  649. package/src/components/primitives/Pagination/paginationModel.test.mjs +18 -0
  650. package/src/components/primitives/ProgressBar/ProgressBar.stories.tsx +103 -0
  651. package/src/components/primitives/ProgressBar/ProgressBarSource.test.mjs +44 -0
  652. package/src/components/primitives/ProgressBar/index.tsx +68 -0
  653. package/src/components/primitives/Radio/Radio.stories.tsx +84 -0
  654. package/src/components/primitives/Radio/RadioSource.test.mjs +38 -0
  655. package/src/components/primitives/Radio/index.tsx +161 -0
  656. package/src/components/primitives/SegmentedControl/SegmentedControl.stories.tsx +110 -0
  657. package/src/components/primitives/SegmentedControl/SegmentedControlSource.test.mjs +75 -0
  658. package/src/components/primitives/SegmentedControl/index.tsx +188 -0
  659. package/src/components/primitives/Select/Select.stories.tsx +158 -0
  660. package/src/components/primitives/Select/SelectSource.test.mjs +94 -0
  661. package/src/components/primitives/Select/index.tsx +364 -0
  662. package/src/components/primitives/Spinner/index.tsx +58 -0
  663. package/src/components/primitives/Switch/Switch.stories.tsx +64 -0
  664. package/src/components/primitives/Switch/SwitchSource.test.mjs +38 -0
  665. package/src/components/primitives/Switch/index.tsx +84 -0
  666. package/src/components/primitives/Tabs/Tabs.stories.tsx +230 -0
  667. package/src/components/primitives/Tabs/TabsSource.test.mjs +91 -0
  668. package/src/components/primitives/Tabs/index.tsx +183 -0
  669. package/src/components/primitives/index.ts +24 -0
  670. package/src/examples/ResourceManagementExample.tsx +119 -0
  671. package/src/examples/SiteWorkbenchExample.tsx +96 -0
  672. package/src/hooks/index.ts +7 -0
  673. package/src/hooks/useClickOutside.ts +20 -0
  674. package/src/hooks/useDragReorder.ts +29 -0
  675. package/src/hooks/useImeAwareEnter.ts +59 -0
  676. package/src/hooks/useImeAwareEnterSource.test.mjs +65 -0
  677. package/src/hooks/useKeyboard.ts +16 -0
  678. package/src/hooks/usePopover.ts +67 -0
  679. package/src/hooks/useSelectedOptionLocator.ts +33 -0
  680. package/src/hooks/useSidebarResize.ts +107 -0
  681. package/src/hooks/useTenantTheme.ts +53 -0
  682. package/src/hooks/useUnifiedTheme.ts +85 -0
  683. package/src/index.ts +6 -0
  684. package/src/lib/InjectedStyleTokenMirrorSource.test.mjs +67 -0
  685. package/src/lib/about-window.test.mjs +46 -0
  686. package/src/lib/about-window.ts +218 -0
  687. package/src/lib/appearance.test.mjs +283 -0
  688. package/src/lib/appearance.ts +46 -0
  689. package/src/lib/browser-annotation-popup.ts +151 -0
  690. package/src/lib/focusTrap.ts +51 -0
  691. package/src/lib/index.ts +5 -0
  692. package/src/lib/shortcut.test.mjs +100 -0
  693. package/src/lib/shortcut.ts +97 -0
  694. package/src/lib/twMergeOw.ts +18 -0
  695. package/src/lib/utils.ts +6 -0
  696. package/src/screens/Browser.stories.tsx +353 -0
  697. package/src/screens/Chat.stories.tsx +808 -0
  698. package/src/screens/Home.stories.tsx +253 -0
  699. package/src/screens/Login.stories.tsx +134 -0
  700. package/src/screens/McpManager.stories.tsx +159 -0
  701. package/src/screens/Onboarding.stories.tsx +155 -0
  702. package/src/screens/ScheduledTasks.stories.tsx +134 -0
  703. package/src/screens/ScreenFrameSource.test.mjs +77 -0
  704. package/src/screens/SettingsAppearance.stories.tsx +117 -0
  705. package/src/screens/SettingsMemory.stories.tsx +128 -0
  706. package/src/screens/SettingsModels.stories.tsx +228 -0
  707. package/src/screens/SettingsSections.stories.tsx +164 -0
  708. package/src/screens/Share.stories.tsx +202 -0
  709. package/src/screens/SharePage.stories.tsx +29 -0
  710. package/src/screens/Sites.stories.tsx +183 -0
  711. package/src/screens/Skills.stories.tsx +83 -0
  712. package/src/screens/Workspace.stories.tsx +191 -0
  713. package/src/screens/_home.tsx +46 -0
  714. package/src/screens/_screen.tsx +355 -0
  715. package/src/screens/_settingsNav.ts +27 -0
  716. package/src/screens/_skillsCatalog.tsx +372 -0
  717. package/src/theme/SkinDenylistSyncSource.test.mjs +124 -0
  718. package/src/theme/__tests__/skins.test.mjs +84 -0
  719. package/src/theme/core/semanticAdapter.ts +116 -0
  720. package/src/theme/core/skin.ts +605 -0
  721. package/src/theme/core/skinScoped.ts +289 -0
  722. package/src/theme/core/tenantTheme.test.mjs +127 -0
  723. package/src/theme/core/tenantTheme.ts +124 -0
  724. package/src/theme/core/types.ts +60 -0
  725. package/src/theme/core/unifiedTheme.ts +157 -0
  726. package/src/theme/index.ts +33 -0
  727. package/src/theme/providers/BrandingProvider.tsx +57 -0
  728. package/src/theme/providers/ThemeProvider.tsx +221 -0
  729. package/src/theme/skinDs2PropertyGate.test.mjs +109 -0
  730. package/src/theme/skins/index.ts +107 -0
  731. package/src/theme/utils/cssSafety.ts +92 -0
  732. package/src/theme/utils/skinManager.ts +159 -0
  733. package/src/theme/utils/themeApplier.ts +75 -0
  734. package/src/tokens/DesktopSurfacesSweep15Source.test.mjs +77 -0
  735. package/src/tokens/SharedStyleSheetsSource.test.mjs +90 -0
  736. package/src/tokens/TailwindThemeSupplySource.test.mjs +129 -0
  737. package/src/tokens/base.ts +199 -0
  738. package/src/tokens/dark.ts +288 -0
  739. package/src/tokens/index.ts +4 -0
  740. package/src/tokens/light.ts +320 -0
  741. package/src/tokens/tailwind.ts +216 -0
  742. package/src/types/desktop-pet.ts +100 -0
  743. package/src/types/file-browser.ts +51 -0
  744. package/src/types/file-tree.ts +34 -0
  745. package/src/types/index.ts +3 -0
  746. package/src/types/xspreadsheet.d.ts +4 -0
  747. package/src/utils/cn.ts +6 -0
  748. package/src/utils/glyphColor.ts +32 -0
  749. package/src/utils/index.ts +4 -0
  750. package/src/utils/localPathInline.test.mjs +45 -0
  751. package/src/utils/localPathInline.ts +49 -0
  752. package/src/utils/markdownFileRefs.test.mjs +88 -0
  753. package/src/utils/markdownFileRefs.ts +140 -0
  754. package/src/utils/office-excel.ts +452 -0
  755. package/src/utils/shiki.ts +156 -0
@@ -0,0 +1,161 @@
1
+ "use client"
2
+
3
+ import { type KeyboardEvent, type ReactNode, createContext, useCallback, useContext, useEffect, useRef } from "react"
4
+ import { cn } from "../../../lib/utils"
5
+
6
+ export type RadioProps = {
7
+ checked?: boolean
8
+ onChange?: (checked: boolean) => void
9
+ disabled?: boolean
10
+ className?: string
11
+ value?: string
12
+ children?: ReactNode
13
+ id?: string
14
+ "aria-label"?: string
15
+ }
16
+
17
+ export type RadioGroupProps = {
18
+ value: string
19
+ onChange: (value: string) => void
20
+ children: ReactNode
21
+ disabled?: boolean
22
+ className?: string
23
+ "aria-label"?: string
24
+ /** @deprecated DS 2.0 Radio 单一 16px 规格(§7),无尺寸档。仅为包外旧调用编译兼容,无任何效果。 */
25
+ size?: "sm" | "md"
26
+ }
27
+
28
+ const RadioGroupContext = createContext<{
29
+ value: string
30
+ onChange: (value: string) => void
31
+ disabled: boolean
32
+ } | null>(null)
33
+
34
+ /**
35
+ * Radio — Orbitwork DS 2.0
36
+ * 16×16px circular control, 1.5px border. Checked ring + 8px inner dot use
37
+ * --ow-control-on (achromatic pole); unchecked border --ow-control-off with
38
+ * hover → --ow-border-strong (§6 input grammar). Hit target padded to 24×24
39
+ * via ::after without changing the visual (§7). Inside a RadioGroup the
40
+ * group handles roving focus + arrow-key navigation.
41
+ */
42
+ export function Radio({ checked, onChange, disabled, className = "", value, id, "aria-label": ariaLabel }: RadioProps) {
43
+ const group = useContext(RadioGroupContext)
44
+ const isChecked = group && value !== undefined ? group.value === value : (checked ?? false)
45
+ const isDisabled = disabled ?? group?.disabled ?? false
46
+
47
+ const handleClick = useCallback(() => {
48
+ if (isDisabled || isChecked) return
49
+ if (group && value !== undefined) group.onChange(value)
50
+ onChange?.(true)
51
+ }, [group, value, isChecked, isDisabled, onChange])
52
+
53
+ return (
54
+ <button
55
+ id={id}
56
+ type="button"
57
+ role="radio"
58
+ aria-checked={isChecked}
59
+ aria-label={ariaLabel}
60
+ disabled={isDisabled}
61
+ data-slot="radio"
62
+ data-ow-part="control"
63
+ data-ow-role={isChecked ? "on" : "off"}
64
+ data-ow-value={value}
65
+ className={cn(
66
+ "relative inline-flex items-center justify-center w-4 h-4 rounded-full border-[1.5px] p-0 bg-transparent",
67
+ // ≥24px hit target without growing the 16px visual (§7)
68
+ "after:content-[''] after:absolute after:-inset-1 after:rounded-full",
69
+ "transition-[border-color,background-color] duration-[var(--ow-dur-1)] ease-[var(--ow-ease-beacon)]",
70
+ // R2:焦点语法归一到 .ow-focus-ring(同 Checkbox/Switch/Button)。
71
+ "ow-focus-ring",
72
+ isChecked
73
+ ? "border-[color:var(--ow-control-on)]"
74
+ : "border-[color:var(--ow-control-off)] hover:border-[color:var(--ow-border-strong)] active:bg-[var(--ow-press)]",
75
+ isDisabled
76
+ ? "cursor-not-allowed border-[color:var(--ow-disabled-border)] bg-[var(--ow-disabled-bg)] hover:border-[color:var(--ow-disabled-border)] active:bg-[var(--ow-disabled-bg)]"
77
+ : "cursor-pointer",
78
+ className,
79
+ )}
80
+ onClick={handleClick}
81
+ >
82
+ {isChecked && (
83
+ <span
84
+ className={cn(
85
+ "w-2 h-2 rounded-full",
86
+ isDisabled ? "bg-[var(--ow-disabled-text)]" : "bg-[var(--ow-control-on)]",
87
+ )}
88
+ />
89
+ )}
90
+ </button>
91
+ )
92
+ }
93
+
94
+ /**
95
+ * RadioGroup — groups Radio buttons under one value with roving tabindex:
96
+ * Tab enters the group on the checked (or first enabled) radio;
97
+ * Arrow keys (←→↑↓) move selection and focus; Home/End jump to the ends.
98
+ */
99
+ export function RadioGroup({
100
+ value,
101
+ onChange,
102
+ children,
103
+ disabled = false,
104
+ className = "",
105
+ "aria-label": ariaLabel,
106
+ }: RadioGroupProps) {
107
+ const rootRef = useRef<HTMLDivElement>(null)
108
+
109
+ const getRadios = useCallback(() => {
110
+ const root = rootRef.current
111
+ if (!root) return []
112
+ return Array.from(root.querySelectorAll<HTMLButtonElement>('[role="radio"]:not(:disabled)'))
113
+ }, [])
114
+
115
+ // Roving tabindex: checked radio (or first enabled) is the single tab stop.
116
+ useEffect(() => {
117
+ const radios = getRadios()
118
+ if (radios.length === 0) return
119
+ const checkedIdx = radios.findIndex((r) => r.getAttribute("aria-checked") === "true")
120
+ radios.forEach((r, i) => {
121
+ r.tabIndex = i === (checkedIdx >= 0 ? checkedIdx : 0) ? 0 : -1
122
+ })
123
+ })
124
+
125
+ const handleKeyDown = useCallback(
126
+ (e: KeyboardEvent<HTMLDivElement>) => {
127
+ const keys = ["ArrowRight", "ArrowDown", "ArrowLeft", "ArrowUp", "Home", "End"]
128
+ if (!keys.includes(e.key)) return
129
+ const radios = getRadios()
130
+ if (radios.length === 0) return
131
+ const current = radios.indexOf(e.target as HTMLButtonElement)
132
+ let next: number
133
+ if (e.key === "Home") next = 0
134
+ else if (e.key === "End") next = radios.length - 1
135
+ else if (e.key === "ArrowRight" || e.key === "ArrowDown") next = current < 0 ? 0 : (current + 1) % radios.length
136
+ else next = current < 0 ? 0 : (current - 1 + radios.length) % radios.length
137
+ e.preventDefault()
138
+ const target = radios[next]
139
+ if (!target) return
140
+ target.focus()
141
+ const v = target.getAttribute("data-ow-value")
142
+ if (v !== null && v !== value) onChange(v)
143
+ },
144
+ [getRadios, onChange, value],
145
+ )
146
+
147
+ return (
148
+ <RadioGroupContext.Provider value={{ value, onChange, disabled }}>
149
+ <div
150
+ ref={rootRef}
151
+ data-slot="radio-group"
152
+ className={cn("flex flex-col gap-2", className)}
153
+ role="radiogroup"
154
+ aria-label={ariaLabel}
155
+ onKeyDown={handleKeyDown}
156
+ >
157
+ {children}
158
+ </div>
159
+ </RadioGroupContext.Provider>
160
+ )
161
+ }
@@ -0,0 +1,110 @@
1
+ import type { Meta, StoryObj } from "@storybook/react"
2
+ import { useState } from "react"
3
+ import { SegmentedControl } from "./index"
4
+
5
+ const meta = {
6
+ title: "Primitives/SegmentedControl",
7
+ component: SegmentedControl,
8
+ parameters: {
9
+ layout: "centered",
10
+ },
11
+ tags: ["autodocs"],
12
+ } satisfies Meta<typeof SegmentedControl>
13
+
14
+ export default meta
15
+ type Story = StoryObj<typeof meta>
16
+
17
+ const viewOptions = [
18
+ { value: "list", label: "列表" },
19
+ { value: "board", label: "看板" },
20
+ { value: "timeline", label: "时间线" },
21
+ ]
22
+
23
+ export const Default: Story = {
24
+ args: {
25
+ options: viewOptions,
26
+ defaultValue: "list",
27
+ "aria-label": "视图切换",
28
+ },
29
+ }
30
+
31
+ export const Small: Story = {
32
+ args: {
33
+ options: viewOptions,
34
+ defaultValue: "board",
35
+ size: "sm",
36
+ "aria-label": "视图切换(28px 档)",
37
+ },
38
+ }
39
+
40
+ /**
41
+ * 线框档(A3-B4,原型 template.dc.html L1654–1658):透明面 + 1px `--ow-border` 外框,
42
+ * 段角 4、字号 caption,选中=`--ow-current-bg` + 500。
43
+ * 用在**没有托盘可坐**的地方 —— 插件页筛选行右端那枚「全部 / 我的」就是它:那一排直接坐在
44
+ * 页底上,托盘档的 `--ow-surface-2` 井扣上去会凭空多出一块灰面。选中语汇与同排的分类 chip
45
+ * (`Chip selected`)、侧栏 current 同一套「位置极」,不占状态极、不引功能色。
46
+ */
47
+ export const Outline: Story = {
48
+ args: {
49
+ options: [
50
+ { value: "all", label: "全部" },
51
+ { value: "mine", label: "我的" },
52
+ ],
53
+ defaultValue: "all",
54
+ variant: "outline",
55
+ size: "sm",
56
+ "aria-label": "按归属筛选",
57
+ },
58
+ }
59
+
60
+ export const WithDisabledSegment: Story = {
61
+ args: {
62
+ options: [
63
+ { value: "all", label: "全部" },
64
+ { value: "running", label: "运行中" },
65
+ { value: "archived", label: "已归档", disabled: true },
66
+ ],
67
+ defaultValue: "all",
68
+ "aria-label": "任务筛选",
69
+ },
70
+ }
71
+
72
+ export const DisabledGroup: Story = {
73
+ args: {
74
+ options: viewOptions,
75
+ defaultValue: "list",
76
+ disabled: true,
77
+ "aria-label": "禁用的视图切换",
78
+ },
79
+ }
80
+
81
+ export const Controlled: Story = {
82
+ args: {
83
+ options: viewOptions,
84
+ "aria-label": "受控示例",
85
+ },
86
+ render: (args) => {
87
+ const [value, setValue] = useState("list")
88
+ return (
89
+ <div className="flex flex-col items-center gap-3">
90
+ <SegmentedControl {...args} value={value} onChange={setValue} />
91
+ <span className="text-sm text-ow-text-2">
92
+ 当前:<span className="font-mono [font-variant-numeric:tabular-nums]">{value}</span>
93
+ </span>
94
+ </div>
95
+ )
96
+ },
97
+ }
98
+
99
+ export const BothSizes: Story = {
100
+ args: {
101
+ options: viewOptions,
102
+ "aria-label": "两档高度",
103
+ },
104
+ render: () => (
105
+ <div className="flex flex-col items-start gap-4">
106
+ <SegmentedControl options={viewOptions} defaultValue="list" size="sm" aria-label="28px 档" />
107
+ <SegmentedControl options={viewOptions} defaultValue="list" size="md" aria-label="32px 档" />
108
+ </div>
109
+ ),
110
+ }
@@ -0,0 +1,75 @@
1
+ import assert from "node:assert/strict"
2
+ import { readFile } from "node:fs/promises"
3
+ import test from "node:test"
4
+
5
+ const source = await readFile(new URL("./index.tsx", import.meta.url), "utf8")
6
+ /** Comments name the retired V1 idioms as documentation; bans are checked on code only. */
7
+ const code = source.replace(/\/\*[\s\S]*?\*\//g, "").replace(/^[ \t]*\/\/.*$/gm, "")
8
+
9
+ test("shell: 8px radius, surface-2 well, 28/32 height tiers", () => {
10
+ // R2:圆角写法统一到全库口径 [border-radius:var(--ow-radius-*)](原 rounded-[var(…)] 是第二套写法)。
11
+ assert.match(source, /\[border-radius:var\(--ow-radius-sm\)\]/)
12
+ assert.match(source, /variant === "well" \? "bg-\[var\(--ow-surface-2\)\]"/)
13
+ // A3-B4:外壳不再写死 h-7/h-8,高度=内钮(24/28) + 2px 内距(outline 再叠 1px 边),
14
+ // well 档两档仍是 28/32 逐像素不变;断言改问内钮档。
15
+ assert.match(source, /size === "sm" \? "h-6" : "h-7"/)
16
+ })
17
+
18
+ // A3-B4 线框档(原型 template.dc.html L1654–1658):透明面 + 1px --ow-border 外框,
19
+ // 段角收到 radius-2xs(4)、字号收到 caption,选中=--ow-current-bg + 500(位置极语汇,
20
+ // 与同排的 Chip selected 分类 chip 同一套;不占状态极、不引功能色)。
21
+ test("outline variant: 1px border shell, current-bg selection, 4px segment radius", () => {
22
+ assert.match(source, /export type SegmentedControlVariant = "well" \| "outline"/)
23
+ assert.match(code, /bg-transparent border border-\[color:var\(--ow-border\)\]/)
24
+ assert.match(
25
+ code,
26
+ /variant === "well" \? "\[border-radius:var\(--ow-radius-xs\)\]" : "\[border-radius:var\(--ow-radius-2xs\)\]"/,
27
+ )
28
+ assert.match(code, /variant === "well" \? "bg-\[var\(--ow-segment-on-bg\)\]" : "bg-\[var\(--ow-current-bg\)\]"/)
29
+ assert.doesNotMatch(code, /--ow-primary|--ow-beacon/)
30
+ })
31
+
32
+ // W5 终扫:§12「圆角不开放自由值」——段圆角原写字面量 rounded-[6px],全走 token。
33
+ test("segment radius is a token, never a literal", () => {
34
+ assert.match(code, /\[border-radius:var\(--ow-radius-xs\)\]/)
35
+ assert.doesNotMatch(code, /rounded-\[/)
36
+ })
37
+
38
+ // W3:分段控件贴地不离地,§5「影子只属离地之物」——托盘影删除,选中只剩
39
+ // surface 提亮 + 500 字重两层编码(R1 仍是双编码:底色 + 字重)。
40
+ test("selected segment: surface lift + 500 weight, no grounded shadow (dual encoding, R1)", () => {
41
+ // R2:选中段底改取 --ow-segment-on-bg。原写死 --ow-surface,浅档是提亮、暗档反而比托盘更暗
42
+ // (--ow-surface 在暗档低于 --ow-surface-2),选中段渲成凹陷格,与「surface 递进」相反。
43
+ // A3-B4:选中段的「500 字重 + --ow-text」与「选中底色」拆成两截(底色随 variant 走),
44
+ // 断言改为分别问这两半。
45
+ assert.match(code, /"font-medium text-\[color:var\(--ow-text\)\]"/)
46
+ assert.match(code, /bg-\[var\(--ow-segment-on-bg\)\]/)
47
+ assert.doesNotMatch(code, /--ow-shadow-1|shadow-\[/)
48
+ assert.doesNotMatch(code, /--ow-beacon|--ow-yellow|--ow-accent-dot/)
49
+ })
50
+
51
+ test("state completeness: hover/press on surface tokens, focus ring, per-token disabled", () => {
52
+ assert.match(source, /hover:bg-\[var\(--ow-hover\)\] active:bg-\[var\(--ow-press\)\]/)
53
+ // R2:焦点语法全库归一到 .ow-focus-ring(outline 三件套),不再走 --ow-focus-shadow。
54
+ assert.match(source, /ow-focus-ring focus-visible:relative/)
55
+ assert.doesNotMatch(code, /--ow-focus-shadow/)
56
+ assert.match(source, /text-\[color:var\(--ow-disabled-text\)\]/)
57
+ assert.doesNotMatch(source, /disabled:opacity|opacity-disabled/)
58
+ })
59
+
60
+ test("keyboard: radiogroup semantics with left/right roving navigation", () => {
61
+ assert.match(source, /role="radiogroup"/)
62
+ assert.match(source, /role="radio"/)
63
+ assert.match(source, /ArrowRight/)
64
+ assert.match(source, /ArrowLeft/)
65
+ assert.match(source, /tabIndex/)
66
+ })
67
+
68
+ test("motion: 120ms ease-beacon color transitions only, no slide/scale", () => {
69
+ assert.match(source, /duration-\[var\(--ow-dur-1\)\] ease-\[var\(--ow-ease-beacon\)\]/)
70
+ // 影没了,过渡里也不该再留 box-shadow 这一路。
71
+ assert.match(code, /transition-\[background-color,color\]/)
72
+ // Built via constructor so the DS2 guard's own grep does not flag this test file.
73
+ const moveClasses = new RegExp(["hover:" + "scale", "hover:" + "translate", "translate" + "-x"].join("|"))
74
+ assert.doesNotMatch(source, moveClasses)
75
+ })
@@ -0,0 +1,188 @@
1
+ "use client"
2
+
3
+ import { type KeyboardEvent, type ReactNode, useCallback, useEffect, useRef, useState } from "react"
4
+ import { cn } from "../../../lib/utils"
5
+
6
+ export type SegmentedControlOption = {
7
+ value: string
8
+ label: ReactNode
9
+ icon?: ReactNode
10
+ disabled?: boolean
11
+ }
12
+
13
+ export type SegmentedControlSize = "sm" | "md"
14
+
15
+ /**
16
+ * 外壳档(A3-B4 新增 outline)。
17
+ * - `well`(默认):托盘档 —— `--ow-surface-2` 井,选中段以 `--ow-segment-on-bg` 提亮。
18
+ * 设置页那类「坐在卡面上的模式切换」用它。
19
+ * - `outline`:线框档 —— **透明面 + 1px `--ow-border` 外框**,选中段落 `--ow-current-bg`。
20
+ * 给筛选行右端那种「坐在页底上的归属/范围切换」用(原型 template.dc.html L1654–1658):
21
+ * 那一排本来就没有托盘可坐,井色扣在页底上会凭空多出一块灰面;它与同排的分类 chip
22
+ * (`Chip selected`)共用一套「1px 边 + --ow-current-bg 选中 + 500」的位置极语汇。
23
+ */
24
+ export type SegmentedControlVariant = "well" | "outline"
25
+
26
+ export type SegmentedControlProps = {
27
+ options: SegmentedControlOption[]
28
+ value?: string
29
+ defaultValue?: string
30
+ onChange?: (value: string) => void
31
+ /** sm = 24px 内钮(外壳 28 / outline 30), md = 28px 内钮(外壳 32 / outline 34)——§7 控件高度档 */
32
+ size?: SegmentedControlSize
33
+ /** 外壳档;默认 well(托盘)。筛选行右端用 outline(线框)。 */
34
+ variant?: SegmentedControlVariant
35
+ disabled?: boolean
36
+ className?: string
37
+ "aria-label"?: string
38
+ }
39
+
40
+ /**
41
+ * SegmentedControl — Orbitwork DS 2.0 原语(新造件,蓝图批次①)
42
+ * 分段单选:8px 圆角外壳,选中段以底色 **提亮** + 500 字重(双编码:底色+字重,R1)。
43
+ * 两档高度:sm 内钮 24(外壳 28)/ md 内钮 28(外壳 32);outline 档各再叠 1px 边。
44
+ * A3-B4 加 `variant`:well=托盘档(--ow-surface-2 井 + --ow-segment-on-bg 选中,原有全部
45
+ * 消费方逐像素不变),outline=线框档(透明面 + 1px --ow-border + --ow-current-bg 选中),
46
+ * 后者收编插件页筛选行右端那枚手搓的 `.plaza__scope`(原型 L1654–1658)。
47
+ *
48
+ * R2:选中段原写死 --ow-surface,浅档确是提亮(#FDFDFC on #F1F0EA),暗档却比托盘更暗
49
+ * (#1E2025 on #23252B)——同一句注释在两档指向相反方向,暗档实际渲成凹陷格。
50
+ * 既定态「无彩选中=surface **递进**」两档同向,故改取 --ow-segment-on-bg:
51
+ * 浅档 = --ow-surface,暗档 = pop 档面色,两档都比托盘亮一级。
52
+ * W3 验收修:选中段原来还叠 --ow-shadow-1 托盘影。分段控件贴地不离地,§5「影子只属
53
+ * 离地之物」——贴地=0 影,选中靠 surface 提亮+字重两层编码即可,托盘影是 V1 残留。
54
+ * W5 终扫:段圆角原写字面量 rounded-[6px],§12「圆角不开放自由值」——改走 --ow-radius-xs(6)。
55
+ * 键盘 ←→/Home/End 移动选择(roving tabindex)。中性件,无信标元素(R3)。
56
+ * 动效仅底色/文字色过渡 120ms --ow-ease-beacon(§9,无位移滑块)。
57
+ */
58
+ export function SegmentedControl({
59
+ options,
60
+ value,
61
+ defaultValue,
62
+ onChange,
63
+ size = "md",
64
+ variant = "well",
65
+ disabled = false,
66
+ className,
67
+ "aria-label": ariaLabel,
68
+ }: SegmentedControlProps) {
69
+ const [internalValue, setInternalValue] = useState(defaultValue ?? options[0]?.value ?? "")
70
+ const current = value ?? internalValue
71
+ const rootRef = useRef<HTMLDivElement>(null)
72
+
73
+ const select = useCallback(
74
+ (v: string) => {
75
+ if (disabled || v === current) return
76
+ setInternalValue(v)
77
+ onChange?.(v)
78
+ },
79
+ [disabled, current, onChange],
80
+ )
81
+
82
+ const getSegments = useCallback(() => {
83
+ const root = rootRef.current
84
+ if (!root) return []
85
+ return Array.from(root.querySelectorAll<HTMLButtonElement>('[role="radio"]:not(:disabled)'))
86
+ }, [])
87
+
88
+ // Roving tabindex: the selected segment (or first enabled) is the tab stop.
89
+ useEffect(() => {
90
+ const segments = getSegments()
91
+ if (segments.length === 0) return
92
+ const selectedIdx = segments.findIndex((s) => s.getAttribute("aria-checked") === "true")
93
+ segments.forEach((s, i) => {
94
+ s.tabIndex = i === (selectedIdx >= 0 ? selectedIdx : 0) ? 0 : -1
95
+ })
96
+ })
97
+
98
+ const handleKeyDown = useCallback(
99
+ (e: KeyboardEvent<HTMLDivElement>) => {
100
+ const keys = ["ArrowRight", "ArrowLeft", "Home", "End"]
101
+ if (!keys.includes(e.key)) return
102
+ const segments = getSegments()
103
+ if (segments.length === 0) return
104
+ const currentIdx = segments.indexOf(e.target as HTMLButtonElement)
105
+ let next: number
106
+ if (e.key === "Home") next = 0
107
+ else if (e.key === "End") next = segments.length - 1
108
+ else if (e.key === "ArrowRight") next = currentIdx < 0 ? 0 : (currentIdx + 1) % segments.length
109
+ else next = currentIdx < 0 ? 0 : (currentIdx - 1 + segments.length) % segments.length
110
+ e.preventDefault()
111
+ const target = segments[next]
112
+ if (!target) return
113
+ target.focus()
114
+ const v = target.getAttribute("data-ow-value")
115
+ if (v !== null) select(v)
116
+ },
117
+ [getSegments, select],
118
+ )
119
+
120
+ return (
121
+ <div
122
+ ref={rootRef}
123
+ role="radiogroup"
124
+ aria-label={ariaLabel}
125
+ data-slot="segmented-control"
126
+ data-size={size}
127
+ data-variant={variant}
128
+ data-ow-part="control"
129
+ onKeyDown={handleKeyDown}
130
+ className={cn(
131
+ // W5 记的是「不再写 rounded-[6px]」,写法仍是 rounded-[var()];R2 统一到全库口径 [border-radius:var()]。
132
+ "inline-flex items-stretch gap-0.5 p-0.5 [border-radius:var(--ow-radius-sm)]",
133
+ // A3-B4:外壳高度改由内钮给(sm 24 / md 28)+ 2px 内距,well 档逐像素等于原来的
134
+ // h-7/h-8;outline 档再叠 1px 边(30 / 34),不写第二套写死高度。
135
+ variant === "well" ? "bg-[var(--ow-surface-2)]" : "bg-transparent border border-[color:var(--ow-border)]",
136
+ disabled && "cursor-not-allowed",
137
+ className,
138
+ )}
139
+ >
140
+ {options.map((opt) => {
141
+ const isSelected = current === opt.value
142
+ const isDisabled = disabled || opt.disabled
143
+ return (
144
+ <button
145
+ key={opt.value}
146
+ type="button"
147
+ role="radio"
148
+ aria-checked={isSelected}
149
+ disabled={isDisabled}
150
+ data-ow-part="segment"
151
+ data-ow-role={isSelected ? "on" : "off"}
152
+ data-ow-value={opt.value}
153
+ onClick={() => select(opt.value)}
154
+ className={cn(
155
+ "inline-flex items-center justify-center gap-1.5 px-2.5 border-none",
156
+ size === "sm" ? "h-6" : "h-7",
157
+ // 段圆角随外壳档走:托盘里是 6(radius-xs),线框里收到 4(radius-2xs)——
158
+ // 线框只留 2px 内距,段角必须比外壳(8)小两级才不会顶着框画出双弧。
159
+ variant === "well" ? "[border-radius:var(--ow-radius-xs)]" : "[border-radius:var(--ow-radius-2xs)]",
160
+ variant === "well" ? "text-[length:var(--ow-fs-ui)]" : "text-[length:var(--ow-fs-caption)]",
161
+ "leading-none whitespace-nowrap",
162
+ "transition-[background-color,color] duration-[var(--ow-dur-1)] ease-[var(--ow-ease-beacon)]",
163
+ // R2:焦点语法归一到 .ow-focus-ring;outline 画在盒外不需要假缝,
164
+ // 原 --ow-focus-shadow 的 2px 缝写死 var(--ow-surface),段坐在 surface-2 托盘上会露一圈近白晕。
165
+ "ow-focus-ring focus-visible:relative focus-visible:z-[1]",
166
+ isSelected
167
+ ? cn(
168
+ "font-medium text-[color:var(--ow-text)]",
169
+ variant === "well" ? "bg-[var(--ow-segment-on-bg)]" : "bg-[var(--ow-current-bg)]",
170
+ )
171
+ : "bg-transparent font-normal text-[color:var(--ow-text-2)] hover:text-[color:var(--ow-text)] hover:bg-[var(--ow-hover)] active:bg-[var(--ow-press)]",
172
+ isDisabled
173
+ ? "cursor-not-allowed text-[color:var(--ow-disabled-text)] hover:text-[color:var(--ow-disabled-text)] hover:bg-transparent active:bg-transparent"
174
+ : "cursor-pointer",
175
+ )}
176
+ >
177
+ {opt.icon && (
178
+ <span className="inline-flex items-center justify-center w-3.5 h-3.5 [&>svg]:w-full [&>svg]:h-full">
179
+ {opt.icon}
180
+ </span>
181
+ )}
182
+ {opt.label}
183
+ </button>
184
+ )
185
+ })}
186
+ </div>
187
+ )
188
+ }
@@ -0,0 +1,158 @@
1
+ import type { Meta, StoryObj } from "@storybook/react"
2
+ import { useState } from "react"
3
+ import { Select, SelectTrigger } from "./index"
4
+
5
+ const meta = {
6
+ title: "Primitives/Select",
7
+ component: Select,
8
+ parameters: {
9
+ layout: "centered",
10
+ },
11
+ tags: ["autodocs"],
12
+ } satisfies Meta<typeof Select>
13
+
14
+ export default meta
15
+ type Story = StoryObj<typeof meta>
16
+
17
+ const options = [
18
+ { label: "全部设备", value: "all" },
19
+ { label: "工作台机器", value: "workstation" },
20
+ { label: "家用笔记本", value: "laptop" },
21
+ ]
22
+
23
+ const subOptions = [
24
+ { label: "简体中文", value: "zh", sub: "Chinese" },
25
+ { label: "English", value: "en", sub: "英语" },
26
+ { label: "日本語", value: "ja", sub: "日语" },
27
+ ]
28
+
29
+ function ControlledSelect(props: Omit<React.ComponentProps<typeof Select>, "onChange">) {
30
+ const [value, setValue] = useState(props.value)
31
+ return <Select {...props} value={value} onChange={setValue} />
32
+ }
33
+
34
+ export const Default: Story = {
35
+ args: {
36
+ value: "",
37
+ options,
38
+ onChange: () => {},
39
+ placeholder: "选择设备",
40
+ },
41
+ render: (args) => (
42
+ <div style={{ width: 260 }}>
43
+ <ControlledSelect {...args} />
44
+ </div>
45
+ ),
46
+ }
47
+
48
+ export const WithValue: Story = {
49
+ args: {
50
+ value: "workstation",
51
+ options,
52
+ onChange: () => {},
53
+ },
54
+ render: (args) => (
55
+ <div style={{ width: 260 }}>
56
+ <ControlledSelect {...args} />
57
+ </div>
58
+ ),
59
+ }
60
+
61
+ /** 28 / 32 / 40 三档控件高度 */
62
+ export const Sizes: Story = {
63
+ args: { value: "all", options, onChange: () => {} },
64
+ render: (args) => (
65
+ <div style={{ width: 260, display: "flex", flexDirection: "column", gap: 12 }}>
66
+ <ControlledSelect {...args} size="sm" />
67
+ <ControlledSelect {...args} size="md" />
68
+ <ControlledSelect {...args} size="lg" />
69
+ </div>
70
+ ),
71
+ }
72
+
73
+ /** 行内副文案(sub)与选中打勾(不靠底色) */
74
+ export const WithSubText: Story = {
75
+ args: {
76
+ value: "zh",
77
+ options: subOptions,
78
+ onChange: () => {},
79
+ },
80
+ render: (args) => (
81
+ <div style={{ width: 260 }}>
82
+ <ControlledSelect {...args} />
83
+ </div>
84
+ ),
85
+ }
86
+
87
+ export const Disabled: Story = {
88
+ args: {
89
+ value: "",
90
+ options,
91
+ onChange: () => {},
92
+ placeholder: "暂无可选设备",
93
+ disabled: true,
94
+ },
95
+ render: (args) => (
96
+ <div style={{ width: 260 }}>
97
+ <Select {...args} />
98
+ </div>
99
+ ),
100
+ }
101
+
102
+ /** 长列表滚动 + 键盘导航(焦点留在触发器,↑↓/Home/End/Enter/Esc) */
103
+ export const ManyOptions: Story = {
104
+ args: {
105
+ value: "8",
106
+ options: Array.from({ length: 20 }, (_, i) => ({
107
+ label: `会话分组 ${i + 1}`,
108
+ value: String(i + 1),
109
+ })),
110
+ onChange: () => {},
111
+ placeholder: "选择分组",
112
+ },
113
+ render: (args) => (
114
+ <div style={{ width: 260 }}>
115
+ <ControlledSelect {...args} />
116
+ </div>
117
+ ),
118
+ }
119
+
120
+ /** footer 插槽:钉在选项列表下方的自定义内容(ProjectSelect 配方即用此位) */
121
+ export const WithFooter: Story = {
122
+ args: {
123
+ value: "all",
124
+ options,
125
+ onChange: () => {},
126
+ footer: (
127
+ <div
128
+ style={{
129
+ marginTop: 6,
130
+ borderTop: "1px solid var(--ow-border)",
131
+ padding: "6px 8px 2px",
132
+ fontSize: 12,
133
+ lineHeight: 1.4,
134
+ color: "var(--ow-text-3)",
135
+ }}
136
+ >
137
+ 找不到设备?请先在客户端登录
138
+ </div>
139
+ ),
140
+ },
141
+ render: (args) => (
142
+ <div style={{ width: 260 }}>
143
+ <ControlledSelect {...args} />
144
+ </div>
145
+ ),
146
+ }
147
+
148
+ /** 独立触发器壳(SelectTrigger)——供 ModelSelect 等预设配方复用 */
149
+ export const TriggerShell: Story = {
150
+ args: { value: "", options, onChange: () => {} },
151
+ render: () => (
152
+ <div style={{ width: 260, display: "flex", flexDirection: "column", gap: 12 }}>
153
+ <SelectTrigger>已选中的值</SelectTrigger>
154
+ <SelectTrigger open>展开状态(focus 档边框)</SelectTrigger>
155
+ <SelectTrigger disabled>禁用状态</SelectTrigger>
156
+ </div>
157
+ ),
158
+ }