@leavepulse/ui 0.37.4 → 0.37.5
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/dist/chunks/{LpAddressInput-C8NZWkH_.js → LpAddressInput-DOVpUONY.js} +1 -1
- package/dist/chunks/{LpConfirmDialog-B6RAvDES.js → LpConfirmDialog-BH7az_E7.js} +1 -1
- package/dist/chunks/{LpModal-D3QxgWaT.js → LpModal-Dq_qXN8-.js} +31 -32
- package/dist/chunks/{LpModalNav--a3i7c89.js → LpModalNav-B42a7R-3.js} +1 -1
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpConfirmDialog.vue.js +1 -1
- package/dist/components/LpModal.vue.d.ts +7 -7
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpShortcutsDialog.vue.js +1 -1
- package/dist/index.js +4 -4
- package/package.json +1 -1
- package/src/components/LpModal.vue +31 -46
|
@@ -6,7 +6,7 @@ import { _ as _sfc_main$3 } from "./LpButton-5VXXCjwF.js";
|
|
|
6
6
|
import { _ as _sfc_main$1 } from "./LpFormField-CazBc2-a.js";
|
|
7
7
|
import { _ as _sfc_main$4 } from "./LpIcon-CCnX5_2j.js";
|
|
8
8
|
import { _ as _sfc_main$5 } from "./LpInput-9EXWUM9B.js";
|
|
9
|
-
import { _ as _sfc_main$7 } from "./LpModal-
|
|
9
|
+
import { _ as _sfc_main$7 } from "./LpModal-Dq_qXN8-.js";
|
|
10
10
|
import { _ as _sfc_main$6 } from "./LpSelect-ANIVtrpM.js";
|
|
11
11
|
import { useMergedAttrs } from "../composables/useMergedClass.js";
|
|
12
12
|
const _hoisted_1 = { class: "flex items-stretch gap-2" };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineComponent, computed, openBlock, createBlock, createSlots, withCtx, renderSlot, createVNode, createTextVNode, toDisplayString, createElementVNode, normalizeClass } from "vue";
|
|
2
2
|
import { _ as _sfc_main$2 } from "./LpButton-5VXXCjwF.js";
|
|
3
3
|
import { _ as _sfc_main$3 } from "./LpIcon-CCnX5_2j.js";
|
|
4
|
-
import { _ as _sfc_main$1 } from "./LpModal-
|
|
4
|
+
import { _ as _sfc_main$1 } from "./LpModal-Dq_qXN8-.js";
|
|
5
5
|
const _hoisted_1 = { class: "inline-flex items-center gap-2.5" };
|
|
6
6
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
7
7
|
__name: "LpConfirmDialog",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent, computed, useSlots, watch, onBeforeUnmount, ref, openBlock, createBlock, unref, withCtx, createVNode, normalizeStyle, createElementVNode, createElementBlock, renderSlot, createCommentVNode,
|
|
1
|
+
import { defineComponent, computed, useSlots, watch, onBeforeUnmount, ref, openBlock, createBlock, unref, withCtx, createVNode, normalizeStyle, createElementVNode, mergeProps, createElementBlock, renderSlot, createCommentVNode, normalizeClass, createTextVNode, toDisplayString } from "vue";
|
|
2
2
|
import { DialogRoot, DialogPortal, DialogOverlay, DialogContent, DialogTitle, DialogDescription, DialogClose } from "reka-ui";
|
|
3
3
|
import { useShift } from "../composables/useShift.js";
|
|
4
4
|
import { useModalLayer } from "../components/modalDepth.js";
|
|
@@ -8,7 +8,7 @@ import { _ as _sfc_main$2 } from "./LpScrollArea-D8xyKXcF.js";
|
|
|
8
8
|
const _hoisted_1 = {
|
|
9
9
|
key: 0,
|
|
10
10
|
"data-lp-modal-aside": "",
|
|
11
|
-
class: "
|
|
11
|
+
class: "flex min-h-0 flex-col"
|
|
12
12
|
};
|
|
13
13
|
const _hoisted_2 = {
|
|
14
14
|
key: 0,
|
|
@@ -22,7 +22,7 @@ const _hoisted_4 = {
|
|
|
22
22
|
const _hoisted_5 = {
|
|
23
23
|
key: 1,
|
|
24
24
|
"data-lp-modal-aside": "",
|
|
25
|
-
class: "
|
|
25
|
+
class: "flex min-h-0 flex-col"
|
|
26
26
|
};
|
|
27
27
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
28
28
|
__name: "LpModal",
|
|
@@ -83,8 +83,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
83
83
|
];
|
|
84
84
|
function onOpenAutoFocus(event) {
|
|
85
85
|
if (props.autoFocus === "none") return;
|
|
86
|
-
const panel = panelRef.value
|
|
87
|
-
if (!
|
|
86
|
+
const panel = panelRef.value;
|
|
87
|
+
if (!panel) return;
|
|
88
88
|
const selectors = props.autoFocus === "auto" ? AUTO_FOCUS_ORDER : [props.autoFocus];
|
|
89
89
|
for (const selector of selectors) {
|
|
90
90
|
const target = panel.querySelector(selector);
|
|
@@ -110,8 +110,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
110
110
|
watch(
|
|
111
111
|
() => props.open ? panelRef.value : null,
|
|
112
112
|
(panel) => {
|
|
113
|
-
|
|
114
|
-
sizedEl.value = el instanceof HTMLElement ? el : null;
|
|
113
|
+
sizedEl.value = panel;
|
|
115
114
|
},
|
|
116
115
|
{ flush: "post" }
|
|
117
116
|
);
|
|
@@ -131,24 +130,24 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
131
130
|
class: "fixed inset-0 flex items-center justify-center pointer-events-none",
|
|
132
131
|
style: normalizeStyle({ zIndex: unref(layer).panel })
|
|
133
132
|
}, [
|
|
134
|
-
|
|
135
|
-
class: "flex items-start",
|
|
136
|
-
style:
|
|
137
|
-
},
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
133
|
+
createVNode(unref(DialogContent), mergeProps({
|
|
134
|
+
class: "pointer-events-auto flex min-h-0 items-start outline-none data-[state=open]:animate-[rise-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[rise-out_120ms_cubic-bezier(0.4,0,1,1)]",
|
|
135
|
+
style: { maxHeight: "min(90vh, calc(100dvh - 2rem))" }
|
|
136
|
+
}, describedByAttrs.value, {
|
|
137
|
+
onOpenAutoFocus,
|
|
138
|
+
onInteractOutside,
|
|
139
|
+
onPointerDownOutside: onInteractOutside
|
|
140
|
+
}), {
|
|
141
|
+
default: withCtx(() => [
|
|
142
|
+
_ctx.$slots.aside ? (openBlock(), createElementBlock("aside", _hoisted_1, [
|
|
143
|
+
renderSlot(_ctx.$slots, "aside")
|
|
144
|
+
])) : createCommentVNode("", true),
|
|
145
|
+
createElementVNode("div", {
|
|
146
|
+
ref_key: "panelRef",
|
|
147
|
+
ref: panelRef,
|
|
148
|
+
class: normalizeClass(["flex max-h-[min(90vh,calc(100dvh-2rem))] min-h-0 flex-col overflow-hidden rounded-card border border-line bg-surface-raised shadow-panel", [widthClass.value, unref(tweening) ? "transition-[height] duration-fast ease-[var(--ease-emphasized)] motion-reduce:transition-none" : ""]]),
|
|
149
|
+
style: normalizeStyle({ ...__props.width ? { width: __props.width } : {}, ...hasAside.value ? { alignSelf: "stretch" } : {} })
|
|
150
|
+
}, [
|
|
152
151
|
__props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("header", _hoisted_2, [
|
|
153
152
|
createElementVNode("div", _hoisted_3, [
|
|
154
153
|
createVNode(unref(DialogTitle), { class: "text-base font-semibold text-ink" }, {
|
|
@@ -202,13 +201,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
202
201
|
_ctx.$slots.footer ? (openBlock(), createElementBlock("footer", _hoisted_4, [
|
|
203
202
|
renderSlot(_ctx.$slots, "footer")
|
|
204
203
|
])) : createCommentVNode("", true)
|
|
205
|
-
]),
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
204
|
+
], 6),
|
|
205
|
+
_ctx.$slots.asideEnd ? (openBlock(), createElementBlock("aside", _hoisted_5, [
|
|
206
|
+
renderSlot(_ctx.$slots, "asideEnd")
|
|
207
|
+
])) : createCommentVNode("", true)
|
|
208
|
+
]),
|
|
209
|
+
_: 3
|
|
210
|
+
}, 16)
|
|
212
211
|
], 4)
|
|
213
212
|
]),
|
|
214
213
|
_: 3
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineComponent, ref, computed, openBlock, createBlock, createSlots, withCtx, renderSlot, createElementVNode, normalizeClass, createVNode, createCommentVNode, createTextVNode, toDisplayString } from "vue";
|
|
2
2
|
import { _ as _sfc_main$2 } from "./LpButton-5VXXCjwF.js";
|
|
3
3
|
import { _ as _sfc_main$3 } from "./LpIcon-CCnX5_2j.js";
|
|
4
|
-
import { _ as _sfc_main$1 } from "./LpModal-
|
|
4
|
+
import { _ as _sfc_main$1 } from "./LpModal-Dq_qXN8-.js";
|
|
5
5
|
import { _ as _sfc_main$4 } from "./LpSidebar-DvxMte3k.js";
|
|
6
6
|
const _hoisted_1 = { class: "flex items-center gap-2" };
|
|
7
7
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
@@ -26,19 +26,19 @@ type __VLS_Props = {
|
|
|
26
26
|
*/
|
|
27
27
|
autoFocus?: "auto" | "none" | string;
|
|
28
28
|
};
|
|
29
|
-
declare var
|
|
29
|
+
declare var __VLS_31: {}, __VLS_39: {}, __VLS_58: {}, __VLS_66: {}, __VLS_68: {}, __VLS_70: {};
|
|
30
30
|
type __VLS_Slots = {} & {
|
|
31
|
-
aside?: (props: typeof
|
|
31
|
+
aside?: (props: typeof __VLS_31) => any;
|
|
32
32
|
} & {
|
|
33
|
-
title?: (props: typeof
|
|
33
|
+
title?: (props: typeof __VLS_39) => any;
|
|
34
34
|
} & {
|
|
35
|
-
default?: (props: typeof
|
|
35
|
+
default?: (props: typeof __VLS_58) => any;
|
|
36
36
|
} & {
|
|
37
|
-
default?: (props: typeof
|
|
37
|
+
default?: (props: typeof __VLS_66) => any;
|
|
38
38
|
} & {
|
|
39
|
-
footer?: (props: typeof
|
|
39
|
+
footer?: (props: typeof __VLS_68) => any;
|
|
40
40
|
} & {
|
|
41
|
-
asideEnd?: (props: typeof
|
|
41
|
+
asideEnd?: (props: typeof __VLS_70) => any;
|
|
42
42
|
};
|
|
43
43
|
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
44
44
|
"update:open": (value: boolean) => any;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent, openBlock, createBlock, withCtx, createElementVNode, createElementBlock, Fragment, renderList, toDisplayString, unref } from "vue";
|
|
2
|
-
import { _ as _sfc_main$1 } from "../chunks/LpModal-
|
|
2
|
+
import { _ as _sfc_main$1 } from "../chunks/LpModal-Dq_qXN8-.js";
|
|
3
3
|
import { appleModifierLabel } from "../composables/useHotkeys.js";
|
|
4
4
|
import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
|
|
5
5
|
import '../assets/LpShortcutsDialog-B7H-RZLQ.css';const _hoisted_1 = { class: "shortcut-groups" };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { _ } from "./chunks/LayoutCanvas-Dd20boUG.js";
|
|
2
|
-
import { _ as _2 } from "./chunks/LpAddressInput-
|
|
2
|
+
import { _ as _2 } from "./chunks/LpAddressInput-DOVpUONY.js";
|
|
3
3
|
import { _ as _3 } from "./chunks/LpMapPicker-ul4oYno6.js";
|
|
4
4
|
import { OSM_TILES, createNominatimProvider, emptyAddress, formatAddress, project, tileUrl, unproject } from "./components/address.js";
|
|
5
5
|
import { _ as _4 } from "./chunks/LpActionBar-BlvtGB2P.js";
|
|
@@ -19,7 +19,7 @@ import { _ as _15 } from "./chunks/LpCodeBlock-Bo0B4TFR.js";
|
|
|
19
19
|
import { _ as _16 } from "./chunks/LpColorPicker-CFC6iaNK.js";
|
|
20
20
|
import { DEFAULT_SWATCHES, clampHsv, formatColor, hsvToHsl, hsvToRgb, isLight, normalizeHue, opaqueCss, parseColor, parseHex, rgbToHex, rgbToHsv } from "./components/color.js";
|
|
21
21
|
import { default as default3 } from "./components/LpCommandPalette.vue.js";
|
|
22
|
-
import { _ as _17 } from "./chunks/LpConfirmDialog-
|
|
22
|
+
import { _ as _17 } from "./chunks/LpConfirmDialog-BH7az_E7.js";
|
|
23
23
|
import { _ as _18 } from "./chunks/LpContextMenu-B6WBLleS.js";
|
|
24
24
|
import { _ as _19 } from "./chunks/LpDatePicker-BPbvu3cZ.js";
|
|
25
25
|
import { _ as _20 } from "./chunks/LpDisclosure-ChQYmjlR.js";
|
|
@@ -40,8 +40,8 @@ import { fileNameOf } from "./components/lightbox.js";
|
|
|
40
40
|
import { _ as _31 } from "./chunks/LpLink-DCND-zyu.js";
|
|
41
41
|
import { _ as _32 } from "./chunks/LpLogViewer-y53ZqSVq.js";
|
|
42
42
|
import { _ as _33 } from "./chunks/LpMediaGallery-Cid7PGYx.js";
|
|
43
|
-
import { _ as _34 } from "./chunks/LpModal-
|
|
44
|
-
import { _ as _35 } from "./chunks/LpModalNav
|
|
43
|
+
import { _ as _34 } from "./chunks/LpModal-Dq_qXN8-.js";
|
|
44
|
+
import { _ as _35 } from "./chunks/LpModalNav-B42a7R-3.js";
|
|
45
45
|
import { _ as _36 } from "./chunks/LpNotificationBell-lHePf89W.js";
|
|
46
46
|
import { _ as _37 } from "./chunks/LpNumberField-CWuX08iX.js";
|
|
47
47
|
import { _ as _38 } from "./chunks/LpNumberFlow-amWYaeuA.js";
|
package/package.json
CHANGED
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
DialogRoot,
|
|
9
9
|
DialogTitle,
|
|
10
10
|
} from "reka-ui"
|
|
11
|
-
import type { ComponentPublicInstance } from "vue"
|
|
12
11
|
import { computed, onBeforeUnmount, ref, useSlots, watch } from "vue"
|
|
13
12
|
import { useShift } from "../composables/useShift"
|
|
14
13
|
import { useModalLayer } from "./modalDepth"
|
|
@@ -143,7 +142,7 @@ const bodyPad = computed(() =>
|
|
|
143
142
|
* scroll area exactly as before. A panel whose size never moves is pinned once
|
|
144
143
|
* and never transitions.
|
|
145
144
|
*/
|
|
146
|
-
const panelRef = ref<
|
|
145
|
+
const panelRef = ref<HTMLElement | null>(null)
|
|
147
146
|
|
|
148
147
|
/**
|
|
149
148
|
* Controls that are worth landing on when the dialog opens, in order of
|
|
@@ -171,8 +170,8 @@ const AUTO_FOCUS_ORDER = [
|
|
|
171
170
|
*/
|
|
172
171
|
function onOpenAutoFocus(event: Event) {
|
|
173
172
|
if (props.autoFocus === "none") return
|
|
174
|
-
const panel = panelRef.value
|
|
175
|
-
if (!
|
|
173
|
+
const panel = panelRef.value
|
|
174
|
+
if (!panel) return
|
|
176
175
|
|
|
177
176
|
const selectors =
|
|
178
177
|
props.autoFocus === "auto" ? AUTO_FOCUS_ORDER : [props.autoFocus]
|
|
@@ -210,13 +209,10 @@ const {
|
|
|
210
209
|
resizing,
|
|
211
210
|
} = useShift({ axis: "height", enabled: () => props.open })
|
|
212
211
|
|
|
213
|
-
// reka renders a real element but exposes it as a component instance, so the
|
|
214
|
-
// sized element is handed over through $el once the panel has mounted.
|
|
215
212
|
watch(
|
|
216
213
|
() => (props.open ? panelRef.value : null),
|
|
217
214
|
(panel) => {
|
|
218
|
-
|
|
219
|
-
sizedEl.value = el instanceof HTMLElement ? el : null
|
|
215
|
+
sizedEl.value = panel
|
|
220
216
|
},
|
|
221
217
|
{ flush: "post" },
|
|
222
218
|
)
|
|
@@ -265,48 +261,38 @@ watch(
|
|
|
265
261
|
class="fixed inset-0 flex items-center justify-center pointer-events-none"
|
|
266
262
|
:style="{ zIndex: layer.panel }"
|
|
267
263
|
>
|
|
268
|
-
<!-- The dialog and its
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
264
|
+
<!-- The dialog and its asides stand in one row, and that row IS the
|
|
265
|
+
DialogContent. An aside rendered as a sibling of DialogContent sat
|
|
266
|
+
outside the modal: reka marks everything outside aria-hidden and traps
|
|
267
|
+
focus inside, so a section list beside the dialog could be neither
|
|
268
|
+
tabbed to nor read by a screen reader. Inside DialogContent it belongs
|
|
269
|
+
to the dialog, while the visible card is the inner panel, so nothing
|
|
270
|
+
moves on screen.
|
|
271
|
+
`items-start`: the row collapses to the taller of the two, both hang
|
|
272
|
+
from its top edge, and neither is stretched. Without a description
|
|
273
|
+
reka-ui warns on every open, and the opt-out it checks for is an
|
|
274
|
+
ABSENT `aria-describedby`; a caller that passes a description keeps
|
|
275
|
+
the link to DialogDescription. -->
|
|
276
|
+
<DialogContent
|
|
277
|
+
class="pointer-events-auto flex min-h-0 items-start outline-none data-[state=open]:animate-[rise-in_var(--duration-medium)_var(--ease-emphasized)] data-[state=closed]:animate-[rise-out_120ms_cubic-bezier(0.4,0,1,1)]"
|
|
278
|
+
:style="{ maxHeight: 'min(90vh, calc(100dvh - 2rem))' }"
|
|
279
|
+
v-bind="describedByAttrs"
|
|
280
|
+
@open-auto-focus="onOpenAutoFocus"
|
|
281
|
+
@interact-outside="onInteractOutside"
|
|
282
|
+
@pointer-down-outside="onInteractOutside"
|
|
277
283
|
>
|
|
278
|
-
<!-- Bound to `open`, not to the slot alone: DialogContent unmounts itself
|
|
279
|
-
with the dialog, but an aside is an ordinary node in the portal and
|
|
280
|
-
stayed on screen after the dialog closed — a section list floating
|
|
281
|
-
over the page with nothing behind it.
|
|
282
|
-
|
|
283
|
-
`pointer-events-auto` because the wrapper lets clicks through to the
|
|
284
|
-
overlay, and the aside is not the overlay. `data-lp-modal-aside` is
|
|
285
|
-
what tells `interact-outside` a click here is not a click on the
|
|
286
|
-
scrim — without it the dialog closes under the pointer. -->
|
|
287
284
|
<aside
|
|
288
|
-
v-if="
|
|
285
|
+
v-if="$slots.aside"
|
|
289
286
|
data-lp-modal-aside
|
|
290
|
-
class="
|
|
287
|
+
class="flex min-h-0 flex-col"
|
|
291
288
|
>
|
|
292
289
|
<slot name="aside" />
|
|
293
290
|
</aside>
|
|
294
|
-
|
|
295
|
-
checks for is an ABSENT `aria-describedby` — despite the message
|
|
296
|
-
naming the string "undefined" (a leftover from Radix, where
|
|
297
|
-
`aria-describedby={undefined}` is how you drop the attribute).
|
|
298
|
-
Dropping it here is what silences the warning; a caller that does
|
|
299
|
-
pass a description keeps the generated id and the link to
|
|
300
|
-
DialogDescription. -->
|
|
301
|
-
<DialogContent
|
|
291
|
+
<div
|
|
302
292
|
ref="panelRef"
|
|
303
|
-
class="
|
|
293
|
+
class="flex max-h-[min(90vh,calc(100dvh-2rem))] min-h-0 flex-col overflow-hidden rounded-card border border-line bg-surface-raised shadow-panel"
|
|
304
294
|
:class="[widthClass, tweening ? 'transition-[height] duration-fast ease-[var(--ease-emphasized)] motion-reduce:transition-none' : '']"
|
|
305
295
|
:style="{ ...(width ? { width } : {}), ...(hasAside ? { alignSelf: 'stretch' } : {}) }"
|
|
306
|
-
v-bind="describedByAttrs"
|
|
307
|
-
@open-auto-focus="onOpenAutoFocus"
|
|
308
|
-
@interact-outside="onInteractOutside"
|
|
309
|
-
@pointer-down-outside="onInteractOutside"
|
|
310
296
|
>
|
|
311
297
|
<header v-if="title || $slots.title" class="flex shrink-0 items-start justify-between gap-4 p-5 pb-3">
|
|
312
298
|
<div class="flex flex-col gap-1">
|
|
@@ -357,16 +343,15 @@ watch(
|
|
|
357
343
|
<footer v-if="$slots.footer" class="flex shrink-0 justify-end gap-2 p-5 pt-4">
|
|
358
344
|
<slot name="footer" />
|
|
359
345
|
</footer>
|
|
360
|
-
</
|
|
361
|
-
|
|
346
|
+
</div>
|
|
362
347
|
<aside
|
|
363
|
-
v-if="
|
|
348
|
+
v-if="$slots.asideEnd"
|
|
364
349
|
data-lp-modal-aside
|
|
365
|
-
class="
|
|
350
|
+
class="flex min-h-0 flex-col"
|
|
366
351
|
>
|
|
367
352
|
<slot name="asideEnd" />
|
|
368
353
|
</aside>
|
|
369
|
-
</
|
|
354
|
+
</DialogContent>
|
|
370
355
|
</div>
|
|
371
356
|
</DialogPortal>
|
|
372
357
|
</DialogRoot>
|