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