@v-c/dialog 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,373 @@
1
+ import { getMotionName } from "../util.js";
2
+ import Content_default from "./Content/index.js";
3
+ import Mask_default from "./Mask.js";
4
+ import { createVNode, defineComponent, mergeDefaults, mergeProps, onUnmounted, shallowRef, useId, watch } from "vue";
5
+ import { warning } from "@v-c/util";
6
+ import contains from "@v-c/util/dist/Dom/contains";
7
+ import KeyCode from "@v-c/util/dist/KeyCode";
8
+ import pickAttrs from "@v-c/util/dist/pickAttrs";
9
+ var Dialog_default = /* @__PURE__ */ defineComponent((props, { expose, slots }) => {
10
+ if (process.env.NODE_ENV !== "production") {
11
+ [
12
+ "wrapStyle",
13
+ "bodyStyle",
14
+ "maskStyle"
15
+ ].forEach((prop) => {
16
+ warning(!(prop in props && props[prop]), `${prop} is deprecated, please use styles instead.`);
17
+ });
18
+ if ("wrapClassName" in props && props.wrapClassName) warning(false, `wrapClassName is deprecated, please use classNames instead.`);
19
+ }
20
+ const lastOutSideActiveElementRef = shallowRef(null);
21
+ const wrapperRef = shallowRef();
22
+ const contentRef = shallowRef();
23
+ const animatedVisible = shallowRef(props.visible);
24
+ const ariaId = useId();
25
+ function saveLastOutSideActiveElementRef() {
26
+ if (!contains(wrapperRef.value, document.activeElement)) lastOutSideActiveElementRef.value = document.activeElement;
27
+ }
28
+ function focusDialogContent() {
29
+ if (!contains(wrapperRef.value, document.activeElement)) contentRef.value?.focus?.();
30
+ }
31
+ function onDialogVisibleChanged(newVisible) {
32
+ if (newVisible) focusDialogContent();
33
+ else {
34
+ animatedVisible.value = false;
35
+ if (props.mask && lastOutSideActiveElementRef.value && props.focusTriggerAfterClose) {
36
+ try {
37
+ lastOutSideActiveElementRef.value?.focus?.({ preventScroll: true });
38
+ } catch (e) {}
39
+ lastOutSideActiveElementRef.value = null;
40
+ }
41
+ if (animatedVisible.value) props?.afterClose?.();
42
+ props?.afterOpenChange?.(newVisible);
43
+ }
44
+ }
45
+ function onInternalClose(e) {
46
+ props?.onClose?.(e);
47
+ }
48
+ const contentClickRef = shallowRef(false);
49
+ const contentTimeoutRef = shallowRef();
50
+ const onContentMouseDown = () => {
51
+ clearTimeout(contentTimeoutRef.value);
52
+ contentClickRef.value = true;
53
+ };
54
+ const onContentMouseUp = () => {
55
+ contentTimeoutRef.value = setTimeout(() => {
56
+ contentClickRef.value = false;
57
+ });
58
+ };
59
+ let onWrapperClick = null;
60
+ watch(() => props.maskClosable, () => {
61
+ if (props.maskClosable) onWrapperClick = (e) => {
62
+ if (contentClickRef.value) contentClickRef.value = false;
63
+ else if (wrapperRef.value === e.target) onInternalClose(e);
64
+ };
65
+ }, { immediate: true });
66
+ function onWrapperKeyDown(e) {
67
+ if (props.keyboard && e === KeyCode.ESC) {
68
+ e.stopPropagation();
69
+ onInternalClose(e);
70
+ }
71
+ if (props.visible && e.keyCode === KeyCode.TAB) contentRef.value?.changeActive?.(!e.shiftKey);
72
+ }
73
+ watch(() => props.visible, () => {
74
+ if (props.visible) {
75
+ animatedVisible.value = true;
76
+ saveLastOutSideActiveElementRef();
77
+ }
78
+ }, { immediate: true });
79
+ onUnmounted(() => {
80
+ clearTimeout(contentTimeoutRef.value);
81
+ });
82
+ expose({});
83
+ return () => {
84
+ const { zIndex, wrapStyle, wrapProps, wrapClassName, closable, transitionName, animation, styles: modalStyles, prefixCls, rootClassName, visible, mask, maskAnimation, maskTransitionName, maskStyle, maskProps, classNames: modalClassNames } = props;
85
+ const mergedStyle = {
86
+ zIndex,
87
+ ...wrapStyle,
88
+ ...modalStyles?.wrapper,
89
+ display: !animatedVisible.value ? "none" : void 0
90
+ };
91
+ return createVNode("div", mergeProps({ "class": [`${prefixCls}-root`, rootClassName] }, pickAttrs(props, { data: true })), [createVNode(Mask_default, {
92
+ "prefixCls": prefixCls,
93
+ "visible": !!(mask && visible),
94
+ "motionName": getMotionName(prefixCls, maskTransitionName, maskAnimation),
95
+ "style": {
96
+ zIndex,
97
+ ...maskStyle,
98
+ ...modalStyles?.mask
99
+ },
100
+ "maskProps": maskProps,
101
+ "className": modalClassNames?.mask
102
+ }, null), createVNode("div", mergeProps({
103
+ "tabindex": -1,
104
+ "onKeydown": onWrapperKeyDown,
105
+ "class": [
106
+ `${prefixCls}-wrap`,
107
+ wrapClassName,
108
+ modalClassNames?.wrapper
109
+ ],
110
+ "ref": wrapperRef,
111
+ "onClick": onWrapperClick,
112
+ "style": mergedStyle
113
+ }, wrapProps), [createVNode(Content_default, mergeProps({
114
+ ...props,
115
+ onMouseDown: onContentMouseDown,
116
+ onMouseUp: onContentMouseUp,
117
+ onClose: onInternalClose,
118
+ onVisibleChanged: onDialogVisibleChanged
119
+ }, {
120
+ "ref": contentRef,
121
+ "closable": closable,
122
+ "ariaId": ariaId,
123
+ "prefixCls": prefixCls,
124
+ "visible": !!visible,
125
+ "motionName": getMotionName(prefixCls, transitionName, animation)
126
+ }), slots)])]);
127
+ };
128
+ }, {
129
+ props: /* @__PURE__ */ mergeDefaults({
130
+ className: {
131
+ type: String,
132
+ required: false,
133
+ default: void 0
134
+ },
135
+ keyboard: {
136
+ type: Boolean,
137
+ required: false,
138
+ default: void 0
139
+ },
140
+ style: {
141
+ type: Object,
142
+ required: false,
143
+ default: void 0
144
+ },
145
+ rootStyle: {
146
+ type: Object,
147
+ required: false,
148
+ default: void 0
149
+ },
150
+ mask: {
151
+ type: Boolean,
152
+ required: false,
153
+ default: void 0
154
+ },
155
+ children: {
156
+ type: [
157
+ Object,
158
+ Function,
159
+ String,
160
+ Number,
161
+ null,
162
+ Boolean,
163
+ Array
164
+ ],
165
+ required: false,
166
+ default: void 0
167
+ },
168
+ afterClose: {
169
+ type: Function,
170
+ required: false,
171
+ default: void 0
172
+ },
173
+ afterOpenChange: {
174
+ type: Function,
175
+ required: false,
176
+ default: void 0
177
+ },
178
+ onClose: {
179
+ type: Function,
180
+ required: false,
181
+ default: void 0
182
+ },
183
+ closable: {
184
+ type: [Boolean, Object],
185
+ required: false,
186
+ default: void 0
187
+ },
188
+ maskClosable: {
189
+ type: Boolean,
190
+ required: false,
191
+ default: void 0
192
+ },
193
+ visible: {
194
+ type: Boolean,
195
+ required: false,
196
+ default: void 0
197
+ },
198
+ destroyOnHidden: {
199
+ type: Boolean,
200
+ required: false,
201
+ default: void 0
202
+ },
203
+ mousePosition: {
204
+ type: [Object, null],
205
+ required: false,
206
+ default: void 0
207
+ },
208
+ title: {
209
+ type: [
210
+ Object,
211
+ Function,
212
+ String,
213
+ Number,
214
+ null,
215
+ Boolean,
216
+ Array
217
+ ],
218
+ required: false,
219
+ default: void 0
220
+ },
221
+ footer: {
222
+ type: [
223
+ Object,
224
+ Function,
225
+ String,
226
+ Number,
227
+ null,
228
+ Boolean,
229
+ Array
230
+ ],
231
+ required: false,
232
+ default: void 0
233
+ },
234
+ transitionName: {
235
+ type: String,
236
+ required: false,
237
+ default: void 0
238
+ },
239
+ maskTransitionName: {
240
+ type: String,
241
+ required: false,
242
+ default: void 0
243
+ },
244
+ animation: {
245
+ required: false,
246
+ default: void 0
247
+ },
248
+ maskAnimation: {
249
+ required: false,
250
+ default: void 0
251
+ },
252
+ wrapStyle: {
253
+ type: Object,
254
+ required: false,
255
+ default: void 0
256
+ },
257
+ bodyStyle: {
258
+ type: Object,
259
+ required: false,
260
+ default: void 0
261
+ },
262
+ maskStyle: {
263
+ type: Object,
264
+ required: false,
265
+ default: void 0
266
+ },
267
+ prefixCls: {
268
+ type: String,
269
+ required: false,
270
+ default: void 0
271
+ },
272
+ wrapClassName: {
273
+ type: String,
274
+ required: false,
275
+ default: void 0
276
+ },
277
+ width: {
278
+ type: [String, Number],
279
+ required: false,
280
+ default: void 0
281
+ },
282
+ height: {
283
+ type: [String, Number],
284
+ required: false,
285
+ default: void 0
286
+ },
287
+ zIndex: {
288
+ type: Number,
289
+ required: false,
290
+ default: void 0
291
+ },
292
+ bodyProps: {
293
+ required: false,
294
+ default: void 0
295
+ },
296
+ maskProps: {
297
+ required: false,
298
+ default: void 0
299
+ },
300
+ rootClassName: {
301
+ type: String,
302
+ required: false,
303
+ default: void 0
304
+ },
305
+ classNames: {
306
+ type: Object,
307
+ required: false,
308
+ default: void 0
309
+ },
310
+ styles: {
311
+ type: Object,
312
+ required: false,
313
+ default: void 0
314
+ },
315
+ wrapProps: {
316
+ required: false,
317
+ default: void 0
318
+ },
319
+ getContainer: {
320
+ type: [
321
+ String,
322
+ Function,
323
+ Boolean
324
+ ],
325
+ required: false,
326
+ skipCheck: true,
327
+ default: void 0
328
+ },
329
+ closeIcon: {
330
+ type: [
331
+ Object,
332
+ Function,
333
+ String,
334
+ Number,
335
+ null,
336
+ Boolean,
337
+ Array
338
+ ],
339
+ required: false,
340
+ default: void 0
341
+ },
342
+ modalRender: {
343
+ type: Function,
344
+ required: false,
345
+ default: void 0
346
+ },
347
+ forceRender: {
348
+ type: Boolean,
349
+ required: false,
350
+ default: void 0
351
+ },
352
+ focusTriggerAfterClose: {
353
+ type: Boolean,
354
+ required: false,
355
+ default: void 0
356
+ },
357
+ panelRef: {
358
+ required: false,
359
+ default: void 0
360
+ }
361
+ }, {
362
+ prefixCls: "vc-dialog",
363
+ visible: true,
364
+ keyboard: true,
365
+ focusTriggerAfterClose: true,
366
+ closable: true,
367
+ mask: true,
368
+ maskClosable: true,
369
+ forceRender: false
370
+ }),
371
+ name: "Dialog"
372
+ });
373
+ export { Dialog_default as default };
@@ -0,0 +1,281 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ const require_rolldown_runtime = require("./_virtual/rolldown_runtime.cjs");
3
+ const require_context = require("./context.cjs");
4
+ const require_index = require("./Dialog/index.cjs");
5
+ let vue = require("vue");
6
+ let __v_c_portal = require("@v-c/portal");
7
+ __v_c_portal = require_rolldown_runtime.__toESM(__v_c_portal);
8
+ var DialogWrap = /* @__PURE__ */ (0, vue.defineComponent)((props, { slots }) => {
9
+ const animatedVisible = (0, vue.shallowRef)(false);
10
+ const { setPanelRef } = require_context.useRefProvide();
11
+ (0, vue.watch)(() => props.panelRef, () => {
12
+ setPanelRef(props.panelRef);
13
+ }, { immediate: true });
14
+ (0, vue.watch)(() => props.visible, () => {
15
+ if (props.visible) animatedVisible.value = true;
16
+ }, { immediate: true });
17
+ return () => {
18
+ const { visible, getContainer, forceRender, destroyOnHidden = false, afterClose } = props;
19
+ if (!forceRender && destroyOnHidden && !animatedVisible) return null;
20
+ return (0, vue.createVNode)(__v_c_portal.default, {
21
+ "open": !!(visible || forceRender || animatedVisible),
22
+ "autoDestroy": false,
23
+ "getContainer": getContainer,
24
+ "autoLock": !!(visible || animatedVisible)
25
+ }, { default: () => [(0, vue.createVNode)(require_index.default, (0, vue.mergeProps)(props, {
26
+ "destroyOnHidden": destroyOnHidden,
27
+ "afterClose": () => {
28
+ afterClose?.();
29
+ animatedVisible.value = false;
30
+ }
31
+ }), slots)] });
32
+ };
33
+ }, {
34
+ props: /* @__PURE__ */ (0, vue.mergeDefaults)({
35
+ className: {
36
+ type: String,
37
+ required: false,
38
+ default: void 0
39
+ },
40
+ keyboard: {
41
+ type: Boolean,
42
+ required: false,
43
+ default: void 0
44
+ },
45
+ style: {
46
+ type: Object,
47
+ required: false,
48
+ default: void 0
49
+ },
50
+ rootStyle: {
51
+ type: Object,
52
+ required: false,
53
+ default: void 0
54
+ },
55
+ mask: {
56
+ type: Boolean,
57
+ required: false,
58
+ default: void 0
59
+ },
60
+ children: {
61
+ type: [
62
+ Object,
63
+ Function,
64
+ String,
65
+ Number,
66
+ null,
67
+ Boolean,
68
+ Array
69
+ ],
70
+ required: false,
71
+ default: void 0
72
+ },
73
+ afterClose: {
74
+ type: Function,
75
+ required: false,
76
+ default: void 0
77
+ },
78
+ afterOpenChange: {
79
+ type: Function,
80
+ required: false,
81
+ default: void 0
82
+ },
83
+ onClose: {
84
+ type: Function,
85
+ required: false,
86
+ default: void 0
87
+ },
88
+ closable: {
89
+ type: [Boolean, Object],
90
+ required: false,
91
+ default: void 0
92
+ },
93
+ maskClosable: {
94
+ type: Boolean,
95
+ required: false,
96
+ default: void 0
97
+ },
98
+ visible: {
99
+ type: Boolean,
100
+ required: false,
101
+ default: void 0
102
+ },
103
+ destroyOnHidden: {
104
+ type: Boolean,
105
+ required: false,
106
+ default: void 0
107
+ },
108
+ mousePosition: {
109
+ type: [Object, null],
110
+ required: false,
111
+ default: void 0
112
+ },
113
+ title: {
114
+ type: [
115
+ Object,
116
+ Function,
117
+ String,
118
+ Number,
119
+ null,
120
+ Boolean,
121
+ Array
122
+ ],
123
+ required: false,
124
+ default: void 0
125
+ },
126
+ footer: {
127
+ type: [
128
+ Object,
129
+ Function,
130
+ String,
131
+ Number,
132
+ null,
133
+ Boolean,
134
+ Array
135
+ ],
136
+ required: false,
137
+ default: void 0
138
+ },
139
+ transitionName: {
140
+ type: String,
141
+ required: false,
142
+ default: void 0
143
+ },
144
+ maskTransitionName: {
145
+ type: String,
146
+ required: false,
147
+ default: void 0
148
+ },
149
+ animation: {
150
+ required: false,
151
+ default: void 0
152
+ },
153
+ maskAnimation: {
154
+ required: false,
155
+ default: void 0
156
+ },
157
+ wrapStyle: {
158
+ type: Object,
159
+ required: false,
160
+ default: void 0
161
+ },
162
+ bodyStyle: {
163
+ type: Object,
164
+ required: false,
165
+ default: void 0
166
+ },
167
+ maskStyle: {
168
+ type: Object,
169
+ required: false,
170
+ default: void 0
171
+ },
172
+ prefixCls: {
173
+ type: String,
174
+ required: false,
175
+ default: void 0
176
+ },
177
+ wrapClassName: {
178
+ type: String,
179
+ required: false,
180
+ default: void 0
181
+ },
182
+ width: {
183
+ type: [String, Number],
184
+ required: false,
185
+ default: void 0
186
+ },
187
+ height: {
188
+ type: [String, Number],
189
+ required: false,
190
+ default: void 0
191
+ },
192
+ zIndex: {
193
+ type: Number,
194
+ required: false,
195
+ default: void 0
196
+ },
197
+ bodyProps: {
198
+ required: false,
199
+ default: void 0
200
+ },
201
+ maskProps: {
202
+ required: false,
203
+ default: void 0
204
+ },
205
+ rootClassName: {
206
+ type: String,
207
+ required: false,
208
+ default: void 0
209
+ },
210
+ classNames: {
211
+ type: Object,
212
+ required: false,
213
+ default: void 0
214
+ },
215
+ styles: {
216
+ type: Object,
217
+ required: false,
218
+ default: void 0
219
+ },
220
+ wrapProps: {
221
+ required: false,
222
+ default: void 0
223
+ },
224
+ getContainer: {
225
+ type: [
226
+ String,
227
+ Function,
228
+ Boolean
229
+ ],
230
+ required: false,
231
+ skipCheck: true,
232
+ default: void 0
233
+ },
234
+ closeIcon: {
235
+ type: [
236
+ Object,
237
+ Function,
238
+ String,
239
+ Number,
240
+ null,
241
+ Boolean,
242
+ Array
243
+ ],
244
+ required: false,
245
+ default: void 0
246
+ },
247
+ modalRender: {
248
+ type: Function,
249
+ required: false,
250
+ default: void 0
251
+ },
252
+ forceRender: {
253
+ type: Boolean,
254
+ required: false,
255
+ default: void 0
256
+ },
257
+ focusTriggerAfterClose: {
258
+ type: Boolean,
259
+ required: false,
260
+ default: void 0
261
+ },
262
+ panelRef: {
263
+ required: false,
264
+ default: void 0
265
+ }
266
+ }, {
267
+ getContainer: void 0,
268
+ closeIcon: void 0,
269
+ prefixCls: "vc-dialog",
270
+ visible: true,
271
+ keyboard: true,
272
+ focusTriggerAfterClose: true,
273
+ closable: true,
274
+ mask: true,
275
+ maskClosable: true,
276
+ forceRender: false
277
+ }),
278
+ name: "Dialog"
279
+ });
280
+ var DialogWrap_default = DialogWrap;
281
+ exports.default = DialogWrap_default;
@@ -0,0 +1,3 @@
1
+ import { IDialogPropTypes } from './IDialogPropTypes';
2
+ declare const DialogWrap: import('vue').DefineSetupFnComponent<IDialogPropTypes, {}, {}, IDialogPropTypes & {}, import('vue').PublicProps>;
3
+ export default DialogWrap;