dsh-plugin-core 0.32.0 → 0.33.1

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 (634) hide show
  1. package/README.md +197 -64
  2. package/README.zh-CN.md +242 -0
  3. package/dist/adv/explorer/FileBrowser.d.ts +58 -0
  4. package/dist/adv/explorer/FileBrowser.d.ts.map +1 -0
  5. package/dist/adv/explorer/FileBrowser.js +632 -0
  6. package/dist/adv/explorer/FileBrowser.js.map +1 -0
  7. package/dist/adv/explorer/crumb-nav.d.ts +45 -0
  8. package/dist/adv/explorer/crumb-nav.d.ts.map +1 -0
  9. package/dist/adv/explorer/crumb-nav.js +78 -0
  10. package/dist/adv/explorer/crumb-nav.js.map +1 -0
  11. package/dist/adv/explorer/crumbs-menu.d.ts +37 -0
  12. package/dist/adv/explorer/crumbs-menu.d.ts.map +1 -0
  13. package/dist/adv/explorer/crumbs-menu.js +102 -0
  14. package/dist/adv/explorer/crumbs-menu.js.map +1 -0
  15. package/dist/adv/explorer/explorer-css.d.ts +2 -0
  16. package/dist/adv/explorer/explorer-css.d.ts.map +1 -0
  17. package/dist/adv/explorer/explorer-css.generated.d.ts +2 -0
  18. package/dist/adv/explorer/explorer-css.generated.d.ts.map +1 -0
  19. package/dist/adv/explorer/explorer-css.generated.js +4 -0
  20. package/dist/adv/explorer/explorer-css.generated.js.map +1 -0
  21. package/dist/adv/explorer/explorer-css.js +3 -0
  22. package/dist/adv/explorer/explorer-css.js.map +1 -0
  23. package/dist/adv/explorer/fs-face.d.ts +36 -0
  24. package/dist/adv/explorer/fs-face.d.ts.map +1 -0
  25. package/dist/adv/explorer/fs-face.js +74 -0
  26. package/dist/adv/explorer/fs-face.js.map +1 -0
  27. package/dist/adv/explorer/index.d.ts +6 -0
  28. package/dist/adv/explorer/index.d.ts.map +1 -0
  29. package/dist/adv/explorer/index.js +6 -0
  30. package/dist/adv/explorer/index.js.map +1 -0
  31. package/dist/adv/explorer/landing.d.ts +26 -0
  32. package/dist/adv/explorer/landing.d.ts.map +1 -0
  33. package/dist/adv/explorer/landing.js +43 -0
  34. package/dist/adv/explorer/landing.js.map +1 -0
  35. package/dist/adv/explorer/open.d.ts +137 -0
  36. package/dist/adv/explorer/open.d.ts.map +1 -0
  37. package/dist/adv/explorer/open.js +350 -0
  38. package/dist/adv/explorer/open.js.map +1 -0
  39. package/dist/adv/explorer/picker-placement.d.ts +69 -0
  40. package/dist/adv/explorer/picker-placement.d.ts.map +1 -0
  41. package/dist/adv/explorer/picker-placement.js +122 -0
  42. package/dist/adv/explorer/picker-placement.js.map +1 -0
  43. package/dist/adv/explorer/preview/BytesPreview.d.ts +12 -0
  44. package/dist/adv/explorer/preview/BytesPreview.d.ts.map +1 -0
  45. package/dist/adv/explorer/preview/BytesPreview.js +60 -0
  46. package/dist/adv/explorer/preview/BytesPreview.js.map +1 -0
  47. package/dist/adv/explorer/preview/HtmlPreview.d.ts +17 -0
  48. package/dist/adv/explorer/preview/HtmlPreview.d.ts.map +1 -0
  49. package/dist/adv/explorer/preview/HtmlPreview.js +113 -0
  50. package/dist/adv/explorer/preview/HtmlPreview.js.map +1 -0
  51. package/dist/adv/explorer/preview/OfficePreview.d.ts +12 -0
  52. package/dist/adv/explorer/preview/OfficePreview.d.ts.map +1 -0
  53. package/dist/adv/explorer/preview/OfficePreview.js +63 -0
  54. package/dist/adv/explorer/preview/OfficePreview.js.map +1 -0
  55. package/dist/adv/explorer/preview/TextPreview.d.ts +18 -0
  56. package/dist/adv/explorer/preview/TextPreview.d.ts.map +1 -0
  57. package/dist/adv/explorer/preview/TextPreview.js +122 -0
  58. package/dist/adv/explorer/preview/TextPreview.js.map +1 -0
  59. package/dist/adv/explorer/preview/index.d.ts +24 -0
  60. package/dist/adv/explorer/preview/index.d.ts.map +1 -0
  61. package/dist/adv/explorer/preview/index.js +58 -0
  62. package/dist/adv/explorer/preview/index.js.map +1 -0
  63. package/dist/adv/explorer/preview/md-labels.d.ts +3 -0
  64. package/dist/adv/explorer/preview/md-labels.d.ts.map +1 -0
  65. package/dist/adv/explorer/preview/md-labels.js +12 -0
  66. package/dist/adv/explorer/preview/md-labels.js.map +1 -0
  67. package/dist/adv/explorer/preview-title-bar.d.ts +26 -0
  68. package/dist/adv/explorer/preview-title-bar.d.ts.map +1 -0
  69. package/dist/adv/explorer/preview-title-bar.js +48 -0
  70. package/dist/adv/explorer/preview-title-bar.js.map +1 -0
  71. package/dist/adv/explorer/types.d.ts +259 -0
  72. package/dist/adv/explorer/types.d.ts.map +1 -0
  73. package/dist/adv/explorer/types.js +379 -0
  74. package/dist/adv/explorer/types.js.map +1 -0
  75. package/dist/adv/session/SessionViewModal.d.ts +37 -0
  76. package/dist/adv/session/SessionViewModal.d.ts.map +1 -0
  77. package/dist/adv/session/SessionViewModal.js +1133 -0
  78. package/dist/adv/session/SessionViewModal.js.map +1 -0
  79. package/dist/adv/session/changes.d.ts +73 -0
  80. package/dist/adv/session/changes.d.ts.map +1 -0
  81. package/dist/adv/session/changes.js +134 -0
  82. package/dist/adv/session/changes.js.map +1 -0
  83. package/dist/adv/session/faces.d.ts +244 -0
  84. package/dist/adv/session/faces.d.ts.map +1 -0
  85. package/dist/adv/session/faces.js +17 -0
  86. package/dist/adv/session/faces.js.map +1 -0
  87. package/dist/adv/session/index.d.ts +7 -0
  88. package/dist/adv/session/index.d.ts.map +1 -0
  89. package/dist/adv/session/index.js +27 -0
  90. package/dist/adv/session/index.js.map +1 -0
  91. package/dist/adv/session/mirror/AskCard.d.ts +35 -0
  92. package/dist/adv/session/mirror/AskCard.d.ts.map +1 -0
  93. package/dist/adv/session/mirror/AskCard.js +131 -0
  94. package/dist/adv/session/mirror/AskCard.js.map +1 -0
  95. package/dist/adv/session/mirror/BashRow.d.ts +14 -0
  96. package/dist/adv/session/mirror/BashRow.d.ts.map +1 -0
  97. package/dist/adv/session/mirror/BashRow.js +143 -0
  98. package/dist/adv/session/mirror/BashRow.js.map +1 -0
  99. package/dist/adv/session/mirror/ChangedFileDiff.d.ts +25 -0
  100. package/dist/adv/session/mirror/ChangedFileDiff.d.ts.map +1 -0
  101. package/dist/adv/session/mirror/ChangedFileDiff.js +178 -0
  102. package/dist/adv/session/mirror/ChangedFileDiff.js.map +1 -0
  103. package/dist/adv/session/mirror/ChangedFilesCard.d.ts +18 -0
  104. package/dist/adv/session/mirror/ChangedFilesCard.d.ts.map +1 -0
  105. package/dist/adv/session/mirror/ChangedFilesCard.js +165 -0
  106. package/dist/adv/session/mirror/ChangedFilesCard.js.map +1 -0
  107. package/dist/adv/session/mirror/ChatGroupSeat.d.ts +24 -0
  108. package/dist/adv/session/mirror/ChatGroupSeat.d.ts.map +1 -0
  109. package/dist/adv/session/mirror/ChatGroupSeat.js +135 -0
  110. package/dist/adv/session/mirror/ChatGroupSeat.js.map +1 -0
  111. package/dist/adv/session/mirror/ChatNodeSeat.d.ts +43 -0
  112. package/dist/adv/session/mirror/ChatNodeSeat.d.ts.map +1 -0
  113. package/dist/adv/session/mirror/ChatNodeSeat.js +133 -0
  114. package/dist/adv/session/mirror/ChatNodeSeat.js.map +1 -0
  115. package/dist/adv/session/mirror/ChatView.d.ts +47 -0
  116. package/dist/adv/session/mirror/ChatView.d.ts.map +1 -0
  117. package/dist/adv/session/mirror/ChatView.js +138 -0
  118. package/dist/adv/session/mirror/ChatView.js.map +1 -0
  119. package/dist/adv/session/mirror/CommandCard.d.ts +20 -0
  120. package/dist/adv/session/mirror/CommandCard.d.ts.map +1 -0
  121. package/dist/adv/session/mirror/CommandCard.js +69 -0
  122. package/dist/adv/session/mirror/CommandCard.js.map +1 -0
  123. package/dist/adv/session/mirror/ContextInjectionRow.d.ts +18 -0
  124. package/dist/adv/session/mirror/ContextInjectionRow.d.ts.map +1 -0
  125. package/dist/adv/session/mirror/ContextInjectionRow.js +50 -0
  126. package/dist/adv/session/mirror/ContextInjectionRow.js.map +1 -0
  127. package/dist/adv/session/mirror/Deliverables.d.ts +24 -0
  128. package/dist/adv/session/mirror/Deliverables.d.ts.map +1 -0
  129. package/dist/adv/session/mirror/Deliverables.js +175 -0
  130. package/dist/adv/session/mirror/Deliverables.js.map +1 -0
  131. package/dist/adv/session/mirror/GenericCommandCard.d.ts +136 -0
  132. package/dist/adv/session/mirror/GenericCommandCard.d.ts.map +1 -0
  133. package/dist/adv/session/mirror/GenericCommandCard.js +948 -0
  134. package/dist/adv/session/mirror/GenericCommandCard.js.map +1 -0
  135. package/dist/adv/session/mirror/MessageIconActions.d.ts +16 -0
  136. package/dist/adv/session/mirror/MessageIconActions.d.ts.map +1 -0
  137. package/dist/adv/session/mirror/MessageIconActions.js +69 -0
  138. package/dist/adv/session/mirror/MessageIconActions.js.map +1 -0
  139. package/dist/adv/session/mirror/MessageItem.d.ts +93 -0
  140. package/dist/adv/session/mirror/MessageItem.d.ts.map +1 -0
  141. package/dist/adv/session/mirror/MessageItem.js +194 -0
  142. package/dist/adv/session/mirror/MessageItem.js.map +1 -0
  143. package/dist/adv/session/mirror/ReasoningRow.d.ts +11 -0
  144. package/dist/adv/session/mirror/ReasoningRow.d.ts.map +1 -0
  145. package/dist/adv/session/mirror/ReasoningRow.js +111 -0
  146. package/dist/adv/session/mirror/ReasoningRow.js.map +1 -0
  147. package/dist/adv/session/mirror/RunningStatus.d.ts +12 -0
  148. package/dist/adv/session/mirror/RunningStatus.d.ts.map +1 -0
  149. package/dist/adv/session/mirror/RunningStatus.js +57 -0
  150. package/dist/adv/session/mirror/RunningStatus.js.map +1 -0
  151. package/dist/adv/session/mirror/StatDialog.d.ts +20 -0
  152. package/dist/adv/session/mirror/StatDialog.d.ts.map +1 -0
  153. package/dist/adv/session/mirror/StatDialog.js +49 -0
  154. package/dist/adv/session/mirror/StatDialog.js.map +1 -0
  155. package/dist/adv/session/mirror/ToolDetails.d.ts +65 -0
  156. package/dist/adv/session/mirror/ToolDetails.d.ts.map +1 -0
  157. package/dist/adv/session/mirror/ToolDetails.js +268 -0
  158. package/dist/adv/session/mirror/ToolDetails.js.map +1 -0
  159. package/dist/adv/session/mirror/TurnProcessNodeView.d.ts +10 -0
  160. package/dist/adv/session/mirror/TurnProcessNodeView.d.ts.map +1 -0
  161. package/dist/adv/session/mirror/TurnProcessNodeView.js +57 -0
  162. package/dist/adv/session/mirror/TurnProcessNodeView.js.map +1 -0
  163. package/dist/adv/session/mirror/TurnTailNodeView.d.ts +57 -0
  164. package/dist/adv/session/mirror/TurnTailNodeView.d.ts.map +1 -0
  165. package/dist/adv/session/mirror/TurnTailNodeView.js +106 -0
  166. package/dist/adv/session/mirror/TurnTailNodeView.js.map +1 -0
  167. package/dist/adv/session/mirror/TurnTriggerNodeView.d.ts +16 -0
  168. package/dist/adv/session/mirror/TurnTriggerNodeView.d.ts.map +1 -0
  169. package/dist/adv/session/mirror/TurnTriggerNodeView.js +103 -0
  170. package/dist/adv/session/mirror/TurnTriggerNodeView.js.map +1 -0
  171. package/dist/adv/session/mirror/TurnUsagePanel.d.ts +21 -0
  172. package/dist/adv/session/mirror/TurnUsagePanel.d.ts.map +1 -0
  173. package/dist/adv/session/mirror/TurnUsagePanel.js +41 -0
  174. package/dist/adv/session/mirror/TurnUsagePanel.js.map +1 -0
  175. package/dist/adv/session/mirror/control-details.d.ts +9 -0
  176. package/dist/adv/session/mirror/control-details.d.ts.map +1 -0
  177. package/dist/adv/session/mirror/control-details.js +549 -0
  178. package/dist/adv/session/mirror/control-details.js.map +1 -0
  179. package/dist/adv/session/mirror/detail-i18n.d.ts +4 -0
  180. package/dist/adv/session/mirror/detail-i18n.d.ts.map +1 -0
  181. package/dist/adv/session/mirror/detail-i18n.js +153 -0
  182. package/dist/adv/session/mirror/detail-i18n.js.map +1 -0
  183. package/dist/adv/session/mirror/message-chrome.d.ts +39 -0
  184. package/dist/adv/session/mirror/message-chrome.d.ts.map +1 -0
  185. package/dist/adv/session/mirror/message-chrome.js +153 -0
  186. package/dist/adv/session/mirror/message-chrome.js.map +1 -0
  187. package/dist/adv/session/mirror/process-groups.d.ts +56 -0
  188. package/dist/adv/session/mirror/process-groups.d.ts.map +1 -0
  189. package/dist/adv/session/mirror/process-groups.js +204 -0
  190. package/dist/adv/session/mirror/process-groups.js.map +1 -0
  191. package/dist/adv/session/official-classes.d.ts +28 -0
  192. package/dist/adv/session/official-classes.d.ts.map +1 -0
  193. package/dist/adv/session/official-classes.js +152 -0
  194. package/dist/adv/session/official-classes.js.map +1 -0
  195. package/dist/adv/session/open-review.d.ts +13 -0
  196. package/dist/adv/session/open-review.d.ts.map +1 -0
  197. package/dist/adv/session/open-review.js +32 -0
  198. package/dist/adv/session/open-review.js.map +1 -0
  199. package/dist/adv/session/open-session-view.d.ts +19 -0
  200. package/dist/adv/session/open-session-view.d.ts.map +1 -0
  201. package/dist/adv/session/open-session-view.js +147 -0
  202. package/dist/adv/session/open-session-view.js.map +1 -0
  203. package/dist/adv/session/pending-inputs.d.ts +33 -0
  204. package/dist/adv/session/pending-inputs.d.ts.map +1 -0
  205. package/dist/adv/session/pending-inputs.js +130 -0
  206. package/dist/adv/session/pending-inputs.js.map +1 -0
  207. package/dist/adv/session/session-css.d.ts +2 -0
  208. package/dist/adv/session/session-css.d.ts.map +1 -0
  209. package/dist/adv/session/session-css.generated.d.ts +2 -0
  210. package/dist/adv/session/session-css.generated.d.ts.map +1 -0
  211. package/dist/adv/session/session-css.generated.js +4 -0
  212. package/dist/adv/session/session-css.generated.js.map +1 -0
  213. package/dist/adv/session/session-css.js +3 -0
  214. package/dist/adv/session/session-css.js.map +1 -0
  215. package/dist/adv/session/tail-follow.d.ts +29 -0
  216. package/dist/adv/session/tail-follow.d.ts.map +1 -0
  217. package/dist/adv/session/tail-follow.js +106 -0
  218. package/dist/adv/session/tail-follow.js.map +1 -0
  219. package/dist/ui/actions/Button.d.ts +102 -0
  220. package/dist/ui/actions/Button.d.ts.map +1 -0
  221. package/dist/ui/actions/Button.js +233 -0
  222. package/dist/ui/actions/Button.js.map +1 -0
  223. package/dist/ui/actions/button-css.generated.d.ts +2 -0
  224. package/dist/ui/actions/button-css.generated.d.ts.map +1 -0
  225. package/dist/ui/actions/button-css.generated.js +4 -0
  226. package/dist/ui/actions/button-css.generated.js.map +1 -0
  227. package/dist/ui/display/Card.d.ts +65 -0
  228. package/dist/ui/display/Card.d.ts.map +1 -0
  229. package/dist/ui/display/Card.js +109 -0
  230. package/dist/ui/display/Card.js.map +1 -0
  231. package/dist/ui/display/Chip.d.ts +28 -0
  232. package/dist/ui/display/Chip.d.ts.map +1 -0
  233. package/dist/ui/display/Chip.js +36 -0
  234. package/dist/ui/display/Chip.js.map +1 -0
  235. package/dist/ui/display/CodeViewer.d.ts +38 -0
  236. package/dist/ui/display/CodeViewer.d.ts.map +1 -0
  237. package/dist/ui/display/CodeViewer.js +107 -0
  238. package/dist/ui/display/CodeViewer.js.map +1 -0
  239. package/dist/ui/display/FieldHint.d.ts +18 -0
  240. package/dist/ui/display/FieldHint.d.ts.map +1 -0
  241. package/dist/ui/display/FieldHint.js +40 -0
  242. package/dist/ui/display/FieldHint.js.map +1 -0
  243. package/dist/ui/display/FlipText.d.ts +43 -0
  244. package/dist/ui/display/FlipText.d.ts.map +1 -0
  245. package/dist/ui/display/FlipText.js +59 -0
  246. package/dist/ui/display/FlipText.js.map +1 -0
  247. package/dist/ui/display/LiveText.d.ts +13 -0
  248. package/dist/ui/display/LiveText.d.ts.map +1 -0
  249. package/dist/ui/display/LiveText.js +19 -0
  250. package/dist/ui/display/LiveText.js.map +1 -0
  251. package/dist/ui/display/MarqueeText.d.ts +22 -0
  252. package/dist/ui/display/MarqueeText.d.ts.map +1 -0
  253. package/dist/ui/display/MarqueeText.js +52 -0
  254. package/dist/ui/display/MarqueeText.js.map +1 -0
  255. package/dist/ui/display/SectionHead.d.ts +35 -0
  256. package/dist/ui/display/SectionHead.d.ts.map +1 -0
  257. package/dist/ui/display/SectionHead.js +45 -0
  258. package/dist/ui/display/SectionHead.js.map +1 -0
  259. package/dist/ui/display/Surface.d.ts +43 -0
  260. package/dist/ui/display/Surface.d.ts.map +1 -0
  261. package/dist/ui/display/Surface.js +39 -0
  262. package/dist/ui/display/Surface.js.map +1 -0
  263. package/dist/ui/display/Table.d.ts +30 -0
  264. package/dist/ui/display/Table.d.ts.map +1 -0
  265. package/dist/ui/display/Table.js +96 -0
  266. package/dist/ui/display/Table.js.map +1 -0
  267. package/dist/ui/display/card-css.d.ts +2 -0
  268. package/dist/ui/display/card-css.d.ts.map +1 -0
  269. package/dist/ui/display/card-css.generated.d.ts +2 -0
  270. package/dist/ui/display/card-css.generated.d.ts.map +1 -0
  271. package/dist/ui/display/card-css.generated.js +4 -0
  272. package/dist/ui/display/card-css.generated.js.map +1 -0
  273. package/dist/ui/display/card-css.js +5 -0
  274. package/dist/ui/display/card-css.js.map +1 -0
  275. package/dist/ui/display/chip-css.d.ts +2 -0
  276. package/dist/ui/display/chip-css.d.ts.map +1 -0
  277. package/dist/ui/display/chip-css.generated.d.ts +2 -0
  278. package/dist/ui/display/chip-css.generated.d.ts.map +1 -0
  279. package/dist/ui/display/chip-css.generated.js +4 -0
  280. package/dist/ui/display/chip-css.generated.js.map +1 -0
  281. package/dist/ui/display/chip-css.js +12 -0
  282. package/dist/ui/display/chip-css.js.map +1 -0
  283. package/dist/ui/display/code-viewer-css.d.ts +2 -0
  284. package/dist/ui/display/code-viewer-css.d.ts.map +1 -0
  285. package/dist/ui/display/code-viewer-css.generated.d.ts +2 -0
  286. package/dist/ui/display/code-viewer-css.generated.d.ts.map +1 -0
  287. package/dist/ui/display/code-viewer-css.generated.js +4 -0
  288. package/dist/ui/display/code-viewer-css.generated.js.map +1 -0
  289. package/dist/ui/display/code-viewer-css.js +3 -0
  290. package/dist/ui/display/code-viewer-css.js.map +1 -0
  291. package/dist/ui/display/code-viewer-lang.d.ts +15 -0
  292. package/dist/ui/display/code-viewer-lang.d.ts.map +1 -0
  293. package/dist/ui/display/code-viewer-lang.js +190 -0
  294. package/dist/ui/display/code-viewer-lang.js.map +1 -0
  295. package/dist/ui/display/code-viewer-theme.d.ts +5 -0
  296. package/dist/ui/display/code-viewer-theme.d.ts.map +1 -0
  297. package/dist/ui/display/code-viewer-theme.js +138 -0
  298. package/dist/ui/display/code-viewer-theme.js.map +1 -0
  299. package/dist/ui/display/flip-css.d.ts +2 -0
  300. package/dist/ui/display/flip-css.d.ts.map +1 -0
  301. package/dist/ui/display/flip-css.generated.d.ts +2 -0
  302. package/dist/ui/display/flip-css.generated.d.ts.map +1 -0
  303. package/dist/ui/display/flip-css.generated.js +4 -0
  304. package/dist/ui/display/flip-css.generated.js.map +1 -0
  305. package/dist/ui/display/flip-css.js +4 -0
  306. package/dist/ui/display/flip-css.js.map +1 -0
  307. package/dist/ui/display/hint-css.generated.d.ts +2 -0
  308. package/dist/ui/display/hint-css.generated.d.ts.map +1 -0
  309. package/dist/ui/display/hint-css.generated.js +4 -0
  310. package/dist/ui/display/hint-css.generated.js.map +1 -0
  311. package/dist/ui/display/marquee-css.d.ts +2 -0
  312. package/dist/ui/display/marquee-css.d.ts.map +1 -0
  313. package/dist/ui/display/marquee-css.generated.d.ts +2 -0
  314. package/dist/ui/display/marquee-css.generated.d.ts.map +1 -0
  315. package/dist/ui/display/marquee-css.generated.js +4 -0
  316. package/dist/ui/display/marquee-css.generated.js.map +1 -0
  317. package/dist/ui/display/marquee-css.js +4 -0
  318. package/dist/ui/display/marquee-css.js.map +1 -0
  319. package/dist/ui/display/section-head-css.generated.d.ts +2 -0
  320. package/dist/ui/display/section-head-css.generated.d.ts.map +1 -0
  321. package/dist/ui/display/section-head-css.generated.js +4 -0
  322. package/dist/ui/display/section-head-css.generated.js.map +1 -0
  323. package/dist/ui/display/surface-css.d.ts +2 -0
  324. package/dist/ui/display/surface-css.d.ts.map +1 -0
  325. package/dist/ui/display/surface-css.generated.d.ts +2 -0
  326. package/dist/ui/display/surface-css.generated.d.ts.map +1 -0
  327. package/dist/ui/display/surface-css.generated.js +4 -0
  328. package/dist/ui/display/surface-css.generated.js.map +1 -0
  329. package/dist/ui/display/surface-css.js +7 -0
  330. package/dist/ui/display/surface-css.js.map +1 -0
  331. package/dist/ui/display/table-css.generated.d.ts +2 -0
  332. package/dist/ui/display/table-css.generated.d.ts.map +1 -0
  333. package/dist/ui/display/table-css.generated.js +4 -0
  334. package/dist/ui/display/table-css.generated.js.map +1 -0
  335. package/dist/ui/display/table-logic.d.ts +110 -0
  336. package/dist/ui/display/table-logic.d.ts.map +1 -0
  337. package/dist/ui/display/table-logic.js +81 -0
  338. package/dist/ui/display/table-logic.js.map +1 -0
  339. package/dist/ui/display/table-plain-css.generated.d.ts +2 -0
  340. package/dist/ui/display/table-plain-css.generated.d.ts.map +1 -0
  341. package/dist/ui/display/table-plain-css.generated.js +4 -0
  342. package/dist/ui/display/table-plain-css.generated.js.map +1 -0
  343. package/dist/ui/display/table-shared.d.ts +101 -0
  344. package/dist/ui/display/table-shared.d.ts.map +1 -0
  345. package/dist/ui/display/table-shared.js +229 -0
  346. package/dist/ui/display/table-shared.js.map +1 -0
  347. package/dist/ui/feedback/AlertModal.d.ts +41 -0
  348. package/dist/ui/feedback/AlertModal.d.ts.map +1 -0
  349. package/dist/ui/feedback/AlertModal.js +45 -0
  350. package/dist/ui/feedback/AlertModal.js.map +1 -0
  351. package/dist/ui/feedback/ConfirmModal.d.ts +50 -0
  352. package/dist/ui/feedback/ConfirmModal.d.ts.map +1 -0
  353. package/dist/ui/feedback/ConfirmModal.js +47 -0
  354. package/dist/ui/feedback/ConfirmModal.js.map +1 -0
  355. package/dist/ui/feedback/Loader.d.ts +49 -0
  356. package/dist/ui/feedback/Loader.d.ts.map +1 -0
  357. package/dist/ui/feedback/Loader.js +79 -0
  358. package/dist/ui/feedback/Loader.js.map +1 -0
  359. package/dist/ui/feedback/LoaderBar.d.ts +38 -0
  360. package/dist/ui/feedback/LoaderBar.d.ts.map +1 -0
  361. package/dist/ui/feedback/LoaderBar.js +79 -0
  362. package/dist/ui/feedback/LoaderBar.js.map +1 -0
  363. package/dist/ui/feedback/Loading.d.ts +69 -0
  364. package/dist/ui/feedback/Loading.d.ts.map +1 -0
  365. package/dist/ui/feedback/Loading.js +164 -0
  366. package/dist/ui/feedback/Loading.js.map +1 -0
  367. package/dist/ui/feedback/Modal.d.ts +73 -0
  368. package/dist/ui/feedback/Modal.d.ts.map +1 -0
  369. package/dist/ui/feedback/Modal.js +83 -0
  370. package/dist/ui/feedback/Modal.js.map +1 -0
  371. package/dist/ui/feedback/SideSheet.d.ts +70 -0
  372. package/dist/ui/feedback/SideSheet.d.ts.map +1 -0
  373. package/dist/ui/feedback/SideSheet.js +130 -0
  374. package/dist/ui/feedback/SideSheet.js.map +1 -0
  375. package/dist/ui/feedback/Toast.d.ts +45 -0
  376. package/dist/ui/feedback/Toast.d.ts.map +1 -0
  377. package/dist/ui/feedback/Toast.js +225 -0
  378. package/dist/ui/feedback/Toast.js.map +1 -0
  379. package/dist/ui/feedback/feedback-css.d.ts +2 -0
  380. package/dist/ui/feedback/feedback-css.d.ts.map +1 -0
  381. package/dist/ui/feedback/feedback-css.generated.d.ts +2 -0
  382. package/dist/ui/feedback/feedback-css.generated.d.ts.map +1 -0
  383. package/dist/ui/feedback/feedback-css.generated.js +4 -0
  384. package/dist/ui/feedback/feedback-css.generated.js.map +1 -0
  385. package/dist/ui/feedback/feedback-css.js +4 -0
  386. package/dist/ui/feedback/feedback-css.js.map +1 -0
  387. package/dist/ui/feedback/host-toast.d.ts +23 -0
  388. package/dist/ui/feedback/host-toast.d.ts.map +1 -0
  389. package/dist/ui/feedback/host-toast.js +34 -0
  390. package/dist/ui/feedback/host-toast.js.map +1 -0
  391. package/dist/ui/feedback/loader-bar-art.d.ts +6 -0
  392. package/dist/ui/feedback/loader-bar-art.d.ts.map +1 -0
  393. package/dist/ui/feedback/loader-bar-art.js +6 -0
  394. package/dist/ui/feedback/loader-bar-art.js.map +1 -0
  395. package/dist/ui/feedback/loader-bar-css.generated.d.ts +2 -0
  396. package/dist/ui/feedback/loader-bar-css.generated.d.ts.map +1 -0
  397. package/dist/ui/feedback/loader-bar-css.generated.js +4 -0
  398. package/dist/ui/feedback/loader-bar-css.generated.js.map +1 -0
  399. package/dist/ui/feedback/loader-css.generated.d.ts +2 -0
  400. package/dist/ui/feedback/loader-css.generated.d.ts.map +1 -0
  401. package/dist/ui/feedback/loader-css.generated.js +4 -0
  402. package/dist/ui/feedback/loader-css.generated.js.map +1 -0
  403. package/dist/ui/feedback/loading-css.generated.d.ts +2 -0
  404. package/dist/ui/feedback/loading-css.generated.d.ts.map +1 -0
  405. package/dist/ui/feedback/loading-css.generated.js +4 -0
  406. package/dist/ui/feedback/loading-css.generated.js.map +1 -0
  407. package/dist/ui/feedback/loading-host.d.ts +49 -0
  408. package/dist/ui/feedback/loading-host.d.ts.map +1 -0
  409. package/dist/ui/feedback/loading-host.js +57 -0
  410. package/dist/ui/feedback/loading-host.js.map +1 -0
  411. package/dist/ui/feedback/modal-host.d.ts +51 -0
  412. package/dist/ui/feedback/modal-host.d.ts.map +1 -0
  413. package/dist/ui/feedback/modal-host.js +170 -0
  414. package/dist/ui/feedback/modal-host.js.map +1 -0
  415. package/dist/ui/feedback/side-sheet-css.d.ts +2 -0
  416. package/dist/ui/feedback/side-sheet-css.d.ts.map +1 -0
  417. package/dist/ui/feedback/side-sheet-css.generated.d.ts +2 -0
  418. package/dist/ui/feedback/side-sheet-css.generated.d.ts.map +1 -0
  419. package/dist/ui/feedback/side-sheet-css.generated.js +4 -0
  420. package/dist/ui/feedback/side-sheet-css.generated.js.map +1 -0
  421. package/dist/ui/feedback/side-sheet-css.js +2 -0
  422. package/dist/ui/feedback/side-sheet-css.js.map +1 -0
  423. package/dist/ui/feedback/toast-host.d.ts +24 -0
  424. package/dist/ui/feedback/toast-host.d.ts.map +1 -0
  425. package/dist/ui/feedback/toast-host.js +20 -0
  426. package/dist/ui/feedback/toast-host.js.map +1 -0
  427. package/dist/ui/index.d.ts +44 -44
  428. package/dist/ui/index.d.ts.map +1 -1
  429. package/dist/ui/index.js +44 -44
  430. package/dist/ui/index.js.map +1 -1
  431. package/dist/ui/infra/chevron.d.ts +22 -0
  432. package/dist/ui/infra/chevron.d.ts.map +1 -0
  433. package/dist/ui/infra/chevron.js +33 -0
  434. package/dist/ui/infra/chevron.js.map +1 -0
  435. package/dist/ui/infra/controls-css.d.ts +16 -0
  436. package/dist/ui/infra/controls-css.d.ts.map +1 -0
  437. package/dist/ui/infra/controls-css.js +26 -0
  438. package/dist/ui/infra/controls-css.js.map +1 -0
  439. package/dist/ui/infra/css.d.ts +35 -0
  440. package/dist/ui/infra/css.d.ts.map +1 -0
  441. package/dist/ui/infra/css.js +52 -0
  442. package/dist/ui/infra/css.js.map +1 -0
  443. package/dist/ui/infra/host-data.d.ts +119 -0
  444. package/dist/ui/infra/host-data.d.ts.map +1 -0
  445. package/dist/ui/infra/host-data.js +122 -0
  446. package/dist/ui/infra/host-data.js.map +1 -0
  447. package/dist/ui/infra/locale.d.ts +4 -0
  448. package/dist/ui/infra/locale.d.ts.map +1 -0
  449. package/dist/ui/infra/locale.js +17 -0
  450. package/dist/ui/infra/locale.js.map +1 -0
  451. package/dist/ui/infra/overlay-css.d.ts +2 -0
  452. package/dist/ui/infra/overlay-css.d.ts.map +1 -0
  453. package/dist/ui/infra/overlay-css.generated.d.ts +2 -0
  454. package/dist/ui/infra/overlay-css.generated.d.ts.map +1 -0
  455. package/dist/ui/infra/overlay-css.generated.js +4 -0
  456. package/dist/ui/infra/overlay-css.generated.js.map +1 -0
  457. package/dist/ui/infra/overlay-css.js +2 -0
  458. package/dist/ui/infra/overlay-css.js.map +1 -0
  459. package/dist/ui/infra/overlay.d.ts +62 -0
  460. package/dist/ui/infra/overlay.d.ts.map +1 -0
  461. package/dist/ui/infra/overlay.js +94 -0
  462. package/dist/ui/infra/overlay.js.map +1 -0
  463. package/dist/ui/infra/panel-css.d.ts +2 -0
  464. package/dist/ui/infra/panel-css.d.ts.map +1 -0
  465. package/dist/ui/infra/panel-css.generated.d.ts +2 -0
  466. package/dist/ui/infra/panel-css.generated.d.ts.map +1 -0
  467. package/dist/ui/infra/panel-css.generated.js +4 -0
  468. package/dist/ui/infra/panel-css.generated.js.map +1 -0
  469. package/dist/ui/infra/panel-css.js +2 -0
  470. package/dist/ui/infra/panel-css.js.map +1 -0
  471. package/dist/ui/infra/panel.d.ts +41 -0
  472. package/dist/ui/infra/panel.d.ts.map +1 -0
  473. package/dist/ui/infra/panel.js +37 -0
  474. package/dist/ui/infra/panel.js.map +1 -0
  475. package/dist/ui/infra/side-panel-css.d.ts +2 -0
  476. package/dist/ui/infra/side-panel-css.d.ts.map +1 -0
  477. package/dist/ui/infra/side-panel-css.generated.d.ts +2 -0
  478. package/dist/ui/infra/side-panel-css.generated.d.ts.map +1 -0
  479. package/dist/ui/infra/side-panel-css.generated.js +4 -0
  480. package/dist/ui/infra/side-panel-css.generated.js.map +1 -0
  481. package/dist/ui/infra/side-panel-css.js +2 -0
  482. package/dist/ui/infra/side-panel-css.js.map +1 -0
  483. package/dist/ui/infra/thenable.d.ts +9 -0
  484. package/dist/ui/infra/thenable.d.ts.map +1 -0
  485. package/dist/ui/infra/thenable.js +15 -0
  486. package/dist/ui/infra/thenable.js.map +1 -0
  487. package/dist/ui/infra/ticker.d.ts +8 -0
  488. package/dist/ui/infra/ticker.d.ts.map +1 -0
  489. package/dist/ui/infra/ticker.js +49 -0
  490. package/dist/ui/infra/ticker.js.map +1 -0
  491. package/dist/ui/infra/tooltip.d.ts +29 -0
  492. package/dist/ui/infra/tooltip.d.ts.map +1 -0
  493. package/dist/ui/infra/tooltip.js +10 -0
  494. package/dist/ui/infra/tooltip.js.map +1 -0
  495. package/dist/ui/inputs/Checkbox.d.ts +24 -0
  496. package/dist/ui/inputs/Checkbox.d.ts.map +1 -0
  497. package/dist/ui/inputs/Checkbox.js +35 -0
  498. package/dist/ui/inputs/Checkbox.js.map +1 -0
  499. package/dist/ui/inputs/DateTimePicker.d.ts +45 -0
  500. package/dist/ui/inputs/DateTimePicker.d.ts.map +1 -0
  501. package/dist/ui/inputs/DateTimePicker.js +462 -0
  502. package/dist/ui/inputs/DateTimePicker.js.map +1 -0
  503. package/dist/ui/inputs/Field.d.ts +125 -0
  504. package/dist/ui/inputs/Field.d.ts.map +1 -0
  505. package/dist/ui/inputs/Field.js +175 -0
  506. package/dist/ui/inputs/Field.js.map +1 -0
  507. package/dist/ui/inputs/InputGroup.d.ts +91 -0
  508. package/dist/ui/inputs/InputGroup.d.ts.map +1 -0
  509. package/dist/ui/inputs/InputGroup.js +125 -0
  510. package/dist/ui/inputs/InputGroup.js.map +1 -0
  511. package/dist/ui/inputs/ModelPicker.d.ts +48 -0
  512. package/dist/ui/inputs/ModelPicker.d.ts.map +1 -0
  513. package/dist/ui/inputs/ModelPicker.js +101 -0
  514. package/dist/ui/inputs/ModelPicker.js.map +1 -0
  515. package/dist/ui/inputs/Picker.d.ts +56 -0
  516. package/dist/ui/inputs/Picker.d.ts.map +1 -0
  517. package/dist/ui/inputs/Picker.js +244 -0
  518. package/dist/ui/inputs/Picker.js.map +1 -0
  519. package/dist/ui/inputs/Segmented.d.ts +99 -0
  520. package/dist/ui/inputs/Segmented.d.ts.map +1 -0
  521. package/dist/ui/inputs/Segmented.js +135 -0
  522. package/dist/ui/inputs/Segmented.js.map +1 -0
  523. package/dist/ui/inputs/Textarea.d.ts +36 -0
  524. package/dist/ui/inputs/Textarea.d.ts.map +1 -0
  525. package/dist/ui/inputs/Textarea.js +35 -0
  526. package/dist/ui/inputs/Textarea.js.map +1 -0
  527. package/dist/ui/inputs/WorkspacePicker.d.ts +35 -0
  528. package/dist/ui/inputs/WorkspacePicker.d.ts.map +1 -0
  529. package/dist/ui/inputs/WorkspacePicker.js +39 -0
  530. package/dist/ui/inputs/WorkspacePicker.js.map +1 -0
  531. package/dist/ui/inputs/datetime-css.generated.d.ts +2 -0
  532. package/dist/ui/inputs/datetime-css.generated.d.ts.map +1 -0
  533. package/dist/ui/inputs/datetime-css.generated.js +4 -0
  534. package/dist/ui/inputs/datetime-css.generated.js.map +1 -0
  535. package/dist/ui/inputs/datetime-logic.d.ts +102 -0
  536. package/dist/ui/inputs/datetime-logic.d.ts.map +1 -0
  537. package/dist/ui/inputs/datetime-logic.js +200 -0
  538. package/dist/ui/inputs/datetime-logic.js.map +1 -0
  539. package/dist/ui/inputs/field-css.generated.d.ts +2 -0
  540. package/dist/ui/inputs/field-css.generated.d.ts.map +1 -0
  541. package/dist/ui/inputs/field-css.generated.js +4 -0
  542. package/dist/ui/inputs/field-css.generated.js.map +1 -0
  543. package/dist/ui/inputs/input-group-css.generated.d.ts +2 -0
  544. package/dist/ui/inputs/input-group-css.generated.d.ts.map +1 -0
  545. package/dist/ui/inputs/input-group-css.generated.js +4 -0
  546. package/dist/ui/inputs/input-group-css.generated.js.map +1 -0
  547. package/dist/ui/inputs/picker-css.d.ts +2 -0
  548. package/dist/ui/inputs/picker-css.d.ts.map +1 -0
  549. package/dist/ui/inputs/picker-css.generated.d.ts +2 -0
  550. package/dist/ui/inputs/picker-css.generated.d.ts.map +1 -0
  551. package/dist/ui/inputs/picker-css.generated.js +4 -0
  552. package/dist/ui/inputs/picker-css.generated.js.map +1 -0
  553. package/dist/ui/inputs/picker-css.js +4 -0
  554. package/dist/ui/inputs/picker-css.js.map +1 -0
  555. package/dist/ui/inputs/picker-icons.d.ts +12 -0
  556. package/dist/ui/inputs/picker-icons.d.ts.map +1 -0
  557. package/dist/ui/inputs/picker-icons.js +29 -0
  558. package/dist/ui/inputs/picker-icons.js.map +1 -0
  559. package/dist/ui/inputs/picker-logic.d.ts +33 -0
  560. package/dist/ui/inputs/picker-logic.d.ts.map +1 -0
  561. package/dist/ui/inputs/picker-logic.js +68 -0
  562. package/dist/ui/inputs/picker-logic.js.map +1 -0
  563. package/dist/ui/inputs/segmented-css.generated.d.ts +2 -0
  564. package/dist/ui/inputs/segmented-css.generated.d.ts.map +1 -0
  565. package/dist/ui/inputs/segmented-css.generated.js +4 -0
  566. package/dist/ui/inputs/segmented-css.generated.js.map +1 -0
  567. package/dist/ui/layout/PanelDock.d.ts +132 -0
  568. package/dist/ui/layout/PanelDock.d.ts.map +1 -0
  569. package/dist/ui/layout/PanelDock.js +390 -0
  570. package/dist/ui/layout/PanelDock.js.map +1 -0
  571. package/dist/ui/layout/QuickToolbar.d.ts +54 -0
  572. package/dist/ui/layout/QuickToolbar.d.ts.map +1 -0
  573. package/dist/ui/layout/QuickToolbar.js +254 -0
  574. package/dist/ui/layout/QuickToolbar.js.map +1 -0
  575. package/dist/ui/layout/SplitGroup.d.ts +37 -0
  576. package/dist/ui/layout/SplitGroup.d.ts.map +1 -0
  577. package/dist/ui/layout/SplitGroup.js +36 -0
  578. package/dist/ui/layout/SplitGroup.js.map +1 -0
  579. package/dist/ui/layout/panel-dock-css.d.ts +2 -0
  580. package/dist/ui/layout/panel-dock-css.d.ts.map +1 -0
  581. package/dist/ui/layout/panel-dock-css.generated.d.ts +2 -0
  582. package/dist/ui/layout/panel-dock-css.generated.d.ts.map +1 -0
  583. package/dist/ui/layout/panel-dock-css.generated.js +4 -0
  584. package/dist/ui/layout/panel-dock-css.generated.js.map +1 -0
  585. package/dist/ui/layout/panel-dock-css.js +4 -0
  586. package/dist/ui/layout/panel-dock-css.js.map +1 -0
  587. package/dist/ui/layout/panel-dock-logic.d.ts +67 -0
  588. package/dist/ui/layout/panel-dock-logic.d.ts.map +1 -0
  589. package/dist/ui/layout/panel-dock-logic.js +110 -0
  590. package/dist/ui/layout/panel-dock-logic.js.map +1 -0
  591. package/dist/ui/layout/quick-toolbar-css.generated.d.ts +2 -0
  592. package/dist/ui/layout/quick-toolbar-css.generated.d.ts.map +1 -0
  593. package/dist/ui/layout/quick-toolbar-css.generated.js +4 -0
  594. package/dist/ui/layout/quick-toolbar-css.generated.js.map +1 -0
  595. package/dist/ui/layout/quick-toolbar-logic.d.ts +76 -0
  596. package/dist/ui/layout/quick-toolbar-logic.d.ts.map +1 -0
  597. package/dist/ui/layout/quick-toolbar-logic.js +40 -0
  598. package/dist/ui/layout/quick-toolbar-logic.js.map +1 -0
  599. package/dist/ui/layout/resizer.d.ts +29 -0
  600. package/dist/ui/layout/resizer.d.ts.map +1 -0
  601. package/dist/ui/layout/resizer.js +42 -0
  602. package/dist/ui/layout/resizer.js.map +1 -0
  603. package/dist/ui/layout/split-group-css.generated.d.ts +2 -0
  604. package/dist/ui/layout/split-group-css.generated.d.ts.map +1 -0
  605. package/dist/ui/layout/split-group-css.generated.js +4 -0
  606. package/dist/ui/layout/split-group-css.generated.js.map +1 -0
  607. package/dist/ui/navigation/Pagination.d.ts +59 -0
  608. package/dist/ui/navigation/Pagination.d.ts.map +1 -0
  609. package/dist/ui/navigation/Pagination.js +112 -0
  610. package/dist/ui/navigation/Pagination.js.map +1 -0
  611. package/dist/ui/navigation/pagination-css.generated.d.ts +2 -0
  612. package/dist/ui/navigation/pagination-css.generated.d.ts.map +1 -0
  613. package/dist/ui/navigation/pagination-css.generated.js +4 -0
  614. package/dist/ui/navigation/pagination-css.generated.js.map +1 -0
  615. package/dist/ui/navigation/pagination-logic.d.ts +36 -0
  616. package/dist/ui/navigation/pagination-logic.d.ts.map +1 -0
  617. package/dist/ui/navigation/pagination-logic.js +73 -0
  618. package/dist/ui/navigation/pagination-logic.js.map +1 -0
  619. package/dist/ui/official.js +2 -2
  620. package/dist/ui/official.js.map +1 -1
  621. package/dist/utils/i18n.d.ts +2 -2
  622. package/dist/utils/i18n.d.ts.map +1 -1
  623. package/dist/utils/i18n.js +1 -1
  624. package/dist/utils/i18n.js.map +1 -1
  625. package/docs/README.md +2 -1
  626. package/docs/design/architecture.md +9 -8
  627. package/docs/design/copywriting.md +23 -0
  628. package/docs/design/external/dsh-host.md +5 -5
  629. package/docs/design/structure.md +132 -128
  630. package/docs/design/style.md +5 -5
  631. package/docs/help/utils.doc.ts +3 -3
  632. package/docs/help/utils.md +3 -3
  633. package/docs/requirements.md +30 -290
  634. package/package.json +1 -1
