niuma-ui 1.3.7 → 1.3.9
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 +22 -0
- package/NOTICE +12 -9
- package/README.en.md +52 -34
- package/README.md +55 -97
- package/dist/components/RsAnchor.css +65 -0
- package/dist/components/RsAnchor.d.ts +41 -0
- package/dist/components/RsAnchor.impl.js +188 -0
- package/dist/components/RsAnchor.js +8 -0
- package/dist/components/RsSelect.css +39 -39
- package/dist/components/RsSelect.impl.js +1 -0
- package/dist/components/RsSelect.js +1 -1
- package/dist/components/RsTerminal.css +23 -23
- package/dist/components/RsTerminal.d.ts +9 -0
- package/dist/components/RsTerminal.impl.js +21 -2
- package/dist/components/RsTerminal.js +1 -1
- package/dist/components/anchor-utils.d.ts +26 -0
- package/dist/components/anchor-utils.js +63 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +4 -0
- package/dist/locale/messages.js +40 -38
- package/dist/styles.css +58 -0
- package/package.json +7 -3
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { useRsI18n } from "../composables/useRsI18n.js";
|
|
2
|
+
import { computeScrollTopForTarget, flattenAnchorItems, hrefToAnchorId, pickActiveAnchorHref, resolveAnchorContainer, scrollContainerTo, targetTopInContainer } from "./anchor-utils.js";
|
|
3
|
+
import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, defineComponent, mergeModels, nextTick, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, ref, renderList, toDisplayString, unref, useModel, watch } from "vue";
|
|
4
|
+
//#region src/components/RsAnchor.vue?vue&type=script&setup=true&lang.ts
|
|
5
|
+
var _hoisted_1 = ["aria-label"];
|
|
6
|
+
var _hoisted_2 = {
|
|
7
|
+
key: 0,
|
|
8
|
+
class: "rs-anchor__rail",
|
|
9
|
+
"aria-hidden": "true"
|
|
10
|
+
};
|
|
11
|
+
var _hoisted_3 = { class: "rs-anchor__list" };
|
|
12
|
+
var _hoisted_4 = [
|
|
13
|
+
"href",
|
|
14
|
+
"data-rs-anchor-href",
|
|
15
|
+
"onClick"
|
|
16
|
+
];
|
|
17
|
+
var RsAnchor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
18
|
+
name: "RsAnchor",
|
|
19
|
+
__name: "RsAnchor",
|
|
20
|
+
props: /*@__PURE__*/ mergeModels({
|
|
21
|
+
items: {},
|
|
22
|
+
offset: { default: 12 },
|
|
23
|
+
targetOffset: {},
|
|
24
|
+
bounds: { default: 8 },
|
|
25
|
+
affix: {
|
|
26
|
+
type: Boolean,
|
|
27
|
+
default: true
|
|
28
|
+
},
|
|
29
|
+
lineless: {
|
|
30
|
+
type: Boolean,
|
|
31
|
+
default: false
|
|
32
|
+
},
|
|
33
|
+
changeHash: {
|
|
34
|
+
type: Boolean,
|
|
35
|
+
default: true
|
|
36
|
+
},
|
|
37
|
+
getContainer: {}
|
|
38
|
+
}, {
|
|
39
|
+
"modelValue": { default: "" },
|
|
40
|
+
"modelModifiers": {}
|
|
41
|
+
}),
|
|
42
|
+
emits: /*@__PURE__*/ mergeModels(["change", "click"], ["update:modelValue"]),
|
|
43
|
+
setup(__props, { emit: __emit }) {
|
|
44
|
+
const props = __props;
|
|
45
|
+
const activeHref = useModel(__props, "modelValue");
|
|
46
|
+
const emit = __emit;
|
|
47
|
+
const { t } = useRsI18n();
|
|
48
|
+
const rootRef = ref(null);
|
|
49
|
+
const inkStyle = ref({});
|
|
50
|
+
const flatItems = computed(() => flattenAnchorItems(props.items));
|
|
51
|
+
const resolvedTargetOffset = computed(() => props.targetOffset ?? props.offset);
|
|
52
|
+
let scrollTarget = null;
|
|
53
|
+
let ticking = false;
|
|
54
|
+
function findTarget(href) {
|
|
55
|
+
const id = hrefToAnchorId(href);
|
|
56
|
+
if (!id || typeof document === "undefined") return null;
|
|
57
|
+
return document.getElementById(id);
|
|
58
|
+
}
|
|
59
|
+
function findLinkByHref(root, href) {
|
|
60
|
+
const links = root.querySelectorAll("[data-rs-anchor-href]");
|
|
61
|
+
for (const link of links) if (link.dataset.rsAnchorHref === href) return link;
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
function collectTops(container) {
|
|
65
|
+
return flatItems.value.map((item) => {
|
|
66
|
+
const el = findTarget(item.href);
|
|
67
|
+
if (!el) return null;
|
|
68
|
+
return {
|
|
69
|
+
href: item.href,
|
|
70
|
+
top: targetTopInContainer(el, container)
|
|
71
|
+
};
|
|
72
|
+
}).filter((entry) => Boolean(entry));
|
|
73
|
+
}
|
|
74
|
+
function setActive(href) {
|
|
75
|
+
if (!href || href === activeHref.value) return;
|
|
76
|
+
activeHref.value = href;
|
|
77
|
+
emit("change", href);
|
|
78
|
+
}
|
|
79
|
+
function syncInk() {
|
|
80
|
+
const root = rootRef.value;
|
|
81
|
+
if (!root || props.lineless) return;
|
|
82
|
+
const current = activeHref.value || flatItems.value[0]?.href;
|
|
83
|
+
if (!current) {
|
|
84
|
+
inkStyle.value = { opacity: "0" };
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const link = findLinkByHref(root, current);
|
|
88
|
+
if (!link) {
|
|
89
|
+
inkStyle.value = { opacity: "0" };
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
inkStyle.value = {
|
|
93
|
+
opacity: "1",
|
|
94
|
+
transform: `translateY(${link.offsetTop}px)`,
|
|
95
|
+
height: `${link.offsetHeight}px`
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function syncFromScroll() {
|
|
99
|
+
if (!scrollTarget) return;
|
|
100
|
+
const next = pickActiveAnchorHref(collectTops(scrollTarget), props.offset + props.bounds);
|
|
101
|
+
if (next) setActive(next);
|
|
102
|
+
nextTick(syncInk);
|
|
103
|
+
}
|
|
104
|
+
function onScroll() {
|
|
105
|
+
if (ticking) return;
|
|
106
|
+
ticking = true;
|
|
107
|
+
requestAnimationFrame(() => {
|
|
108
|
+
ticking = false;
|
|
109
|
+
syncFromScroll();
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function bindContainer() {
|
|
113
|
+
unbindContainer();
|
|
114
|
+
try {
|
|
115
|
+
scrollTarget = resolveAnchorContainer(props.getContainer);
|
|
116
|
+
} catch {
|
|
117
|
+
scrollTarget = null;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
scrollTarget.addEventListener("scroll", onScroll, { passive: true });
|
|
121
|
+
syncFromScroll();
|
|
122
|
+
}
|
|
123
|
+
function unbindContainer() {
|
|
124
|
+
scrollTarget?.removeEventListener("scroll", onScroll);
|
|
125
|
+
scrollTarget = null;
|
|
126
|
+
}
|
|
127
|
+
function onSelect(href, event) {
|
|
128
|
+
event.preventDefault();
|
|
129
|
+
emit("click", href, event);
|
|
130
|
+
const target = findTarget(href);
|
|
131
|
+
const container = scrollTarget ?? resolveAnchorContainer(props.getContainer);
|
|
132
|
+
if (target) scrollContainerTo(container, computeScrollTopForTarget(target, container, resolvedTargetOffset.value));
|
|
133
|
+
setActive(href);
|
|
134
|
+
if (props.changeHash && typeof history !== "undefined") {
|
|
135
|
+
const id = hrefToAnchorId(href);
|
|
136
|
+
const url = new URL(window.location.href);
|
|
137
|
+
url.hash = id;
|
|
138
|
+
history.replaceState(history.state, "", `${url.pathname}${url.search}#${id}`);
|
|
139
|
+
}
|
|
140
|
+
nextTick(syncInk);
|
|
141
|
+
}
|
|
142
|
+
onMounted(() => {
|
|
143
|
+
bindContainer();
|
|
144
|
+
window.addEventListener("resize", onScroll, { passive: true });
|
|
145
|
+
});
|
|
146
|
+
onUnmounted(() => {
|
|
147
|
+
unbindContainer();
|
|
148
|
+
window.removeEventListener("resize", onScroll);
|
|
149
|
+
});
|
|
150
|
+
watch(() => [
|
|
151
|
+
props.items,
|
|
152
|
+
props.getContainer,
|
|
153
|
+
props.offset,
|
|
154
|
+
props.bounds
|
|
155
|
+
], () => {
|
|
156
|
+
nextTick(bindContainer);
|
|
157
|
+
}, { deep: true });
|
|
158
|
+
watch(activeHref, () => {
|
|
159
|
+
nextTick(syncInk);
|
|
160
|
+
});
|
|
161
|
+
return (_ctx, _cache) => {
|
|
162
|
+
return flatItems.value.length ? (openBlock(), createElementBlock("nav", {
|
|
163
|
+
key: 0,
|
|
164
|
+
ref_key: "rootRef",
|
|
165
|
+
ref: rootRef,
|
|
166
|
+
class: normalizeClass(["rs-anchor", {
|
|
167
|
+
"rs-anchor--affix": __props.affix,
|
|
168
|
+
"rs-anchor--lineless": __props.lineless
|
|
169
|
+
}]),
|
|
170
|
+
"aria-label": unref(t)("anchor.label")
|
|
171
|
+
}, [!__props.lineless ? (openBlock(), createElementBlock("div", _hoisted_2, [createElementVNode("span", {
|
|
172
|
+
class: "rs-anchor__ink",
|
|
173
|
+
style: normalizeStyle(inkStyle.value)
|
|
174
|
+
}, null, 4)])) : createCommentVNode("", true), createElementVNode("div", _hoisted_3, [(openBlock(true), createElementBlock(Fragment, null, renderList(flatItems.value, (item) => {
|
|
175
|
+
return openBlock(), createElementBlock("a", {
|
|
176
|
+
key: item.href,
|
|
177
|
+
class: normalizeClass(["rs-anchor__link", { "rs-anchor__link--active": item.href === activeHref.value }]),
|
|
178
|
+
style: normalizeStyle({ paddingInlineStart: `${.7 + item.depth * .75}rem` }),
|
|
179
|
+
href: item.href,
|
|
180
|
+
"data-rs-anchor-href": item.href,
|
|
181
|
+
onClick: ($event) => onSelect(item.href, $event)
|
|
182
|
+
}, toDisplayString(item.title), 15, _hoisted_4);
|
|
183
|
+
}), 128))])], 10, _hoisted_1)) : createCommentVNode("", true);
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
//#endregion
|
|
188
|
+
export { RsAnchor_vue_vue_type_script_setup_true_lang_default as default };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import './RsAnchor.css'
|
|
2
|
+
import _plugin_vue_export_helper_default from "../_virtual/_plugin-vue_export-helper.js";
|
|
3
|
+
import RsAnchor_vue_vue_type_script_setup_true_lang_default from "./RsAnchor.impl.js";
|
|
4
|
+
|
|
5
|
+
//#region src/components/RsAnchor.vue
|
|
6
|
+
var RsAnchor_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsAnchor_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-d8c4280b"]]);
|
|
7
|
+
//#endregion
|
|
8
|
+
export { RsAnchor_default as default };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
|
|
2
|
-
.rs-select[data-v-
|
|
2
|
+
.rs-select[data-v-afda3ccc] {
|
|
3
3
|
display: inline-flex;
|
|
4
4
|
width: 100%;
|
|
5
5
|
max-width: 100%;
|
|
6
6
|
vertical-align: middle;
|
|
7
7
|
box-sizing: border-box;
|
|
8
8
|
}
|
|
9
|
-
.rs-select__trigger[data-v-
|
|
9
|
+
.rs-select__trigger[data-v-afda3ccc] {
|
|
10
10
|
display: inline-flex;
|
|
11
11
|
align-items: center;
|
|
12
12
|
justify-content: space-between;
|
|
@@ -31,13 +31,13 @@
|
|
|
31
31
|
box-shadow var(--rs-transition-fast),
|
|
32
32
|
background var(--rs-transition-fast);
|
|
33
33
|
}
|
|
34
|
-
.rs-select--multiple .rs-select__trigger[data-v-
|
|
34
|
+
.rs-select--multiple .rs-select__trigger[data-v-afda3ccc] {
|
|
35
35
|
min-height: var(--rs-control-height-md);
|
|
36
36
|
height: auto;
|
|
37
37
|
padding-top: var(--rs-space-xs);
|
|
38
38
|
padding-bottom: var(--rs-space-xs);
|
|
39
39
|
}
|
|
40
|
-
.rs-select--block[data-v-
|
|
40
|
+
.rs-select--block[data-v-afda3ccc] {
|
|
41
41
|
display: flex;
|
|
42
42
|
flex-direction: column;
|
|
43
43
|
width: 100%;
|
|
@@ -46,56 +46,56 @@
|
|
|
46
46
|
align-self: stretch;
|
|
47
47
|
box-sizing: border-box;
|
|
48
48
|
}
|
|
49
|
-
.rs-select--block .rs-select__anchor[data-v-
|
|
50
|
-
.rs-select--block .rs-select__trigger[data-v-
|
|
49
|
+
.rs-select--block .rs-select__anchor[data-v-afda3ccc],
|
|
50
|
+
.rs-select--block .rs-select__trigger[data-v-afda3ccc] {
|
|
51
51
|
width: 100%;
|
|
52
52
|
}
|
|
53
|
-
.rs-select--ssm .rs-select__trigger[data-v-
|
|
53
|
+
.rs-select--ssm .rs-select__trigger[data-v-afda3ccc] {
|
|
54
54
|
height: var(--rs-control-height-ssm);
|
|
55
55
|
min-height: var(--rs-control-height-ssm);
|
|
56
56
|
padding: 0 var(--rs-space-xs);
|
|
57
57
|
font-size: var(--rs-font-size-xs);
|
|
58
58
|
}
|
|
59
|
-
.rs-select--ssm.rs-select--multiple .rs-select__trigger[data-v-
|
|
59
|
+
.rs-select--ssm.rs-select--multiple .rs-select__trigger[data-v-afda3ccc] {
|
|
60
60
|
min-height: var(--rs-control-height-ssm);
|
|
61
61
|
}
|
|
62
|
-
.rs-select--sm .rs-select__trigger[data-v-
|
|
62
|
+
.rs-select--sm .rs-select__trigger[data-v-afda3ccc] {
|
|
63
63
|
height: var(--rs-control-height-sm);
|
|
64
64
|
min-height: var(--rs-control-height-sm);
|
|
65
65
|
padding: 0 var(--rs-space-sm);
|
|
66
66
|
font-size: var(--rs-font-size-xs);
|
|
67
67
|
}
|
|
68
|
-
.rs-select--sm.rs-select--multiple .rs-select__trigger[data-v-
|
|
68
|
+
.rs-select--sm.rs-select--multiple .rs-select__trigger[data-v-afda3ccc] {
|
|
69
69
|
min-height: var(--rs-control-height-sm);
|
|
70
70
|
}
|
|
71
|
-
.rs-select--lg .rs-select__trigger[data-v-
|
|
71
|
+
.rs-select--lg .rs-select__trigger[data-v-afda3ccc] {
|
|
72
72
|
height: var(--rs-control-height-lg);
|
|
73
73
|
min-height: var(--rs-control-height-lg);
|
|
74
74
|
padding: 0 var(--rs-space-lg);
|
|
75
75
|
font-size: var(--rs-font-size-base);
|
|
76
76
|
}
|
|
77
|
-
.rs-select--lg.rs-select--multiple .rs-select__trigger[data-v-
|
|
77
|
+
.rs-select--lg.rs-select--multiple .rs-select__trigger[data-v-afda3ccc] {
|
|
78
78
|
min-height: var(--rs-control-height-lg);
|
|
79
79
|
}
|
|
80
|
-
.rs-select--filled .rs-select__trigger[data-v-
|
|
80
|
+
.rs-select--filled .rs-select__trigger[data-v-afda3ccc] {
|
|
81
81
|
border-color: transparent;
|
|
82
82
|
background: var(--rs-surface-hover);
|
|
83
83
|
}
|
|
84
|
-
.rs-select--borderless .rs-select__trigger[data-v-
|
|
84
|
+
.rs-select--borderless .rs-select__trigger[data-v-afda3ccc] {
|
|
85
85
|
border-color: transparent;
|
|
86
86
|
background: transparent;
|
|
87
87
|
box-shadow: none;
|
|
88
88
|
}
|
|
89
|
-
.rs-select__mark[data-v-
|
|
89
|
+
.rs-select__mark[data-v-afda3ccc] {
|
|
90
90
|
padding: 0;
|
|
91
91
|
background: color-mix(in srgb, var(--rs-primary) 22%, transparent);
|
|
92
92
|
color: inherit;
|
|
93
93
|
font-weight: var(--rs-font-weight-medium);
|
|
94
94
|
}
|
|
95
|
-
.rs-select__trigger[data-v-
|
|
95
|
+
.rs-select__trigger[data-v-afda3ccc]:hover:not([data-disabled]) {
|
|
96
96
|
border-color: var(--rs-input-border-hover, var(--rs-border));
|
|
97
97
|
}
|
|
98
|
-
.rs-select__trigger[data-v-
|
|
98
|
+
.rs-select__trigger[data-v-afda3ccc]:focus-visible {
|
|
99
99
|
outline: none;
|
|
100
100
|
border-color: var(--rs-focus-border, var(--rs-primary));
|
|
101
101
|
background: var(--rs-input-bg);
|
|
@@ -103,32 +103,32 @@
|
|
|
103
103
|
var(--rs-input-shadow, none),
|
|
104
104
|
0 0 0 var(--rs-focus-ring-width, 2px) var(--rs-focus-ring);
|
|
105
105
|
}
|
|
106
|
-
.rs-select__trigger[data-disabled][data-v-
|
|
106
|
+
.rs-select__trigger[data-disabled][data-v-afda3ccc] {
|
|
107
107
|
opacity: 0.38;
|
|
108
108
|
cursor: not-allowed;
|
|
109
109
|
background: var(--rs-surface-hover);
|
|
110
110
|
}
|
|
111
|
-
.rs-select__trigger--invalid[data-v-
|
|
111
|
+
.rs-select__trigger--invalid[data-v-afda3ccc] {
|
|
112
112
|
border-color: var(--rs-danger);
|
|
113
113
|
}
|
|
114
|
-
.rs-select__trigger--invalid[data-v-
|
|
114
|
+
.rs-select__trigger--invalid[data-v-afda3ccc]:focus-visible {
|
|
115
115
|
border-color: var(--rs-danger);
|
|
116
116
|
box-shadow:
|
|
117
117
|
var(--rs-input-shadow, none),
|
|
118
118
|
0 0 0 var(--rs-focus-ring-width, 2px)
|
|
119
119
|
color-mix(in srgb, var(--rs-danger) 14%, transparent);
|
|
120
120
|
}
|
|
121
|
-
.rs-select__trigger--warning[data-v-
|
|
121
|
+
.rs-select__trigger--warning[data-v-afda3ccc] {
|
|
122
122
|
border-color: var(--rs-warning, #d97706);
|
|
123
123
|
}
|
|
124
|
-
.rs-select__trigger--warning[data-v-
|
|
124
|
+
.rs-select__trigger--warning[data-v-afda3ccc]:focus-visible {
|
|
125
125
|
border-color: var(--rs-warning, #d97706);
|
|
126
126
|
box-shadow:
|
|
127
127
|
var(--rs-input-shadow, none),
|
|
128
128
|
0 0 0 var(--rs-focus-ring-width, 2px)
|
|
129
129
|
color-mix(in srgb, var(--rs-warning, #d97706) 14%, transparent);
|
|
130
130
|
}
|
|
131
|
-
.rs-select__value[data-v-
|
|
131
|
+
.rs-select__value[data-v-afda3ccc] {
|
|
132
132
|
flex: 1;
|
|
133
133
|
min-width: 0;
|
|
134
134
|
text-align: left;
|
|
@@ -136,7 +136,7 @@
|
|
|
136
136
|
text-overflow: ellipsis;
|
|
137
137
|
white-space: nowrap;
|
|
138
138
|
}
|
|
139
|
-
.rs-select__value--multiple[data-v-
|
|
139
|
+
.rs-select__value--multiple[data-v-afda3ccc] {
|
|
140
140
|
display: flex;
|
|
141
141
|
flex-wrap: nowrap;
|
|
142
142
|
gap: var(--rs-space-xs);
|
|
@@ -144,28 +144,28 @@
|
|
|
144
144
|
white-space: nowrap;
|
|
145
145
|
overflow: hidden;
|
|
146
146
|
}
|
|
147
|
-
.rs-select__prefix[data-v-
|
|
147
|
+
.rs-select__prefix[data-v-afda3ccc] {
|
|
148
148
|
display: inline-flex;
|
|
149
149
|
flex-shrink: 0;
|
|
150
150
|
align-items: center;
|
|
151
151
|
color: var(--rs-muted);
|
|
152
152
|
}
|
|
153
|
-
.rs-select__tag--rest[data-v-
|
|
153
|
+
.rs-select__tag--rest[data-v-afda3ccc] {
|
|
154
154
|
padding-right: 0.5rem;
|
|
155
155
|
color: var(--rs-muted);
|
|
156
156
|
background: var(--rs-surface-hover);
|
|
157
157
|
border-color: var(--rs-border);
|
|
158
158
|
}
|
|
159
|
-
.rs-select__placeholder[data-v-
|
|
159
|
+
.rs-select__placeholder[data-v-afda3ccc] {
|
|
160
160
|
color: var(--rs-placeholder);
|
|
161
161
|
}
|
|
162
|
-
.rs-select__single-label[data-v-
|
|
162
|
+
.rs-select__single-label[data-v-afda3ccc] {
|
|
163
163
|
display: block;
|
|
164
164
|
overflow: hidden;
|
|
165
165
|
text-overflow: ellipsis;
|
|
166
166
|
white-space: nowrap;
|
|
167
167
|
}
|
|
168
|
-
.rs-select__tag[data-v-
|
|
168
|
+
.rs-select__tag[data-v-afda3ccc] {
|
|
169
169
|
display: inline-flex;
|
|
170
170
|
align-items: center;
|
|
171
171
|
gap: 0.125rem;
|
|
@@ -179,12 +179,12 @@
|
|
|
179
179
|
font-size: var(--rs-font-size-xs);
|
|
180
180
|
line-height: var(--rs-line-height-tight);
|
|
181
181
|
}
|
|
182
|
-
.rs-select__tag-label[data-v-
|
|
182
|
+
.rs-select__tag-label[data-v-afda3ccc] {
|
|
183
183
|
overflow: hidden;
|
|
184
184
|
text-overflow: ellipsis;
|
|
185
185
|
white-space: nowrap;
|
|
186
186
|
}
|
|
187
|
-
.rs-select__tag-remove[data-v-
|
|
187
|
+
.rs-select__tag-remove[data-v-afda3ccc] {
|
|
188
188
|
display: inline-flex;
|
|
189
189
|
align-items: center;
|
|
190
190
|
justify-content: center;
|
|
@@ -200,17 +200,17 @@
|
|
|
200
200
|
color var(--rs-transition-fast),
|
|
201
201
|
background var(--rs-transition-fast);
|
|
202
202
|
}
|
|
203
|
-
.rs-select__tag-remove[data-v-
|
|
203
|
+
.rs-select__tag-remove[data-v-afda3ccc]:hover {
|
|
204
204
|
color: var(--rs-on-primary-container);
|
|
205
205
|
background: color-mix(in srgb, var(--rs-primary) 16%, transparent);
|
|
206
206
|
}
|
|
207
|
-
.rs-select__actions[data-v-
|
|
207
|
+
.rs-select__actions[data-v-afda3ccc] {
|
|
208
208
|
display: inline-flex;
|
|
209
209
|
align-items: center;
|
|
210
210
|
gap: var(--rs-space-xs);
|
|
211
211
|
flex-shrink: 0;
|
|
212
212
|
}
|
|
213
|
-
.rs-select__clear[data-v-
|
|
213
|
+
.rs-select__clear[data-v-afda3ccc] {
|
|
214
214
|
display: inline-flex;
|
|
215
215
|
align-items: center;
|
|
216
216
|
justify-content: center;
|
|
@@ -226,23 +226,23 @@
|
|
|
226
226
|
color var(--rs-transition-fast),
|
|
227
227
|
background var(--rs-transition-fast);
|
|
228
228
|
}
|
|
229
|
-
.rs-select__clear[data-v-
|
|
229
|
+
.rs-select__clear[data-v-afda3ccc]:hover {
|
|
230
230
|
color: var(--rs-text);
|
|
231
231
|
background: var(--rs-item-hover);
|
|
232
232
|
}
|
|
233
|
-
.rs-select__suffix[data-v-
|
|
233
|
+
.rs-select__suffix[data-v-afda3ccc] {
|
|
234
234
|
display: inline-flex;
|
|
235
235
|
align-items: center;
|
|
236
236
|
}
|
|
237
|
-
.rs-select__icon[data-v-
|
|
237
|
+
.rs-select__icon[data-v-afda3ccc] {
|
|
238
238
|
color: var(--rs-muted);
|
|
239
239
|
flex-shrink: 0;
|
|
240
240
|
transition: transform var(--rs-transition-fast);
|
|
241
241
|
}
|
|
242
|
-
.rs-select__trigger[data-state='open'] .rs-select__icon[data-v-
|
|
242
|
+
.rs-select__trigger[data-state='open'] .rs-select__icon[data-v-afda3ccc] {
|
|
243
243
|
transform: rotate(180deg);
|
|
244
244
|
}
|
|
245
|
-
.rs-select__item--create .rs-select__item-label[data-v-
|
|
245
|
+
.rs-select__item--create .rs-select__item-label[data-v-afda3ccc] {
|
|
246
246
|
color: var(--rs-primary);
|
|
247
247
|
font-weight: var(--rs-font-weight-medium);
|
|
248
248
|
}
|
|
@@ -425,6 +425,7 @@ var RsSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
|
|
|
425
425
|
}, 512), createVNode(unref(ComboboxPortal), { to: portalTo.value }, {
|
|
426
426
|
default: withCtx(() => [createVNode(unref(ComboboxContent), {
|
|
427
427
|
class: normalizeClass(["rs-select__content", [
|
|
428
|
+
`rs-select__content--${unref(resolvedSize)}`,
|
|
428
429
|
__props.popupClassName,
|
|
429
430
|
__props.classNames?.popup,
|
|
430
431
|
{ "rs-select__content--match-trigger": __props.matchTriggerWidth }
|
|
@@ -3,6 +3,6 @@ import _plugin_vue_export_helper_default from "../_virtual/_plugin-vue_export-he
|
|
|
3
3
|
import RsSelect_vue_vue_type_script_setup_true_lang_default from "./RsSelect.impl.js";
|
|
4
4
|
|
|
5
5
|
//#region src/components/RsSelect.vue
|
|
6
|
-
var RsSelect_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsSelect_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
6
|
+
var RsSelect_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsSelect_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-afda3ccc"]]);
|
|
7
7
|
//#endregion
|
|
8
8
|
export { RsSelect_default as default };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
.rs-terminal[data-v-
|
|
2
|
+
.rs-terminal[data-v-27605f60] {
|
|
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-27605f60] {
|
|
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-27605f60] {
|
|
26
26
|
position: relative;
|
|
27
27
|
width: 100%;
|
|
28
28
|
height: 100%;
|
|
@@ -30,15 +30,15 @@
|
|
|
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-27605f60],
|
|
34
|
+
.rs-terminal__overlay[data-v-27605f60] {
|
|
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-27605f60] {
|
|
42
42
|
flex-direction: column;
|
|
43
43
|
gap: var(--rs-space-sm);
|
|
44
44
|
padding: var(--rs-space-lg);
|
|
@@ -51,13 +51,13 @@
|
|
|
51
51
|
font-weight: var(--rs-font-weight-regular);
|
|
52
52
|
line-height: var(--rs-line-height-normal);
|
|
53
53
|
}
|
|
54
|
-
.rs-terminal__overlay--interactive[data-v-
|
|
54
|
+
.rs-terminal__overlay--interactive[data-v-27605f60] {
|
|
55
55
|
pointer-events: auto;
|
|
56
56
|
}
|
|
57
|
-
.rs-terminal__overlay-action[data-v-
|
|
57
|
+
.rs-terminal__overlay-action[data-v-27605f60] {
|
|
58
58
|
pointer-events: auto;
|
|
59
59
|
}
|
|
60
|
-
.rs-terminal__search[data-v-
|
|
60
|
+
.rs-terminal__search[data-v-27605f60] {
|
|
61
61
|
position: absolute;
|
|
62
62
|
top: var(--rs-space-xs);
|
|
63
63
|
right: var(--rs-space-xs);
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
border-radius: var(--rs-radius-sm);
|
|
71
71
|
background: color-mix(in srgb, var(--rs-terminal-bg) 92%, transparent);
|
|
72
72
|
}
|
|
73
|
-
.rs-terminal__search-input[data-v-
|
|
73
|
+
.rs-terminal__search-input[data-v-27605f60] {
|
|
74
74
|
width: 12rem;
|
|
75
75
|
padding: 0.2rem 0.4rem;
|
|
76
76
|
border: 1px solid var(--rs-terminal-border);
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
font-size: var(--rs-font-size-xs);
|
|
82
82
|
outline: none;
|
|
83
83
|
}
|
|
84
|
-
.rs-terminal__search-btn[data-v-
|
|
84
|
+
.rs-terminal__search-btn[data-v-27605f60] {
|
|
85
85
|
padding: 0.2rem 0.4rem;
|
|
86
86
|
border: 1px solid var(--rs-terminal-border);
|
|
87
87
|
border-radius: var(--rs-radius-sm);
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
* DOM 渲染器于是按 `cellWidth - 测量值` 给每个字符补正字距,行盒却仍是 cols × cellWidth,
|
|
99
99
|
* 逐列累积后整行溢出十几到几十像素,被行盒的 overflow:hidden 切掉行尾几个字符。
|
|
100
100
|
*/
|
|
101
|
-
.rs-terminal[data-v-
|
|
101
|
+
.rs-terminal[data-v-27605f60] .xterm {
|
|
102
102
|
width: 100%;
|
|
103
103
|
height: 100%;
|
|
104
104
|
line-height: normal;
|
|
@@ -109,7 +109,7 @@
|
|
|
109
109
|
* xterm 6 官方仍给空的 .xterm-viewport 写 overflow-y:scroll + 背景 #000。
|
|
110
110
|
* 真正滚动的是 .xterm-scrollable-element;空层滚动条会挡住最后一列。
|
|
111
111
|
*/
|
|
112
|
-
.rs-terminal[data-v-
|
|
112
|
+
.rs-terminal[data-v-27605f60] .xterm .xterm-viewport {
|
|
113
113
|
overflow: hidden;
|
|
114
114
|
background-color: transparent;
|
|
115
115
|
}
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
* 的圆角胶囊不一致。轨道宽度由 overviewRuler.width 决定,改它会给每个终端实例多建一块
|
|
120
120
|
* overview ruler 画布,因此只重绘滑块:热区仍是 14px,靠透明边框内缩出 10px 可见胶囊。
|
|
121
121
|
*/
|
|
122
|
-
.rs-terminal[data-v-
|
|
122
|
+
.rs-terminal[data-v-27605f60] .xterm-scrollable-element > .scrollbar > .slider {
|
|
123
123
|
box-sizing: border-box;
|
|
124
124
|
border: var(--rs-scrollbar-padding, 2px) solid transparent;
|
|
125
125
|
border-radius: var(--rs-radius-full);
|
|
@@ -127,18 +127,18 @@
|
|
|
127
127
|
background-clip: padding-box;
|
|
128
128
|
transition: background-color var(--rs-transition-fast);
|
|
129
129
|
}
|
|
130
|
-
.rs-terminal[data-v-
|
|
130
|
+
.rs-terminal[data-v-27605f60] .xterm-scrollable-element > .scrollbar > .slider:hover {
|
|
131
131
|
background-color: color-mix(in srgb, var(--rs-primary) 40%, var(--rs-muted));
|
|
132
132
|
}
|
|
133
|
-
.rs-terminal[data-v-
|
|
133
|
+
.rs-terminal[data-v-27605f60] .xterm-scrollable-element > .scrollbar > .slider.active {
|
|
134
134
|
background-color: color-mix(in srgb, var(--rs-primary) 55%, var(--rs-muted));
|
|
135
135
|
}
|
|
136
|
-
.rs-terminal--zebra[data-v-
|
|
137
|
-
.rs-terminal--zebra[data-v-
|
|
138
|
-
.rs-terminal--zebra[data-v-
|
|
136
|
+
.rs-terminal--zebra[data-v-27605f60] .xterm-rows,
|
|
137
|
+
.rs-terminal--zebra[data-v-27605f60] .xterm-rows > div,
|
|
138
|
+
.rs-terminal--zebra[data-v-27605f60] .xterm-row {
|
|
139
139
|
background-color: transparent !important;
|
|
140
140
|
}
|
|
141
|
-
.rs-terminal--zebra[data-v-
|
|
141
|
+
.rs-terminal--zebra[data-v-27605f60] .xterm-scrollable-element {
|
|
142
142
|
background-color: transparent !important;
|
|
143
143
|
background-image: repeating-linear-gradient(
|
|
144
144
|
to bottom,
|
|
@@ -149,12 +149,12 @@
|
|
|
149
149
|
);
|
|
150
150
|
background-attachment: local;
|
|
151
151
|
}
|
|
152
|
-
.rs-terminal--zebra[data-v-
|
|
152
|
+
.rs-terminal--zebra[data-v-27605f60] .xterm-screen {
|
|
153
153
|
background-color: transparent !important;
|
|
154
154
|
}
|
|
155
|
-
.rs-terminal[data-v-
|
|
155
|
+
.rs-terminal[data-v-27605f60] .xterm-fg-257 {
|
|
156
156
|
color: var(--rs-terminal-bg) !important;
|
|
157
157
|
}
|
|
158
|
-
.rs-terminal[data-v-
|
|
158
|
+
.rs-terminal[data-v-27605f60] .xterm-bg-257 {
|
|
159
159
|
background-color: var(--rs-terminal-fg) !important;
|
|
160
160
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ITheme } from '@xterm/xterm';
|
|
2
2
|
import '@xterm/xterm/css/xterm.css';
|
|
3
|
+
import type { RsContextMenuItem } from './context-menu-utils';
|
|
3
4
|
import { type RsTerminalAction, type RsTerminalExpose, type RsTerminalThemeMode } from './terminal-utils';
|
|
4
5
|
import { type RsTerminalWheelScrollModifier } from './terminal-wheel';
|
|
5
6
|
type RsTerminalFontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900';
|
|
@@ -24,6 +25,11 @@ type __VLS_Props = {
|
|
|
24
25
|
contextMenu?: boolean;
|
|
25
26
|
/** 右键菜单是否展示「询问 AI」(仅 emit,业务侧自行处理) */
|
|
26
27
|
showAskAi?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* 追加到内置右键菜单(复制/粘贴等)与「清空」之间。
|
|
30
|
+
* `key` 勿与 copy / paste / selectAll / search / askAi / clear 冲突。
|
|
31
|
+
*/
|
|
32
|
+
extraContextMenuItems?: RsContextMenuItem[];
|
|
27
33
|
/**
|
|
28
34
|
* 右键是否自动选中光标下单词。
|
|
29
35
|
* SSH/vim/less 等 TUI 场景建议 false,避免冲掉用户已拖选的大段文本。
|
|
@@ -67,6 +73,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, RsTerminalE
|
|
|
67
73
|
ready: () => any;
|
|
68
74
|
askAi: (text: string) => any;
|
|
69
75
|
action: (action: RsTerminalAction) => any;
|
|
76
|
+
extraSelect: (key: string) => any;
|
|
70
77
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
71
78
|
onData?: ((data: string) => any) | undefined;
|
|
72
79
|
onResize?: ((payload: {
|
|
@@ -77,6 +84,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, RsTerminalE
|
|
|
77
84
|
onReady?: (() => any) | undefined;
|
|
78
85
|
onAskAi?: ((text: string) => any) | undefined;
|
|
79
86
|
onAction?: ((action: RsTerminalAction) => any) | undefined;
|
|
87
|
+
onExtraSelect?: ((key: string) => any) | undefined;
|
|
80
88
|
}>, {
|
|
81
89
|
theme: Partial<ITheme>;
|
|
82
90
|
loading: boolean;
|
|
@@ -88,6 +96,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, RsTerminalE
|
|
|
88
96
|
allowTransparency: boolean;
|
|
89
97
|
themeMode: RsTerminalThemeMode;
|
|
90
98
|
showAskAi: boolean;
|
|
99
|
+
extraContextMenuItems: RsContextMenuItem[];
|
|
91
100
|
rightClickSelectsWord: boolean;
|
|
92
101
|
scrollback: number;
|
|
93
102
|
convertEol: boolean;
|