dsh-plugin-core 0.33.1 → 0.33.3

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 (665) hide show
  1. package/README.md +9 -9
  2. package/dist/adv/explorer/open.js +4 -4
  3. package/dist/adv/explorer/open.js.map +1 -1
  4. package/dist/adv/session/SessionViewModal.d.ts.map +1 -1
  5. package/dist/adv/session/SessionViewModal.js +6 -3
  6. package/dist/adv/session/SessionViewModal.js.map +1 -1
  7. package/dist/adv/session/mirror/ChatView.d.ts +1 -3
  8. package/dist/adv/session/mirror/ChatView.d.ts.map +1 -1
  9. package/dist/adv/session/mirror/ChatView.js +10 -36
  10. package/dist/adv/session/mirror/ChatView.js.map +1 -1
  11. package/dist/adv/session/mirror/GenericCommandCard.d.ts +6 -1
  12. package/dist/adv/session/mirror/GenericCommandCard.d.ts.map +1 -1
  13. package/dist/adv/session/mirror/GenericCommandCard.js +8 -3
  14. package/dist/adv/session/mirror/GenericCommandCard.js.map +1 -1
  15. package/dist/adv/session/mirror/MessageItem.d.ts +4 -3
  16. package/dist/adv/session/mirror/MessageItem.d.ts.map +1 -1
  17. package/dist/adv/session/mirror/MessageItem.js +19 -9
  18. package/dist/adv/session/mirror/MessageItem.js.map +1 -1
  19. package/dist/{session/mirror/BashRow.d.ts → adv/session/mirror/SkillRow.d.ts} +4 -5
  20. package/dist/adv/session/mirror/SkillRow.d.ts.map +1 -0
  21. package/dist/adv/session/mirror/SkillRow.js +86 -0
  22. package/dist/adv/session/mirror/SkillRow.js.map +1 -0
  23. package/dist/adv/session/official-classes.d.ts +3 -1
  24. package/dist/adv/session/official-classes.d.ts.map +1 -1
  25. package/dist/adv/session/official-classes.js +33 -32
  26. package/dist/adv/session/official-classes.js.map +1 -1
  27. package/dist/ui/feedback/host-toast.d.ts +1 -1
  28. package/dist/ui/feedback/host-toast.js +1 -1
  29. package/dist/utils/i18n.d.ts +1 -1
  30. package/dist/utils/i18n.d.ts.map +1 -1
  31. package/dist/utils/i18n.js +12 -0
  32. package/dist/utils/i18n.js.map +1 -1
  33. package/docs/design/external/dsh-host.md +33 -0
  34. package/docs/help/explorer.doc.ts +1 -1
  35. package/docs/help/explorer.md +1 -1
  36. package/docs/help/integration.doc.ts +2 -2
  37. package/docs/help/integration.md +2 -2
  38. package/docs/help/session.doc.ts +1 -1
  39. package/docs/help/session.md +1 -1
  40. package/docs/help/ui.doc.ts +1 -1
  41. package/docs/help/ui.md +1 -1
  42. package/package.json +16 -16
  43. package/dist/explorer/ExplorerPanel.d.ts +0 -25
  44. package/dist/explorer/ExplorerPanel.d.ts.map +0 -1
  45. package/dist/explorer/ExplorerPanel.js +0 -111
  46. package/dist/explorer/ExplorerPanel.js.map +0 -1
  47. package/dist/explorer/FileBrowser.d.ts +0 -58
  48. package/dist/explorer/FileBrowser.d.ts.map +0 -1
  49. package/dist/explorer/FileBrowser.js +0 -632
  50. package/dist/explorer/FileBrowser.js.map +0 -1
  51. package/dist/explorer/crumb-nav.d.ts +0 -45
  52. package/dist/explorer/crumb-nav.d.ts.map +0 -1
  53. package/dist/explorer/crumb-nav.js +0 -78
  54. package/dist/explorer/crumb-nav.js.map +0 -1
  55. package/dist/explorer/crumbs-menu.d.ts +0 -37
  56. package/dist/explorer/crumbs-menu.d.ts.map +0 -1
  57. package/dist/explorer/crumbs-menu.js +0 -102
  58. package/dist/explorer/crumbs-menu.js.map +0 -1
  59. package/dist/explorer/explorer-css.d.ts +0 -2
  60. package/dist/explorer/explorer-css.d.ts.map +0 -1
  61. package/dist/explorer/explorer-css.generated.d.ts +0 -2
  62. package/dist/explorer/explorer-css.generated.d.ts.map +0 -1
  63. package/dist/explorer/explorer-css.generated.js +0 -4
  64. package/dist/explorer/explorer-css.generated.js.map +0 -1
  65. package/dist/explorer/explorer-css.js +0 -3
  66. package/dist/explorer/explorer-css.js.map +0 -1
  67. package/dist/explorer/fs-face.d.ts +0 -36
  68. package/dist/explorer/fs-face.d.ts.map +0 -1
  69. package/dist/explorer/fs-face.js +0 -74
  70. package/dist/explorer/fs-face.js.map +0 -1
  71. package/dist/explorer/index.d.ts +0 -6
  72. package/dist/explorer/index.d.ts.map +0 -1
  73. package/dist/explorer/index.js +0 -6
  74. package/dist/explorer/index.js.map +0 -1
  75. package/dist/explorer/landing.d.ts +0 -26
  76. package/dist/explorer/landing.d.ts.map +0 -1
  77. package/dist/explorer/landing.js +0 -43
  78. package/dist/explorer/landing.js.map +0 -1
  79. package/dist/explorer/open.d.ts +0 -137
  80. package/dist/explorer/open.d.ts.map +0 -1
  81. package/dist/explorer/open.js +0 -350
  82. package/dist/explorer/open.js.map +0 -1
  83. package/dist/explorer/picker-placement.d.ts +0 -69
  84. package/dist/explorer/picker-placement.d.ts.map +0 -1
  85. package/dist/explorer/picker-placement.js +0 -122
  86. package/dist/explorer/picker-placement.js.map +0 -1
  87. package/dist/explorer/preview/BytesPreview.d.ts +0 -12
  88. package/dist/explorer/preview/BytesPreview.d.ts.map +0 -1
  89. package/dist/explorer/preview/BytesPreview.js +0 -60
  90. package/dist/explorer/preview/BytesPreview.js.map +0 -1
  91. package/dist/explorer/preview/HtmlPreview.d.ts +0 -17
  92. package/dist/explorer/preview/HtmlPreview.d.ts.map +0 -1
  93. package/dist/explorer/preview/HtmlPreview.js +0 -113
  94. package/dist/explorer/preview/HtmlPreview.js.map +0 -1
  95. package/dist/explorer/preview/OfficePreview.d.ts +0 -12
  96. package/dist/explorer/preview/OfficePreview.d.ts.map +0 -1
  97. package/dist/explorer/preview/OfficePreview.js +0 -63
  98. package/dist/explorer/preview/OfficePreview.js.map +0 -1
  99. package/dist/explorer/preview/TextPreview.d.ts +0 -18
  100. package/dist/explorer/preview/TextPreview.d.ts.map +0 -1
  101. package/dist/explorer/preview/TextPreview.js +0 -122
  102. package/dist/explorer/preview/TextPreview.js.map +0 -1
  103. package/dist/explorer/preview/index.d.ts +0 -24
  104. package/dist/explorer/preview/index.d.ts.map +0 -1
  105. package/dist/explorer/preview/index.js +0 -58
  106. package/dist/explorer/preview/index.js.map +0 -1
  107. package/dist/explorer/preview/md-labels.d.ts +0 -3
  108. package/dist/explorer/preview/md-labels.d.ts.map +0 -1
  109. package/dist/explorer/preview/md-labels.js +0 -12
  110. package/dist/explorer/preview/md-labels.js.map +0 -1
  111. package/dist/explorer/preview-title-bar.d.ts +0 -26
  112. package/dist/explorer/preview-title-bar.d.ts.map +0 -1
  113. package/dist/explorer/preview-title-bar.js +0 -48
  114. package/dist/explorer/preview-title-bar.js.map +0 -1
  115. package/dist/explorer/types.d.ts +0 -259
  116. package/dist/explorer/types.d.ts.map +0 -1
  117. package/dist/explorer/types.js +0 -379
  118. package/dist/explorer/types.js.map +0 -1
  119. package/dist/session/SessionViewModal.d.ts +0 -37
  120. package/dist/session/SessionViewModal.d.ts.map +0 -1
  121. package/dist/session/SessionViewModal.js +0 -1133
  122. package/dist/session/SessionViewModal.js.map +0 -1
  123. package/dist/session/changes.d.ts +0 -73
  124. package/dist/session/changes.d.ts.map +0 -1
  125. package/dist/session/changes.js +0 -134
  126. package/dist/session/changes.js.map +0 -1
  127. package/dist/session/faces.d.ts +0 -244
  128. package/dist/session/faces.d.ts.map +0 -1
  129. package/dist/session/faces.js +0 -17
  130. package/dist/session/faces.js.map +0 -1
  131. package/dist/session/index.d.ts +0 -7
  132. package/dist/session/index.d.ts.map +0 -1
  133. package/dist/session/index.js +0 -27
  134. package/dist/session/index.js.map +0 -1
  135. package/dist/session/mirror/AskCard.d.ts +0 -35
  136. package/dist/session/mirror/AskCard.d.ts.map +0 -1
  137. package/dist/session/mirror/AskCard.js +0 -131
  138. package/dist/session/mirror/AskCard.js.map +0 -1
  139. package/dist/session/mirror/BashRow.d.ts.map +0 -1
  140. package/dist/session/mirror/BashRow.js +0 -143
  141. package/dist/session/mirror/BashRow.js.map +0 -1
  142. package/dist/session/mirror/ChangedFileDiff.d.ts +0 -25
  143. package/dist/session/mirror/ChangedFileDiff.d.ts.map +0 -1
  144. package/dist/session/mirror/ChangedFileDiff.js +0 -178
  145. package/dist/session/mirror/ChangedFileDiff.js.map +0 -1
  146. package/dist/session/mirror/ChangedFilesCard.d.ts +0 -18
  147. package/dist/session/mirror/ChangedFilesCard.d.ts.map +0 -1
  148. package/dist/session/mirror/ChangedFilesCard.js +0 -165
  149. package/dist/session/mirror/ChangedFilesCard.js.map +0 -1
  150. package/dist/session/mirror/ChatGroupSeat.d.ts +0 -24
  151. package/dist/session/mirror/ChatGroupSeat.d.ts.map +0 -1
  152. package/dist/session/mirror/ChatGroupSeat.js +0 -135
  153. package/dist/session/mirror/ChatGroupSeat.js.map +0 -1
  154. package/dist/session/mirror/ChatNodeSeat.d.ts +0 -43
  155. package/dist/session/mirror/ChatNodeSeat.d.ts.map +0 -1
  156. package/dist/session/mirror/ChatNodeSeat.js +0 -133
  157. package/dist/session/mirror/ChatNodeSeat.js.map +0 -1
  158. package/dist/session/mirror/ChatView.d.ts +0 -47
  159. package/dist/session/mirror/ChatView.d.ts.map +0 -1
  160. package/dist/session/mirror/ChatView.js +0 -138
  161. package/dist/session/mirror/ChatView.js.map +0 -1
  162. package/dist/session/mirror/CommandCard.d.ts +0 -20
  163. package/dist/session/mirror/CommandCard.d.ts.map +0 -1
  164. package/dist/session/mirror/CommandCard.js +0 -69
  165. package/dist/session/mirror/CommandCard.js.map +0 -1
  166. package/dist/session/mirror/ContextInjectionRow.d.ts +0 -18
  167. package/dist/session/mirror/ContextInjectionRow.d.ts.map +0 -1
  168. package/dist/session/mirror/ContextInjectionRow.js +0 -50
  169. package/dist/session/mirror/ContextInjectionRow.js.map +0 -1
  170. package/dist/session/mirror/Deliverables.d.ts +0 -24
  171. package/dist/session/mirror/Deliverables.d.ts.map +0 -1
  172. package/dist/session/mirror/Deliverables.js +0 -175
  173. package/dist/session/mirror/Deliverables.js.map +0 -1
  174. package/dist/session/mirror/GenericCommandCard.d.ts +0 -136
  175. package/dist/session/mirror/GenericCommandCard.d.ts.map +0 -1
  176. package/dist/session/mirror/GenericCommandCard.js +0 -948
  177. package/dist/session/mirror/GenericCommandCard.js.map +0 -1
  178. package/dist/session/mirror/MessageIconActions.d.ts +0 -16
  179. package/dist/session/mirror/MessageIconActions.d.ts.map +0 -1
  180. package/dist/session/mirror/MessageIconActions.js +0 -69
  181. package/dist/session/mirror/MessageIconActions.js.map +0 -1
  182. package/dist/session/mirror/MessageItem.d.ts +0 -93
  183. package/dist/session/mirror/MessageItem.d.ts.map +0 -1
  184. package/dist/session/mirror/MessageItem.js +0 -194
  185. package/dist/session/mirror/MessageItem.js.map +0 -1
  186. package/dist/session/mirror/ReasoningRow.d.ts +0 -11
  187. package/dist/session/mirror/ReasoningRow.d.ts.map +0 -1
  188. package/dist/session/mirror/ReasoningRow.js +0 -111
  189. package/dist/session/mirror/ReasoningRow.js.map +0 -1
  190. package/dist/session/mirror/RunningStatus.d.ts +0 -12
  191. package/dist/session/mirror/RunningStatus.d.ts.map +0 -1
  192. package/dist/session/mirror/RunningStatus.js +0 -57
  193. package/dist/session/mirror/RunningStatus.js.map +0 -1
  194. package/dist/session/mirror/StatDialog.d.ts +0 -20
  195. package/dist/session/mirror/StatDialog.d.ts.map +0 -1
  196. package/dist/session/mirror/StatDialog.js +0 -49
  197. package/dist/session/mirror/StatDialog.js.map +0 -1
  198. package/dist/session/mirror/ToolDetails.d.ts +0 -65
  199. package/dist/session/mirror/ToolDetails.d.ts.map +0 -1
  200. package/dist/session/mirror/ToolDetails.js +0 -268
  201. package/dist/session/mirror/ToolDetails.js.map +0 -1
  202. package/dist/session/mirror/TurnProcessNodeView.d.ts +0 -10
  203. package/dist/session/mirror/TurnProcessNodeView.d.ts.map +0 -1
  204. package/dist/session/mirror/TurnProcessNodeView.js +0 -57
  205. package/dist/session/mirror/TurnProcessNodeView.js.map +0 -1
  206. package/dist/session/mirror/TurnTailNodeView.d.ts +0 -57
  207. package/dist/session/mirror/TurnTailNodeView.d.ts.map +0 -1
  208. package/dist/session/mirror/TurnTailNodeView.js +0 -106
  209. package/dist/session/mirror/TurnTailNodeView.js.map +0 -1
  210. package/dist/session/mirror/TurnTriggerNodeView.d.ts +0 -16
  211. package/dist/session/mirror/TurnTriggerNodeView.d.ts.map +0 -1
  212. package/dist/session/mirror/TurnTriggerNodeView.js +0 -103
  213. package/dist/session/mirror/TurnTriggerNodeView.js.map +0 -1
  214. package/dist/session/mirror/TurnUsagePanel.d.ts +0 -21
  215. package/dist/session/mirror/TurnUsagePanel.d.ts.map +0 -1
  216. package/dist/session/mirror/TurnUsagePanel.js +0 -41
  217. package/dist/session/mirror/TurnUsagePanel.js.map +0 -1
  218. package/dist/session/mirror/control-details.d.ts +0 -9
  219. package/dist/session/mirror/control-details.d.ts.map +0 -1
  220. package/dist/session/mirror/control-details.js +0 -549
  221. package/dist/session/mirror/control-details.js.map +0 -1
  222. package/dist/session/mirror/detail-i18n.d.ts +0 -4
  223. package/dist/session/mirror/detail-i18n.d.ts.map +0 -1
  224. package/dist/session/mirror/detail-i18n.js +0 -153
  225. package/dist/session/mirror/detail-i18n.js.map +0 -1
  226. package/dist/session/mirror/message-chrome.d.ts +0 -39
  227. package/dist/session/mirror/message-chrome.d.ts.map +0 -1
  228. package/dist/session/mirror/message-chrome.js +0 -153
  229. package/dist/session/mirror/message-chrome.js.map +0 -1
  230. package/dist/session/mirror/process-groups.d.ts +0 -56
  231. package/dist/session/mirror/process-groups.d.ts.map +0 -1
  232. package/dist/session/mirror/process-groups.js +0 -202
  233. package/dist/session/mirror/process-groups.js.map +0 -1
  234. package/dist/session/official-classes.d.ts +0 -28
  235. package/dist/session/official-classes.d.ts.map +0 -1
  236. package/dist/session/official-classes.js +0 -152
  237. package/dist/session/official-classes.js.map +0 -1
  238. package/dist/session/open-review.d.ts +0 -13
  239. package/dist/session/open-review.d.ts.map +0 -1
  240. package/dist/session/open-review.js +0 -32
  241. package/dist/session/open-review.js.map +0 -1
  242. package/dist/session/open-session-view.d.ts +0 -19
  243. package/dist/session/open-session-view.d.ts.map +0 -1
  244. package/dist/session/open-session-view.js +0 -147
  245. package/dist/session/open-session-view.js.map +0 -1
  246. package/dist/session/pending-inputs.d.ts +0 -33
  247. package/dist/session/pending-inputs.d.ts.map +0 -1
  248. package/dist/session/pending-inputs.js +0 -130
  249. package/dist/session/pending-inputs.js.map +0 -1
  250. package/dist/session/session-css.d.ts +0 -2
  251. package/dist/session/session-css.d.ts.map +0 -1
  252. package/dist/session/session-css.generated.d.ts +0 -2
  253. package/dist/session/session-css.generated.d.ts.map +0 -1
  254. package/dist/session/session-css.generated.js +0 -4
  255. package/dist/session/session-css.generated.js.map +0 -1
  256. package/dist/session/session-css.js +0 -3
  257. package/dist/session/session-css.js.map +0 -1
  258. package/dist/session/tail-follow.d.ts +0 -29
  259. package/dist/session/tail-follow.d.ts.map +0 -1
  260. package/dist/session/tail-follow.js +0 -106
  261. package/dist/session/tail-follow.js.map +0 -1
  262. package/dist/session/types.d.ts +0 -28
  263. package/dist/session/types.d.ts.map +0 -1
  264. package/dist/session/types.js +0 -12
  265. package/dist/session/types.js.map +0 -1
  266. package/dist/ui/AlertModal.d.ts +0 -41
  267. package/dist/ui/AlertModal.d.ts.map +0 -1
  268. package/dist/ui/AlertModal.js +0 -45
  269. package/dist/ui/AlertModal.js.map +0 -1
  270. package/dist/ui/Button.d.ts +0 -102
  271. package/dist/ui/Button.d.ts.map +0 -1
  272. package/dist/ui/Button.js +0 -233
  273. package/dist/ui/Button.js.map +0 -1
  274. package/dist/ui/Card.d.ts +0 -65
  275. package/dist/ui/Card.d.ts.map +0 -1
  276. package/dist/ui/Card.js +0 -109
  277. package/dist/ui/Card.js.map +0 -1
  278. package/dist/ui/Checkbox.d.ts +0 -24
  279. package/dist/ui/Checkbox.d.ts.map +0 -1
  280. package/dist/ui/Checkbox.js +0 -35
  281. package/dist/ui/Checkbox.js.map +0 -1
  282. package/dist/ui/Chip.d.ts +0 -28
  283. package/dist/ui/Chip.d.ts.map +0 -1
  284. package/dist/ui/Chip.js +0 -36
  285. package/dist/ui/Chip.js.map +0 -1
  286. package/dist/ui/CodeViewer.d.ts +0 -38
  287. package/dist/ui/CodeViewer.d.ts.map +0 -1
  288. package/dist/ui/CodeViewer.js +0 -107
  289. package/dist/ui/CodeViewer.js.map +0 -1
  290. package/dist/ui/ConfirmModal.d.ts +0 -50
  291. package/dist/ui/ConfirmModal.d.ts.map +0 -1
  292. package/dist/ui/ConfirmModal.js +0 -47
  293. package/dist/ui/ConfirmModal.js.map +0 -1
  294. package/dist/ui/DateTimePicker.d.ts +0 -45
  295. package/dist/ui/DateTimePicker.d.ts.map +0 -1
  296. package/dist/ui/DateTimePicker.js +0 -462
  297. package/dist/ui/DateTimePicker.js.map +0 -1
  298. package/dist/ui/EmptyState.d.ts +0 -12
  299. package/dist/ui/EmptyState.d.ts.map +0 -1
  300. package/dist/ui/EmptyState.js +0 -10
  301. package/dist/ui/EmptyState.js.map +0 -1
  302. package/dist/ui/Field.d.ts +0 -125
  303. package/dist/ui/Field.d.ts.map +0 -1
  304. package/dist/ui/Field.js +0 -175
  305. package/dist/ui/Field.js.map +0 -1
  306. package/dist/ui/FieldHint.d.ts +0 -18
  307. package/dist/ui/FieldHint.d.ts.map +0 -1
  308. package/dist/ui/FieldHint.js +0 -40
  309. package/dist/ui/FieldHint.js.map +0 -1
  310. package/dist/ui/FlipText.d.ts +0 -43
  311. package/dist/ui/FlipText.d.ts.map +0 -1
  312. package/dist/ui/FlipText.js +0 -59
  313. package/dist/ui/FlipText.js.map +0 -1
  314. package/dist/ui/InputGroup.d.ts +0 -91
  315. package/dist/ui/InputGroup.d.ts.map +0 -1
  316. package/dist/ui/InputGroup.js +0 -125
  317. package/dist/ui/InputGroup.js.map +0 -1
  318. package/dist/ui/LiveText.d.ts +0 -13
  319. package/dist/ui/LiveText.d.ts.map +0 -1
  320. package/dist/ui/LiveText.js +0 -19
  321. package/dist/ui/LiveText.js.map +0 -1
  322. package/dist/ui/Loader.d.ts +0 -49
  323. package/dist/ui/Loader.d.ts.map +0 -1
  324. package/dist/ui/Loader.js +0 -79
  325. package/dist/ui/Loader.js.map +0 -1
  326. package/dist/ui/LoaderBar.d.ts +0 -38
  327. package/dist/ui/LoaderBar.d.ts.map +0 -1
  328. package/dist/ui/LoaderBar.js +0 -79
  329. package/dist/ui/LoaderBar.js.map +0 -1
  330. package/dist/ui/Loading.d.ts +0 -69
  331. package/dist/ui/Loading.d.ts.map +0 -1
  332. package/dist/ui/Loading.js +0 -164
  333. package/dist/ui/Loading.js.map +0 -1
  334. package/dist/ui/MarqueeText.d.ts +0 -22
  335. package/dist/ui/MarqueeText.d.ts.map +0 -1
  336. package/dist/ui/MarqueeText.js +0 -52
  337. package/dist/ui/MarqueeText.js.map +0 -1
  338. package/dist/ui/Modal.d.ts +0 -73
  339. package/dist/ui/Modal.d.ts.map +0 -1
  340. package/dist/ui/Modal.js +0 -83
  341. package/dist/ui/Modal.js.map +0 -1
  342. package/dist/ui/ModelPicker.d.ts +0 -48
  343. package/dist/ui/ModelPicker.d.ts.map +0 -1
  344. package/dist/ui/ModelPicker.js +0 -101
  345. package/dist/ui/ModelPicker.js.map +0 -1
  346. package/dist/ui/Pagination.d.ts +0 -59
  347. package/dist/ui/Pagination.d.ts.map +0 -1
  348. package/dist/ui/Pagination.js +0 -112
  349. package/dist/ui/Pagination.js.map +0 -1
  350. package/dist/ui/PanelDock.d.ts +0 -132
  351. package/dist/ui/PanelDock.d.ts.map +0 -1
  352. package/dist/ui/PanelDock.js +0 -390
  353. package/dist/ui/PanelDock.js.map +0 -1
  354. package/dist/ui/Picker.d.ts +0 -56
  355. package/dist/ui/Picker.d.ts.map +0 -1
  356. package/dist/ui/Picker.js +0 -244
  357. package/dist/ui/Picker.js.map +0 -1
  358. package/dist/ui/QuickToolbar.d.ts +0 -54
  359. package/dist/ui/QuickToolbar.d.ts.map +0 -1
  360. package/dist/ui/QuickToolbar.js +0 -254
  361. package/dist/ui/QuickToolbar.js.map +0 -1
  362. package/dist/ui/SectionHead.d.ts +0 -35
  363. package/dist/ui/SectionHead.d.ts.map +0 -1
  364. package/dist/ui/SectionHead.js +0 -45
  365. package/dist/ui/SectionHead.js.map +0 -1
  366. package/dist/ui/Segmented.d.ts +0 -99
  367. package/dist/ui/Segmented.d.ts.map +0 -1
  368. package/dist/ui/Segmented.js +0 -135
  369. package/dist/ui/Segmented.js.map +0 -1
  370. package/dist/ui/SideSheet.d.ts +0 -70
  371. package/dist/ui/SideSheet.d.ts.map +0 -1
  372. package/dist/ui/SideSheet.js +0 -130
  373. package/dist/ui/SideSheet.js.map +0 -1
  374. package/dist/ui/SplitGroup.d.ts +0 -37
  375. package/dist/ui/SplitGroup.d.ts.map +0 -1
  376. package/dist/ui/SplitGroup.js +0 -36
  377. package/dist/ui/SplitGroup.js.map +0 -1
  378. package/dist/ui/Surface.d.ts +0 -43
  379. package/dist/ui/Surface.d.ts.map +0 -1
  380. package/dist/ui/Surface.js +0 -39
  381. package/dist/ui/Surface.js.map +0 -1
  382. package/dist/ui/Table.d.ts +0 -30
  383. package/dist/ui/Table.d.ts.map +0 -1
  384. package/dist/ui/Table.js +0 -96
  385. package/dist/ui/Table.js.map +0 -1
  386. package/dist/ui/Textarea.d.ts +0 -36
  387. package/dist/ui/Textarea.d.ts.map +0 -1
  388. package/dist/ui/Textarea.js +0 -35
  389. package/dist/ui/Textarea.js.map +0 -1
  390. package/dist/ui/Toast.d.ts +0 -45
  391. package/dist/ui/Toast.d.ts.map +0 -1
  392. package/dist/ui/Toast.js +0 -225
  393. package/dist/ui/Toast.js.map +0 -1
  394. package/dist/ui/WorkspacePicker.d.ts +0 -35
  395. package/dist/ui/WorkspacePicker.d.ts.map +0 -1
  396. package/dist/ui/WorkspacePicker.js +0 -39
  397. package/dist/ui/WorkspacePicker.js.map +0 -1
  398. package/dist/ui/card-css.d.ts +0 -2
  399. package/dist/ui/card-css.d.ts.map +0 -1
  400. package/dist/ui/card-css.generated.d.ts +0 -2
  401. package/dist/ui/card-css.generated.d.ts.map +0 -1
  402. package/dist/ui/card-css.generated.js +0 -4
  403. package/dist/ui/card-css.generated.js.map +0 -1
  404. package/dist/ui/card-css.js +0 -5
  405. package/dist/ui/card-css.js.map +0 -1
  406. package/dist/ui/chevron.d.ts +0 -22
  407. package/dist/ui/chevron.d.ts.map +0 -1
  408. package/dist/ui/chevron.js +0 -33
  409. package/dist/ui/chevron.js.map +0 -1
  410. package/dist/ui/chip-css.d.ts +0 -2
  411. package/dist/ui/chip-css.d.ts.map +0 -1
  412. package/dist/ui/chip-css.generated.d.ts +0 -2
  413. package/dist/ui/chip-css.generated.d.ts.map +0 -1
  414. package/dist/ui/chip-css.generated.js +0 -4
  415. package/dist/ui/chip-css.generated.js.map +0 -1
  416. package/dist/ui/chip-css.js +0 -12
  417. package/dist/ui/chip-css.js.map +0 -1
  418. package/dist/ui/code-viewer-css.d.ts +0 -2
  419. package/dist/ui/code-viewer-css.d.ts.map +0 -1
  420. package/dist/ui/code-viewer-css.generated.d.ts +0 -2
  421. package/dist/ui/code-viewer-css.generated.d.ts.map +0 -1
  422. package/dist/ui/code-viewer-css.generated.js +0 -4
  423. package/dist/ui/code-viewer-css.generated.js.map +0 -1
  424. package/dist/ui/code-viewer-css.js +0 -3
  425. package/dist/ui/code-viewer-css.js.map +0 -1
  426. package/dist/ui/code-viewer-lang.d.ts +0 -15
  427. package/dist/ui/code-viewer-lang.d.ts.map +0 -1
  428. package/dist/ui/code-viewer-lang.js +0 -190
  429. package/dist/ui/code-viewer-lang.js.map +0 -1
  430. package/dist/ui/code-viewer-theme.d.ts +0 -5
  431. package/dist/ui/code-viewer-theme.d.ts.map +0 -1
  432. package/dist/ui/code-viewer-theme.js +0 -138
  433. package/dist/ui/code-viewer-theme.js.map +0 -1
  434. package/dist/ui/controls/button-css.generated.d.ts +0 -2
  435. package/dist/ui/controls/button-css.generated.d.ts.map +0 -1
  436. package/dist/ui/controls/button-css.generated.js +0 -4
  437. package/dist/ui/controls/button-css.generated.js.map +0 -1
  438. package/dist/ui/controls/datetime-css.generated.d.ts +0 -2
  439. package/dist/ui/controls/datetime-css.generated.d.ts.map +0 -1
  440. package/dist/ui/controls/datetime-css.generated.js +0 -4
  441. package/dist/ui/controls/datetime-css.generated.js.map +0 -1
  442. package/dist/ui/controls/field-css.generated.d.ts +0 -2
  443. package/dist/ui/controls/field-css.generated.d.ts.map +0 -1
  444. package/dist/ui/controls/field-css.generated.js +0 -4
  445. package/dist/ui/controls/field-css.generated.js.map +0 -1
  446. package/dist/ui/controls/hint-css.generated.d.ts +0 -2
  447. package/dist/ui/controls/hint-css.generated.d.ts.map +0 -1
  448. package/dist/ui/controls/hint-css.generated.js +0 -4
  449. package/dist/ui/controls/hint-css.generated.js.map +0 -1
  450. package/dist/ui/controls/input-group-css.generated.d.ts +0 -2
  451. package/dist/ui/controls/input-group-css.generated.d.ts.map +0 -1
  452. package/dist/ui/controls/input-group-css.generated.js +0 -4
  453. package/dist/ui/controls/input-group-css.generated.js.map +0 -1
  454. package/dist/ui/controls/loader-bar-css.generated.d.ts +0 -2
  455. package/dist/ui/controls/loader-bar-css.generated.d.ts.map +0 -1
  456. package/dist/ui/controls/loader-bar-css.generated.js +0 -4
  457. package/dist/ui/controls/loader-bar-css.generated.js.map +0 -1
  458. package/dist/ui/controls/loader-css.generated.d.ts +0 -2
  459. package/dist/ui/controls/loader-css.generated.d.ts.map +0 -1
  460. package/dist/ui/controls/loader-css.generated.js +0 -4
  461. package/dist/ui/controls/loader-css.generated.js.map +0 -1
  462. package/dist/ui/controls/loading-css.generated.d.ts +0 -2
  463. package/dist/ui/controls/loading-css.generated.d.ts.map +0 -1
  464. package/dist/ui/controls/loading-css.generated.js +0 -4
  465. package/dist/ui/controls/loading-css.generated.js.map +0 -1
  466. package/dist/ui/controls/pagination-css.generated.d.ts +0 -2
  467. package/dist/ui/controls/pagination-css.generated.d.ts.map +0 -1
  468. package/dist/ui/controls/pagination-css.generated.js +0 -4
  469. package/dist/ui/controls/pagination-css.generated.js.map +0 -1
  470. package/dist/ui/controls/quick-toolbar-css.generated.d.ts +0 -2
  471. package/dist/ui/controls/quick-toolbar-css.generated.d.ts.map +0 -1
  472. package/dist/ui/controls/quick-toolbar-css.generated.js +0 -4
  473. package/dist/ui/controls/quick-toolbar-css.generated.js.map +0 -1
  474. package/dist/ui/controls/section-head-css.generated.d.ts +0 -2
  475. package/dist/ui/controls/section-head-css.generated.d.ts.map +0 -1
  476. package/dist/ui/controls/section-head-css.generated.js +0 -4
  477. package/dist/ui/controls/section-head-css.generated.js.map +0 -1
  478. package/dist/ui/controls/segmented-css.generated.d.ts +0 -2
  479. package/dist/ui/controls/segmented-css.generated.d.ts.map +0 -1
  480. package/dist/ui/controls/segmented-css.generated.js +0 -4
  481. package/dist/ui/controls/segmented-css.generated.js.map +0 -1
  482. package/dist/ui/controls/split-group-css.generated.d.ts +0 -2
  483. package/dist/ui/controls/split-group-css.generated.d.ts.map +0 -1
  484. package/dist/ui/controls/split-group-css.generated.js +0 -4
  485. package/dist/ui/controls/split-group-css.generated.js.map +0 -1
  486. package/dist/ui/controls/table-css.generated.d.ts +0 -2
  487. package/dist/ui/controls/table-css.generated.d.ts.map +0 -1
  488. package/dist/ui/controls/table-css.generated.js +0 -4
  489. package/dist/ui/controls/table-css.generated.js.map +0 -1
  490. package/dist/ui/controls/table-plain-css.generated.d.ts +0 -2
  491. package/dist/ui/controls/table-plain-css.generated.d.ts.map +0 -1
  492. package/dist/ui/controls/table-plain-css.generated.js +0 -4
  493. package/dist/ui/controls/table-plain-css.generated.js.map +0 -1
  494. package/dist/ui/controls-css.d.ts +0 -16
  495. package/dist/ui/controls-css.d.ts.map +0 -1
  496. package/dist/ui/controls-css.js +0 -26
  497. package/dist/ui/controls-css.js.map +0 -1
  498. package/dist/ui/css.d.ts +0 -35
  499. package/dist/ui/css.d.ts.map +0 -1
  500. package/dist/ui/css.js +0 -52
  501. package/dist/ui/css.js.map +0 -1
  502. package/dist/ui/datetime-logic.d.ts +0 -102
  503. package/dist/ui/datetime-logic.d.ts.map +0 -1
  504. package/dist/ui/datetime-logic.js +0 -200
  505. package/dist/ui/datetime-logic.js.map +0 -1
  506. package/dist/ui/feedback-css.d.ts +0 -2
  507. package/dist/ui/feedback-css.d.ts.map +0 -1
  508. package/dist/ui/feedback-css.generated.d.ts +0 -2
  509. package/dist/ui/feedback-css.generated.d.ts.map +0 -1
  510. package/dist/ui/feedback-css.generated.js +0 -4
  511. package/dist/ui/feedback-css.generated.js.map +0 -1
  512. package/dist/ui/feedback-css.js +0 -4
  513. package/dist/ui/feedback-css.js.map +0 -1
  514. package/dist/ui/flip-css.d.ts +0 -2
  515. package/dist/ui/flip-css.d.ts.map +0 -1
  516. package/dist/ui/flip-css.generated.d.ts +0 -2
  517. package/dist/ui/flip-css.generated.d.ts.map +0 -1
  518. package/dist/ui/flip-css.generated.js +0 -4
  519. package/dist/ui/flip-css.generated.js.map +0 -1
  520. package/dist/ui/flip-css.js +0 -4
  521. package/dist/ui/flip-css.js.map +0 -1
  522. package/dist/ui/host-data.d.ts +0 -119
  523. package/dist/ui/host-data.d.ts.map +0 -1
  524. package/dist/ui/host-data.js +0 -122
  525. package/dist/ui/host-data.js.map +0 -1
  526. package/dist/ui/host-toast.d.ts +0 -23
  527. package/dist/ui/host-toast.d.ts.map +0 -1
  528. package/dist/ui/host-toast.js +0 -34
  529. package/dist/ui/host-toast.js.map +0 -1
  530. package/dist/ui/loader-bar-art.d.ts +0 -6
  531. package/dist/ui/loader-bar-art.d.ts.map +0 -1
  532. package/dist/ui/loader-bar-art.js +0 -6
  533. package/dist/ui/loader-bar-art.js.map +0 -1
  534. package/dist/ui/loading-host.d.ts +0 -49
  535. package/dist/ui/loading-host.d.ts.map +0 -1
  536. package/dist/ui/loading-host.js +0 -57
  537. package/dist/ui/loading-host.js.map +0 -1
  538. package/dist/ui/locale.d.ts +0 -4
  539. package/dist/ui/locale.d.ts.map +0 -1
  540. package/dist/ui/locale.js +0 -17
  541. package/dist/ui/locale.js.map +0 -1
  542. package/dist/ui/marquee-css.d.ts +0 -2
  543. package/dist/ui/marquee-css.d.ts.map +0 -1
  544. package/dist/ui/marquee-css.generated.d.ts +0 -2
  545. package/dist/ui/marquee-css.generated.d.ts.map +0 -1
  546. package/dist/ui/marquee-css.generated.js +0 -4
  547. package/dist/ui/marquee-css.generated.js.map +0 -1
  548. package/dist/ui/marquee-css.js +0 -4
  549. package/dist/ui/marquee-css.js.map +0 -1
  550. package/dist/ui/modal-host.d.ts +0 -51
  551. package/dist/ui/modal-host.d.ts.map +0 -1
  552. package/dist/ui/modal-host.js +0 -170
  553. package/dist/ui/modal-host.js.map +0 -1
  554. package/dist/ui/overlay-css.d.ts +0 -2
  555. package/dist/ui/overlay-css.d.ts.map +0 -1
  556. package/dist/ui/overlay-css.generated.d.ts +0 -2
  557. package/dist/ui/overlay-css.generated.d.ts.map +0 -1
  558. package/dist/ui/overlay-css.generated.js +0 -4
  559. package/dist/ui/overlay-css.generated.js.map +0 -1
  560. package/dist/ui/overlay-css.js +0 -2
  561. package/dist/ui/overlay-css.js.map +0 -1
  562. package/dist/ui/overlay.d.ts +0 -62
  563. package/dist/ui/overlay.d.ts.map +0 -1
  564. package/dist/ui/overlay.js +0 -94
  565. package/dist/ui/overlay.js.map +0 -1
  566. package/dist/ui/pagination-logic.d.ts +0 -36
  567. package/dist/ui/pagination-logic.d.ts.map +0 -1
  568. package/dist/ui/pagination-logic.js +0 -73
  569. package/dist/ui/pagination-logic.js.map +0 -1
  570. package/dist/ui/panel-css.d.ts +0 -2
  571. package/dist/ui/panel-css.d.ts.map +0 -1
  572. package/dist/ui/panel-css.generated.d.ts +0 -2
  573. package/dist/ui/panel-css.generated.d.ts.map +0 -1
  574. package/dist/ui/panel-css.generated.js +0 -4
  575. package/dist/ui/panel-css.generated.js.map +0 -1
  576. package/dist/ui/panel-css.js +0 -2
  577. package/dist/ui/panel-css.js.map +0 -1
  578. package/dist/ui/panel-dock-css.d.ts +0 -2
  579. package/dist/ui/panel-dock-css.d.ts.map +0 -1
  580. package/dist/ui/panel-dock-css.generated.d.ts +0 -2
  581. package/dist/ui/panel-dock-css.generated.d.ts.map +0 -1
  582. package/dist/ui/panel-dock-css.generated.js +0 -4
  583. package/dist/ui/panel-dock-css.generated.js.map +0 -1
  584. package/dist/ui/panel-dock-css.js +0 -4
  585. package/dist/ui/panel-dock-css.js.map +0 -1
  586. package/dist/ui/panel-dock-logic.d.ts +0 -67
  587. package/dist/ui/panel-dock-logic.d.ts.map +0 -1
  588. package/dist/ui/panel-dock-logic.js +0 -110
  589. package/dist/ui/panel-dock-logic.js.map +0 -1
  590. package/dist/ui/panel.d.ts +0 -41
  591. package/dist/ui/panel.d.ts.map +0 -1
  592. package/dist/ui/panel.js +0 -37
  593. package/dist/ui/panel.js.map +0 -1
  594. package/dist/ui/picker-css.d.ts +0 -2
  595. package/dist/ui/picker-css.d.ts.map +0 -1
  596. package/dist/ui/picker-css.generated.d.ts +0 -2
  597. package/dist/ui/picker-css.generated.d.ts.map +0 -1
  598. package/dist/ui/picker-css.generated.js +0 -4
  599. package/dist/ui/picker-css.generated.js.map +0 -1
  600. package/dist/ui/picker-css.js +0 -4
  601. package/dist/ui/picker-css.js.map +0 -1
  602. package/dist/ui/picker-icons.d.ts +0 -12
  603. package/dist/ui/picker-icons.d.ts.map +0 -1
  604. package/dist/ui/picker-icons.js +0 -29
  605. package/dist/ui/picker-icons.js.map +0 -1
  606. package/dist/ui/picker-logic.d.ts +0 -33
  607. package/dist/ui/picker-logic.d.ts.map +0 -1
  608. package/dist/ui/picker-logic.js +0 -68
  609. package/dist/ui/picker-logic.js.map +0 -1
  610. package/dist/ui/quick-toolbar-logic.d.ts +0 -76
  611. package/dist/ui/quick-toolbar-logic.d.ts.map +0 -1
  612. package/dist/ui/quick-toolbar-logic.js +0 -40
  613. package/dist/ui/quick-toolbar-logic.js.map +0 -1
  614. package/dist/ui/resizer.d.ts +0 -29
  615. package/dist/ui/resizer.d.ts.map +0 -1
  616. package/dist/ui/resizer.js +0 -42
  617. package/dist/ui/resizer.js.map +0 -1
  618. package/dist/ui/side-panel-css.d.ts +0 -2
  619. package/dist/ui/side-panel-css.d.ts.map +0 -1
  620. package/dist/ui/side-panel-css.generated.d.ts +0 -2
  621. package/dist/ui/side-panel-css.generated.d.ts.map +0 -1
  622. package/dist/ui/side-panel-css.generated.js +0 -4
  623. package/dist/ui/side-panel-css.generated.js.map +0 -1
  624. package/dist/ui/side-panel-css.js +0 -2
  625. package/dist/ui/side-panel-css.js.map +0 -1
  626. package/dist/ui/side-sheet-css.d.ts +0 -2
  627. package/dist/ui/side-sheet-css.d.ts.map +0 -1
  628. package/dist/ui/side-sheet-css.generated.d.ts +0 -2
  629. package/dist/ui/side-sheet-css.generated.d.ts.map +0 -1
  630. package/dist/ui/side-sheet-css.generated.js +0 -4
  631. package/dist/ui/side-sheet-css.generated.js.map +0 -1
  632. package/dist/ui/side-sheet-css.js +0 -2
  633. package/dist/ui/side-sheet-css.js.map +0 -1
  634. package/dist/ui/surface-css.d.ts +0 -2
  635. package/dist/ui/surface-css.d.ts.map +0 -1
  636. package/dist/ui/surface-css.generated.d.ts +0 -2
  637. package/dist/ui/surface-css.generated.d.ts.map +0 -1
  638. package/dist/ui/surface-css.generated.js +0 -4
  639. package/dist/ui/surface-css.generated.js.map +0 -1
  640. package/dist/ui/surface-css.js +0 -7
  641. package/dist/ui/surface-css.js.map +0 -1
  642. package/dist/ui/table-logic.d.ts +0 -110
  643. package/dist/ui/table-logic.d.ts.map +0 -1
  644. package/dist/ui/table-logic.js +0 -81
  645. package/dist/ui/table-logic.js.map +0 -1
  646. package/dist/ui/table-shared.d.ts +0 -101
  647. package/dist/ui/table-shared.d.ts.map +0 -1
  648. package/dist/ui/table-shared.js +0 -229
  649. package/dist/ui/table-shared.js.map +0 -1
  650. package/dist/ui/thenable.d.ts +0 -9
  651. package/dist/ui/thenable.d.ts.map +0 -1
  652. package/dist/ui/thenable.js +0 -15
  653. package/dist/ui/thenable.js.map +0 -1
  654. package/dist/ui/ticker.d.ts +0 -8
  655. package/dist/ui/ticker.d.ts.map +0 -1
  656. package/dist/ui/ticker.js +0 -49
  657. package/dist/ui/ticker.js.map +0 -1
  658. package/dist/ui/toast-host.d.ts +0 -24
  659. package/dist/ui/toast-host.d.ts.map +0 -1
  660. package/dist/ui/toast-host.js +0 -20
  661. package/dist/ui/toast-host.js.map +0 -1
  662. package/dist/ui/tooltip.d.ts +0 -29
  663. package/dist/ui/tooltip.d.ts.map +0 -1
  664. package/dist/ui/tooltip.js +0 -10
  665. package/dist/ui/tooltip.js.map +0 -1
