@orbit-work/ui 0.1.2-preview.0 → 0.1.2

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 (795) hide show
  1. package/README.md +59 -57
  2. package/dist/about-window.cjs +271 -1
  3. package/dist/about-window.cjs.map +1 -0
  4. package/dist/about-window.d.cts +20 -2
  5. package/dist/about-window.d.ts +20 -2
  6. package/dist/about-window.js +271 -1
  7. package/dist/about-window.js.map +1 -0
  8. package/dist/appearance-D7uh_ZTy.d.cts +192 -0
  9. package/dist/appearance-D7uh_ZTy.d.ts +192 -0
  10. package/dist/appearance.cjs +39 -1
  11. package/dist/appearance.cjs.map +1 -0
  12. package/dist/appearance.d.cts +1 -1
  13. package/dist/appearance.d.ts +1 -1
  14. package/dist/appearance.js +39 -1
  15. package/dist/appearance.js.map +1 -0
  16. package/dist/browser-annotation-popup.cjs +9 -1
  17. package/dist/browser-annotation-popup.cjs.map +1 -0
  18. package/dist/browser-annotation-popup.d.cts +6 -6
  19. package/dist/browser-annotation-popup.d.ts +6 -6
  20. package/dist/browser-annotation-popup.js +9 -1
  21. package/dist/browser-annotation-popup.js.map +1 -0
  22. package/dist/chunk-66VEV7G2.js +111 -0
  23. package/dist/chunk-66VEV7G2.js.map +1 -0
  24. package/dist/chunk-KRP43SUA.cjs +1130 -0
  25. package/dist/chunk-KRP43SUA.cjs.map +1 -0
  26. package/dist/chunk-QS55W5Q5.cjs +111 -0
  27. package/dist/chunk-QS55W5Q5.cjs.map +1 -0
  28. package/dist/chunk-S3R5QFO4.js +1130 -0
  29. package/dist/chunk-S3R5QFO4.js.map +1 -0
  30. package/dist/chunk-UT5LC6MR.js +38 -0
  31. package/dist/chunk-UT5LC6MR.js.map +1 -0
  32. package/dist/chunk-ZZTEY4YX.cjs +38 -0
  33. package/dist/chunk-ZZTEY4YX.cjs.map +1 -0
  34. package/dist/core.css +7886 -0
  35. package/dist/file-tree.css +85 -0
  36. package/dist/index-nLo7jMlP.d.cts +166 -0
  37. package/dist/index-nLo7jMlP.d.ts +166 -0
  38. package/dist/index.cjs +39161 -26
  39. package/dist/index.cjs.map +1 -0
  40. package/dist/index.d.cts +3769 -3032
  41. package/dist/index.d.ts +3769 -3032
  42. package/dist/index.js +39161 -26
  43. package/dist/index.js.map +1 -0
  44. package/dist/locale.cjs +15 -0
  45. package/dist/locale.cjs.map +1 -0
  46. package/dist/locale.d.cts +28 -0
  47. package/dist/locale.d.ts +28 -0
  48. package/dist/locale.js +15 -0
  49. package/dist/locale.js.map +1 -0
  50. package/dist/office.css +1146 -0
  51. package/dist/slot-core.cjs +200 -0
  52. package/dist/slot-core.cjs.map +1 -0
  53. package/dist/slot-core.d.cts +146 -0
  54. package/dist/slot-core.d.ts +146 -0
  55. package/dist/slot-core.js +200 -0
  56. package/dist/slot-core.js.map +1 -0
  57. package/dist/slot-react.cjs +153 -0
  58. package/dist/slot-react.cjs.map +1 -0
  59. package/dist/slot-react.d.cts +36 -0
  60. package/dist/slot-react.d.ts +36 -0
  61. package/dist/slot-react.js +153 -0
  62. package/dist/slot-react.js.map +1 -0
  63. package/dist/tailwind.css +137 -0
  64. package/dist/workbench.css +9014 -0
  65. package/package.json +112 -47
  66. package/dist/appearance-D5uQ53j3.d.cts +0 -210
  67. package/dist/appearance-D5uQ53j3.d.ts +0 -210
  68. package/dist/chunk-3KT7IU4X.js +0 -13
  69. package/dist/chunk-5VLBKOG7.cjs +0 -194
  70. package/dist/chunk-7YJY64LZ.js +0 -82
  71. package/dist/chunk-EF2BSN3K.cjs +0 -13
  72. package/dist/chunk-GMMYDILD.cjs +0 -82
  73. package/dist/chunk-VG7FQQ7K.js +0 -194
  74. package/dist/fonts/JetBrainsMono-Medium.ttf +0 -0
  75. package/dist/fonts/JetBrainsMono-Regular.ttf +0 -0
  76. package/dist/fonts/SpaceGrotesk-700-latin-ext.woff2 +0 -0
  77. package/dist/fonts/SpaceGrotesk-700-latin.woff2 +0 -0
  78. package/dist/index.css +0 -1
  79. package/dist/orbitwork.css +0 -22209
  80. package/src/components/Layout/AppLayout/AppLayout.stories.tsx +0 -246
  81. package/src/components/Layout/AppLayout/AppLayoutSource.test.mjs +0 -37
  82. package/src/components/Layout/AppLayout/index.tsx +0 -122
  83. package/src/components/Layout/Sidebar/index.tsx +0 -13
  84. package/src/components/Layout/SidebarShell/SidebarShell.stories.tsx +0 -676
  85. package/src/components/Layout/SidebarShell/SidebarShellSource.test.mjs +0 -161
  86. package/src/components/Layout/SidebarShell/index.tsx +0 -326
  87. package/src/components/Layout/index.ts +0 -10
  88. package/src/components/composite/ActionBar/ActionBar.stories.tsx +0 -26
  89. package/src/components/composite/ActionBar/index.tsx +0 -31
  90. package/src/components/composite/ActionStatus/ActionStatus.stories.tsx +0 -60
  91. package/src/components/composite/ActionStatus/index.tsx +0 -21
  92. package/src/components/composite/AskQuestionCardView/AskQuestionCardView.stories.tsx +0 -175
  93. package/src/components/composite/AskQuestionCardView/AskQuestionCardViewSource.test.mjs +0 -92
  94. package/src/components/composite/AskQuestionCardView/index.tsx +0 -119
  95. package/src/components/composite/AssistantChannelCard/AssistantChannelCard.stories.tsx +0 -265
  96. package/src/components/composite/AssistantChannelCard/AssistantChannelCardSource.test.mjs +0 -45
  97. package/src/components/composite/AssistantChannelCard/index.tsx +0 -102
  98. package/src/components/composite/AssistantToggleRow/AssistantToggleRow.stories.tsx +0 -197
  99. package/src/components/composite/AssistantToggleRow/index.tsx +0 -35
  100. package/src/components/composite/AttachmentCard/AttachmentCard.stories.tsx +0 -125
  101. package/src/components/composite/AttachmentCard/index.tsx +0 -80
  102. package/src/components/composite/BackButton/BackButton.stories.tsx +0 -93
  103. package/src/components/composite/BackButton/BackButtonSource.test.mjs +0 -29
  104. package/src/components/composite/BackButton/index.tsx +0 -48
  105. package/src/components/composite/Banner/Banner.stories.tsx +0 -180
  106. package/src/components/composite/Banner/BannerSource.test.mjs +0 -67
  107. package/src/components/composite/Banner/index.tsx +0 -125
  108. package/src/components/composite/BeaconIcons/BeaconIcons.stories.tsx +0 -153
  109. package/src/components/composite/BeaconIcons/index.tsx +0 -265
  110. package/src/components/composite/BeaconSpinner/BeaconSpinner.stories.tsx +0 -144
  111. package/src/components/composite/BeaconSpinner/index.tsx +0 -185
  112. package/src/components/composite/CatalogStates/CatalogEmptyState.stories.tsx +0 -108
  113. package/src/components/composite/CatalogStates/CatalogStates.stories.tsx +0 -53
  114. package/src/components/composite/CatalogStates/CatalogStatesSource.test.mjs +0 -149
  115. package/src/components/composite/CatalogStates/index.tsx +0 -113
  116. package/src/components/composite/Charts/Charts.stories.tsx +0 -174
  117. package/src/components/composite/Charts/ChartsSource.test.mjs +0 -111
  118. package/src/components/composite/Charts/index.tsx +0 -385
  119. package/src/components/composite/CodeBlock/CodeBlock.stories.tsx +0 -308
  120. package/src/components/composite/CodeBlock/CodeFaceSource.test.mjs +0 -89
  121. package/src/components/composite/CodeBlock/index.tsx +0 -300
  122. package/src/components/composite/CodeDiff/CodeDiff.stories.tsx +0 -169
  123. package/src/components/composite/CodeDiff/index.tsx +0 -373
  124. package/src/components/composite/CodePreview/CodePreview.stories.tsx +0 -127
  125. package/src/components/composite/CodePreview/CodePreviewSource.test.mjs +0 -43
  126. package/src/components/composite/CodePreview/index.tsx +0 -98
  127. package/src/components/composite/CommandPalette/CommandPalette.stories.tsx +0 -89
  128. package/src/components/composite/CommandPalette/CommandPaletteSource.test.mjs +0 -61
  129. package/src/components/composite/CommandPalette/index.tsx +0 -310
  130. package/src/components/composite/ContentRecommendation/ContentRecommendation.stories.tsx +0 -300
  131. package/src/components/composite/ContentRecommendation/ContentRecommendationSource.test.mjs +0 -48
  132. package/src/components/composite/ContentRecommendation/index.tsx +0 -116
  133. package/src/components/composite/ContextChip/ContextChip.stories.tsx +0 -123
  134. package/src/components/composite/ContextChip/ContextChipSource.test.mjs +0 -24
  135. package/src/components/composite/ContextChip/index.tsx +0 -25
  136. package/src/components/composite/ContextUsageIndicatorView/ContextUsageIndicatorSizeSource.test.mjs +0 -15
  137. package/src/components/composite/ContextUsageIndicatorView/ContextUsageIndicatorView.stories.tsx +0 -110
  138. package/src/components/composite/ContextUsageIndicatorView/ContextUsageLoadingSource.test.mjs +0 -23
  139. package/src/components/composite/ContextUsageIndicatorView/index.tsx +0 -139
  140. package/src/components/composite/Controls/Controls.stories.tsx +0 -227
  141. package/src/components/composite/Controls/index.tsx +0 -15
  142. package/src/components/composite/CreateProjectDialog/CreateProjectDialog.stories.tsx +0 -56
  143. package/src/components/composite/CreateProjectDialog/index.tsx +0 -70
  144. package/src/components/composite/DataManagementSectionView/DataManagementSectionView.stories.tsx +0 -123
  145. package/src/components/composite/DataManagementSectionView/DataManagementSectionViewSource.test.mjs +0 -45
  146. package/src/components/composite/DataManagementSectionView/index.tsx +0 -110
  147. package/src/components/composite/DataTable/DataTable.stories.tsx +0 -159
  148. package/src/components/composite/DataTable/DataTableSource.test.mjs +0 -96
  149. package/src/components/composite/DataTable/index.tsx +0 -373
  150. package/src/components/composite/DetailChrome/DetailChrome.stories.tsx +0 -61
  151. package/src/components/composite/DetailChrome/DetailChromeSource.test.mjs +0 -31
  152. package/src/components/composite/DetailChrome/index.tsx +0 -94
  153. package/src/components/composite/DetailPanel/DetailPanel.stories.tsx +0 -185
  154. package/src/components/composite/DetailPanel/DetailPanelSource.test.mjs +0 -49
  155. package/src/components/composite/DetailPanel/index.tsx +0 -120
  156. package/src/components/composite/DetailScaffold/DetailScaffold.stories.tsx +0 -203
  157. package/src/components/composite/DetailScaffold/DetailScaffoldSource.test.mjs +0 -38
  158. package/src/components/composite/DetailScaffold/index.tsx +0 -114
  159. package/src/components/composite/Dialog/Dialog.stories.tsx +0 -343
  160. package/src/components/composite/Dialog/DialogSource.test.mjs +0 -130
  161. package/src/components/composite/Dialog/index.tsx +0 -333
  162. package/src/components/composite/DropZone/DropZone.stories.tsx +0 -105
  163. package/src/components/composite/DropZone/DropZoneSource.test.mjs +0 -68
  164. package/src/components/composite/DropZone/index.tsx +0 -196
  165. package/src/components/composite/FSelect/FSelect.stories.tsx +0 -64
  166. package/src/components/composite/FSelect/index.tsx +0 -29
  167. package/src/components/composite/FeedbackContextMenuView/FeedbackContextMenuView.stories.tsx +0 -106
  168. package/src/components/composite/FeedbackContextMenuView/index.tsx +0 -51
  169. package/src/components/composite/FeedbackDialogView/FeedbackDialogView.stories.tsx +0 -291
  170. package/src/components/composite/FeedbackDialogView/index.tsx +0 -95
  171. package/src/components/composite/FileReferenceCard/FileReferenceCard.stories.tsx +0 -364
  172. package/src/components/composite/FileReferenceCard/FileReferenceCardSource.test.mjs +0 -48
  173. package/src/components/composite/FileReferenceCard/index.tsx +0 -122
  174. package/src/components/composite/FilterBar/FilterBar.stories.tsx +0 -167
  175. package/src/components/composite/FilterBar/FilterBarSource.test.mjs +0 -75
  176. package/src/components/composite/FilterBar/index.tsx +0 -206
  177. package/src/components/composite/FormField/FormField.stories.tsx +0 -158
  178. package/src/components/composite/FormField/FormFieldSource.test.mjs +0 -56
  179. package/src/components/composite/FormField/index.tsx +0 -219
  180. package/src/components/composite/HomeBackdrop/HomeBackdrop.stories.tsx +0 -54
  181. package/src/components/composite/HomeBackdrop/HomeBackdropSource.test.mjs +0 -50
  182. package/src/components/composite/HomeBackdrop/index.tsx +0 -53
  183. package/src/components/composite/Icons/Icons.stories.tsx +0 -153
  184. package/src/components/composite/Icons/IconsSource.test.mjs +0 -23
  185. package/src/components/composite/Icons/index.tsx +0 -1367
  186. package/src/components/composite/ImageCard/ImageCard.stories.tsx +0 -54
  187. package/src/components/composite/ImageCard/index.tsx +0 -33
  188. package/src/components/composite/ImagePreview/ImagePreview.stories.tsx +0 -172
  189. package/src/components/composite/ImagePreview/ImagePreviewSource.test.mjs +0 -95
  190. package/src/components/composite/ImagePreview/index.tsx +0 -339
  191. package/src/components/composite/ListRow/ListRow.stories.tsx +0 -257
  192. package/src/components/composite/ListRow/ListRowSource.test.mjs +0 -101
  193. package/src/components/composite/ListRow/index.tsx +0 -309
  194. package/src/components/composite/Markdown/Markdown.stories.tsx +0 -192
  195. package/src/components/composite/Markdown/MarkdownSource.test.mjs +0 -126
  196. package/src/components/composite/Markdown/MarkdownStyleSource.test.mjs +0 -167
  197. package/src/components/composite/Markdown/index.tsx +0 -702
  198. package/src/components/composite/MarkdownPreview/MarkdownPreview.stories.tsx +0 -174
  199. package/src/components/composite/MarkdownPreview/MarkdownPreviewTabsSource.test.mjs +0 -31
  200. package/src/components/composite/MarkdownPreview/MarkdownRenderedStyleSource.test.mjs +0 -84
  201. package/src/components/composite/MarkdownPreview/index.tsx +0 -140
  202. package/src/components/composite/MarkdownPreviewModalView/MarkdownPreviewModalView.stories.tsx +0 -104
  203. package/src/components/composite/MarkdownPreviewModalView/index.tsx +0 -85
  204. package/src/components/composite/MessageFeedbackDialog/MessageFeedbackDialog.stories.tsx +0 -66
  205. package/src/components/composite/MessageFeedbackDialog/index.tsx +0 -115
  206. package/src/components/composite/ModelCatalogErrorState/ModelCatalogErrorState.stories.tsx +0 -101
  207. package/src/components/composite/ModelCatalogErrorState/ModelCatalogRetrySource.test.mjs +0 -86
  208. package/src/components/composite/ModelCatalogErrorState/index.tsx +0 -59
  209. package/src/components/composite/ModelModalityFlow/ModelModalityFlow.stories.tsx +0 -224
  210. package/src/components/composite/ModelModalityFlow/ModelModalityFlowSource.test.mjs +0 -56
  211. package/src/components/composite/ModelModalityFlow/index.tsx +0 -113
  212. package/src/components/composite/ModelPickerList/ModelPickerList.stories.tsx +0 -313
  213. package/src/components/composite/ModelPickerList/index.tsx +0 -142
  214. package/src/components/composite/ModelSelect/ModelSelect.stories.tsx +0 -90
  215. package/src/components/composite/ModelSelect/index.tsx +0 -148
  216. package/src/components/composite/ModelsSettingsSectionView/ModelsSettingsSectionView.stories.tsx +0 -170
  217. package/src/components/composite/ModelsSettingsSectionView/index.tsx +0 -139
  218. package/src/components/composite/NativeControls/NativeControls.stories.tsx +0 -386
  219. package/src/components/composite/NativeControls/NativeControlsStyleSource.test.mjs +0 -63
  220. package/src/components/composite/NativeControls/index.tsx +0 -97
  221. package/src/components/composite/NavMenu/NavMenu.stories.tsx +0 -383
  222. package/src/components/composite/NavMenu/NavMenuSource.test.mjs +0 -56
  223. package/src/components/composite/NavMenu/index.tsx +0 -142
  224. package/src/components/composite/NoPlanPanelView/NoPlanPanelView.stories.tsx +0 -344
  225. package/src/components/composite/NoPlanPanelView/NoPlanPanelViewSource.test.mjs +0 -34
  226. package/src/components/composite/NoPlanPanelView/index.tsx +0 -97
  227. package/src/components/composite/OpenWithButton/OpenWithButton.stories.tsx +0 -78
  228. package/src/components/composite/OpenWithButton/index.tsx +0 -46
  229. package/src/components/composite/OrbitworkLogo/OrbitworkLogo.stories.tsx +0 -192
  230. package/src/components/composite/OrbitworkLogo/index.tsx +0 -207
  231. package/src/components/composite/OrbitworkModal/OrbitworkModal.stories.tsx +0 -58
  232. package/src/components/composite/OrbitworkModal/index.tsx +0 -31
  233. package/src/components/composite/PageHead/PageHead.stories.tsx +0 -235
  234. package/src/components/composite/PageHead/PageHeadSource.test.mjs +0 -76
  235. package/src/components/composite/PageHead/index.tsx +0 -128
  236. package/src/components/composite/PlanFeatureIcon/PlanFeatureIcon.stories.tsx +0 -205
  237. package/src/components/composite/PlanFeatureIcon/PlanFeatureIconSource.test.mjs +0 -38
  238. package/src/components/composite/PlanFeatureIcon/index.tsx +0 -48
  239. package/src/components/composite/PlanSettingsSectionView/PlanSettingsSectionView.stories.tsx +0 -231
  240. package/src/components/composite/PlanSettingsSectionView/PlanSettingsSectionViewSource.test.mjs +0 -85
  241. package/src/components/composite/PlanSettingsSectionView/index.tsx +0 -264
  242. package/src/components/composite/Popover/Popover.stories.tsx +0 -175
  243. package/src/components/composite/Popover/PopoverSource.test.mjs +0 -59
  244. package/src/components/composite/Popover/index.tsx +0 -176
  245. package/src/components/composite/PptxRenderer/ElementDispatcher/index.tsx +0 -70
  246. package/src/components/composite/PptxRenderer/PptxChromeStyleSource.test.mjs +0 -36
  247. package/src/components/composite/PptxRenderer/PptxRenderer.stories.tsx +0 -128
  248. package/src/components/composite/PptxRenderer/PptxSlide/index.tsx +0 -48
  249. package/src/components/composite/PptxRenderer/constants.ts +0 -2
  250. package/src/components/composite/PptxRenderer/elements/AudioElement/index.tsx +0 -48
  251. package/src/components/composite/PptxRenderer/elements/ChartElement/index.tsx +0 -172
  252. package/src/components/composite/PptxRenderer/elements/DiagramElement/index.tsx +0 -46
  253. package/src/components/composite/PptxRenderer/elements/GroupElement/index.tsx +0 -28
  254. package/src/components/composite/PptxRenderer/elements/ImageElement/index.tsx +0 -61
  255. package/src/components/composite/PptxRenderer/elements/MathElement/index.tsx +0 -57
  256. package/src/components/composite/PptxRenderer/elements/ShapeElement/index.tsx +0 -327
  257. package/src/components/composite/PptxRenderer/elements/TableElement/index.tsx +0 -90
  258. package/src/components/composite/PptxRenderer/elements/TextElement/index.tsx +0 -57
  259. package/src/components/composite/PptxRenderer/elements/VideoElement/index.tsx +0 -43
  260. package/src/components/composite/PptxRenderer/index.ts +0 -24
  261. package/src/components/composite/PptxRenderer/types.ts +0 -326
  262. package/src/components/composite/PptxRenderer/utils.ts +0 -129
  263. package/src/components/composite/ProjectSelect/ProjectSelect.stories.tsx +0 -112
  264. package/src/components/composite/ProjectSelect/ProjectSelectSource.test.mjs +0 -34
  265. package/src/components/composite/ProjectSelect/index.tsx +0 -155
  266. package/src/components/composite/RadioCard/RadioCard.stories.tsx +0 -130
  267. package/src/components/composite/RadioCard/RadioCardSource.test.mjs +0 -42
  268. package/src/components/composite/RadioCard/index.tsx +0 -171
  269. package/src/components/composite/RowOverflowMenu/RowOverflowMenu.stories.tsx +0 -113
  270. package/src/components/composite/RowOverflowMenu/RowOverflowMenuSource.test.mjs +0 -59
  271. package/src/components/composite/RowOverflowMenu/index.tsx +0 -101
  272. package/src/components/composite/SandboxPermissionPrompt/SandboxPermissionPrompt.stories.tsx +0 -159
  273. package/src/components/composite/SandboxPermissionPrompt/SandboxPermissionPromptSource.test.mjs +0 -71
  274. package/src/components/composite/SandboxPermissionPrompt/index.tsx +0 -157
  275. package/src/components/composite/SearchInput/SearchInput.stories.tsx +0 -127
  276. package/src/components/composite/SearchInput/index.tsx +0 -91
  277. package/src/components/composite/SearchResult/SearchResult.stories.tsx +0 -305
  278. package/src/components/composite/SearchResult/SearchResultSource.test.mjs +0 -45
  279. package/src/components/composite/SearchResult/index.tsx +0 -148
  280. package/src/components/composite/Section/Section.stories.tsx +0 -148
  281. package/src/components/composite/Section/SectionSource.test.mjs +0 -59
  282. package/src/components/composite/Section/index.tsx +0 -105
  283. package/src/components/composite/SelectionBulkBar/SelectionBulkBar.stories.tsx +0 -111
  284. package/src/components/composite/SelectionBulkBar/SelectionBulkBarSource.test.mjs +0 -44
  285. package/src/components/composite/SelectionBulkBar/index.tsx +0 -99
  286. package/src/components/composite/ShareStrip/ShareStrip.stories.tsx +0 -123
  287. package/src/components/composite/ShareStrip/index.tsx +0 -83
  288. package/src/components/composite/ShortcutSheet/ShortcutSheet.stories.tsx +0 -90
  289. package/src/components/composite/ShortcutSheet/ShortcutSheetSource.test.mjs +0 -49
  290. package/src/components/composite/ShortcutSheet/index.tsx +0 -163
  291. package/src/components/composite/SitesArtifactCardView/SitesArtifactCardView.stories.tsx +0 -328
  292. package/src/components/composite/SitesArtifactCardView/SitesArtifactCardViewSource.test.mjs +0 -45
  293. package/src/components/composite/SitesArtifactCardView/index.tsx +0 -100
  294. package/src/components/composite/Skeleton/Skeleton.stories.tsx +0 -188
  295. package/src/components/composite/Skeleton/SkeletonSource.test.mjs +0 -25
  296. package/src/components/composite/Skeleton/index.tsx +0 -152
  297. package/src/components/composite/Splash/Splash.stories.tsx +0 -150
  298. package/src/components/composite/Splash/index.tsx +0 -229
  299. package/src/components/composite/StatusTag/StatusTag.stories.tsx +0 -66
  300. package/src/components/composite/StatusTag/StatusTagSource.test.mjs +0 -64
  301. package/src/components/composite/StatusTag/index.tsx +0 -78
  302. package/src/components/composite/StepList/StepList.stories.tsx +0 -352
  303. package/src/components/composite/StepList/index.tsx +0 -23
  304. package/src/components/composite/Tag/Tag.stories.tsx +0 -279
  305. package/src/components/composite/Tag/TagSource.test.mjs +0 -67
  306. package/src/components/composite/Tag/index.tsx +0 -229
  307. package/src/components/composite/TimePicker/TimePicker.stories.tsx +0 -91
  308. package/src/components/composite/TimePicker/TimePickerSource.test.mjs +0 -98
  309. package/src/components/composite/TimePicker/index.tsx +0 -208
  310. package/src/components/composite/TitleBar/TitleBar.stories.tsx +0 -329
  311. package/src/components/composite/TitleBar/TitleBarSource.test.mjs +0 -140
  312. package/src/components/composite/TitleBar/index.tsx +0 -350
  313. package/src/components/composite/Toast/Toast.stories.tsx +0 -304
  314. package/src/components/composite/Toast/ToastSource.test.mjs +0 -63
  315. package/src/components/composite/Toast/index.tsx +0 -135
  316. package/src/components/composite/Tooltip/Tooltip.stories.tsx +0 -304
  317. package/src/components/composite/Tooltip/TooltipSource.test.mjs +0 -34
  318. package/src/components/composite/Tooltip/index.tsx +0 -204
  319. package/src/components/composite/TranscriptDividers/TranscriptDividers.stories.tsx +0 -160
  320. package/src/components/composite/TranscriptDividers/TranscriptDividersSource.test.mjs +0 -90
  321. package/src/components/composite/TranscriptDividers/index.tsx +0 -352
  322. package/src/components/composite/WCardShell/WCardShell.stories.tsx +0 -228
  323. package/src/components/composite/WCardShell/index.tsx +0 -101
  324. package/src/components/composite/index.ts +0 -81
  325. package/src/components/domain/artifacts/ArtifactPreviewSidebarView/ArtifactPreviewSidebarView.stories.tsx +0 -128
  326. package/src/components/domain/artifacts/ArtifactPreviewSidebarView/ArtifactPreviewSidebarViewSource.test.mjs +0 -69
  327. package/src/components/domain/artifacts/ArtifactPreviewSidebarView/index.tsx +0 -212
  328. package/src/components/domain/artifacts/index.ts +0 -1
  329. package/src/components/domain/browser/BrowserAnnotationPopupView/BrowserAnnotationPopupView.stories.tsx +0 -211
  330. package/src/components/domain/browser/BrowserAnnotationPopupView/BrowserAnnotationPopupViewSource.test.mjs +0 -82
  331. package/src/components/domain/browser/BrowserAnnotationPopupView/index.tsx +0 -235
  332. package/src/components/domain/browser/BrowserDeviceToolbarView/BrowserDeviceToolbarView.stories.tsx +0 -260
  333. package/src/components/domain/browser/BrowserDeviceToolbarView/BrowserDeviceToolbarViewSource.test.mjs +0 -12
  334. package/src/components/domain/browser/BrowserDeviceToolbarView/index.tsx +0 -154
  335. package/src/components/domain/browser/BrowserFindBarView/BrowserFindBarView.stories.tsx +0 -52
  336. package/src/components/domain/browser/BrowserFindBarView/index.tsx +0 -111
  337. package/src/components/domain/browser/BrowserImportDialogView/BrowserImportDialogView.stories.tsx +0 -89
  338. package/src/components/domain/browser/BrowserImportDialogView/index.tsx +0 -155
  339. package/src/components/domain/browser/BrowserLoadErrorView/BrowserLoadErrorView.stories.tsx +0 -197
  340. package/src/components/domain/browser/BrowserLoadErrorView/BrowserLoadErrorViewSource.test.mjs +0 -29
  341. package/src/components/domain/browser/BrowserLoadErrorView/index.tsx +0 -45
  342. package/src/components/domain/browser/BrowserMoreMenuView/BrowserMoreMenuView.stories.tsx +0 -66
  343. package/src/components/domain/browser/BrowserMoreMenuView/index.tsx +0 -268
  344. package/src/components/domain/browser/BrowserNavBarView/BrowserNavBarView.stories.tsx +0 -149
  345. package/src/components/domain/browser/BrowserNavBarView/index.tsx +0 -156
  346. package/src/components/domain/browser/BrowserTabBarView/index.tsx +0 -18
  347. package/src/components/domain/browser/SubAgentPane/SubAgentPane.stories.tsx +0 -96
  348. package/src/components/domain/browser/SubAgentPane/SubAgentPaneSource.test.mjs +0 -48
  349. package/src/components/domain/browser/SubAgentPane/index.tsx +0 -121
  350. package/src/components/domain/browser/TerminalPane/TerminalPane.stories.tsx +0 -95
  351. package/src/components/domain/browser/TerminalPane/TerminalPaneSource.test.mjs +0 -52
  352. package/src/components/domain/browser/TerminalPane/index.tsx +0 -75
  353. package/src/components/domain/browser/WebPreview/WebPreview.stories.tsx +0 -71
  354. package/src/components/domain/browser/WebPreview/index.tsx +0 -141
  355. package/src/components/domain/browser/WebPreviewConsole/WebPreviewConsole.stories.tsx +0 -61
  356. package/src/components/domain/browser/WebPreviewConsole/WebPreviewConsoleSource.test.mjs +0 -66
  357. package/src/components/domain/browser/WebPreviewConsole/index.tsx +0 -239
  358. package/src/components/domain/browser/WebPreviewDialog/WebPreviewDialog.stories.tsx +0 -288
  359. package/src/components/domain/browser/WebPreviewDialog/WebPreviewDialogSource.test.mjs +0 -62
  360. package/src/components/domain/browser/WebPreviewDialog/index.tsx +0 -82
  361. package/src/components/domain/browser/WebPreviewNav/WebPreviewNav.stories.tsx +0 -462
  362. package/src/components/domain/browser/WebPreviewNav/WebPreviewNavSource.test.mjs +0 -353
  363. package/src/components/domain/browser/WebPreviewNav/index.tsx +0 -351
  364. package/src/components/domain/browser/WebPreviewShell/WebPreviewShell.stories.tsx +0 -226
  365. package/src/components/domain/browser/WebPreviewShell/WebPreviewShellSource.test.mjs +0 -172
  366. package/src/components/domain/browser/WebPreviewShell/index.tsx +0 -324
  367. package/src/components/domain/browser/index.ts +0 -45
  368. package/src/components/domain/chat/AgentLoopSegment/AgentLoopSegment.stories.tsx +0 -107
  369. package/src/components/domain/chat/AgentLoopSegment/AgentLoopSegmentSource.test.mjs +0 -45
  370. package/src/components/domain/chat/AgentLoopSegment/index.tsx +0 -29
  371. package/src/components/domain/chat/AgentTurn/AgentTurn.stories.tsx +0 -162
  372. package/src/components/domain/chat/AgentTurn/AgentTurnSource.test.mjs +0 -98
  373. package/src/components/domain/chat/AgentTurn/beaconContext.ts +0 -37
  374. package/src/components/domain/chat/AgentTurn/index.tsx +0 -226
  375. package/src/components/domain/chat/ArtifactCard/ArtifactCard.stories.tsx +0 -127
  376. package/src/components/domain/chat/ArtifactCard/index.tsx +0 -249
  377. package/src/components/domain/chat/Attachment/Attachment.stories.tsx +0 -235
  378. package/src/components/domain/chat/Attachment/AttachmentSource.test.mjs +0 -160
  379. package/src/components/domain/chat/Attachment/index.tsx +0 -857
  380. package/src/components/domain/chat/AuthorizationCard/AuthorizationCard.stories.tsx +0 -53
  381. package/src/components/domain/chat/AuthorizationCard/AuthorizationCardSource.test.mjs +0 -80
  382. package/src/components/domain/chat/AuthorizationCard/index.tsx +0 -89
  383. package/src/components/domain/chat/ChatBubble/ChatBubble.stories.tsx +0 -32
  384. package/src/components/domain/chat/ChatBubble/index.tsx +0 -24
  385. package/src/components/domain/chat/ChatMessage/ChatMessage.stories.tsx +0 -31
  386. package/src/components/domain/chat/ChatMessage/index.tsx +0 -23
  387. package/src/components/domain/chat/ChatR2ReviewSource.test.mjs +0 -98
  388. package/src/components/domain/chat/ChatThinking/ChatThinking.stories.tsx +0 -125
  389. package/src/components/domain/chat/ChatThinking/index.tsx +0 -55
  390. package/src/components/domain/chat/Chatbot/Chatbot.stories.tsx +0 -49
  391. package/src/components/domain/chat/Chatbot/index.tsx +0 -37
  392. package/src/components/domain/chat/Composer/Composer.stories.tsx +0 -227
  393. package/src/components/domain/chat/Composer/ComposerSource.test.mjs +0 -175
  394. package/src/components/domain/chat/Composer/index.tsx +0 -450
  395. package/src/components/domain/chat/Composer/parts/ComposerAudioSpectrum.stories.tsx +0 -203
  396. package/src/components/domain/chat/Composer/parts/ComposerAudioSpectrum.tsx +0 -110
  397. package/src/components/domain/chat/Composer/parts/ComposerAudioSpectrumSource.test.mjs +0 -54
  398. package/src/components/domain/chat/Composer/parts/ComposerAuthorization.stories.tsx +0 -155
  399. package/src/components/domain/chat/Composer/parts/ComposerAuthorization.tsx +0 -108
  400. package/src/components/domain/chat/Composer/parts/ComposerMentions.stories.tsx +0 -76
  401. package/src/components/domain/chat/Composer/parts/ComposerMentions.tsx +0 -83
  402. package/src/components/domain/chat/Composer/parts/ComposerMentionsSource.test.mjs +0 -85
  403. package/src/components/domain/chat/Composer/parts/ComposerMenu.stories.tsx +0 -266
  404. package/src/components/domain/chat/Composer/parts/ComposerMenu.tsx +0 -232
  405. package/src/components/domain/chat/Composer/parts/ComposerMenuPopover.stories.tsx +0 -166
  406. package/src/components/domain/chat/Composer/parts/ComposerMenuPopover.tsx +0 -87
  407. package/src/components/domain/chat/Composer/parts/ComposerMenuPopoverSource.test.mjs +0 -56
  408. package/src/components/domain/chat/Composer/parts/ComposerPopover.stories.tsx +0 -257
  409. package/src/components/domain/chat/Composer/parts/ComposerPopover.tsx +0 -221
  410. package/src/components/domain/chat/Composer/parts/ComposerPopoverSource.test.mjs +0 -71
  411. package/src/components/domain/chat/Composer/parts/ComposerProjectPicker.stories.tsx +0 -260
  412. package/src/components/domain/chat/Composer/parts/ComposerProjectPicker.tsx +0 -246
  413. package/src/components/domain/chat/Composer/parts/ComposerProjectPickerSource.test.mjs +0 -46
  414. package/src/components/domain/chat/Composer/parts/ComposerQueue.stories.tsx +0 -275
  415. package/src/components/domain/chat/Composer/parts/ComposerQueue.tsx +0 -155
  416. package/src/components/domain/chat/Composer/parts/ComposerQueueSource.test.mjs +0 -95
  417. package/src/components/domain/chat/Composer/parts/ComposerVoiceInput.stories.tsx +0 -77
  418. package/src/components/domain/chat/Composer/parts/ComposerVoiceInput.tsx +0 -70
  419. package/src/components/domain/chat/Composer/parts/mountChip.ts +0 -21
  420. package/src/components/domain/chat/ContextUsage/ContextUsage.stories.tsx +0 -62
  421. package/src/components/domain/chat/ContextUsage/index.tsx +0 -69
  422. package/src/components/domain/chat/ExecutionSummary/ExecutionSummary.stories.tsx +0 -238
  423. package/src/components/domain/chat/ExecutionSummary/ExecutionSummarySource.test.mjs +0 -210
  424. package/src/components/domain/chat/ExecutionSummary/index.tsx +0 -487
  425. package/src/components/domain/chat/Message/Message.stories.tsx +0 -264
  426. package/src/components/domain/chat/Message/index.tsx +0 -44
  427. package/src/components/domain/chat/MessageActions/MessageActions.stories.tsx +0 -132
  428. package/src/components/domain/chat/MessageActions/MessageActionsSource.test.mjs +0 -79
  429. package/src/components/domain/chat/MessageActions/index.tsx +0 -186
  430. package/src/components/domain/chat/PlanCard/PlanCard.stories.tsx +0 -87
  431. package/src/components/domain/chat/PlanCard/index.tsx +0 -170
  432. package/src/components/domain/chat/RichContent/RichContent.stories.tsx +0 -102
  433. package/src/components/domain/chat/RichContent/RichContentSource.test.mjs +0 -82
  434. package/src/components/domain/chat/RichContent/index.tsx +0 -465
  435. package/src/components/domain/chat/SubAgentThread/SubAgentThread.stories.tsx +0 -119
  436. package/src/components/domain/chat/SubAgentThread/index.tsx +0 -104
  437. package/src/components/domain/chat/Thinking/Thinking.stories.tsx +0 -196
  438. package/src/components/domain/chat/Thinking/ThinkingInlineSource.test.mjs +0 -154
  439. package/src/components/domain/chat/Thinking/index.tsx +0 -237
  440. package/src/components/domain/chat/ToolCallRow/ToolCallRow.stories.tsx +0 -105
  441. package/src/components/domain/chat/ToolCallRow/ToolCallRowSource.test.mjs +0 -83
  442. package/src/components/domain/chat/ToolCallRow/index.tsx +0 -113
  443. package/src/components/domain/chat/Transcript/Transcript.stories.tsx +0 -296
  444. package/src/components/domain/chat/Transcript/TranscriptSource.test.mjs +0 -189
  445. package/src/components/domain/chat/Transcript/index.tsx +0 -187
  446. package/src/components/domain/chat/TranscriptSpine/TranscriptSpine.stories.tsx +0 -124
  447. package/src/components/domain/chat/TranscriptSpine/index.tsx +0 -245
  448. package/src/components/domain/chat/UserTurn/UserTurn.stories.tsx +0 -176
  449. package/src/components/domain/chat/UserTurn/UserTurnSource.test.mjs +0 -150
  450. package/src/components/domain/chat/UserTurn/index.tsx +0 -194
  451. package/src/components/domain/chat/index.ts +0 -22
  452. package/src/components/domain/desktop/DesktopAccountMenuView/DesktopAccountMenuView.stories.tsx +0 -116
  453. package/src/components/domain/desktop/DesktopAccountMenuView/DesktopAccountMenuViewSource.test.mjs +0 -80
  454. package/src/components/domain/desktop/DesktopAccountMenuView/index.tsx +0 -355
  455. package/src/components/domain/desktop/DesktopAppearanceSettings/DesktopAppearanceSettings.stories.tsx +0 -96
  456. package/src/components/domain/desktop/DesktopAppearanceSettings/DesktopAppearanceSettingsSource.test.mjs +0 -89
  457. package/src/components/domain/desktop/DesktopAppearanceSettings/index.tsx +0 -155
  458. package/src/components/domain/desktop/DesktopAssistantConfigView/DesktopAssistantConfigView.stories.tsx +0 -275
  459. package/src/components/domain/desktop/DesktopAssistantConfigView/DesktopAssistantConfigViewSource.test.mjs +0 -37
  460. package/src/components/domain/desktop/DesktopAssistantConfigView/index.tsx +0 -221
  461. package/src/components/domain/desktop/DesktopCatalogView/DesktopCatalogView.stories.tsx +0 -537
  462. package/src/components/domain/desktop/DesktopCatalogView/DesktopCatalogViewSource.test.mjs +0 -339
  463. package/src/components/domain/desktop/DesktopCatalogView/index.tsx +0 -1074
  464. package/src/components/domain/desktop/DesktopChatBranchDivider/DesktopChatBranchDivider.stories.tsx +0 -58
  465. package/src/components/domain/desktop/DesktopChatBranchDivider/index.tsx +0 -33
  466. package/src/components/domain/desktop/DesktopChatEmptyStateView/DesktopChatEmptyStateView.stories.tsx +0 -75
  467. package/src/components/domain/desktop/DesktopChatEmptyStateView/DesktopChatEmptyStateViewSource.test.mjs +0 -54
  468. package/src/components/domain/desktop/DesktopChatEmptyStateView/index.tsx +0 -64
  469. package/src/components/domain/desktop/DesktopChatHeaderView/DesktopChatHeaderView.stories.tsx +0 -83
  470. package/src/components/domain/desktop/DesktopChatHeaderView/DesktopChatHeaderViewSource.test.mjs +0 -126
  471. package/src/components/domain/desktop/DesktopChatHeaderView/index.tsx +0 -169
  472. package/src/components/domain/desktop/DesktopChatMessageView/DesktopChatMessageView.stories.tsx +0 -170
  473. package/src/components/domain/desktop/DesktopChatMessageView/DesktopChatMessageViewSource.test.mjs +0 -47
  474. package/src/components/domain/desktop/DesktopChatMessageView/index.tsx +0 -213
  475. package/src/components/domain/desktop/DesktopChatTurnView/DesktopChatTurnView.stories.tsx +0 -498
  476. package/src/components/domain/desktop/DesktopChatTurnView/DesktopChatTurnViewSource.test.mjs +0 -187
  477. package/src/components/domain/desktop/DesktopChatTurnView/index.tsx +0 -490
  478. package/src/components/domain/desktop/DesktopComposer/DesktopComposer.stories.tsx +0 -195
  479. package/src/components/domain/desktop/DesktopComposer/DesktopComposerModelPickerSource.test.mjs +0 -132
  480. package/src/components/domain/desktop/DesktopComposer/DesktopComposerMountChipSource.test.mjs +0 -43
  481. package/src/components/domain/desktop/DesktopComposer/DesktopComposerResponsiveSource.test.mjs +0 -44
  482. package/src/components/domain/desktop/DesktopComposer/DesktopMcpFormThemeSource.test.mjs +0 -30
  483. package/src/components/domain/desktop/DesktopComposer/index.tsx +0 -206
  484. package/src/components/domain/desktop/DesktopConnectorDetailView/DesktopConnectorDetailView.stories.tsx +0 -72
  485. package/src/components/domain/desktop/DesktopConnectorDetailView/DesktopConnectorDetailViewSource.test.mjs +0 -81
  486. package/src/components/domain/desktop/DesktopConnectorDetailView/index.tsx +0 -301
  487. package/src/components/domain/desktop/DesktopHomeView/DesktopHomeView.stories.tsx +0 -103
  488. package/src/components/domain/desktop/DesktopHomeView/DesktopHomeViewSource.test.mjs +0 -51
  489. package/src/components/domain/desktop/DesktopHomeView/index.tsx +0 -122
  490. package/src/components/domain/desktop/DesktopLibraryAuthorizationDialog/DesktopLibraryAuthorizationDialog.stories.tsx +0 -55
  491. package/src/components/domain/desktop/DesktopLibraryAuthorizationDialog/DesktopLibraryAuthorizationDialogSource.test.mjs +0 -22
  492. package/src/components/domain/desktop/DesktopLibraryAuthorizationDialog/index.tsx +0 -171
  493. package/src/components/domain/desktop/DesktopLibraryPageView/DesktopLibraryPageView.stories.tsx +0 -49
  494. package/src/components/domain/desktop/DesktopLibraryPageView/index.tsx +0 -49
  495. package/src/components/domain/desktop/DesktopLoginView/DesktopLoginView.css +0 -75
  496. package/src/components/domain/desktop/DesktopLoginView/DesktopLoginView.stories.tsx +0 -230
  497. package/src/components/domain/desktop/DesktopLoginView/DesktopLoginViewSource.test.mjs +0 -156
  498. package/src/components/domain/desktop/DesktopLoginView/index.tsx +0 -432
  499. package/src/components/domain/desktop/DesktopOnboardingTourView/DesktopOnboardingTourView.stories.tsx +0 -103
  500. package/src/components/domain/desktop/DesktopOnboardingTourView/DesktopOnboardingTourViewSource.test.mjs +0 -57
  501. package/src/components/domain/desktop/DesktopOnboardingTourView/index.tsx +0 -189
  502. package/src/components/domain/desktop/DesktopPet/DesktopPet.fixture.ts +0 -243
  503. package/src/components/domain/desktop/DesktopPet/DesktopPet.stories.tsx +0 -337
  504. package/src/components/domain/desktop/DesktopPet/DesktopPetSource.test.mjs +0 -191
  505. package/src/components/domain/desktop/DesktopPet/index.tsx +0 -591
  506. package/src/components/domain/desktop/DesktopPetSettings/DesktopPetSettings.stories.tsx +0 -159
  507. package/src/components/domain/desktop/DesktopPetSettings/DesktopPetSettingsSource.test.mjs +0 -76
  508. package/src/components/domain/desktop/DesktopPetSettings/index.tsx +0 -140
  509. package/src/components/domain/desktop/DesktopRunStatusView/DesktopRunStatusView.stories.tsx +0 -166
  510. package/src/components/domain/desktop/DesktopRunStatusView/DesktopRunStatusViewSource.test.mjs +0 -51
  511. package/src/components/domain/desktop/DesktopRunStatusView/index.tsx +0 -34
  512. package/src/components/domain/desktop/DesktopSelectionCard/DesktopSelectionCard.stories.tsx +0 -122
  513. package/src/components/domain/desktop/DesktopSelectionCard/DesktopSelectionCardSource.test.mjs +0 -42
  514. package/src/components/domain/desktop/DesktopSelectionCard/index.tsx +0 -75
  515. package/src/components/domain/desktop/DesktopSettingsMemorySection/DesktopSettingsMemorySection.stories.tsx +0 -225
  516. package/src/components/domain/desktop/DesktopSettingsMemorySection/DesktopSettingsMemorySectionSource.test.mjs +0 -105
  517. package/src/components/domain/desktop/DesktopSettingsMemorySection/index.tsx +0 -340
  518. package/src/components/domain/desktop/DesktopSettingsView/DesktopSettingsView.stories.tsx +0 -177
  519. package/src/components/domain/desktop/DesktopSettingsView/DesktopSettingsViewSource.test.mjs +0 -195
  520. package/src/components/domain/desktop/DesktopSettingsView/index.tsx +0 -176
  521. package/src/components/domain/desktop/DesktopShareSelectionBarView/DesktopShareSelectionBarView.stories.tsx +0 -77
  522. package/src/components/domain/desktop/DesktopShareSelectionBarView/DesktopShareSelectionBarViewSource.test.mjs +0 -76
  523. package/src/components/domain/desktop/DesktopShareSelectionBarView/index.tsx +0 -55
  524. package/src/components/domain/desktop/DesktopSidebarView/DesktopSidebarView.stories.tsx +0 -454
  525. package/src/components/domain/desktop/DesktopSidebarView/DesktopSidebarViewSource.test.mjs +0 -388
  526. package/src/components/domain/desktop/DesktopSidebarView/index.tsx +0 -1111
  527. package/src/components/domain/desktop/DesktopSiteReleasesView/DesktopSiteReleasesView.stories.tsx +0 -369
  528. package/src/components/domain/desktop/DesktopSiteReleasesView/DesktopSiteReleasesViewSource.test.mjs +0 -123
  529. package/src/components/domain/desktop/DesktopSiteReleasesView/index.tsx +0 -392
  530. package/src/components/domain/desktop/DesktopSitesListView/DesktopSitesListView.stories.tsx +0 -244
  531. package/src/components/domain/desktop/DesktopSitesListView/DesktopSitesListViewSource.test.mjs +0 -198
  532. package/src/components/domain/desktop/DesktopSitesListView/index.tsx +0 -417
  533. package/src/components/domain/desktop/DesktopSkillsPageView/DesktopSkillsPageView.stories.tsx +0 -230
  534. package/src/components/domain/desktop/DesktopSkillsPageView/DesktopSkillsPageViewSource.test.mjs +0 -149
  535. package/src/components/domain/desktop/DesktopSkillsPageView/index.tsx +0 -235
  536. package/src/components/domain/desktop/DesktopTaskDetailView/index.tsx +0 -111
  537. package/src/components/domain/desktop/DesktopToolCallView/DesktopToolCallListViewSource.test.mjs +0 -302
  538. package/src/components/domain/desktop/DesktopToolCallView/DesktopToolCallView.stories.tsx +0 -409
  539. package/src/components/domain/desktop/DesktopToolCallView/index.tsx +0 -388
  540. package/src/components/domain/desktop/DesktopWorkbenchShell/DesktopWorkbenchShell.stories.tsx +0 -418
  541. package/src/components/domain/desktop/DesktopWorkbenchShell/DesktopWorkbenchShellSource.test.mjs +0 -151
  542. package/src/components/domain/desktop/DesktopWorkbenchShell/index.tsx +0 -167
  543. package/src/components/domain/desktop/DesktopWorkspacePageView/DesktopWorkspacePageView.stories.tsx +0 -135
  544. package/src/components/domain/desktop/DesktopWorkspacePageView/DesktopWorkspacePageViewSource.test.mjs +0 -57
  545. package/src/components/domain/desktop/DesktopWorkspacePageView/index.tsx +0 -114
  546. package/src/components/domain/desktop/DesktopWorkspaceView/DesktopWorkspaceView.stories.tsx +0 -227
  547. package/src/components/domain/desktop/DesktopWorkspaceView/DesktopWorkspaceViewSource.test.mjs +0 -175
  548. package/src/components/domain/desktop/DesktopWorkspaceView/index.tsx +0 -580
  549. package/src/components/domain/desktop/ResourceManagement/ResourceManagement.stories.tsx +0 -19
  550. package/src/components/domain/desktop/ResourceManagement/ResourceManagementSource.test.mjs +0 -54
  551. package/src/components/domain/desktop/ResourceManagement/SharesList.tsx +0 -323
  552. package/src/components/domain/desktop/ResourceManagement/SnapshotViews.tsx +0 -92
  553. package/src/components/domain/desktop/ResourceManagement/SnapshotViewsSource.test.mjs +0 -15
  554. package/src/components/domain/desktop/ResourceManagement/index.tsx +0 -246
  555. package/src/components/domain/desktop/ShareSettingsDialogView/index.tsx +0 -234
  556. package/src/components/domain/desktop/SidePanelEmpty/SidePanelEmpty.stories.tsx +0 -100
  557. package/src/components/domain/desktop/SidePanelEmpty/SidePanelEmptySource.test.mjs +0 -67
  558. package/src/components/domain/desktop/SidePanelEmpty/index.tsx +0 -113
  559. package/src/components/domain/desktop/StarterCapsules/StarterCapsules.stories.tsx +0 -65
  560. package/src/components/domain/desktop/StarterCapsules/StarterCapsulesSource.test.mjs +0 -43
  561. package/src/components/domain/desktop/StarterCapsules/index.tsx +0 -90
  562. package/src/components/domain/desktop/WorkbenchSidePanel/WorkbenchSidePanel.stories.tsx +0 -59
  563. package/src/components/domain/desktop/WorkbenchSidePanel/WorkbenchSidePanelSource.test.mjs +0 -51
  564. package/src/components/domain/desktop/WorkbenchSidePanel/index.tsx +0 -74
  565. package/src/components/domain/desktop/WorkspaceMigrateConfirm/WorkspaceMigrateConfirm.stories.tsx +0 -79
  566. package/src/components/domain/desktop/WorkspaceMigrateConfirm/WorkspaceMigrateConfirmSource.test.mjs +0 -34
  567. package/src/components/domain/desktop/WorkspaceMigrateConfirm/index.tsx +0 -92
  568. package/src/components/domain/desktop/index.ts +0 -64
  569. package/src/components/domain/files/FileBrowser/FileBrowser.stories.tsx +0 -397
  570. package/src/components/domain/files/FileBrowser/FileBrowserSource.test.mjs +0 -75
  571. package/src/components/domain/files/FileBrowser/index.tsx +0 -221
  572. package/src/components/domain/files/FileIcon/FileIcon.stories.tsx +0 -207
  573. package/src/components/domain/files/FileIcon/FileIconSource.test.mjs +0 -39
  574. package/src/components/domain/files/FileIcon/index.tsx +0 -133
  575. package/src/components/domain/files/FilePreviewContentView/FilePreviewContentView.stories.tsx +0 -242
  576. package/src/components/domain/files/FilePreviewContentView/FilePreviewContentViewSource.test.mjs +0 -44
  577. package/src/components/domain/files/FilePreviewContentView/index.tsx +0 -125
  578. package/src/components/domain/files/FileTree/FileTree.stories.tsx +0 -204
  579. package/src/components/domain/files/FileTree/FileTreeSource.test.mjs +0 -18
  580. package/src/components/domain/files/FileTree/index.tsx +0 -106
  581. package/src/components/domain/files/PreviewDialog/PreviewDialog.stories.tsx +0 -178
  582. package/src/components/domain/files/PreviewDialog/PreviewDialogSource.test.mjs +0 -92
  583. package/src/components/domain/files/PreviewDialog/index.tsx +0 -294
  584. package/src/components/domain/files/index.ts +0 -5
  585. package/src/components/domain/index.ts +0 -8
  586. package/src/components/domain/office/CsvPreview/CsvPreview.stories.tsx +0 -264
  587. package/src/components/domain/office/CsvPreview/CsvPreviewSource.test.mjs +0 -77
  588. package/src/components/domain/office/CsvPreview/index.tsx +0 -224
  589. package/src/components/domain/office/OfficePreview/OfficePreview.stories.tsx +0 -265
  590. package/src/components/domain/office/OfficePreview/OfficePreviewDialog.stories.tsx +0 -71
  591. package/src/components/domain/office/OfficePreview/OfficePreviewDialog.tsx +0 -43
  592. package/src/components/domain/office/OfficePreview/OfficePreviewSource.test.mjs +0 -126
  593. package/src/components/domain/office/OfficePreview/index.tsx +0 -782
  594. package/src/components/domain/office/PdfPreview/PdfPreview.stories.tsx +0 -280
  595. package/src/components/domain/office/PdfPreview/PdfPreviewDialog.stories.tsx +0 -61
  596. package/src/components/domain/office/PdfPreview/PdfPreviewDialog.tsx +0 -61
  597. package/src/components/domain/office/PdfPreview/PdfPreviewSource.test.mjs +0 -70
  598. package/src/components/domain/office/PdfPreview/index.tsx +0 -217
  599. package/src/components/domain/office/index.ts +0 -5
  600. package/src/components/domain/skills/McpServerListView/McpServerListView.stories.tsx +0 -510
  601. package/src/components/domain/skills/McpServerListView/McpServerListViewSource.test.mjs +0 -101
  602. package/src/components/domain/skills/McpServerListView/index.tsx +0 -250
  603. package/src/components/domain/skills/SkillAvatarView/SkillAvatarView.stories.tsx +0 -121
  604. package/src/components/domain/skills/SkillAvatarView/SkillAvatarViewSource.test.mjs +0 -67
  605. package/src/components/domain/skills/SkillAvatarView/index.tsx +0 -112
  606. package/src/components/domain/skills/SkillCardView/SkillCardView.stories.tsx +0 -374
  607. package/src/components/domain/skills/SkillCardView/SkillCardViewSource.test.mjs +0 -35
  608. package/src/components/domain/skills/SkillCardView/index.tsx +0 -88
  609. package/src/components/domain/skills/SkillDetailPanelView/SkillDetailPanelView.stories.tsx +0 -113
  610. package/src/components/domain/skills/SkillDetailPanelView/index.tsx +0 -115
  611. package/src/components/domain/skills/SkillDetailView/SkillDetailView.stories.tsx +0 -274
  612. package/src/components/domain/skills/SkillDetailView/index.tsx +0 -121
  613. package/src/components/domain/skills/SkillImportDialogView/SkillImportDialogView.stories.tsx +0 -128
  614. package/src/components/domain/skills/SkillImportDialogView/SkillImportDialogViewSource.test.mjs +0 -11
  615. package/src/components/domain/skills/SkillImportDialogView/index.tsx +0 -147
  616. package/src/components/domain/skills/ToolDetailModalView/ToolDetailModalView.stories.tsx +0 -160
  617. package/src/components/domain/skills/ToolDetailModalView/ToolDetailModalViewSource.test.mjs +0 -99
  618. package/src/components/domain/skills/ToolDetailModalView/index.tsx +0 -160
  619. package/src/components/domain/skills/index.ts +0 -7
  620. package/src/components/domain/tasks/ScheduledTaskCardView/ScheduledTaskCardView.stories.tsx +0 -120
  621. package/src/components/domain/tasks/ScheduledTaskCardView/ScheduledTaskCardViewSource.test.mjs +0 -40
  622. package/src/components/domain/tasks/ScheduledTaskCardView/index.tsx +0 -135
  623. package/src/components/domain/tasks/ScheduledTaskDeleteDialog/ScheduledTaskDeleteDialog.stories.tsx +0 -56
  624. package/src/components/domain/tasks/ScheduledTaskDeleteDialog/ScheduledTaskDeleteDialogSource.test.mjs +0 -35
  625. package/src/components/domain/tasks/ScheduledTaskDeleteDialog/index.tsx +0 -73
  626. package/src/components/domain/tasks/ScheduledTaskDetailView/ScheduledTaskDetailView.stories.tsx +0 -121
  627. package/src/components/domain/tasks/ScheduledTaskDetailView/ScheduledTaskDetailViewSource.test.mjs +0 -115
  628. package/src/components/domain/tasks/ScheduledTaskDetailView/index.tsx +0 -223
  629. package/src/components/domain/tasks/ScheduledTasksSpaceView/ScheduledTasksSpaceView.stories.tsx +0 -526
  630. package/src/components/domain/tasks/ScheduledTasksSpaceView/ScheduledTasksSpaceViewSource.test.mjs +0 -85
  631. package/src/components/domain/tasks/ScheduledTasksSpaceView/index.tsx +0 -118
  632. package/src/components/domain/tasks/index.ts +0 -4
  633. package/src/components/domain/theme/SkinManager.stories.tsx +0 -43
  634. package/src/components/domain/theme/SkinManagerUI.tsx +0 -382
  635. package/src/components/domain/theme/ThemeDemo.stories.tsx +0 -12
  636. package/src/components/domain/theme/ThemeDemo.tsx +0 -224
  637. package/src/components/index.ts +0 -11
  638. package/src/components/primitives/Avatar/Avatar.stories.tsx +0 -170
  639. package/src/components/primitives/Avatar/AvatarSource.test.mjs +0 -37
  640. package/src/components/primitives/Avatar/index.tsx +0 -180
  641. package/src/components/primitives/BackTop/BackTop.stories.tsx +0 -122
  642. package/src/components/primitives/BackTop/BackTopSource.test.mjs +0 -61
  643. package/src/components/primitives/BackTop/index.tsx +0 -93
  644. package/src/components/primitives/Badge/Badge.stories.tsx +0 -376
  645. package/src/components/primitives/Badge/BadgeSource.test.mjs +0 -27
  646. package/src/components/primitives/Badge/index.tsx +0 -65
  647. package/src/components/primitives/Button/Button.stories.tsx +0 -287
  648. package/src/components/primitives/Button/ButtonSource.test.mjs +0 -84
  649. package/src/components/primitives/Button/index.tsx +0 -219
  650. package/src/components/primitives/Card/Card.stories.tsx +0 -186
  651. package/src/components/primitives/Card/CardSource.test.mjs +0 -73
  652. package/src/components/primitives/Card/index.tsx +0 -137
  653. package/src/components/primitives/Checkbox/Checkbox.stories.tsx +0 -79
  654. package/src/components/primitives/Checkbox/CheckboxSource.test.mjs +0 -43
  655. package/src/components/primitives/Checkbox/index.tsx +0 -87
  656. package/src/components/primitives/Chip/Chip.stories.tsx +0 -149
  657. package/src/components/primitives/Chip/ChipSource.test.mjs +0 -73
  658. package/src/components/primitives/Chip/index.tsx +0 -252
  659. package/src/components/primitives/Divider/Divider.stories.tsx +0 -68
  660. package/src/components/primitives/Divider/DividerSource.test.mjs +0 -26
  661. package/src/components/primitives/Divider/index.tsx +0 -65
  662. package/src/components/primitives/Dropdown/Dropdown.stories.tsx +0 -38
  663. package/src/components/primitives/Dropdown/DropdownSource.test.mjs +0 -23
  664. package/src/components/primitives/Dropdown/index.tsx +0 -29
  665. package/src/components/primitives/EmptyState/EmptyState.stories.tsx +0 -159
  666. package/src/components/primitives/EmptyState/EmptyStateSource.test.mjs +0 -169
  667. package/src/components/primitives/EmptyState/index.tsx +0 -185
  668. package/src/components/primitives/ErrorCard/ErrorCard.stories.tsx +0 -50
  669. package/src/components/primitives/ErrorCard/index.tsx +0 -78
  670. package/src/components/primitives/Field/Field.stories.tsx +0 -208
  671. package/src/components/primitives/Field/FieldSource.test.mjs +0 -70
  672. package/src/components/primitives/Field/index.tsx +0 -297
  673. package/src/components/primitives/InlineMessage/InlineMessage.stories.tsx +0 -137
  674. package/src/components/primitives/InlineMessage/InlineMessageSource.test.mjs +0 -50
  675. package/src/components/primitives/InlineMessage/index.tsx +0 -141
  676. package/src/components/primitives/Input/Input.stories.tsx +0 -30
  677. package/src/components/primitives/Input/index.tsx +0 -12
  678. package/src/components/primitives/Keycap/Keycap.stories.tsx +0 -93
  679. package/src/components/primitives/Keycap/KeycapSource.test.mjs +0 -30
  680. package/src/components/primitives/Keycap/index.tsx +0 -67
  681. package/src/components/primitives/Menu/Menu.stories.tsx +0 -416
  682. package/src/components/primitives/Menu/MenuEmptySource.test.mjs +0 -23
  683. package/src/components/primitives/Menu/MenuSource.test.mjs +0 -207
  684. package/src/components/primitives/Menu/index.tsx +0 -923
  685. package/src/components/primitives/Pagination/Pagination.stories.tsx +0 -77
  686. package/src/components/primitives/Pagination/PaginationSource.test.mjs +0 -24
  687. package/src/components/primitives/Pagination/index.tsx +0 -85
  688. package/src/components/primitives/Pagination/pagination.ts +0 -25
  689. package/src/components/primitives/Pagination/paginationModel.test.mjs +0 -18
  690. package/src/components/primitives/ProgressBar/ProgressBar.stories.tsx +0 -103
  691. package/src/components/primitives/ProgressBar/ProgressBarSource.test.mjs +0 -44
  692. package/src/components/primitives/ProgressBar/index.tsx +0 -68
  693. package/src/components/primitives/Radio/Radio.stories.tsx +0 -84
  694. package/src/components/primitives/Radio/RadioSource.test.mjs +0 -38
  695. package/src/components/primitives/Radio/index.tsx +0 -161
  696. package/src/components/primitives/SegmentedControl/SegmentedControl.stories.tsx +0 -110
  697. package/src/components/primitives/SegmentedControl/SegmentedControlSource.test.mjs +0 -75
  698. package/src/components/primitives/SegmentedControl/index.tsx +0 -188
  699. package/src/components/primitives/Select/Select.stories.tsx +0 -158
  700. package/src/components/primitives/Select/SelectSource.test.mjs +0 -94
  701. package/src/components/primitives/Select/index.tsx +0 -406
  702. package/src/components/primitives/Spinner/index.tsx +0 -58
  703. package/src/components/primitives/Switch/Switch.stories.tsx +0 -64
  704. package/src/components/primitives/Switch/SwitchSource.test.mjs +0 -38
  705. package/src/components/primitives/Switch/index.tsx +0 -84
  706. package/src/components/primitives/Tabs/Tabs.stories.tsx +0 -230
  707. package/src/components/primitives/Tabs/TabsSource.test.mjs +0 -91
  708. package/src/components/primitives/Tabs/index.tsx +0 -183
  709. package/src/components/primitives/index.ts +0 -24
  710. package/src/examples/ResourceManagementExample.tsx +0 -119
  711. package/src/examples/SiteWorkbenchExample.tsx +0 -96
  712. package/src/hooks/index.ts +0 -7
  713. package/src/hooks/useClickOutside.ts +0 -20
  714. package/src/hooks/useDragReorder.ts +0 -29
  715. package/src/hooks/useImeAwareEnter.ts +0 -59
  716. package/src/hooks/useImeAwareEnterSource.test.mjs +0 -65
  717. package/src/hooks/useKeyboard.ts +0 -16
  718. package/src/hooks/usePopover.ts +0 -67
  719. package/src/hooks/useSelectedOptionLocator.ts +0 -33
  720. package/src/hooks/useSidebarResize.ts +0 -107
  721. package/src/hooks/useTenantTheme.ts +0 -53
  722. package/src/hooks/useUnifiedTheme.ts +0 -85
  723. package/src/index.ts +0 -6
  724. package/src/lib/InjectedStyleTokenMirrorSource.test.mjs +0 -67
  725. package/src/lib/about-window.test.mjs +0 -46
  726. package/src/lib/about-window.ts +0 -218
  727. package/src/lib/appearance.test.mjs +0 -283
  728. package/src/lib/appearance.ts +0 -46
  729. package/src/lib/browser-annotation-popup.ts +0 -151
  730. package/src/lib/focusTrap.ts +0 -51
  731. package/src/lib/index.ts +0 -5
  732. package/src/lib/shortcut.test.mjs +0 -100
  733. package/src/lib/shortcut.ts +0 -97
  734. package/src/lib/twMergeOw.ts +0 -18
  735. package/src/lib/utils.ts +0 -6
  736. package/src/screens/Browser.stories.tsx +0 -353
  737. package/src/screens/Chat.stories.tsx +0 -808
  738. package/src/screens/Home.stories.tsx +0 -253
  739. package/src/screens/Login.stories.tsx +0 -134
  740. package/src/screens/McpManager.stories.tsx +0 -159
  741. package/src/screens/Onboarding.stories.tsx +0 -155
  742. package/src/screens/ScheduledTasks.stories.tsx +0 -134
  743. package/src/screens/ScreenFrameSource.test.mjs +0 -77
  744. package/src/screens/SettingsAppearance.stories.tsx +0 -117
  745. package/src/screens/SettingsMemory.stories.tsx +0 -128
  746. package/src/screens/SettingsModels.stories.tsx +0 -228
  747. package/src/screens/SettingsSections.stories.tsx +0 -164
  748. package/src/screens/Share.stories.tsx +0 -202
  749. package/src/screens/SharePage.stories.tsx +0 -29
  750. package/src/screens/Sites.stories.tsx +0 -183
  751. package/src/screens/Skills.stories.tsx +0 -83
  752. package/src/screens/Workspace.stories.tsx +0 -191
  753. package/src/screens/_home.tsx +0 -46
  754. package/src/screens/_screen.tsx +0 -355
  755. package/src/screens/_settingsNav.ts +0 -27
  756. package/src/screens/_skillsCatalog.tsx +0 -372
  757. package/src/theme/SkinDenylistSyncSource.test.mjs +0 -124
  758. package/src/theme/__tests__/skins.test.mjs +0 -84
  759. package/src/theme/core/semanticAdapter.ts +0 -116
  760. package/src/theme/core/skin.ts +0 -605
  761. package/src/theme/core/skinScoped.ts +0 -289
  762. package/src/theme/core/tenantTheme.test.mjs +0 -127
  763. package/src/theme/core/tenantTheme.ts +0 -124
  764. package/src/theme/core/types.ts +0 -60
  765. package/src/theme/core/unifiedTheme.ts +0 -157
  766. package/src/theme/index.ts +0 -33
  767. package/src/theme/providers/BrandingProvider.tsx +0 -57
  768. package/src/theme/providers/ThemeProvider.tsx +0 -221
  769. package/src/theme/skinDs2PropertyGate.test.mjs +0 -109
  770. package/src/theme/skins/index.ts +0 -107
  771. package/src/theme/utils/cssSafety.ts +0 -92
  772. package/src/theme/utils/skinManager.ts +0 -159
  773. package/src/theme/utils/themeApplier.ts +0 -75
  774. package/src/tokens/DesktopSurfacesSweep15Source.test.mjs +0 -77
  775. package/src/tokens/SharedStyleSheetsSource.test.mjs +0 -90
  776. package/src/tokens/TailwindThemeSupplySource.test.mjs +0 -129
  777. package/src/tokens/base.ts +0 -199
  778. package/src/tokens/dark.ts +0 -288
  779. package/src/tokens/index.ts +0 -4
  780. package/src/tokens/light.ts +0 -320
  781. package/src/tokens/tailwind.ts +0 -216
  782. package/src/types/desktop-pet.ts +0 -100
  783. package/src/types/file-browser.ts +0 -51
  784. package/src/types/file-tree.ts +0 -34
  785. package/src/types/index.ts +0 -3
  786. package/src/types/xspreadsheet.d.ts +0 -4
  787. package/src/utils/cn.ts +0 -6
  788. package/src/utils/glyphColor.ts +0 -32
  789. package/src/utils/index.ts +0 -4
  790. package/src/utils/localPathInline.test.mjs +0 -45
  791. package/src/utils/localPathInline.ts +0 -49
  792. package/src/utils/markdownFileRefs.test.mjs +0 -88
  793. package/src/utils/markdownFileRefs.ts +0 -140
  794. package/src/utils/office-excel.ts +0 -452
  795. package/src/utils/shiki.ts +0 -156
