niuma-ui 2.1.6 → 2.1.8

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.
@@ -1,23 +1,29 @@
1
1
 
2
- .rs-dialog[data-v-b62d3cc1] {
3
- display: contents;
2
+ .rs-dialog[data-v-bb93e647] {
3
+ /* 必须生成盒子并占住根层叠上下文。display:contents 会让 fixed 子节点留在
4
+ 祖先 isolation(编辑区 / 分割栏)里,后绘的侧栏会盖住对话框。 */
5
+ position: fixed;
6
+ inset: 0;
7
+ z-index: var(--rs-z-modal);
8
+ pointer-events: none;
4
9
  }
5
- .rs-dialog__anchor[data-v-b62d3cc1] {
10
+ .rs-dialog__anchor[data-v-bb93e647] {
6
11
  display: none;
7
12
  }
8
- .rs-dialog__backdrop[data-v-b62d3cc1] {
13
+ .rs-dialog__backdrop[data-v-bb93e647] {
9
14
  position: fixed;
10
15
  inset: 0;
11
16
  z-index: var(--rs-z-modal);
17
+ pointer-events: auto;
12
18
  background: transparent;
13
19
  }
14
- .rs-dialog__overlay[data-v-b62d3cc1] {
20
+ .rs-dialog__overlay[data-v-bb93e647] {
15
21
  background: var(--rs-dialog-overlay-bg);
16
22
  backdrop-filter: blur(var(--rs-dialog-overlay-blur)) saturate(120%);
17
23
  -webkit-backdrop-filter: blur(var(--rs-dialog-overlay-blur)) saturate(120%);
18
- animation: rs-dialog-overlay-in-b62d3cc1 220ms ease;
24
+ animation: rs-dialog-overlay-in-bb93e647 220ms ease;
19
25
  }
20
- .rs-dialog__content[data-v-b62d3cc1] {
26
+ .rs-dialog__content[data-v-bb93e647] {
21
27
  position: fixed;
22
28
  left: 50%;
23
29
  top: calc(
@@ -25,6 +31,7 @@
25
31
  (100vh - var(--rs-dialog-inset-top, 1rem) - var(--rs-dialog-inset-bottom, 1rem)) / 2
26
32
  );
27
33
  z-index: calc(var(--rs-z-modal) + 1);
34
+ pointer-events: auto;
28
35
  display: flex;
29
36
  max-height: min(
30
37
  calc(100vh - var(--rs-dialog-inset-top, 1rem) - var(--rs-dialog-inset-bottom, 1rem) - 2rem),
@@ -45,40 +52,40 @@
45
52
  outline: none;
46
53
  color: var(--rs-dialog-title-fg);
47
54
  }
48
- .rs-dialog__content[data-v-b62d3cc1]:focus-visible {
55
+ .rs-dialog__content[data-v-bb93e647]:focus-visible {
49
56
  box-shadow:
50
57
  var(--rs-dialog-shadow),
51
58
  0 0 0 var(--rs-focus-ring-width) var(--rs-focus-ring);
52
59
  }
53
- [data-rs-theme='light'] .rs-dialog__content--form[data-v-b62d3cc1],
54
- [data-rs-theme='light'] .rs-dialog__content--confirm[data-v-b62d3cc1] {
60
+ [data-rs-theme='light'] .rs-dialog__content--form[data-v-bb93e647],
61
+ [data-rs-theme='light'] .rs-dialog__content--confirm[data-v-bb93e647] {
55
62
  background: color-mix(in srgb, var(--rs-dialog-bg) 94%, transparent);
56
63
  backdrop-filter: blur(24px) saturate(180%);
57
64
  -webkit-backdrop-filter: blur(24px) saturate(180%);
58
65
  }
59
- [data-rs-theme='light'] .rs-dialog__content--window[data-v-b62d3cc1] {
66
+ [data-rs-theme='light'] .rs-dialog__content--window[data-v-bb93e647] {
60
67
  background: var(--rs-dialog-bg);
61
68
  }
62
- .rs-dialog__content--form[data-state='open'][data-v-b62d3cc1],
63
- .rs-dialog__content--confirm[data-state='open'][data-v-b62d3cc1] {
64
- animation: rs-dialog-pop-in-b62d3cc1 240ms cubic-bezier(0.32, 0.72, 0, 1);
69
+ .rs-dialog__content--form[data-state='open'][data-v-bb93e647],
70
+ .rs-dialog__content--confirm[data-state='open'][data-v-bb93e647] {
71
+ animation: rs-dialog-pop-in-bb93e647 240ms cubic-bezier(0.32, 0.72, 0, 1);
65
72
  }
66
- .rs-dialog__content--window[data-state='open'][data-v-b62d3cc1] {
67
- animation: rs-dialog-fade-in-b62d3cc1 220ms ease;
73
+ .rs-dialog__content--window[data-state='open'][data-v-bb93e647] {
74
+ animation: rs-dialog-fade-in-bb93e647 220ms ease;
68
75
  }
69
- .rs-dialog__content--tone-info[data-v-b62d3cc1] {
76
+ .rs-dialog__content--tone-info[data-v-bb93e647] {
70
77
  border-color: color-mix(in srgb, var(--rs-info) 46%, var(--rs-dialog-border));
71
78
  }
72
- .rs-dialog__content--tone-success[data-v-b62d3cc1] {
79
+ .rs-dialog__content--tone-success[data-v-bb93e647] {
73
80
  border-color: color-mix(in srgb, var(--rs-success) 46%, var(--rs-dialog-border));
74
81
  }
75
- .rs-dialog__content--tone-warning[data-v-b62d3cc1] {
82
+ .rs-dialog__content--tone-warning[data-v-bb93e647] {
76
83
  border-color: color-mix(in srgb, var(--rs-warning) 52%, var(--rs-dialog-border));
77
84
  }
78
- .rs-dialog__content--tone-danger[data-v-b62d3cc1] {
85
+ .rs-dialog__content--tone-danger[data-v-bb93e647] {
79
86
  border-color: color-mix(in srgb, var(--rs-danger) 52%, var(--rs-dialog-border));
80
87
  }
81
- @keyframes rs-dialog-overlay-in-b62d3cc1 {
88
+ @keyframes rs-dialog-overlay-in-bb93e647 {
82
89
  from {
83
90
  opacity: 0;
84
91
  }
@@ -86,7 +93,7 @@ to {
86
93
  opacity: 1;
87
94
  }
88
95
  }
89
- @keyframes rs-dialog-pop-in-b62d3cc1 {
96
+ @keyframes rs-dialog-pop-in-bb93e647 {
90
97
  from {
91
98
  opacity: 0;
92
99
  transform: translate(-50%, -46%) scale(0.96);
@@ -96,7 +103,7 @@ to {
96
103
  transform: translate(-50%, -50%) scale(1);
97
104
  }
98
105
  }
99
- @keyframes rs-dialog-fade-in-b62d3cc1 {
106
+ @keyframes rs-dialog-fade-in-bb93e647 {
100
107
  from {
101
108
  opacity: 0;
102
109
  }
@@ -104,14 +111,14 @@ to {
104
111
  opacity: 1;
105
112
  }
106
113
  }
107
- .rs-dialog__content--window[data-v-b62d3cc1] {
114
+ .rs-dialog__content--window[data-v-bb93e647] {
108
115
  left: 50%;
109
116
  top: 50%;
110
117
  max-width: none;
111
118
  max-height: none;
112
119
  transform: none;
113
120
  }
114
- .rs-dialog__content--window.rs-dialog__content--bounds-transition[data-v-b62d3cc1] {
121
+ .rs-dialog__content--window.rs-dialog__content--bounds-transition[data-v-bb93e647] {
115
122
  transition:
116
123
  left 220ms cubic-bezier(0.32, 0.72, 0, 1),
117
124
  top 220ms cubic-bezier(0.32, 0.72, 0, 1),
@@ -119,25 +126,25 @@ to {
119
126
  height 220ms cubic-bezier(0.32, 0.72, 0, 1),
120
127
  border-radius 220ms cubic-bezier(0.32, 0.72, 0, 1);
121
128
  }
122
- .rs-dialog__content--sm[data-v-b62d3cc1] {
129
+ .rs-dialog__content--sm[data-v-bb93e647] {
123
130
  max-width: 24rem;
124
131
  }
125
- .rs-dialog__content--md[data-v-b62d3cc1] {
132
+ .rs-dialog__content--md[data-v-bb93e647] {
126
133
  max-width: 32rem;
127
134
  }
128
- .rs-dialog__content--lg[data-v-b62d3cc1] {
135
+ .rs-dialog__content--lg[data-v-bb93e647] {
129
136
  max-width: 42rem;
130
137
  }
131
- .rs-dialog__content--window.rs-dialog__content--sm[data-v-b62d3cc1],
132
- .rs-dialog__content--window.rs-dialog__content--md[data-v-b62d3cc1],
133
- .rs-dialog__content--window.rs-dialog__content--lg[data-v-b62d3cc1],
134
- .rs-dialog__content--window.rs-dialog__content--custom-width[data-v-b62d3cc1] {
138
+ .rs-dialog__content--window.rs-dialog__content--sm[data-v-bb93e647],
139
+ .rs-dialog__content--window.rs-dialog__content--md[data-v-bb93e647],
140
+ .rs-dialog__content--window.rs-dialog__content--lg[data-v-bb93e647],
141
+ .rs-dialog__content--window.rs-dialog__content--custom-width[data-v-bb93e647] {
135
142
  max-width: none;
136
143
  }
137
- .rs-dialog__content--fullscreen[data-v-b62d3cc1] {
144
+ .rs-dialog__content--fullscreen[data-v-bb93e647] {
138
145
  border-radius: var(--rs-radius);
139
146
  }
140
- .rs-dialog__header[data-v-b62d3cc1] {
147
+ .rs-dialog__header[data-v-bb93e647] {
141
148
  display: flex;
142
149
  align-items: center;
143
150
  justify-content: space-between;
@@ -151,7 +158,7 @@ to {
151
158
  background: var(--rs-dialog-header-bg);
152
159
  border-block-end: 1px solid var(--rs-dialog-separator);
153
160
  }
154
- .rs-dialog__heading[data-v-b62d3cc1] {
161
+ .rs-dialog__heading[data-v-bb93e647] {
155
162
  min-width: 0;
156
163
  flex: 1;
157
164
  display: flex;
@@ -159,11 +166,11 @@ to {
159
166
  justify-content: center;
160
167
  gap: var(--rs-space-xs);
161
168
  }
162
- .rs-dialog__content--window.rs-dialog__content--draggable .rs-dialog__header[data-v-b62d3cc1] {
169
+ .rs-dialog__content--window.rs-dialog__content--draggable .rs-dialog__header[data-v-bb93e647] {
163
170
  cursor: move;
164
171
  user-select: none;
165
172
  }
166
- .rs-dialog__title[data-v-b62d3cc1] {
173
+ .rs-dialog__title[data-v-bb93e647] {
167
174
  margin: 0;
168
175
  display: inline-flex;
169
176
  align-items: center;
@@ -175,14 +182,14 @@ to {
175
182
  color: var(--rs-dialog-title-fg);
176
183
  text-align: start;
177
184
  }
178
- .rs-dialog__description[data-v-b62d3cc1] {
185
+ .rs-dialog__description[data-v-bb93e647] {
179
186
  margin: 0;
180
187
  font-size: var(--rs-font-size-sm);
181
188
  color: var(--rs-dialog-description-fg);
182
189
  line-height: var(--rs-line-height-normal);
183
190
  text-align: start;
184
191
  }
185
- .rs-dialog__body[data-v-b62d3cc1] {
192
+ .rs-dialog__body[data-v-bb93e647] {
186
193
  flex: 1;
187
194
  min-height: 0;
188
195
  overflow: auto;
@@ -192,15 +199,15 @@ to {
192
199
  padding-inline: var(--rs-dialog-body-padding-x);
193
200
  background: var(--rs-dialog-body-bg);
194
201
  }
195
- .rs-dialog__content--window .rs-dialog__body[data-v-b62d3cc1] {
202
+ .rs-dialog__content--window .rs-dialog__body[data-v-bb93e647] {
196
203
  display: flex;
197
204
  flex-direction: column;
198
205
  }
199
- .rs-dialog__body-placeholder[data-v-b62d3cc1] {
206
+ .rs-dialog__body-placeholder[data-v-bb93e647] {
200
207
  flex: 1;
201
208
  min-height: 0;
202
209
  }
203
- .rs-dialog__footer[data-v-b62d3cc1] {
210
+ .rs-dialog__footer[data-v-bb93e647] {
204
211
  display: flex;
205
212
  align-items: center;
206
213
  justify-content: flex-end;
@@ -215,77 +222,77 @@ to {
215
222
  background: var(--rs-dialog-footer-bg);
216
223
  border-block-start: 1px solid var(--rs-dialog-footer-border);
217
224
  }
218
- .rs-dialog__actions[data-v-b62d3cc1] {
225
+ .rs-dialog__actions[data-v-bb93e647] {
219
226
  display: inline-flex;
220
227
  align-items: center;
221
228
  gap: var(--rs-space-xs);
222
229
  flex-shrink: 0;
223
230
  }
224
- .rs-dialog__resize-handle[data-v-b62d3cc1] {
231
+ .rs-dialog__resize-handle[data-v-bb93e647] {
225
232
  position: absolute;
226
233
  z-index: 2;
227
234
  }
228
- .rs-dialog__resize-handle--n[data-v-b62d3cc1],
229
- .rs-dialog__resize-handle--s[data-v-b62d3cc1] {
235
+ .rs-dialog__resize-handle--n[data-v-bb93e647],
236
+ .rs-dialog__resize-handle--s[data-v-bb93e647] {
230
237
  inset-inline: 0.5rem;
231
238
  height: 0.5rem;
232
239
  cursor: ns-resize;
233
240
  }
234
- .rs-dialog__resize-handle--n[data-v-b62d3cc1] {
241
+ .rs-dialog__resize-handle--n[data-v-bb93e647] {
235
242
  top: -0.25rem;
236
243
  }
237
- .rs-dialog__resize-handle--s[data-v-b62d3cc1] {
244
+ .rs-dialog__resize-handle--s[data-v-bb93e647] {
238
245
  bottom: -0.25rem;
239
246
  }
240
- .rs-dialog__resize-handle--e[data-v-b62d3cc1],
241
- .rs-dialog__resize-handle--w[data-v-b62d3cc1] {
247
+ .rs-dialog__resize-handle--e[data-v-bb93e647],
248
+ .rs-dialog__resize-handle--w[data-v-bb93e647] {
242
249
  top: 0.5rem;
243
250
  bottom: 0.5rem;
244
251
  width: 0.5rem;
245
252
  cursor: ew-resize;
246
253
  }
247
- .rs-dialog__resize-handle--e[data-v-b62d3cc1] {
254
+ .rs-dialog__resize-handle--e[data-v-bb93e647] {
248
255
  right: -0.25rem;
249
256
  }
250
- .rs-dialog__resize-handle--w[data-v-b62d3cc1] {
257
+ .rs-dialog__resize-handle--w[data-v-bb93e647] {
251
258
  left: -0.25rem;
252
259
  }
253
- .rs-dialog__resize-handle--ne[data-v-b62d3cc1],
254
- .rs-dialog__resize-handle--nw[data-v-b62d3cc1],
255
- .rs-dialog__resize-handle--se[data-v-b62d3cc1],
256
- .rs-dialog__resize-handle--sw[data-v-b62d3cc1] {
260
+ .rs-dialog__resize-handle--ne[data-v-bb93e647],
261
+ .rs-dialog__resize-handle--nw[data-v-bb93e647],
262
+ .rs-dialog__resize-handle--se[data-v-bb93e647],
263
+ .rs-dialog__resize-handle--sw[data-v-bb93e647] {
257
264
  width: 0.75rem;
258
265
  height: 0.75rem;
259
266
  }
260
- .rs-dialog__resize-handle--ne[data-v-b62d3cc1] {
267
+ .rs-dialog__resize-handle--ne[data-v-bb93e647] {
261
268
  top: -0.25rem;
262
269
  right: -0.25rem;
263
270
  cursor: nesw-resize;
264
271
  }
265
- .rs-dialog__resize-handle--nw[data-v-b62d3cc1] {
272
+ .rs-dialog__resize-handle--nw[data-v-bb93e647] {
266
273
  top: -0.25rem;
267
274
  left: -0.25rem;
268
275
  cursor: nwse-resize;
269
276
  }
270
- .rs-dialog__resize-handle--se[data-v-b62d3cc1] {
277
+ .rs-dialog__resize-handle--se[data-v-bb93e647] {
271
278
  right: -0.25rem;
272
279
  bottom: -0.25rem;
273
280
  cursor: nwse-resize;
274
281
  }
275
- .rs-dialog__resize-handle--sw[data-v-b62d3cc1] {
282
+ .rs-dialog__resize-handle--sw[data-v-bb93e647] {
276
283
  left: -0.25rem;
277
284
  bottom: -0.25rem;
278
285
  cursor: nesw-resize;
279
286
  }
280
287
  @media (prefers-reduced-motion: reduce) {
281
- [data-rs-theme='light'] .rs-dialog__content--form[data-v-b62d3cc1],
282
- [data-rs-theme='light'] .rs-dialog__content--confirm[data-v-b62d3cc1],
283
- .rs-dialog__overlay[data-v-b62d3cc1] {
288
+ [data-rs-theme='light'] .rs-dialog__content--form[data-v-bb93e647],
289
+ [data-rs-theme='light'] .rs-dialog__content--confirm[data-v-bb93e647],
290
+ .rs-dialog__overlay[data-v-bb93e647] {
284
291
  backdrop-filter: none;
285
292
  -webkit-backdrop-filter: none;
286
293
  background: var(--rs-dialog-bg);
287
294
  }
288
- .rs-dialog__overlay[data-v-b62d3cc1] {
295
+ .rs-dialog__overlay[data-v-bb93e647] {
289
296
  background: var(--rs-dialog-overlay-bg);
290
297
  }
291
298
  }
@@ -240,6 +240,7 @@ var RsDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
240
240
  if (open.value && !disposed) emit("afterOpen");
241
241
  }, 230);
242
242
  }
243
+ const shellStyle = computed(() => zIndexStyle(0));
243
244
  function zIndexStyle(offset) {
244
245
  if (props.zIndex == null || !Number.isFinite(props.zIndex)) return void 0;
245
246
  return { zIndex: String(Math.round(props.zIndex) + offset) };
@@ -594,6 +595,7 @@ var RsDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
594
595
  ref_key: "shellRef",
595
596
  ref: shellRef,
596
597
  class: "rs-dialog",
598
+ style: normalizeStyle(shellStyle.value),
597
599
  "data-rs-theme": panelTheme.value,
598
600
  dir: panelDir.value,
599
601
  lang: panelLang.value
@@ -684,7 +686,7 @@ var RsDialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineC
684
686
  default: withCtx(() => [createTextVNode(toDisplayString(__props.confirmText ?? unref(t)("common.confirm")), 1)]),
685
687
  _: 1
686
688
  }, 8, ["variant", "loading"])) : createCommentVNode("", true)], 64)) : createCommentVNode("", true)], true)])) : createCommentVNode("", true)
687
- ], 16, _hoisted_2)], 8, _hoisted_1)], 8, ["to", "disabled"])) : createCommentVNode("", true)], 64);
689
+ ], 16, _hoisted_2)], 12, _hoisted_1)], 8, ["to", "disabled"])) : createCommentVNode("", true)], 64);
688
690
  };
689
691
  }
690
692
  });
@@ -3,6 +3,6 @@ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_exp
3
3
  import RsDialog_vue_vue_type_script_setup_true_lang_default from "./RsDialog.impl.js";
4
4
 
5
5
  //#region src/components/dialog/src/RsDialog.vue
6
- var RsDialog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsDialog_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-b62d3cc1"]]);
6
+ var RsDialog_default = /*#__PURE__*/ _plugin_vue_export_helper_default(RsDialog_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-bb93e647"]]);
7
7
  //#endregion
8
8
  export { RsDialog_default as default };
@@ -41,6 +41,15 @@ export interface RsConfirmDialogExpose {
41
41
  focus: () => void;
42
42
  }
43
43
  export type RsConfirmDialogInstance = RsConfirmDialogExpose;
44
+ /** viewport 盖住窗口;container 只盖住 teleportTo 指向的页面。 */
45
+ export type RsConfirmContain = 'viewport' | 'container';
46
+ /** 挂载点是窗口根,不能当作页内容器。 */
47
+ export declare function isRsConfirmWindowTarget(target: string | HTMLElement | false | null | undefined): boolean;
48
+ /**
49
+ * contain="container" 且挂载点不是页面节点时退回 viewport。
50
+ * 不在这里警告,避免计算属性产生副作用。
51
+ */
52
+ export declare function resolveRsConfirmContain(contain: RsConfirmContain | undefined, teleportTo: string | HTMLElement | false | null | undefined): RsConfirmContain;
44
53
  export interface RsConfirmOptions {
45
54
  title?: string;
46
55
  /** 次要说明(标题与正文之间,对应业务侧常见 subtitle) */
@@ -85,6 +94,11 @@ export interface RsConfirmOptions {
85
94
  overlayBlur?: number | string;
86
95
  /** false 表示禁用 Teleport,就地渲染 */
87
96
  teleportTo?: string | HTMLElement | false;
97
+ /**
98
+ * 呈现范围。teleportTo 只决定挂载点。
99
+ * viewport 盖住窗口;container 只盖住 teleportTo 指向的页面节点。
100
+ */
101
+ contain?: RsConfirmContain;
88
102
  /** 命令式挂载时覆盖主题;默认读 document data-rs-theme */
89
103
  theme?: RsThemeMode;
90
104
  /** 命令式挂载时覆盖语言;默认读 document data-rs-locale */
@@ -121,14 +135,25 @@ export declare function isTopDialogLayer(id: string): boolean;
121
135
  * 引用计数:嵌套对话框只在最后一层关闭时恢复。重复释放无操作。
122
136
  */
123
137
  export declare function acquireDialogScrollLock(): () => void;
138
+ /**
139
+ * contain="container" 时只锁挂载容器,不锁 body。
140
+ * 同一容器上的嵌套确认框引用计数,最后一层关闭才还原 overflow。
141
+ */
142
+ export declare function acquireContainerScrollLock(el: HTMLElement): () => void;
143
+ /**
144
+ * 容器是 static 时,绝对定位会爬到外层。打开期间临时改为 relative,关闭后还原。
145
+ * 已经是定位容器时不改 inline style。同一容器引用计数。
146
+ */
147
+ export declare function pinDialogContainer(el: HTMLElement): () => void;
124
148
  /**
125
149
  * 把对话框外壳的兄弟(以及祖先的兄弟)标成 inert,背后内容不可点、不可 Tab。
126
150
  * 不 inert body 本身,否则 Teleport 进去的对话框也会被冻住。
127
151
  * 已经 inert 的节点不动,释放时也不会被我们解开。
152
+ * boundary 给出时,标完该节点内部的兄弟就停,页签栏等外层仍可切换。
128
153
  */
129
- export declare function inertDialogSiblings(layer: HTMLElement): () => void;
154
+ export declare function inertDialogSiblings(layer: HTMLElement, boundary?: HTMLElement | null): () => void;
130
155
  /** 只有最上层模态对话框持有 inert。别人释放不会清掉当前层。 */
131
- export declare function claimDialogInert(ownerId: string, layer: HTMLElement): void;
156
+ export declare function claimDialogInert(ownerId: string, layer: HTMLElement, boundary?: HTMLElement | null): void;
132
157
  export declare function releaseDialogInert(ownerId: string): void;
133
158
  /** 测试收尾:清层栈、滚动锁和 inert,避免上一例失败把 body 留在 hidden。 */
134
159
  export declare function resetDialogGuardsForTests(): void;
@@ -40,6 +40,25 @@ async function runRsDialogBeforeClose(beforeClose, reason) {
40
40
  if (!beforeClose) return true;
41
41
  return await beforeClose(reason) !== false;
42
42
  }
43
+ /** 挂载点是窗口根,不能当作页内容器。 */
44
+ function isRsConfirmWindowTarget(target) {
45
+ if (target == null || target === false) return true;
46
+ if (typeof target === "string") {
47
+ const sel = target.trim().toLowerCase();
48
+ return sel === "body" || sel === "html";
49
+ }
50
+ if (typeof document === "undefined") return false;
51
+ return target === document.body || target === document.documentElement;
52
+ }
53
+ /**
54
+ * contain="container" 且挂载点不是页面节点时退回 viewport。
55
+ * 不在这里警告,避免计算属性产生副作用。
56
+ */
57
+ function resolveRsConfirmContain(contain, teleportTo) {
58
+ if (contain !== "container") return "viewport";
59
+ if (isRsConfirmWindowTarget(teleportTo)) return "viewport";
60
+ return "container";
61
+ }
43
62
  /** 运行确认框 beforeClose;未提供或非 false 视为允许关闭 */
44
63
  async function runRsConfirmBeforeClose(beforeClose, reason) {
45
64
  if (!beforeClose) return true;
@@ -117,6 +136,8 @@ function isTopDialogLayer(id) {
117
136
  }
118
137
  var scrollLockCount = 0;
119
138
  var scrollLockSnapshot = null;
139
+ var containerScrollLocks = /* @__PURE__ */ new Map();
140
+ var containerPositionPins = /* @__PURE__ */ new Map();
120
141
  /**
121
142
  * 模态层锁 body 滚动,并补上滚动条宽度,避免页面横跳。
122
143
  * 引用计数:嵌套对话框只在最后一层关闭时恢复。重复释放无操作。
@@ -148,6 +169,61 @@ function acquireDialogScrollLock() {
148
169
  scrollLockSnapshot = null;
149
170
  };
150
171
  }
172
+ /**
173
+ * contain="container" 时只锁挂载容器,不锁 body。
174
+ * 同一容器上的嵌套确认框引用计数,最后一层关闭才还原 overflow。
175
+ */
176
+ function acquireContainerScrollLock(el) {
177
+ let entry = containerScrollLocks.get(el);
178
+ if (!entry) {
179
+ entry = {
180
+ count: 0,
181
+ overflow: el.style.overflow
182
+ };
183
+ containerScrollLocks.set(el, entry);
184
+ el.style.overflow = "hidden";
185
+ }
186
+ entry.count += 1;
187
+ let released = false;
188
+ return () => {
189
+ if (released) return;
190
+ released = true;
191
+ const current = containerScrollLocks.get(el);
192
+ if (!current) return;
193
+ current.count -= 1;
194
+ if (current.count > 0) return;
195
+ el.style.overflow = current.overflow;
196
+ containerScrollLocks.delete(el);
197
+ };
198
+ }
199
+ /**
200
+ * 容器是 static 时,绝对定位会爬到外层。打开期间临时改为 relative,关闭后还原。
201
+ * 已经是定位容器时不改 inline style。同一容器引用计数。
202
+ */
203
+ function pinDialogContainer(el) {
204
+ let entry = containerPositionPins.get(el);
205
+ if (!entry) {
206
+ const computed = typeof getComputedStyle === "function" ? getComputedStyle(el).position : "static";
207
+ entry = {
208
+ count: 0,
209
+ position: el.style.position
210
+ };
211
+ containerPositionPins.set(el, entry);
212
+ if (computed === "static") el.style.position = "relative";
213
+ }
214
+ entry.count += 1;
215
+ let released = false;
216
+ return () => {
217
+ if (released) return;
218
+ released = true;
219
+ const current = containerPositionPins.get(el);
220
+ if (!current) return;
221
+ current.count -= 1;
222
+ if (current.count > 0) return;
223
+ el.style.position = current.position;
224
+ containerPositionPins.delete(el);
225
+ };
226
+ }
151
227
  function markInert(el, value) {
152
228
  if (value) {
153
229
  el.setAttribute("inert", "");
@@ -173,8 +249,9 @@ function markInertSiblings(parent, current, touched) {
173
249
  * 把对话框外壳的兄弟(以及祖先的兄弟)标成 inert,背后内容不可点、不可 Tab。
174
250
  * 不 inert body 本身,否则 Teleport 进去的对话框也会被冻住。
175
251
  * 已经 inert 的节点不动,释放时也不会被我们解开。
252
+ * boundary 给出时,标完该节点内部的兄弟就停,页签栏等外层仍可切换。
176
253
  */
177
- function inertDialogSiblings(layer) {
254
+ function inertDialogSiblings(layer, boundary) {
178
255
  if (typeof document === "undefined" || !layer.parentElement) return () => {};
179
256
  const touched = [];
180
257
  let current = layer;
@@ -182,6 +259,7 @@ function inertDialogSiblings(layer) {
182
259
  const parent = current.parentElement;
183
260
  if (!parent) break;
184
261
  markInertSiblings(parent, current, touched);
262
+ if (boundary && parent === boundary) break;
185
263
  current = parent;
186
264
  }
187
265
  let released = false;
@@ -194,9 +272,9 @@ function inertDialogSiblings(layer) {
194
272
  var inertRelease = null;
195
273
  var inertOwner = null;
196
274
  /** 只有最上层模态对话框持有 inert。别人释放不会清掉当前层。 */
197
- function claimDialogInert(ownerId, layer) {
275
+ function claimDialogInert(ownerId, layer, boundary) {
198
276
  inertRelease?.();
199
- inertRelease = inertDialogSiblings(layer);
277
+ inertRelease = inertDialogSiblings(layer, boundary);
200
278
  inertOwner = ownerId;
201
279
  }
202
280
  function releaseDialogInert(ownerId) {
@@ -206,4 +284,4 @@ function releaseDialogInert(ownerId) {
206
284
  inertOwner = null;
207
285
  }
208
286
  //#endregion
209
- export { acquireDialogScrollLock, claimDialogInert, dialogLayerTick, dialogTargetOwnsTab, inertDialogSiblings, isRsDialogWidthPreset, isTopDialogLayer, listDialogTabbables, pushDialogLayer, releaseDialogInert, removeDialogLayer, resolveDialogOverlayStyle, resolveDialogTabTarget, resolveRsDialogCssWidth, resolveRsDialogWidthPx, runRsConfirmBeforeClose, runRsDialogBeforeClose };
287
+ export { acquireContainerScrollLock, acquireDialogScrollLock, claimDialogInert, dialogLayerTick, dialogTargetOwnsTab, inertDialogSiblings, isRsConfirmWindowTarget, isRsDialogWidthPreset, isTopDialogLayer, listDialogTabbables, pinDialogContainer, pushDialogLayer, releaseDialogInert, removeDialogLayer, resolveDialogOverlayStyle, resolveDialogTabTarget, resolveRsConfirmContain, resolveRsDialogCssWidth, resolveRsDialogWidthPx, runRsConfirmBeforeClose, runRsDialogBeforeClose };