@yamada-ui/utils 2.0.0-dev-20240531201720 → 2.0.0-dev-20250626073729
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/README.md +7 -13
- package/dist/cjs/_virtual/rolldown_runtime.cjs +30 -0
- package/dist/cjs/array.cjs +14 -0
- package/dist/cjs/array.cjs.map +1 -0
- package/dist/cjs/assertion.cjs +73 -0
- package/dist/cjs/assertion.cjs.map +1 -0
- package/dist/cjs/calc.cjs +39 -0
- package/dist/cjs/calc.cjs.map +1 -0
- package/dist/cjs/color.cjs +247 -0
- package/dist/cjs/color.cjs.map +1 -0
- package/dist/cjs/dom.cjs +378 -0
- package/dist/cjs/dom.cjs.map +1 -0
- package/dist/cjs/event.cjs +92 -0
- package/dist/cjs/event.cjs.map +1 -0
- package/dist/cjs/function.cjs +27 -0
- package/dist/cjs/function.cjs.map +1 -0
- package/dist/cjs/i18n.cjs +46 -0
- package/dist/cjs/i18n.cjs.map +1 -0
- package/dist/cjs/index.cjs +148 -0
- package/dist/cjs/index.types.cjs +0 -0
- package/dist/cjs/module.cjs +9 -0
- package/dist/cjs/module.cjs.map +1 -0
- package/dist/cjs/number.cjs +46 -0
- package/dist/cjs/number.cjs.map +1 -0
- package/dist/cjs/object.cjs +120 -0
- package/dist/cjs/object.cjs.map +1 -0
- package/dist/cjs/string.cjs +95 -0
- package/dist/cjs/string.cjs.map +1 -0
- package/dist/esm/array.js +13 -0
- package/dist/esm/array.js.map +1 -0
- package/dist/esm/assertion.js +56 -0
- package/dist/esm/assertion.js.map +1 -0
- package/dist/esm/calc.js +38 -0
- package/dist/esm/calc.js.map +1 -0
- package/dist/esm/color.js +232 -0
- package/dist/esm/color.js.map +1 -0
- package/dist/esm/dom.js +325 -0
- package/dist/esm/dom.js.map +1 -0
- package/dist/esm/event.js +83 -0
- package/dist/esm/event.js.map +1 -0
- package/dist/esm/function.js +24 -0
- package/dist/esm/function.js.map +1 -0
- package/dist/esm/i18n.js +45 -0
- package/dist/esm/i18n.js.map +1 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/index.types.js +0 -0
- package/dist/esm/module.js +8 -0
- package/dist/esm/module.js.map +1 -0
- package/dist/esm/number.js +39 -0
- package/dist/esm/number.js.map +1 -0
- package/dist/esm/object.js +108 -0
- package/dist/esm/object.js.map +1 -0
- package/dist/esm/string.js +86 -0
- package/dist/esm/string.js.map +1 -0
- package/dist/types/array.d.ts +6 -0
- package/dist/types/assertion.d.ts +23 -0
- package/dist/types/calc.d.ts +25 -0
- package/dist/types/color.d.ts +20 -0
- package/dist/types/dom.d.ts +61 -0
- package/dist/types/event.d.ts +21 -0
- package/dist/types/function.d.ts +8 -0
- package/dist/types/i18n.d.ts +5 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.types.d.ts +15 -0
- package/dist/types/module.d.ts +5 -0
- package/dist/types/number.d.ts +11 -0
- package/dist/types/object.d.ts +36 -0
- package/dist/types/string.d.ts +16 -0
- package/package.json +26 -27
- package/dist/array.d.mts +0 -3
- package/dist/array.d.ts +0 -3
- package/dist/array.js +0 -31
- package/dist/array.js.map +0 -1
- package/dist/array.mjs +0 -7
- package/dist/array.mjs.map +0 -1
- package/dist/assertion.d.mts +0 -17
- package/dist/assertion.d.ts +0 -17
- package/dist/assertion.js +0 -67
- package/dist/assertion.js.map +0 -1
- package/dist/assertion.mjs +0 -31
- package/dist/assertion.mjs.map +0 -1
- package/dist/calc.d.mts +0 -18
- package/dist/calc.d.ts +0 -18
- package/dist/calc.js +0 -57
- package/dist/calc.js.map +0 -1
- package/dist/calc.mjs +0 -7
- package/dist/calc.mjs.map +0 -1
- package/dist/chunk-5OUUTZYQ.mjs +0 -7
- package/dist/chunk-5OUUTZYQ.mjs.map +0 -1
- package/dist/chunk-A74F6ICI.mjs +0 -52
- package/dist/chunk-A74F6ICI.mjs.map +0 -1
- package/dist/chunk-L56KWSQO.mjs +0 -33
- package/dist/chunk-L56KWSQO.mjs.map +0 -1
- package/dist/chunk-L76GM3GN.mjs +0 -50
- package/dist/chunk-L76GM3GN.mjs.map +0 -1
- package/dist/chunk-P52P4NMT.mjs +0 -41
- package/dist/chunk-P52P4NMT.mjs.map +0 -1
- package/dist/chunk-P5JCSYB3.mjs +0 -31
- package/dist/chunk-P5JCSYB3.mjs.map +0 -1
- package/dist/chunk-PZXEZGEL.mjs +0 -811
- package/dist/chunk-PZXEZGEL.mjs.map +0 -1
- package/dist/chunk-RSDBT4DI.mjs +0 -1
- package/dist/chunk-RSDBT4DI.mjs.map +0 -1
- package/dist/chunk-WV6P7ZCI.mjs +0 -7
- package/dist/chunk-WV6P7ZCI.mjs.map +0 -1
- package/dist/color.d.mts +0 -33
- package/dist/color.d.ts +0 -33
- package/dist/color.js +0 -374
- package/dist/color.js.map +0 -1
- package/dist/color.mjs +0 -61
- package/dist/color.mjs.map +0 -1
- package/dist/dom.d.mts +0 -34
- package/dist/dom.d.ts +0 -34
- package/dist/dom.js +0 -196
- package/dist/dom.js.map +0 -1
- package/dist/dom.mjs +0 -65
- package/dist/dom.mjs.map +0 -1
- package/dist/event.d.mts +0 -30
- package/dist/event.d.ts +0 -30
- package/dist/event.js +0 -84
- package/dist/event.js.map +0 -1
- package/dist/event.mjs +0 -23
- package/dist/event.mjs.map +0 -1
- package/dist/function.d.mts +0 -6
- package/dist/function.d.ts +0 -6
- package/dist/function.js +0 -51
- package/dist/function.js.map +0 -1
- package/dist/function.mjs +0 -21
- package/dist/function.mjs.map +0 -1
- package/dist/index.d.mts +0 -14
- package/dist/index.d.ts +0 -14
- package/dist/index.js +0 -1162
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -270
- package/dist/index.mjs.map +0 -1
- package/dist/index.types.d.mts +0 -12
- package/dist/index.types.d.ts +0 -12
- package/dist/index.types.js +0 -19
- package/dist/index.types.js.map +0 -1
- package/dist/index.types.mjs +0 -2
- package/dist/index.types.mjs.map +0 -1
- package/dist/module.d.mts +0 -3
- package/dist/module.d.ts +0 -3
- package/dist/module.js +0 -31
- package/dist/module.js.map +0 -1
- package/dist/module.mjs +0 -7
- package/dist/module.mjs.map +0 -1
- package/dist/number.d.mts +0 -9
- package/dist/number.d.ts +0 -9
- package/dist/number.js +0 -71
- package/dist/number.js.map +0 -1
- package/dist/number.mjs +0 -19
- package/dist/number.mjs.map +0 -1
- package/dist/object.d.mts +0 -18
- package/dist/object.d.ts +0 -18
- package/dist/object.js +0 -220
- package/dist/object.js.map +0 -1
- package/dist/object.mjs +0 -41
- package/dist/object.mjs.map +0 -1
- package/dist/react.d.mts +0 -105
- package/dist/react.d.ts +0 -105
- package/dist/react.js +0 -258
- package/dist/react.js.map +0 -1
- package/dist/react.mjs +0 -55
- package/dist/react.mjs.map +0 -1
- package/dist/string.d.mts +0 -8
- package/dist/string.d.ts +0 -8
- package/dist/string.js +0 -77
- package/dist/string.js.map +0 -1
- package/dist/string.mjs +0 -13
- package/dist/string.mjs.map +0 -1
package/dist/cjs/dom.cjs
ADDED
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
const require_assertion = require('./assertion.cjs');
|
|
2
|
+
const require_function = require('./function.cjs');
|
|
3
|
+
|
|
4
|
+
//#region src/dom.ts
|
|
5
|
+
function createdDom() {
|
|
6
|
+
return !!(typeof window !== "undefined" && window.document?.createElement);
|
|
7
|
+
}
|
|
8
|
+
function getPlatform() {
|
|
9
|
+
return navigator.userAgentData?.platform ?? navigator.platform;
|
|
10
|
+
}
|
|
11
|
+
function getUserAgent() {
|
|
12
|
+
const userAgentData = navigator.userAgentData;
|
|
13
|
+
if (userAgentData && require_assertion.isArray(userAgentData.brands)) return userAgentData.brands.map(({ brand, version }) => `${brand}/${version}`).join(" ");
|
|
14
|
+
return navigator.userAgent;
|
|
15
|
+
}
|
|
16
|
+
function vendor(v) {
|
|
17
|
+
return createdDom() && v.test(navigator.vendor);
|
|
18
|
+
}
|
|
19
|
+
function platform(v) {
|
|
20
|
+
return createdDom() && v.test(getPlatform());
|
|
21
|
+
}
|
|
22
|
+
function userAgent(v) {
|
|
23
|
+
return createdDom() && v.test(getUserAgent());
|
|
24
|
+
}
|
|
25
|
+
function isMac() {
|
|
26
|
+
return platform(/^Mac/i);
|
|
27
|
+
}
|
|
28
|
+
function isIPhone() {
|
|
29
|
+
return platform(/^iPhone/i);
|
|
30
|
+
}
|
|
31
|
+
function isIPad() {
|
|
32
|
+
return platform(/^iPad/i) || isMac() && navigator.maxTouchPoints > 1;
|
|
33
|
+
}
|
|
34
|
+
function isIos() {
|
|
35
|
+
return isIPhone() || isIPad();
|
|
36
|
+
}
|
|
37
|
+
function isAndroid() {
|
|
38
|
+
return platform(/^Android/i);
|
|
39
|
+
}
|
|
40
|
+
function isApple() {
|
|
41
|
+
return isMac() || isIos();
|
|
42
|
+
}
|
|
43
|
+
function isSafari() {
|
|
44
|
+
return isApple() && vendor(/apple/i);
|
|
45
|
+
}
|
|
46
|
+
function isFirefox() {
|
|
47
|
+
return userAgent(/Firefox/i);
|
|
48
|
+
}
|
|
49
|
+
function isChrome() {
|
|
50
|
+
return userAgent(/Chrome/i);
|
|
51
|
+
}
|
|
52
|
+
function isWebKit() {
|
|
53
|
+
return userAgent(/AppleWebKit/i) && !isChrome();
|
|
54
|
+
}
|
|
55
|
+
function isHTMLElement(el) {
|
|
56
|
+
return require_assertion.isObject(el) && el.nodeType === Node.ELEMENT_NODE && typeof el.nodeName === "string";
|
|
57
|
+
}
|
|
58
|
+
function isWindow(el) {
|
|
59
|
+
return require_assertion.isObject(el) && el === el.window;
|
|
60
|
+
}
|
|
61
|
+
function isDocument(el) {
|
|
62
|
+
return require_assertion.isObject(el) && el.nodeType === Node.DOCUMENT_NODE;
|
|
63
|
+
}
|
|
64
|
+
function isVisualViewport(el) {
|
|
65
|
+
return require_assertion.isObject(el) && el.constructor.name === "VisualViewport";
|
|
66
|
+
}
|
|
67
|
+
function isNode(el) {
|
|
68
|
+
return require_assertion.isObject(el) && el.nodeType !== void 0;
|
|
69
|
+
}
|
|
70
|
+
function isShadowRoot(el) {
|
|
71
|
+
return isNode(el) && el.nodeType === Node.DOCUMENT_FRAGMENT_NODE && "host" in el;
|
|
72
|
+
}
|
|
73
|
+
function isFrame(el) {
|
|
74
|
+
return isHTMLElement(el) && el.tagName === "IFRAME";
|
|
75
|
+
}
|
|
76
|
+
function isActiveElement(el, rootNode) {
|
|
77
|
+
return getActiveElement(rootNode) === el;
|
|
78
|
+
}
|
|
79
|
+
function isHiddenElement(el) {
|
|
80
|
+
if (el.parentElement && isHiddenElement(el.parentElement)) return true;
|
|
81
|
+
return el.hidden;
|
|
82
|
+
}
|
|
83
|
+
function isDisabledElement(el) {
|
|
84
|
+
return Boolean(el.getAttribute("disabled")) || Boolean(el.getAttribute("data-disabled")) || Boolean(el.getAttribute("aria-disabled"));
|
|
85
|
+
}
|
|
86
|
+
function isVisibleElement(el) {
|
|
87
|
+
if (!isHTMLElement(el)) return false;
|
|
88
|
+
return el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0;
|
|
89
|
+
}
|
|
90
|
+
function isTouchDevice() {
|
|
91
|
+
return "ontouchstart" in window;
|
|
92
|
+
}
|
|
93
|
+
const hasTabIndex = (el) => !Number.isNaN(parseInt(el.getAttribute("tabindex") || "0", 10));
|
|
94
|
+
const hasNegativeTabIndex = (el) => parseInt(el.getAttribute("tabindex") || "0", 10) < 0;
|
|
95
|
+
function getWindow(el) {
|
|
96
|
+
if (isShadowRoot(el)) return getWindow(el.host);
|
|
97
|
+
if (isDocument(el)) return el.defaultView ?? window;
|
|
98
|
+
if (isHTMLElement(el)) return el.ownerDocument.defaultView ?? window;
|
|
99
|
+
return window;
|
|
100
|
+
}
|
|
101
|
+
function getDocument(el) {
|
|
102
|
+
if (isDocument(el)) return el;
|
|
103
|
+
if (isWindow(el)) return el.document;
|
|
104
|
+
return el?.ownerDocument ?? document;
|
|
105
|
+
}
|
|
106
|
+
function getDocumentElement(el) {
|
|
107
|
+
return getDocument(el).documentElement;
|
|
108
|
+
}
|
|
109
|
+
function getNodeName(node) {
|
|
110
|
+
if (isHTMLElement(node)) return node.localName || "";
|
|
111
|
+
return "#document";
|
|
112
|
+
}
|
|
113
|
+
function getActiveElement(rootNode) {
|
|
114
|
+
let activeEl = rootNode.activeElement;
|
|
115
|
+
while (activeEl?.shadowRoot) {
|
|
116
|
+
const el = activeEl.shadowRoot.activeElement;
|
|
117
|
+
if (el === activeEl) break;
|
|
118
|
+
else activeEl = el;
|
|
119
|
+
}
|
|
120
|
+
return activeEl;
|
|
121
|
+
}
|
|
122
|
+
function getTabbableElements(el, includeEl) {
|
|
123
|
+
if (!el) return [];
|
|
124
|
+
const els = Array.from(el.querySelectorAll(focusableSelector));
|
|
125
|
+
const tabbableEls = els.filter(isTabbableElement);
|
|
126
|
+
if (includeEl && isTabbableElement(el)) tabbableEls.unshift(el);
|
|
127
|
+
tabbableEls.forEach((el$1, i) => {
|
|
128
|
+
if (isFrame(el$1) && el$1.contentDocument) {
|
|
129
|
+
const frameBody = el$1.contentDocument.body;
|
|
130
|
+
const allFrameTabbable = getTabbableElements(frameBody);
|
|
131
|
+
tabbableEls.splice(i, 1, ...allFrameTabbable);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
if (!tabbableEls.length && includeEl) return els;
|
|
135
|
+
return tabbableEls;
|
|
136
|
+
}
|
|
137
|
+
function getFirstTabbableElement(el, includeEl) {
|
|
138
|
+
const [first] = getTabbableElements(el, includeEl);
|
|
139
|
+
return first || null;
|
|
140
|
+
}
|
|
141
|
+
function getNextTabbableElement(el, current) {
|
|
142
|
+
const els = getTabbableElements(el);
|
|
143
|
+
const doc = el?.ownerDocument || document;
|
|
144
|
+
const currentElement = current ?? doc.activeElement;
|
|
145
|
+
if (!currentElement) return null;
|
|
146
|
+
return els[els.indexOf(currentElement) + 1] || null;
|
|
147
|
+
}
|
|
148
|
+
function getLastTabbableElement(el, includeEl) {
|
|
149
|
+
const els = getTabbableElements(el, includeEl);
|
|
150
|
+
return els[els.length - 1] || null;
|
|
151
|
+
}
|
|
152
|
+
function getTabbableElementEdges(el, includeEl) {
|
|
153
|
+
const els = getTabbableElements(el, includeEl);
|
|
154
|
+
const first = els[0] || null;
|
|
155
|
+
const last = els[els.length - 1] || null;
|
|
156
|
+
return [first, last];
|
|
157
|
+
}
|
|
158
|
+
function getParentNode(node) {
|
|
159
|
+
if (getNodeName(node) === "html") return node;
|
|
160
|
+
const result = node.assignedSlot || node.parentNode || isShadowRoot(node) || getDocumentElement(node);
|
|
161
|
+
return isShadowRoot(result) ? result.host : result;
|
|
162
|
+
}
|
|
163
|
+
function isInputElement(el) {
|
|
164
|
+
return isHTMLElement(el) && el.localName === "input";
|
|
165
|
+
}
|
|
166
|
+
function isEditableElement(el) {
|
|
167
|
+
if (el == null || !isHTMLElement(el)) return false;
|
|
168
|
+
try {
|
|
169
|
+
return isInputElement(el) && el.selectionStart != null || /(textarea|select)/.test(el.localName) || el.isContentEditable || el.getAttribute("contenteditable") === "true" || el.getAttribute("contenteditable") === "";
|
|
170
|
+
} catch {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function isFocusableElement(el) {
|
|
175
|
+
if (!el || el.closest("[inert]")) return false;
|
|
176
|
+
return el.matches(focusableSelector) && isVisibleElement(el);
|
|
177
|
+
}
|
|
178
|
+
function isTabbableElement(el) {
|
|
179
|
+
if (el != null && el.tabIndex > 0) return true;
|
|
180
|
+
return isFocusableElement(el) && !hasNegativeTabIndex(el);
|
|
181
|
+
}
|
|
182
|
+
function contains(parent, child) {
|
|
183
|
+
if (!parent || !child) return false;
|
|
184
|
+
if (!isHTMLElement(parent) || !isHTMLElement(child)) return false;
|
|
185
|
+
const rootNode = child.getRootNode();
|
|
186
|
+
if (parent === child) return true;
|
|
187
|
+
if (parent.contains(child)) return true;
|
|
188
|
+
if (isShadowRoot(rootNode)) {
|
|
189
|
+
let next = child;
|
|
190
|
+
while (next) {
|
|
191
|
+
if (parent === next) return true;
|
|
192
|
+
next = next.parentNode ?? (isShadowRoot(next) ? next.host : null);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
function getPx(value) {
|
|
198
|
+
if (require_assertion.isNumber(value)) return value;
|
|
199
|
+
if (require_assertion.isUndefined(value)) return 0;
|
|
200
|
+
if (value.includes("px")) return parseFloat(value);
|
|
201
|
+
let fontSize = 16;
|
|
202
|
+
if (createdDom()) {
|
|
203
|
+
const style = window.getComputedStyle(document.documentElement);
|
|
204
|
+
const computedFontSize = parseFloat(style.fontSize);
|
|
205
|
+
if (!isNaN(computedFontSize)) fontSize = computedFontSize;
|
|
206
|
+
}
|
|
207
|
+
return parseFloat(value) * fontSize;
|
|
208
|
+
}
|
|
209
|
+
function getTabIndex(node) {
|
|
210
|
+
if (node.tabIndex < 0) {
|
|
211
|
+
if ((/^(audio|video|details)$/.test(node.localName) || isEditableElement(node)) && !hasTabIndex(node)) return 0;
|
|
212
|
+
}
|
|
213
|
+
return node.tabIndex;
|
|
214
|
+
}
|
|
215
|
+
function dataAttr(condition) {
|
|
216
|
+
return condition ? "" : void 0;
|
|
217
|
+
}
|
|
218
|
+
function ariaAttr(condition) {
|
|
219
|
+
if (condition === "true") return "true";
|
|
220
|
+
if (condition === "false") return "false";
|
|
221
|
+
return !!condition ? true : void 0;
|
|
222
|
+
}
|
|
223
|
+
function uuid() {
|
|
224
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/x/g, () => Math.random().toString(16).slice(2, 3)).replace(/y/g, () => (Math.random() * 4 | 0).toString(16));
|
|
225
|
+
}
|
|
226
|
+
const focusableElList = [
|
|
227
|
+
"[tabindex]",
|
|
228
|
+
"input:not([type='hidden']):not([disabled])",
|
|
229
|
+
"select:not([disabled])",
|
|
230
|
+
"textarea:not([disabled])",
|
|
231
|
+
"button:not([disabled])",
|
|
232
|
+
"iframe",
|
|
233
|
+
"object",
|
|
234
|
+
"embed",
|
|
235
|
+
"a[href]",
|
|
236
|
+
"area[href]",
|
|
237
|
+
"audio[controls]",
|
|
238
|
+
"video[controls]",
|
|
239
|
+
"[contenteditable]:not([contenteditable='false'])",
|
|
240
|
+
"details > summary:first-of-type"
|
|
241
|
+
];
|
|
242
|
+
const focusableSelector = focusableElList.join(", ");
|
|
243
|
+
function getFocusableElements(el, includeEl = false) {
|
|
244
|
+
if (!el) return [];
|
|
245
|
+
const els = Array.from(el.querySelectorAll(focusableSelector));
|
|
246
|
+
const include = includeEl;
|
|
247
|
+
if (include && isHTMLElement(el) && isFocusableElement(el)) els.unshift(el);
|
|
248
|
+
const focusableEls = els.filter(isFocusableElement);
|
|
249
|
+
focusableEls.forEach((el$1, i) => {
|
|
250
|
+
if (isFrame(el$1) && el$1.contentDocument) {
|
|
251
|
+
const frameBody = el$1.contentDocument.body;
|
|
252
|
+
focusableEls.splice(i, 1, ...getFocusableElements(frameBody));
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
return focusableEls;
|
|
256
|
+
}
|
|
257
|
+
function getFirstFocusableElement(el, includeEl) {
|
|
258
|
+
const [first] = getFocusableElements(el, includeEl);
|
|
259
|
+
return first || null;
|
|
260
|
+
}
|
|
261
|
+
function setAttribute(el, attr, v) {
|
|
262
|
+
const prev = el.getAttribute(attr);
|
|
263
|
+
const exists = prev != null;
|
|
264
|
+
el.setAttribute(attr, v);
|
|
265
|
+
return () => {
|
|
266
|
+
if (!exists) el.removeAttribute(attr);
|
|
267
|
+
else el.setAttribute(attr, prev);
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
function setStyle(el, style) {
|
|
271
|
+
if (!el) return require_function.noop;
|
|
272
|
+
const prev = Object.keys(style).reduce((acc, key) => {
|
|
273
|
+
acc[key] = el.style.getPropertyValue(key);
|
|
274
|
+
return acc;
|
|
275
|
+
}, {});
|
|
276
|
+
Object.assign(el.style, style);
|
|
277
|
+
return () => {
|
|
278
|
+
Object.assign(el.style, prev);
|
|
279
|
+
if (el.style.length === 0) el.removeAttribute("style");
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
const LOCK_DATA_ATTR = "data-scroll-lock";
|
|
283
|
+
function scrollLock(el) {
|
|
284
|
+
const doc = getDocument(el);
|
|
285
|
+
const win = getWindow(doc);
|
|
286
|
+
const locked = doc.body.hasAttribute(LOCK_DATA_ATTR);
|
|
287
|
+
if (locked) return;
|
|
288
|
+
const scrollbarWidth = win.innerWidth - doc.documentElement.clientWidth;
|
|
289
|
+
const documentLeft = doc.documentElement.getBoundingClientRect().left;
|
|
290
|
+
const scrollbarX = Math.round(documentLeft) + doc.documentElement.scrollLeft;
|
|
291
|
+
const paddingProperty = scrollbarX ? "paddingLeft" : "paddingRight";
|
|
292
|
+
doc.body.setAttribute(LOCK_DATA_ATTR, "");
|
|
293
|
+
const setStyleForIOS = () => {
|
|
294
|
+
const offsetLeft = win.visualViewport?.offsetLeft ?? 0;
|
|
295
|
+
const offsetTop = win.visualViewport?.offsetTop ?? 0;
|
|
296
|
+
const restoreStyle = setStyle(doc.body, {
|
|
297
|
+
left: `${-(win.scrollX - Math.floor(offsetLeft))}px`,
|
|
298
|
+
overflow: "hidden",
|
|
299
|
+
[paddingProperty]: `${scrollbarWidth}px`,
|
|
300
|
+
position: "fixed",
|
|
301
|
+
right: "0",
|
|
302
|
+
top: `${-(win.scrollY - Math.floor(offsetTop))}px`
|
|
303
|
+
});
|
|
304
|
+
return () => {
|
|
305
|
+
restoreStyle();
|
|
306
|
+
win.scrollTo({
|
|
307
|
+
behavior: "instant",
|
|
308
|
+
left: win.scrollX,
|
|
309
|
+
top: win.scrollY
|
|
310
|
+
});
|
|
311
|
+
};
|
|
312
|
+
};
|
|
313
|
+
const unsubscribes = [setStyle(doc.documentElement, { "--scrollbar-width": `${scrollbarWidth}px` }), isIos() ? setStyleForIOS() : setStyle(doc.body, {
|
|
314
|
+
overflow: "hidden",
|
|
315
|
+
[paddingProperty]: `${scrollbarWidth}px`
|
|
316
|
+
})];
|
|
317
|
+
return () => {
|
|
318
|
+
unsubscribes.forEach((unsubscribe) => unsubscribe());
|
|
319
|
+
doc.body.removeAttribute(LOCK_DATA_ATTR);
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
//#endregion
|
|
324
|
+
exports.ariaAttr = ariaAttr;
|
|
325
|
+
exports.contains = contains;
|
|
326
|
+
exports.createdDom = createdDom;
|
|
327
|
+
exports.dataAttr = dataAttr;
|
|
328
|
+
exports.getActiveElement = getActiveElement;
|
|
329
|
+
exports.getDocument = getDocument;
|
|
330
|
+
exports.getDocumentElement = getDocumentElement;
|
|
331
|
+
exports.getFirstFocusableElement = getFirstFocusableElement;
|
|
332
|
+
exports.getFirstTabbableElement = getFirstTabbableElement;
|
|
333
|
+
exports.getFocusableElements = getFocusableElements;
|
|
334
|
+
exports.getLastTabbableElement = getLastTabbableElement;
|
|
335
|
+
exports.getNextTabbableElement = getNextTabbableElement;
|
|
336
|
+
exports.getNodeName = getNodeName;
|
|
337
|
+
exports.getParentNode = getParentNode;
|
|
338
|
+
exports.getPlatform = getPlatform;
|
|
339
|
+
exports.getPx = getPx;
|
|
340
|
+
exports.getTabIndex = getTabIndex;
|
|
341
|
+
exports.getTabbableElementEdges = getTabbableElementEdges;
|
|
342
|
+
exports.getTabbableElements = getTabbableElements;
|
|
343
|
+
exports.getUserAgent = getUserAgent;
|
|
344
|
+
exports.getWindow = getWindow;
|
|
345
|
+
exports.isActiveElement = isActiveElement;
|
|
346
|
+
exports.isAndroid = isAndroid;
|
|
347
|
+
exports.isApple = isApple;
|
|
348
|
+
exports.isChrome = isChrome;
|
|
349
|
+
exports.isDisabledElement = isDisabledElement;
|
|
350
|
+
exports.isDocument = isDocument;
|
|
351
|
+
exports.isEditableElement = isEditableElement;
|
|
352
|
+
exports.isFirefox = isFirefox;
|
|
353
|
+
exports.isFocusableElement = isFocusableElement;
|
|
354
|
+
exports.isFrame = isFrame;
|
|
355
|
+
exports.isHTMLElement = isHTMLElement;
|
|
356
|
+
exports.isHiddenElement = isHiddenElement;
|
|
357
|
+
exports.isIPad = isIPad;
|
|
358
|
+
exports.isIPhone = isIPhone;
|
|
359
|
+
exports.isInputElement = isInputElement;
|
|
360
|
+
exports.isIos = isIos;
|
|
361
|
+
exports.isMac = isMac;
|
|
362
|
+
exports.isNode = isNode;
|
|
363
|
+
exports.isSafari = isSafari;
|
|
364
|
+
exports.isShadowRoot = isShadowRoot;
|
|
365
|
+
exports.isTabbableElement = isTabbableElement;
|
|
366
|
+
exports.isTouchDevice = isTouchDevice;
|
|
367
|
+
exports.isVisibleElement = isVisibleElement;
|
|
368
|
+
exports.isVisualViewport = isVisualViewport;
|
|
369
|
+
exports.isWebKit = isWebKit;
|
|
370
|
+
exports.isWindow = isWindow;
|
|
371
|
+
exports.platform = platform;
|
|
372
|
+
exports.scrollLock = scrollLock;
|
|
373
|
+
exports.setAttribute = setAttribute;
|
|
374
|
+
exports.setStyle = setStyle;
|
|
375
|
+
exports.userAgent = userAgent;
|
|
376
|
+
exports.uuid = uuid;
|
|
377
|
+
exports.vendor = vendor;
|
|
378
|
+
//# sourceMappingURL=dom.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.cjs","names":["v: RegExp","el: any","el: HTMLElement","rootNode: Document | ShadowRoot","el?: Node","el: Element","el: Document | Node | null | ShadowRoot | undefined","el: Document | Element | Node | null | undefined | Window","node: Node | Window","el: HTMLElement | null","includeEl?: boolean","el","current?: HTMLElement | null","node: Node","el: EventTarget | HTMLElement | null","parent?: EventTarget | HTMLElement | null","child?: EventTarget | HTMLElement | null","next: Node | null | ShadowRoot","value: number | string | undefined","node: HTMLElement | SVGElement","condition: any","el: null | Pick<HTMLElement, \"querySelectorAll\">","attr: string","v: string","el: HTMLElement | null | undefined","style: Partial<\n CSSStyleDeclaration | { [key: `--${string}`]: number | string }\n >","noop"],"sources":["../../src/dom.ts"],"sourcesContent":["import { isArray, isNumber, isObject, isUndefined } from \"./assertion\"\nimport { noop } from \"./function\"\n\nexport function createdDom(): boolean {\n return !!(\n typeof window !== \"undefined\" &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n window.document?.createElement\n )\n}\n\nexport function getPlatform(): string {\n return (navigator as any).userAgentData?.platform ?? navigator.platform\n}\n\nexport function getUserAgent(): string {\n const userAgentData = (navigator as any).userAgentData\n\n if (userAgentData && isArray(userAgentData.brands)) {\n return userAgentData.brands\n .map(\n ({ brand, version }: { brand: string; version: string }) =>\n `${brand}/${version}`,\n )\n .join(\" \")\n }\n\n return navigator.userAgent\n}\n\nexport function vendor(v: RegExp): boolean {\n return createdDom() && v.test(navigator.vendor)\n}\n\nexport function platform(v: RegExp): boolean {\n return createdDom() && v.test(getPlatform())\n}\n\nexport function userAgent(v: RegExp): boolean {\n return createdDom() && v.test(getUserAgent())\n}\n\nexport function isMac(): boolean {\n return platform(/^Mac/i)\n}\n\nexport function isIPhone(): boolean {\n return platform(/^iPhone/i)\n}\n\nexport function isIPad(): boolean {\n return platform(/^iPad/i) || (isMac() && navigator.maxTouchPoints > 1)\n}\n\nexport function isIos(): boolean {\n return isIPhone() || isIPad()\n}\n\nexport function isAndroid(): boolean {\n return platform(/^Android/i)\n}\n\nexport function isApple(): boolean {\n return isMac() || isIos()\n}\n\nexport function isSafari(): boolean {\n return isApple() && vendor(/apple/i)\n}\n\nexport function isFirefox(): boolean {\n return userAgent(/Firefox/i)\n}\n\nexport function isChrome(): boolean {\n return userAgent(/Chrome/i)\n}\n\nexport function isWebKit(): boolean {\n return userAgent(/AppleWebKit/i) && !isChrome()\n}\n\nexport function isHTMLElement(el: any): el is HTMLElement {\n return (\n isObject(el) &&\n el.nodeType === Node.ELEMENT_NODE &&\n typeof el.nodeName === \"string\"\n )\n}\n\nexport function isWindow(el: any): el is Window {\n return isObject(el) && el === el.window\n}\n\nexport function isDocument(el: any): el is Document {\n return isObject(el) && el.nodeType === Node.DOCUMENT_NODE\n}\n\nexport function isVisualViewport(el: any): el is VisualViewport {\n return isObject(el) && el.constructor.name === \"VisualViewport\"\n}\n\nexport function isNode(el: any): el is Node {\n return isObject(el) && el.nodeType !== undefined\n}\n\nexport function isShadowRoot(el: any): el is ShadowRoot {\n return (\n isNode(el) && el.nodeType === Node.DOCUMENT_FRAGMENT_NODE && \"host\" in el\n )\n}\n\nexport function isFrame(el: any): el is HTMLIFrameElement {\n return isHTMLElement(el) && el.tagName === \"IFRAME\"\n}\n\nexport function isActiveElement(\n el: HTMLElement,\n rootNode: Document | ShadowRoot,\n): boolean {\n return getActiveElement(rootNode) === el\n}\n\nexport function isHiddenElement(el: HTMLElement): boolean {\n if (el.parentElement && isHiddenElement(el.parentElement)) return true\n\n return el.hidden\n}\n\nexport function isDisabledElement(el: HTMLElement): boolean {\n return (\n Boolean(el.getAttribute(\"disabled\")) ||\n Boolean(el.getAttribute(\"data-disabled\")) ||\n Boolean(el.getAttribute(\"aria-disabled\"))\n )\n}\n\nexport function isVisibleElement(el?: Node): boolean {\n if (!isHTMLElement(el)) return false\n\n return (\n el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0\n )\n}\n\nexport function isTouchDevice(): boolean {\n return \"ontouchstart\" in window\n}\n\nconst hasTabIndex = (el: Element): boolean =>\n !Number.isNaN(parseInt(el.getAttribute(\"tabindex\") || \"0\", 10))\n\nconst hasNegativeTabIndex = (el: Element): boolean =>\n parseInt(el.getAttribute(\"tabindex\") || \"0\", 10) < 0\n\nexport function getWindow(\n el: Document | Node | null | ShadowRoot | undefined,\n): typeof globalThis & Window {\n if (isShadowRoot(el)) return getWindow(el.host)\n if (isDocument(el)) return el.defaultView ?? window\n if (isHTMLElement(el)) return el.ownerDocument.defaultView ?? window\n\n return window\n}\n\nexport function getDocument(\n el: Document | Element | Node | null | undefined | Window,\n): Document {\n if (isDocument(el)) return el\n if (isWindow(el)) return el.document\n\n return el?.ownerDocument ?? document\n}\n\nexport function getDocumentElement(\n el: Document | Element | Node | null | undefined | Window,\n): HTMLElement {\n return getDocument(el).documentElement\n}\n\nexport function getNodeName(node: Node | Window): string {\n if (isHTMLElement(node)) return node.localName || \"\"\n\n return \"#document\"\n}\n\nexport function getActiveElement(\n rootNode: Document | ShadowRoot,\n): HTMLElement | null {\n let activeEl = rootNode.activeElement as HTMLElement | null\n\n while (activeEl?.shadowRoot) {\n const el = activeEl.shadowRoot.activeElement as HTMLElement | null\n\n if (el === activeEl) {\n break\n } else {\n activeEl = el\n }\n }\n\n return activeEl\n}\n\nexport function getTabbableElements(\n el: HTMLElement | null,\n includeEl?: boolean,\n) {\n if (!el) return []\n const els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n const tabbableEls = els.filter(isTabbableElement)\n\n if (includeEl && isTabbableElement(el)) {\n tabbableEls.unshift(el)\n }\n\n tabbableEls.forEach((el, i) => {\n if (isFrame(el) && el.contentDocument) {\n const frameBody = el.contentDocument.body\n const allFrameTabbable = getTabbableElements(frameBody)\n tabbableEls.splice(i, 1, ...allFrameTabbable)\n }\n })\n\n if (!tabbableEls.length && includeEl) {\n return els\n }\n\n return tabbableEls\n}\n\nexport function getFirstTabbableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const [first] = getTabbableElements(el, includeEl)\n\n return first || null\n}\n\nexport function getNextTabbableElement(\n el: HTMLElement | null,\n current?: HTMLElement | null,\n): HTMLElement | null {\n const els = getTabbableElements(el)\n const doc = el?.ownerDocument || document\n const currentElement = current ?? (doc.activeElement as HTMLElement | null)\n\n if (!currentElement) return null\n\n return els[els.indexOf(currentElement) + 1] || null\n}\n\nexport function getLastTabbableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const els = getTabbableElements(el, includeEl)\n\n return els[els.length - 1] || null\n}\n\nexport function getTabbableElementEdges(\n el: HTMLElement | null,\n includeEl?: boolean,\n): [HTMLElement | null, HTMLElement | null] {\n const els = getTabbableElements(el, includeEl)\n const first = els[0] || null\n const last = els[els.length - 1] || null\n\n return [first, last]\n}\n\nexport function getParentNode(node: Node): Node {\n if (getNodeName(node) === \"html\") return node\n\n const result =\n (node as any).assignedSlot ||\n node.parentNode ||\n isShadowRoot(node) ||\n getDocumentElement(node)\n\n return isShadowRoot(result) ? result.host : result\n}\n\nexport function isInputElement(el: any): el is HTMLInputElement {\n return isHTMLElement(el) && el.localName === \"input\"\n}\n\nexport function isEditableElement(\n el: EventTarget | HTMLElement | null,\n): boolean {\n if (el == null || !isHTMLElement(el)) return false\n try {\n return (\n (isInputElement(el) && el.selectionStart != null) ||\n /(textarea|select)/.test(el.localName) ||\n el.isContentEditable ||\n el.getAttribute(\"contenteditable\") === \"true\" ||\n el.getAttribute(\"contenteditable\") === \"\"\n )\n } catch {\n return false\n }\n}\n\nexport function isFocusableElement(el: HTMLElement | null): el is HTMLElement {\n if (!el || el.closest(\"[inert]\")) return false\n\n return el.matches(focusableSelector) && isVisibleElement(el)\n}\n\nexport function isTabbableElement(el: HTMLElement | null): el is HTMLElement {\n if (el != null && el.tabIndex > 0) return true\n return isFocusableElement(el) && !hasNegativeTabIndex(el as Element)\n}\n\nexport function contains(\n parent?: EventTarget | HTMLElement | null,\n child?: EventTarget | HTMLElement | null,\n): boolean {\n if (!parent || !child) return false\n if (!isHTMLElement(parent) || !isHTMLElement(child)) return false\n\n const rootNode = child.getRootNode()\n\n if (parent === child) return true\n if (parent.contains(child)) return true\n\n if (isShadowRoot(rootNode)) {\n let next: Node | null | ShadowRoot = child\n\n while (next) {\n if (parent === next) return true\n\n next = next.parentNode ?? (isShadowRoot(next) ? next.host : null)\n }\n }\n\n return false\n}\n\nexport function getPx(value: number | string | undefined): number {\n if (isNumber(value)) return value\n\n if (isUndefined(value)) return 0\n\n if (value.includes(\"px\")) return parseFloat(value)\n\n let fontSize = 16\n\n if (createdDom()) {\n const style = window.getComputedStyle(document.documentElement)\n\n const computedFontSize = parseFloat(style.fontSize)\n\n if (!isNaN(computedFontSize)) fontSize = computedFontSize\n }\n\n return parseFloat(value) * fontSize\n}\n\nexport function getTabIndex(node: HTMLElement | SVGElement) {\n if (node.tabIndex < 0) {\n if (\n (/^(audio|video|details)$/.test(node.localName) ||\n isEditableElement(node)) &&\n !hasTabIndex(node)\n ) {\n return 0\n }\n }\n return node.tabIndex\n}\n\nexport function dataAttr(condition: any): string | undefined {\n return (condition ? \"\" : undefined) as string | undefined\n}\n\ntype Booleanish = \"false\" | \"true\" | boolean\n\nexport function ariaAttr(condition: any): Booleanish | undefined {\n if (condition === \"true\") return \"true\"\n if (condition === \"false\") return \"false\"\n\n return !!condition ? true : undefined\n}\n\nexport function uuid() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n .replace(/x/g, () => Math.random().toString(16).slice(2, 3))\n .replace(/y/g, () => ((Math.random() * 4) | 0).toString(16))\n}\n\nconst focusableElList = [\n \"[tabindex]\",\n \"input:not([type='hidden']):not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"button:not([disabled])\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"a[href]\",\n \"area[href]\",\n \"audio[controls]\",\n \"video[controls]\",\n \"[contenteditable]:not([contenteditable='false'])\",\n \"details > summary:first-of-type\",\n]\n\nconst focusableSelector = focusableElList.join(\", \")\n\nexport function getFocusableElements(\n el: null | Pick<HTMLElement, \"querySelectorAll\">,\n includeEl = false,\n) {\n if (!el) return []\n const els = Array.from(el.querySelectorAll<HTMLElement>(focusableSelector))\n\n const include = includeEl\n\n if (include && isHTMLElement(el) && isFocusableElement(el)) {\n els.unshift(el)\n }\n\n const focusableEls = els.filter(isFocusableElement)\n\n focusableEls.forEach((el, i) => {\n if (isFrame(el) && el.contentDocument) {\n const frameBody = el.contentDocument.body\n\n focusableEls.splice(i, 1, ...getFocusableElements(frameBody))\n }\n })\n\n return focusableEls\n}\n\nexport function getFirstFocusableElement(\n el: HTMLElement | null,\n includeEl?: boolean,\n): HTMLElement | null {\n const [first] = getFocusableElements(el, includeEl)\n\n return first || null\n}\n\nexport function setAttribute(el: Element, attr: string, v: string) {\n const prev = el.getAttribute(attr)\n const exists = prev != null\n\n el.setAttribute(attr, v)\n\n return () => {\n if (!exists) {\n el.removeAttribute(attr)\n } else {\n el.setAttribute(attr, prev)\n }\n }\n}\n\nexport function setStyle(\n el: HTMLElement | null | undefined,\n style: Partial<\n CSSStyleDeclaration | { [key: `--${string}`]: number | string }\n >,\n) {\n if (!el) return noop\n\n const prev = Object.keys(style).reduce<{ [key: string]: string }>(\n (acc, key) => {\n acc[key] = el.style.getPropertyValue(key)\n\n return acc\n },\n {},\n )\n\n Object.assign(el.style, style)\n\n return () => {\n Object.assign(el.style, prev)\n\n if (el.style.length === 0) el.removeAttribute(\"style\")\n }\n}\n\nconst LOCK_DATA_ATTR = \"data-scroll-lock\"\n\nexport function scrollLock(\n el: Document | Element | Node | null | undefined | Window,\n) {\n const doc = getDocument(el)\n const win = getWindow(doc)\n\n const locked = doc.body.hasAttribute(LOCK_DATA_ATTR)\n\n if (locked) return\n\n const scrollbarWidth = win.innerWidth - doc.documentElement.clientWidth\n const documentLeft = doc.documentElement.getBoundingClientRect().left\n const scrollbarX = Math.round(documentLeft) + doc.documentElement.scrollLeft\n const paddingProperty = scrollbarX ? \"paddingLeft\" : \"paddingRight\"\n\n doc.body.setAttribute(LOCK_DATA_ATTR, \"\")\n\n const setStyleForIOS = () => {\n const offsetLeft = win.visualViewport?.offsetLeft ?? 0\n const offsetTop = win.visualViewport?.offsetTop ?? 0\n\n const restoreStyle = setStyle(doc.body, {\n left: `${-(win.scrollX - Math.floor(offsetLeft))}px`,\n overflow: \"hidden\",\n [paddingProperty]: `${scrollbarWidth}px`,\n position: \"fixed\",\n right: \"0\",\n top: `${-(win.scrollY - Math.floor(offsetTop))}px`,\n })\n\n return () => {\n restoreStyle()\n win.scrollTo({ behavior: \"instant\", left: win.scrollX, top: win.scrollY })\n }\n }\n\n const unsubscribes = [\n setStyle(doc.documentElement, {\n \"--scrollbar-width\": `${scrollbarWidth}px`,\n }),\n isIos()\n ? setStyleForIOS()\n : setStyle(doc.body, {\n overflow: \"hidden\",\n [paddingProperty]: `${scrollbarWidth}px`,\n }),\n ]\n\n return () => {\n unsubscribes.forEach((unsubscribe) => unsubscribe())\n\n doc.body.removeAttribute(LOCK_DATA_ATTR)\n }\n}\n"],"mappings":";;;;AAGA,SAAgB,aAAsB;AACpC,kBACS,WAAW,eAElB,OAAO,UAAU;AAEpB;AAED,SAAgB,cAAsB;AACpC,QAAQ,UAAkB,eAAe,YAAY,UAAU;AAChE;AAED,SAAgB,eAAuB;CACrC,MAAM,gBAAiB,UAAkB;AAEzC,KAAI,iBAAiB,0BAAQ,cAAc,OAAO,CAChD,QAAO,cAAc,OAClB,IACC,CAAC,EAAE,OAAO,SAA6C,QAClD,MAAM,GAAG,UACf,CACA,KAAK,IAAI;AAGd,QAAO,UAAU;AAClB;AAED,SAAgB,OAAOA,GAAoB;AACzC,QAAO,YAAY,IAAI,EAAE,KAAK,UAAU,OAAO;AAChD;AAED,SAAgB,SAASA,GAAoB;AAC3C,QAAO,YAAY,IAAI,EAAE,KAAK,aAAa,CAAC;AAC7C;AAED,SAAgB,UAAUA,GAAoB;AAC5C,QAAO,YAAY,IAAI,EAAE,KAAK,cAAc,CAAC;AAC9C;AAED,SAAgB,QAAiB;AAC/B,QAAO,SAAS,QAAQ;AACzB;AAED,SAAgB,WAAoB;AAClC,QAAO,SAAS,WAAW;AAC5B;AAED,SAAgB,SAAkB;AAChC,QAAO,SAAS,SAAS,IAAK,OAAO,IAAI,UAAU,iBAAiB;AACrE;AAED,SAAgB,QAAiB;AAC/B,QAAO,UAAU,IAAI,QAAQ;AAC9B;AAED,SAAgB,YAAqB;AACnC,QAAO,SAAS,YAAY;AAC7B;AAED,SAAgB,UAAmB;AACjC,QAAO,OAAO,IAAI,OAAO;AAC1B;AAED,SAAgB,WAAoB;AAClC,QAAO,SAAS,IAAI,OAAO,SAAS;AACrC;AAED,SAAgB,YAAqB;AACnC,QAAO,UAAU,WAAW;AAC7B;AAED,SAAgB,WAAoB;AAClC,QAAO,UAAU,UAAU;AAC5B;AAED,SAAgB,WAAoB;AAClC,QAAO,UAAU,eAAe,KAAK,UAAU;AAChD;AAED,SAAgB,cAAcC,IAA4B;AACxD,QACE,2BAAS,GAAG,IACZ,GAAG,aAAa,KAAK,uBACd,GAAG,aAAa;AAE1B;AAED,SAAgB,SAASA,IAAuB;AAC9C,QAAO,2BAAS,GAAG,IAAI,OAAO,GAAG;AAClC;AAED,SAAgB,WAAWA,IAAyB;AAClD,QAAO,2BAAS,GAAG,IAAI,GAAG,aAAa,KAAK;AAC7C;AAED,SAAgB,iBAAiBA,IAA+B;AAC9D,QAAO,2BAAS,GAAG,IAAI,GAAG,YAAY,SAAS;AAChD;AAED,SAAgB,OAAOA,IAAqB;AAC1C,QAAO,2BAAS,GAAG,IAAI,GAAG;AAC3B;AAED,SAAgB,aAAaA,IAA2B;AACtD,QACE,OAAO,GAAG,IAAI,GAAG,aAAa,KAAK,0BAA0B,UAAU;AAE1E;AAED,SAAgB,QAAQA,IAAkC;AACxD,QAAO,cAAc,GAAG,IAAI,GAAG,YAAY;AAC5C;AAED,SAAgB,gBACdC,IACAC,UACS;AACT,QAAO,iBAAiB,SAAS,KAAK;AACvC;AAED,SAAgB,gBAAgBD,IAA0B;AACxD,KAAI,GAAG,iBAAiB,gBAAgB,GAAG,cAAc,CAAE,QAAO;AAElE,QAAO,GAAG;AACX;AAED,SAAgB,kBAAkBA,IAA0B;AAC1D,QACE,QAAQ,GAAG,aAAa,WAAW,CAAC,IACpC,QAAQ,GAAG,aAAa,gBAAgB,CAAC,IACzC,QAAQ,GAAG,aAAa,gBAAgB,CAAC;AAE5C;AAED,SAAgB,iBAAiBE,IAAoB;AACnD,MAAK,cAAc,GAAG,CAAE,QAAO;AAE/B,QACE,GAAG,cAAc,KAAK,GAAG,eAAe,KAAK,GAAG,gBAAgB,CAAC,SAAS;AAE7E;AAED,SAAgB,gBAAyB;AACvC,QAAO,kBAAkB;AAC1B;AAED,MAAM,cAAc,CAACC,QAClB,OAAO,MAAM,SAAS,GAAG,aAAa,WAAW,IAAI,KAAK,GAAG,CAAC;AAEjE,MAAM,sBAAsB,CAACA,OAC3B,SAAS,GAAG,aAAa,WAAW,IAAI,KAAK,GAAG,GAAG;AAErD,SAAgB,UACdC,IAC4B;AAC5B,KAAI,aAAa,GAAG,CAAE,QAAO,UAAU,GAAG,KAAK;AAC/C,KAAI,WAAW,GAAG,CAAE,QAAO,GAAG,eAAe;AAC7C,KAAI,cAAc,GAAG,CAAE,QAAO,GAAG,cAAc,eAAe;AAE9D,QAAO;AACR;AAED,SAAgB,YACdC,IACU;AACV,KAAI,WAAW,GAAG,CAAE,QAAO;AAC3B,KAAI,SAAS,GAAG,CAAE,QAAO,GAAG;AAE5B,QAAO,IAAI,iBAAiB;AAC7B;AAED,SAAgB,mBACdA,IACa;AACb,QAAO,YAAY,GAAG,CAAC;AACxB;AAED,SAAgB,YAAYC,MAA6B;AACvD,KAAI,cAAc,KAAK,CAAE,QAAO,KAAK,aAAa;AAElD,QAAO;AACR;AAED,SAAgB,iBACdL,UACoB;CACpB,IAAI,WAAW,SAAS;AAExB,QAAO,UAAU,YAAY;EAC3B,MAAM,KAAK,SAAS,WAAW;AAE/B,MAAI,OAAO,SACT;MAEA,YAAW;CAEd;AAED,QAAO;AACR;AAED,SAAgB,oBACdM,IACAC,WACA;AACA,MAAK,GAAI,QAAO,CAAE;CAClB,MAAM,MAAM,MAAM,KAAK,GAAG,iBAA8B,kBAAkB,CAAC;CAC3E,MAAM,cAAc,IAAI,OAAO,kBAAkB;AAEjD,KAAI,aAAa,kBAAkB,GAAG,CACpC,aAAY,QAAQ,GAAG;AAGzB,aAAY,QAAQ,CAACC,MAAI,MAAM;AAC7B,MAAI,QAAQA,KAAG,IAAIA,KAAG,iBAAiB;GACrC,MAAM,YAAYA,KAAG,gBAAgB;GACrC,MAAM,mBAAmB,oBAAoB,UAAU;AACvD,eAAY,OAAO,GAAG,GAAG,GAAG,iBAAiB;EAC9C;CACF,EAAC;AAEF,MAAK,YAAY,UAAU,UACzB,QAAO;AAGT,QAAO;AACR;AAED,SAAgB,wBACdF,IACAC,WACoB;CACpB,MAAM,CAAC,MAAM,GAAG,oBAAoB,IAAI,UAAU;AAElD,QAAO,SAAS;AACjB;AAED,SAAgB,uBACdD,IACAG,SACoB;CACpB,MAAM,MAAM,oBAAoB,GAAG;CACnC,MAAM,MAAM,IAAI,iBAAiB;CACjC,MAAM,iBAAiB,WAAY,IAAI;AAEvC,MAAK,eAAgB,QAAO;AAE5B,QAAO,IAAI,IAAI,QAAQ,eAAe,GAAG,MAAM;AAChD;AAED,SAAgB,uBACdH,IACAC,WACoB;CACpB,MAAM,MAAM,oBAAoB,IAAI,UAAU;AAE9C,QAAO,IAAI,IAAI,SAAS,MAAM;AAC/B;AAED,SAAgB,wBACdD,IACAC,WAC0C;CAC1C,MAAM,MAAM,oBAAoB,IAAI,UAAU;CAC9C,MAAM,QAAQ,IAAI,MAAM;CACxB,MAAM,OAAO,IAAI,IAAI,SAAS,MAAM;AAEpC,QAAO,CAAC,OAAO,IAAK;AACrB;AAED,SAAgB,cAAcG,MAAkB;AAC9C,KAAI,YAAY,KAAK,KAAK,OAAQ,QAAO;CAEzC,MAAM,SACH,KAAa,gBACd,KAAK,cACL,aAAa,KAAK,IAClB,mBAAmB,KAAK;AAE1B,QAAO,aAAa,OAAO,GAAG,OAAO,OAAO;AAC7C;AAED,SAAgB,eAAeZ,IAAiC;AAC9D,QAAO,cAAc,GAAG,IAAI,GAAG,cAAc;AAC9C;AAED,SAAgB,kBACda,IACS;AACT,KAAI,MAAM,SAAS,cAAc,GAAG,CAAE,QAAO;AAC7C,KAAI;AACF,SACG,eAAe,GAAG,IAAI,GAAG,kBAAkB,QAC5C,oBAAoB,KAAK,GAAG,UAAU,IACtC,GAAG,qBACH,GAAG,aAAa,kBAAkB,KAAK,UACvC,GAAG,aAAa,kBAAkB,KAAK;CAE1C,QAAO;AACN,SAAO;CACR;AACF;AAED,SAAgB,mBAAmBL,IAA2C;AAC5E,MAAK,MAAM,GAAG,QAAQ,UAAU,CAAE,QAAO;AAEzC,QAAO,GAAG,QAAQ,kBAAkB,IAAI,iBAAiB,GAAG;AAC7D;AAED,SAAgB,kBAAkBA,IAA2C;AAC3E,KAAI,MAAM,QAAQ,GAAG,WAAW,EAAG,QAAO;AAC1C,QAAO,mBAAmB,GAAG,KAAK,oBAAoB,GAAc;AACrE;AAED,SAAgB,SACdM,QACAC,OACS;AACT,MAAK,WAAW,MAAO,QAAO;AAC9B,MAAK,cAAc,OAAO,KAAK,cAAc,MAAM,CAAE,QAAO;CAE5D,MAAM,WAAW,MAAM,aAAa;AAEpC,KAAI,WAAW,MAAO,QAAO;AAC7B,KAAI,OAAO,SAAS,MAAM,CAAE,QAAO;AAEnC,KAAI,aAAa,SAAS,EAAE;EAC1B,IAAIC,OAAiC;AAErC,SAAO,MAAM;AACX,OAAI,WAAW,KAAM,QAAO;AAE5B,UAAO,KAAK,eAAe,aAAa,KAAK,GAAG,KAAK,OAAO;EAC7D;CACF;AAED,QAAO;AACR;AAED,SAAgB,MAAMC,OAA4C;AAChE,KAAI,2BAAS,MAAM,CAAE,QAAO;AAE5B,KAAI,8BAAY,MAAM,CAAE,QAAO;AAE/B,KAAI,MAAM,SAAS,KAAK,CAAE,QAAO,WAAW,MAAM;CAElD,IAAI,WAAW;AAEf,KAAI,YAAY,EAAE;EAChB,MAAM,QAAQ,OAAO,iBAAiB,SAAS,gBAAgB;EAE/D,MAAM,mBAAmB,WAAW,MAAM,SAAS;AAEnD,OAAK,MAAM,iBAAiB,CAAE,YAAW;CAC1C;AAED,QAAO,WAAW,MAAM,GAAG;AAC5B;AAED,SAAgB,YAAYC,MAAgC;AAC1D,KAAI,KAAK,WAAW,GAClB;OACG,0BAA0B,KAAK,KAAK,UAAU,IAC7C,kBAAkB,KAAK,MACxB,YAAY,KAAK,CAElB,QAAO;CACR;AAEH,QAAO,KAAK;AACb;AAED,SAAgB,SAASC,WAAoC;AAC3D,QAAQ,YAAY;AACrB;AAID,SAAgB,SAASA,WAAwC;AAC/D,KAAI,cAAc,OAAQ,QAAO;AACjC,KAAI,cAAc,QAAS,QAAO;AAElC,UAAS,YAAY;AACtB;AAED,SAAgB,OAAO;AACrB,QAAO,uCACJ,QAAQ,MAAM,MAAM,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAC3D,QAAQ,MAAM,MAAM,CAAE,KAAK,QAAQ,GAAG,IAAK,GAAG,SAAS,GAAG,CAAC;AAC/D;AAED,MAAM,kBAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD;AAED,MAAM,oBAAoB,gBAAgB,KAAK,KAAK;AAEpD,SAAgB,qBACdC,IACA,YAAY,OACZ;AACA,MAAK,GAAI,QAAO,CAAE;CAClB,MAAM,MAAM,MAAM,KAAK,GAAG,iBAA8B,kBAAkB,CAAC;CAE3E,MAAM,UAAU;AAEhB,KAAI,WAAW,cAAc,GAAG,IAAI,mBAAmB,GAAG,CACxD,KAAI,QAAQ,GAAG;CAGjB,MAAM,eAAe,IAAI,OAAO,mBAAmB;AAEnD,cAAa,QAAQ,CAACV,MAAI,MAAM;AAC9B,MAAI,QAAQA,KAAG,IAAIA,KAAG,iBAAiB;GACrC,MAAM,YAAYA,KAAG,gBAAgB;AAErC,gBAAa,OAAO,GAAG,GAAG,GAAG,qBAAqB,UAAU,CAAC;EAC9D;CACF,EAAC;AAEF,QAAO;AACR;AAED,SAAgB,yBACdF,IACAC,WACoB;CACpB,MAAM,CAAC,MAAM,GAAG,qBAAqB,IAAI,UAAU;AAEnD,QAAO,SAAS;AACjB;AAED,SAAgB,aAAaL,IAAaiB,MAAcC,GAAW;CACjE,MAAM,OAAO,GAAG,aAAa,KAAK;CAClC,MAAM,SAAS,QAAQ;AAEvB,IAAG,aAAa,MAAM,EAAE;AAExB,QAAO,MAAM;AACX,OAAK,OACH,IAAG,gBAAgB,KAAK;MAExB,IAAG,aAAa,MAAM,KAAK;CAE9B;AACF;AAED,SAAgB,SACdC,IACAC,OAGA;AACA,MAAK,GAAI,QAAOC;CAEhB,MAAM,OAAO,OAAO,KAAK,MAAM,CAAC,OAC9B,CAAC,KAAK,QAAQ;AACZ,MAAI,OAAO,GAAG,MAAM,iBAAiB,IAAI;AAEzC,SAAO;CACR,GACD,CAAE,EACH;AAED,QAAO,OAAO,GAAG,OAAO,MAAM;AAE9B,QAAO,MAAM;AACX,SAAO,OAAO,GAAG,OAAO,KAAK;AAE7B,MAAI,GAAG,MAAM,WAAW,EAAG,IAAG,gBAAgB,QAAQ;CACvD;AACF;AAED,MAAM,iBAAiB;AAEvB,SAAgB,WACdnB,IACA;CACA,MAAM,MAAM,YAAY,GAAG;CAC3B,MAAM,MAAM,UAAU,IAAI;CAE1B,MAAM,SAAS,IAAI,KAAK,aAAa,eAAe;AAEpD,KAAI,OAAQ;CAEZ,MAAM,iBAAiB,IAAI,aAAa,IAAI,gBAAgB;CAC5D,MAAM,eAAe,IAAI,gBAAgB,uBAAuB,CAAC;CACjE,MAAM,aAAa,KAAK,MAAM,aAAa,GAAG,IAAI,gBAAgB;CAClE,MAAM,kBAAkB,aAAa,gBAAgB;AAErD,KAAI,KAAK,aAAa,gBAAgB,GAAG;CAEzC,MAAM,iBAAiB,MAAM;EAC3B,MAAM,aAAa,IAAI,gBAAgB,cAAc;EACrD,MAAM,YAAY,IAAI,gBAAgB,aAAa;EAEnD,MAAM,eAAe,SAAS,IAAI,MAAM;GACtC,WAAW,IAAI,UAAU,KAAK,MAAM,WAAW,EAAE;GACjD,UAAU;IACT,qBAAqB,eAAe;GACrC,UAAU;GACV,OAAO;GACP,UAAU,IAAI,UAAU,KAAK,MAAM,UAAU,EAAE;EAChD,EAAC;AAEF,SAAO,MAAM;AACX,iBAAc;AACd,OAAI,SAAS;IAAE,UAAU;IAAW,MAAM,IAAI;IAAS,KAAK,IAAI;GAAS,EAAC;EAC3E;CACF;CAED,MAAM,eAAe,CACnB,SAAS,IAAI,iBAAiB,EAC5B,wBAAwB,eAAe,IACxC,EAAC,EACF,OAAO,GACH,gBAAgB,GAChB,SAAS,IAAI,MAAM;EACjB,UAAU;GACT,qBAAqB,eAAe;CACtC,EAAC,AACP;AAED,QAAO,MAAM;AACX,eAAa,QAAQ,CAAC,gBAAgB,aAAa,CAAC;AAEpD,MAAI,KAAK,gBAAgB,eAAe;CACzC;AACF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const require_assertion = require('./assertion.cjs');
|
|
2
|
+
const require_function = require('./function.cjs');
|
|
3
|
+
const require_dom = require('./dom.cjs');
|
|
4
|
+
|
|
5
|
+
//#region src/event.ts
|
|
6
|
+
function isMouseEvent(ev) {
|
|
7
|
+
const win = getEventWindow(ev);
|
|
8
|
+
if (typeof win.PointerEvent !== "undefined" && ev instanceof win.PointerEvent) return !!(ev.pointerType === "mouse");
|
|
9
|
+
return ev instanceof win.MouseEvent;
|
|
10
|
+
}
|
|
11
|
+
function isTouchEvent(ev) {
|
|
12
|
+
return !!ev.touches;
|
|
13
|
+
}
|
|
14
|
+
function isMultiTouchEvent(ev) {
|
|
15
|
+
return isTouchEvent(ev) && ev.touches.length > 1;
|
|
16
|
+
}
|
|
17
|
+
function getEventWindow(ev) {
|
|
18
|
+
return ev.view ?? window;
|
|
19
|
+
}
|
|
20
|
+
function pointFromTouch(e, type = process.env.NODE_ENV === "test" ? "client" : "page") {
|
|
21
|
+
const point = e.touches[0] || e.changedTouches[0];
|
|
22
|
+
return {
|
|
23
|
+
x: point?.[`${type}X`] ?? 0,
|
|
24
|
+
y: point?.[`${type}Y`] ?? 0
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function pointFromMouse(point, type = "page") {
|
|
28
|
+
return {
|
|
29
|
+
x: point[`${type}X`],
|
|
30
|
+
y: point[`${type}Y`]
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function getEventPoint(ev, type = process.env.NODE_ENV === "test" ? "client" : "page") {
|
|
34
|
+
return isTouchEvent(ev) ? pointFromTouch(ev, type) : pointFromMouse(ev, type);
|
|
35
|
+
}
|
|
36
|
+
function addDomEvent(target, type, cb, options) {
|
|
37
|
+
target.addEventListener(type, cb, options);
|
|
38
|
+
return () => {
|
|
39
|
+
target.removeEventListener(type, cb, options);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function focusTrap(el, onFocus) {
|
|
43
|
+
if (!el) return require_function.noop;
|
|
44
|
+
const doc = require_dom.getDocument(el);
|
|
45
|
+
function onKeyDown(ev) {
|
|
46
|
+
if (ev.key !== "Tab") return;
|
|
47
|
+
let elToFocus = null;
|
|
48
|
+
const [firstTabbable, lastTabbable] = require_dom.getTabbableElementEdges(el, true);
|
|
49
|
+
if (ev.shiftKey) {
|
|
50
|
+
if (doc.activeElement === firstTabbable) elToFocus = lastTabbable;
|
|
51
|
+
} else if (doc.activeElement === lastTabbable) elToFocus = firstTabbable;
|
|
52
|
+
if (!elToFocus) return;
|
|
53
|
+
ev.preventDefault();
|
|
54
|
+
if (require_assertion.isFunction(onFocus)) onFocus(elToFocus);
|
|
55
|
+
else elToFocus.focus();
|
|
56
|
+
}
|
|
57
|
+
return addDomEvent(el, "keydown", onKeyDown, true);
|
|
58
|
+
}
|
|
59
|
+
function focusTransfer(el, target, onFocus) {
|
|
60
|
+
const doc = require_dom.getDocument(el);
|
|
61
|
+
const body = doc.body;
|
|
62
|
+
function onKeyDown(ev) {
|
|
63
|
+
if (ev.key !== "Tab") return;
|
|
64
|
+
let elToFocus = null;
|
|
65
|
+
const [firstTabbable, lastTabbable] = require_dom.getTabbableElementEdges(el, true);
|
|
66
|
+
const nextTabbable = require_dom.getNextTabbableElement(body, target);
|
|
67
|
+
const noTabbableEls = !firstTabbable && !lastTabbable;
|
|
68
|
+
if (ev.shiftKey) {
|
|
69
|
+
if (nextTabbable === doc.activeElement) elToFocus = lastTabbable;
|
|
70
|
+
else if (doc.activeElement === firstTabbable || noTabbableEls) elToFocus = target;
|
|
71
|
+
} else if (doc.activeElement === target) elToFocus = firstTabbable;
|
|
72
|
+
else if (doc.activeElement === lastTabbable || noTabbableEls) elToFocus = nextTabbable;
|
|
73
|
+
if (!elToFocus) return;
|
|
74
|
+
ev.preventDefault();
|
|
75
|
+
if (require_assertion.isFunction(onFocus)) onFocus(elToFocus);
|
|
76
|
+
else elToFocus.focus();
|
|
77
|
+
}
|
|
78
|
+
return addDomEvent(doc, "keydown", onKeyDown, true);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
//#endregion
|
|
82
|
+
exports.addDomEvent = addDomEvent;
|
|
83
|
+
exports.focusTransfer = focusTransfer;
|
|
84
|
+
exports.focusTrap = focusTrap;
|
|
85
|
+
exports.getEventPoint = getEventPoint;
|
|
86
|
+
exports.getEventWindow = getEventWindow;
|
|
87
|
+
exports.isMouseEvent = isMouseEvent;
|
|
88
|
+
exports.isMultiTouchEvent = isMultiTouchEvent;
|
|
89
|
+
exports.isTouchEvent = isTouchEvent;
|
|
90
|
+
exports.pointFromMouse = pointFromMouse;
|
|
91
|
+
exports.pointFromTouch = pointFromTouch;
|
|
92
|
+
//# sourceMappingURL=event.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.cjs","names":["ev: any","ev: AnyPointerEvent","ev: Event","e: TouchEvent","type: \"client\" | \"page\"","point: MouseEvent | PointerEvent","target: EventTarget","type: Y","cb: (ev: EventMap[Y]) => void","options?: AddEventListenerOptions | boolean","el: HTMLElement | null","onFocus?: (elToFocus: HTMLElement) => void","noop","ev: KeyboardEvent","elToFocus: HTMLElement | null | undefined","target?: HTMLElement | null"],"sources":["../../src/event.ts"],"sourcesContent":["import { isFunction } from \"./assertion\"\nimport {\n getDocument,\n getNextTabbableElement,\n getTabbableElementEdges,\n} from \"./dom\"\nimport { noop } from \"./function\"\n\nexport type AnyPointerEvent = MouseEvent | PointerEvent | TouchEvent\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport function isMouseEvent(ev: any): ev is MouseEvent {\n const win = getEventWindow(ev)\n\n if (typeof win.PointerEvent !== \"undefined\" && ev instanceof win.PointerEvent)\n return !!(ev.pointerType === \"mouse\")\n\n return ev instanceof win.MouseEvent\n}\n\nexport function isTouchEvent(ev: AnyPointerEvent): ev is TouchEvent {\n return !!(ev as TouchEvent).touches\n}\n\nexport function isMultiTouchEvent(ev: AnyPointerEvent): boolean {\n return isTouchEvent(ev) && ev.touches.length > 1\n}\n\nexport function getEventWindow(ev: Event): typeof globalThis {\n return ((ev as UIEvent).view ?? window) as unknown as typeof globalThis\n}\n\nexport function pointFromTouch(\n e: TouchEvent,\n type: \"client\" | \"page\" = process.env.NODE_ENV === \"test\" ? \"client\" : \"page\",\n): Point {\n const point = e.touches[0] || e.changedTouches[0]\n\n return { x: point?.[`${type}X`] ?? 0, y: point?.[`${type}Y`] ?? 0 }\n}\n\nexport function pointFromMouse(\n point: MouseEvent | PointerEvent,\n type: \"client\" | \"page\" = \"page\",\n): Point {\n return {\n x: point[`${type}X`],\n y: point[`${type}Y`],\n }\n}\n\nexport function getEventPoint(\n ev: AnyPointerEvent,\n type: \"client\" | \"page\" = process.env.NODE_ENV === \"test\" ? \"client\" : \"page\",\n): Point {\n return isTouchEvent(ev) ? pointFromTouch(ev, type) : pointFromMouse(ev, type)\n}\n\nexport interface EventMap\n extends DocumentEventMap,\n GlobalEventHandlersEventMap,\n WindowEventMap,\n FontFaceSetEventMap {}\n\nexport type EventType = keyof EventMap\n\nexport function addDomEvent<Y extends EventType>(\n target: EventTarget,\n type: Y,\n cb: (ev: EventMap[Y]) => void,\n options?: AddEventListenerOptions | boolean,\n) {\n target.addEventListener(\n type,\n cb as EventListenerOrEventListenerObject,\n options,\n )\n\n return () => {\n target.removeEventListener(\n type,\n cb as EventListenerOrEventListenerObject,\n options,\n )\n }\n}\n\nexport function focusTrap(\n el: HTMLElement | null,\n onFocus?: (elToFocus: HTMLElement) => void,\n) {\n if (!el) return noop\n\n const doc = getDocument(el)\n\n function onKeyDown(ev: KeyboardEvent) {\n if (ev.key !== \"Tab\") return\n\n let elToFocus: HTMLElement | null | undefined = null\n\n const [firstTabbable, lastTabbable] = getTabbableElementEdges(el, true)\n\n if (ev.shiftKey) {\n if (doc.activeElement === firstTabbable) elToFocus = lastTabbable\n } else {\n if (doc.activeElement === lastTabbable) elToFocus = firstTabbable\n }\n\n if (!elToFocus) return\n\n ev.preventDefault()\n\n if (isFunction(onFocus)) {\n onFocus(elToFocus)\n } else {\n elToFocus.focus()\n }\n }\n\n return addDomEvent(el, \"keydown\", onKeyDown, true)\n}\n\nexport function focusTransfer(\n el: HTMLElement | null,\n target?: HTMLElement | null,\n onFocus?: (elToFocus: HTMLElement) => void,\n) {\n const doc = getDocument(el)\n const body = doc.body\n\n function onKeyDown(ev: KeyboardEvent) {\n if (ev.key !== \"Tab\") return\n\n let elToFocus: HTMLElement | null | undefined = null\n\n const [firstTabbable, lastTabbable] = getTabbableElementEdges(el, true)\n const nextTabbable = getNextTabbableElement(body, target)\n const noTabbableEls = !firstTabbable && !lastTabbable\n\n if (ev.shiftKey) {\n if (nextTabbable === doc.activeElement) {\n elToFocus = lastTabbable\n } else if (doc.activeElement === firstTabbable || noTabbableEls) {\n elToFocus = target\n }\n } else {\n if (doc.activeElement === target) {\n elToFocus = firstTabbable\n } else if (doc.activeElement === lastTabbable || noTabbableEls) {\n elToFocus = nextTabbable\n }\n }\n\n if (!elToFocus) return\n\n ev.preventDefault()\n\n if (isFunction(onFocus)) {\n onFocus(elToFocus)\n } else {\n elToFocus.focus()\n }\n }\n\n return addDomEvent(doc, \"keydown\", onKeyDown, true)\n}\n"],"mappings":";;;;;AAeA,SAAgB,aAAaA,IAA2B;CACtD,MAAM,MAAM,eAAe,GAAG;AAE9B,YAAW,IAAI,iBAAiB,eAAe,cAAc,IAAI,aAC/D,WAAU,GAAG,gBAAgB;AAE/B,QAAO,cAAc,IAAI;AAC1B;AAED,SAAgB,aAAaC,IAAuC;AAClE,UAAU,GAAkB;AAC7B;AAED,SAAgB,kBAAkBA,IAA8B;AAC9D,QAAO,aAAa,GAAG,IAAI,GAAG,QAAQ,SAAS;AAChD;AAED,SAAgB,eAAeC,IAA8B;AAC3D,QAAS,GAAe,QAAQ;AACjC;AAED,SAAgB,eACdC,GACAC,OAA0B,QAAQ,IAAI,aAAa,SAAS,WAAW,QAChE;CACP,MAAM,QAAQ,EAAE,QAAQ,MAAM,EAAE,eAAe;AAE/C,QAAO;EAAE,GAAG,WAAW,KAAK,OAAO;EAAG,GAAG,WAAW,KAAK,OAAO;CAAG;AACpE;AAED,SAAgB,eACdC,OACAD,OAA0B,QACnB;AACP,QAAO;EACL,GAAG,SAAS,KAAK;EACjB,GAAG,SAAS,KAAK;CAClB;AACF;AAED,SAAgB,cACdH,IACAG,OAA0B,QAAQ,IAAI,aAAa,SAAS,WAAW,QAChE;AACP,QAAO,aAAa,GAAG,GAAG,eAAe,IAAI,KAAK,GAAG,eAAe,IAAI,KAAK;AAC9E;AAUD,SAAgB,YACdE,QACAC,MACAC,IACAC,SACA;AACA,QAAO,iBACL,MACA,IACA,QACD;AAED,QAAO,MAAM;AACX,SAAO,oBACL,MACA,IACA,QACD;CACF;AACF;AAED,SAAgB,UACdC,IACAC,SACA;AACA,MAAK,GAAI,QAAOC;CAEhB,MAAM,MAAM,wBAAY,GAAG;CAE3B,SAAS,UAAUC,IAAmB;AACpC,MAAI,GAAG,QAAQ,MAAO;EAEtB,IAAIC,YAA4C;EAEhD,MAAM,CAAC,eAAe,aAAa,GAAG,oCAAwB,IAAI,KAAK;AAEvE,MAAI,GAAG,UACL;OAAI,IAAI,kBAAkB,cAAe,aAAY;EAAY,WAE7D,IAAI,kBAAkB,aAAc,aAAY;AAGtD,OAAK,UAAW;AAEhB,KAAG,gBAAgB;AAEnB,MAAI,6BAAW,QAAQ,CACrB,SAAQ,UAAU;MAElB,WAAU,OAAO;CAEpB;AAED,QAAO,YAAY,IAAI,WAAW,WAAW,KAAK;AACnD;AAED,SAAgB,cACdJ,IACAK,QACAJ,SACA;CACA,MAAM,MAAM,wBAAY,GAAG;CAC3B,MAAM,OAAO,IAAI;CAEjB,SAAS,UAAUE,IAAmB;AACpC,MAAI,GAAG,QAAQ,MAAO;EAEtB,IAAIC,YAA4C;EAEhD,MAAM,CAAC,eAAe,aAAa,GAAG,oCAAwB,IAAI,KAAK;EACvE,MAAM,eAAe,mCAAuB,MAAM,OAAO;EACzD,MAAM,iBAAiB,kBAAkB;AAEzC,MAAI,GAAG,UACL;OAAI,iBAAiB,IAAI,cACvB,aAAY;YACH,IAAI,kBAAkB,iBAAiB,cAChD,aAAY;EACb,WAEG,IAAI,kBAAkB,OACxB,aAAY;WACH,IAAI,kBAAkB,gBAAgB,cAC/C,aAAY;AAIhB,OAAK,UAAW;AAEhB,KAAG,gBAAgB;AAEnB,MAAI,6BAAW,QAAQ,CACrB,SAAQ,UAAU;MAElB,WAAU,OAAO;CAEpB;AAED,QAAO,YAAY,KAAK,WAAW,WAAW,KAAK;AACpD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const require_assertion = require('./assertion.cjs');
|
|
2
|
+
|
|
3
|
+
//#region src/function.ts
|
|
4
|
+
const noop = () => {};
|
|
5
|
+
function runIfFn(valOrFunc, ...args) {
|
|
6
|
+
return require_assertion.isFunction(valOrFunc) ? valOrFunc(...args) : valOrFunc;
|
|
7
|
+
}
|
|
8
|
+
function handlerAll(...funcs) {
|
|
9
|
+
return function(event, ...args) {
|
|
10
|
+
funcs.some((func) => {
|
|
11
|
+
func?.(event, ...args);
|
|
12
|
+
return event?.defaultPrevented;
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function fnAll(...funcs) {
|
|
17
|
+
return function(...args) {
|
|
18
|
+
return funcs.forEach((func) => func?.(...args));
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
//#endregion
|
|
23
|
+
exports.fnAll = fnAll;
|
|
24
|
+
exports.handlerAll = handlerAll;
|
|
25
|
+
exports.noop = noop;
|
|
26
|
+
exports.runIfFn = runIfFn;
|
|
27
|
+
//# sourceMappingURL=function.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"function.cjs","names":["valOrFunc: ((...funcArgs: U) => T) | T","event: T extends (event: infer R, ...args: any[]) => any ? R : never"],"sources":["../../src/function.ts"],"sourcesContent":["import { isFunction } from \"./assertion\"\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nexport const noop = () => {}\n\nexport function runIfFn<T, U extends any[]>(\n valOrFunc: ((...funcArgs: U) => T) | T,\n ...args: U\n): T {\n return isFunction(valOrFunc) ? valOrFunc(...args) : valOrFunc\n}\n\nexport function handlerAll<T extends (event: any, ...args: any[]) => void>(\n ...funcs: (null | T | undefined)[]\n) {\n return function (\n event: T extends (event: infer R, ...args: any[]) => any ? R : never,\n ...args: T extends (event: any, ...args: infer R) => any ? R : never\n ) {\n funcs.some((func) => {\n func?.(event, ...args)\n\n return event?.defaultPrevented\n })\n }\n}\n\nexport function fnAll<T extends (...args: any[]) => any>(\n ...funcs: (null | T | undefined)[]\n) {\n return function (...args: T extends (...args: infer R) => any ? R : never) {\n return funcs.forEach((func) => func?.(...args))\n }\n}\n"],"mappings":";;;AAGA,MAAa,OAAO,MAAM,CAAE;AAE5B,SAAgB,QACdA,WACA,GAAG,MACA;AACH,QAAO,6BAAW,UAAU,GAAG,UAAU,GAAG,KAAK,GAAG;AACrD;AAED,SAAgB,WACd,GAAG,OACH;AACA,QAAO,SACLC,OACA,GAAG,MACH;AACA,QAAM,KAAK,CAAC,SAAS;AACnB,UAAO,OAAO,GAAG,KAAK;AAEtB,UAAO,OAAO;EACf,EAAC;CACH;AACF;AAED,SAAgB,MACd,GAAG,OACH;AACA,QAAO,SAAU,GAAG,MAAuD;AACzE,SAAO,MAAM,QAAQ,CAAC,SAAS,OAAO,GAAG,KAAK,CAAC;CAChD;AACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
|
|
2
|
+
//#region src/i18n.ts
|
|
3
|
+
const RTL_SCRIPTS = new Set([
|
|
4
|
+
"Adlm",
|
|
5
|
+
"Arab",
|
|
6
|
+
"Hebr",
|
|
7
|
+
"Mand",
|
|
8
|
+
"Mend",
|
|
9
|
+
"Nkoo",
|
|
10
|
+
"Rohg",
|
|
11
|
+
"Samr",
|
|
12
|
+
"Syrc",
|
|
13
|
+
"Thaa",
|
|
14
|
+
"Yezi"
|
|
15
|
+
]);
|
|
16
|
+
const RTL_LANGS = new Set([
|
|
17
|
+
"ae",
|
|
18
|
+
"ar",
|
|
19
|
+
"arc",
|
|
20
|
+
"bcc",
|
|
21
|
+
"bqi",
|
|
22
|
+
"ckb",
|
|
23
|
+
"dv",
|
|
24
|
+
"fa",
|
|
25
|
+
"glk",
|
|
26
|
+
"he",
|
|
27
|
+
"ku",
|
|
28
|
+
"mzn",
|
|
29
|
+
"nqo",
|
|
30
|
+
"pnb",
|
|
31
|
+
"ps",
|
|
32
|
+
"sd",
|
|
33
|
+
"ug",
|
|
34
|
+
"ur",
|
|
35
|
+
"yi"
|
|
36
|
+
]);
|
|
37
|
+
function isRtl(_locale) {
|
|
38
|
+
const locale = new Intl.Locale(_locale).maximize();
|
|
39
|
+
if ("textInfo" in locale) return locale.textInfo.direction === "rtl";
|
|
40
|
+
if (locale.script) return RTL_SCRIPTS.has(locale.script);
|
|
41
|
+
else return RTL_LANGS.has(_locale.split("-")[0]);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
exports.isRtl = isRtl;
|
|
46
|
+
//# sourceMappingURL=i18n.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.cjs","names":["_locale: string"],"sources":["../../src/i18n.ts"],"sourcesContent":["const RTL_SCRIPTS = new Set([\n \"Adlm\",\n \"Arab\",\n \"Hebr\",\n \"Mand\",\n \"Mend\",\n \"Nkoo\",\n \"Rohg\",\n \"Samr\",\n \"Syrc\",\n \"Thaa\",\n \"Yezi\",\n])\n\nconst RTL_LANGS = new Set([\n \"ae\",\n \"ar\",\n \"arc\",\n \"bcc\",\n \"bqi\",\n \"ckb\",\n \"dv\",\n \"fa\",\n \"glk\",\n \"he\",\n \"ku\",\n \"mzn\",\n \"nqo\",\n \"pnb\",\n \"ps\",\n \"sd\",\n \"ug\",\n \"ur\",\n \"yi\",\n])\n\nexport function isRtl(_locale: string) {\n const locale = new Intl.Locale(_locale).maximize()\n\n if (\"textInfo\" in locale) return (locale.textInfo as any).direction === \"rtl\"\n\n if (locale.script) {\n return RTL_SCRIPTS.has(locale.script)\n } else {\n return RTL_LANGS.has(_locale.split(\"-\")[0]!)\n }\n}\n"],"mappings":";;AAAA,MAAM,cAAc,IAAI,IAAI;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD;AAED,MAAM,YAAY,IAAI,IAAI;CACxB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD;AAED,SAAgB,MAAMA,SAAiB;CACrC,MAAM,SAAS,IAAI,KAAK,OAAO,SAAS,UAAU;AAElD,KAAI,cAAc,OAAQ,QAAQ,OAAO,SAAiB,cAAc;AAExE,KAAI,OAAO,OACT,QAAO,YAAY,IAAI,OAAO,OAAO;KAErC,QAAO,UAAU,IAAI,QAAQ,MAAM,IAAI,CAAC,GAAI;AAE/C"}
|