@@ -0,0 +1,254 @@
1
+ /**
2
+ * 快捷工具栏(UI 基础层):**右侧悬浮的一列圆钮**,内置「回到顶部」,并可挂自定义按钮。
3
+ *
4
+ * 用法:
5
+ * <QuickToolbar
6
+ * anchorId="dshpc-main"
7
+ * onAction={(id) => …}
8
+ * items={[{ id: 'search', icon: <SearchIcon />, label: '搜索' }]}
9
+ * />
10
+ *
11
+ * 行为(2026-10-31 用户拍板):
12
+ * - **纵向恒定**贴屏幕底边,距离 `offset`(默认 16px);按钮从下往上排。
13
+ * - **横向默认**贴屏幕右缘、留 `offset`;给了 `anchorId` / `anchor()` 就贴到那个控件的
14
+ * **右缘外侧**,同样留 `offset`。右侧放不下(再留一个 `offset` 后越界)就退回贴屏幕右缘。
15
+ * 控件找不到按「跟随窗口」处理,不报错。
16
+ * - 内置「回到顶部」默认 `when: 'scroll'`、阈值 320:滚过才出现;可传 `backToTop: false` 关掉,
17
+ * 或用 `{ order, label, threshold }` 调整。
18
+ * - 自定义项:`icon` / `label` / `onClick`;`visible` / `when` / `order` / `threshold` / `color` /
19
+ * `fgColor` 都可配。点击后先调 `onClick`,再统一回调 `onAction(id, item)`。
20
+ * - 滚动容器默认取工具栏最近的「可纵向滚动」祖先,也可以显式给 `scrollContainer`。
21
+ * - 显隐切换带 0.2s 动画:挂载淡入,消失先淡出、播完才卸载(`reduced-motion` 下关闭)。
22
+ *
23
+ * 样式只注入自己那一份(`controls/quick-toolbar.css`),横向位置 / 尺寸 / 间距由本组件在
24
+ * style 上实时写入,不写死 CSS。
25
+ */
26
+ import { createElement as h, useEffect, useRef, useState } from 'react';
27
+ import { Chevron } from '../infra/chevron.js';
28
+ import { ensureComponentStyles } from '../infra/css.js';
29
+ import { QUICK_TOOLBAR_CSS } from '../infra/controls-css.js';
30
+ import { DEFAULT_SCROLL_THRESHOLD, isToolbarEntryVisible, resolveToolbarLeft, sortToolbarEntries, } from './quick-toolbar-logic.js';
31
+ import { t } from '../../utils/i18n.js';
32
+ /** 默认贴边距离(px)。 */
33
+ const DEFAULT_OFFSET = 16;
34
+ /** 默认按钮直径(px)。 */
35
+ const DEFAULT_SIZE = 44;
36
+ /** 默认按钮间距(px)。 */
37
+ const DEFAULT_GAP = 12;
38
+ /** 退场动画的卸载延迟(ms,与 CSS 的 0.2s 对齐并留余量)。 */
39
+ const LEAVE_MS = 220;
40
+ /** 向上找最近的「可纵向滚动」祖先。 */
41
+ function findScrollParent(node) {
42
+ let el = node?.parentElement ?? null;
43
+ while (el !== null) {
44
+ const oy = getComputedStyle(el).overflowY;
45
+ if (oy === 'auto' || oy === 'scroll')
46
+ return el;
47
+ el = el.parentElement;
48
+ }
49
+ return null;
50
+ }
51
+ /** 显式 scrollContainer 优先,其次最近的可滚动祖先,最后退回窗口。 */
52
+ function resolveScrollTarget(explicit, node) {
53
+ let target = null;
54
+ if (typeof explicit === 'function')
55
+ target = explicit();
56
+ else if (explicit !== undefined)
57
+ target = explicit;
58
+ if (target === null)
59
+ target = findScrollParent(node);
60
+ return target ?? window;
61
+ }
62
+ /** 读当前滚动距离。 */
63
+ function scrollTopOf(target) {
64
+ if (typeof HTMLElement !== 'undefined' && target instanceof HTMLElement)
65
+ return target.scrollTop;
66
+ if (typeof window === 'undefined')
67
+ return 0;
68
+ return window.scrollY || document.documentElement.scrollTop || 0;
69
+ }
70
+ /** 平滑回到顶部(reduced-motion 下瞬时)。 */
71
+ function scrollToTop(target) {
72
+ const reduce = typeof window !== 'undefined'
73
+ && typeof window.matchMedia === 'function'
74
+ && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
75
+ const behavior = reduce ? 'auto' : 'smooth';
76
+ if (typeof HTMLElement !== 'undefined' && target instanceof HTMLElement)
77
+ target.scrollTo({ top: 0, behavior });
78
+ else if (typeof window !== 'undefined')
79
+ window.scrollTo({ top: 0, behavior });
80
+ }
81
+ /** 右侧浮动的快捷工具栏:内置回顶部 + 自定义按钮。 */
82
+ export function QuickToolbar(props) {
83
+ ensureComponentStyles('quick-toolbar', QUICK_TOOLBAR_CSS);
84
+ const ref = useRef(null);
85
+ const [left, setLeft] = useState(null);
86
+ const [scrollTop, setScrollTop] = useState(0);
87
+ // 正在退场的按钮:先留在 DOM 里播 fade-out,计时到了才卸载。
88
+ const [leaving, setLeaving] = useState([]);
89
+ const shownRef = useRef([]);
90
+ const leaveTimers = useRef(new Map());
91
+ const offset = props.offset ?? DEFAULT_OFFSET;
92
+ const size = props.size ?? DEFAULT_SIZE;
93
+ const gap = props.gap ?? DEFAULT_GAP;
94
+ // 横向定位:锚点右缘外侧;放不下 / 没锚点 ⇒ 贴视口右缘。
95
+ useEffect(() => {
96
+ const node = ref.current;
97
+ if (node === null)
98
+ return;
99
+ const resolveAnchor = () => {
100
+ if (props.anchor !== undefined)
101
+ return props.anchor();
102
+ const id = props.anchorId;
103
+ return id === undefined ? null : document.getElementById(id);
104
+ };
105
+ let observed = null;
106
+ let lastRight = null;
107
+ let lastViewport = -1;
108
+ const ro = new ResizeObserver(update);
109
+ function update() {
110
+ const anchorEl = resolveAnchor();
111
+ if (anchorEl !== observed) {
112
+ if (observed !== null)
113
+ ro.unobserve(observed);
114
+ if (anchorEl !== null)
115
+ ro.observe(anchorEl);
116
+ observed = anchorEl;
117
+ }
118
+ const viewportWidth = document.documentElement.clientWidth;
119
+ const rect = anchorEl === null ? null : anchorEl.getBoundingClientRect();
120
+ // 锚点被隐藏 / 收起(宽高均为 0)时不跟随,按「找不到控件」退回贴视口右缘。
121
+ const anchorRight = rect === null || (rect.width === 0 && rect.height === 0) ? null : rect.right;
122
+ // 值没变就不写 state。位置另做轮询兜底:侧栏开合可能只改 clientWidth(滚动条增减)
123
+ // 或推动锚点位置(尺寸不变),这两种都不会触发 resize / ResizeObserver。
124
+ if (viewportWidth === lastViewport && anchorRight === lastRight)
125
+ return;
126
+ lastViewport = viewportWidth;
127
+ lastRight = anchorRight;
128
+ setLeft(resolveToolbarLeft({ viewportWidth, offset, size }, anchorRight));
129
+ }
130
+ update();
131
+ const poll = setInterval(update, 100);
132
+ window.addEventListener('resize', update);
133
+ return () => {
134
+ clearInterval(poll);
135
+ window.removeEventListener('resize', update);
136
+ ro.disconnect();
137
+ };
138
+ }, [props.anchor, props.anchorId, offset, size]);
139
+ // 滚动距离:驱动 `when: 'scroll'` 的显隐。
140
+ useEffect(() => {
141
+ const node = ref.current;
142
+ if (node === null)
143
+ return;
144
+ const target = resolveScrollTarget(props.scrollContainer, node);
145
+ const onScroll = () => setScrollTop(scrollTopOf(target));
146
+ onScroll();
147
+ target.addEventListener('scroll', onScroll, { passive: true });
148
+ return () => target.removeEventListener('scroll', onScroll);
149
+ }, [props.scrollContainer]);
150
+ // 内置回顶部与自定义项摊平成同一张排序表。
151
+ const backTop = props.backToTop === false
152
+ ? null
153
+ : (typeof props.backToTop === 'object' ? props.backToTop : {});
154
+ const entries = [];
155
+ if (backTop !== null) {
156
+ entries.push({ id: '__backtop', kind: 'backtop', order: backTop.order ?? 0, index: 0 });
157
+ }
158
+ for (const [index, item] of (props.items ?? []).entries()) {
159
+ entries.push({ id: item.id, kind: 'custom', order: item.order ?? index + 1, index, item });
160
+ }
161
+ const threshold = backTop?.threshold ?? DEFAULT_SCROLL_THRESHOLD;
162
+ const sorted = sortToolbarEntries(entries);
163
+ const visible = sorted.filter((entry) => {
164
+ if (entry.kind === 'backtop')
165
+ return isToolbarEntryVisible({ when: 'scroll', threshold }, scrollTop);
166
+ return isToolbarEntryVisible(entry.item ?? {}, scrollTop);
167
+ });
168
+ const visibleKey = JSON.stringify(visible.map((entry) => entry.id));
169
+ // 显隐切换:新出现的项挂载即淡入;消失的项先转为退场态、延迟卸载。
170
+ useEffect(() => {
171
+ const next = JSON.parse(visibleKey);
172
+ const revived = next.filter((id) => leaveTimers.current.has(id));
173
+ for (const id of revived) {
174
+ const timer = leaveTimers.current.get(id);
175
+ if (timer !== undefined)
176
+ clearTimeout(timer);
177
+ leaveTimers.current.delete(id);
178
+ }
179
+ if (revived.length > 0)
180
+ setLeaving((prev) => prev.filter((id) => !revived.includes(id)));
181
+ const gone = shownRef.current.filter((id) => !next.includes(id));
182
+ if (gone.length > 0) {
183
+ setLeaving((prev) => [...prev, ...gone.filter((id) => !prev.includes(id))]);
184
+ for (const id of gone) {
185
+ const timer = leaveTimers.current.get(id);
186
+ if (timer !== undefined)
187
+ clearTimeout(timer);
188
+ leaveTimers.current.set(id, setTimeout(() => {
189
+ leaveTimers.current.delete(id);
190
+ setLeaving((prev) => prev.filter((value) => value !== id));
191
+ }, LEAVE_MS));
192
+ }
193
+ }
194
+ shownRef.current = next;
195
+ }, [visibleKey]);
196
+ useEffect(() => () => {
197
+ for (const timer of leaveTimers.current.values())
198
+ clearTimeout(timer);
199
+ leaveTimers.current.clear();
200
+ }, []);
201
+ const style = {
202
+ bottom: `${offset}px`,
203
+ gap: `${gap}px`,
204
+ ...(left === null ? { right: `${offset}px` } : { left: `${left}px` }),
205
+ };
206
+ const shownSet = new Set(visible.map((entry) => entry.id));
207
+ const leavingSet = new Set(leaving);
208
+ const rendered = sorted.filter((entry) => shownSet.has(entry.id) || leavingSet.has(entry.id));
209
+ const renderItem = (entry, isLeaving) => {
210
+ const leaveClass = isLeaving ? ' is-leaving' : '';
211
+ if (entry.kind === 'backtop') {
212
+ const label = backTop?.label ?? t('backToTop');
213
+ return h('button', {
214
+ key: entry.id,
215
+ type: 'button',
216
+ className: `dshpc-quick-toolbar__item dshpc-quick-toolbar__backtop${leaveClass}`,
217
+ style: { width: size, height: size },
218
+ 'aria-label': label,
219
+ title: label,
220
+ onClick: () => scrollToTop(resolveScrollTarget(props.scrollContainer, ref.current)),
221
+ }, h(Chevron, { dir: 'up', size: 18 }));
222
+ }
223
+ const item = entry.item;
224
+ if (item === undefined)
225
+ return null;
226
+ // 自定义配色只写 CSS 变量,不直接写 background / color —— 否则会压过 hover / active 的混色规则。
227
+ const buttonStyle = { width: size, height: size };
228
+ if (item.color !== undefined)
229
+ buttonStyle['--dshpc-quick-toolbar-bg'] = item.color;
230
+ if (item.fgColor !== undefined)
231
+ buttonStyle['--dshpc-quick-toolbar-fg'] = item.fgColor;
232
+ const onClick = () => {
233
+ item.onClick?.();
234
+ props.onAction?.(item.id, item);
235
+ };
236
+ return h('button', {
237
+ key: entry.id,
238
+ type: 'button',
239
+ className: `dshpc-quick-toolbar__item${leaveClass}`,
240
+ style: buttonStyle,
241
+ 'aria-label': item.label,
242
+ title: item.label,
243
+ onClick,
244
+ }, item.icon);
245
+ };
246
+ return h('div', {
247
+ ref,
248
+ className: `dshpc-quick-toolbar${props.className === undefined ? '' : ` ${props.className}`}`,
249
+ style,
250
+ role: 'toolbar',
251
+ 'aria-label': props.ariaLabel ?? t('quickToolbarAria'),
252
+ }, ...rendered.map((entry) => renderItem(entry, leavingSet.has(entry.id))));
253
+ }
254
+ //# sourceMappingURL=QuickToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuickToolbar.js","sourceRoot":"","sources":["../../../src/ui/layout/QuickToolbar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 拼接外壳 —— 两个控件在外观上焊成一体(L2 组件皮肤,P1)
3
+ *
4
+ * 只管样式:外框、圆角、两格之间那条 1px 分隔、整体聚焦圈。**不持状态、不出联动回调** ——
5
+ * 选中与联动全走内件自己的 `value` / `onChange`(2026-10-28 用户拍板:外壳不必知道
6
+ * 右边那个控件管什么,消费方自己拿两个控件去绑)。
7
+ *
8
+ * 固定两格:不做多格(用户 2026-10-28:「就是两个组合,我觉得就足够了」)。
9
+ *
10
+ * 用法:
11
+ * h(SplitGroup, null,
12
+ * h(Segmented, { size: 'md', items, value, onChange: v => { setA(v); setB(pickFor(v)) } }),
13
+ * h(Picker, { size: 'md', options: optsOf(a), value: b, onChange: setB }))
14
+ *
15
+ * 两格要等高,就给内件传**同一个 `size`**(sm 24 / md 28 / lg 32 —— 外壳跟着内件长,不写死高度)。
16
+ */
17
+ import { createElement as h, type CSSProperties, type ReactNode } from 'react';
18
+ export interface SplitGroupProps {
19
+ /** 两格内容(左、右)。元素顺序即布局顺序;固定两格,不做多格。 */
20
+ children?: ReactNode;
21
+ /** 无障碍组名(读屏用)。 */
22
+ label?: string;
23
+ /** 根节点 id(锚点 / 自动化测试用)。 */
24
+ id?: string;
25
+ /** 追加到根节点的 class(只允许补布局,不许覆盖皮肤)。 */
26
+ className?: string;
27
+ /** 外层追加样式(只允许补布局,不许覆盖皮肤)。 */
28
+ style?: CSSProperties;
29
+ }
30
+ /**
31
+ * 渲染一个两格拼接外壳。
32
+ *
33
+ * @param props 见 {@link SplitGroupProps}。
34
+ * @returns 外壳元素。
35
+ */
36
+ export declare function SplitGroup(props: SplitGroupProps): ReturnType<typeof h>;
37
+ //# sourceMappingURL=SplitGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitGroup.d.ts","sourceRoot":"","sources":["../../../src/ui/layout/SplitGroup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAI9E,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,kBAAkB;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2BAA2B;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,aAAa,CAAA;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAavE"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 拼接外壳 —— 两个控件在外观上焊成一体(L2 组件皮肤,P1)
3
+ *
4
+ * 只管样式:外框、圆角、两格之间那条 1px 分隔、整体聚焦圈。**不持状态、不出联动回调** ——
5
+ * 选中与联动全走内件自己的 `value` / `onChange`(2026-10-28 用户拍板:外壳不必知道
6
+ * 右边那个控件管什么,消费方自己拿两个控件去绑)。
7
+ *
8
+ * 固定两格:不做多格(用户 2026-10-28:「就是两个组合,我觉得就足够了」)。
9
+ *
10
+ * 用法:
11
+ * h(SplitGroup, null,
12
+ * h(Segmented, { size: 'md', items, value, onChange: v => { setA(v); setB(pickFor(v)) } }),
13
+ * h(Picker, { size: 'md', options: optsOf(a), value: b, onChange: setB }))
14
+ *
15
+ * 两格要等高,就给内件传**同一个 `size`**(sm 24 / md 28 / lg 32 —— 外壳跟着内件长,不写死高度)。
16
+ */
17
+ import { createElement as h } from 'react';
18
+ import { ensureComponentStyles } from '../infra/css.js';
19
+ import { SPLIT_GROUP_CSS } from '../infra/controls-css.js';
20
+ /**
21
+ * 渲染一个两格拼接外壳。
22
+ *
23
+ * @param props 见 {@link SplitGroupProps}。
24
+ * @returns 外壳元素。
25
+ */
26
+ export function SplitGroup(props) {
27
+ ensureComponentStyles('split-group', SPLIT_GROUP_CSS);
28
+ return h('div', {
29
+ role: 'group',
30
+ 'aria-label': props.label,
31
+ id: props.id,
32
+ className: `dshpc-split${props.className === undefined ? '' : ` ${props.className}`}`,
33
+ style: props.style,
34
+ }, props.children);
35
+ }
36
+ //# sourceMappingURL=SplitGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitGroup.js","sourceRoot":"","sources":["../../../src/ui/layout/SplitGroup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,aAAa,IAAI,CAAC,EAAsC,MAAM,OAAO,CAAA;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAe1D;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAA;IACrD,OAAO,CAAC,CACN,KAAK,EACL;QACE,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,KAAK,CAAC,KAAK;QACzB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,SAAS,EAAE,cAAc,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE;QACrF,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,EACD,KAAK,CAAC,QAAQ,CACf,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { PANEL_DOCK_CSS } from './panel-dock-css.generated.js';
2
+ //# sourceMappingURL=panel-dock-css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-dock-css.d.ts","sourceRoot":"","sources":["../../../src/ui/layout/panel-dock-css.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const PANEL_DOCK_CSS = "/* \u505C\u9760\u680F = **\u5E03\u5C40\u6210\u5458**\uFF0C\u4E0D\u662F\u6D6E\u5C42\uFF1A\u5B83\u5360\u5BBD\u5EA6\u3001\u628A\u4E3B\u533A\u771F\u6B63\u6324\u7A84\uFF08\u5144\u5F1F\u9879\u76EE 2026-09-28\uFF1A\n \u300C\u5206\u680F\u538B\u8FC7\u6765\uFF0C\u4E0D\u662F\u76D6\u4E0A\u53BB\u300D\uFF09\u3002\u6240\u4EE5\u8C03\u7528\u65B9\u5FC5\u987B\u628A\u5B83\u653E\u8FDB\u81EA\u5DF1\u7684 flex \u6839\u91CC\u3002\n \u76AE\u80A4\uFF08\u5934\u90E8 / \u62D6\u62FD\u6761 / \u5173\u95ED\u94AE / \u80CC\u666F\u9634\u5F71\uFF09\u5728 side-panel.css\uFF0C\u4E0E SideSheet \u5171\u7528\u3002 */\n.dshpc-dock{display:flex;flex:0 0 auto;align-self:stretch;min-width:0}\n/* dock \u4E0D\u518D\u66FF\u4E3B\u533A\u8BA9\u7F1D\uFF08\u539F --dshpc-dock-gap \u7684 1px margin \u5DF2\u5220\uFF0C\u7528\u6237 2026-11-02\uFF09\uFF1A\n \u6EDA\u52A8\u6761\u4E0E\u5BB9\u5668\u8FB9\u7F18\u7684 1px \u7EDF\u4E00\u7531\u6EDA\u52A8\u5BB9\u5668\u81EA\u5DF1\u7684\u900F\u660E\u8FB9\u6846\u63D0\u4F9B\uFF08\u89C1 style.md \u00A7\u6EDA\u52A8\u6761\u8BA9\u4F4D\uFF09\uFF0C\n \u4E3B\u533A\u5BB9\u5668\u5E26\u4E86\u8BA9\u4F4D\uFF0C\u6EDA\u52A8\u6761\u4E0E\u8FD9\u6761\u5206\u9694\u7EBF\u4E4B\u95F4\u81EA\u7136\u8FD8\u662F 1px\u3002\u522B\u518D\u5F80\u8FD9\u91CC\u52A0 margin\u3002 */\n\n/* \u81EA\u52A8\u52A0\u7684\u5BBF\u4E3B\u884C\uFF08openFilePreview \u52A0 / \u5173\u95ED\u5373\u6458\uFF09\uFF1A\u6D88\u8D39\u65B9\u90A3\u884C\u4E0D\u5FC5\u81EA\u5DF1\u5199 flex\u3002\n \u53EA\u8BA9\u300C\u7B2C\u4E00\u4E2A\u975E\u9884\u89C8\u5B50\u9879\u300D\u5F53\u4E3B\u533A\u4F38\u5C55\uFF0C\u5176\u4F59\u76F4\u63A5\u5B50\u9879\u4E0D\u52A8\uFF08\u9875\u811A\u6761\u3001\u5DE5\u5177\u6761\u4E0D\u8BEF\u4F24\uFF09\uFF1B\n display \u4E0D\u5728\u8FD9\u91CC\u5199\u6B7B \u2014\u2014 \u672C\u6765\u5C31\u662F grid \u7B49\u5E03\u5C40\u7684\u5143\u7D20\u4FDD\u6301\u539F\u6837\uFF0C\u7531 TS \u4FA7\u6309\u8BA1\u7B97\u503C\u8865 flex\u3002 */\n.dshpc-dock-host{min-width:0;min-height:0}\n.dshpc-dock-host>:not([data-dshpc-file-preview]){min-width:0}\n.dshpc-dock-host>:first-child:not([data-dshpc-file-preview]){flex:1 1 auto}\n\n/* \u5355\u680F**\u5360\u4F4D**\uFF1Asticky + \u89C6\u53E3\u9AD8\u8BA9\u5B83\u5728\u9875\u9762\u6EDA\u52A8\u65F6\u4FDD\u6301\u53EF\u89C1\uFF0C\u540C\u65F6\u4ECD\u7136\u5360\u5BBD\u5EA6\u3002\n \u26A0\uFE0F **\u672C\u6761\u523B\u610F\u4E0D\u8BBE z-index**\uFF1A\u5E03\u5C40\u6210\u5458\u4E00\u65E6\u5E26\u6B63 z-index\uFF0C\u5C31\u4F1A\u65E0\u6761\u4EF6\u538B\u8FC7\u5BBF\u4E3B portal \u5230 body \u7684\n \u5F39\u7A97\uFF08\u5144\u5F1F\u9879\u76EE 2026-10-05 \u771F\u673A\u4E8B\u6545\u300C\u4FA7\u8FB9\u680F\u76D6\u4F4F\u5BBF\u4E3B\u8BBE\u7F6E\u5F39\u7A97\u300D\uFF09\u3002\u5C42\u5E8F\u4EA4\u7ED9 DOM \u987A\u5E8F\u88C1\u51B3\u3002\n \u5916\u89C2\u6765\u81EA .dshpc-side-surface\uFF08side-panel.css\uFF09\uFF0C\u8FD9\u91CC\u53EA\u7BA1\u600E\u4E48\u5360\u4F4D\u4E0E\u671D\u54EA\u8FB9\u63CF\u8FB9\u3002 */\n.dshpc-dock__panel{\n position:sticky;top:0;align-self:stretch;\n /* \u9AD8\u5EA6\u9ED8\u8BA4\u89C6\u53E3\u9AD8\uFF08\u6574\u9875\u573A\u666F\uFF09\uFF1B\u5D4C\u5728\u5B9A\u9AD8\u5BB9\u5668\u91CC\u65F6\u7531\u8C03\u7528\u65B9\u7ED9 --dshpc-dock-h\uFF08\u5982 420px / 100%\uFF09\u3002 */\n height:var(--dshpc-dock-h,100vh);max-height:var(--dshpc-dock-h,100vh);\n border-left:1px solid var(--dshpc-border);\n}\n/* \u6536\u8D77\u7684\u51FA\u573A\uFF1A\u5BBD\u5EA6\u6536\u5230 0\u3001\u900F\u660E\u6DE1\u51FA\uFF1B\u843D\u5B9A\u540E\u7EC4\u4EF6\u624D\u771F\u6B63\u6458\u6389\u8FD9\u4E00\u680F\uFF08JS \u5EF6\u65F6 220ms \u914D\u5408\uFF09\u3002 */\n.dshpc-dock__panel--closing{\n width:0!important;min-width:0!important;opacity:0;border-left-width:0;\n transition:width .2s var(--dshpc-ease),opacity .2s var(--dshpc-ease),border-left-width .2s var(--dshpc-ease);\n}\n\n/* \u62D6\u52A8\u671F\uFF1A\u2460 <iframe>\uFF08PDF / HTML \u9884\u89C8\uFF09\u662F\u72EC\u7ACB\u6587\u6863\uFF0C\u4F1A\u541E\u6389\u7236\u6587\u6863\u7684 pointermove\uFF0C\n \u5411\u53F3\u62D6\u8FDB iframe \u5C31\u5361\u6B7B \u2014\u2014 \u6574\u7247\u8BA9\u51FA\u6307\u9488\u4E8B\u4EF6\uFF1B\u2461 contain \u628A\u91CD\u6392\u9694\u79BB\u5728\u680F\u5185\uFF0C\n \u5426\u5219\u6BCF\u5E27\u6539\u5BBD\u5EA6\u90FD\u4F1A\u7275\u52A8\u6574\u9875\u91CD\u6392\uFF08\u5144\u5F1F\u9879\u76EE 2026-10-04 \u771F\u673A\u300C\u632A\u5F88\u4E45\u624D\u52A8\u4E00\u4E0B\u300D\uFF09\u3002 */\n.dshpc-dock.dshpc-dock--resizing iframe{pointer-events:none}\n.dshpc-dock.dshpc-dock--resizing .dshpc-dock__panel{contain:layout paint;will-change:width}\n\n/* \u6536\u8D77\u94AE\uFF1A**\u5F85\u5728\u9762\u677F\u81EA\u5DF1\u7684\u6846\u91CC**\uFF08\u7528\u6237 2026-10-28 \u4E09\u8F6E\uFF1A\u5360\u9762\u677F\u5185\u90E8\u7A7A\u95F4\uFF0C\u4E0D\u4F38\u5230\u5916\u9762\u53BB\uFF09\u3002\n left:0 \u4ECE\u5185\u4FA7\u8D34\u7740\u5206\u9694\u7EBF \u2014\u2014 \u8D34\u7EBF\u7684\u4E00\u8FB9\u4E0D\u63CF\u8FB9\uFF08\u7EBF\u662F\u9762\u677F\u81EA\u5DF1\u7684 border-left\uFF09\uFF0C\u9875\u7B7E\u4E0E\u7EBF\u4E0D\u91CD\u5408\u3002\n 20\u00D744\uFF08\u7528\u6237 2026-10-28 \u56DB\u8F6E\u5B9A\u5C3A\u5BF8\uFF09\uFF1B\u5B9E\u8272\u5E95\uFF08--dshpc-plate\uFF0C\u660E\u6697\u5404\u6709\u5B9E\u503C\uFF09\uFF0Chover \u4EAE\u4E00\u6863\u3002\n padding-right:2px \u662F**\u89C6\u89C9\u5C45\u4E2D**\uFF1A\u53F3\u4FA7\u662F\u5706\u89D2\uFF0C\u7BAD\u5934\u5F80\u76F4\u7EBF\u90A3\u8FB9\u632A 1px\uFF08\u7528\u6237 2026-10-28 \u56DB\u8F6E\uFF09\u3002 */\n.dshpc-dock__collapse{\n position:absolute;left:0;top:50%;transform:translateY(-50%);\n z-index:8;display:inline-flex;align-items:center;justify-content:center;\n width:20px;height:44px;padding:0 2px 0 0;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-right:1px solid var(--dshpc-border);\n border-left:none;\n border-radius:0 var(--dshpc-radius-sm) var(--dshpc-radius-sm) 0;\n background:var(--dshpc-plate);color:var(--dshpc-fg-3);\n font-family:inherit;font-size:16px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-dock__collapse:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__collapse:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n\n/* \u6536\u8D77\u540E\u7684\u6D6E\u52A8\u8033\u6735\uFF1A**fixed \u8D34\u53F3\u7F18\u3001\u5782\u76F4\u5C45\u4E2D\u3001\u72EC\u7ACB\u4E8E\u5206\u680F**\uFF08\u7528\u6237 2026-10-28 \u5B9A\u7A3F\uFF1A\n \u5C0F\u9875\u7B7E\u6302\u4E2D\u95F4\u3001\u91CC\u9762\u653E\u9762\u677F\u56FE\u6807\u3001\u4E0D\u663E\u793A\u6587\u5B57\uFF0C\u7BAD\u5934\u4E0E\u6536\u8D77\u94AE\u53CD\u5411\uFF09\u3002\u591A\u4E2A\u6309\u6536\u8D77\u987A\u5E8F\u7EB5\u5411\u5806\u53E0\u3002\n z \u8D70 ear \u6863\uFF08\u9AD8\u4E8E\u5F39\u7A97\u906E\u7F69\uFF0C2026-11-04\uFF09\uFF1A\u9762\u677F\u5728\u5F39\u7A97\u4E0B\u9762\u65F6\uFF0C\u8033\u6735\u4ECD\u662F\u552F\u4E00\u80FD\u70B9\u5230\u7684\u5165\u53E3\u3002\n DOM \u4E0A portal \u5230 body\uFF08PanelDock.ts\uFF09\uFF0C\u5426\u5219\u4F1A\u88AB\u5F39\u7A97\u7684 stacking context \u5173\u5728\u91CC\u9762\u3002 */\n.dshpc-dock__ears{\n position:fixed;top:50%;right:0;transform:translateY(-50%);\n z-index:var(--dshpc-z-ear,1080);\n display:flex;flex-direction:column;gap:8px;align-items:flex-end;\n pointer-events:none;\n}\n.dshpc-dock__ear{\n pointer-events:auto;display:inline-flex;align-items:center;justify-content:center;\n /* \u4E0E\u6536\u8D77\u94AE**\u540C\u5C3A\u5BF8**\uFF0820\u00D744\uFF0C\u7528\u6237 2026-10-28 \u56DB\u8F6E\uFF09\uFF1A\u4E0A/\u4E0B/\u5DE6\u63CF\u8FB9\uFF0C\u8D34\u53F3\u7F18\u7684\u4E00\u4FA7\u4E0D\u63CF\u3002\n \u5B9E\u8272\u5E95\uFF08--dshpc-plate\uFF09\uFF0C\u4E0D\u7528\u900F\u660E\u8272 \u2014\u2014 \u900F\u660E\u5E95\u4E0B\u900F\u51FA\u4E1C\u897F\u5F88\u96BE\u770B\u3002\n padding-left:2px \u662F**\u89C6\u89C9\u5C45\u4E2D**\uFF1A\u5DE6\u4FA7\u662F\u5706\u89D2\uFF0C\u7BAD\u5934\u5F80\u76F4\u7EBF\uFF08\u53F3\u7F18\uFF09\u90A3\u8FB9\u632A 1px\u3002 */\n width:20px;height:44px;box-sizing:border-box;padding:0 0 0 2px;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-left:1px solid var(--dshpc-border);\n border-right:none;\n border-radius:var(--dshpc-radius-sm) 0 0 var(--dshpc-radius-sm);\n background:var(--dshpc-plate);color:var(--dshpc-fg-2);\n cursor:pointer;font-family:inherit;line-height:1;\n animation:dshpc-ear-in .2s var(--dshpc-ease);\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n/* \u5165\u573A\uFF1A\u4ECE\u53F3\u7F18\u5916\u6ED1\u8FDB\u6765\uFF0C\u522B\u300C\u7A81\u7136\u51FA\u73B0\u300D\uFF08\u7528\u6237 2026-10-28\uFF09\u3002 */\n@keyframes dshpc-ear-in{from{opacity:0;transform:translateX(14px)}}\n.dshpc-dock__ear:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__ear:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* \u4E0E\u6536\u8D77\u94AE\u7684\u7BAD\u5934\u540C\u4E00\u5B57\u53F7\uFF0816px\uFF09\uFF1A\u6536\u8FDB\u53BB\u524D\u540E\u7BAD\u5934\u4E00\u6A21\u4E00\u6837\u5927\uFF08\u7528\u6237 2026-10-28\uFF09\u3002 */\n.dshpc-dock__ear-arrow{font-size:16px;color:var(--dshpc-fg-3)}\n.dshpc-dock__ear:hover .dshpc-dock__ear-arrow{color:var(--dshpc-fg)}\n/* \u52A8\u6548\u793C\u8C8C\uFF1A\u7CFB\u7EDF\u58F0\u660E\u51CF\u5C11\u52A8\u6548\u65F6\u5168\u90E8\u5173\u6389\uFF0C\u6536\u8D77\u9000\u5316\u4E3A\u77AC\u65F6\u3001\u529F\u80FD\u4E0D\u53D7\u5F71\u54CD\u3002 */\n@media (prefers-reduced-motion:reduce){\n .dshpc-dock__panel{animation:none}\n .dshpc-dock__panel--closing{transition:none}\n .dshpc-dock__ear{animation:none}\n}\n";
2
+ //# sourceMappingURL=panel-dock-css.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-dock-css.generated.d.ts","sourceRoot":"","sources":["../../../src/ui/layout/panel-dock-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,y+SAAg2J,CAAA"}
@@ -0,0 +1,4 @@
1
+ // ⚠️ 生成物,勿手改。真源 = src/ui/layout/panel-dock.css
2
+ // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
+ export const PANEL_DOCK_CSS = "/* 停靠栏 = **布局成员**,不是浮层:它占宽度、把主区真正挤窄(兄弟项目 2026-09-28:\n 「分栏压过来,不是盖上去」)。所以调用方必须把它放进自己的 flex 根里。\n 皮肤(头部 / 拖拽条 / 关闭钮 / 背景阴影)在 side-panel.css,与 SideSheet 共用。 */\n.dshpc-dock{display:flex;flex:0 0 auto;align-self:stretch;min-width:0}\n/* dock 不再替主区让缝(原 --dshpc-dock-gap 的 1px margin 已删,用户 2026-11-02):\n 滚动条与容器边缘的 1px 统一由滚动容器自己的透明边框提供(见 style.md §滚动条让位),\n 主区容器带了让位,滚动条与这条分隔线之间自然还是 1px。别再往这里加 margin。 */\n\n/* 自动加的宿主行(openFilePreview 加 / 关闭即摘):消费方那行不必自己写 flex。\n 只让「第一个非预览子项」当主区伸展,其余直接子项不动(页脚条、工具条不误伤);\n display 不在这里写死 —— 本来就是 grid 等布局的元素保持原样,由 TS 侧按计算值补 flex。 */\n.dshpc-dock-host{min-width:0;min-height:0}\n.dshpc-dock-host>:not([data-dshpc-file-preview]){min-width:0}\n.dshpc-dock-host>:first-child:not([data-dshpc-file-preview]){flex:1 1 auto}\n\n/* 单栏**占位**:sticky + 视口高让它在页面滚动时保持可见,同时仍然占宽度。\n ⚠️ **本条刻意不设 z-index**:布局成员一旦带正 z-index,就会无条件压过宿主 portal 到 body 的\n 弹窗(兄弟项目 2026-10-05 真机事故「侧边栏盖住宿主设置弹窗」)。层序交给 DOM 顺序裁决。\n 外观来自 .dshpc-side-surface(side-panel.css),这里只管怎么占位与朝哪边描边。 */\n.dshpc-dock__panel{\n position:sticky;top:0;align-self:stretch;\n /* 高度默认视口高(整页场景);嵌在定高容器里时由调用方给 --dshpc-dock-h(如 420px / 100%)。 */\n height:var(--dshpc-dock-h,100vh);max-height:var(--dshpc-dock-h,100vh);\n border-left:1px solid var(--dshpc-border);\n}\n/* 收起的出场:宽度收到 0、透明淡出;落定后组件才真正摘掉这一栏(JS 延时 220ms 配合)。 */\n.dshpc-dock__panel--closing{\n width:0!important;min-width:0!important;opacity:0;border-left-width:0;\n transition:width .2s var(--dshpc-ease),opacity .2s var(--dshpc-ease),border-left-width .2s var(--dshpc-ease);\n}\n\n/* 拖动期:① <iframe>(PDF / HTML 预览)是独立文档,会吞掉父文档的 pointermove,\n 向右拖进 iframe 就卡死 —— 整片让出指针事件;② contain 把重排隔离在栏内,\n 否则每帧改宽度都会牵动整页重排(兄弟项目 2026-10-04 真机「挪很久才动一下」)。 */\n.dshpc-dock.dshpc-dock--resizing iframe{pointer-events:none}\n.dshpc-dock.dshpc-dock--resizing .dshpc-dock__panel{contain:layout paint;will-change:width}\n\n/* 收起钮:**待在面板自己的框里**(用户 2026-10-28 三轮:占面板内部空间,不伸到外面去)。\n left:0 从内侧贴着分隔线 —— 贴线的一边不描边(线是面板自己的 border-left),页签与线不重合。\n 20×44(用户 2026-10-28 四轮定尺寸);实色底(--dshpc-plate,明暗各有实值),hover 亮一档。\n padding-right:2px 是**视觉居中**:右侧是圆角,箭头往直线那边挪 1px(用户 2026-10-28 四轮)。 */\n.dshpc-dock__collapse{\n position:absolute;left:0;top:50%;transform:translateY(-50%);\n z-index:8;display:inline-flex;align-items:center;justify-content:center;\n width:20px;height:44px;padding:0 2px 0 0;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-right:1px solid var(--dshpc-border);\n border-left:none;\n border-radius:0 var(--dshpc-radius-sm) var(--dshpc-radius-sm) 0;\n background:var(--dshpc-plate);color:var(--dshpc-fg-3);\n font-family:inherit;font-size:16px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-dock__collapse:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__collapse:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n\n/* 收起后的浮动耳朵:**fixed 贴右缘、垂直居中、独立于分栏**(用户 2026-10-28 定稿:\n 小页签挂中间、里面放面板图标、不显示文字,箭头与收起钮反向)。多个按收起顺序纵向堆叠。\n z 走 ear 档(高于弹窗遮罩,2026-11-04):面板在弹窗下面时,耳朵仍是唯一能点到的入口。\n DOM 上 portal 到 body(PanelDock.ts),否则会被弹窗的 stacking context 关在里面。 */\n.dshpc-dock__ears{\n position:fixed;top:50%;right:0;transform:translateY(-50%);\n z-index:var(--dshpc-z-ear,1080);\n display:flex;flex-direction:column;gap:8px;align-items:flex-end;\n pointer-events:none;\n}\n.dshpc-dock__ear{\n pointer-events:auto;display:inline-flex;align-items:center;justify-content:center;\n /* 与收起钮**同尺寸**(20×44,用户 2026-10-28 四轮):上/下/左描边,贴右缘的一侧不描。\n 实色底(--dshpc-plate),不用透明色 —— 透明底下透出东西很难看。\n padding-left:2px 是**视觉居中**:左侧是圆角,箭头往直线(右缘)那边挪 1px。 */\n width:20px;height:44px;box-sizing:border-box;padding:0 0 0 2px;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-left:1px solid var(--dshpc-border);\n border-right:none;\n border-radius:var(--dshpc-radius-sm) 0 0 var(--dshpc-radius-sm);\n background:var(--dshpc-plate);color:var(--dshpc-fg-2);\n cursor:pointer;font-family:inherit;line-height:1;\n animation:dshpc-ear-in .2s var(--dshpc-ease);\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n/* 入场:从右缘外滑进来,别「突然出现」(用户 2026-10-28)。 */\n@keyframes dshpc-ear-in{from{opacity:0;transform:translateX(14px)}}\n.dshpc-dock__ear:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__ear:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* 与收起钮的箭头同一字号(16px):收进去前后箭头一模一样大(用户 2026-10-28)。 */\n.dshpc-dock__ear-arrow{font-size:16px;color:var(--dshpc-fg-3)}\n.dshpc-dock__ear:hover .dshpc-dock__ear-arrow{color:var(--dshpc-fg)}\n/* 动效礼貌:系统声明减少动效时全部关掉,收起退化为瞬时、功能不受影响。 */\n@media (prefers-reduced-motion:reduce){\n .dshpc-dock__panel{animation:none}\n .dshpc-dock__panel--closing{transition:none}\n .dshpc-dock__ear{animation:none}\n}\n";
4
+ //# sourceMappingURL=panel-dock-css.generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-dock-css.generated.js","sourceRoot":"","sources":["../../../src/ui/layout/panel-dock-css.generated.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,qEAAqE;AACrE,MAAM,CAAC,MAAM,cAAc,GAAG,61JAA61J,CAAA"}
@@ -0,0 +1,4 @@
1
+ // PanelDock 样式(停靠栏 / 面板 / 拖拽条)。类名固定 dshpc-dock*;
2
+ // 颜色一律吃 token,深色由 design 的 token 深色段自动生效(不写死颜色值)。
3
+ export { PANEL_DOCK_CSS } from './panel-dock-css.generated.js';
4
+ //# sourceMappingURL=panel-dock-css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-dock-css.js","sourceRoot":"","sources":["../../../src/ui/layout/panel-dock-css.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,kDAAkD;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * 停靠面板的状态逻辑(纯函数,零 React / 零 DOM)。
3
+ *
4
+ * 只记三件事:**哪些面板开着**、**每栏多宽**、**哪些收起成了耳朵**。
5
+ * 内容与头部不在这里——那是调用方在页面里声明的东西(`<DockPanel id="…">…</DockPanel>`),
6
+ * 与 Ant Design `Tabs` 的 `activeKey` + `<TabPane>` 同一分工:
7
+ * **显隐归状态,结构归 children**。
8
+ *
9
+ * 口径(用户 2026-10-20 定案):
10
+ * · 组名 = 窗口,一对一:`open('A')` 再 `open('A')` 只是重复打开,不新增一栏;
11
+ * · 未到上限 ⇒ 追加;到上限 ⇒ 返回 `{ ok: false, reason: 'limit' }`,不静默丢弃;
12
+ * · 关一栏即腾位,之后可以开新组名;
13
+ * · 没有多份同名、没有自动淘汰、没有 tab 切换。
14
+ *
15
+ * 收起(用户 2026-10-28 定案)= **面板退出布局、换成一只独立的固定耳朵**,不是把栏宽缩细:
16
+ * · `collapsePanel` 把组名从 `ids` 移到 `collapsed`,**宽度留着**(展开要回到原宽);
17
+ * · 耳朵是另一块 fixed 浮层,不在这里表达布局——这里只记「谁收起了」。
18
+ */
19
+ /** 默认窗口的保留名:`open()` 不传 id 时用它。 */
20
+ export declare const DEFAULT_PANEL_ID = "default";
21
+ export interface DockState {
22
+ /** 打开顺序即数组顺序(稳定,不随重开变化)。 */
23
+ ids: string[];
24
+ /** 每栏宽度(px);没有记录的栏由组件用它的 `width` 兜底。 */
25
+ widths: Record<string, number>;
26
+ /** 已收起(变成右侧浮动耳朵)的组名,按收起顺序;宽度仍在 `widths` 里等展开还原。 */
27
+ collapsed: string[];
28
+ }
29
+ export type OpenResult = {
30
+ ok: true;
31
+ id: string;
32
+ created: boolean;
33
+ } | {
34
+ ok: false;
35
+ id: string;
36
+ reason: 'limit';
37
+ };
38
+ export declare function emptyDock(): DockState;
39
+ /** 夹到 [min, max];`max` 缺省表示不设上限。NaN / Infinity 一律落回 min。 */
40
+ export declare function clampWidth(value: number, min: number, max?: number): number;
41
+ export declare function isOpen(state: DockState, id: string): boolean;
42
+ export declare function isCollapsed(state: DockState, id: string): boolean;
43
+ /**
44
+ * 打开一栏。已开 ⇒ 原样返回(`created: false`,位置不变);
45
+ * 未开且已满 ⇒ 返回失败结果,状态不动。打开即撤销同名耳朵。
46
+ */
47
+ export declare function openPanel(state: DockState, id: string, maxPanels: number): {
48
+ state: DockState;
49
+ result: OpenResult;
50
+ };
51
+ /**
52
+ * 关一栏;不存在即原样返回(幂等)。宽度记忆随栏一起丢弃。
53
+ * 对已收起的耳朵也生效 —— 「关闭」= 彻底不留,耳朵一起抹掉(用户 2026-10-28 口径)。
54
+ */
55
+ export declare function closePanel(state: DockState, id: string): DockState;
56
+ /** 记某栏宽度(已夹过);值没变时原样返回,避免无谓重渲染。 */
57
+ export declare function setPanelWidth(state: DockState, id: string, width: number): DockState;
58
+ /**
59
+ * 收起一栏:退出布局(从 `ids` 移除,**立即不占宽**),转入耳朵列表。
60
+ * 宽度**不删**——耳朵展开时要回到原宽。只对开着的栏生效。
61
+ */
62
+ export declare function collapsePanel(state: DockState, id: string): DockState;
63
+ /** 展开耳朵:移出耳朵列表、回到打开列表末尾;宽度照旧(`collapsePanel` 没删)。 */
64
+ export declare function expandPanel(state: DockState, id: string): DockState;
65
+ /** 其他栏宽度之和(算「这一栏最多能拖多宽」用)。 */
66
+ export declare function othersWidth(state: DockState, id: string, fallbackOf: (panelId: string) => number): number;
67
+ //# sourceMappingURL=panel-dock-logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-dock-logic.d.ts","sourceRoot":"","sources":["../../../src/ui/layout/panel-dock-logic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,mCAAmC;AACnC,eAAO,MAAM,gBAAgB,YAAY,CAAA;AAEzC,MAAM,WAAW,SAAS;IACxB,4BAA4B;IAC5B,GAAG,EAAE,MAAM,EAAE,CAAA;IACb,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,mDAAmD;IACnD,SAAS,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC1C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAA;AAE9C,wBAAgB,SAAS,IAAI,SAAS,CAErC;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3E;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,SAAS,EAChB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAW1C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAWlE;AAED,mCAAmC;AACnC,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAIpF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAOrE;AAED,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAOnE;AAED,8BAA8B;AAC9B,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAKzG"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * 停靠面板的状态逻辑(纯函数,零 React / 零 DOM)。
3
+ *
4
+ * 只记三件事:**哪些面板开着**、**每栏多宽**、**哪些收起成了耳朵**。
5
+ * 内容与头部不在这里——那是调用方在页面里声明的东西(`<DockPanel id="…">…</DockPanel>`),
6
+ * 与 Ant Design `Tabs` 的 `activeKey` + `<TabPane>` 同一分工:
7
+ * **显隐归状态,结构归 children**。
8
+ *
9
+ * 口径(用户 2026-10-20 定案):
10
+ * · 组名 = 窗口,一对一:`open('A')` 再 `open('A')` 只是重复打开,不新增一栏;
11
+ * · 未到上限 ⇒ 追加;到上限 ⇒ 返回 `{ ok: false, reason: 'limit' }`,不静默丢弃;
12
+ * · 关一栏即腾位,之后可以开新组名;
13
+ * · 没有多份同名、没有自动淘汰、没有 tab 切换。
14
+ *
15
+ * 收起(用户 2026-10-28 定案)= **面板退出布局、换成一只独立的固定耳朵**,不是把栏宽缩细:
16
+ * · `collapsePanel` 把组名从 `ids` 移到 `collapsed`,**宽度留着**(展开要回到原宽);
17
+ * · 耳朵是另一块 fixed 浮层,不在这里表达布局——这里只记「谁收起了」。
18
+ */
19
+ /** 默认窗口的保留名:`open()` 不传 id 时用它。 */
20
+ export const DEFAULT_PANEL_ID = 'default';
21
+ export function emptyDock() {
22
+ return { ids: [], widths: {}, collapsed: [] };
23
+ }
24
+ /** 夹到 [min, max];`max` 缺省表示不设上限。NaN / Infinity 一律落回 min。 */
25
+ export function clampWidth(value, min, max) {
26
+ const wide = Number.isFinite(value) ? value : min;
27
+ const capped = max === undefined || !Number.isFinite(max) ? wide : Math.min(wide, max);
28
+ return Math.max(min, Math.round(capped));
29
+ }
30
+ export function isOpen(state, id) {
31
+ return state.ids.includes(id);
32
+ }
33
+ export function isCollapsed(state, id) {
34
+ return state.collapsed.includes(id);
35
+ }
36
+ /**
37
+ * 打开一栏。已开 ⇒ 原样返回(`created: false`,位置不变);
38
+ * 未开且已满 ⇒ 返回失败结果,状态不动。打开即撤销同名耳朵。
39
+ */
40
+ export function openPanel(state, id, maxPanels) {
41
+ if (isOpen(state, id))
42
+ return { state, result: { ok: true, id, created: false } };
43
+ if (state.ids.length >= maxPanels)
44
+ return { state, result: { ok: false, id, reason: 'limit' } };
45
+ return {
46
+ state: {
47
+ ids: [...state.ids, id],
48
+ widths: state.widths,
49
+ collapsed: state.collapsed.filter((item) => item !== id),
50
+ },
51
+ result: { ok: true, id, created: true },
52
+ };
53
+ }
54
+ /**
55
+ * 关一栏;不存在即原样返回(幂等)。宽度记忆随栏一起丢弃。
56
+ * 对已收起的耳朵也生效 —— 「关闭」= 彻底不留,耳朵一起抹掉(用户 2026-10-28 口径)。
57
+ */
58
+ export function closePanel(state, id) {
59
+ const open = isOpen(state, id);
60
+ const ear = isCollapsed(state, id);
61
+ if (!open && !ear)
62
+ return state;
63
+ const widths = { ...state.widths };
64
+ delete widths[id];
65
+ return {
66
+ ids: open ? state.ids.filter((item) => item !== id) : state.ids,
67
+ widths,
68
+ collapsed: ear ? state.collapsed.filter((item) => item !== id) : state.collapsed,
69
+ };
70
+ }
71
+ /** 记某栏宽度(已夹过);值没变时原样返回,避免无谓重渲染。 */
72
+ export function setPanelWidth(state, id, width) {
73
+ if (!isOpen(state, id))
74
+ return state;
75
+ if (state.widths[id] === width)
76
+ return state;
77
+ return { ids: state.ids, widths: { ...state.widths, [id]: width }, collapsed: state.collapsed };
78
+ }
79
+ /**
80
+ * 收起一栏:退出布局(从 `ids` 移除,**立即不占宽**),转入耳朵列表。
81
+ * 宽度**不删**——耳朵展开时要回到原宽。只对开着的栏生效。
82
+ */
83
+ export function collapsePanel(state, id) {
84
+ if (!isOpen(state, id))
85
+ return state;
86
+ return {
87
+ ids: state.ids.filter((item) => item !== id),
88
+ widths: state.widths,
89
+ collapsed: state.collapsed.includes(id) ? state.collapsed : [...state.collapsed, id],
90
+ };
91
+ }
92
+ /** 展开耳朵:移出耳朵列表、回到打开列表末尾;宽度照旧(`collapsePanel` 没删)。 */
93
+ export function expandPanel(state, id) {
94
+ if (!isCollapsed(state, id))
95
+ return state;
96
+ return {
97
+ ids: state.ids.includes(id) ? state.ids : [...state.ids, id],
98
+ widths: state.widths,
99
+ collapsed: state.collapsed.filter((item) => item !== id),
100
+ };
101
+ }
102
+ /** 其他栏宽度之和(算「这一栏最多能拖多宽」用)。 */
103
+ export function othersWidth(state, id, fallbackOf) {
104
+ return state.ids.reduce((sum, item) => {
105
+ if (item === id)
106
+ return sum;
107
+ return sum + (state.widths[item] ?? fallbackOf(item));
108
+ }, 0);
109
+ }
110
+ //# sourceMappingURL=panel-dock-logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-dock-logic.js","sourceRoot":"","sources":["../../../src/ui/layout/panel-dock-logic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,mCAAmC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAA;AAezC,MAAM,UAAU,SAAS;IACvB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAA;AAC/C,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,GAAW,EAAE,GAAY;IACjE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAA;IACjD,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACtF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAgB,EAAE,EAAU;IACjD,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAgB,EAAE,EAAU;IACtD,OAAO,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,KAAgB,EAChB,EAAU,EACV,SAAiB;IAEjB,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAA;IACjF,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAA;IAC/F,OAAO;QACL,KAAK,EAAE;YACL,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;YACvB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SACzD;QACD,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;KACxC,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAgB,EAAE,EAAU;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC9B,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAClC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IAC/B,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAA;IAClC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAA;IACjB,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;QAC/D,MAAM;QACN,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS;KACjF,CAAA;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,aAAa,CAAC,KAAgB,EAAE,EAAU,EAAE,KAAa;IACvE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QAAE,OAAO,KAAK,CAAA;IACpC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,KAAK;QAAE,OAAO,KAAK,CAAA;IAC5C,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAA;AACjG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAgB,EAAE,EAAU;IACxD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;QAAE,OAAO,KAAK,CAAA;IACpC,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QAC5C,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;KACrF,CAAA;AACH,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,WAAW,CAAC,KAAgB,EAAE,EAAU;IACtD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC;QAAE,OAAO,KAAK,CAAA;IACzC,OAAO;QACL,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;QAC5D,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;KACzD,CAAA;AACH,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU,WAAW,CAAC,KAAgB,EAAE,EAAU,EAAE,UAAuC;IAC/F,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACpC,IAAI,IAAI,KAAK,EAAE;YAAE,OAAO,GAAG,CAAA;QAC3B,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;IACvD,CAAC,EAAE,CAAC,CAAC,CAAA;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const QUICK_TOOLBAR_CSS = "/* \u5FEB\u6377\u5DE5\u5177\u680F\uFF1A\u53F3\u4FA7\u60AC\u6D6E\u7684\u4E00\u5217\u72EC\u7ACB\u5706\u94AE\u3002\n \u6A2A\u5411 left / right \u4E0E bottom\u3001\u6309\u94AE\u76F4\u5F84\u3001\u7EB5\u5411\u95F4\u8DDD\u7531\u7EC4\u4EF6\u6309 props \u5B9E\u65F6\u5199\u5165 style\uFF1B\n \u8FD9\u91CC\u53EA\u653E\u4E0E\u4F4D\u7F6E\u65E0\u5173\u7684\u76AE\u80A4\u3002 */\n.dshpc-quick-toolbar{\n position:fixed;\n z-index:var(--dshpc-z-dock);\n display:flex;\n flex-direction:column;\n align-items:center;\n}\n/* \u51FA\u73B0 / \u6D88\u5931\uFF1A\u6302\u8F7D\u5373\u6DE1\u5165\uFF0C\u9000\u573A\u5148\u64AD fade-out\uFF08\u7EC4\u4EF6\u5EF6\u8FDF\u5378\u8F7D\uFF0C\u89C1 QuickToolbar.ts\uFF09\u3002 */\n@keyframes dshpc-quick-toolbar-in{\n from{opacity:0;transform:translateY(6px) scale(.9);}\n to{opacity:1;transform:none;}\n}\n@keyframes dshpc-quick-toolbar-out{\n from{opacity:1;transform:none;}\n to{opacity:0;transform:translateY(6px) scale(.9);}\n}\n.dshpc-quick-toolbar__item{\n display:inline-flex;\n align-items:center;\n justify-content:center;\n padding:0;\n margin:0;\n box-sizing:border-box;\n border:1px solid var(--dshpc-border);\n border-radius:50%;\n /* \u81EA\u5B9A\u4E49\u5E95\u8272 / \u5B57\u8272\u53EA\u5199\u8FD9\u4E24\u4E2A\u53D8\u91CF\uFF08\u89C1 QuickToolbar.ts\uFF09\uFF0Chover/active \u624D\u80FD\u8DDF\u7740\u6DF7\u8272\u3002 */\n background:var(--dshpc-quick-toolbar-bg, var(--dshpc-solid));\n color:var(--dshpc-quick-toolbar-fg, var(--dshpc-on-solid));\n box-shadow:var(--dshpc-shadow-2);\n cursor:pointer;\n animation:dshpc-quick-toolbar-in var(--dshpc-dur) var(--dshpc-ease);\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),\n color var(--dshpc-dur-fast) var(--dshpc-ease),\n transform var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n/* \u9000\u573A\u671F\u4FDD\u7559\u5360\u4F4D\uFF0C\u907F\u514D\u540C\u5217\u5176\u4ED6\u6309\u94AE\u77AC\u65F6\u8DF3\u4F4D\u3002 */\n.dshpc-quick-toolbar__item.is-leaving{\n animation:dshpc-quick-toolbar-out var(--dshpc-dur) var(--dshpc-ease) forwards;\n pointer-events:none;\n}\n/* \u53D8\u8272\u4E0E\u6838\u5FC3 Button \u5B9E\u5FC3\u6863\u540C\u4E00\u5957\uFF1A\u6309 --dshpc-fg \u6DF7\u51FA hover / active \u5E95\u8272\uFF08\u81EA\u5B9A\u4E49 color \u4E5F\u8DDF\u968F\uFF09\u3002 */\n.dshpc-quick-toolbar__item:hover{\n background:color-mix(in srgb, var(--dshpc-quick-toolbar-bg, var(--dshpc-solid)) 82%, var(--dshpc-fg));\n}\n.dshpc-quick-toolbar__item:active{\n background:color-mix(in srgb, var(--dshpc-quick-toolbar-bg, var(--dshpc-solid)) 70%, var(--dshpc-fg));\n transform:scale(.94);\n}\n.dshpc-quick-toolbar__item:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:2px;}\n@media (prefers-reduced-motion: reduce){\n .dshpc-quick-toolbar__item{transition:none;transform:none;animation:none;}\n .dshpc-quick-toolbar__item.is-leaving{animation:none;opacity:0;}\n}\n";
2
+ //# sourceMappingURL=quick-toolbar-css.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick-toolbar-css.generated.d.ts","sourceRoot":"","sources":["../../../src/ui/layout/quick-toolbar-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,k3FAA+nE,CAAA"}