@x-plat/design-system 0.14.14 → 0.14.15
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/components/DatePicker/index.cjs +46 -41
- package/dist/components/DatePicker/index.js +46 -41
- package/dist/components/Drawer/index.cjs +14 -9
- package/dist/components/Drawer/index.js +14 -9
- package/dist/components/Dropdown/index.cjs +14 -14
- package/dist/components/Dropdown/index.js +14 -14
- package/dist/components/Modal/index.cjs +15 -10
- package/dist/components/Modal/index.js +15 -10
- package/dist/components/PopOver/index.cjs +14 -14
- package/dist/components/PopOver/index.js +14 -14
- package/dist/components/Select/index.cjs +14 -14
- package/dist/components/Select/index.js +14 -14
- package/dist/components/TimePicker/index.cjs +14 -14
- package/dist/components/TimePicker/index.js +14 -14
- package/dist/components/index.cjs +196 -194
- package/dist/components/index.js +196 -194
- package/dist/index.cjs +196 -194
- package/dist/index.js +196 -194
- package/guidelines/MIGRATION.md +28 -30
- package/package.json +1 -1
|
@@ -230,22 +230,22 @@ var useEscapeKey = (enabled, onEscape) => {
|
|
|
230
230
|
return () => document.removeEventListener("keydown", onKey);
|
|
231
231
|
}, [enabled, onEscape]);
|
|
232
232
|
};
|
|
233
|
-
var
|
|
233
|
+
var useCloseWhenTriggerHidden = (enabled, triggerRef, onClose) => {
|
|
234
234
|
const onCloseRef = import_react3.default.useRef(onClose);
|
|
235
235
|
onCloseRef.current = onClose;
|
|
236
236
|
import_react3.default.useEffect(() => {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
return () =>
|
|
248
|
-
}, [enabled,
|
|
237
|
+
const trigger = triggerRef.current;
|
|
238
|
+
if (!enabled || !trigger) return;
|
|
239
|
+
const observer = new IntersectionObserver(
|
|
240
|
+
([entry]) => {
|
|
241
|
+
if (!entry.isIntersecting) onCloseRef.current();
|
|
242
|
+
},
|
|
243
|
+
// 그릇이 없으면 root: null → 뷰포트 기준
|
|
244
|
+
{ root: findScrollParent(trigger), threshold: 0 }
|
|
245
|
+
);
|
|
246
|
+
observer.observe(trigger);
|
|
247
|
+
return () => observer.disconnect();
|
|
248
|
+
}, [enabled, triggerRef]);
|
|
249
249
|
};
|
|
250
250
|
|
|
251
251
|
// ../../node_modules/clsx/dist/clsx.mjs
|
|
@@ -275,7 +275,7 @@ var Dropdown = (props) => {
|
|
|
275
275
|
const menuRef = import_react4.default.useRef(null);
|
|
276
276
|
useAutoPosition_default(triggerRef, menuRef, mounted);
|
|
277
277
|
useClickOutside_default([triggerRef, menuRef], () => setIsOpen(false), isOpen);
|
|
278
|
-
|
|
278
|
+
useCloseWhenTriggerHidden(isOpen, triggerRef, () => setIsOpen(false));
|
|
279
279
|
useEscapeKey(isOpen, () => {
|
|
280
280
|
setIsOpen(false);
|
|
281
281
|
triggerRef.current?.focus({ preventScroll: true });
|
|
@@ -194,22 +194,22 @@ var useEscapeKey = (enabled, onEscape) => {
|
|
|
194
194
|
return () => document.removeEventListener("keydown", onKey);
|
|
195
195
|
}, [enabled, onEscape]);
|
|
196
196
|
};
|
|
197
|
-
var
|
|
197
|
+
var useCloseWhenTriggerHidden = (enabled, triggerRef, onClose) => {
|
|
198
198
|
const onCloseRef = React3.useRef(onClose);
|
|
199
199
|
onCloseRef.current = onClose;
|
|
200
200
|
React3.useEffect(() => {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
return () =>
|
|
212
|
-
}, [enabled,
|
|
201
|
+
const trigger = triggerRef.current;
|
|
202
|
+
if (!enabled || !trigger) return;
|
|
203
|
+
const observer = new IntersectionObserver(
|
|
204
|
+
([entry]) => {
|
|
205
|
+
if (!entry.isIntersecting) onCloseRef.current();
|
|
206
|
+
},
|
|
207
|
+
// 그릇이 없으면 root: null → 뷰포트 기준
|
|
208
|
+
{ root: findScrollParent(trigger), threshold: 0 }
|
|
209
|
+
);
|
|
210
|
+
observer.observe(trigger);
|
|
211
|
+
return () => observer.disconnect();
|
|
212
|
+
}, [enabled, triggerRef]);
|
|
213
213
|
};
|
|
214
214
|
|
|
215
215
|
// ../../node_modules/clsx/dist/clsx.mjs
|
|
@@ -239,7 +239,7 @@ var Dropdown = (props) => {
|
|
|
239
239
|
const menuRef = React4.useRef(null);
|
|
240
240
|
useAutoPosition_default(triggerRef, menuRef, mounted);
|
|
241
241
|
useClickOutside_default([triggerRef, menuRef], () => setIsOpen(false), isOpen);
|
|
242
|
-
|
|
242
|
+
useCloseWhenTriggerHidden(isOpen, triggerRef, () => setIsOpen(false));
|
|
243
243
|
useEscapeKey(isOpen, () => {
|
|
244
244
|
setIsOpen(false);
|
|
245
245
|
triggerRef.current?.focus({ preventScroll: true });
|
|
@@ -35,11 +35,16 @@ __export(Modal_exports, {
|
|
|
35
35
|
module.exports = __toCommonJS(Modal_exports);
|
|
36
36
|
|
|
37
37
|
// src/components/Modal/Modal.tsx
|
|
38
|
-
var
|
|
38
|
+
var import_react3 = __toESM(require("react"), 1);
|
|
39
39
|
var import_react_dom = require("react-dom");
|
|
40
40
|
|
|
41
41
|
// src/tokens/hooks/useOverlayKeyboard.ts
|
|
42
|
+
var import_react2 = __toESM(require("react"), 1);
|
|
43
|
+
|
|
44
|
+
// src/tokens/hooks/useAutoPosition.ts
|
|
42
45
|
var import_react = __toESM(require("react"), 1);
|
|
46
|
+
|
|
47
|
+
// src/tokens/hooks/useOverlayKeyboard.ts
|
|
43
48
|
var FOCUSABLE = [
|
|
44
49
|
"a[href]",
|
|
45
50
|
"button:not([disabled])",
|
|
@@ -53,7 +58,7 @@ var focusableIn = (el) => Array.from(el.querySelectorAll(FOCUSABLE)).filter(
|
|
|
53
58
|
(n) => n.offsetWidth > 0 || n.offsetHeight > 0 || n === document.activeElement
|
|
54
59
|
);
|
|
55
60
|
var useEscapeKey = (enabled, onEscape) => {
|
|
56
|
-
|
|
61
|
+
import_react2.default.useEffect(() => {
|
|
57
62
|
if (!enabled) return;
|
|
58
63
|
const onKey = (e) => {
|
|
59
64
|
if (e.key !== "Escape") return;
|
|
@@ -67,8 +72,8 @@ var useEscapeKey = (enabled, onEscape) => {
|
|
|
67
72
|
};
|
|
68
73
|
var useFocusTrap = (containerRef, enabled, options = {}) => {
|
|
69
74
|
const { trap = false, initialFocus } = options;
|
|
70
|
-
const restoreRef =
|
|
71
|
-
|
|
75
|
+
const restoreRef = import_react2.default.useRef(null);
|
|
76
|
+
import_react2.default.useEffect(() => {
|
|
72
77
|
if (!enabled) return;
|
|
73
78
|
restoreRef.current = document.activeElement;
|
|
74
79
|
const raf = requestAnimationFrame(() => {
|
|
@@ -86,7 +91,7 @@ var useFocusTrap = (containerRef, enabled, options = {}) => {
|
|
|
86
91
|
if (prev && document.contains(prev)) prev.focus({ preventScroll: true });
|
|
87
92
|
};
|
|
88
93
|
}, [enabled, containerRef, initialFocus]);
|
|
89
|
-
|
|
94
|
+
import_react2.default.useEffect(() => {
|
|
90
95
|
if (!enabled || !trap) return;
|
|
91
96
|
const onKey = (e) => {
|
|
92
97
|
if (e.key !== "Tab") return;
|
|
@@ -134,13 +139,13 @@ var import_jsx_runtime = require("react/jsx-runtime");
|
|
|
134
139
|
var ANIMATION_DURATION_MS = 200;
|
|
135
140
|
var Modal = (props) => {
|
|
136
141
|
const { isOpen, onClose, children } = props;
|
|
137
|
-
const [mounted, setMounted] =
|
|
138
|
-
const [visible, setVisible] =
|
|
139
|
-
const [settled, setSettled] =
|
|
140
|
-
const boxRef =
|
|
142
|
+
const [mounted, setMounted] = import_react3.default.useState(false);
|
|
143
|
+
const [visible, setVisible] = import_react3.default.useState(false);
|
|
144
|
+
const [settled, setSettled] = import_react3.default.useState(false);
|
|
145
|
+
const boxRef = import_react3.default.useRef(null);
|
|
141
146
|
useEscapeKey(isOpen, onClose);
|
|
142
147
|
useFocusTrap(boxRef, isOpen && mounted, { trap: true });
|
|
143
|
-
|
|
148
|
+
import_react3.default.useEffect(() => {
|
|
144
149
|
if (isOpen) {
|
|
145
150
|
setMounted(true);
|
|
146
151
|
const show = setTimeout(() => setVisible(true), 1);
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
// src/components/Modal/Modal.tsx
|
|
2
|
-
import
|
|
2
|
+
import React3 from "react";
|
|
3
3
|
import { createPortal } from "react-dom";
|
|
4
4
|
|
|
5
5
|
// src/tokens/hooks/useOverlayKeyboard.ts
|
|
6
|
+
import React2 from "react";
|
|
7
|
+
|
|
8
|
+
// src/tokens/hooks/useAutoPosition.ts
|
|
6
9
|
import React from "react";
|
|
10
|
+
|
|
11
|
+
// src/tokens/hooks/useOverlayKeyboard.ts
|
|
7
12
|
var FOCUSABLE = [
|
|
8
13
|
"a[href]",
|
|
9
14
|
"button:not([disabled])",
|
|
@@ -17,7 +22,7 @@ var focusableIn = (el) => Array.from(el.querySelectorAll(FOCUSABLE)).filter(
|
|
|
17
22
|
(n) => n.offsetWidth > 0 || n.offsetHeight > 0 || n === document.activeElement
|
|
18
23
|
);
|
|
19
24
|
var useEscapeKey = (enabled, onEscape) => {
|
|
20
|
-
|
|
25
|
+
React2.useEffect(() => {
|
|
21
26
|
if (!enabled) return;
|
|
22
27
|
const onKey = (e) => {
|
|
23
28
|
if (e.key !== "Escape") return;
|
|
@@ -31,8 +36,8 @@ var useEscapeKey = (enabled, onEscape) => {
|
|
|
31
36
|
};
|
|
32
37
|
var useFocusTrap = (containerRef, enabled, options = {}) => {
|
|
33
38
|
const { trap = false, initialFocus } = options;
|
|
34
|
-
const restoreRef =
|
|
35
|
-
|
|
39
|
+
const restoreRef = React2.useRef(null);
|
|
40
|
+
React2.useEffect(() => {
|
|
36
41
|
if (!enabled) return;
|
|
37
42
|
restoreRef.current = document.activeElement;
|
|
38
43
|
const raf = requestAnimationFrame(() => {
|
|
@@ -50,7 +55,7 @@ var useFocusTrap = (containerRef, enabled, options = {}) => {
|
|
|
50
55
|
if (prev && document.contains(prev)) prev.focus({ preventScroll: true });
|
|
51
56
|
};
|
|
52
57
|
}, [enabled, containerRef, initialFocus]);
|
|
53
|
-
|
|
58
|
+
React2.useEffect(() => {
|
|
54
59
|
if (!enabled || !trap) return;
|
|
55
60
|
const onKey = (e) => {
|
|
56
61
|
if (e.key !== "Tab") return;
|
|
@@ -98,13 +103,13 @@ import { jsx } from "react/jsx-runtime";
|
|
|
98
103
|
var ANIMATION_DURATION_MS = 200;
|
|
99
104
|
var Modal = (props) => {
|
|
100
105
|
const { isOpen, onClose, children } = props;
|
|
101
|
-
const [mounted, setMounted] =
|
|
102
|
-
const [visible, setVisible] =
|
|
103
|
-
const [settled, setSettled] =
|
|
104
|
-
const boxRef =
|
|
106
|
+
const [mounted, setMounted] = React3.useState(false);
|
|
107
|
+
const [visible, setVisible] = React3.useState(false);
|
|
108
|
+
const [settled, setSettled] = React3.useState(false);
|
|
109
|
+
const boxRef = React3.useRef(null);
|
|
105
110
|
useEscapeKey(isOpen, onClose);
|
|
106
111
|
useFocusTrap(boxRef, isOpen && mounted, { trap: true });
|
|
107
|
-
|
|
112
|
+
React3.useEffect(() => {
|
|
108
113
|
if (isOpen) {
|
|
109
114
|
setMounted(true);
|
|
110
115
|
const show = setTimeout(() => setVisible(true), 1);
|
|
@@ -230,22 +230,22 @@ var useEscapeKey = (enabled, onEscape) => {
|
|
|
230
230
|
return () => document.removeEventListener("keydown", onKey);
|
|
231
231
|
}, [enabled, onEscape]);
|
|
232
232
|
};
|
|
233
|
-
var
|
|
233
|
+
var useCloseWhenTriggerHidden = (enabled, triggerRef, onClose) => {
|
|
234
234
|
const onCloseRef = import_react3.default.useRef(onClose);
|
|
235
235
|
onCloseRef.current = onClose;
|
|
236
236
|
import_react3.default.useEffect(() => {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
return () =>
|
|
248
|
-
}, [enabled,
|
|
237
|
+
const trigger = triggerRef.current;
|
|
238
|
+
if (!enabled || !trigger) return;
|
|
239
|
+
const observer = new IntersectionObserver(
|
|
240
|
+
([entry]) => {
|
|
241
|
+
if (!entry.isIntersecting) onCloseRef.current();
|
|
242
|
+
},
|
|
243
|
+
// 그릇이 없으면 root: null → 뷰포트 기준
|
|
244
|
+
{ root: findScrollParent(trigger), threshold: 0 }
|
|
245
|
+
);
|
|
246
|
+
observer.observe(trigger);
|
|
247
|
+
return () => observer.disconnect();
|
|
248
|
+
}, [enabled, triggerRef]);
|
|
249
249
|
};
|
|
250
250
|
|
|
251
251
|
// ../../node_modules/clsx/dist/clsx.mjs
|
|
@@ -273,7 +273,7 @@ var PopOver = (props) => {
|
|
|
273
273
|
const [localOpen, setLocalOpen] = import_react4.default.useState(false);
|
|
274
274
|
const [eventTrigger, setEventTrigger] = import_react4.default.useState(false);
|
|
275
275
|
useClickOutside_default([popRef, triggerRef], onClose, isOpen);
|
|
276
|
-
|
|
276
|
+
useCloseWhenTriggerHidden(isOpen, triggerRef, onClose);
|
|
277
277
|
useEscapeKey(isOpen, () => {
|
|
278
278
|
onClose();
|
|
279
279
|
triggerRef.current?.focus({ preventScroll: true });
|
|
@@ -194,22 +194,22 @@ var useEscapeKey = (enabled, onEscape) => {
|
|
|
194
194
|
return () => document.removeEventListener("keydown", onKey);
|
|
195
195
|
}, [enabled, onEscape]);
|
|
196
196
|
};
|
|
197
|
-
var
|
|
197
|
+
var useCloseWhenTriggerHidden = (enabled, triggerRef, onClose) => {
|
|
198
198
|
const onCloseRef = React3.useRef(onClose);
|
|
199
199
|
onCloseRef.current = onClose;
|
|
200
200
|
React3.useEffect(() => {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
return () =>
|
|
212
|
-
}, [enabled,
|
|
201
|
+
const trigger = triggerRef.current;
|
|
202
|
+
if (!enabled || !trigger) return;
|
|
203
|
+
const observer = new IntersectionObserver(
|
|
204
|
+
([entry]) => {
|
|
205
|
+
if (!entry.isIntersecting) onCloseRef.current();
|
|
206
|
+
},
|
|
207
|
+
// 그릇이 없으면 root: null → 뷰포트 기준
|
|
208
|
+
{ root: findScrollParent(trigger), threshold: 0 }
|
|
209
|
+
);
|
|
210
|
+
observer.observe(trigger);
|
|
211
|
+
return () => observer.disconnect();
|
|
212
|
+
}, [enabled, triggerRef]);
|
|
213
213
|
};
|
|
214
214
|
|
|
215
215
|
// ../../node_modules/clsx/dist/clsx.mjs
|
|
@@ -237,7 +237,7 @@ var PopOver = (props) => {
|
|
|
237
237
|
const [localOpen, setLocalOpen] = React4.useState(false);
|
|
238
238
|
const [eventTrigger, setEventTrigger] = React4.useState(false);
|
|
239
239
|
useClickOutside_default([popRef, triggerRef], onClose, isOpen);
|
|
240
|
-
|
|
240
|
+
useCloseWhenTriggerHidden(isOpen, triggerRef, onClose);
|
|
241
241
|
useEscapeKey(isOpen, () => {
|
|
242
242
|
onClose();
|
|
243
243
|
triggerRef.current?.focus({ preventScroll: true });
|
|
@@ -231,22 +231,22 @@ var useEscapeKey = (enabled, onEscape) => {
|
|
|
231
231
|
return () => document.removeEventListener("keydown", onKey);
|
|
232
232
|
}, [enabled, onEscape]);
|
|
233
233
|
};
|
|
234
|
-
var
|
|
234
|
+
var useCloseWhenTriggerHidden = (enabled, triggerRef, onClose) => {
|
|
235
235
|
const onCloseRef = import_react3.default.useRef(onClose);
|
|
236
236
|
onCloseRef.current = onClose;
|
|
237
237
|
import_react3.default.useEffect(() => {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
return () =>
|
|
249
|
-
}, [enabled,
|
|
238
|
+
const trigger = triggerRef.current;
|
|
239
|
+
if (!enabled || !trigger) return;
|
|
240
|
+
const observer = new IntersectionObserver(
|
|
241
|
+
([entry]) => {
|
|
242
|
+
if (!entry.isIntersecting) onCloseRef.current();
|
|
243
|
+
},
|
|
244
|
+
// 그릇이 없으면 root: null → 뷰포트 기준
|
|
245
|
+
{ root: findScrollParent(trigger), threshold: 0 }
|
|
246
|
+
);
|
|
247
|
+
observer.observe(trigger);
|
|
248
|
+
return () => observer.disconnect();
|
|
249
|
+
}, [enabled, triggerRef]);
|
|
250
250
|
};
|
|
251
251
|
|
|
252
252
|
// src/tokens/svg/action/CopyIcon.tsx
|
|
@@ -1404,7 +1404,7 @@ var SelectRoot = (props) => {
|
|
|
1404
1404
|
}, []);
|
|
1405
1405
|
const toggle = import_react6.default.useCallback(() => setOpen((prev) => !prev), []);
|
|
1406
1406
|
useClickOutside_default([contentRef, triggerRef], close, isOpen);
|
|
1407
|
-
|
|
1407
|
+
useCloseWhenTriggerHidden(isOpen, triggerRef, close);
|
|
1408
1408
|
useEscapeKey(isOpen, () => {
|
|
1409
1409
|
close();
|
|
1410
1410
|
triggerRef.current?.focus({ preventScroll: true });
|
|
@@ -194,22 +194,22 @@ var useEscapeKey = (enabled, onEscape) => {
|
|
|
194
194
|
return () => document.removeEventListener("keydown", onKey);
|
|
195
195
|
}, [enabled, onEscape]);
|
|
196
196
|
};
|
|
197
|
-
var
|
|
197
|
+
var useCloseWhenTriggerHidden = (enabled, triggerRef, onClose) => {
|
|
198
198
|
const onCloseRef = React3.useRef(onClose);
|
|
199
199
|
onCloseRef.current = onClose;
|
|
200
200
|
React3.useEffect(() => {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
return () =>
|
|
212
|
-
}, [enabled,
|
|
201
|
+
const trigger = triggerRef.current;
|
|
202
|
+
if (!enabled || !trigger) return;
|
|
203
|
+
const observer = new IntersectionObserver(
|
|
204
|
+
([entry]) => {
|
|
205
|
+
if (!entry.isIntersecting) onCloseRef.current();
|
|
206
|
+
},
|
|
207
|
+
// 그릇이 없으면 root: null → 뷰포트 기준
|
|
208
|
+
{ root: findScrollParent(trigger), threshold: 0 }
|
|
209
|
+
);
|
|
210
|
+
observer.observe(trigger);
|
|
211
|
+
return () => observer.disconnect();
|
|
212
|
+
}, [enabled, triggerRef]);
|
|
213
213
|
};
|
|
214
214
|
|
|
215
215
|
// src/tokens/svg/action/CopyIcon.tsx
|
|
@@ -1367,7 +1367,7 @@ var SelectRoot = (props) => {
|
|
|
1367
1367
|
}, []);
|
|
1368
1368
|
const toggle = React6.useCallback(() => setOpen((prev) => !prev), []);
|
|
1369
1369
|
useClickOutside_default([contentRef, triggerRef], close, isOpen);
|
|
1370
|
-
|
|
1370
|
+
useCloseWhenTriggerHidden(isOpen, triggerRef, close);
|
|
1371
1371
|
useEscapeKey(isOpen, () => {
|
|
1372
1372
|
close();
|
|
1373
1373
|
triggerRef.current?.focus({ preventScroll: true });
|
|
@@ -230,22 +230,22 @@ var useEscapeKey = (enabled, onEscape) => {
|
|
|
230
230
|
return () => document.removeEventListener("keydown", onKey);
|
|
231
231
|
}, [enabled, onEscape]);
|
|
232
232
|
};
|
|
233
|
-
var
|
|
233
|
+
var useCloseWhenTriggerHidden = (enabled, triggerRef, onClose) => {
|
|
234
234
|
const onCloseRef = import_react3.default.useRef(onClose);
|
|
235
235
|
onCloseRef.current = onClose;
|
|
236
236
|
import_react3.default.useEffect(() => {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
return () =>
|
|
248
|
-
}, [enabled,
|
|
237
|
+
const trigger = triggerRef.current;
|
|
238
|
+
if (!enabled || !trigger) return;
|
|
239
|
+
const observer = new IntersectionObserver(
|
|
240
|
+
([entry]) => {
|
|
241
|
+
if (!entry.isIntersecting) onCloseRef.current();
|
|
242
|
+
},
|
|
243
|
+
// 그릇이 없으면 root: null → 뷰포트 기준
|
|
244
|
+
{ root: findScrollParent(trigger), threshold: 0 }
|
|
245
|
+
);
|
|
246
|
+
observer.observe(trigger);
|
|
247
|
+
return () => observer.disconnect();
|
|
248
|
+
}, [enabled, triggerRef]);
|
|
249
249
|
};
|
|
250
250
|
|
|
251
251
|
// ../../node_modules/clsx/dist/clsx.mjs
|
|
@@ -456,7 +456,7 @@ var TimePicker = (props) => {
|
|
|
456
456
|
}, [step, min, max]);
|
|
457
457
|
const close = import_react4.default.useCallback(() => setOpen(false), []);
|
|
458
458
|
useClickOutside_default([triggerRef, contentRef], close, isOpen);
|
|
459
|
-
|
|
459
|
+
useCloseWhenTriggerHidden(isOpen, triggerRef, close);
|
|
460
460
|
useEscapeKey(isOpen, () => {
|
|
461
461
|
close();
|
|
462
462
|
triggerRef.current?.focus({ preventScroll: true });
|
|
@@ -194,22 +194,22 @@ var useEscapeKey = (enabled, onEscape) => {
|
|
|
194
194
|
return () => document.removeEventListener("keydown", onKey);
|
|
195
195
|
}, [enabled, onEscape]);
|
|
196
196
|
};
|
|
197
|
-
var
|
|
197
|
+
var useCloseWhenTriggerHidden = (enabled, triggerRef, onClose) => {
|
|
198
198
|
const onCloseRef = React3.useRef(onClose);
|
|
199
199
|
onCloseRef.current = onClose;
|
|
200
200
|
React3.useEffect(() => {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
return () =>
|
|
212
|
-
}, [enabled,
|
|
201
|
+
const trigger = triggerRef.current;
|
|
202
|
+
if (!enabled || !trigger) return;
|
|
203
|
+
const observer = new IntersectionObserver(
|
|
204
|
+
([entry]) => {
|
|
205
|
+
if (!entry.isIntersecting) onCloseRef.current();
|
|
206
|
+
},
|
|
207
|
+
// 그릇이 없으면 root: null → 뷰포트 기준
|
|
208
|
+
{ root: findScrollParent(trigger), threshold: 0 }
|
|
209
|
+
);
|
|
210
|
+
observer.observe(trigger);
|
|
211
|
+
return () => observer.disconnect();
|
|
212
|
+
}, [enabled, triggerRef]);
|
|
213
213
|
};
|
|
214
214
|
|
|
215
215
|
// ../../node_modules/clsx/dist/clsx.mjs
|
|
@@ -420,7 +420,7 @@ var TimePicker = (props) => {
|
|
|
420
420
|
}, [step, min, max]);
|
|
421
421
|
const close = React4.useCallback(() => setOpen(false), []);
|
|
422
422
|
useClickOutside_default([triggerRef, contentRef], close, isOpen);
|
|
423
|
-
|
|
423
|
+
useCloseWhenTriggerHidden(isOpen, triggerRef, close);
|
|
424
424
|
useEscapeKey(isOpen, () => {
|
|
425
425
|
close();
|
|
426
426
|
triggerRef.current?.focus({ preventScroll: true });
|