dsh-plugin-core 0.31.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adv/explorer/FileBrowser.d.ts +58 -0
- package/dist/adv/explorer/FileBrowser.d.ts.map +1 -0
- package/dist/adv/explorer/FileBrowser.js +632 -0
- package/dist/adv/explorer/FileBrowser.js.map +1 -0
- package/dist/adv/explorer/crumb-nav.d.ts +45 -0
- package/dist/adv/explorer/crumb-nav.d.ts.map +1 -0
- package/dist/adv/explorer/crumb-nav.js +78 -0
- package/dist/adv/explorer/crumb-nav.js.map +1 -0
- package/dist/adv/explorer/crumbs-menu.d.ts +37 -0
- package/dist/adv/explorer/crumbs-menu.d.ts.map +1 -0
- package/dist/adv/explorer/crumbs-menu.js +102 -0
- package/dist/adv/explorer/crumbs-menu.js.map +1 -0
- package/dist/adv/explorer/explorer-css.d.ts +2 -0
- package/dist/adv/explorer/explorer-css.d.ts.map +1 -0
- package/dist/adv/explorer/explorer-css.generated.d.ts +2 -0
- package/dist/adv/explorer/explorer-css.generated.d.ts.map +1 -0
- package/dist/adv/explorer/explorer-css.generated.js +4 -0
- package/dist/adv/explorer/explorer-css.generated.js.map +1 -0
- package/dist/adv/explorer/explorer-css.js +3 -0
- package/dist/adv/explorer/explorer-css.js.map +1 -0
- package/dist/adv/explorer/fs-face.d.ts +36 -0
- package/dist/adv/explorer/fs-face.d.ts.map +1 -0
- package/dist/adv/explorer/fs-face.js +74 -0
- package/dist/adv/explorer/fs-face.js.map +1 -0
- package/dist/adv/explorer/index.d.ts +6 -0
- package/dist/adv/explorer/index.d.ts.map +1 -0
- package/dist/adv/explorer/index.js +6 -0
- package/dist/adv/explorer/index.js.map +1 -0
- package/dist/adv/explorer/landing.d.ts +26 -0
- package/dist/adv/explorer/landing.d.ts.map +1 -0
- package/dist/adv/explorer/landing.js +43 -0
- package/dist/adv/explorer/landing.js.map +1 -0
- package/dist/adv/explorer/open.d.ts +137 -0
- package/dist/adv/explorer/open.d.ts.map +1 -0
- package/dist/adv/explorer/open.js +350 -0
- package/dist/adv/explorer/open.js.map +1 -0
- package/dist/adv/explorer/picker-placement.d.ts +69 -0
- package/dist/adv/explorer/picker-placement.d.ts.map +1 -0
- package/dist/adv/explorer/picker-placement.js +122 -0
- package/dist/adv/explorer/picker-placement.js.map +1 -0
- package/dist/adv/explorer/preview/BytesPreview.d.ts +12 -0
- package/dist/adv/explorer/preview/BytesPreview.d.ts.map +1 -0
- package/dist/adv/explorer/preview/BytesPreview.js +60 -0
- package/dist/adv/explorer/preview/BytesPreview.js.map +1 -0
- package/dist/adv/explorer/preview/HtmlPreview.d.ts +17 -0
- package/dist/adv/explorer/preview/HtmlPreview.d.ts.map +1 -0
- package/dist/adv/explorer/preview/HtmlPreview.js +113 -0
- package/dist/adv/explorer/preview/HtmlPreview.js.map +1 -0
- package/dist/adv/explorer/preview/OfficePreview.d.ts +12 -0
- package/dist/adv/explorer/preview/OfficePreview.d.ts.map +1 -0
- package/dist/adv/explorer/preview/OfficePreview.js +63 -0
- package/dist/adv/explorer/preview/OfficePreview.js.map +1 -0
- package/dist/adv/explorer/preview/TextPreview.d.ts +18 -0
- package/dist/adv/explorer/preview/TextPreview.d.ts.map +1 -0
- package/dist/adv/explorer/preview/TextPreview.js +122 -0
- package/dist/adv/explorer/preview/TextPreview.js.map +1 -0
- package/dist/adv/explorer/preview/index.d.ts +24 -0
- package/dist/adv/explorer/preview/index.d.ts.map +1 -0
- package/dist/adv/explorer/preview/index.js +58 -0
- package/dist/adv/explorer/preview/index.js.map +1 -0
- package/dist/adv/explorer/preview/md-labels.d.ts +3 -0
- package/dist/adv/explorer/preview/md-labels.d.ts.map +1 -0
- package/dist/adv/explorer/preview/md-labels.js +12 -0
- package/dist/adv/explorer/preview/md-labels.js.map +1 -0
- package/dist/adv/explorer/preview-title-bar.d.ts +26 -0
- package/dist/adv/explorer/preview-title-bar.d.ts.map +1 -0
- package/dist/adv/explorer/preview-title-bar.js +48 -0
- package/dist/adv/explorer/preview-title-bar.js.map +1 -0
- package/dist/adv/explorer/types.d.ts +259 -0
- package/dist/adv/explorer/types.d.ts.map +1 -0
- package/dist/adv/explorer/types.js +379 -0
- package/dist/adv/explorer/types.js.map +1 -0
- package/dist/adv/session/SessionViewModal.d.ts +37 -0
- package/dist/adv/session/SessionViewModal.d.ts.map +1 -0
- package/dist/adv/session/SessionViewModal.js +1133 -0
- package/dist/adv/session/SessionViewModal.js.map +1 -0
- package/dist/adv/session/changes.d.ts +73 -0
- package/dist/adv/session/changes.d.ts.map +1 -0
- package/dist/adv/session/changes.js +134 -0
- package/dist/adv/session/changes.js.map +1 -0
- package/dist/adv/session/faces.d.ts +244 -0
- package/dist/adv/session/faces.d.ts.map +1 -0
- package/dist/adv/session/faces.js +17 -0
- package/dist/adv/session/faces.js.map +1 -0
- package/dist/adv/session/index.d.ts +7 -0
- package/dist/adv/session/index.d.ts.map +1 -0
- package/dist/adv/session/index.js +27 -0
- package/dist/adv/session/index.js.map +1 -0
- package/dist/adv/session/mirror/AskCard.d.ts +35 -0
- package/dist/adv/session/mirror/AskCard.d.ts.map +1 -0
- package/dist/adv/session/mirror/AskCard.js +131 -0
- package/dist/adv/session/mirror/AskCard.js.map +1 -0
- package/dist/adv/session/mirror/BashRow.d.ts +14 -0
- package/dist/adv/session/mirror/BashRow.d.ts.map +1 -0
- package/dist/adv/session/mirror/BashRow.js +143 -0
- package/dist/adv/session/mirror/BashRow.js.map +1 -0
- package/dist/adv/session/mirror/ChangedFileDiff.d.ts +25 -0
- package/dist/adv/session/mirror/ChangedFileDiff.d.ts.map +1 -0
- package/dist/adv/session/mirror/ChangedFileDiff.js +178 -0
- package/dist/adv/session/mirror/ChangedFileDiff.js.map +1 -0
- package/dist/adv/session/mirror/ChangedFilesCard.d.ts +18 -0
- package/dist/adv/session/mirror/ChangedFilesCard.d.ts.map +1 -0
- package/dist/adv/session/mirror/ChangedFilesCard.js +165 -0
- package/dist/adv/session/mirror/ChangedFilesCard.js.map +1 -0
- package/dist/adv/session/mirror/ChatGroupSeat.d.ts +24 -0
- package/dist/adv/session/mirror/ChatGroupSeat.d.ts.map +1 -0
- package/dist/adv/session/mirror/ChatGroupSeat.js +135 -0
- package/dist/adv/session/mirror/ChatGroupSeat.js.map +1 -0
- package/dist/adv/session/mirror/ChatNodeSeat.d.ts +43 -0
- package/dist/adv/session/mirror/ChatNodeSeat.d.ts.map +1 -0
- package/dist/adv/session/mirror/ChatNodeSeat.js +133 -0
- package/dist/adv/session/mirror/ChatNodeSeat.js.map +1 -0
- package/dist/adv/session/mirror/ChatView.d.ts +47 -0
- package/dist/adv/session/mirror/ChatView.d.ts.map +1 -0
- package/dist/adv/session/mirror/ChatView.js +138 -0
- package/dist/adv/session/mirror/ChatView.js.map +1 -0
- package/dist/adv/session/mirror/CommandCard.d.ts +20 -0
- package/dist/adv/session/mirror/CommandCard.d.ts.map +1 -0
- package/dist/adv/session/mirror/CommandCard.js +69 -0
- package/dist/adv/session/mirror/CommandCard.js.map +1 -0
- package/dist/adv/session/mirror/ContextInjectionRow.d.ts +18 -0
- package/dist/adv/session/mirror/ContextInjectionRow.d.ts.map +1 -0
- package/dist/adv/session/mirror/ContextInjectionRow.js +50 -0
- package/dist/adv/session/mirror/ContextInjectionRow.js.map +1 -0
- package/dist/adv/session/mirror/Deliverables.d.ts +24 -0
- package/dist/adv/session/mirror/Deliverables.d.ts.map +1 -0
- package/dist/adv/session/mirror/Deliverables.js +175 -0
- package/dist/adv/session/mirror/Deliverables.js.map +1 -0
- package/dist/adv/session/mirror/GenericCommandCard.d.ts +136 -0
- package/dist/adv/session/mirror/GenericCommandCard.d.ts.map +1 -0
- package/dist/adv/session/mirror/GenericCommandCard.js +948 -0
- package/dist/adv/session/mirror/GenericCommandCard.js.map +1 -0
- package/dist/adv/session/mirror/MessageIconActions.d.ts +16 -0
- package/dist/adv/session/mirror/MessageIconActions.d.ts.map +1 -0
- package/dist/adv/session/mirror/MessageIconActions.js +69 -0
- package/dist/adv/session/mirror/MessageIconActions.js.map +1 -0
- package/dist/adv/session/mirror/MessageItem.d.ts +93 -0
- package/dist/adv/session/mirror/MessageItem.d.ts.map +1 -0
- package/dist/adv/session/mirror/MessageItem.js +194 -0
- package/dist/adv/session/mirror/MessageItem.js.map +1 -0
- package/dist/adv/session/mirror/ReasoningRow.d.ts +11 -0
- package/dist/adv/session/mirror/ReasoningRow.d.ts.map +1 -0
- package/dist/adv/session/mirror/ReasoningRow.js +111 -0
- package/dist/adv/session/mirror/ReasoningRow.js.map +1 -0
- package/dist/adv/session/mirror/RunningStatus.d.ts +12 -0
- package/dist/adv/session/mirror/RunningStatus.d.ts.map +1 -0
- package/dist/adv/session/mirror/RunningStatus.js +57 -0
- package/dist/adv/session/mirror/RunningStatus.js.map +1 -0
- package/dist/adv/session/mirror/StatDialog.d.ts +20 -0
- package/dist/adv/session/mirror/StatDialog.d.ts.map +1 -0
- package/dist/adv/session/mirror/StatDialog.js +49 -0
- package/dist/adv/session/mirror/StatDialog.js.map +1 -0
- package/dist/adv/session/mirror/ToolDetails.d.ts +65 -0
- package/dist/adv/session/mirror/ToolDetails.d.ts.map +1 -0
- package/dist/adv/session/mirror/ToolDetails.js +268 -0
- package/dist/adv/session/mirror/ToolDetails.js.map +1 -0
- package/dist/adv/session/mirror/TurnProcessNodeView.d.ts +10 -0
- package/dist/adv/session/mirror/TurnProcessNodeView.d.ts.map +1 -0
- package/dist/adv/session/mirror/TurnProcessNodeView.js +57 -0
- package/dist/adv/session/mirror/TurnProcessNodeView.js.map +1 -0
- package/dist/adv/session/mirror/TurnTailNodeView.d.ts +57 -0
- package/dist/adv/session/mirror/TurnTailNodeView.d.ts.map +1 -0
- package/dist/adv/session/mirror/TurnTailNodeView.js +106 -0
- package/dist/adv/session/mirror/TurnTailNodeView.js.map +1 -0
- package/dist/adv/session/mirror/TurnTriggerNodeView.d.ts +16 -0
- package/dist/adv/session/mirror/TurnTriggerNodeView.d.ts.map +1 -0
- package/dist/adv/session/mirror/TurnTriggerNodeView.js +103 -0
- package/dist/adv/session/mirror/TurnTriggerNodeView.js.map +1 -0
- package/dist/adv/session/mirror/TurnUsagePanel.d.ts +21 -0
- package/dist/adv/session/mirror/TurnUsagePanel.d.ts.map +1 -0
- package/dist/adv/session/mirror/TurnUsagePanel.js +41 -0
- package/dist/adv/session/mirror/TurnUsagePanel.js.map +1 -0
- package/dist/adv/session/mirror/control-details.d.ts +9 -0
- package/dist/adv/session/mirror/control-details.d.ts.map +1 -0
- package/dist/adv/session/mirror/control-details.js +549 -0
- package/dist/adv/session/mirror/control-details.js.map +1 -0
- package/dist/adv/session/mirror/detail-i18n.d.ts +4 -0
- package/dist/adv/session/mirror/detail-i18n.d.ts.map +1 -0
- package/dist/adv/session/mirror/detail-i18n.js +153 -0
- package/dist/adv/session/mirror/detail-i18n.js.map +1 -0
- package/dist/adv/session/mirror/message-chrome.d.ts +39 -0
- package/dist/adv/session/mirror/message-chrome.d.ts.map +1 -0
- package/dist/adv/session/mirror/message-chrome.js +153 -0
- package/dist/adv/session/mirror/message-chrome.js.map +1 -0
- package/dist/adv/session/mirror/process-groups.d.ts +56 -0
- package/dist/adv/session/mirror/process-groups.d.ts.map +1 -0
- package/dist/adv/session/mirror/process-groups.js +204 -0
- package/dist/adv/session/mirror/process-groups.js.map +1 -0
- package/dist/adv/session/official-classes.d.ts +28 -0
- package/dist/adv/session/official-classes.d.ts.map +1 -0
- package/dist/adv/session/official-classes.js +152 -0
- package/dist/adv/session/official-classes.js.map +1 -0
- package/dist/adv/session/open-review.d.ts +13 -0
- package/dist/adv/session/open-review.d.ts.map +1 -0
- package/dist/adv/session/open-review.js +32 -0
- package/dist/adv/session/open-review.js.map +1 -0
- package/dist/adv/session/open-session-view.d.ts +19 -0
- package/dist/adv/session/open-session-view.d.ts.map +1 -0
- package/dist/adv/session/open-session-view.js +147 -0
- package/dist/adv/session/open-session-view.js.map +1 -0
- package/dist/adv/session/pending-inputs.d.ts +33 -0
- package/dist/adv/session/pending-inputs.d.ts.map +1 -0
- package/dist/adv/session/pending-inputs.js +130 -0
- package/dist/adv/session/pending-inputs.js.map +1 -0
- package/dist/adv/session/session-css.d.ts +2 -0
- package/dist/adv/session/session-css.d.ts.map +1 -0
- package/dist/adv/session/session-css.generated.d.ts +2 -0
- package/dist/adv/session/session-css.generated.d.ts.map +1 -0
- package/dist/adv/session/session-css.generated.js +4 -0
- package/dist/adv/session/session-css.generated.js.map +1 -0
- package/dist/adv/session/session-css.js +3 -0
- package/dist/adv/session/session-css.js.map +1 -0
- package/dist/adv/session/tail-follow.d.ts +29 -0
- package/dist/adv/session/tail-follow.d.ts.map +1 -0
- package/dist/adv/session/tail-follow.js +106 -0
- package/dist/adv/session/tail-follow.js.map +1 -0
- package/dist/design/tokens-css.generated.d.ts +1 -1
- package/dist/design/tokens-css.generated.d.ts.map +1 -1
- package/dist/design/tokens-css.generated.js +1 -1
- package/dist/design/tokens-css.generated.js.map +1 -1
- package/dist/ui/Button.d.ts.map +1 -1
- package/dist/ui/Button.js +6 -2
- package/dist/ui/Button.js.map +1 -1
- package/dist/ui/Checkbox.d.ts.map +1 -1
- package/dist/ui/Checkbox.js +7 -3
- package/dist/ui/Checkbox.js.map +1 -1
- package/dist/ui/DateTimePicker.d.ts.map +1 -1
- package/dist/ui/DateTimePicker.js +4 -3
- package/dist/ui/DateTimePicker.js.map +1 -1
- package/dist/ui/Field.d.ts.map +1 -1
- package/dist/ui/Field.js +15 -7
- package/dist/ui/Field.js.map +1 -1
- package/dist/ui/Modal.d.ts +7 -6
- package/dist/ui/Modal.d.ts.map +1 -1
- package/dist/ui/Modal.js +6 -6
- package/dist/ui/Modal.js.map +1 -1
- package/dist/ui/Pagination.d.ts.map +1 -1
- package/dist/ui/Pagination.js +3 -1
- package/dist/ui/Pagination.js.map +1 -1
- package/dist/ui/Picker.d.ts.map +1 -1
- package/dist/ui/Picker.js +3 -2
- package/dist/ui/Picker.js.map +1 -1
- package/dist/ui/Segmented.d.ts.map +1 -1
- package/dist/ui/Segmented.js +4 -1
- package/dist/ui/Segmented.js.map +1 -1
- package/dist/ui/SideSheet.d.ts.map +1 -1
- package/dist/ui/SideSheet.js +6 -5
- package/dist/ui/SideSheet.js.map +1 -1
- package/dist/ui/Textarea.d.ts.map +1 -1
- package/dist/ui/Textarea.js +4 -1
- package/dist/ui/Textarea.js.map +1 -1
- package/dist/ui/actions/Button.d.ts +102 -0
- package/dist/ui/actions/Button.d.ts.map +1 -0
- package/dist/ui/actions/Button.js +233 -0
- package/dist/ui/actions/Button.js.map +1 -0
- package/dist/ui/actions/button-css.generated.d.ts +2 -0
- package/dist/ui/actions/button-css.generated.d.ts.map +1 -0
- package/dist/ui/actions/button-css.generated.js +4 -0
- package/dist/ui/actions/button-css.generated.js.map +1 -0
- package/dist/ui/display/Card.d.ts +65 -0
- package/dist/ui/display/Card.d.ts.map +1 -0
- package/dist/ui/display/Card.js +109 -0
- package/dist/ui/display/Card.js.map +1 -0
- package/dist/ui/display/Chip.d.ts +28 -0
- package/dist/ui/display/Chip.d.ts.map +1 -0
- package/dist/ui/display/Chip.js +36 -0
- package/dist/ui/display/Chip.js.map +1 -0
- package/dist/ui/display/CodeViewer.d.ts +38 -0
- package/dist/ui/display/CodeViewer.d.ts.map +1 -0
- package/dist/ui/display/CodeViewer.js +107 -0
- package/dist/ui/display/CodeViewer.js.map +1 -0
- package/dist/ui/display/FieldHint.d.ts +18 -0
- package/dist/ui/display/FieldHint.d.ts.map +1 -0
- package/dist/ui/display/FieldHint.js +40 -0
- package/dist/ui/display/FieldHint.js.map +1 -0
- package/dist/ui/display/FlipText.d.ts +43 -0
- package/dist/ui/display/FlipText.d.ts.map +1 -0
- package/dist/ui/display/FlipText.js +59 -0
- package/dist/ui/display/FlipText.js.map +1 -0
- package/dist/ui/display/LiveText.d.ts +13 -0
- package/dist/ui/display/LiveText.d.ts.map +1 -0
- package/dist/ui/display/LiveText.js +19 -0
- package/dist/ui/display/LiveText.js.map +1 -0
- package/dist/ui/display/MarqueeText.d.ts +22 -0
- package/dist/ui/display/MarqueeText.d.ts.map +1 -0
- package/dist/ui/display/MarqueeText.js +52 -0
- package/dist/ui/display/MarqueeText.js.map +1 -0
- package/dist/ui/display/SectionHead.d.ts +35 -0
- package/dist/ui/display/SectionHead.d.ts.map +1 -0
- package/dist/ui/display/SectionHead.js +45 -0
- package/dist/ui/display/SectionHead.js.map +1 -0
- package/dist/ui/display/Surface.d.ts +43 -0
- package/dist/ui/display/Surface.d.ts.map +1 -0
- package/dist/ui/display/Surface.js +39 -0
- package/dist/ui/display/Surface.js.map +1 -0
- package/dist/ui/display/Table.d.ts +30 -0
- package/dist/ui/display/Table.d.ts.map +1 -0
- package/dist/ui/display/Table.js +96 -0
- package/dist/ui/display/Table.js.map +1 -0
- package/dist/ui/display/card-css.d.ts +2 -0
- package/dist/ui/display/card-css.d.ts.map +1 -0
- package/dist/ui/display/card-css.generated.d.ts +2 -0
- package/dist/ui/display/card-css.generated.d.ts.map +1 -0
- package/dist/ui/display/card-css.generated.js +4 -0
- package/dist/ui/display/card-css.generated.js.map +1 -0
- package/dist/ui/display/card-css.js +5 -0
- package/dist/ui/display/card-css.js.map +1 -0
- package/dist/ui/display/chip-css.d.ts +2 -0
- package/dist/ui/display/chip-css.d.ts.map +1 -0
- package/dist/ui/display/chip-css.generated.d.ts +2 -0
- package/dist/ui/display/chip-css.generated.d.ts.map +1 -0
- package/dist/ui/display/chip-css.generated.js +4 -0
- package/dist/ui/display/chip-css.generated.js.map +1 -0
- package/dist/ui/display/chip-css.js +12 -0
- package/dist/ui/display/chip-css.js.map +1 -0
- package/dist/ui/display/code-viewer-css.d.ts +2 -0
- package/dist/ui/display/code-viewer-css.d.ts.map +1 -0
- package/dist/ui/display/code-viewer-css.generated.d.ts +2 -0
- package/dist/ui/display/code-viewer-css.generated.d.ts.map +1 -0
- package/dist/ui/display/code-viewer-css.generated.js +4 -0
- package/dist/ui/display/code-viewer-css.generated.js.map +1 -0
- package/dist/ui/display/code-viewer-css.js +3 -0
- package/dist/ui/display/code-viewer-css.js.map +1 -0
- package/dist/ui/display/code-viewer-lang.d.ts +15 -0
- package/dist/ui/display/code-viewer-lang.d.ts.map +1 -0
- package/dist/ui/display/code-viewer-lang.js +190 -0
- package/dist/ui/display/code-viewer-lang.js.map +1 -0
- package/dist/ui/display/code-viewer-theme.d.ts +5 -0
- package/dist/ui/display/code-viewer-theme.d.ts.map +1 -0
- package/dist/ui/display/code-viewer-theme.js +138 -0
- package/dist/ui/display/code-viewer-theme.js.map +1 -0
- package/dist/ui/display/flip-css.d.ts +2 -0
- package/dist/ui/display/flip-css.d.ts.map +1 -0
- package/dist/ui/display/flip-css.generated.d.ts +2 -0
- package/dist/ui/display/flip-css.generated.d.ts.map +1 -0
- package/dist/ui/display/flip-css.generated.js +4 -0
- package/dist/ui/display/flip-css.generated.js.map +1 -0
- package/dist/ui/display/flip-css.js +4 -0
- package/dist/ui/display/flip-css.js.map +1 -0
- package/dist/ui/display/hint-css.generated.d.ts +2 -0
- package/dist/ui/display/hint-css.generated.d.ts.map +1 -0
- package/dist/ui/display/hint-css.generated.js +4 -0
- package/dist/ui/display/hint-css.generated.js.map +1 -0
- package/dist/ui/display/marquee-css.d.ts +2 -0
- package/dist/ui/display/marquee-css.d.ts.map +1 -0
- package/dist/ui/display/marquee-css.generated.d.ts +2 -0
- package/dist/ui/display/marquee-css.generated.d.ts.map +1 -0
- package/dist/ui/display/marquee-css.generated.js +4 -0
- package/dist/ui/display/marquee-css.generated.js.map +1 -0
- package/dist/ui/display/marquee-css.js +4 -0
- package/dist/ui/display/marquee-css.js.map +1 -0
- package/dist/ui/display/section-head-css.generated.d.ts +2 -0
- package/dist/ui/display/section-head-css.generated.d.ts.map +1 -0
- package/dist/ui/display/section-head-css.generated.js +4 -0
- package/dist/ui/display/section-head-css.generated.js.map +1 -0
- package/dist/ui/display/surface-css.d.ts +2 -0
- package/dist/ui/display/surface-css.d.ts.map +1 -0
- package/dist/ui/display/surface-css.generated.d.ts +2 -0
- package/dist/ui/display/surface-css.generated.d.ts.map +1 -0
- package/dist/ui/display/surface-css.generated.js +4 -0
- package/dist/ui/display/surface-css.generated.js.map +1 -0
- package/dist/ui/display/surface-css.js +7 -0
- package/dist/ui/display/surface-css.js.map +1 -0
- package/dist/ui/display/table-css.generated.d.ts +2 -0
- package/dist/ui/display/table-css.generated.d.ts.map +1 -0
- package/dist/ui/display/table-css.generated.js +4 -0
- package/dist/ui/display/table-css.generated.js.map +1 -0
- package/dist/ui/display/table-logic.d.ts +110 -0
- package/dist/ui/display/table-logic.d.ts.map +1 -0
- package/dist/ui/display/table-logic.js +81 -0
- package/dist/ui/display/table-logic.js.map +1 -0
- package/dist/ui/display/table-plain-css.generated.d.ts +2 -0
- package/dist/ui/display/table-plain-css.generated.d.ts.map +1 -0
- package/dist/ui/display/table-plain-css.generated.js +4 -0
- package/dist/ui/display/table-plain-css.generated.js.map +1 -0
- package/dist/ui/display/table-shared.d.ts +101 -0
- package/dist/ui/display/table-shared.d.ts.map +1 -0
- package/dist/ui/display/table-shared.js +229 -0
- package/dist/ui/display/table-shared.js.map +1 -0
- package/dist/ui/feedback/AlertModal.d.ts +41 -0
- package/dist/ui/feedback/AlertModal.d.ts.map +1 -0
- package/dist/ui/feedback/AlertModal.js +45 -0
- package/dist/ui/feedback/AlertModal.js.map +1 -0
- package/dist/ui/feedback/ConfirmModal.d.ts +50 -0
- package/dist/ui/feedback/ConfirmModal.d.ts.map +1 -0
- package/dist/ui/feedback/ConfirmModal.js +47 -0
- package/dist/ui/feedback/ConfirmModal.js.map +1 -0
- package/dist/ui/feedback/Loader.d.ts +49 -0
- package/dist/ui/feedback/Loader.d.ts.map +1 -0
- package/dist/ui/feedback/Loader.js +79 -0
- package/dist/ui/feedback/Loader.js.map +1 -0
- package/dist/ui/feedback/LoaderBar.d.ts +38 -0
- package/dist/ui/feedback/LoaderBar.d.ts.map +1 -0
- package/dist/ui/feedback/LoaderBar.js +79 -0
- package/dist/ui/feedback/LoaderBar.js.map +1 -0
- package/dist/ui/feedback/Loading.d.ts +69 -0
- package/dist/ui/feedback/Loading.d.ts.map +1 -0
- package/dist/ui/feedback/Loading.js +164 -0
- package/dist/ui/feedback/Loading.js.map +1 -0
- package/dist/ui/feedback/Modal.d.ts +73 -0
- package/dist/ui/feedback/Modal.d.ts.map +1 -0
- package/dist/ui/feedback/Modal.js +83 -0
- package/dist/ui/feedback/Modal.js.map +1 -0
- package/dist/ui/feedback/SideSheet.d.ts +70 -0
- package/dist/ui/feedback/SideSheet.d.ts.map +1 -0
- package/dist/ui/feedback/SideSheet.js +130 -0
- package/dist/ui/feedback/SideSheet.js.map +1 -0
- package/dist/ui/feedback/Toast.d.ts +45 -0
- package/dist/ui/feedback/Toast.d.ts.map +1 -0
- package/dist/ui/feedback/Toast.js +225 -0
- package/dist/ui/feedback/Toast.js.map +1 -0
- package/dist/ui/feedback/feedback-css.d.ts +2 -0
- package/dist/ui/feedback/feedback-css.d.ts.map +1 -0
- package/dist/ui/feedback/feedback-css.generated.d.ts +2 -0
- package/dist/ui/feedback/feedback-css.generated.d.ts.map +1 -0
- package/dist/ui/feedback/feedback-css.generated.js +4 -0
- package/dist/ui/feedback/feedback-css.generated.js.map +1 -0
- package/dist/ui/feedback/feedback-css.js +4 -0
- package/dist/ui/feedback/feedback-css.js.map +1 -0
- package/dist/ui/feedback/host-toast.d.ts +23 -0
- package/dist/ui/feedback/host-toast.d.ts.map +1 -0
- package/dist/ui/feedback/host-toast.js +34 -0
- package/dist/ui/feedback/host-toast.js.map +1 -0
- package/dist/ui/feedback/loader-bar-art.d.ts +6 -0
- package/dist/ui/feedback/loader-bar-art.d.ts.map +1 -0
- package/dist/ui/feedback/loader-bar-art.js +6 -0
- package/dist/ui/feedback/loader-bar-art.js.map +1 -0
- package/dist/ui/feedback/loader-bar-css.generated.d.ts +2 -0
- package/dist/ui/feedback/loader-bar-css.generated.d.ts.map +1 -0
- package/dist/ui/feedback/loader-bar-css.generated.js +4 -0
- package/dist/ui/feedback/loader-bar-css.generated.js.map +1 -0
- package/dist/ui/feedback/loader-css.generated.d.ts +2 -0
- package/dist/ui/feedback/loader-css.generated.d.ts.map +1 -0
- package/dist/ui/feedback/loader-css.generated.js +4 -0
- package/dist/ui/feedback/loader-css.generated.js.map +1 -0
- package/dist/ui/feedback/loading-css.generated.d.ts +2 -0
- package/dist/ui/feedback/loading-css.generated.d.ts.map +1 -0
- package/dist/ui/feedback/loading-css.generated.js +4 -0
- package/dist/ui/feedback/loading-css.generated.js.map +1 -0
- package/dist/ui/feedback/loading-host.d.ts +49 -0
- package/dist/ui/feedback/loading-host.d.ts.map +1 -0
- package/dist/ui/feedback/loading-host.js +57 -0
- package/dist/ui/feedback/loading-host.js.map +1 -0
- package/dist/ui/feedback/modal-host.d.ts +51 -0
- package/dist/ui/feedback/modal-host.d.ts.map +1 -0
- package/dist/ui/feedback/modal-host.js +170 -0
- package/dist/ui/feedback/modal-host.js.map +1 -0
- package/dist/ui/feedback/side-sheet-css.d.ts +2 -0
- package/dist/ui/feedback/side-sheet-css.d.ts.map +1 -0
- package/dist/ui/feedback/side-sheet-css.generated.d.ts +2 -0
- package/dist/ui/feedback/side-sheet-css.generated.d.ts.map +1 -0
- package/dist/ui/feedback/side-sheet-css.generated.js +4 -0
- package/dist/ui/feedback/side-sheet-css.generated.js.map +1 -0
- package/dist/ui/feedback/side-sheet-css.js +2 -0
- package/dist/ui/feedback/side-sheet-css.js.map +1 -0
- package/dist/ui/feedback/toast-host.d.ts +24 -0
- package/dist/ui/feedback/toast-host.d.ts.map +1 -0
- package/dist/ui/feedback/toast-host.js +20 -0
- package/dist/ui/feedback/toast-host.js.map +1 -0
- package/dist/ui/feedback-css.generated.d.ts +1 -1
- package/dist/ui/feedback-css.generated.d.ts.map +1 -1
- package/dist/ui/feedback-css.generated.js +1 -1
- package/dist/ui/feedback-css.generated.js.map +1 -1
- package/dist/ui/index.d.ts +44 -44
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +44 -44
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/infra/chevron.d.ts +22 -0
- package/dist/ui/infra/chevron.d.ts.map +1 -0
- package/dist/ui/infra/chevron.js +33 -0
- package/dist/ui/infra/chevron.js.map +1 -0
- package/dist/ui/infra/controls-css.d.ts +16 -0
- package/dist/ui/infra/controls-css.d.ts.map +1 -0
- package/dist/ui/infra/controls-css.js +26 -0
- package/dist/ui/infra/controls-css.js.map +1 -0
- package/dist/ui/infra/css.d.ts +35 -0
- package/dist/ui/infra/css.d.ts.map +1 -0
- package/dist/ui/infra/css.js +52 -0
- package/dist/ui/infra/css.js.map +1 -0
- package/dist/ui/infra/host-data.d.ts +119 -0
- package/dist/ui/infra/host-data.d.ts.map +1 -0
- package/dist/ui/infra/host-data.js +122 -0
- package/dist/ui/infra/host-data.js.map +1 -0
- package/dist/ui/infra/locale.d.ts +4 -0
- package/dist/ui/infra/locale.d.ts.map +1 -0
- package/dist/ui/infra/locale.js +17 -0
- package/dist/ui/infra/locale.js.map +1 -0
- package/dist/ui/infra/overlay-css.d.ts +2 -0
- package/dist/ui/infra/overlay-css.d.ts.map +1 -0
- package/dist/ui/infra/overlay-css.generated.d.ts +2 -0
- package/dist/ui/infra/overlay-css.generated.d.ts.map +1 -0
- package/dist/ui/infra/overlay-css.generated.js +4 -0
- package/dist/ui/infra/overlay-css.generated.js.map +1 -0
- package/dist/ui/infra/overlay-css.js +2 -0
- package/dist/ui/infra/overlay-css.js.map +1 -0
- package/dist/ui/infra/overlay.d.ts +62 -0
- package/dist/ui/infra/overlay.d.ts.map +1 -0
- package/dist/ui/infra/overlay.js +94 -0
- package/dist/ui/infra/overlay.js.map +1 -0
- package/dist/ui/infra/panel-css.d.ts +2 -0
- package/dist/ui/infra/panel-css.d.ts.map +1 -0
- package/dist/ui/infra/panel-css.generated.d.ts +2 -0
- package/dist/ui/infra/panel-css.generated.d.ts.map +1 -0
- package/dist/ui/infra/panel-css.generated.js +4 -0
- package/dist/ui/infra/panel-css.generated.js.map +1 -0
- package/dist/ui/infra/panel-css.js +2 -0
- package/dist/ui/infra/panel-css.js.map +1 -0
- package/dist/ui/infra/panel.d.ts +41 -0
- package/dist/ui/infra/panel.d.ts.map +1 -0
- package/dist/ui/infra/panel.js +37 -0
- package/dist/ui/infra/panel.js.map +1 -0
- package/dist/ui/infra/side-panel-css.d.ts +2 -0
- package/dist/ui/infra/side-panel-css.d.ts.map +1 -0
- package/dist/ui/infra/side-panel-css.generated.d.ts +2 -0
- package/dist/ui/infra/side-panel-css.generated.d.ts.map +1 -0
- package/dist/ui/infra/side-panel-css.generated.js +4 -0
- package/dist/ui/infra/side-panel-css.generated.js.map +1 -0
- package/dist/ui/infra/side-panel-css.js +2 -0
- package/dist/ui/infra/side-panel-css.js.map +1 -0
- package/dist/ui/infra/thenable.d.ts +9 -0
- package/dist/ui/infra/thenable.d.ts.map +1 -0
- package/dist/ui/infra/thenable.js +15 -0
- package/dist/ui/infra/thenable.js.map +1 -0
- package/dist/ui/infra/ticker.d.ts +8 -0
- package/dist/ui/infra/ticker.d.ts.map +1 -0
- package/dist/ui/infra/ticker.js +49 -0
- package/dist/ui/infra/ticker.js.map +1 -0
- package/dist/ui/infra/tooltip.d.ts +29 -0
- package/dist/ui/infra/tooltip.d.ts.map +1 -0
- package/dist/ui/infra/tooltip.js +10 -0
- package/dist/ui/infra/tooltip.js.map +1 -0
- package/dist/ui/inputs/Checkbox.d.ts +24 -0
- package/dist/ui/inputs/Checkbox.d.ts.map +1 -0
- package/dist/ui/inputs/Checkbox.js +35 -0
- package/dist/ui/inputs/Checkbox.js.map +1 -0
- package/dist/ui/inputs/DateTimePicker.d.ts +45 -0
- package/dist/ui/inputs/DateTimePicker.d.ts.map +1 -0
- package/dist/ui/inputs/DateTimePicker.js +462 -0
- package/dist/ui/inputs/DateTimePicker.js.map +1 -0
- package/dist/ui/inputs/Field.d.ts +125 -0
- package/dist/ui/inputs/Field.d.ts.map +1 -0
- package/dist/ui/inputs/Field.js +175 -0
- package/dist/ui/inputs/Field.js.map +1 -0
- package/dist/ui/inputs/InputGroup.d.ts +91 -0
- package/dist/ui/inputs/InputGroup.d.ts.map +1 -0
- package/dist/ui/inputs/InputGroup.js +125 -0
- package/dist/ui/inputs/InputGroup.js.map +1 -0
- package/dist/ui/inputs/ModelPicker.d.ts +48 -0
- package/dist/ui/inputs/ModelPicker.d.ts.map +1 -0
- package/dist/ui/inputs/ModelPicker.js +101 -0
- package/dist/ui/inputs/ModelPicker.js.map +1 -0
- package/dist/ui/inputs/Picker.d.ts +56 -0
- package/dist/ui/inputs/Picker.d.ts.map +1 -0
- package/dist/ui/inputs/Picker.js +244 -0
- package/dist/ui/inputs/Picker.js.map +1 -0
- package/dist/ui/inputs/Segmented.d.ts +99 -0
- package/dist/ui/inputs/Segmented.d.ts.map +1 -0
- package/dist/ui/inputs/Segmented.js +135 -0
- package/dist/ui/inputs/Segmented.js.map +1 -0
- package/dist/ui/inputs/Textarea.d.ts +36 -0
- package/dist/ui/inputs/Textarea.d.ts.map +1 -0
- package/dist/ui/inputs/Textarea.js +35 -0
- package/dist/ui/inputs/Textarea.js.map +1 -0
- package/dist/ui/inputs/WorkspacePicker.d.ts +35 -0
- package/dist/ui/inputs/WorkspacePicker.d.ts.map +1 -0
- package/dist/ui/inputs/WorkspacePicker.js +39 -0
- package/dist/ui/inputs/WorkspacePicker.js.map +1 -0
- package/dist/ui/inputs/datetime-css.generated.d.ts +2 -0
- package/dist/ui/inputs/datetime-css.generated.d.ts.map +1 -0
- package/dist/ui/inputs/datetime-css.generated.js +4 -0
- package/dist/ui/inputs/datetime-css.generated.js.map +1 -0
- package/dist/ui/inputs/datetime-logic.d.ts +102 -0
- package/dist/ui/inputs/datetime-logic.d.ts.map +1 -0
- package/dist/ui/inputs/datetime-logic.js +200 -0
- package/dist/ui/inputs/datetime-logic.js.map +1 -0
- package/dist/ui/inputs/field-css.generated.d.ts +2 -0
- package/dist/ui/inputs/field-css.generated.d.ts.map +1 -0
- package/dist/ui/inputs/field-css.generated.js +4 -0
- package/dist/ui/inputs/field-css.generated.js.map +1 -0
- package/dist/ui/inputs/input-group-css.generated.d.ts +2 -0
- package/dist/ui/inputs/input-group-css.generated.d.ts.map +1 -0
- package/dist/ui/inputs/input-group-css.generated.js +4 -0
- package/dist/ui/inputs/input-group-css.generated.js.map +1 -0
- package/dist/ui/inputs/picker-css.d.ts +2 -0
- package/dist/ui/inputs/picker-css.d.ts.map +1 -0
- package/dist/ui/inputs/picker-css.generated.d.ts +2 -0
- package/dist/ui/inputs/picker-css.generated.d.ts.map +1 -0
- package/dist/ui/inputs/picker-css.generated.js +4 -0
- package/dist/ui/inputs/picker-css.generated.js.map +1 -0
- package/dist/ui/inputs/picker-css.js +4 -0
- package/dist/ui/inputs/picker-css.js.map +1 -0
- package/dist/ui/inputs/picker-icons.d.ts +12 -0
- package/dist/ui/inputs/picker-icons.d.ts.map +1 -0
- package/dist/ui/inputs/picker-icons.js +29 -0
- package/dist/ui/inputs/picker-icons.js.map +1 -0
- package/dist/ui/inputs/picker-logic.d.ts +33 -0
- package/dist/ui/inputs/picker-logic.d.ts.map +1 -0
- package/dist/ui/inputs/picker-logic.js +68 -0
- package/dist/ui/inputs/picker-logic.js.map +1 -0
- package/dist/ui/inputs/segmented-css.generated.d.ts +2 -0
- package/dist/ui/inputs/segmented-css.generated.d.ts.map +1 -0
- package/dist/ui/inputs/segmented-css.generated.js +4 -0
- package/dist/ui/inputs/segmented-css.generated.js.map +1 -0
- package/dist/ui/layout/PanelDock.d.ts +132 -0
- package/dist/ui/layout/PanelDock.d.ts.map +1 -0
- package/dist/ui/layout/PanelDock.js +390 -0
- package/dist/ui/layout/PanelDock.js.map +1 -0
- package/dist/ui/layout/QuickToolbar.d.ts +54 -0
- package/dist/ui/layout/QuickToolbar.d.ts.map +1 -0
- package/dist/ui/layout/QuickToolbar.js +254 -0
- package/dist/ui/layout/QuickToolbar.js.map +1 -0
- package/dist/ui/layout/SplitGroup.d.ts +37 -0
- package/dist/ui/layout/SplitGroup.d.ts.map +1 -0
- package/dist/ui/layout/SplitGroup.js +36 -0
- package/dist/ui/layout/SplitGroup.js.map +1 -0
- package/dist/ui/layout/panel-dock-css.d.ts +2 -0
- package/dist/ui/layout/panel-dock-css.d.ts.map +1 -0
- package/dist/ui/layout/panel-dock-css.generated.d.ts +2 -0
- package/dist/ui/layout/panel-dock-css.generated.d.ts.map +1 -0
- package/dist/ui/layout/panel-dock-css.generated.js +4 -0
- package/dist/ui/layout/panel-dock-css.generated.js.map +1 -0
- package/dist/ui/layout/panel-dock-css.js +4 -0
- package/dist/ui/layout/panel-dock-css.js.map +1 -0
- package/dist/ui/layout/panel-dock-logic.d.ts +67 -0
- package/dist/ui/layout/panel-dock-logic.d.ts.map +1 -0
- package/dist/ui/layout/panel-dock-logic.js +110 -0
- package/dist/ui/layout/panel-dock-logic.js.map +1 -0
- package/dist/ui/layout/quick-toolbar-css.generated.d.ts +2 -0
- package/dist/ui/layout/quick-toolbar-css.generated.d.ts.map +1 -0
- package/dist/ui/layout/quick-toolbar-css.generated.js +4 -0
- package/dist/ui/layout/quick-toolbar-css.generated.js.map +1 -0
- package/dist/ui/layout/quick-toolbar-logic.d.ts +76 -0
- package/dist/ui/layout/quick-toolbar-logic.d.ts.map +1 -0
- package/dist/ui/layout/quick-toolbar-logic.js +40 -0
- package/dist/ui/layout/quick-toolbar-logic.js.map +1 -0
- package/dist/ui/layout/resizer.d.ts +29 -0
- package/dist/ui/layout/resizer.d.ts.map +1 -0
- package/dist/ui/layout/resizer.js +42 -0
- package/dist/ui/layout/resizer.js.map +1 -0
- package/dist/ui/layout/split-group-css.generated.d.ts +2 -0
- package/dist/ui/layout/split-group-css.generated.d.ts.map +1 -0
- package/dist/ui/layout/split-group-css.generated.js +4 -0
- package/dist/ui/layout/split-group-css.generated.js.map +1 -0
- package/dist/ui/navigation/Pagination.d.ts +59 -0
- package/dist/ui/navigation/Pagination.d.ts.map +1 -0
- package/dist/ui/navigation/Pagination.js +112 -0
- package/dist/ui/navigation/Pagination.js.map +1 -0
- package/dist/ui/navigation/pagination-css.generated.d.ts +2 -0
- package/dist/ui/navigation/pagination-css.generated.d.ts.map +1 -0
- package/dist/ui/navigation/pagination-css.generated.js +4 -0
- package/dist/ui/navigation/pagination-css.generated.js.map +1 -0
- package/dist/ui/navigation/pagination-logic.d.ts +36 -0
- package/dist/ui/navigation/pagination-logic.d.ts.map +1 -0
- package/dist/ui/navigation/pagination-logic.js +73 -0
- package/dist/ui/navigation/pagination-logic.js.map +1 -0
- package/dist/ui/official.js +2 -2
- package/dist/ui/official.js.map +1 -1
- package/dist/ui/overlay-css.generated.d.ts +1 -1
- package/dist/ui/overlay-css.generated.d.ts.map +1 -1
- package/dist/ui/overlay-css.generated.js +1 -1
- package/dist/ui/overlay-css.generated.js.map +1 -1
- package/dist/ui/overlay.d.ts +13 -0
- package/dist/ui/overlay.d.ts.map +1 -1
- package/dist/ui/overlay.js +33 -0
- package/dist/ui/overlay.js.map +1 -1
- package/dist/ui/side-sheet-css.generated.d.ts +1 -1
- package/dist/ui/side-sheet-css.generated.d.ts.map +1 -1
- package/dist/ui/side-sheet-css.generated.js +1 -1
- package/dist/ui/side-sheet-css.generated.js.map +1 -1
- package/dist/utils/i18n.d.ts +2 -2
- package/dist/utils/i18n.d.ts.map +1 -1
- package/dist/utils/i18n.js +1 -1
- package/dist/utils/i18n.js.map +1 -1
- package/docs/README.md +1 -1
- package/docs/design/architecture.md +9 -8
- package/docs/design/copywriting.md +23 -0
- package/docs/design/external/dsh-host.md +5 -5
- package/docs/design/structure.md +132 -128
- package/docs/design/style.md +5 -5
- package/docs/help/ui.doc.ts +4 -4
- package/docs/help/ui.md +4 -4
- package/docs/help/utils.doc.ts +3 -3
- package/docs/help/utils.md +3 -3
- package/docs/requirements.md +30 -276
- package/package.json +1 -1
|
@@ -0,0 +1,632 @@
|
|
|
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/actions/Button.js';
|
|
19
|
+
import { workspaceList } from '../../ui/infra/host-data.js';
|
|
20
|
+
import { useLocale } from '../../ui/infra/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/infra/css.js';
|
|
25
|
+
import { PANEL_CSS } from '../../ui/infra/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
|