@@ -1,923 +0,0 @@
1
- "use client"
2
-
3
- import { type VariantProps, cva } from "class-variance-authority"
4
- import {
5
- type ReactElement,
6
- type KeyboardEvent as ReactKeyboardEvent,
7
- type ReactNode,
8
- cloneElement,
9
- isValidElement,
10
- useCallback,
11
- useEffect,
12
- useId,
13
- useLayoutEffect,
14
- useMemo,
15
- useRef,
16
- useState,
17
- } from "react"
18
- import { createPortal } from "react-dom" // ui-imports-guard-disable-line
19
- import { cn } from "../../../lib/utils"
20
- import { Check } from "../../composite/Icons"
21
- import { Button } from "../Button"
22
- import { EmptyState } from "../EmptyState"
23
- import { Field } from "../Field"
24
- import { KeycapCombo } from "../Keycap"
25
-
26
- /* ------------------------------------------------------------------ *
27
- * 条目模型
28
- * ------------------------------------------------------------------ */
29
-
30
- export type MenuItem = {
31
- key: string
32
- label: ReactNode
33
- icon?: ReactNode
34
- /** 快捷键列:mono 键帽(读数规范)。字符串按 `+` 拆成组合键。 */
35
- shortcut?: string | string[]
36
- /** 行尾次要文字(非快捷键)。同时给了 shortcut 时以 shortcut 为准。 */
37
- hint?: ReactNode
38
- /** hint 走读数档:mono + tabular-nums(§7 读数口径,版本号/计数这类数字用)。 */
39
- hintMono?: boolean
40
- /**
41
- * 行尾交互控件(开关、分段器…)。给了 control 的行渲染成 `<div role="menuitem">` 外壳
42
- * + 标签区,控件本身可聚焦 —— 不再是 button 套 button(HTML 不允许,浏览器会把内层
43
- * 拆出去,键盘与读屏都会错位)。控件区自己吃掉点击,不会顺带触发整行的 onSelect。
44
- * 行 `disabled` 只禁行本身(aria-disabled、不进方向键/Tab 序列),控件要禁用得自己传 disabled。
45
- */
46
- control?: ReactNode
47
- /** 名称下方的说明行(行高自适应,不再是 32 定高)。 */
48
- description?: string
49
- /** 勾选态:行尾打勾(暗档 hover-pop 与 current-bg 同值,选中靠勾区分)。 */
50
- selected?: boolean
51
- /** 危险动作:error 色 + error-tint hover。 */
52
- danger?: boolean
53
- disabled?: boolean
54
- /** searchable 过滤用文本,label 非字符串时必填。 */
55
- searchText?: string
56
- }
57
-
58
- /** 分隔线。旧 Dropdown 的 `{ key: "---" }` 形态同样识别。 */
59
- export type MenuSeparatorEntry = { type: "separator"; key?: string }
60
- /** 分组标题(眉标档:CAPS + tracking,不可聚焦)。 */
61
- export type MenuGroupEntry = { type: "group"; key?: string; label: ReactNode }
62
-
63
- export type MenuEntry = MenuItem | MenuSeparatorEntry | MenuGroupEntry
64
-
65
- /** 分隔项常量。导航列的分隔项是 `NAV_MENU_DIVIDER`(composite/NavMenu)。 */
66
- export const MENU_SEPARATOR: MenuSeparatorEntry = { type: "separator" }
67
-
68
- /** 旧 Dropdown 分隔项的 key 约定,兼容期继续识别。 */
69
- const LEGACY_DIVIDER_KEY = "---"
70
-
71
- function isSeparator(entry: MenuEntry): entry is MenuSeparatorEntry {
72
- return ("type" in entry && entry.type === "separator") || (!("type" in entry) && entry.key === LEGACY_DIVIDER_KEY)
73
- }
74
- function isGroup(entry: MenuEntry): entry is MenuGroupEntry {
75
- return "type" in entry && entry.type === "group"
76
- }
77
- function isItem(entry: MenuEntry): entry is MenuItem {
78
- return !isSeparator(entry) && !isGroup(entry)
79
- }
80
- function itemText(item: MenuItem): string {
81
- return item.searchText ?? (typeof item.label === "string" ? item.label : "")
82
- }
83
- function shortcutKeys(shortcut: string | string[]): string[] {
84
- return (Array.isArray(shortcut) ? shortcut : shortcut.split("+")).map((key) => key.trim()).filter(Boolean)
85
- }
86
-
87
- /** 槽内可聚焦件(Tab 停靠点):行尾控件区、bare 头部、banner、footer 里的按钮/输入等。行本身 tabIndex=-1,不会被这条选中。 */
88
- const FOCUSABLE = ["button", "[href]", "input", "select", "textarea", '[tabindex]:not([tabindex="-1"])'].join(", ")
89
- /** 取一个槽里的 Tab 停靠点(DOM 顺序)。roving tabindex 的控件(分段器)内部只有一个 tabIndex=0 的段,其余 -1 不算。 */
90
- function focusableStops(root: Element | null | undefined): HTMLElement[] {
91
- if (!root) return []
92
- return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(
93
- (node) => !(node.tabIndex < 0 || node.hasAttribute("disabled") || node.getAttribute("aria-hidden") === "true"),
94
- )
95
- }
96
-
97
- /* ------------------------------------------------------------------ *
98
- * 行样式
99
- * ------------------------------------------------------------------ */
100
-
101
- const menuItemVariants = cva(
102
- [
103
- "flex items-center gap-2 w-full px-2 text-left text-ow-fs-ui font-normal",
104
- "transition-[background-color,color] duration-[var(--ow-dur-1)] ease-[var(--ow-ease-beacon)]",
105
- "[border-radius:var(--ow-radius-control)] ow-focus-ring",
106
- ].join(" "),
107
- {
108
- variants: {
109
- danger: {
110
- true: "text-[color:var(--ow-error)]",
111
- false: "text-[color:var(--ow-text)]",
112
- },
113
- selected: {
114
- true: "bg-[var(--ow-selected-bg)]",
115
- false: "",
116
- },
117
- hovered: {
118
- true: "",
119
- false: "",
120
- },
121
- disabled: {
122
- true: "cursor-not-allowed text-[color:var(--ow-disabled-text)]",
123
- false: "cursor-pointer",
124
- },
125
- hasDescription: {
126
- // 行高 32 是常态;带说明行时放开为自适应两行。
127
- true: "h-auto py-2 items-start",
128
- false: "h-8",
129
- },
130
- },
131
- compoundVariants: [
132
- // 坐在 --ow-popover-bg 上的行一律 -pop 档(§5 交互底色相对所在表面递进)。
133
- {
134
- hovered: true,
135
- selected: false,
136
- disabled: false,
137
- danger: false,
138
- className: "bg-[var(--ow-hover-pop)] active:bg-[var(--ow-press-pop)]",
139
- },
140
- {
141
- hovered: true,
142
- selected: false,
143
- disabled: false,
144
- danger: true,
145
- className: "bg-[var(--ow-error-tint)] active:bg-[var(--ow-error-tint-hover)]",
146
- },
147
- ],
148
- defaultVariants: {
149
- danger: false,
150
- selected: false,
151
- hovered: false,
152
- disabled: false,
153
- hasDescription: false,
154
- },
155
- },
156
- )
157
-
158
- export type MenuItemVariants = VariantProps<typeof menuItemVariants>
159
-
160
- /* ------------------------------------------------------------------ *
161
- * MenuSurface — 菜单面
162
- * ------------------------------------------------------------------ */
163
-
164
- export type MenuSurfaceProps = {
165
- items?: MenuEntry[]
166
- /** 自定义内容(域内选择器自渲染条目时用)。给了 children 时默认不加 menu 语义。 */
167
- children?: ReactNode
168
- /** 自定义内容尺寸可能变化时改变它,触发 portal 重新测量。 */
169
- contentKey?: string | number
170
- onSelect?: (key: string) => void
171
- /** 高亮某项但不画勾(区别于 selected)。 */
172
- activeKey?: string | null
173
- /** 鼠标划过非分隔、非禁用条目时回调。 */
174
- onItemHover?: (key: string) => void
175
- /** 面宽 px(默认 200)。 */
176
- width?: number
177
- /** 条目上方的眉标行。 */
178
- header?: ReactNode
179
- /**
180
- * header 原样渲染:不套眉标排版(CAPS / tracking / --ow-eyebrow),并以 `role="none"`
181
- * 包裹,让读屏把里面的非条目内容(头像块、账号名)当普通内容读,而不是当菜单项跳过。
182
- * 里面的按钮(复制 ID 这类)是面内 Tab 停靠点,排在条目之前。
183
- */
184
- headerBare?: boolean
185
- /**
186
- * header 与条目之间的整块自定义内容(套餐井这类)。`role="none"` 包裹,同上;
187
- * 里面的按钮(升级 / 充值)是面内 Tab 停靠点,排在 header 之后、条目之前。
188
- */
189
- banner?: ReactNode
190
- /** 条目下方的固定区(上分隔线)。 */
191
- footer?: ReactNode
192
- /** 内嵌搜索字段。 */
193
- searchable?: boolean
194
- searchPlaceholder?: string
195
- searchValue?: string
196
- onSearchChange?: (value: string) => void
197
- /** 过滤无结果时的一句话(渲染进 `EmptyState` 紧凑档:信标母题 + 一句 text-2)。 */
198
- empty?: ReactNode
199
- /**
200
- * Portal 模式 —— 渲染进 document.body 并 fixed 定位,自动避开视口边界。
201
- * 传锚点 ref,或 `true` 表示以父元素为锚。滚动容器会裁掉 absolute 弹层,
202
- * 而裁剪不是抬 z-index 能解决的,所以行内菜单一律走这条路。
203
- */
204
- portal?: boolean | React.RefObject<HTMLElement | null>
205
- /** 非 portal 模式下溢出视口时自动微调位移(默认关)。 */
206
- autoAdjust?: boolean
207
- /** portal 模式的横向对齐:`start` 贴锚点左缘(默认)· `end` 贴右缘(行末「…」用)。 */
208
- align?: "start" | "end"
209
- /**
210
- * 语义档:`menu` 给容器 role="menu"、条目 role="menuitem(checkbox)";
211
- * `none` 只当装饰容器。默认 items 模式为 menu,children 模式为 none。
212
- */
213
- role?: "menu" | "none"
214
- /**
215
- * 打开后把焦点收进面:`true`=搜索框优先,否则第一条可用项(键盘打开时用,行上立刻有
216
- * focus-visible 环可循);`"surface"`=只把焦点落在面本体(tabIndex=-1 的容器)——
217
- * 指针打开时用:方向键/Esc 照常可用,但第一行不画键盘环(R3 · 2026-09-04,Terry
218
- * 意见 1「选中状态的焦点环」:指针开面时首行那圈环是 Storybook 里最扎眼的一处)。
219
- */
220
- autoFocus?: boolean | "surface"
221
- /** Esc / Tab 离开时回调,触发器模式据此关闭。 */
222
- onClose?: () => void
223
- /** 容器可读名(role="menu" 时用)。 */
224
- ariaLabel?: string
225
- /** 拿到面本体(portal 出去后不在触发器子树里,外点判断要它)。 */
226
- surfaceRef?: React.RefObject<HTMLDivElement | null>
227
- className?: string
228
- }
229
-
230
- /**
231
- * MenuSurface — 下拉菜单的「面」(DS 2.0 patterns · Menu 簇)。
232
- *
233
- * 立面按 §5:`--ow-popover-bg` 底 + 1px `--ow-border` + `--ow-shadow-pop` +
234
- * `var(--ow-z-dropdown)`,圆角 10(`--ow-radius-menu`,§7);行高 32、行 hover
235
- * 走 `-pop` 档;快捷键列 Keycap(mono + tabular-nums);勾选态打勾;危险项 error 色。
236
- * 键盘:↑↓ / Home / End / 首字母跳转 / Enter 选中 / Esc 关闭。
237
- *
238
- * 这是旧 `primitives/Dropdown` 的规范化继任者,属性向后兼容(Dropdown 现为
239
- * @deprecated 别名)。带触发器的完整菜单见同目录 `Menu`。
240
- */
241
- export function MenuSurface({
242
- items = [],
243
- children,
244
- contentKey,
245
- onSelect,
246
- activeKey,
247
- onItemHover,
248
- width = 200,
249
- header,
250
- headerBare = false,
251
- banner,
252
- footer,
253
- searchable = false,
254
- searchPlaceholder = "搜索",
255
- searchValue,
256
- onSearchChange,
257
- empty = "暂无结果",
258
- portal = false,
259
- autoAdjust = false,
260
- align = "start",
261
- role,
262
- autoFocus = false,
263
- onClose,
264
- ariaLabel,
265
- surfaceRef,
266
- className = "",
267
- }: MenuSurfaceProps) {
268
- const [hoveredKey, setHoveredKey] = useState<string | null>(null)
269
- const [internalSearch, setInternalSearch] = useState("")
270
- const ref = useRef<HTMLDivElement | null>(null)
271
- const setSurfaceNode = useCallback(
272
- (node: HTMLDivElement | null) => {
273
- ref.current = node
274
- // RefObject.current 在旧版 @types/react 里是 readonly,这里是合法的回写场景。
275
- if (surfaceRef) (surfaceRef as React.MutableRefObject<HTMLDivElement | null>).current = node
276
- },
277
- [surfaceRef],
278
- )
279
- // 控件行是 div、普通行是 button,两种都要能被程序化聚焦,所以放宽到 HTMLElement。
280
- const itemRefs = useRef(new Map<string, HTMLElement>())
281
- const typeahead = useRef<{ buffer: string; at: number }>({ buffer: "", at: 0 })
282
- const [portalPos, setPortalPos] = useState<{ top: number; left: number } | null>(null)
283
- const [adjust, setAdjust] = useState<{ x: number; y: number }>({ x: 0, y: 0 })
284
- const adjustRef = useRef(adjust)
285
- const baseId = useId()
286
- const semantics = role ?? (children ? "none" : "menu")
287
- const query = searchValue ?? internalSearch
288
- const visibleItems = useMemo(() => {
289
- if (!searchable || !query.trim()) return items
290
- const needle = query.trim().toLowerCase()
291
- return items.filter((entry) => !isItem(entry) || itemText(entry).toLowerCase().includes(needle))
292
- }, [items, query, searchable])
293
- const navigable = useMemo(
294
- () => visibleItems.filter((entry): entry is MenuItem => isItem(entry) && !entry.disabled),
295
- [visibleItems],
296
- )
297
- // 面内是否有带控件的行。
298
- const hasControlRow = useMemo(() => navigable.some((item) => !!item.control), [navigable])
299
- // Tab 是「面内游走」还是「离面」:有控件行、bare 头部或 banner 时游走(这三种槽里会放复制 ID /
300
- // 升级这类按钮,不游走键盘就够不着);都没有时照旧离面,全库既有消费方零变化。
301
- const rovingTab = hasControlRow || (!!header && headerBare) || !!banner
302
- // Tab 停靠点(DOM 顺序):bare 头部里的可聚焦件 → banner 里的 → 行 → 该行控件 → 下一行 → … → footer 里的。
303
- const tabStops = useCallback(() => {
304
- const surface = ref.current
305
- const slot = (part: string) => surface?.querySelector(`:scope > [data-ow-part="${part}"]`)
306
- const stops: HTMLElement[] = []
307
- if (headerBare) stops.push(...focusableStops(slot("header")))
308
- stops.push(...focusableStops(slot("banner")))
309
- for (const item of navigable) {
310
- const row = itemRefs.current.get(item.key)
311
- if (!row) continue
312
- stops.push(row)
313
- if (item.control) stops.push(...focusableStops(row.querySelector('[data-ow-part="item-control"]')))
314
- }
315
- stops.push(...focusableStops(slot("footer")))
316
- return stops
317
- }, [navigable, headerBare])
318
-
319
- const setSearch = (value: string) => {
320
- if (searchValue === undefined) setInternalSearch(value)
321
- onSearchChange?.(value)
322
- }
323
-
324
- const focusItem = useCallback((key: string | null, moveFocus: boolean) => {
325
- setHoveredKey(key)
326
- if (key && moveFocus) itemRefs.current.get(key)?.focus()
327
- }, [])
328
-
329
- // 打开时把焦点收进面:有搜索框先给搜索框,否则给第一条可用项。
330
- useEffect(() => {
331
- if (!autoFocus) return
332
- const frame = requestAnimationFrame(() => {
333
- if (autoFocus === "surface") {
334
- ref.current?.focus()
335
- return
336
- }
337
- if (searchable) {
338
- ref.current?.querySelector<HTMLInputElement>("input")?.focus()
339
- setHoveredKey(navigable[0]?.key ?? null)
340
- return
341
- }
342
- const first = navigable[0]?.key
343
- if (first) focusItem(first, true)
344
- else ref.current?.focus()
345
- })
346
- return () => cancelAnimationFrame(frame)
347
- // 只在打开那一刻收一次焦点,条目变化不该把焦点抢回去。
348
- // eslint-disable-next-line react-hooks/exhaustive-deps
349
- }, [autoFocus])
350
-
351
- const onKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {
352
- const target = event.target as HTMLElement
353
- // 焦点落在行尾控件里时,字符键/Enter/空格归控件自己 —— 否则开关上的空格会被菜单
354
- // 的首字母跳转吃掉(判据是「事件源在控件区内」,不是 tagName)。
355
- const inControl = !!target.closest?.('[data-ow-part="item-control"]')
356
- const inSearch = target.tagName === "INPUT" && !inControl
357
- if (event.key === "Escape") {
358
- event.stopPropagation()
359
- onClose?.()
360
- return
361
- }
362
- if (event.key === "Tab") {
363
- // 无控件行、无 bare 头部 / banner:Tab 即离面(历史行为,全库其它菜单零变化)。
364
- if (!rovingTab) {
365
- onClose?.()
366
- return
367
- }
368
- // 否则 Tab 在「头部/banner 按钮 → 行 → 该行控件 → 下一行 → footer」间游走,走到两端才交还焦点。
369
- const stops = tabStops()
370
- const active = typeof document === "undefined" ? null : (document.activeElement as HTMLElement | null)
371
- let index = active ? stops.indexOf(active) : -1
372
- if (index < 0 && active) {
373
- // 焦点在控件内部更深一层时,取最靠后的包含它的停靠点(控件排在自己行之后)。
374
- for (let i = stops.length - 1; i >= 0; i -= 1) {
375
- if (stops[i]?.contains(active)) {
376
- index = i
377
- break
378
- }
379
- }
380
- }
381
- const next = index + (event.shiftKey ? -1 : 1)
382
- if (index < 0 || next < 0 || next >= stops.length) {
383
- onClose?.()
384
- return
385
- }
386
- event.preventDefault()
387
- stops[next]?.focus()
388
- return
389
- }
390
- // 控件自己已处理的键(分段器的 ←→ / Home / End 会 preventDefault)面不再接手,
391
- // 否则 Home/End 会一边切段、一边把焦点甩到首/末行。
392
- if (inControl && event.isDefaultPrevented()) return
393
- if (navigable.length === 0) return
394
- const current = navigable.findIndex((item) => item.key === hoveredKey)
395
- if (event.key === "ArrowDown" || event.key === "ArrowUp") {
396
- event.preventDefault()
397
- const step = event.key === "ArrowDown" ? 1 : -1
398
- const next =
399
- current < 0 ? (step > 0 ? 0 : navigable.length - 1) : (current + step + navigable.length) % navigable.length
400
- const target = navigable[next]
401
- if (target) focusItem(target.key, !inSearch)
402
- return
403
- }
404
- if (event.key === "Home" || event.key === "End") {
405
- event.preventDefault()
406
- const target = navigable[event.key === "Home" ? 0 : navigable.length - 1]
407
- if (target) focusItem(target.key, !inSearch)
408
- return
409
- }
410
- if (event.key === "Enter" && hoveredKey && !inSearch && !inControl) {
411
- event.preventDefault()
412
- onSelect?.(hoveredKey)
413
- return
414
- }
415
- // 控件行是 <div role="menuitem">,没有 button 的原生空格触发,这里补上。只补控件行:
416
- // 普通行的空格仍走原生 click,行为不变。
417
- if (event.key === " " && hoveredKey && !inSearch && !inControl) {
418
- const row = navigable.find((item) => item.key === hoveredKey)
419
- if (row?.control) {
420
- event.preventDefault()
421
- onSelect?.(hoveredKey)
422
- return
423
- }
424
- }
425
- // 首字母跳转:搜索框、行尾控件在场时让位给它们。
426
- if (!inSearch && !inControl && event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey) {
427
- const now = Date.now()
428
- typeahead.current = {
429
- buffer: now - typeahead.current.at > 800 ? event.key : typeahead.current.buffer + event.key,
430
- at: now,
431
- }
432
- const needle = typeahead.current.buffer.toLowerCase()
433
- const hit = navigable.find((item) => itemText(item).toLowerCase().startsWith(needle))
434
- if (hit) {
435
- event.preventDefault()
436
- focusItem(hit.key, true)
437
- }
438
- }
439
- }
440
-
441
- // 非 portal 模式:溢出视口时整体位移(autoAdjust 显式开启)。
442
- useLayoutEffect(() => {
443
- if (!autoAdjust || portal) {
444
- adjustRef.current = { x: 0, y: 0 }
445
- setAdjust((current) => (current.x || current.y ? { x: 0, y: 0 } : current))
446
- return
447
- }
448
- const el = ref.current
449
- if (!el) return
450
- let raf = 0
451
- const measure = () => {
452
- cancelAnimationFrame(raf)
453
- raf = requestAnimationFrame(() => {
454
- const rect = el.getBoundingClientRect()
455
- const current = adjustRef.current
456
- const base = {
457
- left: rect.left - current.x,
458
- right: rect.right - current.x,
459
- top: rect.top - current.y,
460
- bottom: rect.bottom - current.y,
461
- }
462
- let x = 0
463
- let y = 0
464
- if (base.right > window.innerWidth - 8) x = window.innerWidth - 8 - base.right
465
- if (base.left + x < 8) x = 8 - base.left
466
- if (base.bottom > window.innerHeight - 8) y = window.innerHeight - 8 - base.bottom
467
- if (base.top + y < 8) y = 8 - base.top
468
- if (x !== current.x || y !== current.y) {
469
- adjustRef.current = { x, y }
470
- setAdjust({ x, y })
471
- }
472
- })
473
- }
474
- measure()
475
- const resizeObserver = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(measure)
476
- resizeObserver?.observe(el)
477
- window.addEventListener("resize", measure)
478
- window.addEventListener("scroll", measure, true)
479
- return () => {
480
- cancelAnimationFrame(raf)
481
- resizeObserver?.disconnect()
482
- window.removeEventListener("resize", measure)
483
- window.removeEventListener("scroll", measure, true)
484
- }
485
- }, [autoAdjust, portal])
486
-
487
- // Portal 模式:量锚点后在视口内定位。transform 祖先会改写 fixed 的包含块,
488
- // 所以要把那段偏移减回去。
489
- useLayoutEffect(() => {
490
- if (!portal) return
491
- const el = ref.current
492
- if (!el) return
493
- const measure = () => {
494
- const anchor = typeof portal === "object" && portal.current ? portal.current : el.parentElement
495
- if (!anchor) return
496
- const anchorRect = anchor.getBoundingClientRect()
497
- const dropRect = el.getBoundingClientRect()
498
-
499
- const offsetParent = findFixedOffsetAncestor(el)
500
- const offsetX = offsetParent ? offsetParent.getBoundingClientRect().left : 0
501
- const offsetY = offsetParent ? offsetParent.getBoundingClientRect().top : 0
502
-
503
- let top = anchorRect.bottom + 4 - offsetY
504
- let left = (align === "end" ? anchorRect.right - dropRect.width : anchorRect.left) - offsetX
505
-
506
- if (anchorRect.bottom + 4 + dropRect.height > window.innerHeight - 8) {
507
- top = anchorRect.top - dropRect.height - 4 - offsetY
508
- }
509
- if (top + offsetY < 8) top = 8 - offsetY
510
- if (left + offsetX + dropRect.width > window.innerWidth - 8) {
511
- left = window.innerWidth - dropRect.width - 8 - offsetX
512
- }
513
- if (left + offsetX < 8) left = 8 - offsetX
514
-
515
- // 捕获阶段的 scroll 每帧能来好几发;位置没变就别造新对象,否则整棵菜单
516
- // 跟着滚动重渲染。
517
- setPortalPos((current) => (current && current.top === top && current.left === left ? current : { top, left }))
518
- }
519
- // 等菜单渲染完再量,否则拿不到高度。
520
- const raf = requestAnimationFrame(measure)
521
- window.addEventListener("resize", measure)
522
- window.addEventListener("scroll", measure, true)
523
- return () => {
524
- cancelAnimationFrame(raf)
525
- window.removeEventListener("resize", measure)
526
- window.removeEventListener("scroll", measure, true)
527
- }
528
- }, [portal, align, items.length, contentKey])
529
-
530
- const menuContent = (
531
- <div
532
- ref={setSurfaceNode}
533
- data-slot="menu-surface"
534
- data-ow-part="surface"
535
- tabIndex={-1}
536
- role={semantics === "menu" ? "menu" : undefined}
537
- aria-label={semantics === "menu" ? ariaLabel : undefined}
538
- aria-activedescendant={semantics === "menu" && hoveredKey ? `${baseId}-${hoveredKey}` : undefined}
539
- onKeyDown={onKeyDown}
540
- className={cn(
541
- // 弹层立面:贴地之物才 0 影,离地之物给 pop 影,且永远保留 1px 边。
542
- "bg-[var(--ow-popover-bg)] border border-[color:var(--ow-border)] shadow-[var(--ow-shadow-pop)] p-1.5 box-border outline-none",
543
- "[border-radius:var(--ow-radius-menu)]",
544
- className,
545
- )}
546
- style={{
547
- width,
548
- ...(portal
549
- ? {
550
- position: "fixed",
551
- zIndex: "var(--ow-z-dropdown)",
552
- top: portalPos?.top ?? -9999,
553
- left: portalPos?.left ?? -9999,
554
- visibility: portalPos ? "visible" : "hidden",
555
- }
556
- : { transform: adjust.x || adjust.y ? `translate(${adjust.x}px, ${adjust.y}px)` : undefined }),
557
- }}
558
- >
559
- {header &&
560
- (headerBare ? (
561
- // 头像块这类非眉标内容:原样渲染,且 role="none" —— role="menu" 的子代只认
562
- // menuitem/group/separator,不标 none 的话读屏会整块跳过。
563
- <div data-ow-part="header" data-ow-variant="bare" role="none">
564
- {header}
565
- </div>
566
- ) : (
567
- <div
568
- data-ow-part="header"
569
- // R2:header 与 group 同是眉标角色,字号/字重/tracking 全同,色也归一到 --ow-eyebrow
570
- // (原 header 走 --ow-text-3,同角色两值)。
571
- className="font-medium text-ow-fs-eyebrow leading-none text-[color:var(--ow-eyebrow)] px-2 pt-2 pb-1.5 uppercase tracking-[var(--ow-ls-eyebrow)]"
572
- >
573
- {header}
574
- </div>
575
- ))}
576
- {banner && (
577
- <div data-ow-part="banner" role="none">
578
- {banner}
579
- </div>
580
- )}
581
- {searchable && (
582
- <Field
583
- value={query}
584
- onChange={setSearch}
585
- placeholder={searchPlaceholder}
586
- aria-label={searchPlaceholder}
587
- // §5:搜索框坐在弹层面上,走 Field 的弹层档(底/边各升一档),
588
- // 否则暗档 surface-2 与 popover-bg 同色,井整个消失。
589
- tier="pop"
590
- className="mb-1.5"
591
- />
592
- )}
593
- <div data-ow-part="list" className="min-h-0">
594
- {children ??
595
- (visibleItems.length === 0 ? (
596
- // §6 / G5:弹层无结果走 EmptyState 原语的 `variant="text"` 档——原型里弹层
597
- // 空态**不带母题**(@ 菜单 template.dc.html L923、命令面板 L3018 都只有一行
598
- // --ow-fs-ui text-2 灰字,左对齐)。这不是「退回手写灰字」:度量、字阶、颜色
599
- // 仍由原语给,只是这一档本来就没有图形位——菜单只有一两行高,塞一枚 28px 母题
600
- // 会把弹层撑成两倍,还让「没搜到」看着像一屏正经空态。
601
- <div data-ow-part="empty">
602
- <EmptyState message={empty} variant="text" />
603
- </div>
604
- ) : (
605
- visibleItems.map((entry, index) => {
606
- if (isSeparator(entry))
607
- return (
608
- <div
609
- key={entry.key ?? `separator-${index}`}
610
- data-ow-part="separator"
611
- role={semantics === "menu" ? "separator" : undefined}
612
- className="h-px bg-[var(--ow-border)] mx-1.5 my-1.5"
613
- />
614
- )
615
- if (isGroup(entry))
616
- return (
617
- <div
618
- key={entry.key ?? `group-${index}`}
619
- data-ow-part="group"
620
- className="font-medium text-ow-fs-eyebrow leading-none text-[color:var(--ow-eyebrow)] px-2 pt-2 pb-1.5 uppercase tracking-[var(--ow-ls-eyebrow)]"
621
- >
622
- {entry.label}
623
- </div>
624
- )
625
- const item = entry
626
- const active = activeKey === item.key
627
- const isHovered = hoveredKey === item.key && !item.disabled
628
- const keys = item.shortcut ? shortcutKeys(item.shortcut) : null
629
- // 行的公共属性:两种壳(button / 控件行的 div)逐字同构,只差标签与可聚焦方式。
630
- const rowProps = {
631
- id: `${baseId}-${item.key}`,
632
- "data-ow-part": "item",
633
- "data-ow-role": item.danger ? "danger" : item.selected || active ? "selected" : "default",
634
- "data-ow-state": isHovered ? "highlighted" : undefined,
635
- role:
636
- semantics === "menu" ? (item.selected === undefined ? "menuitem" : "menuitemcheckbox") : undefined,
637
- "aria-checked": semantics === "menu" && item.selected !== undefined ? item.selected : undefined,
638
- className: menuItemVariants({
639
- danger: item.danger,
640
- selected: item.selected || active,
641
- hovered: isHovered,
642
- disabled: item.disabled,
643
- hasDescription: !!item.description,
644
- }),
645
- onMouseEnter: () => {
646
- setHoveredKey(item.key)
647
- if (!item.disabled) onItemHover?.(item.key)
648
- },
649
- onMouseLeave: () => setHoveredKey(null),
650
- onFocus: () => setHoveredKey(item.key),
651
- onClick: () => {
652
- if (!item.disabled) onSelect?.(item.key)
653
- },
654
- }
655
- const rowContent = (
656
- <>
657
- {item.icon && (
658
- <span
659
- data-ow-part="item-icon"
660
- className="w-4 h-4 shrink-0 inline-flex items-center justify-center text-[color:var(--ow-text-3)]"
661
- >
662
- {item.icon}
663
- </span>
664
- )}
665
- <span className="flex-1 flex flex-col gap-0.5 min-w-0">
666
- <span className="flex-1">{item.label}</span>
667
- {item.description && (
668
- <span className="text-ow-fs-eyebrow font-normal leading-snug text-[color:var(--ow-text-3)]">
669
- {item.description}
670
- </span>
671
- )}
672
- </span>
673
- {keys && keys.length > 0 ? (
674
- <KeycapCombo data-ow-part="shortcut" className="shrink-0" keys={keys} />
675
- ) : (
676
- item.hint && (
677
- <span
678
- data-ow-part="hint"
679
- className={cn(
680
- "text-ow-fs-eyebrow leading-snug font-normal text-[color:var(--ow-text-3)]",
681
- // §7 读数:版本号、计数这类数字走 mono + tabular-nums,别的 hint 不动。
682
- item.hintMono && "font-[family-name:var(--ow-font-mono)] tabular-nums",
683
- )}
684
- >
685
- {item.hint}
686
- </span>
687
- )
688
- )}
689
- {item.control && (
690
- <span
691
- data-ow-part="item-control"
692
- className="shrink-0 inline-flex items-center"
693
- // 控件自理点击,别让它顺带触发整行的 onSelect(否则开关会被切两次)。
694
- // 键盘事件照旧冒泡到面上:Esc 关面、Tab 游走都要靠它。
695
- onClick={(event) => event.stopPropagation()}
696
- >
697
- {item.control}
698
- </span>
699
- )}
700
- {item.selected && (
701
- <Check
702
- data-ow-part="check"
703
- aria-hidden="true"
704
- className="w-4 h-4 shrink-0 text-[color:var(--ow-text)]"
705
- />
706
- )}
707
- </>
708
- )
709
- // 行尾有交互控件时行不能是 <button>(button 套 button 非法):改 div 外壳,
710
- // 行自身 tabIndex=-1 靠方向键/Tab 程序化聚焦,控件是面内的下一个 Tab 停靠点。
711
- if (item.control) {
712
- return (
713
- <div
714
- key={item.key}
715
- {...rowProps}
716
- ref={(node: HTMLDivElement | null) => {
717
- if (node) itemRefs.current.set(item.key, node)
718
- else itemRefs.current.delete(item.key)
719
- }}
720
- tabIndex={-1}
721
- aria-disabled={item.disabled || undefined}
722
- >
723
- {rowContent}
724
- </div>
725
- )
726
- }
727
- return (
728
- <Button
729
- key={item.key}
730
- {...rowProps}
731
- ref={(node: HTMLButtonElement | null) => {
732
- if (node) itemRefs.current.set(item.key, node)
733
- else itemRefs.current.delete(item.key)
734
- }}
735
- variant="unstyled"
736
- disabled={item.disabled}
737
- >
738
- {rowContent}
739
- </Button>
740
- )
741
- })
742
- ))}
743
- </div>
744
- {footer && (
745
- <div data-ow-part="footer" className="border-t border-[color:var(--ow-border)] mt-1 pt-1">
746
- {footer}
747
- </div>
748
- )}
749
- </div>
750
- )
751
-
752
- if (portal && typeof document !== "undefined") {
753
- return createPortal(menuContent, document.body)
754
- }
755
- return menuContent
756
- }
757
-
758
- /* ------------------------------------------------------------------ *
759
- * Menu — 触发器 + 菜单面
760
- * ------------------------------------------------------------------ */
761
-
762
- export type MenuTriggerState = {
763
- open: boolean
764
- toggle: () => void
765
- close: () => void
766
- /** 摊到触发器上的无障碍属性与开合处理。 */
767
- triggerProps: {
768
- "aria-haspopup": "menu"
769
- "aria-expanded": boolean
770
- onClick: (event: React.MouseEvent) => void
771
- onKeyDown: (event: ReactKeyboardEvent) => void
772
- }
773
- }
774
-
775
- export type MenuProps = Omit<MenuSurfaceProps, "portal" | "autoFocus" | "onClose" | "surfaceRef"> & {
776
- /** 触发器:元素(自动注入 aria/onClick)或渲染函数(自己摊 triggerProps)。 */
777
- trigger: ReactElement | ((state: MenuTriggerState) => ReactNode)
778
- /** 受控开合。 */
779
- open?: boolean
780
- onOpenChange?: (open: boolean) => void
781
- /** 选中后是否自动收起(默认 true)。 */
782
- closeOnSelect?: boolean
783
- /** 触发器外层容器类名。 */
784
- triggerClassName?: string
785
- }
786
-
787
- /**
788
- * Menu — 下拉菜单(DS 2.0 patterns · 合并 Dropdown / RowOverflowMenu / DetailOverflowMenu)。
789
- *
790
- * 触发器 + `MenuSurface`:开合、外点关闭、Esc 关闭并把焦点还给触发器、打开即收焦点,
791
- * 面本身负责立面与键盘导航。菜单一律 portal 到 body 后 fixed 定位 —— 行菜单常住在带
792
- * overflow 的滚动容器里,absolute 弹层会被祖先裁掉,而裁剪不是抬 z-index 能解决的。
793
- *
794
- * R3 中性件:不带信标、不带荧黄;空态母题走 `EmptyState` 原语的 `size="sm"` 紧凑档。
795
- */
796
- export function Menu({
797
- trigger,
798
- open: openProp,
799
- onOpenChange,
800
- closeOnSelect = true,
801
- triggerClassName = "",
802
- onSelect,
803
- ...surfaceProps
804
- }: MenuProps) {
805
- const [internalOpen, setInternalOpen] = useState(false)
806
- const open = openProp ?? internalOpen
807
- const anchorRef = useRef<HTMLSpanElement>(null)
808
- const surfaceRef = useRef<HTMLDivElement>(null)
809
-
810
- const setOpen = useCallback(
811
- (next: boolean) => {
812
- if (openProp === undefined) setInternalOpen(next)
813
- onOpenChange?.(next)
814
- },
815
- [openProp, onOpenChange],
816
- )
817
-
818
- const focusTrigger = useCallback(() => {
819
- anchorRef.current?.querySelector<HTMLElement>("button, [href], [tabindex]:not([tabindex='-1'])")?.focus()
820
- }, [])
821
-
822
- const close = useCallback(() => setOpen(false), [setOpen])
823
- const closeAndRestore = useCallback(() => {
824
- setOpen(false)
825
- focusTrigger()
826
- }, [setOpen, focusTrigger])
827
- const toggle = useCallback(() => setOpen(!open), [open, setOpen])
828
-
829
- // 菜单已经 portal 到 body,不在触发器子树里,所以两棵子树都要放过 —— 只判断
830
- // 触发器会让「点菜单项」先关掉菜单,click 永远来不及触发。
831
- useEffect(() => {
832
- if (!open) return
833
- const onPointerDown = (event: PointerEvent) => {
834
- const target = event.target as Node | null
835
- if (!target) return
836
- if (anchorRef.current?.contains(target) || surfaceRef.current?.contains(target)) return
837
- setOpen(false)
838
- }
839
- document.addEventListener("pointerdown", onPointerDown, true)
840
- return () => document.removeEventListener("pointerdown", onPointerDown, true)
841
- }, [open, setOpen])
842
-
843
- // 记下「这次是键盘还是指针打开的」:键盘(Enter/Space 的 click detail=0,或方向键)
844
- // → 焦点进第一行;指针 → 焦点只落面本体,首行不画环(R3,见 MenuSurface.autoFocus)。
845
- const openedByKeyboard = useRef(false)
846
- const triggerProps: MenuTriggerState["triggerProps"] = {
847
- "aria-haspopup": "menu",
848
- "aria-expanded": open,
849
- onClick: (event) => {
850
- openedByKeyboard.current = event.detail === 0
851
- toggle()
852
- },
853
- onKeyDown: (event) => {
854
- if (event.key === "ArrowDown" || event.key === "ArrowUp") {
855
- event.preventDefault()
856
- openedByKeyboard.current = true
857
- setOpen(true)
858
- }
859
- },
860
- }
861
-
862
- return (
863
- <span data-slot="menu" className={cn("inline-flex", triggerClassName)} ref={anchorRef}>
864
- {typeof trigger === "function"
865
- ? trigger({ open, toggle, close, triggerProps })
866
- : isValidElement(trigger)
867
- ? cloneElement(trigger as ReactElement<Record<string, unknown>>, {
868
- ...triggerProps,
869
- // 触发器自带的 onClick/onKeyDown 不能被开合逻辑吞掉,两个都要跑。
870
- onClick: (event: React.MouseEvent) => {
871
- ;(trigger.props as { onClick?: (e: React.MouseEvent) => void }).onClick?.(event)
872
- if (!event.defaultPrevented) {
873
- openedByKeyboard.current = event.detail === 0
874
- toggle()
875
- }
876
- },
877
- onKeyDown: (event: ReactKeyboardEvent) => {
878
- ;(trigger.props as { onKeyDown?: (e: ReactKeyboardEvent) => void }).onKeyDown?.(event)
879
- triggerProps.onKeyDown(event)
880
- },
881
- })
882
- : trigger}
883
- {open && (
884
- <MenuSurface
885
- {...surfaceProps}
886
- surfaceRef={surfaceRef}
887
- portal={anchorRef}
888
- autoFocus={openedByKeyboard.current ? true : "surface"}
889
- onClose={closeAndRestore}
890
- onSelect={(key) => {
891
- if (closeOnSelect) setOpen(false)
892
- onSelect?.(key)
893
- }}
894
- />
895
- )}
896
- </span>
897
- )
898
- }
899
-
900
- /**
901
- * 向上找最近的带 transform/perspective/filter/will-change 的祖先 —— 它会给
902
- * fixed 元素造出新的包含块,让坐标不再相对视口。没有就返回 null。
903
- * (Select 的 portal 菜单量位也复用这个。)
904
- */
905
- export function findFixedOffsetAncestor(el: HTMLElement): HTMLElement | null {
906
- let parent = el.parentElement
907
- while (parent && parent !== document.body && parent !== document.documentElement) {
908
- const style = getComputedStyle(parent)
909
- const transform = style.transform || style.webkitTransform
910
- if (
911
- (transform && transform !== "none") ||
912
- (style.filter && style.filter !== "none") ||
913
- (style.perspective && style.perspective !== "none") ||
914
- style.willChange === "transform" ||
915
- style.willChange === "filter" ||
916
- style.willChange === "perspective"
917
- ) {
918
- return parent
919
- }
920
- parent = parent.parentElement
921
- }
922
- return null
923
- }