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.
@@ -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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc],
50
- .rs-select--block .rs-select__trigger[data-v-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc]:hover:not([data-disabled]) {
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-956c54dc]:focus-visible {
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-956c54dc] {
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-956c54dc] {
111
+ .rs-select__trigger--invalid[data-v-afda3ccc] {
112
112
  border-color: var(--rs-danger);
113
113
  }
114
- .rs-select__trigger--invalid[data-v-956c54dc]:focus-visible {
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-956c54dc] {
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-956c54dc]:focus-visible {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
159
+ .rs-select__placeholder[data-v-afda3ccc] {
160
160
  color: var(--rs-placeholder);
161
161
  }
162
- .rs-select__single-label[data-v-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc]:hover {
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-956c54dc] {
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-956c54dc] {
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-956c54dc]:hover {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc] {
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-956c54dc"]]);
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-db06bdc1] {
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-db06bdc1] {
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-db06bdc1] {
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-db06bdc1],
34
- .rs-terminal__overlay[data-v-db06bdc1] {
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-db06bdc1] {
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-db06bdc1] {
54
+ .rs-terminal__overlay--interactive[data-v-27605f60] {
55
55
  pointer-events: auto;
56
56
  }
57
- .rs-terminal__overlay-action[data-v-db06bdc1] {
57
+ .rs-terminal__overlay-action[data-v-27605f60] {
58
58
  pointer-events: auto;
59
59
  }
60
- .rs-terminal__search[data-v-db06bdc1] {
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-db06bdc1] {
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-db06bdc1] {
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-db06bdc1] .xterm {
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-db06bdc1] .xterm .xterm-viewport {
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-db06bdc1] .xterm-scrollable-element > .scrollbar > .slider {
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-db06bdc1] .xterm-scrollable-element > .scrollbar > .slider:hover {
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-db06bdc1] .xterm-scrollable-element > .scrollbar > .slider.active {
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-db06bdc1] .xterm-rows,
137
- .rs-terminal--zebra[data-v-db06bdc1] .xterm-rows > div,
138
- .rs-terminal--zebra[data-v-db06bdc1] .xterm-row {
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-db06bdc1] .xterm-scrollable-element {
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-db06bdc1] .xterm-screen {
152
+ .rs-terminal--zebra[data-v-27605f60] .xterm-screen {
153
153
  background-color: transparent !important;
154
154
  }
155
- .rs-terminal[data-v-db06bdc1] .xterm-fg-257 {
155
+ .rs-terminal[data-v-27605f60] .xterm-fg-257 {
156
156
  color: var(--rs-terminal-bg) !important;
157
157
  }
158
- .rs-terminal[data-v-db06bdc1] .xterm-bg-257 {
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;