niuma-ui 2.0.4 → 2.1.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/CHANGELOG.md +67 -0
- package/NOTICE +0 -1
- package/README.md +3 -3
- package/README.zh-CN.md +3 -3
- package/dist/components/_shared/index.d.ts +2 -2
- package/dist/components/_shared/src/overlay-utils.d.ts +44 -1
- package/dist/components/_shared/src/overlay-utils.js +87 -2
- package/dist/components/alert/index.d.ts +1 -0
- package/dist/components/alert/src/RsAlert.css +120 -65
- package/dist/components/alert/src/RsAlert.d.ts +24 -5
- package/dist/components/alert/src/RsAlert.impl.js +108 -36
- package/dist/components/alert/src/RsAlert.js +1 -1
- package/dist/components/alert/src/alert-utils.d.ts +37 -0
- package/dist/components/alert/src/alert-utils.js +71 -0
- package/dist/components/auto-complete/src/RsAutoComplete.d.ts +1 -1
- package/dist/components/button/src/RsButton.css +75 -72
- package/dist/components/button/src/RsButton.d.ts +1 -4
- package/dist/components/button/src/RsButton.impl.js +3 -7
- package/dist/components/button/src/RsButton.js +1 -1
- package/dist/components/card/src/RsCard.d.ts +1 -1
- package/dist/components/code-block/index.d.ts +1 -0
- package/dist/components/code-block/src/RsCodeBlock.css +93 -52
- package/dist/components/code-block/src/RsCodeBlock.d.ts +36 -9
- package/dist/components/code-block/src/RsCodeBlock.impl.js +203 -84
- package/dist/components/code-block/src/RsCodeBlock.js +1 -1
- package/dist/components/code-block/src/code-block-highlight.d.ts +4 -0
- package/dist/components/code-block/src/code-block-highlight.js +34 -0
- package/dist/components/code-block/src/code-block-utils.d.ts +23 -0
- package/dist/components/code-block/src/code-block-utils.js +71 -0
- package/dist/components/code-editor/index.d.ts +1 -1
- package/dist/components/code-editor/src/RsCodeEditor.css +118 -92
- package/dist/components/code-editor/src/RsCodeEditor.d.ts +14 -3
- package/dist/components/code-editor/src/RsCodeEditor.impl.js +261 -94
- package/dist/components/code-editor/src/RsCodeEditor.js +1 -1
- package/dist/components/code-editor/src/code-editor-utils.d.ts +15 -0
- package/dist/components/code-editor/src/code-editor-utils.js +36 -1
- package/dist/components/code-editor/src/code-mirror-completion.d.ts +1 -1
- package/dist/components/code-editor/src/code-mirror-completion.js +8 -5
- package/dist/components/code-editor/src/code-mirror-diagnostics.d.ts +2 -3
- package/dist/components/code-editor/src/code-mirror-diagnostics.js +3 -4
- package/dist/components/code-editor/src/code-mirror-ghost.d.ts +1 -1
- package/dist/components/code-editor/src/code-mirror-ghost.js +12 -3
- package/dist/components/code-editor/src/code-mirror-inline-edit.js +8 -3
- package/dist/components/code-editor/src/code-mirror-intel.d.ts +2 -2
- package/dist/components/code-editor/src/code-mirror-intel.js +50 -39
- package/dist/components/code-editor/src/code-mirror-lang.js +4 -0
- package/dist/components/code-editor/src/code-mirror-session.d.ts +13 -0
- package/dist/components/code-editor/src/code-mirror-session.js +30 -0
- package/dist/components/config-provider/src/RsConfigProvider.css +1 -1
- package/dist/components/config-provider/src/RsConfigProvider.d.ts +2 -2
- package/dist/components/config-provider/src/RsConfigProvider.impl.js +7 -16
- package/dist/components/config-provider/src/RsConfigProvider.js +1 -1
- package/dist/components/context-menu/index.d.ts +1 -1
- package/dist/components/context-menu/src/RsContextMenu.css +115 -89
- package/dist/components/context-menu/src/RsContextMenu.d.ts +32 -11
- package/dist/components/context-menu/src/RsContextMenu.impl.js +795 -48
- package/dist/components/context-menu/src/RsContextMenuItems.d.ts +25 -1
- package/dist/components/context-menu/src/RsContextMenuItems.impl.js +110 -61
- package/dist/components/context-menu/src/context-menu-utils.d.ts +89 -3
- package/dist/components/context-menu/src/context-menu-utils.js +168 -3
- package/dist/components/date-picker/src/RsDatePicker.d.ts +2 -2
- package/dist/components/date-picker/src/RsDateTimePicker.d.ts +2 -2
- package/dist/components/descriptions/index.d.ts +1 -1
- package/dist/components/descriptions/src/RsDescriptions.css +38 -11
- package/dist/components/descriptions/src/RsDescriptions.d.ts +20 -4
- package/dist/components/descriptions/src/RsDescriptions.impl.js +89 -19
- package/dist/components/descriptions/src/RsDescriptionsItem.impl.js +13 -6
- package/dist/components/descriptions/src/descriptions-utils.d.ts +19 -0
- package/dist/components/descriptions/src/descriptions-utils.js +39 -1
- package/dist/components/dialog/index.d.ts +1 -1
- package/dist/components/dialog/src/RsConfirmDialog.css +47 -21
- package/dist/components/dialog/src/RsConfirmDialog.d.ts +19 -7
- package/dist/components/dialog/src/RsConfirmDialog.impl.js +349 -119
- package/dist/components/dialog/src/RsConfirmDialog.js +2 -1
- package/dist/components/dialog/src/RsDialog.css +102 -109
- package/dist/components/dialog/src/RsDialog.d.ts +34 -24
- package/dist/components/dialog/src/RsDialog.impl.js +410 -177
- package/dist/components/dialog/src/RsDialog.js +2 -1
- package/dist/components/dialog/src/dialog-utils.d.ts +40 -1
- package/dist/components/dialog/src/dialog-utils.js +152 -1
- package/dist/components/dialog/src/dialog-window.js +29 -8
- package/dist/components/drawer/index.d.ts +1 -1
- package/dist/components/drawer/src/RsDrawer.css +61 -29
- package/dist/components/drawer/src/RsDrawer.d.ts +37 -21
- package/dist/components/drawer/src/RsDrawer.impl.js +441 -223
- package/dist/components/drawer/src/drawer-utils.d.ts +35 -0
- package/dist/components/drawer/src/drawer-utils.js +131 -1
- package/dist/components/dropdown/index.d.ts +1 -1
- package/dist/components/dropdown/src/RsDropdown.css +140 -61
- package/dist/components/dropdown/src/RsDropdown.d.ts +39 -6
- package/dist/components/dropdown/src/RsDropdown.impl.js +693 -63
- package/dist/components/dropdown/src/RsDropdownItemView.impl.js +17 -7
- package/dist/components/dropdown/src/RsDropdownItems.d.ts +32 -3
- package/dist/components/dropdown/src/RsDropdownItems.impl.js +171 -59
- package/dist/components/dropdown/src/dropdown-utils.d.ts +50 -0
- package/dist/components/dropdown/src/dropdown-utils.js +103 -3
- package/dist/components/empty/index.d.ts +1 -0
- package/dist/components/empty/src/RsEmpty.css +105 -23
- package/dist/components/empty/src/RsEmpty.d.ts +27 -4
- package/dist/components/empty/src/RsEmpty.impl.js +154 -11
- package/dist/components/empty/src/RsEmpty.js +2 -1
- package/dist/components/empty/src/empty-utils.d.ts +28 -0
- package/dist/components/empty/src/empty-utils.js +55 -0
- package/dist/components/form/src/RsForm.d.ts +1 -1
- package/dist/components/input-number/src/RsInputNumber.d.ts +1 -1
- package/dist/components/label/src/RsLabel.d.ts +1 -1
- package/dist/components/loading/index.d.ts +1 -0
- package/dist/components/loading/src/RsLoading.css +13 -97
- package/dist/components/loading/src/RsLoading.d.ts +52 -2
- package/dist/components/loading/src/RsLoading.impl.js +216 -33
- package/dist/components/loading/src/RsLoading.js +2 -1
- package/dist/components/loading/src/loading-status.css +210 -0
- package/dist/components/loading/src/loading-status.d.ts +34 -0
- package/dist/components/loading/src/loading-status.impl.js +84 -0
- package/dist/components/loading/src/loading-status.js +8 -0
- package/dist/components/loading/src/loading-utils.d.ts +51 -4
- package/dist/components/loading/src/loading-utils.js +122 -0
- package/dist/components/loading-bar/index.d.ts +1 -0
- package/dist/components/loading-bar/src/RsLoadingBar.css +72 -8
- package/dist/components/loading-bar/src/RsLoadingBar.d.ts +55 -11
- package/dist/components/loading-bar/src/RsLoadingBar.impl.js +298 -57
- package/dist/components/loading-bar/src/RsLoadingBar.js +1 -1
- package/dist/components/loading-bar/src/loading-bar-utils.d.ts +69 -0
- package/dist/components/loading-bar/src/loading-bar-utils.js +97 -0
- package/dist/components/log/src/RsLog.css +52 -144
- package/dist/components/log/src/RsLog.d.ts +12 -11
- package/dist/components/log/src/RsLog.impl.js +181 -148
- package/dist/components/log/src/RsLog.js +1 -1
- package/dist/components/log/src/RsLogRow.css +152 -0
- package/dist/components/log/src/RsLogRow.d.ts +35 -0
- package/dist/components/log/src/RsLogRow.impl.js +91 -0
- package/dist/components/log/src/RsLogRow.js +8 -0
- package/dist/components/log/src/log-utils.d.ts +8 -0
- package/dist/components/log/src/log-utils.js +71 -10
- package/dist/components/markdown/index.d.ts +1 -1
- package/dist/components/markdown/src/RsMarkdown.css +75 -32
- package/dist/components/markdown/src/RsMarkdown.d.ts +6 -2
- package/dist/components/markdown/src/RsMarkdown.impl.js +185 -17
- package/dist/components/markdown/src/markdown-utils.d.ts +26 -0
- package/dist/components/markdown/src/markdown-utils.js +114 -12
- package/dist/components/mentions/src/RsMentions.d.ts +2 -2
- package/dist/components/menu/index.d.ts +1 -1
- package/dist/components/menu/src/RsMenu.css +70 -29
- package/dist/components/menu/src/RsMenu.d.ts +58 -4
- package/dist/components/menu/src/RsMenu.impl.js +93 -46
- package/dist/components/menu/src/RsMenuItems.d.ts +22 -5
- package/dist/components/menu/src/RsMenuItems.impl.js +506 -154
- package/dist/components/menu/src/menu-utils.d.ts +56 -0
- package/dist/components/menu/src/menu-utils.js +139 -6
- package/dist/components/monaco-editor/index.d.ts +1 -1
- package/dist/components/monaco-editor/src/RsMonacoEditor.css +28 -16
- package/dist/components/monaco-editor/src/RsMonacoEditor.d.ts +39 -41
- package/dist/components/monaco-editor/src/RsMonacoEditor.impl.js +212 -133
- package/dist/components/monaco-editor/src/RsMonacoEditor.js +1 -1
- package/dist/components/monaco-editor/src/monaco-editor-utils.d.ts +126 -0
- package/dist/components/monaco-editor/src/monaco-editor-utils.js +302 -0
- package/dist/components/pagination/index.d.ts +2 -2
- package/dist/components/pagination/src/RsPagination.css +93 -46
- package/dist/components/pagination/src/RsPagination.d.ts +68 -8
- package/dist/components/pagination/src/RsPagination.impl.js +229 -86
- package/dist/components/pagination/src/RsPagination.js +1 -1
- package/dist/components/pagination/src/pagination-utils.d.ts +59 -0
- package/dist/components/pagination/src/pagination-utils.js +105 -1
- package/dist/components/popover/index.d.ts +1 -0
- package/dist/components/popover/src/RsPopover.css +124 -14
- package/dist/components/popover/src/RsPopover.d.ts +38 -7
- package/dist/components/popover/src/RsPopover.impl.js +546 -35
- package/dist/components/popover/src/RsPopover.js +2 -1
- package/dist/components/popover/src/popover-utils.d.ts +24 -2
- package/dist/components/popover/src/popover-utils.js +55 -0
- package/dist/components/sidebar/index.d.ts +1 -0
- package/dist/components/sidebar/src/RsSidebar.css +91 -33
- package/dist/components/sidebar/src/RsSidebar.d.ts +17 -9
- package/dist/components/sidebar/src/RsSidebar.impl.js +124 -22
- package/dist/components/sidebar/src/RsSidebar.js +1 -1
- package/dist/components/sidebar/src/RsSidebarGroup.css +23 -6
- package/dist/components/sidebar/src/RsSidebarGroup.d.ts +6 -2
- package/dist/components/sidebar/src/RsSidebarGroup.impl.js +17 -4
- package/dist/components/sidebar/src/RsSidebarGroup.js +1 -1
- package/dist/components/sidebar/src/RsSidebarItem.css +50 -20
- package/dist/components/sidebar/src/RsSidebarItem.d.ts +21 -3
- package/dist/components/sidebar/src/RsSidebarItem.impl.js +71 -20
- package/dist/components/sidebar/src/RsSidebarItem.js +1 -1
- package/dist/components/sidebar/src/sidebar-utils.d.ts +47 -0
- package/dist/components/sidebar/src/sidebar-utils.js +72 -0
- package/dist/components/split-pane/index.d.ts +2 -2
- package/dist/components/split-pane/src/RsSplitPane.css +41 -30
- package/dist/components/split-pane/src/RsSplitPane.d.ts +6 -2
- package/dist/components/split-pane/src/RsSplitPane.impl.js +153 -45
- package/dist/components/split-pane/src/split-pane-utils.d.ts +23 -0
- package/dist/components/split-pane/src/split-pane-utils.js +18 -1
- package/dist/components/stat-card/index.d.ts +1 -0
- package/dist/components/stat-card/src/RsStatCard.css +129 -25
- package/dist/components/stat-card/src/RsStatCard.d.ts +40 -4
- package/dist/components/stat-card/src/RsStatCard.impl.js +106 -12
- package/dist/components/stat-card/src/RsStatCard.js +1 -1
- package/dist/components/stat-card/src/stat-card-utils.d.ts +39 -0
- package/dist/components/stat-card/src/stat-card-utils.js +113 -0
- package/dist/components/steps/index.d.ts +1 -1
- package/dist/components/steps/src/RsSteps.css +158 -37
- package/dist/components/steps/src/RsSteps.d.ts +69 -5
- package/dist/components/steps/src/RsSteps.impl.js +168 -28
- package/dist/components/steps/src/RsSteps.js +1 -1
- package/dist/components/steps/src/steps-utils.d.ts +51 -1
- package/dist/components/steps/src/steps-utils.js +67 -1
- package/dist/components/table/src/RsTable.impl.js +4 -2
- package/dist/components/table/src/composables/useRsTableContextMenu.d.ts +16 -0
- package/dist/components/table/src/composables/useRsTableContextMenu.js +1 -1
- package/dist/components/table/src/composables/useRsTableEngine.js +6 -2
- package/dist/components/table/src/composables/useRsTableScrollLayout.js +2 -0
- package/dist/components/table/src/composables/useRsTableShell.d.ts +16 -0
- package/dist/components/table/src/rs-table-props.d.ts +1 -1
- package/dist/components/table/src/rs-table-props.js +0 -1
- package/dist/components/table/src/table-body/RsTableBody.impl.js +1 -0
- package/dist/components/table/src/table-body/RsTableCell.impl.js +1 -1
- package/dist/components/table/src/table-body/RsTableCellEditor.impl.js +10 -2
- package/dist/components/table/src/table-body/RsTableColGroup.impl.js +1 -0
- package/dist/components/table/src/table-footer/RsTableSummaryRow.impl.js +1 -0
- package/dist/components/table/src/table-header/RsTableHeader.impl.js +1 -0
- package/dist/components/table/src/utils/table-utils.d.ts +10 -6
- package/dist/components/table/src/utils/table-utils.js +27 -25
- package/dist/components/table/style/rs-table.css +86 -28
- package/dist/components/tabs/index.d.ts +2 -2
- package/dist/components/tabs/src/RsTabs.css +225 -101
- package/dist/components/tabs/src/RsTabs.d.ts +37 -8
- package/dist/components/tabs/src/RsTabs.impl.js +400 -270
- package/dist/components/tabs/src/tabs-utils.d.ts +41 -2
- package/dist/components/tabs/src/tabs-utils.js +55 -1
- package/dist/components/terminal/index.d.ts +1 -1
- package/dist/components/terminal/src/RsTerminal.css +60 -37
- package/dist/components/terminal/src/RsTerminal.d.ts +36 -4
- package/dist/components/terminal/src/RsTerminal.impl.js +288 -68
- package/dist/components/terminal/src/RsTerminal.js +1 -1
- package/dist/components/terminal/src/terminal-utils.d.ts +42 -4
- package/dist/components/terminal/src/terminal-utils.js +113 -10
- package/dist/components/textarea/src/RsTextarea.d.ts +1 -1
- package/dist/components/time-picker/src/RsTimePicker.d.ts +2 -2
- package/dist/components/toaster/src/RsToaster.css +156 -203
- package/dist/components/toaster/src/RsToaster.d.ts +32 -2
- package/dist/components/toaster/src/RsToaster.impl.js +309 -34
- package/dist/components/toaster/src/toast-store.d.ts +95 -0
- package/dist/components/toaster/src/toast-store.js +177 -0
- package/dist/components/toaster/src/toast-utils.d.ts +60 -0
- package/dist/components/toaster/src/toast-utils.js +86 -0
- package/dist/components/toolbar/index.d.ts +1 -1
- package/dist/components/toolbar/src/RsToolbar.css +206 -32
- package/dist/components/toolbar/src/RsToolbar.d.ts +41 -16
- package/dist/components/toolbar/src/RsToolbar.impl.js +146 -18
- package/dist/components/toolbar/src/RsToolbar.js +2 -1
- package/dist/components/toolbar/src/toolbar-utils.d.ts +20 -0
- package/dist/components/toolbar/src/toolbar-utils.js +105 -0
- package/dist/components/tooltip/index.d.ts +1 -0
- package/dist/components/tooltip/src/RsTooltip.css +104 -26
- package/dist/components/tooltip/src/RsTooltip.d.ts +38 -16
- package/dist/components/tooltip/src/RsTooltip.impl.js +420 -51
- package/dist/components/tooltip/src/RsTooltip.js +2 -1
- package/dist/components/tooltip/src/RsTooltipProvider.d.ts +4 -4
- package/dist/components/tooltip/src/RsTooltipProvider.impl.js +51 -14
- package/dist/components/tooltip/src/tooltip-utils.d.ts +30 -0
- package/dist/components/tooltip/src/tooltip-utils.js +23 -0
- package/dist/components/tree/index.d.ts +2 -2
- package/dist/components/tree/src/RsTree.css +84 -75
- package/dist/components/tree/src/RsTree.d.ts +20 -20
- package/dist/components/tree/src/RsTree.impl.js +292 -66
- package/dist/components/tree/src/RsTree.js +1 -1
- package/dist/components/tree/src/tree-utils.d.ts +22 -0
- package/dist/components/tree/src/tree-utils.js +18 -4
- package/dist/components/tree-select/src/RsTreeSelect.d.ts +1 -1
- package/dist/components/virtual-list/index.d.ts +1 -1
- package/dist/components/virtual-list/src/RsVirtualList.css +64 -9
- package/dist/components/virtual-list/src/RsVirtualList.d.ts +31 -5
- package/dist/components/virtual-list/src/RsVirtualList.impl.js +425 -76
- package/dist/components/virtual-list/src/RsVirtualList.js +1 -1
- package/dist/components/virtual-list/src/virtual-list-utils.d.ts +64 -1
- package/dist/components/virtual-list/src/virtual-list-utils.js +215 -1
- package/dist/composables/useRsLoadingBar.d.ts +2 -5
- package/dist/composables/useRsLoadingBar.js +21 -5
- package/dist/composables/useRsTabsNav.d.ts +3 -1
- package/dist/composables/useRsTabsNav.js +96 -28
- package/dist/composables/useRsToast.d.ts +11 -13
- package/dist/composables/useRsToast.js +66 -17
- package/dist/index.d.ts +30 -21
- package/dist/index.js +14 -0
- package/dist/locale/apply.js +6 -1
- package/dist/locale/messages.js +128 -2
- package/dist/styles.css +465 -808
- package/dist/theme/brand.example.css +3 -2
- package/dist/vite-plugins/niuma-ui-host.js +1 -1
- package/package.json +2 -5
- package/dist/components/_shared/src/reka.d.ts +0 -2
- package/dist/components/_shared/src/reka.js +0 -2
|
@@ -3,17 +3,28 @@ import RsLoading_default from "../../loading/src/RsLoading.js";
|
|
|
3
3
|
import RsContextMenu_default from "../../context-menu/src/RsContextMenu.js";
|
|
4
4
|
import { beginClipboardPrefetch, copyTextToClipboard, readClipboardText } from "../../../utils/rs-clipboard.js";
|
|
5
5
|
import { readTerminalFontFamily, readTerminalFontSizePx, readTerminalFontWeight, readTerminalFontWeightBold } from "../../../theme/css-token.js";
|
|
6
|
-
import { mergeTerminalTheme, needsPtyWriteViewportPrep, prepareTerminalForPtyWrite, proposeTerminalGeometry, readXtermCssCellSize, resolveTerminalTheme, terminalShortcutLabel } from "./terminal-utils.js";
|
|
6
|
+
import { findTerminalHttpLinks, isSafeTerminalLink, mergeTerminalTheme, needsPtyWriteViewportPrep, prepareTerminalForPtyWrite, proposeTerminalGeometry, readXtermCssCellSize, resolveTerminalTheme, subscribeTerminalTheme, terminalLinkCellRange, terminalShortcutLabel } from "./terminal-utils.js";
|
|
7
7
|
import { attachWheelScrollGuard, isAlternateTerminalBuffer } from "./terminal-wheel.js";
|
|
8
|
-
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, mergeProps, nextTick, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, renderSlot, toDisplayString, unref, vModelText, watch, withCtx, withDirectives, withModifiers } from "vue";
|
|
8
|
+
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, mergeProps, nextTick, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, renderSlot, toDisplayString, unref, useId, vModelText, watch, withCtx, withDirectives, withModifiers } from "vue";
|
|
9
9
|
import { FitAddon } from "@xterm/addon-fit";
|
|
10
10
|
import { SearchAddon } from "@xterm/addon-search";
|
|
11
11
|
import { Terminal } from "@xterm/xterm";
|
|
12
12
|
import "@xterm/xterm/css/xterm.css";
|
|
13
13
|
//#region src/components/terminal/src/RsTerminal.vue?vue&type=script&setup=true&lang.ts
|
|
14
|
-
var _hoisted_1 = [
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
var _hoisted_1 = [
|
|
15
|
+
"id",
|
|
16
|
+
"aria-label",
|
|
17
|
+
"aria-busy",
|
|
18
|
+
"aria-readonly"
|
|
19
|
+
];
|
|
20
|
+
var _hoisted_2 = [
|
|
21
|
+
"placeholder",
|
|
22
|
+
"aria-label",
|
|
23
|
+
"aria-describedby"
|
|
24
|
+
];
|
|
25
|
+
var _hoisted_3 = ["id"];
|
|
26
|
+
var _hoisted_4 = { key: 0 };
|
|
27
|
+
var _hoisted_5 = {
|
|
17
28
|
key: 1,
|
|
18
29
|
class: "rs-terminal__overlay-action"
|
|
19
30
|
};
|
|
@@ -22,6 +33,7 @@ var TERMINAL_LINE_HEIGHT = 1.2;
|
|
|
22
33
|
/** 令牌缺省字号;仅在挂载前(含 SSR)占位,挂载后由 syncResolvedFontSize 换成实测值。 */
|
|
23
34
|
var FALLBACK_FONT_SIZE_PX = 14;
|
|
24
35
|
var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
36
|
+
name: "RsTerminal",
|
|
25
37
|
inheritAttrs: false,
|
|
26
38
|
__name: "RsTerminal",
|
|
27
39
|
props: {
|
|
@@ -87,6 +99,21 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
87
99
|
type: Boolean,
|
|
88
100
|
default: false
|
|
89
101
|
},
|
|
102
|
+
cursorStyle: { default: "block" },
|
|
103
|
+
screenReaderMode: {
|
|
104
|
+
type: Boolean,
|
|
105
|
+
default: false
|
|
106
|
+
},
|
|
107
|
+
openLinks: {
|
|
108
|
+
type: Boolean,
|
|
109
|
+
default: true
|
|
110
|
+
},
|
|
111
|
+
rescaleOverlappingGlyphs: {
|
|
112
|
+
type: Boolean,
|
|
113
|
+
default: true
|
|
114
|
+
},
|
|
115
|
+
ariaLabel: {},
|
|
116
|
+
id: {},
|
|
90
117
|
minimumContrastRatio: { default: 4.5 }
|
|
91
118
|
},
|
|
92
119
|
emits: [
|
|
@@ -96,17 +123,24 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
96
123
|
"action",
|
|
97
124
|
"askAi",
|
|
98
125
|
"selectionChange",
|
|
99
|
-
"extraSelect"
|
|
126
|
+
"extraSelect",
|
|
127
|
+
"titleChange",
|
|
128
|
+
"bell",
|
|
129
|
+
"link"
|
|
100
130
|
],
|
|
101
131
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
102
132
|
const props = __props;
|
|
103
133
|
const emit = __emit;
|
|
104
134
|
const { t } = useRsI18n();
|
|
105
135
|
const hostEl = ref(null);
|
|
136
|
+
const regionLabel = computed(() => props.ariaLabel || t("terminal.label", "Terminal"));
|
|
106
137
|
const terminalReady = ref(false);
|
|
107
138
|
const hasSelection = ref(false);
|
|
108
|
-
/**
|
|
109
|
-
|
|
139
|
+
/**
|
|
140
|
+
* 右键打开前的选区文本。不用 ref:菜单禁用只看 hasSelection,
|
|
141
|
+
* 避免大段文本写回响应式数据时把菜单再排一次。
|
|
142
|
+
*/
|
|
143
|
+
let menuSelectionText = "";
|
|
110
144
|
const resolvedThemeMode = ref(resolveTerminalTheme(props.themeMode));
|
|
111
145
|
/** fit 后量一次真实行高,避免亚像素漂移;非每帧更新 */
|
|
112
146
|
const zebraRowStepPx = ref(null);
|
|
@@ -148,13 +182,14 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
148
182
|
label: t("terminal.copy", "Copy"),
|
|
149
183
|
icon: "copy",
|
|
150
184
|
shortcut: terminalShortcutLabel("C"),
|
|
151
|
-
disabled:
|
|
185
|
+
disabled: !hasSelection.value
|
|
152
186
|
},
|
|
153
187
|
{
|
|
154
188
|
key: "paste",
|
|
155
189
|
label: t("terminal.paste", "Paste"),
|
|
156
190
|
icon: "clipboard-paste",
|
|
157
|
-
shortcut: terminalShortcutLabel("V")
|
|
191
|
+
shortcut: terminalShortcutLabel("V"),
|
|
192
|
+
disabled: !props.inputEnabled
|
|
158
193
|
},
|
|
159
194
|
{
|
|
160
195
|
key: "selectAll",
|
|
@@ -177,7 +212,7 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
177
212
|
key: "askAi",
|
|
178
213
|
label: t("terminal.askAi", "Ask AI"),
|
|
179
214
|
icon: "bot",
|
|
180
|
-
disabled: !hasSelection.value
|
|
215
|
+
disabled: !hasSelection.value
|
|
181
216
|
});
|
|
182
217
|
if (props.extraContextMenuItems?.length) items.push({
|
|
183
218
|
key: "sep-extra",
|
|
@@ -199,24 +234,53 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
199
234
|
});
|
|
200
235
|
const searchOpen = ref(false);
|
|
201
236
|
const searchQuery = ref("");
|
|
237
|
+
const searchStatus = ref("");
|
|
202
238
|
const searchInputEl = ref(null);
|
|
239
|
+
const searchStatusId = useId();
|
|
203
240
|
let terminal = null;
|
|
204
241
|
let fitAddon = null;
|
|
205
242
|
let searchAddon = null;
|
|
206
243
|
let resizeObserver = null;
|
|
207
|
-
let
|
|
244
|
+
let unsubscribeTheme = null;
|
|
208
245
|
let detachWheelGuard = null;
|
|
246
|
+
let dataDisposable = null;
|
|
247
|
+
let selectionDisposable = null;
|
|
248
|
+
let titleDisposable = null;
|
|
249
|
+
let bellDisposable = null;
|
|
250
|
+
let linkDisposable = null;
|
|
251
|
+
let motionMedia = null;
|
|
209
252
|
let lastGeometry = {
|
|
210
253
|
cols: 0,
|
|
211
254
|
rows: 0
|
|
212
255
|
};
|
|
213
256
|
let fitRaf = 0;
|
|
257
|
+
let selectionFrame = 0;
|
|
214
258
|
let didInitialFit = false;
|
|
259
|
+
let alive = true;
|
|
215
260
|
function resolveAllowTransparency() {
|
|
216
261
|
return props.allowTransparency || props.zebraStripes;
|
|
217
262
|
}
|
|
218
263
|
function buildXtermTheme() {
|
|
219
|
-
return mergeTerminalTheme(resolvedThemeMode.value, props.theme);
|
|
264
|
+
return mergeTerminalTheme(resolvedThemeMode.value, props.theme, hostEl.value);
|
|
265
|
+
}
|
|
266
|
+
function prefersReducedMotion() {
|
|
267
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return false;
|
|
268
|
+
return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
269
|
+
}
|
|
270
|
+
function syncCursorBlink() {
|
|
271
|
+
if (!terminal) return;
|
|
272
|
+
terminal.options.cursorBlink = props.cursorBlink && !prefersReducedMotion();
|
|
273
|
+
}
|
|
274
|
+
function onMotionPreference() {
|
|
275
|
+
syncCursorBlink();
|
|
276
|
+
}
|
|
277
|
+
function syncInputEnabled() {
|
|
278
|
+
if (!terminal) return;
|
|
279
|
+
terminal.options.disableStdin = !props.inputEnabled;
|
|
280
|
+
}
|
|
281
|
+
function labelTerminalInput() {
|
|
282
|
+
const textarea = hostEl.value?.querySelector("textarea");
|
|
283
|
+
if (textarea instanceof HTMLTextAreaElement) textarea.setAttribute("aria-label", regionLabel.value);
|
|
220
284
|
}
|
|
221
285
|
function applyThemeToTerminal() {
|
|
222
286
|
if (!terminal) return;
|
|
@@ -242,7 +306,7 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
242
306
|
});
|
|
243
307
|
}
|
|
244
308
|
function refreshResolvedTheme() {
|
|
245
|
-
resolvedThemeMode.value = resolveTerminalTheme(props.themeMode);
|
|
309
|
+
resolvedThemeMode.value = resolveTerminalTheme(props.themeMode, hostEl.value);
|
|
246
310
|
applyThemeToTerminal();
|
|
247
311
|
}
|
|
248
312
|
function currentGeometry() {
|
|
@@ -265,7 +329,7 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
265
329
|
emit("resize", geometry);
|
|
266
330
|
}
|
|
267
331
|
async function fit() {
|
|
268
|
-
if (!fitAddon || !terminal || !hostEl.value) return;
|
|
332
|
+
if (!alive || !fitAddon || !terminal || !hostEl.value) return;
|
|
269
333
|
const { clientWidth, clientHeight } = hostEl.value;
|
|
270
334
|
if (clientWidth <= 0 || clientHeight <= 0) return;
|
|
271
335
|
if (!didInitialFit) {
|
|
@@ -273,7 +337,7 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
273
337
|
await nextTick();
|
|
274
338
|
await rafTwice();
|
|
275
339
|
}
|
|
276
|
-
if (!fitAddon || !terminal) return;
|
|
340
|
+
if (!alive || !fitAddon || !terminal || !hostEl.value) return;
|
|
277
341
|
try {
|
|
278
342
|
fitAddon.fit();
|
|
279
343
|
} catch {}
|
|
@@ -308,9 +372,10 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
308
372
|
if (nextRows < terminal.rows) terminal.resize(terminal.cols, nextRows);
|
|
309
373
|
}
|
|
310
374
|
function scheduleFit() {
|
|
311
|
-
if (fitRaf) return;
|
|
375
|
+
if (!alive || fitRaf) return;
|
|
312
376
|
fitRaf = requestAnimationFrame(() => {
|
|
313
377
|
fitRaf = 0;
|
|
378
|
+
if (!alive) return;
|
|
314
379
|
fit();
|
|
315
380
|
});
|
|
316
381
|
}
|
|
@@ -332,37 +397,61 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
332
397
|
return String(terminal?.getSelection?.() ?? "");
|
|
333
398
|
}
|
|
334
399
|
function syncSelectionState() {
|
|
335
|
-
|
|
336
|
-
|
|
400
|
+
const text = getSelectionText();
|
|
401
|
+
const selected = Boolean(terminal?.hasSelection());
|
|
402
|
+
if (hasSelection.value !== selected) hasSelection.value = selected;
|
|
403
|
+
menuSelectionText = selected ? text.trim() : "";
|
|
404
|
+
emit("selectionChange", text);
|
|
405
|
+
}
|
|
406
|
+
/** 选区文本留到下一帧再序列化,右键和松开鼠标先把画面画完。 */
|
|
407
|
+
function scheduleSelectionText() {
|
|
408
|
+
if (selectionFrame) return;
|
|
409
|
+
selectionFrame = requestAnimationFrame(() => {
|
|
410
|
+
selectionFrame = 0;
|
|
411
|
+
if (!alive) return;
|
|
412
|
+
syncSelectionState();
|
|
413
|
+
});
|
|
337
414
|
}
|
|
338
|
-
/**
|
|
415
|
+
/** 优先活选区;菜单抢走焦点后回退打开时记下的文本。 */
|
|
339
416
|
function resolveMenuSelectionText() {
|
|
340
417
|
const live = getSelectionText().trim();
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
418
|
+
if (live) return live;
|
|
419
|
+
return menuSelectionText;
|
|
420
|
+
}
|
|
421
|
+
function ensureSearchAddon() {
|
|
422
|
+
if (!terminal || !props.searchEnabled) return null;
|
|
423
|
+
if (!searchAddon) {
|
|
424
|
+
searchAddon = new SearchAddon();
|
|
425
|
+
terminal.loadAddon(searchAddon);
|
|
426
|
+
}
|
|
427
|
+
return searchAddon;
|
|
344
428
|
}
|
|
345
429
|
function openSearch() {
|
|
346
|
-
if (!props.searchEnabled) return;
|
|
430
|
+
if (!props.searchEnabled || !alive) return;
|
|
431
|
+
ensureSearchAddon();
|
|
347
432
|
searchOpen.value = true;
|
|
433
|
+
searchStatus.value = "";
|
|
348
434
|
nextTick(() => {
|
|
435
|
+
if (!alive) return;
|
|
349
436
|
searchInputEl.value?.focus();
|
|
350
437
|
searchInputEl.value?.select();
|
|
351
438
|
});
|
|
352
439
|
}
|
|
353
440
|
function closeSearch() {
|
|
354
441
|
searchOpen.value = false;
|
|
442
|
+
searchStatus.value = "";
|
|
355
443
|
searchAddon?.clearDecorations();
|
|
356
|
-
terminal?.focus();
|
|
444
|
+
if (alive) terminal?.focus();
|
|
357
445
|
}
|
|
358
446
|
function runSearch(direction) {
|
|
359
447
|
const query = searchQuery.value;
|
|
360
|
-
|
|
361
|
-
if (
|
|
362
|
-
|
|
448
|
+
const addon = ensureSearchAddon();
|
|
449
|
+
if (!query || !addon) {
|
|
450
|
+
searchStatus.value = "";
|
|
363
451
|
return;
|
|
364
452
|
}
|
|
365
|
-
|
|
453
|
+
const found = direction === "prev" ? addon.findPrevious(query) : addon.findNext(query);
|
|
454
|
+
searchStatus.value = found ? "" : t("terminal.searchEmpty", "No matches");
|
|
366
455
|
}
|
|
367
456
|
function onSearchKeydown(event) {
|
|
368
457
|
if (event.key === "Escape") {
|
|
@@ -370,7 +459,7 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
370
459
|
closeSearch();
|
|
371
460
|
return;
|
|
372
461
|
}
|
|
373
|
-
if (event.key === "Enter") {
|
|
462
|
+
if (event.key === "Enter" && !event.isComposing) {
|
|
374
463
|
event.preventDefault();
|
|
375
464
|
runSearch(event.shiftKey ? "prev" : "next");
|
|
376
465
|
}
|
|
@@ -381,32 +470,35 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
381
470
|
}
|
|
382
471
|
async function copySelection() {
|
|
383
472
|
const text = resolveMenuSelectionText();
|
|
384
|
-
if (!text) return;
|
|
385
|
-
|
|
473
|
+
if (!text || !alive) return;
|
|
474
|
+
const copied = await copyTextToClipboard(text);
|
|
475
|
+
if (!alive || !copied) return;
|
|
476
|
+
emit("action", "copy");
|
|
386
477
|
}
|
|
387
478
|
async function pasteFromClipboard() {
|
|
388
|
-
if (!terminal || !props.inputEnabled) return;
|
|
479
|
+
if (!alive || !terminal || !props.inputEnabled) return;
|
|
389
480
|
terminal.focus();
|
|
390
481
|
const textarea = terminal.element?.querySelector("textarea");
|
|
391
482
|
if (textarea instanceof HTMLTextAreaElement) textarea.focus();
|
|
392
483
|
const text = await readClipboardText();
|
|
393
|
-
if (!text) return;
|
|
484
|
+
if (!alive || !text || !terminal) return;
|
|
394
485
|
terminal.paste(text);
|
|
395
486
|
emit("action", "paste");
|
|
396
487
|
}
|
|
397
488
|
function onTerminalContextMenu() {
|
|
398
489
|
beginClipboardPrefetch();
|
|
399
|
-
const
|
|
400
|
-
if (
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
490
|
+
const term = terminal;
|
|
491
|
+
if (!term) return;
|
|
492
|
+
const selected = Boolean(term.hasSelection());
|
|
493
|
+
if (selected && props.rightClickSelectsWord) {
|
|
494
|
+
term.options.rightClickSelectsWord = false;
|
|
495
|
+
queueMicrotask(() => {
|
|
496
|
+
if (alive && terminal) terminal.options.rightClickSelectsWord = props.rightClickSelectsWord;
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
if (hasSelection.value !== selected) hasSelection.value = selected;
|
|
500
|
+
if (!selected) menuSelectionText = "";
|
|
501
|
+
scheduleSelectionText();
|
|
410
502
|
}
|
|
411
503
|
function selectAll() {
|
|
412
504
|
terminal?.selectAll();
|
|
@@ -512,8 +604,23 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
512
604
|
terminal.options.fontWeightBold = resolveTerminalFontWeightBold();
|
|
513
605
|
fit();
|
|
514
606
|
});
|
|
515
|
-
watch(() => props.cursorBlink,
|
|
516
|
-
|
|
607
|
+
watch(() => props.cursorBlink, syncCursorBlink);
|
|
608
|
+
watch(() => props.cursorStyle, (value) => {
|
|
609
|
+
if (terminal) terminal.options.cursorStyle = value;
|
|
610
|
+
});
|
|
611
|
+
watch(() => props.inputEnabled, syncInputEnabled);
|
|
612
|
+
watch(regionLabel, labelTerminalInput);
|
|
613
|
+
watch(searchQuery, () => {
|
|
614
|
+
searchStatus.value = "";
|
|
615
|
+
});
|
|
616
|
+
watch(() => props.screenReaderMode, (value) => {
|
|
617
|
+
if (terminal) terminal.options.screenReaderMode = value;
|
|
618
|
+
});
|
|
619
|
+
watch(() => props.rescaleOverlappingGlyphs, (value) => {
|
|
620
|
+
if (terminal) terminal.options.rescaleOverlappingGlyphs = value;
|
|
621
|
+
});
|
|
622
|
+
watch(() => props.searchEnabled, (value) => {
|
|
623
|
+
if (!value) closeSearch();
|
|
517
624
|
});
|
|
518
625
|
watch(() => props.convertEol, (value) => {
|
|
519
626
|
if (terminal) terminal.options.convertEol = value;
|
|
@@ -534,11 +641,80 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
534
641
|
watch(() => props.minimumContrastRatio, (value) => {
|
|
535
642
|
if (terminal) terminal.options.minimumContrastRatio = value;
|
|
536
643
|
});
|
|
644
|
+
function releaseDisposable(handle) {
|
|
645
|
+
handle?.dispose();
|
|
646
|
+
}
|
|
647
|
+
function openTerminalLink(raw) {
|
|
648
|
+
const text = raw.trim();
|
|
649
|
+
if (!alive || !isSafeTerminalLink(text)) return;
|
|
650
|
+
emit("link", text);
|
|
651
|
+
if (!props.openLinks || typeof window === "undefined") return;
|
|
652
|
+
window.open(text, "_blank", "noopener,noreferrer");
|
|
653
|
+
}
|
|
654
|
+
function attachLinkProvider() {
|
|
655
|
+
if (!terminal) return;
|
|
656
|
+
linkDisposable = terminal.registerLinkProvider({ provideLinks(bufferLineNumber, callback) {
|
|
657
|
+
const term = terminal;
|
|
658
|
+
if (!alive || !term) {
|
|
659
|
+
callback(void 0);
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
const row = term.buffer.active.getLine(bufferLineNumber - 1);
|
|
663
|
+
if (!row) {
|
|
664
|
+
callback(void 0);
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
667
|
+
const hits = findTerminalHttpLinks(row.translateToString(true));
|
|
668
|
+
if (!hits.length) {
|
|
669
|
+
callback(void 0);
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
const cells = [];
|
|
673
|
+
for (let index = 0; index < row.length; index += 1) {
|
|
674
|
+
const cell = row.getCell(index);
|
|
675
|
+
cells.push({
|
|
676
|
+
chars: cell?.getChars() || "",
|
|
677
|
+
width: cell?.getWidth() ?? 1
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
callback(hits.map((hit) => {
|
|
681
|
+
const range = terminalLinkCellRange(cells, hit.start, hit.end);
|
|
682
|
+
return {
|
|
683
|
+
text: hit.text,
|
|
684
|
+
range: {
|
|
685
|
+
start: {
|
|
686
|
+
x: range.startX,
|
|
687
|
+
y: bufferLineNumber
|
|
688
|
+
},
|
|
689
|
+
end: {
|
|
690
|
+
x: range.endX,
|
|
691
|
+
y: bufferLineNumber
|
|
692
|
+
}
|
|
693
|
+
},
|
|
694
|
+
activate(_event, uri) {
|
|
695
|
+
openTerminalLink(uri);
|
|
696
|
+
}
|
|
697
|
+
};
|
|
698
|
+
}));
|
|
699
|
+
} });
|
|
700
|
+
}
|
|
701
|
+
function attachMotionPreference() {
|
|
702
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
703
|
+
motionMedia = window.matchMedia("(prefers-reduced-motion: reduce)");
|
|
704
|
+
motionMedia.addEventListener("change", onMotionPreference);
|
|
705
|
+
}
|
|
706
|
+
function detachMotionPreference() {
|
|
707
|
+
motionMedia?.removeEventListener("change", onMotionPreference);
|
|
708
|
+
motionMedia = null;
|
|
709
|
+
}
|
|
537
710
|
onMounted(async () => {
|
|
711
|
+
alive = true;
|
|
538
712
|
if (!hostEl.value) return;
|
|
539
713
|
refreshResolvedTheme();
|
|
540
714
|
terminal = new Terminal({
|
|
541
|
-
cursorBlink: props.cursorBlink,
|
|
715
|
+
cursorBlink: props.cursorBlink && !prefersReducedMotion(),
|
|
716
|
+
cursorStyle: props.cursorStyle,
|
|
717
|
+
disableStdin: !props.inputEnabled,
|
|
542
718
|
fontFamily: resolveTerminalFontFamily(),
|
|
543
719
|
fontSize: resolveTerminalFontSize(),
|
|
544
720
|
fontWeight: resolveTerminalFontWeight(),
|
|
@@ -551,40 +727,56 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
551
727
|
scrollback: props.scrollback,
|
|
552
728
|
convertEol: props.convertEol,
|
|
553
729
|
rightClickSelectsWord: props.rightClickSelectsWord,
|
|
554
|
-
|
|
730
|
+
screenReaderMode: props.screenReaderMode,
|
|
731
|
+
rescaleOverlappingGlyphs: props.rescaleOverlappingGlyphs,
|
|
732
|
+
theme: buildXtermTheme(),
|
|
733
|
+
linkHandler: { activate(_event, text) {
|
|
734
|
+
openTerminalLink(text);
|
|
735
|
+
} }
|
|
555
736
|
});
|
|
556
737
|
fitAddon = new FitAddon();
|
|
557
738
|
terminal.loadAddon(fitAddon);
|
|
558
|
-
|
|
559
|
-
terminal.loadAddon(searchAddon);
|
|
739
|
+
if (props.searchEnabled) ensureSearchAddon();
|
|
560
740
|
terminal.open(hostEl.value);
|
|
561
|
-
|
|
562
|
-
|
|
741
|
+
labelTerminalInput();
|
|
742
|
+
dataDisposable = terminal.onData((data) => {
|
|
743
|
+
if (alive && props.inputEnabled) emit("data", data);
|
|
563
744
|
});
|
|
564
|
-
terminal.onSelectionChange(() => {
|
|
565
|
-
|
|
745
|
+
selectionDisposable = terminal.onSelectionChange(() => {
|
|
746
|
+
if (!alive || !terminal) return;
|
|
747
|
+
const selected = Boolean(terminal.hasSelection());
|
|
748
|
+
if (hasSelection.value !== selected) hasSelection.value = selected;
|
|
749
|
+
scheduleSelectionText();
|
|
750
|
+
});
|
|
751
|
+
titleDisposable = terminal.onTitleChange((title) => {
|
|
752
|
+
if (alive) emit("titleChange", title);
|
|
566
753
|
});
|
|
754
|
+
bellDisposable = terminal.onBell(() => {
|
|
755
|
+
if (alive) emit("bell");
|
|
756
|
+
});
|
|
757
|
+
attachLinkProvider();
|
|
567
758
|
attachShortcuts();
|
|
759
|
+
attachMotionPreference();
|
|
568
760
|
await nextTick();
|
|
761
|
+
if (!alive || !terminal || !hostEl.value) return;
|
|
569
762
|
attachWheelGuard();
|
|
570
763
|
terminalReady.value = true;
|
|
571
764
|
await fit();
|
|
765
|
+
if (!alive || !terminal || !hostEl.value) return;
|
|
572
766
|
emit("ready");
|
|
573
767
|
resizeObserver = new ResizeObserver(() => {
|
|
574
768
|
scheduleFit();
|
|
575
769
|
});
|
|
576
770
|
resizeObserver.observe(hostEl.value);
|
|
577
|
-
|
|
578
|
-
if (props.themeMode === "auto") refreshResolvedTheme();
|
|
579
|
-
});
|
|
580
|
-
themeObserver.observe(document.documentElement, {
|
|
581
|
-
attributes: true,
|
|
582
|
-
attributeFilter: ["data-rs-theme"]
|
|
771
|
+
unsubscribeTheme = subscribeTerminalTheme(() => {
|
|
772
|
+
if (alive && props.themeMode === "auto") refreshResolvedTheme();
|
|
583
773
|
});
|
|
584
774
|
});
|
|
585
775
|
onBeforeUnmount(() => {
|
|
586
|
-
|
|
587
|
-
|
|
776
|
+
alive = false;
|
|
777
|
+
unsubscribeTheme?.();
|
|
778
|
+
unsubscribeTheme = null;
|
|
779
|
+
detachMotionPreference();
|
|
588
780
|
resizeObserver?.disconnect();
|
|
589
781
|
resizeObserver = null;
|
|
590
782
|
detachWheelGuard?.();
|
|
@@ -593,10 +785,25 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
593
785
|
cancelAnimationFrame(fitRaf);
|
|
594
786
|
fitRaf = 0;
|
|
595
787
|
}
|
|
788
|
+
if (selectionFrame) {
|
|
789
|
+
cancelAnimationFrame(selectionFrame);
|
|
790
|
+
selectionFrame = 0;
|
|
791
|
+
}
|
|
792
|
+
releaseDisposable(dataDisposable);
|
|
793
|
+
releaseDisposable(selectionDisposable);
|
|
794
|
+
releaseDisposable(titleDisposable);
|
|
795
|
+
releaseDisposable(bellDisposable);
|
|
796
|
+
releaseDisposable(linkDisposable);
|
|
797
|
+
dataDisposable = null;
|
|
798
|
+
selectionDisposable = null;
|
|
799
|
+
titleDisposable = null;
|
|
800
|
+
bellDisposable = null;
|
|
801
|
+
linkDisposable = null;
|
|
802
|
+
searchAddon?.dispose?.();
|
|
803
|
+
searchAddon = null;
|
|
596
804
|
terminal?.dispose();
|
|
597
805
|
terminal = null;
|
|
598
806
|
fitAddon = null;
|
|
599
|
-
searchAddon = null;
|
|
600
807
|
didInitialFit = false;
|
|
601
808
|
});
|
|
602
809
|
__expose({
|
|
@@ -619,14 +826,20 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
619
826
|
onSelect: onContextMenuSelect
|
|
620
827
|
}, {
|
|
621
828
|
default: withCtx(() => [createElementVNode("section", mergeProps(_ctx.$attrs, {
|
|
829
|
+
id: __props.id,
|
|
622
830
|
class: ["rs-terminal", { "rs-terminal--zebra": __props.zebraStripes }],
|
|
623
831
|
style: zebraStyle.value,
|
|
832
|
+
dir: "ltr",
|
|
833
|
+
"aria-label": regionLabel.value,
|
|
834
|
+
"aria-busy": showLoading.value ? "true" : void 0,
|
|
835
|
+
"aria-readonly": __props.inputEnabled ? void 0 : "true",
|
|
624
836
|
onClick: focus,
|
|
625
837
|
onContextmenuCapture: onTerminalContextMenu
|
|
626
838
|
}), [
|
|
627
839
|
__props.searchEnabled && searchOpen.value ? (openBlock(), createElementBlock("div", {
|
|
628
840
|
key: 0,
|
|
629
841
|
class: "rs-terminal__search",
|
|
842
|
+
role: "search",
|
|
630
843
|
onClick: _cache[3] || (_cache[3] = withModifiers(() => {}, ["stop"]))
|
|
631
844
|
}, [
|
|
632
845
|
withDirectives(createElementVNode("input", {
|
|
@@ -635,10 +848,12 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
635
848
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
|
|
636
849
|
class: "rs-terminal__search-input",
|
|
637
850
|
type: "search",
|
|
851
|
+
enterkeyhint: "search",
|
|
638
852
|
placeholder: unref(t)("terminal.searchPlaceholder", "Find in terminal"),
|
|
639
853
|
"aria-label": unref(t)("terminal.search", "Search"),
|
|
854
|
+
"aria-describedby": searchStatus.value ? unref(searchStatusId) : void 0,
|
|
640
855
|
onKeydown: onSearchKeydown
|
|
641
|
-
}, null, 40,
|
|
856
|
+
}, null, 40, _hoisted_2), [[vModelText, searchQuery.value]]),
|
|
642
857
|
createElementVNode("button", {
|
|
643
858
|
type: "button",
|
|
644
859
|
class: "rs-terminal__search-btn",
|
|
@@ -653,7 +868,12 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
653
868
|
type: "button",
|
|
654
869
|
class: "rs-terminal__search-btn",
|
|
655
870
|
onClick: closeSearch
|
|
656
|
-
}, toDisplayString(unref(t)("terminal.searchClose", "Close search")), 1)
|
|
871
|
+
}, toDisplayString(unref(t)("terminal.searchClose", "Close search")), 1),
|
|
872
|
+
searchStatus.value ? (openBlock(), createElementBlock("output", {
|
|
873
|
+
key: 0,
|
|
874
|
+
id: unref(searchStatusId),
|
|
875
|
+
class: "rs-terminal__search-status"
|
|
876
|
+
}, toDisplayString(searchStatus.value), 9, _hoisted_3)) : createCommentVNode("", true)
|
|
657
877
|
])) : createCommentVNode("", true),
|
|
658
878
|
createElementVNode("div", {
|
|
659
879
|
ref_key: "hostEl",
|
|
@@ -668,8 +888,8 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
668
888
|
__props.overlay || _ctx.$slots.overlayAction ? (openBlock(), createElementBlock("output", {
|
|
669
889
|
key: 2,
|
|
670
890
|
class: normalizeClass(["rs-terminal__overlay", { "rs-terminal__overlay--interactive": Boolean(_ctx.$slots.overlayAction) }])
|
|
671
|
-
}, [__props.overlay ? (openBlock(), createElementBlock("span",
|
|
672
|
-
], 16)]),
|
|
891
|
+
}, [__props.overlay ? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(__props.overlay), 1)) : createCommentVNode("", true), _ctx.$slots.overlayAction ? (openBlock(), createElementBlock("div", _hoisted_5, [renderSlot(_ctx.$slots, "overlayAction", {}, void 0, true)])) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)
|
|
892
|
+
], 16, _hoisted_1)]),
|
|
673
893
|
_: 3
|
|
674
894
|
}, 8, ["disabled", "items"]);
|
|
675
895
|
};
|
|
@@ -3,6 +3,6 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
|
|
|
3
3
|
import RsTerminal_vue_vue_type_script_setup_true_lang_default from "./RsTerminal.impl.js";
|
|
4
4
|
|
|
5
5
|
//#region src/components/terminal/src/RsTerminal.vue
|
|
6
|
-
var RsTerminal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsTerminal_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
6
|
+
var RsTerminal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsTerminal_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-79324a27"]]);
|
|
7
7
|
//#endregion
|
|
8
8
|
export { RsTerminal_default as default };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ITheme, Terminal } from '@xterm/xterm';
|
|
2
2
|
export type RsTerminalThemeMode = 'auto' | 'light' | 'dark';
|
|
3
3
|
export type RsResolvedTerminalTheme = 'light' | 'dark';
|
|
4
|
+
export type RsTerminalCursorStyle = 'block' | 'underline' | 'bar';
|
|
4
5
|
export type RsTerminalAction = 'copy' | 'paste' | 'selectAll' | 'clear' | 'askAi' | 'search';
|
|
5
6
|
export type RsTerminalGeometry = {
|
|
6
7
|
cols: number;
|
|
@@ -29,11 +30,15 @@ export interface RsTerminalExpose {
|
|
|
29
30
|
export declare function normalizeTerminalHexColor(value: string): string | null;
|
|
30
31
|
/** 将 lab()/color() 等现代 CSS 色值转为 xterm 可解析的 #RRGGBB */
|
|
31
32
|
export declare function resolveCssColorForXterm(value: string): string | null;
|
|
32
|
-
/**
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
/**
|
|
34
|
+
* auto 看最近的 `data-rs-theme`,没有时看 documentElement。
|
|
35
|
+
* 未写或不是 dark 时跟全库浅色。传入元素时深色岛不必改整页。
|
|
36
|
+
*/
|
|
37
|
+
export declare function resolveTerminalTheme(mode?: RsTerminalThemeMode, el?: HTMLElement | null): RsResolvedTerminalTheme;
|
|
38
|
+
/** 从 `--rs-terminal-*` 构建 xterm 调色板。传入宿主时读继承到的 token。 */
|
|
39
|
+
export declare function readTerminalThemeFromCss(mode: RsResolvedTerminalTheme, el?: HTMLElement | null): ITheme;
|
|
35
40
|
export declare function getTerminalThemePalette(mode: RsResolvedTerminalTheme): ITheme;
|
|
36
|
-
export declare function mergeTerminalTheme(mode: RsResolvedTerminalTheme, overrides?: Partial<ITheme
|
|
41
|
+
export declare function mergeTerminalTheme(mode: RsResolvedTerminalTheme, overrides?: Partial<ITheme>, el?: HTMLElement | null): ITheme;
|
|
37
42
|
/** 读取斑马纹行底色(`--rs-terminal-row-stripe`,解析后供 xterm decoration 使用) */
|
|
38
43
|
export declare function readTerminalRowStripeFromCss(mode: RsResolvedTerminalTheme): string;
|
|
39
44
|
/** PTY 输出是否含终端控制序列(ESC / CSI),此类数据不应批量延迟。 */
|
|
@@ -81,5 +86,38 @@ export declare function prepareTerminalForPtyWrite(terminal: Terminal, data: str
|
|
|
81
86
|
export declare function isMacPlatform(): boolean;
|
|
82
87
|
/** 菜单/文档展示的修饰键标签 */
|
|
83
88
|
export declare function terminalShortcutLabel(key: string): string;
|
|
89
|
+
type ThemeListener = () => void;
|
|
90
|
+
/**
|
|
91
|
+
* 多个终端共用一个 `data-rs-theme` 观察器(含主题岛)。
|
|
92
|
+
* 最后一个退订时断开,避免卸载后仍监听整棵文档。
|
|
93
|
+
*/
|
|
94
|
+
export declare function subscribeTerminalTheme(listener: ThemeListener): () => void;
|
|
95
|
+
/** 当前仍挂着的主题订阅数。测试用来确认卸载成对退订。 */
|
|
96
|
+
export declare function terminalThemeSubscriptionCount(): number;
|
|
97
|
+
export type RsTerminalLinkHit = {
|
|
98
|
+
start: number;
|
|
99
|
+
end: number;
|
|
100
|
+
text: string;
|
|
101
|
+
};
|
|
102
|
+
/** 只放行 http(s) 与 mailto。javascript: / data: 一律拒绝。 */
|
|
103
|
+
export declare function isSafeTerminalLink(value: string): boolean;
|
|
104
|
+
/** 从一行可见文本里找出可点的 http(s) / mailto。end 为不含尾标点的字符串下标。 */
|
|
105
|
+
export declare function findTerminalHttpLinks(line: string): RsTerminalLinkHit[];
|
|
106
|
+
/**
|
|
107
|
+
* 把字符串下标换成 xterm 1-based 单元格列。
|
|
108
|
+
* 宽字符占两格,后续 width 0 的格子跳过,避免链接框落在汉字上。
|
|
109
|
+
*/
|
|
110
|
+
export declare function terminalCellIndexForString(cells: ReadonlyArray<{
|
|
111
|
+
chars: string;
|
|
112
|
+
width: number;
|
|
113
|
+
}>, stringIndex: number): number;
|
|
114
|
+
export declare function terminalLinkCellRange(cells: ReadonlyArray<{
|
|
115
|
+
chars: string;
|
|
116
|
+
width: number;
|
|
117
|
+
}>, start: number, end: number): {
|
|
118
|
+
startX: number;
|
|
119
|
+
endX: number;
|
|
120
|
+
};
|
|
84
121
|
/** ANSI 16 色演示文本 */
|
|
85
122
|
export declare function buildAnsiColorDemo(): string;
|
|
123
|
+
export {};
|