niuma-ui 1.2.9 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/dist/components/RsButton.css +119 -61
- package/dist/components/RsButton.d.ts +3 -3
- package/dist/components/RsButton.impl.js +4 -12
- package/dist/components/RsButton.js +1 -1
- package/dist/components/RsDialog.css +1 -0
- package/dist/components/RsDialog.d.ts +5 -0
- package/dist/components/RsDialog.impl.js +4 -0
- package/dist/components/RsDrawer.css +1 -0
- package/dist/components/RsFieldset.css +92 -0
- package/dist/components/RsFieldset.d.ts +61 -0
- package/dist/components/RsFieldset.impl.js +78 -0
- package/dist/components/RsFieldset.js +8 -0
- package/dist/components/RsFormItem.css +19 -19
- package/dist/components/RsFormItem.d.ts +6 -4
- package/dist/components/RsFormItem.impl.js +12 -2
- package/dist/components/RsFormItem.js +1 -1
- package/dist/components/RsInput.css +78 -69
- package/dist/components/RsInput.js +1 -1
- package/dist/components/RsLog.css +198 -0
- package/dist/components/RsLog.d.ts +126 -0
- package/dist/components/RsLog.impl.js +619 -0
- package/dist/components/RsLog.js +8 -0
- package/dist/components/RsTable.impl.js +2 -1
- package/dist/components/RsTerminal.css +59 -18
- package/dist/components/RsTerminal.d.ts +17 -1
- package/dist/components/RsTerminal.impl.js +115 -8
- package/dist/components/RsTerminal.js +1 -1
- package/dist/components/RsTextarea.css +126 -0
- package/dist/components/RsTextarea.d.ts +114 -0
- package/dist/components/RsTextarea.impl.js +385 -0
- package/dist/components/RsTextarea.js +8 -0
- package/dist/components/RsTooltip.css +4 -3
- package/dist/components/RsTooltip.d.ts +2 -0
- package/dist/components/RsTooltip.impl.js +5 -2
- package/dist/components/RsVirtualList.css +6 -6
- package/dist/components/RsVirtualList.d.ts +1 -1
- package/dist/components/RsVirtualList.impl.js +9 -4
- package/dist/components/RsVirtualList.js +1 -1
- package/dist/components/button-utils.d.ts +19 -10
- package/dist/components/button-utils.js +22 -7
- package/dist/components/dialog-window.d.ts +2 -0
- package/dist/components/dialog-window.js +2 -1
- package/dist/components/fieldset-utils.d.ts +29 -0
- package/dist/components/fieldset-utils.js +12 -0
- package/dist/components/log-utils.d.ts +105 -0
- package/dist/components/log-utils.js +354 -0
- package/dist/components/table/rs-table-props.d.ts +8 -0
- package/dist/components/table/rs-table-props.js +1 -0
- package/dist/components/table/rs-table.css +7 -0
- package/dist/components/terminal-utils.d.ts +1 -1
- package/dist/dev/vite-xterm-deps.d.ts +1 -0
- package/dist/dev/vite-xterm-deps.js +1 -0
- package/dist/index.d.ts +10 -2
- package/dist/index.js +24 -0
- package/dist/locale/messages.js +52 -0
- package/dist/styles.css +37 -0
- package/package.json +2 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
.rs-terminal[data-v-
|
|
2
|
+
.rs-terminal[data-v-fba85f3c] {
|
|
3
3
|
position: relative;
|
|
4
4
|
height: 100%;
|
|
5
5
|
min-height: 0;
|
|
@@ -16,13 +16,13 @@
|
|
|
16
16
|
0 1px 3px color-mix(in srgb, #000 32%, transparent);
|
|
17
17
|
overflow: hidden;
|
|
18
18
|
}
|
|
19
|
-
[data-rs-theme='light'] .rs-terminal[data-v-
|
|
19
|
+
[data-rs-theme='light'] .rs-terminal[data-v-fba85f3c] {
|
|
20
20
|
box-shadow:
|
|
21
21
|
inset 0 1px 0 color-mix(in srgb, #fff 80%, transparent),
|
|
22
22
|
inset 0 0 0 1px color-mix(in srgb, #000 4%, transparent),
|
|
23
23
|
0 1px 4px color-mix(in srgb, #000 8%, transparent);
|
|
24
24
|
}
|
|
25
|
-
.rs-terminal__host[data-v-
|
|
25
|
+
.rs-terminal__host[data-v-fba85f3c] {
|
|
26
26
|
position: relative;
|
|
27
27
|
width: 100%;
|
|
28
28
|
height: 100%;
|
|
@@ -30,15 +30,17 @@
|
|
|
30
30
|
/* FitAddon 取整余量露底时,与单元格同色(勿用 shell 灰底) */
|
|
31
31
|
background: var(--rs-terminal-bg);
|
|
32
32
|
}
|
|
33
|
-
.rs-terminal__loading[data-v-
|
|
34
|
-
.rs-terminal__overlay[data-v-
|
|
33
|
+
.rs-terminal__loading[data-v-fba85f3c],
|
|
34
|
+
.rs-terminal__overlay[data-v-fba85f3c] {
|
|
35
35
|
position: absolute;
|
|
36
36
|
inset: 0;
|
|
37
37
|
display: flex;
|
|
38
38
|
align-items: center;
|
|
39
39
|
justify-content: center;
|
|
40
40
|
}
|
|
41
|
-
.rs-terminal__overlay[data-v-
|
|
41
|
+
.rs-terminal__overlay[data-v-fba85f3c] {
|
|
42
|
+
flex-direction: column;
|
|
43
|
+
gap: var(--rs-space-sm);
|
|
42
44
|
padding: var(--rs-space-lg);
|
|
43
45
|
color: color-mix(in srgb, var(--rs-terminal-fg) 92%, #fff 8%);
|
|
44
46
|
background: color-mix(in srgb, var(--rs-terminal-bg) 84%, transparent);
|
|
@@ -49,6 +51,45 @@
|
|
|
49
51
|
font-weight: var(--rs-font-weight-regular);
|
|
50
52
|
line-height: var(--rs-line-height-normal);
|
|
51
53
|
}
|
|
54
|
+
.rs-terminal__overlay--interactive[data-v-fba85f3c] {
|
|
55
|
+
pointer-events: auto;
|
|
56
|
+
}
|
|
57
|
+
.rs-terminal__overlay-action[data-v-fba85f3c] {
|
|
58
|
+
pointer-events: auto;
|
|
59
|
+
}
|
|
60
|
+
.rs-terminal__search[data-v-fba85f3c] {
|
|
61
|
+
position: absolute;
|
|
62
|
+
top: var(--rs-space-xs);
|
|
63
|
+
right: var(--rs-space-xs);
|
|
64
|
+
z-index: 2;
|
|
65
|
+
display: flex;
|
|
66
|
+
align-items: center;
|
|
67
|
+
gap: var(--rs-space-xs);
|
|
68
|
+
padding: var(--rs-space-xs);
|
|
69
|
+
border: 1px solid var(--rs-terminal-border);
|
|
70
|
+
border-radius: var(--rs-radius-sm);
|
|
71
|
+
background: color-mix(in srgb, var(--rs-terminal-bg) 92%, transparent);
|
|
72
|
+
}
|
|
73
|
+
.rs-terminal__search-input[data-v-fba85f3c] {
|
|
74
|
+
width: 12rem;
|
|
75
|
+
padding: 0.2rem 0.4rem;
|
|
76
|
+
border: 1px solid var(--rs-terminal-border);
|
|
77
|
+
border-radius: var(--rs-radius-sm);
|
|
78
|
+
background: var(--rs-terminal-bg);
|
|
79
|
+
color: var(--rs-terminal-fg);
|
|
80
|
+
font-family: var(--rs-font-mono);
|
|
81
|
+
font-size: var(--rs-font-size-xs);
|
|
82
|
+
outline: none;
|
|
83
|
+
}
|
|
84
|
+
.rs-terminal__search-btn[data-v-fba85f3c] {
|
|
85
|
+
padding: 0.2rem 0.4rem;
|
|
86
|
+
border: 1px solid var(--rs-terminal-border);
|
|
87
|
+
border-radius: var(--rs-radius-sm);
|
|
88
|
+
background: transparent;
|
|
89
|
+
color: var(--rs-terminal-fg);
|
|
90
|
+
font-size: var(--rs-font-size-xs);
|
|
91
|
+
cursor: pointer;
|
|
92
|
+
}
|
|
52
93
|
|
|
53
94
|
/*
|
|
54
95
|
* letter-spacing 必须在终端内归零:宿主应用常在祖先上设负字距(NiuMa 的 .nm-app 是 -0.011em)。
|
|
@@ -57,7 +98,7 @@
|
|
|
57
98
|
* DOM 渲染器于是按 `cellWidth - 测量值` 给每个字符补正字距,行盒却仍是 cols × cellWidth,
|
|
58
99
|
* 逐列累积后整行溢出十几到几十像素,被行盒的 overflow:hidden 切掉行尾几个字符。
|
|
59
100
|
*/
|
|
60
|
-
.rs-terminal[data-v-
|
|
101
|
+
.rs-terminal[data-v-fba85f3c] .xterm {
|
|
61
102
|
width: 100%;
|
|
62
103
|
height: 100%;
|
|
63
104
|
line-height: normal;
|
|
@@ -68,7 +109,7 @@
|
|
|
68
109
|
* xterm 6 官方仍给空的 .xterm-viewport 写 overflow-y:scroll + 背景 #000。
|
|
69
110
|
* 真正滚动的是 .xterm-scrollable-element;空层滚动条会挡住最后一列。
|
|
70
111
|
*/
|
|
71
|
-
.rs-terminal[data-v-
|
|
112
|
+
.rs-terminal[data-v-fba85f3c] .xterm .xterm-viewport {
|
|
72
113
|
overflow: hidden;
|
|
73
114
|
background-color: transparent;
|
|
74
115
|
}
|
|
@@ -78,7 +119,7 @@
|
|
|
78
119
|
* 的圆角胶囊不一致。轨道宽度由 overviewRuler.width 决定,改它会给每个终端实例多建一块
|
|
79
120
|
* overview ruler 画布,因此只重绘滑块:热区仍是 14px,靠透明边框内缩出 10px 可见胶囊。
|
|
80
121
|
*/
|
|
81
|
-
.rs-terminal[data-v-
|
|
122
|
+
.rs-terminal[data-v-fba85f3c] .xterm-scrollable-element > .scrollbar > .slider {
|
|
82
123
|
box-sizing: border-box;
|
|
83
124
|
border: var(--rs-scrollbar-padding, 2px) solid transparent;
|
|
84
125
|
border-radius: var(--rs-radius-full);
|
|
@@ -86,18 +127,18 @@
|
|
|
86
127
|
background-clip: padding-box;
|
|
87
128
|
transition: background-color var(--rs-transition-fast);
|
|
88
129
|
}
|
|
89
|
-
.rs-terminal[data-v-
|
|
130
|
+
.rs-terminal[data-v-fba85f3c] .xterm-scrollable-element > .scrollbar > .slider:hover {
|
|
90
131
|
background-color: color-mix(in srgb, var(--rs-primary) 40%, var(--rs-muted));
|
|
91
132
|
}
|
|
92
|
-
.rs-terminal[data-v-
|
|
133
|
+
.rs-terminal[data-v-fba85f3c] .xterm-scrollable-element > .scrollbar > .slider.active {
|
|
93
134
|
background-color: color-mix(in srgb, var(--rs-primary) 55%, var(--rs-muted));
|
|
94
135
|
}
|
|
95
|
-
.rs-terminal--zebra[data-v-
|
|
96
|
-
.rs-terminal--zebra[data-v-
|
|
97
|
-
.rs-terminal--zebra[data-v-
|
|
136
|
+
.rs-terminal--zebra[data-v-fba85f3c] .xterm-rows,
|
|
137
|
+
.rs-terminal--zebra[data-v-fba85f3c] .xterm-rows > div,
|
|
138
|
+
.rs-terminal--zebra[data-v-fba85f3c] .xterm-row {
|
|
98
139
|
background-color: transparent !important;
|
|
99
140
|
}
|
|
100
|
-
.rs-terminal--zebra[data-v-
|
|
141
|
+
.rs-terminal--zebra[data-v-fba85f3c] .xterm-scrollable-element {
|
|
101
142
|
background-color: transparent !important;
|
|
102
143
|
background-image: repeating-linear-gradient(
|
|
103
144
|
to bottom,
|
|
@@ -108,12 +149,12 @@
|
|
|
108
149
|
);
|
|
109
150
|
background-attachment: local;
|
|
110
151
|
}
|
|
111
|
-
.rs-terminal--zebra[data-v-
|
|
152
|
+
.rs-terminal--zebra[data-v-fba85f3c] .xterm-screen {
|
|
112
153
|
background-color: transparent !important;
|
|
113
154
|
}
|
|
114
|
-
.rs-terminal[data-v-
|
|
155
|
+
.rs-terminal[data-v-fba85f3c] .xterm-fg-257 {
|
|
115
156
|
color: var(--rs-terminal-bg) !important;
|
|
116
157
|
}
|
|
117
|
-
.rs-terminal[data-v-
|
|
158
|
+
.rs-terminal[data-v-fba85f3c] .xterm-bg-257 {
|
|
118
159
|
background-color: var(--rs-terminal-fg) !important;
|
|
119
160
|
}
|
|
@@ -42,8 +42,16 @@ type __VLS_Props = {
|
|
|
42
42
|
wheelScrollModifier?: RsTerminalWheelScrollModifier;
|
|
43
43
|
/** TUI 全屏刷新时若视口不在底部,自动滚回底部(修复 top 表头丢失) */
|
|
44
44
|
snapViewportOnTuiWrite?: boolean;
|
|
45
|
+
/** 鼠标松开时若有选区则复制(接近原生终端 copy-on-select) */
|
|
46
|
+
copyOnSelect?: boolean;
|
|
47
|
+
/** 启用 Ctrl/⌘+F 终端内搜索 */
|
|
48
|
+
searchEnabled?: boolean;
|
|
45
49
|
};
|
|
46
|
-
declare
|
|
50
|
+
declare var __VLS_15: {};
|
|
51
|
+
type __VLS_Slots = {} & {
|
|
52
|
+
overlayAction?: (props: typeof __VLS_15) => any;
|
|
53
|
+
};
|
|
54
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, RsTerminalExpose, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
47
55
|
data: (data: string) => any;
|
|
48
56
|
resize: (payload: {
|
|
49
57
|
cols: number;
|
|
@@ -80,6 +88,14 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, RsTermina
|
|
|
80
88
|
zebraStripes: boolean;
|
|
81
89
|
wheelScrollModifier: RsTerminalWheelScrollModifier;
|
|
82
90
|
snapViewportOnTuiWrite: boolean;
|
|
91
|
+
copyOnSelect: boolean;
|
|
92
|
+
searchEnabled: boolean;
|
|
83
93
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
94
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
84
95
|
declare const _default: typeof __VLS_export;
|
|
85
96
|
export default _default;
|
|
97
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
98
|
+
new (): {
|
|
99
|
+
$slots: S;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
@@ -5,14 +5,17 @@ import { beginClipboardPrefetch, copyTextToClipboard, readClipboardText } from "
|
|
|
5
5
|
import { readTerminalFontFamily, readTerminalFontSizePx, readTerminalFontWeight, readTerminalFontWeightBold } from "../theme/css-token.js";
|
|
6
6
|
import { containsTuiRefreshSequence, mergeTerminalTheme, prepareTerminalForPtyWrite, resolveTerminalTheme, terminalShortcutLabel } from "./terminal-utils.js";
|
|
7
7
|
import { attachWheelScrollGuard, isAlternateTerminalBuffer } from "./terminal-wheel.js";
|
|
8
|
-
import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, mergeProps, nextTick, onBeforeUnmount, onMounted, openBlock, ref, toDisplayString, watch, withCtx } from "vue";
|
|
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";
|
|
9
9
|
import { FitAddon } from "@xterm/addon-fit";
|
|
10
|
+
import { SearchAddon } from "@xterm/addon-search";
|
|
10
11
|
import { Terminal } from "@xterm/xterm";
|
|
11
12
|
import "@xterm/xterm/css/xterm.css";
|
|
12
13
|
//#region src/components/RsTerminal.vue?vue&type=script&setup=true&lang.ts
|
|
13
|
-
var _hoisted_1 =
|
|
14
|
+
var _hoisted_1 = ["placeholder", "aria-label"];
|
|
15
|
+
var _hoisted_2 = { key: 0 };
|
|
16
|
+
var _hoisted_3 = {
|
|
14
17
|
key: 1,
|
|
15
|
-
class: "rs-terminal__overlay"
|
|
18
|
+
class: "rs-terminal__overlay-action"
|
|
16
19
|
};
|
|
17
20
|
/** 单元格高度倍率(xterm options.lineHeight)。中文比 Canvas 测的西文高,1 会裁到下一行。 */
|
|
18
21
|
var TERMINAL_LINE_HEIGHT = 1.2;
|
|
@@ -74,6 +77,14 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
74
77
|
snapViewportOnTuiWrite: {
|
|
75
78
|
type: Boolean,
|
|
76
79
|
default: true
|
|
80
|
+
},
|
|
81
|
+
copyOnSelect: {
|
|
82
|
+
type: Boolean,
|
|
83
|
+
default: false
|
|
84
|
+
},
|
|
85
|
+
searchEnabled: {
|
|
86
|
+
type: Boolean,
|
|
87
|
+
default: false
|
|
77
88
|
}
|
|
78
89
|
},
|
|
79
90
|
emits: [
|
|
@@ -149,6 +160,12 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
149
160
|
shortcut: terminalShortcutLabel("A")
|
|
150
161
|
}
|
|
151
162
|
];
|
|
163
|
+
if (props.searchEnabled) items.push({
|
|
164
|
+
key: "search",
|
|
165
|
+
label: t("terminal.search", "Search"),
|
|
166
|
+
icon: "search",
|
|
167
|
+
shortcut: terminalShortcutLabel("F")
|
|
168
|
+
});
|
|
152
169
|
if (props.showAskAi) items.push({
|
|
153
170
|
key: "sep-ai",
|
|
154
171
|
label: "",
|
|
@@ -172,8 +189,12 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
172
189
|
});
|
|
173
190
|
return items;
|
|
174
191
|
});
|
|
192
|
+
const searchOpen = ref(false);
|
|
193
|
+
const searchQuery = ref("");
|
|
194
|
+
const searchInputEl = ref(null);
|
|
175
195
|
let terminal = null;
|
|
176
196
|
let fitAddon = null;
|
|
197
|
+
let searchAddon = null;
|
|
177
198
|
let resizeObserver = null;
|
|
178
199
|
let themeObserver = null;
|
|
179
200
|
let detachWheelGuard = null;
|
|
@@ -290,6 +311,43 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
290
311
|
if (live && (!snap || live.length >= snap.length)) return live;
|
|
291
312
|
return snap;
|
|
292
313
|
}
|
|
314
|
+
function openSearch() {
|
|
315
|
+
if (!props.searchEnabled) return;
|
|
316
|
+
searchOpen.value = true;
|
|
317
|
+
nextTick(() => {
|
|
318
|
+
searchInputEl.value?.focus();
|
|
319
|
+
searchInputEl.value?.select();
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
function closeSearch() {
|
|
323
|
+
searchOpen.value = false;
|
|
324
|
+
searchAddon?.clearDecorations();
|
|
325
|
+
terminal?.focus();
|
|
326
|
+
}
|
|
327
|
+
function runSearch(direction) {
|
|
328
|
+
const query = searchQuery.value;
|
|
329
|
+
if (!query || !searchAddon) return;
|
|
330
|
+
if (direction === "prev") {
|
|
331
|
+
searchAddon.findPrevious(query);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
searchAddon.findNext(query);
|
|
335
|
+
}
|
|
336
|
+
function onSearchKeydown(event) {
|
|
337
|
+
if (event.key === "Escape") {
|
|
338
|
+
event.preventDefault();
|
|
339
|
+
closeSearch();
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (event.key === "Enter") {
|
|
343
|
+
event.preventDefault();
|
|
344
|
+
runSearch(event.shiftKey ? "prev" : "next");
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function onHostMouseUp() {
|
|
348
|
+
if (!props.copyOnSelect || !terminal?.hasSelection()) return;
|
|
349
|
+
copySelection();
|
|
350
|
+
}
|
|
293
351
|
async function copySelection() {
|
|
294
352
|
const text = resolveMenuSelectionText();
|
|
295
353
|
if (!text) return;
|
|
@@ -345,6 +403,11 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
345
403
|
clearTerminal();
|
|
346
404
|
return;
|
|
347
405
|
}
|
|
406
|
+
if (action === "search") {
|
|
407
|
+
openSearch();
|
|
408
|
+
emit("action", "search");
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
348
411
|
if (action === "askAi") {
|
|
349
412
|
const text = resolveMenuSelectionText();
|
|
350
413
|
emit("askAi", text);
|
|
@@ -384,6 +447,12 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
384
447
|
clearTerminal();
|
|
385
448
|
return false;
|
|
386
449
|
}
|
|
450
|
+
if (key === "f" && props.searchEnabled) {
|
|
451
|
+
event.preventDefault();
|
|
452
|
+
event.stopPropagation();
|
|
453
|
+
openSearch();
|
|
454
|
+
return false;
|
|
455
|
+
}
|
|
387
456
|
return true;
|
|
388
457
|
});
|
|
389
458
|
}
|
|
@@ -439,6 +508,8 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
439
508
|
});
|
|
440
509
|
fitAddon = new FitAddon();
|
|
441
510
|
terminal.loadAddon(fitAddon);
|
|
511
|
+
searchAddon = new SearchAddon();
|
|
512
|
+
terminal.loadAddon(searchAddon);
|
|
442
513
|
terminal.open(hostEl.value);
|
|
443
514
|
terminal.onData((data) => {
|
|
444
515
|
if (props.inputEnabled) emit("data", data);
|
|
@@ -478,6 +549,7 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
478
549
|
terminal?.dispose();
|
|
479
550
|
terminal = null;
|
|
480
551
|
fitAddon = null;
|
|
552
|
+
searchAddon = null;
|
|
481
553
|
didInitialFit = false;
|
|
482
554
|
});
|
|
483
555
|
__expose({
|
|
@@ -505,18 +577,53 @@ var RsTerminal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defin
|
|
|
505
577
|
onClick: focus,
|
|
506
578
|
onContextmenuCapture: onTerminalContextMenu
|
|
507
579
|
}), [
|
|
580
|
+
__props.searchEnabled && searchOpen.value ? (openBlock(), createElementBlock("div", {
|
|
581
|
+
key: 0,
|
|
582
|
+
class: "rs-terminal__search",
|
|
583
|
+
onClick: _cache[3] || (_cache[3] = withModifiers(() => {}, ["stop"]))
|
|
584
|
+
}, [
|
|
585
|
+
withDirectives(createElementVNode("input", {
|
|
586
|
+
ref_key: "searchInputEl",
|
|
587
|
+
ref: searchInputEl,
|
|
588
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
|
|
589
|
+
class: "rs-terminal__search-input",
|
|
590
|
+
type: "search",
|
|
591
|
+
placeholder: unref(t)("terminal.searchPlaceholder", "Find in terminal"),
|
|
592
|
+
"aria-label": unref(t)("terminal.search", "Search"),
|
|
593
|
+
onKeydown: onSearchKeydown
|
|
594
|
+
}, null, 40, _hoisted_1), [[vModelText, searchQuery.value]]),
|
|
595
|
+
createElementVNode("button", {
|
|
596
|
+
type: "button",
|
|
597
|
+
class: "rs-terminal__search-btn",
|
|
598
|
+
onClick: _cache[1] || (_cache[1] = ($event) => runSearch("prev"))
|
|
599
|
+
}, toDisplayString(unref(t)("terminal.searchPrev", "Previous")), 1),
|
|
600
|
+
createElementVNode("button", {
|
|
601
|
+
type: "button",
|
|
602
|
+
class: "rs-terminal__search-btn",
|
|
603
|
+
onClick: _cache[2] || (_cache[2] = ($event) => runSearch("next"))
|
|
604
|
+
}, toDisplayString(unref(t)("terminal.searchNext", "Next")), 1),
|
|
605
|
+
createElementVNode("button", {
|
|
606
|
+
type: "button",
|
|
607
|
+
class: "rs-terminal__search-btn",
|
|
608
|
+
onClick: closeSearch
|
|
609
|
+
}, toDisplayString(unref(t)("terminal.searchClose", "Close search")), 1)
|
|
610
|
+
])) : createCommentVNode("", true),
|
|
508
611
|
createElementVNode("div", {
|
|
509
612
|
ref_key: "hostEl",
|
|
510
613
|
ref: hostEl,
|
|
511
|
-
class: "rs-terminal__host"
|
|
512
|
-
|
|
614
|
+
class: "rs-terminal__host",
|
|
615
|
+
onMouseup: onHostMouseUp
|
|
616
|
+
}, null, 544),
|
|
513
617
|
showLoading.value ? (openBlock(), createBlock(RsLoading_default, {
|
|
514
|
-
key:
|
|
618
|
+
key: 1,
|
|
515
619
|
class: "rs-terminal__loading"
|
|
516
620
|
})) : createCommentVNode("", true),
|
|
517
|
-
__props.overlay ? (openBlock(), createElementBlock("output",
|
|
621
|
+
__props.overlay || _ctx.$slots.overlayAction ? (openBlock(), createElementBlock("output", {
|
|
622
|
+
key: 2,
|
|
623
|
+
class: normalizeClass(["rs-terminal__overlay", { "rs-terminal__overlay--interactive": Boolean(_ctx.$slots.overlayAction) }])
|
|
624
|
+
}, [__props.overlay ? (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(__props.overlay), 1)) : createCommentVNode("", true), _ctx.$slots.overlayAction ? (openBlock(), createElementBlock("div", _hoisted_3, [renderSlot(_ctx.$slots, "overlayAction", {}, void 0, true)])) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)
|
|
518
625
|
], 16)]),
|
|
519
|
-
_:
|
|
626
|
+
_: 3
|
|
520
627
|
}, 8, ["disabled", "items"]);
|
|
521
628
|
};
|
|
522
629
|
}
|
|
@@ -3,6 +3,6 @@ import _plugin_vue_export_helper_default from "../_virtual/_plugin-vue_export-he
|
|
|
3
3
|
import RsTerminal_vue_vue_type_script_setup_true_lang_default from "./RsTerminal.impl.js";
|
|
4
4
|
|
|
5
5
|
//#region src/components/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-fba85f3c"]]);
|
|
7
7
|
//#endregion
|
|
8
8
|
export { RsTerminal_default as default };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
|
|
2
|
+
.rs-textarea[data-v-f75ef1a0] {
|
|
3
|
+
width: 100%;
|
|
4
|
+
}
|
|
5
|
+
.rs-textarea__shell[data-v-f75ef1a0] {
|
|
6
|
+
position: relative;
|
|
7
|
+
box-sizing: border-box;
|
|
8
|
+
width: 100%;
|
|
9
|
+
border: 1px solid var(--rs-input-border, var(--rs-border));
|
|
10
|
+
border-radius: var(--rs-input-radius, var(--rs-radius-sm));
|
|
11
|
+
background: var(--rs-input-bg);
|
|
12
|
+
box-shadow: var(--rs-input-shadow, none);
|
|
13
|
+
transition:
|
|
14
|
+
border-color var(--rs-transition-fast),
|
|
15
|
+
box-shadow var(--rs-transition-fast);
|
|
16
|
+
}
|
|
17
|
+
.rs-textarea__shell[data-v-f75ef1a0]:hover:not(.is-disabled):not(.is-readonly):not(:focus-within) {
|
|
18
|
+
border-color: var(--rs-input-border-hover, var(--rs-border));
|
|
19
|
+
}
|
|
20
|
+
.rs-textarea__shell[data-v-f75ef1a0]:focus-within {
|
|
21
|
+
border-color: var(--rs-focus-border, var(--rs-primary));
|
|
22
|
+
box-shadow:
|
|
23
|
+
var(--rs-input-shadow, none),
|
|
24
|
+
0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
|
|
25
|
+
}
|
|
26
|
+
.rs-textarea__shell.is-invalid[data-v-f75ef1a0] {
|
|
27
|
+
border-color: var(--rs-danger);
|
|
28
|
+
}
|
|
29
|
+
.rs-textarea__shell.is-invalid[data-v-f75ef1a0]:focus-within {
|
|
30
|
+
box-shadow:
|
|
31
|
+
var(--rs-input-shadow, none),
|
|
32
|
+
0 0 0 var(--rs-focus-ring-width, 2px) color-mix(in srgb, var(--rs-danger) 14%, transparent);
|
|
33
|
+
}
|
|
34
|
+
.rs-textarea__shell.is-disabled[data-v-f75ef1a0] {
|
|
35
|
+
opacity: 0.38;
|
|
36
|
+
cursor: not-allowed;
|
|
37
|
+
background: var(--rs-surface-hover);
|
|
38
|
+
}
|
|
39
|
+
.rs-textarea__shell.is-readonly[data-v-f75ef1a0] {
|
|
40
|
+
background: var(--rs-surface-hover);
|
|
41
|
+
}
|
|
42
|
+
.rs-textarea__control[data-v-f75ef1a0] {
|
|
43
|
+
display: block;
|
|
44
|
+
box-sizing: border-box;
|
|
45
|
+
width: 100%;
|
|
46
|
+
min-height: 4.5rem;
|
|
47
|
+
padding: 0.55rem 0.75rem;
|
|
48
|
+
border: 0;
|
|
49
|
+
outline: none;
|
|
50
|
+
background: transparent;
|
|
51
|
+
color: var(--rs-text);
|
|
52
|
+
font: inherit;
|
|
53
|
+
font-size: var(--rs-font-size-sm);
|
|
54
|
+
line-height: 1.5;
|
|
55
|
+
}
|
|
56
|
+
.rs-textarea__shell.is-autosize .rs-textarea__control[data-v-f75ef1a0] {
|
|
57
|
+
min-height: 0;
|
|
58
|
+
}
|
|
59
|
+
.rs-textarea__shell.has-count .rs-textarea__control[data-v-f75ef1a0] {
|
|
60
|
+
padding-bottom: 1.55rem;
|
|
61
|
+
}
|
|
62
|
+
.rs-textarea__shell.has-clear .rs-textarea__control[data-v-f75ef1a0] {
|
|
63
|
+
padding-right: 1.85rem;
|
|
64
|
+
}
|
|
65
|
+
.rs-input-field--sm .rs-textarea__control[data-v-f75ef1a0] {
|
|
66
|
+
min-height: 3.5rem;
|
|
67
|
+
padding: 0.4rem 0.6rem;
|
|
68
|
+
font-size: var(--rs-font-size-xs);
|
|
69
|
+
}
|
|
70
|
+
.rs-input-field--sm .rs-textarea__shell.has-count .rs-textarea__control[data-v-f75ef1a0] {
|
|
71
|
+
padding-bottom: 1.4rem;
|
|
72
|
+
}
|
|
73
|
+
.rs-input-field--lg .rs-textarea__control[data-v-f75ef1a0] {
|
|
74
|
+
min-height: 5.5rem;
|
|
75
|
+
padding: 0.7rem 0.9rem;
|
|
76
|
+
}
|
|
77
|
+
.rs-textarea__control[data-v-f75ef1a0]::placeholder {
|
|
78
|
+
color: var(--rs-placeholder);
|
|
79
|
+
}
|
|
80
|
+
.rs-textarea__control[data-v-f75ef1a0]:disabled {
|
|
81
|
+
cursor: not-allowed;
|
|
82
|
+
}
|
|
83
|
+
.rs-textarea__control[data-v-f75ef1a0]:read-only {
|
|
84
|
+
cursor: default;
|
|
85
|
+
}
|
|
86
|
+
.rs-textarea__clear[data-v-f75ef1a0] {
|
|
87
|
+
position: absolute;
|
|
88
|
+
top: 0.45rem;
|
|
89
|
+
right: 0.45rem;
|
|
90
|
+
display: inline-flex;
|
|
91
|
+
align-items: center;
|
|
92
|
+
justify-content: center;
|
|
93
|
+
width: 1.25rem;
|
|
94
|
+
height: 1.25rem;
|
|
95
|
+
padding: 0;
|
|
96
|
+
border: none;
|
|
97
|
+
border-radius: var(--rs-radius-xs);
|
|
98
|
+
background: transparent;
|
|
99
|
+
color: var(--rs-muted);
|
|
100
|
+
cursor: pointer;
|
|
101
|
+
transition:
|
|
102
|
+
color var(--rs-transition-fast),
|
|
103
|
+
background var(--rs-transition-fast);
|
|
104
|
+
}
|
|
105
|
+
.rs-textarea__clear[data-v-f75ef1a0]:hover {
|
|
106
|
+
color: var(--rs-text);
|
|
107
|
+
background: var(--rs-item-hover);
|
|
108
|
+
}
|
|
109
|
+
.rs-textarea__count[data-v-f75ef1a0] {
|
|
110
|
+
position: absolute;
|
|
111
|
+
right: 0.65rem;
|
|
112
|
+
bottom: 0.3rem;
|
|
113
|
+
margin: 0;
|
|
114
|
+
pointer-events: none;
|
|
115
|
+
font-size: var(--rs-font-size-xs);
|
|
116
|
+
font-variant-numeric: tabular-nums;
|
|
117
|
+
line-height: 1;
|
|
118
|
+
color: var(--rs-muted);
|
|
119
|
+
}
|
|
120
|
+
.rs-textarea__count.is-limit[data-v-f75ef1a0] {
|
|
121
|
+
color: var(--rs-danger);
|
|
122
|
+
}
|
|
123
|
+
.rs-field--label-left .rs-textarea[data-v-f75ef1a0] {
|
|
124
|
+
grid-column: 2;
|
|
125
|
+
min-width: 0;
|
|
126
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { RsComponentSize, RsRadius } from '../theme/types';
|
|
2
|
+
import { type RsFormLabelPosition } from './form-utils';
|
|
3
|
+
import { type RsFormRuleTrigger } from './form-rules';
|
|
4
|
+
import type { RsInputRule, RsInputValidateTrigger } from './input-rules';
|
|
5
|
+
/** 原生 resize;autosize 开启时强制 none,与 Element Plus 一致。 */
|
|
6
|
+
export type RsTextareaResize = 'none' | 'horizontal' | 'vertical' | 'both';
|
|
7
|
+
/**
|
|
8
|
+
* 自适应高度。true 从 rows 起往下长;对象可锁 minRows / maxRows。
|
|
9
|
+
* 对齐 Ant Design autoSize、Element Plus autosize。
|
|
10
|
+
*/
|
|
11
|
+
export type RsTextareaAutosize = boolean | {
|
|
12
|
+
minRows?: number;
|
|
13
|
+
maxRows?: number;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* RsTextarea 模板 ref 请用此类型。
|
|
17
|
+
* 不要写 InstanceType<typeof RsTextarea>:组件实例类型过深,vue-tsc 会报 Excessive stack depth。
|
|
18
|
+
*/
|
|
19
|
+
export interface RsTextareaExpose {
|
|
20
|
+
validate: (trigger?: RsFormRuleTrigger) => Promise<boolean>;
|
|
21
|
+
clearValidation: () => void;
|
|
22
|
+
setValue: (value: unknown) => void;
|
|
23
|
+
setError: (message: string) => void;
|
|
24
|
+
focus: () => void;
|
|
25
|
+
blur: () => void;
|
|
26
|
+
}
|
|
27
|
+
/** 模板 ref 实例:expose + 根节点 */
|
|
28
|
+
export type RsTextareaInstance = RsTextareaExpose & {
|
|
29
|
+
$el: HTMLElement;
|
|
30
|
+
};
|
|
31
|
+
type __VLS_Props = {
|
|
32
|
+
id?: string;
|
|
33
|
+
placeholder?: string;
|
|
34
|
+
disabled?: boolean;
|
|
35
|
+
readonly?: boolean;
|
|
36
|
+
invalid?: boolean;
|
|
37
|
+
errorMessage?: string;
|
|
38
|
+
size?: RsComponentSize;
|
|
39
|
+
radius?: RsRadius;
|
|
40
|
+
rows?: number;
|
|
41
|
+
resize?: RsTextareaResize;
|
|
42
|
+
/** true 或 { minRows, maxRows };开启后不可拖拽改高 */
|
|
43
|
+
autosize?: RsTextareaAutosize;
|
|
44
|
+
rule?: RsInputRule;
|
|
45
|
+
validator?: (value: string) => boolean | string;
|
|
46
|
+
required?: boolean;
|
|
47
|
+
validateTrigger?: RsInputValidateTrigger;
|
|
48
|
+
name?: string;
|
|
49
|
+
minlength?: number;
|
|
50
|
+
maxlength?: number;
|
|
51
|
+
showCount?: boolean;
|
|
52
|
+
clearable?: boolean;
|
|
53
|
+
showValidateMessage?: boolean;
|
|
54
|
+
label?: string;
|
|
55
|
+
hint?: string;
|
|
56
|
+
labelPosition?: RsFormLabelPosition;
|
|
57
|
+
};
|
|
58
|
+
type __VLS_ModelProps = {
|
|
59
|
+
modelValue?: string;
|
|
60
|
+
};
|
|
61
|
+
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
62
|
+
declare var __VLS_6: {
|
|
63
|
+
value: string;
|
|
64
|
+
count: number;
|
|
65
|
+
maxlength: number | undefined;
|
|
66
|
+
}, __VLS_8: {
|
|
67
|
+
message: string;
|
|
68
|
+
};
|
|
69
|
+
type __VLS_Slots = {} & {
|
|
70
|
+
count?: (props: typeof __VLS_6) => any;
|
|
71
|
+
} & {
|
|
72
|
+
error?: (props: typeof __VLS_8) => any;
|
|
73
|
+
};
|
|
74
|
+
declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, RsTextareaExpose, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
75
|
+
blur: (event: FocusEvent) => any;
|
|
76
|
+
focus: (event: FocusEvent) => any;
|
|
77
|
+
clear: () => any;
|
|
78
|
+
"update:modelValue": (value: string) => any;
|
|
79
|
+
validate: (payload: {
|
|
80
|
+
valid: boolean;
|
|
81
|
+
message?: string;
|
|
82
|
+
}) => any;
|
|
83
|
+
pressEnter: (event: KeyboardEvent) => any;
|
|
84
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
85
|
+
onBlur?: ((event: FocusEvent) => any) | undefined;
|
|
86
|
+
onFocus?: ((event: FocusEvent) => any) | undefined;
|
|
87
|
+
onClear?: (() => any) | undefined;
|
|
88
|
+
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
89
|
+
onValidate?: ((payload: {
|
|
90
|
+
valid: boolean;
|
|
91
|
+
message?: string;
|
|
92
|
+
}) => any) | undefined;
|
|
93
|
+
onPressEnter?: ((event: KeyboardEvent) => any) | undefined;
|
|
94
|
+
}>, {
|
|
95
|
+
invalid: boolean;
|
|
96
|
+
resize: RsTextareaResize;
|
|
97
|
+
required: boolean;
|
|
98
|
+
disabled: boolean;
|
|
99
|
+
readonly: boolean;
|
|
100
|
+
validateTrigger: RsInputValidateTrigger;
|
|
101
|
+
clearable: boolean;
|
|
102
|
+
showCount: boolean;
|
|
103
|
+
showValidateMessage: boolean;
|
|
104
|
+
rows: number;
|
|
105
|
+
autosize: RsTextareaAutosize;
|
|
106
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
107
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
108
|
+
declare const _default: typeof __VLS_export;
|
|
109
|
+
export default _default;
|
|
110
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
111
|
+
new (): {
|
|
112
|
+
$slots: S;
|
|
113
|
+
};
|
|
114
|
+
};
|