@@ -1,632 +0,0 @@
1
- // 工作区文件浏览器(U11):面包屑 + ▾ 选层 + 内联展开目录树 + 文件预览。
2
- //
3
- // 源实现 = 兄弟项目 dsh-task-dispatch-table/src/client/file-browser.tsx(868 行)——本文件是它的
4
- // core 重实现("抄"不是"复制"):组件全部换 core 自己的体系,官方件只经 ui/official 消费;
5
- // 修掉源实现的已知问题:根缓存改可注入(原模块级 Map 永不清除)、复制路径补 catch、
6
- // 复制/选中路径口径统一为工作区相对、去掉死代码。
7
- //
8
- // 两个消费场景共用本组件(用户 2026-10-20 拍板:同一套内容,两种展现形式):
9
- // · 浏览(dock):由 **核心 PanelDock** 承载(openFilePreview),拖宽与关闭都由它负责,
10
- // 本组件不再自绘拖拽条 / 侧边栏外壳;
11
- // · 选择(picker):`picker` + `onPick(picked)`(`path` 是**绝对路径**,另带工作区归属),点文件即回调。
12
- //
13
- // 控件纪律:能用核心控件的一律核心(ghost 面包屑 / IconButton / Segmented / MarqueeText);
14
- // 核心没有的那一项 = ▾ 选层浮层,按兄弟项目 dsh-task-dispatch-table 的 `.dsh-tdt-sv-crumbs-*`
15
- // 逐像素照抄(间距 / 圆角 / 最大高度 / 空态),不自创度量。
16
- import { createElement as h, Fragment, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
17
- import { IconChevronRightOutlineRegular, writeClipboard, FileTypeIcon, } from '../ui/official.js';
18
- import { Button, IconButton } from '../ui/Button.js';
19
- import { workspaceList } from '../ui/host-data.js';
20
- import { useLocale } from '../ui/locale.js';
21
- import { t } from '../utils/i18n.js';
22
- import { FilePreview } from './preview/index.js';
23
- import { bareCode, baseNameOfPath, crumbsOfDir, createRequestGate, dirnameOf, errView, isAborted, isAbsoluteish, isFailed, joinPath, listingOf, matchesFilter, relativizeToDir, sortEntries, normalizePath, workspaceOfPath, } from './types.js';
24
- import { ensureComponentStyles } from '../ui/css.js';
25
- import { PANEL_CSS } from '../ui/panel-css.js';
26
- import { EXPLORER_CSS } from './explorer-css.js';
27
- import { crumbsMenuEntries } from './crumbs-menu.js';
28
- import { CrumbNav, PlainNav } from './crumb-nav.js';
29
- import { LandingBody } from './landing.js';
30
- import { PreviewTitleBar } from './preview-title-bar.js';
31
- /**
32
- * 「根」在 POSIX 上的落点 `/`。Windows 没有这一个根 —— 根层是盘符清单,由宿主 `op:'roots'` 给出
33
- * (见下面 `roots` 状态),本常量只在 POSIX / 探不到盘符时用。
34
- */
35
- const FS_ROOT = '/';
36
- /** 目录浏览器面板。详见 {@link FileBrowserProps}。 */
37
- export function FileBrowser(props) {
38
- ensureComponentStyles('explorer', EXPLORER_CSS);
39
- // ▾ 选层用浮层 menu 档(panel.css):跟弹窗同一套底色/描边/圆角/阴影。
40
- ensureComponentStyles('panel', PANEL_CSS);
41
- // 宿主切语言 ⇒ 重渲(标签文案默认已跟随 `<html lang>`,这里只补「切换后刷新」)。
42
- useLocale();
43
- const tt = props.translate ?? t;
44
- const picker = props.picker === true;
45
- // mode:加载/目录树/文件预览/列举错误。viewing 非空 ⇒ 在 dir 树内预览文件。
46
- const [mode, setMode] = useState('loading');
47
- const [dir, setDir] = useState('');
48
- const [listing, setListing] = useState(null);
49
- const [truncated, setTruncated] = useState(false);
50
- const [viewing, setViewing] = useState(null);
51
- const [listErr, setListErr] = useState(null);
52
- // 面包屑折叠(超宽时只显示当前层名;行首 ▾ 选层常驻)。
53
- const [crumbsOverflow, setCrumbsOverflow] = useState(false);
54
- const [menuOpen, setMenuOpen] = useState(false);
55
- const regionRef = useRef(null);
56
- const measureRef = useRef(null);
57
- // 预览态:md/html 渲染⇄源码 + 刷新自增(触发预览体重读)。
58
- const [sourceView, setSourceView] = useState(false);
59
- const [reloadNonce, setReloadNonce] = useState(0);
60
- const [copied, setCopied] = useState(false);
61
- // 内联展开:openDirs = 已展开目录路径集合;childCache = 各展开目录拉到的子项。
62
- const [openDirs, setOpenDirs] = useState(new Set());
63
- const [childCache, setChildCache] = useState({});
64
- // 当前目录在会话工作区之外(官方 list 限工作区内,越界即报 outside-workspace)。
65
- // 依据 = list 的**真实错误码**,不靠缓存猜(根学不出时会误判成"在区内")。
66
- const [outside, setOutside] = useState(false);
67
- // picker 且路径/会话都没给 ⇒ 落地页:主窗体先列「根目录 + 各工作区」让用户自己选(用户 2026-11-03 定)。
68
- const [landing, setLanding] = useState(props.picker === true && props.path === '' && props.sessionId === undefined);
69
- const landingRef = useRef(landing);
70
- useLayoutEffect(() => {
71
- landingRef.current = landing;
72
- }, [landing]);
73
- const revision = props.revision ?? 0;
74
- // 请求闸门(latest-wins):顶层列举 / 补学根 各一口;内联展开每个目录一口。
75
- // begin() 先 abort 上一次,回调用 token.current() 判新旧 ⇒ 连续切换只认最后一次,
76
- // 旧请求在 wire 上被取消(官方 remote 的 cancellation 形参),不再白读。
77
- const listGateRef = useRef(null);
78
- if (listGateRef.current === null)
79
- listGateRef.current = createRequestGate();
80
- const listGate = listGateRef.current;
81
- const childAbortsRef = useRef(new Map());
82
- const abortChildren = useCallback(() => {
83
- for (const controller of childAbortsRef.current.values())
84
- controller.abort();
85
- childAbortsRef.current.clear();
86
- }, []);
87
- // 当前已提交的 dir / listing(初始 effect 判「同目录换文件」用 ref,避免把它们加进依赖)。
88
- const dirRef = useRef('');
89
- const listingRef = useRef(null);
90
- useLayoutEffect(() => {
91
- dirRef.current = dir;
92
- listingRef.current = listing;
93
- }, [dir, listing]);
94
- // 路径 → 工作区匹配:props.path 是绝对路径时按最长前缀找出所属工作区,面包屑根名与
95
- // 相对化就用它(路径本来就在 FS 面里,不需要再「反推工作区根」)。
96
- // 匹配不到 ⇒ 回落 props.rootName(调用方给的显示名)。
97
- // 工作区清单来源(优先级从高到低):① props.workspaceAnchors(调用方显式给,可覆盖);
98
- // ② 宿主 workspaces 快照(connectHost 注入的 workspaceList,官方 WorkspaceView 镜像)。
99
- // 快照异步到达时会重算 + 重跑初始 effect(rootBase 在其依赖里)⇒ 自愈,无感。
100
- const hostWorkspaces = useSyncExternalStore(workspaceList.subscribe, workspaceList.getSnapshot);
101
- const anchors = props.workspaceAnchors ?? hostWorkspaces;
102
- // 根层清单:问宿主要(`op:'roots'`)。POSIX 回 `['/']`;Windows 回盘符 —— **Windows 没有「根目录」
103
- // 这一个东西,根就是盘符清单**(用户 2026-11-03)。拿不到(文件面没这能力)⇒ 按 POSIX 单根。
104
- const [roots, setRoots] = useState([FS_ROOT]);
105
- useEffect(() => {
106
- const ask = props.files.roots;
107
- if (ask === undefined)
108
- return;
109
- let alive = true;
110
- void Promise.resolve()
111
- .then(() => ask.call(props.files))
112
- .then((list) => {
113
- if (!alive || list.length === 0)
114
- return;
115
- // 内容相同就不换引用:调用方每次渲染都给新的 files 对象时,否则会「effect → setState → 渲染 → effect」空转。
116
- setRoots((prev) => (prev.length === list.length && prev.every((item, index) => item === list[index]) ? prev : list));
117
- })
118
- .catch(() => { });
119
- return () => { alive = false; };
120
- }, [props.files]);
121
- const anchorMatch = useMemo(() => workspaceOfPath(props.path, anchors), [props.path, anchors]);
122
- /** 相对路径的基准目录(工作区根):匹配出的工作区 > 调用方给的 > 无(只认绝对路径)。 */
123
- const sessionAnchor = props.sessionId === undefined
124
- ? null
125
- : anchors.find((item) => item.sessionIds?.includes(props.sessionId) === true) ?? null;
126
- const rootBase = anchorMatch?.path ?? props.rootPath ?? sessionAnchor?.path ?? anchors.find((item) => item.path !== undefined)?.path;
127
- /** 任意入参 → 绝对路径(FS 面只认绝对路径)。 */
128
- const absOf = useCallback((p) => {
129
- if (isAbsoluteish(p))
130
- return normalizePath(p);
131
- // '' = 「根」:有工作区基准就是该工作区根,没有就是文件系统根(`/`;Windows 上是当前盘根)。
132
- if (rootBase === undefined || rootBase === '')
133
- return p === '' ? FS_ROOT : p;
134
- return p === '' ? normalizePath(rootBase) : normalizePath(`${rootBase}/${p.replace(/^\/+/, '')}`);
135
- }, [rootBase]);
136
- /** 面板回传(绝对路径 + 工作区归属)。 */
137
- const toPicked = useCallback((p, isDir) => {
138
- const abs = absOf(p);
139
- const owner = workspaceOfPath(abs, anchors);
140
- return owner === null
141
- ? { path: abs, isDir }
142
- : { path: abs, isDir, workspaceRel: relativizeToDir(abs, owner.path ?? null), workspace: owner.title };
143
- }, [absOf, anchors]);
144
- /** 记一次 list 结果的"是否越界"(outside-workspace / not-found 均视为不可浏览)。 */
145
- const noteOutside = useCallback((parsed) => {
146
- if (parsed === null || parsed === undefined)
147
- return;
148
- if (!isFailed(parsed)) {
149
- setOutside(false);
150
- return;
151
- }
152
- const code = bareCode(parsed.failed);
153
- if (code === 'outside-workspace' || code === 'not-found')
154
- setOutside(true);
155
- }, []);
156
- /** 列举某目录并展示(清空 viewing;收起下拉)。 */
157
- const fetchDir = useCallback((targetDir) => {
158
- const token = listGate.begin();
159
- abortChildren();
160
- const absTarget = absOf(targetDir);
161
- setDir(absTarget);
162
- setViewing(null);
163
- setListErr(null);
164
- setMenuOpen(false);
165
- setMode('loading');
166
- // 切换顶层目录:清空内联展开态(展开树只属于当前这一层)。
167
- setOpenDirs(new Set());
168
- setChildCache({});
169
- props.files
170
- .list(absTarget, token.signal)
171
- .then((result) => {
172
- if (!token.current())
173
- return;
174
- const parsed = listingOf(result);
175
- noteOutside(parsed);
176
- if (isFailed(parsed)) {
177
- setListErr(errView(parsed.failed));
178
- setMode('error');
179
- return;
180
- }
181
- if (parsed === null) {
182
- setListErr({ key: 'previewBadPayload' });
183
- setMode('error');
184
- return;
185
- }
186
- setListing(parsed.entries);
187
- setTruncated(parsed.truncated);
188
- setMode('dir');
189
- })
190
- .catch((error) => {
191
- if (isAborted(token.signal, error))
192
- return;
193
- setListErr(errView(error));
194
- setMode('error');
195
- });
196
- }, [abortChildren, absOf, listGate, noteOutside, props.files]);
197
- /** 进入某目录;点到当前目录本身 = 重列本层(刷新)。 */
198
- const loadDir = useCallback((targetDir) => {
199
- // 落地页上点 ▾ 选根目录 / 工作区:必须先退出落地页,否则主体还是落地页那张表,
200
- // 点了跟没点一样(用户 2026-11-03 真机:"选里面的任何一个都没有任何效果")。
201
- if (landingRef.current)
202
- setLanding(false);
203
- fetchDir(targetDir);
204
- }, [fetchDir]);
205
- // 初次进入(path 可能是文件或目录):
206
- // list(path) 成功 ⇒ 目录树(dir 尽量取宿主绝对路径 ⇒ 面包屑从工作区根往下列);
207
- // 报错 ⇒ 文件预览态(dir = 父目录,面包屑保留可返回)。
208
- // ⚠️ 切勿改用服务端 list 返回的 path 当面包屑:那是 workspacePathOf 的工作区**相对**形式,
209
- // 会丢掉根以下的前导段,面包屑只剩最近一层(源实现 2026-09-29 踩过 ⇒ 已回退为入参路径)。
210
- useEffect(() => {
211
- // 落地页(还没选根目录/工作区):什么都不列,等用户点。
212
- // 用 ref 读、**不进依赖**:否则从落地页点进目录那一刻 landing 变 false 会重跑本 effect,
213
- // 又把目录拉回 absOf('') = 第一个工作区(真机 2026-11-03)。
214
- if (landingRef.current)
215
- return;
216
- // 同目录换文件(侧栏连点 / 重开同一文件):只换 viewing——目录树、展开态、滚动位置保留,
217
- // 也不再额外触发一次 list。旧目录列举已由上一轮 effect 的清理函数 abort。
218
- // 判据用 listingRef(不是 props.path 的类型):只有「当前已列出的这一层里确实有这个文件」
219
- // 才走捷径,目录路径/相对名对不上时照旧走完整初始流程(不改变既有语义)。
220
- const parent = dirnameOf(props.path);
221
- const name = baseNameOfPath(props.path);
222
- const knownFile = listingRef.current?.some((entry) => entry.name === name && entry.type === 'file') === true;
223
- if (props.path !== '' && dirRef.current !== '' && parent === dirRef.current && knownFile) {
224
- setViewing(absOf(props.path));
225
- setMode('file');
226
- setSourceView(false);
227
- // 同路径再点一次也要重读内容(对齐旧版「每次打开都重读」;不重挂只换 key)。
228
- setReloadNonce((n) => n + 1);
229
- setListErr(null);
230
- setMenuOpen(false);
231
- return;
232
- }
233
- const token = listGate.begin();
234
- abortChildren();
235
- setMode('loading');
236
- setListErr(null);
237
- setViewing(null);
238
- setSourceView(false);
239
- setReloadNonce(0);
240
- setMenuOpen(false);
241
- setOpenDirs(new Set());
242
- setChildCache({});
243
- const entry = absOf(props.path);
244
- props.files
245
- .list(entry, token.signal)
246
- .then((result) => {
247
- if (!token.current())
248
- return;
249
- const parsed = listingOf(result);
250
- if (!isFailed(parsed) && parsed !== null) {
251
- setOutside(false);
252
- setDir(entry);
253
- setListing(parsed.entries);
254
- setTruncated(parsed.truncated);
255
- setMode('dir');
256
- return;
257
- }
258
- // 不是目录 ⇒ 当作文件预览,dir 取父目录,尽量把父树也列出来。
259
- const parentDir = dirnameOf(entry);
260
- setDir(parentDir);
261
- setViewing(entry);
262
- setMode('file');
263
- props.files
264
- .list(parentDir, token.signal)
265
- .then((pres) => {
266
- if (!token.current())
267
- return;
268
- const pl = listingOf(pres);
269
- noteOutside(pl);
270
- if (!isFailed(pl) && pl !== null) {
271
- setListing(pl.entries);
272
- setTruncated(pl.truncated);
273
- }
274
- })
275
- .catch(() => {
276
- /* 父树列不出不影响文件预览(取消同样静默) */
277
- });
278
- })
279
- .catch((error) => {
280
- if (!token.current() || isAborted(token.signal, error))
281
- return;
282
- // 传输层失败:仍尝试按文件预览(预览体内部会给出错误态)。
283
- setDir(dirnameOf(entry));
284
- setViewing(entry);
285
- setMode('file');
286
- });
287
- return () => {
288
- listGate.abort();
289
- };
290
- // ⚠️ 这里**不** abort 内联展开的子请求:同目录换文件时它们仍然有效(树也保留着)。
291
- // 子请求只在「换顶层目录」(fetchDir)与卸载时取消。
292
- }, [abortChildren, absOf, listGate, noteOutside, props.files, props.path, revision]);
293
- // 卸载时把内联展开的在途请求一起取消(依赖为空 ⇒ 只有卸载才跑清理)。
294
- useEffect(() => () => abortChildren(), [abortChildren]);
295
- /** ▾ 里点别的工作区:调用方没接管就直接列该工作区根(不需要会话)。 */
296
- const switchWorkspace = useCallback((name) => {
297
- if (props.onSelectWorkspace !== undefined) {
298
- props.onSelectWorkspace(name);
299
- return;
300
- }
301
- const target = anchors.find((item) => item.title === name);
302
- if (target?.path !== undefined)
303
- loadDir(target.path);
304
- }, [anchors, loadDir, props.onSelectWorkspace]);
305
- // 面包屑溢出测量:隐藏测量条渲染与可见态完全相同的 crumb 按钮(含 padding/max-width),
306
- // 使溢出判定与真实排版一致——不超长时必定还原完整路径。ResizeObserver 同时覆盖
307
- // dock 宽度变化 / 初次布局。
308
- useLayoutEffect(() => {
309
- const region = regionRef.current;
310
- const measure = measureRef.current;
311
- if (region === null || measure === null)
312
- return;
313
- const recompute = () => {
314
- setCrumbsOverflow(measure.scrollWidth > region.clientWidth + 1);
315
- };
316
- recompute();
317
- const ro = new ResizeObserver(recompute);
318
- ro.observe(region);
319
- return () => ro.disconnect();
320
- // 依赖要带上「根反推完成」「越界态变化」:这两样会让面包屑从超长绝对路径相对化成
321
- // 短路径,但若不重算,crumbsOverflow 会卡在首帧的 true(只显示末段),直到下次导航才复原
322
- // (2026-10-28 真机:打开工作区内的绝对路径,面包屑只剩末段,点一下目录才恢复)。
323
- }, [dir, viewing, mode, listing, outside]);
324
- const reload = useCallback(() => {
325
- if (viewing !== null) {
326
- setReloadNonce((n) => n + 1);
327
- return;
328
- }
329
- loadDir(dir);
330
- }, [viewing, dir, loadDir]);
331
- const copyPath = useCallback(() => {
332
- // 口径统一:复制**工作区相对**路径(与 picker onPick 一致;绝对形态对用户无意义)。
333
- const target = viewing ?? dir;
334
- if (target === '')
335
- return;
336
- const rel = relativizeToDir(target, rootBase ?? null);
337
- writeClipboard(rel)
338
- .then((ok) => {
339
- if (ok) {
340
- setCopied(true);
341
- window.setTimeout(() => setCopied(false), 1500);
342
- }
343
- })
344
- .catch(() => {
345
- /* 剪贴板不可用(非安全上下文等):静默,不弹错 */
346
- });
347
- }, [viewing, dir, rootBase]);
348
- /** 内联展开/收起某目录(点 ▸):只切展开态,不导航;首次展开才拉子项。 */
349
- const toggleDir = useCallback((path) => {
350
- setOpenDirs((prev) => {
351
- const next = new Set(prev);
352
- if (next.has(path))
353
- next.delete(path);
354
- else
355
- next.add(path);
356
- return next;
357
- });
358
- if (!(path in childCache)) {
359
- childAbortsRef.current.get(path)?.abort();
360
- const controller = new AbortController();
361
- childAbortsRef.current.set(path, controller);
362
- setChildCache((prev) => ({ ...prev, [path]: { status: 'loading' } }));
363
- props.files
364
- .list(absOf(path), controller.signal)
365
- .then((result) => {
366
- if (controller.signal.aborted)
367
- return;
368
- const parsed = listingOf(result);
369
- setChildCache((prev) => ({
370
- ...prev,
371
- [path]: isFailed(parsed) || parsed === null
372
- ? { status: 'error', error: errView(isFailed(parsed) ? parsed.failed : undefined) }
373
- : { status: 'ready', entries: parsed.entries, truncated: parsed.truncated },
374
- }));
375
- })
376
- .catch((error) => {
377
- if (isAborted(controller.signal, error))
378
- return;
379
- setChildCache((prev) => ({ ...prev, [path]: { status: 'error', error: errView(error) } }));
380
- })
381
- .finally(() => {
382
- if (childAbortsRef.current.get(path) === controller)
383
- childAbortsRef.current.delete(path);
384
- });
385
- }
386
- }, [absOf, childCache, props.files]);
387
- // 过滤点名了扩展名 ⇒ 要的是**文件**:目录只作导航(点行就地展开),不给「选择」、也回传不了 isDir。
388
- // (旧实现「目录永远保留且永远带选择钮」,于是「仅 JS/MD」下出现「文件夹旁边有选择、
389
- // MD 文件旁边反而没有」,选中还回传一个文件夹——与过滤语义直接打架。)
390
- const extsOnly = picker && props.filter !== undefined && props.filter.dirs !== true && (props.filter.exts?.length ?? 0) > 0;
391
- /** 选择器里目录是否可选:不限 或 明说 dirs:true 才可选;扩展名过滤下不可选。 */
392
- const dirPickable = picker && props.onPick !== undefined && !extsOnly;
393
- /** 递归渲染目录树(内联展开)。file = 点开预览(picker = 选中);dir = ▸ 切展开、行尾钮分派。 */
394
- const renderTree = useCallback((entries, baseDir) => sortEntries(entries).map((entry) => {
395
- const childPath = joinPath(baseDir, entry.name);
396
- const isDir = entry.type === 'directory';
397
- // 选择器过滤:不匹配的文件不渲染(目录永远保留——里面可能有匹配的)。
398
- if (!isDir && picker && !matchesFilter(childPath, false, props.filter))
399
- return null;
400
- if (!isDir) {
401
- const pick = () => {
402
- if (picker && props.onPick !== undefined) {
403
- // 回传绝对路径 + 工作区归属(用户 2026-11-03 定 `PickedPath`)。
404
- props.onPick(toPicked(childPath, false));
405
- return;
406
- }
407
- // 逐层展开后选中文件:面包屑要跟随到该文件所在目录。
408
- const parent = dirnameOf(childPath);
409
- if (parent !== dir)
410
- loadDir(parent);
411
- setViewing(childPath);
412
- setReloadNonce(0);
413
- setSourceView(false);
414
- };
415
- return h('div', {
416
- key: childPath,
417
- className: `dshpc-fb__row${picker ? ' dshpc-fb__row--pick' : ''}`,
418
- role: 'button',
419
- tabIndex: 0,
420
- title: picker ? tt('explorerPickFile') : childPath,
421
- onClick: pick,
422
- onKeyDown: (event) => {
423
- if (event.key === 'Enter' || event.key === ' ')
424
- pick();
425
- },
426
- }, h('span', { className: 'dshpc-fb__row-icon' }, h(FileTypeIcon, { path: childPath, size: 18 })), h('span', { className: 'dshpc-fb__row-name' }, entry.name),
427
- // 选择器里文件行也给一枚「选择」钮,与目录行的操作位对齐(目录没有时它仍在,
428
- // 「点行 = 选中」的旧默契保持不变,外显入口不再缺)。
429
- picker && props.onPick !== undefined
430
- ? h(Button, {
431
- variant: 'outline',
432
- size: 'sm',
433
- className: 'dshpc-fb__row-act',
434
- 'aria-label': tt('explorerPickFile'),
435
- onClick: (event) => {
436
- event.stopPropagation();
437
- pick();
438
- },
439
- }, tt('explorerPickDir'))
440
- : null);
441
- }
442
- const cached = childCache[childPath];
443
- const isOpen = openDirs.has(childPath);
444
- // 目录行点击 = 就地展开/收起(两种形态统一,源实现用户 2026-10-10 拍板);
445
- // 主动作挪到行尾小按钮:选择器 = 选择此文件夹,浏览 = 进入该目录。
446
- // 目录行不渲染文件夹图标——行首已有展开小尖号,再摆一个是重复。
447
- const rowAction = () => {
448
- toggleDir(childPath);
449
- };
450
- const actThisDir = (event) => {
451
- event.stopPropagation();
452
- if (picker) {
453
- // 扩展名过滤下这里不该被触发(目录行根本不渲染这枚钮);兜住是为了语义不被绕过。
454
- if (!extsOnly && props.onPick !== undefined)
455
- props.onPick(toPicked(childPath, true));
456
- return;
457
- }
458
- loadDir(childPath);
459
- };
460
- return h(Fragment, { key: childPath }, h('div', {
461
- className: 'dshpc-fb__row',
462
- role: 'button',
463
- tabIndex: 0,
464
- title: childPath,
465
- onClick: rowAction,
466
- onKeyDown: (event) => {
467
- if (event.key === 'Enter' || event.key === ' ')
468
- rowAction();
469
- },
470
- },
471
- // 展开 / 收起:核心 IconButton,20×20 命中位 + 展开时转 90°(与兄弟 .dsh-tdt-sv-tree-toggle 同款)。
472
- h(IconButton, {
473
- variant: 'plain',
474
- size: 'sm',
475
- className: `dshpc-fb__row-toggle${isOpen ? ' dshpc-fb__row-toggle--open' : ''}`,
476
- icon: h(IconChevronRightOutlineRegular, { size: 16 }),
477
- label: isOpen ? tt('explorerCollapse') : tt('explorerExpand'),
478
- 'aria-expanded': isOpen,
479
- onClick: (event) => {
480
- event.stopPropagation();
481
- toggleDir(childPath);
482
- },
483
- }), h('span', { className: 'dshpc-fb__row-name' }, entry.name),
484
- // picker:仅目录可选时才出「选择」(扩展名过滤下没有,目录只作导航);
485
- // 浏览态:出「进入」。
486
- picker
487
- ? dirPickable
488
- ? h(Button, {
489
- variant: 'outline',
490
- size: 'sm',
491
- className: 'dshpc-fb__row-act',
492
- 'aria-label': tt('explorerPickDirAria'),
493
- onClick: actThisDir,
494
- }, tt('explorerPickDir'))
495
- : null
496
- : h(Button, {
497
- variant: 'outline',
498
- size: 'sm',
499
- className: 'dshpc-fb__row-act',
500
- 'aria-label': tt('explorerEnter'),
501
- onClick: actThisDir,
502
- }, tt('explorerEnter'))), isOpen
503
- ? h('div', { className: 'dshpc-fb__row-children' },
504
- // 硬性规定:不新建 Loading、不写加载文案 ⇒ 还在拉就空着(源实现用户 2026-10-05)。
505
- cached === undefined || cached.status === 'loading'
506
- ? null
507
- : cached.status === 'error'
508
- ? h('div', { className: 'dshpc-fb__row-err' }, tt(cached.error.key, cached.error.params))
509
- : h(Fragment, null, renderTree(cached.entries, childPath), cached.truncated ? h('div', { className: 'dshpc-fb__row-note' }, tt('explorerTruncated')) : null))
510
- : null);
511
- }), [childCache, openDirs, picker, dirPickable, extsOnly, props.filter, props.onPick, toPicked, dir, loadDir, tt]);
512
- // 根层条目:有盘符(Windows)就一条一档;否则单条「根目录」(POSIX)。
513
- // 两者都是**可选目标**(用户 2026-11-03:Linux 的 `/` 也可以选;Windows 至少能选盘)。
514
- const drives = roots.filter((root) => root !== FS_ROOT);
515
- const rootRows = drives.length > 0
516
- ? drives.map((path) => ({ label: path.replace(/\/+$/, ''), path }))
517
- : [{ label: tt('explorerRootDir'), path: FS_ROOT }];
518
- // 面包屑(用户 2026-11-03 定):**按当前目录**去比所有工作区。
519
- // 命中 ⇒ 第一段是工作区名,其下按相对层级;没命中 ⇒ 第一段是根(「根目录」或盘符),其下逐层。
520
- // 判据只看 `dir`(不比 props.path):浏览途中切进别的工作区也要立刻跟着切根。
521
- const owner = workspaceOfPath(dir, anchors);
522
- const rootLabel = owner?.title ?? '';
523
- const crumbs = owner === null
524
- ? (/^[a-zA-Z]:/.test(normalizePath(dir))
525
- // 盘符路径:根段由 crumbsOfDir 自己出(`C:`),再补一段「根目录」就重复了。
526
- ? crumbsOfDir(dir)
527
- : [{ label: rootRows[0]?.label ?? tt('explorerRootDir'), path: FS_ROOT }, ...crumbsOfDir(dir)])
528
- : [{ label: rootLabel, path: '' }, ...crumbsOfDir(relativizeToDir(dir, owner.path ?? null))];
529
- // md / html 都出「渲染 ⇄ 源码」切换(默认渲染)。
530
- const viewingIsMd = viewing !== null && /\.(md|markdown)$/i.test(viewing);
531
- const viewingIsHtml = viewing !== null && /\.(html|htm)$/i.test(viewing);
532
- const switchable = viewingIsMd || viewingIsHtml;
533
- // 工作区清单:调用方没传就用宿主快照里的(picker 与 dock 同一条逻辑 —— 用户 2026-11-03:
534
- // 两处显示必须一致,不能 dock 有清单、picker 只有一个根目录)。
535
- const menuItems = crumbsMenuEntries({
536
- workspaces: props.workspaces ?? anchors.map((item) => item.title),
537
- roots: rootRows,
538
- rootName: rootLabel,
539
- rootFallbackLabel: tt('explorerRootName'),
540
- crumbs,
541
- onPickWorkspace: switchWorkspace,
542
- onLoadDir: loadDir,
543
- });
544
- // 选择器的「选当前目录」入口(用户 2026-11-03:进到某一层之后,行上没有它自己,
545
- // 树里也点不到「当前这层」⇒ 在 ✕ 左边给一枚按钮)。落地页还没进任何目录、扩展名过滤下
546
- // 目录不是合法结果 —— 这两种情况不出按钮。
547
- const pickNow = picker && props.onPick !== undefined && !landing && dirPickable && dir !== ''
548
- ? h(Button, {
549
- // 描边(outline):ghost 在这一排**看不出来是按钮**——它无底无边,与面板同色,
550
- // 用户 2026-11-03 实测「就像没有背景一样」,于是改回有 border 的一档(覆盖当天早些的 ghost 结论)。
551
- variant: 'outline',
552
- size: 'sm',
553
- className: 'dshpc-fb__pick',
554
- 'aria-label': tt('explorerPickDirAria'),
555
- onClick: () => props.onPick?.(toPicked(dir, true)),
556
- }, tt('explorerPickDir'))
557
- : null;
558
- const nav = outside
559
- ? h(PlainNav, { translate: tt, path: dir, pickNow, onClose: props.onClose })
560
- : h(CrumbNav, {
561
- translate: tt,
562
- landing,
563
- crumbs,
564
- overflow: crumbsOverflow,
565
- menuItems,
566
- menuOpen,
567
- onToggleMenu: () => setMenuOpen((v) => !v),
568
- onCloseMenu: () => setMenuOpen(false),
569
- onLoadDir: loadDir,
570
- pickNow,
571
- onClose: props.onClose,
572
- regionRef,
573
- measureRef,
574
- });
575
- const titleBar = viewing === null
576
- ? null
577
- : h(PreviewTitleBar, {
578
- translate: tt,
579
- path: viewing,
580
- switchable,
581
- isMarkdown: viewingIsMd,
582
- sourceView,
583
- onSourceViewChange: setSourceView,
584
- copied,
585
- onCopyPath: copyPath,
586
- onReload: reload,
587
- });
588
- // ── 主体 ──
589
- let body;
590
- if (landing) {
591
- body = h(LandingBody, {
592
- translate: tt,
593
- roots: rootRows,
594
- anchors,
595
- pickable: picker && props.onPick !== undefined && !extsOnly,
596
- onOpen: loadDir,
597
- onPickDir: (target) => props.onPick?.(toPicked(target, true)),
598
- });
599
- }
600
- else if (viewing !== null) {
601
- body = h(FilePreview, {
602
- key: `${viewing}:${reloadNonce}`,
603
- files: props.files,
604
- officeToPdf: props.officeToPdf ?? null,
605
- path: viewing,
606
- sourceView,
607
- // 行号只属于「打开时指定的那个文件」:在树里另点一个文件不该带过去。
608
- line: viewing === absOf(props.path) ? props.focusLine : undefined,
609
- translate: tt,
610
- });
611
- }
612
- else if (mode === 'error' && listErr !== null) {
613
- // 列举失败(如 outside-workspace):只给错误文案;关闭(✕)即退出。
614
- body = h('div', { className: 'dshpc-fb__body' }, h('div', { className: 'dshpc-fb__err' }, tt(listErr.key, listErr.params)));
615
- }
616
- else if (listing !== null) {
617
- const visible = listing.filter((entry) => entry.type === 'directory' || matchesFilter(joinPath(dir, entry.name), false, picker ? props.filter : undefined));
618
- body =
619
- visible.length === 0
620
- ? h('div', { className: 'dshpc-fb__body' }, h('div', { className: 'dshpc-fb__note' }, tt('explorerEmptyDir')))
621
- : h('div', { className: 'dshpc-fb__tree' }, renderTree(visible, dir), truncated ? h('div', { className: 'dshpc-fb__row-note' }, tt('explorerTruncated')) : null);
622
- }
623
- else {
624
- // 不动 Loading、不写加载文案 ⇒ 空着(源实现硬性规定)。
625
- body = h('div', { className: 'dshpc-fb__body' });
626
- }
627
- return h('div', {
628
- className: 'dshpc-fb',
629
- style: props.style ?? undefined,
630
- }, nav, titleBar, body);
631
- }
632
- //# sourceMappingURL=FileBrowser.js.map