@splendidlabz/utils 1.10.2 → 1.10.3
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/CHANGELOG.md +6 -0
- package/dist/cjs/dom/accessibility.cjs +0 -2
- package/dist/cjs/dom/actions/index.cjs +7 -391
- package/dist/cjs/dom/actions/masonry.cjs +6 -97
- package/dist/cjs/dom/actions/prefer-horizontal-scroll.cjs +14 -58
- package/dist/cjs/dom/actions/sticky.cjs +6 -126
- package/dist/cjs/dom/bounding-box.cjs +0 -2
- package/dist/cjs/dom/clipboard.cjs +0 -2
- package/dist/cjs/dom/cookie.cjs +1 -3
- package/dist/cjs/dom/css-vars.cjs +3 -13
- package/dist/cjs/dom/events.cjs +0 -2
- package/dist/cjs/dom/focusable.cjs +0 -2
- package/dist/cjs/dom/font-size.cjs +3 -15
- package/dist/cjs/dom/get-element.cjs +1 -3
- package/dist/cjs/dom/hash.cjs +0 -2
- package/dist/cjs/dom/index.cjs +47 -1248
- package/dist/cjs/dom/keyboard.cjs +0 -2
- package/dist/cjs/dom/local-store.cjs +1 -3
- package/dist/cjs/dom/media.cjs +0 -2
- package/dist/cjs/dom/observers/index.cjs +9 -235
- package/dist/cjs/dom/observers/intersection-observer.cjs +6 -38
- package/dist/cjs/dom/observers/mutation-observer.cjs +6 -38
- package/dist/cjs/dom/observers/observer.cjs +2 -12
- package/dist/cjs/dom/observers/resize-observer.cjs +6 -38
- package/dist/cjs/dom/observers/scroll-observer.cjs +3 -62
- package/dist/cjs/dom/pkce.cjs +3 -13
- package/dist/cjs/dom/query-params.cjs +1 -3
- package/dist/cjs/dom/random-string.cjs +0 -2
- package/dist/cjs/dom/sanitize.cjs +3 -27
- package/dist/cjs/dom/session-store.cjs +1 -3
- package/dist/cjs/dom/spam-prevention.cjs +0 -2
- package/dist/cjs/dom/trap-focus.cjs +9 -131
- package/dist/cjs/dom/ui/aria-current.cjs +0 -2
- package/dist/cjs/dom/ui/inconsistent-button-fix.cjs +0 -2
- package/dist/cjs/dom/ui/index.cjs +9 -87
- package/dist/cjs/dom/ui/scroll-container.cjs +0 -2
- package/dist/cjs/dom/ui/traverse-and-scramble.cjs +0 -2
- package/dist/cjs/lib/arrays/index.cjs +13 -121
- package/dist/cjs/lib/arrays/item-position.cjs +0 -2
- package/dist/cjs/lib/arrays/join.cjs +2 -10
- package/dist/cjs/lib/arrays/shuffle.cjs +0 -2
- package/dist/cjs/lib/arrays/sort.cjs +3 -11
- package/dist/cjs/lib/arrays/split-array.cjs +0 -2
- package/dist/cjs/lib/arrays/unique.cjs +0 -2
- package/dist/cjs/lib/auth/index.cjs +3 -35
- package/dist/cjs/lib/auth/route-manager.cjs +0 -2
- package/dist/cjs/lib/checks.cjs +0 -2
- package/dist/cjs/lib/date/days.cjs +1 -3
- package/dist/cjs/lib/date/index.cjs +7 -190
- package/dist/cjs/lib/date/months.cjs +1 -3
- package/dist/cjs/lib/date/time.cjs +2 -14
- package/dist/cjs/lib/form/form-data.cjs +0 -2
- package/dist/cjs/lib/form/index.cjs +5 -104
- package/dist/cjs/lib/form/sanitize.cjs +0 -2
- package/dist/cjs/lib/functions/callback.cjs +0 -2
- package/dist/cjs/lib/functions/debounce.cjs +0 -2
- package/dist/cjs/lib/functions/env.cjs +0 -2
- package/dist/cjs/lib/functions/functional.cjs +0 -2
- package/dist/cjs/lib/functions/index.cjs +11 -124
- package/dist/cjs/lib/functions/throttle.cjs +0 -2
- package/dist/cjs/lib/functions/timeout.cjs +0 -2
- package/dist/cjs/lib/hash.cjs +0 -2
- package/dist/cjs/lib/index.cjs +29 -1155
- package/dist/cjs/lib/numbers/index.cjs +4 -17
- package/dist/cjs/lib/numbers/math.cjs +0 -2
- package/dist/cjs/lib/objects/camelcase-keys.cjs +4 -45
- package/dist/cjs/lib/objects/empty.cjs +0 -2
- package/dist/cjs/lib/objects/equal.cjs +0 -2
- package/dist/cjs/lib/objects/extend.cjs +6 -117
- package/dist/cjs/lib/objects/flatten.cjs +3 -11
- package/dist/cjs/lib/objects/index.cjs +27 -360
- package/dist/cjs/lib/objects/json.cjs +0 -2
- package/dist/cjs/lib/objects/loop.cjs +0 -2
- package/dist/cjs/lib/objects/mix/mix.cjs +3 -5
- package/dist/cjs/lib/objects/nested-property.cjs +0 -2
- package/dist/cjs/lib/objects/normalize-object.cjs +4 -78
- package/dist/cjs/lib/objects/omit-empty.cjs +0 -2
- package/dist/cjs/lib/objects/size.cjs +0 -2
- package/dist/cjs/lib/objects/split.cjs +0 -2
- package/dist/cjs/lib/promises/index.cjs +3 -51
- package/dist/cjs/lib/promises/reject.cjs +2 -19
- package/dist/cjs/lib/sse.cjs +4 -29
- package/dist/cjs/lib/strings/convert-case/convert-case.cjs +0 -2
- package/dist/cjs/lib/strings/index.cjs +11 -179
- package/dist/cjs/lib/strings/markdown.cjs +1 -3
- package/dist/cjs/lib/strings/name.cjs +0 -2
- package/dist/cjs/lib/strings/pluralize.cjs +1 -3
- package/dist/cjs/lib/strings/query-string.cjs +0 -2
- package/dist/cjs/lib/style/index.cjs +2 -31
- package/dist/cjs/lib/symbols/index.cjs +3 -22
- package/dist/cjs/lib/symbols/symbols.cjs +0 -2
- package/dist/cjs/node/common.cjs +0 -2
- package/dist/cjs/node/dirname.cjs +2 -4
- package/dist/cjs/node/file-cache.cjs +3 -45
- package/dist/cjs/node/file.cjs +2 -4
- package/dist/cjs/node/hash.cjs +1 -3
- package/dist/cjs/node/index.cjs +15 -272
- package/dist/cjs/node/pkce.cjs +5 -15
- package/dist/cjs/node/random-string.cjs +1 -3
- package/dist/cjs/node/sanitize.cjs +3 -27
- package/dist/esm/dom/accessibility.js +0 -1
- package/dist/esm/dom/actions/index.js +3 -381
- package/dist/esm/dom/actions/masonry.js +3 -91
- package/dist/esm/dom/actions/prefer-horizontal-scroll.js +4 -45
- package/dist/esm/dom/actions/sticky.js +3 -120
- package/dist/esm/dom/bounding-box.js +0 -1
- package/dist/esm/dom/clipboard.js +0 -1
- package/dist/esm/dom/cookie.js +1 -2
- package/dist/esm/dom/css-vars.js +1 -8
- package/dist/esm/dom/events.js +0 -1
- package/dist/esm/dom/focusable.js +0 -1
- package/dist/esm/dom/font-size.js +1 -10
- package/dist/esm/dom/get-element.js +1 -2
- package/dist/esm/dom/hash.js +0 -1
- package/dist/esm/dom/index.js +23 -1168
- package/dist/esm/dom/keyboard.js +0 -1
- package/dist/esm/dom/local-store.js +1 -2
- package/dist/esm/dom/media.js +0 -1
- package/dist/esm/dom/observers/index.js +4 -224
- package/dist/esm/dom/observers/intersection-observer.js +2 -31
- package/dist/esm/dom/observers/mutation-observer.js +3 -32
- package/dist/esm/dom/observers/observer.js +1 -8
- package/dist/esm/dom/observers/resize-observer.js +2 -31
- package/dist/esm/dom/observers/scroll-observer.js +2 -58
- package/dist/esm/dom/pkce.js +1 -8
- package/dist/esm/dom/query-params.js +1 -2
- package/dist/esm/dom/random-string.js +0 -1
- package/dist/esm/dom/sanitize.js +3 -26
- package/dist/esm/dom/session-store.js +1 -2
- package/dist/esm/dom/spam-prevention.js +0 -1
- package/dist/esm/dom/trap-focus.js +2 -121
- package/dist/esm/dom/ui/aria-current.js +0 -1
- package/dist/esm/dom/ui/inconsistent-button-fix.js +0 -1
- package/dist/esm/dom/ui/index.js +4 -75
- package/dist/esm/dom/ui/scroll-container.js +0 -1
- package/dist/esm/dom/ui/traverse-and-scramble.js +0 -1
- package/dist/esm/lib/arrays/index.js +6 -106
- package/dist/esm/lib/arrays/item-position.js +0 -1
- package/dist/esm/lib/arrays/join.js +1 -6
- package/dist/esm/lib/arrays/shuffle.js +0 -1
- package/dist/esm/lib/arrays/sort.js +1 -6
- package/dist/esm/lib/arrays/split-array.js +0 -1
- package/dist/esm/lib/arrays/unique.js +0 -1
- package/dist/esm/lib/auth/index.js +1 -26
- package/dist/esm/lib/auth/route-manager.js +0 -1
- package/dist/esm/lib/checks.js +0 -1
- package/dist/esm/lib/date/days.js +1 -2
- package/dist/esm/lib/date/index.js +3 -173
- package/dist/esm/lib/date/months.js +1 -2
- package/dist/esm/lib/date/time.js +1 -10
- package/dist/esm/lib/form/form-data.js +0 -1
- package/dist/esm/lib/form/index.js +2 -92
- package/dist/esm/lib/form/sanitize.js +0 -1
- package/dist/esm/lib/functions/callback.js +0 -1
- package/dist/esm/lib/functions/debounce.js +0 -1
- package/dist/esm/lib/functions/env.js +0 -1
- package/dist/esm/lib/functions/functional.js +0 -1
- package/dist/esm/lib/functions/index.js +5 -105
- package/dist/esm/lib/functions/throttle.js +0 -1
- package/dist/esm/lib/functions/timeout.js +0 -1
- package/dist/esm/lib/hash.js +0 -1
- package/dist/esm/lib/index.js +14 -1052
- package/dist/esm/lib/numbers/index.js +2 -12
- package/dist/esm/lib/numbers/math.js +0 -1
- package/dist/esm/lib/objects/camelcase-keys.js +2 -40
- package/dist/esm/lib/objects/empty.js +0 -1
- package/dist/esm/lib/objects/equal.js +0 -1
- package/dist/esm/lib/objects/extend.js +3 -111
- package/dist/esm/lib/objects/flatten.js +1 -6
- package/dist/esm/lib/objects/index.js +13 -323
- package/dist/esm/lib/objects/json.js +0 -1
- package/dist/esm/lib/objects/loop.js +0 -1
- package/dist/esm/lib/objects/mix/mix.js +3 -4
- package/dist/esm/lib/objects/nested-property.js +0 -1
- package/dist/esm/lib/objects/normalize-object.js +3 -74
- package/dist/esm/lib/objects/omit-empty.js +0 -1
- package/dist/esm/lib/objects/size.js +0 -1
- package/dist/esm/lib/objects/split.js +0 -1
- package/dist/esm/lib/promises/index.js +1 -33
- package/dist/esm/lib/promises/reject.js +1 -17
- package/dist/esm/lib/sse.js +2 -24
- package/dist/esm/lib/strings/convert-case/convert-case.js +0 -1
- package/dist/esm/lib/strings/index.js +5 -147
- package/dist/esm/lib/strings/markdown.js +1 -2
- package/dist/esm/lib/strings/name.js +0 -1
- package/dist/esm/lib/strings/pluralize.js +1 -2
- package/dist/esm/lib/strings/query-string.js +0 -1
- package/dist/esm/lib/style/index.js +1 -27
- package/dist/esm/lib/symbols/index.js +1 -13
- package/dist/esm/lib/symbols/symbols.js +0 -1
- package/dist/esm/node/common.js +0 -1
- package/dist/esm/node/dirname.js +2 -3
- package/dist/esm/node/file-cache.js +2 -43
- package/dist/esm/node/file.js +2 -3
- package/dist/esm/node/hash.js +1 -2
- package/dist/esm/node/index.js +7 -243
- package/dist/esm/node/pkce.js +3 -12
- package/dist/esm/node/random-string.js +1 -2
- package/dist/esm/node/sanitize.js +3 -26
- package/package.json +1 -1
- package/tsup.config.mjs +2 -0
|
@@ -1,381 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
if (node instanceof NodeList) return "nodelist";
|
|
5
|
-
if (Array.isArray(node)) return "array";
|
|
6
|
-
}
|
|
7
|
-
function getElement(selector) {
|
|
8
|
-
if (!selector) return;
|
|
9
|
-
if (selector instanceof Element) return selector;
|
|
10
|
-
return document.querySelector(selector);
|
|
11
|
-
}
|
|
12
|
-
function getChildrenElements(node) {
|
|
13
|
-
let children = node.children;
|
|
14
|
-
if (children[0]?.nodeName === "ASTRO-SLOT") children = children[0].children;
|
|
15
|
-
return Array.from(children);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// src/dom/media.js
|
|
19
|
-
async function imagesLoaded(node) {
|
|
20
|
-
const images = Array.from(node.querySelectorAll("img"));
|
|
21
|
-
const promises = images.map((img) => {
|
|
22
|
-
return new Promise((resolve, reject) => {
|
|
23
|
-
if (img.complete) return resolve();
|
|
24
|
-
img.onload = resolve;
|
|
25
|
-
img.onerror = (e) => {
|
|
26
|
-
reject("Image failed to load");
|
|
27
|
-
};
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
return Promise.all(promises);
|
|
31
|
-
}
|
|
32
|
-
async function videosLoaded(node) {
|
|
33
|
-
const videos = Array.from(node.querySelectorAll("video"));
|
|
34
|
-
const promises = videos.map((video) => {
|
|
35
|
-
return new Promise((resolve, reject) => {
|
|
36
|
-
if (video.readyState === 4) return resolve();
|
|
37
|
-
video.onloadedmetadata = resolve;
|
|
38
|
-
video.onerror = reject;
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
return Promise.all(promises);
|
|
42
|
-
}
|
|
43
|
-
async function mediaLoaded(node) {
|
|
44
|
-
return Promise.all([imagesLoaded(node), videosLoaded(node)]);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// src/dom/events.js
|
|
48
|
-
function addListeners(listeners) {
|
|
49
|
-
listeners.forEach(({ node, event, handler }) => {
|
|
50
|
-
node.addEventListener(event, handler);
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
function removeListeners(listeners) {
|
|
54
|
-
listeners.forEach(({ node, event, handler }) => {
|
|
55
|
-
node.removeEventListener(event, handler);
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
function dispatchEvent(node, eventName, detail, options = {}) {
|
|
59
|
-
node.dispatchEvent(
|
|
60
|
-
new CustomEvent(eventName, {
|
|
61
|
-
...options,
|
|
62
|
-
detail
|
|
63
|
-
})
|
|
64
|
-
);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// src/dom/observers/observer.js
|
|
68
|
-
function useObserverMethodOnTarget(target, observer, method = "observe", options = void 0) {
|
|
69
|
-
const targetType = getNodeType(target);
|
|
70
|
-
if (targetType === "element") observer[method](target, options);
|
|
71
|
-
if (targetType === "nodelist") {
|
|
72
|
-
const elements = Array.from(target);
|
|
73
|
-
elements.forEach((element) => observer[method](element, options));
|
|
74
|
-
}
|
|
75
|
-
if (targetType === "array") {
|
|
76
|
-
target.forEach((element) => observer[method](element, options));
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// src/dom/observers/resize-observer.js
|
|
81
|
-
function resizeObserver(target, options) {
|
|
82
|
-
const { callback, ...opts } = options;
|
|
83
|
-
const observer = new ResizeObserver(observerFn);
|
|
84
|
-
if (target === window || target === document)
|
|
85
|
-
target = document.documentElement;
|
|
86
|
-
useObserverMethodOnTarget(target, observer, "observe", opts);
|
|
87
|
-
function observerFn(entries) {
|
|
88
|
-
for (const entry of entries) {
|
|
89
|
-
if (callback) callback({ entry, entries, observer });
|
|
90
|
-
else
|
|
91
|
-
dispatchEvent(entry.target, "resize-obs", { entry, entries, observer });
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return {
|
|
95
|
-
observe(target2) {
|
|
96
|
-
useObserverMethodOnTarget(target2, observer, "observe", options);
|
|
97
|
-
},
|
|
98
|
-
unobserve(target2) {
|
|
99
|
-
useObserverMethodOnTarget(target2, observer, "unobserve");
|
|
100
|
-
},
|
|
101
|
-
disconnect: (_) => observer.disconnect(),
|
|
102
|
-
destroy: (_) => observer.disconnect()
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// src/dom/actions/masonry.js
|
|
107
|
-
async function masonry(node) {
|
|
108
|
-
if (nativeMasonrySupport(node)) return;
|
|
109
|
-
const colGap = parseFloat(getComputedStyle(node).columnGap);
|
|
110
|
-
const items = getChildrenElements(node);
|
|
111
|
-
node.style.setProperty("row-gap", "1px", "important");
|
|
112
|
-
node.style.gridAutoRows = "0px";
|
|
113
|
-
try {
|
|
114
|
-
await mediaLoaded(node);
|
|
115
|
-
} catch (e) {
|
|
116
|
-
}
|
|
117
|
-
layout({ colGap, items });
|
|
118
|
-
const obs = resizeObserver(node, {
|
|
119
|
-
async callback(opts) {
|
|
120
|
-
layout({ colGap, items });
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
async function layout({ colGap: colGap2, items: items2 }) {
|
|
124
|
-
items2.forEach((item) => {
|
|
125
|
-
const ib = item.getBoundingClientRect();
|
|
126
|
-
item.style.gridRowEnd = `span ${Math.round(ib.height + colGap2)}`;
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
return {
|
|
130
|
-
destroy() {
|
|
131
|
-
obs.disconnect();
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
function nativeMasonrySupport(node) {
|
|
136
|
-
return getComputedStyle(node).gridTemplateRows === "masonry";
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// src/lib/objects/omit-empty.js
|
|
140
|
-
function omitEmpty(obj, shallow = false) {
|
|
141
|
-
if (typeof obj !== "object" || obj === null) return obj;
|
|
142
|
-
if (obj instanceof Date) return obj;
|
|
143
|
-
const result = Array.isArray(obj) ? [] : {};
|
|
144
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
145
|
-
if (value === null || value === void 0 || value === "" || typeof value === "object" && !(value instanceof Date) && Object.keys(value).length === 0) {
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
result[key] = shallow ? value : omitEmpty(value);
|
|
149
|
-
}
|
|
150
|
-
return result;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// src/dom/css-vars.js
|
|
154
|
-
function getCSSVar(element, prop) {
|
|
155
|
-
element = getElement(element);
|
|
156
|
-
return getComputedStyle(element).getPropertyValue(prop);
|
|
157
|
-
}
|
|
158
|
-
function setCSSVar(element, prop, value) {
|
|
159
|
-
element = getElement(element);
|
|
160
|
-
element.style.setProperty(prop, value);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// src/dom/actions/prefer-horizontal-scroll.js
|
|
164
|
-
var DEFAULT_OPTIONS = {
|
|
165
|
-
scrollSnapDelay: 1e3
|
|
166
|
-
};
|
|
167
|
-
function preferHorizontalScroll(node, props = {}) {
|
|
168
|
-
if (!node.classList.contains("scrollable-prefer-horizontal")) return;
|
|
169
|
-
const state = {
|
|
170
|
-
origSnapType: null,
|
|
171
|
-
currentSnapType: null,
|
|
172
|
-
snapTimeoutID: null
|
|
173
|
-
};
|
|
174
|
-
const options = {
|
|
175
|
-
...DEFAULT_OPTIONS,
|
|
176
|
-
...omitEmpty({
|
|
177
|
-
scrollSnapDelay: getCSSVar(node, "--scroll-snap-delay")
|
|
178
|
-
}),
|
|
179
|
-
...omitEmpty(props)
|
|
180
|
-
};
|
|
181
|
-
const listeners = [
|
|
182
|
-
{
|
|
183
|
-
event: "wheel",
|
|
184
|
-
node,
|
|
185
|
-
handler: handleWheel
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
event: "pointerenter",
|
|
189
|
-
node,
|
|
190
|
-
handler: handlePointerEnter
|
|
191
|
-
},
|
|
192
|
-
{
|
|
193
|
-
event: "pointerleave",
|
|
194
|
-
node,
|
|
195
|
-
handler: handlePointerLeave
|
|
196
|
-
}
|
|
197
|
-
];
|
|
198
|
-
addListeners(listeners);
|
|
199
|
-
function handleWheel(event) {
|
|
200
|
-
const direction = event.deltaY > 0 ? "down" : "up";
|
|
201
|
-
const updatedDelta = event.deltaY;
|
|
202
|
-
if (isTrackpad(event)) return false;
|
|
203
|
-
setCSSVar(node, "--snap-type", "none");
|
|
204
|
-
const scrolledAmount = node.scrollLeft;
|
|
205
|
-
const scrollWidth = node.scrollWidth;
|
|
206
|
-
const clientWidth = node.clientWidth;
|
|
207
|
-
const scrollableAmount = scrollWidth - clientWidth;
|
|
208
|
-
if (direction === "down" && scrolledAmount < scrollableAmount) {
|
|
209
|
-
node.scrollLeft += updatedDelta;
|
|
210
|
-
event.preventDefault();
|
|
211
|
-
}
|
|
212
|
-
if (direction === "up" && scrolledAmount > 0) {
|
|
213
|
-
node.scrollLeft += updatedDelta;
|
|
214
|
-
event.preventDefault();
|
|
215
|
-
}
|
|
216
|
-
const { snapTimeoutID } = state;
|
|
217
|
-
if (snapTimeoutID) clearTimeout(snapTimeoutID);
|
|
218
|
-
state.snapTimeoutID = setTimeout((_) => {
|
|
219
|
-
restoreHijackedState(node, state);
|
|
220
|
-
}, options.scrollSnapDelay);
|
|
221
|
-
}
|
|
222
|
-
function handlePointerEnter(event) {
|
|
223
|
-
state.origSnapType = getCSSVar(node, "--snap-type") || "proximity";
|
|
224
|
-
}
|
|
225
|
-
function handlePointerLeave(event) {
|
|
226
|
-
restoreHijackedState(node, state);
|
|
227
|
-
}
|
|
228
|
-
return {
|
|
229
|
-
destroy() {
|
|
230
|
-
removeListeners(listeners);
|
|
231
|
-
}
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
function restoreHijackedState(node, state) {
|
|
235
|
-
const scrollLeft = node.scrollLeft;
|
|
236
|
-
setCSSVar(node, "--snap-type", state.origSnapType);
|
|
237
|
-
const finalScrollLeft = node.scrollLeft;
|
|
238
|
-
setCSSVar(node, "--snap-type", "none");
|
|
239
|
-
node.scrollTo({ left: scrollLeft, behavior: "instant" });
|
|
240
|
-
node.scrollTo({ left: finalScrollLeft, behavior: "smooth" });
|
|
241
|
-
setTimeout((_) => {
|
|
242
|
-
setCSSVar(node, "--snap-type", state.origSnapType);
|
|
243
|
-
}, 250);
|
|
244
|
-
}
|
|
245
|
-
function isTrackpad(event) {
|
|
246
|
-
if (event.wheelDeltaY === event.deltaY * -3) return true;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// src/dom/bounding-box.js
|
|
250
|
-
function boundingBox(element, { containsPadding = true } = {}) {
|
|
251
|
-
const box = element.getBoundingClientRect();
|
|
252
|
-
const ret = {};
|
|
253
|
-
for (const prop in box) ret[prop] = box[prop];
|
|
254
|
-
if (!containsPadding) {
|
|
255
|
-
const style = getComputedStyle(element);
|
|
256
|
-
const paddingTop = parseFloat(style.paddingTop);
|
|
257
|
-
const paddingRight = parseFloat(style.paddingRight);
|
|
258
|
-
const paddingBottom = parseFloat(style.paddingBottom);
|
|
259
|
-
const paddingLeft = parseFloat(style.paddingLeft);
|
|
260
|
-
ret.x = ret.x + paddingLeft;
|
|
261
|
-
ret.y = ret.y + paddingTop;
|
|
262
|
-
ret.width = ret.width - paddingLeft - paddingRight;
|
|
263
|
-
ret.height = ret.height - paddingTop - paddingBottom;
|
|
264
|
-
ret.top = ret.top + paddingTop;
|
|
265
|
-
ret.bottom = ret.bottom - paddingBottom;
|
|
266
|
-
ret.right = ret.right - paddingRight;
|
|
267
|
-
ret.left = ret.left + paddingLeft;
|
|
268
|
-
}
|
|
269
|
-
ret.xCenter = (ret.left + ret.right) / 2;
|
|
270
|
-
ret.yCenter = (ret.top + ret.bottom) / 2;
|
|
271
|
-
return ret;
|
|
272
|
-
}
|
|
273
|
-
function boundingBoxRelativeToAncestor({ element, ancestorElement }) {
|
|
274
|
-
ancestorElement = ancestorElement || element.parentElement;
|
|
275
|
-
const box = boundingBox(element);
|
|
276
|
-
const ancestorBox = boundingBox(ancestorElement, {
|
|
277
|
-
containsPadding: false
|
|
278
|
-
});
|
|
279
|
-
return {
|
|
280
|
-
top: box.top - ancestorBox.top,
|
|
281
|
-
right: box.right - ancestorBox.right,
|
|
282
|
-
bottom: box.bottom - ancestorBox.bottom,
|
|
283
|
-
left: box.left - ancestorBox.left,
|
|
284
|
-
width: box.width,
|
|
285
|
-
height: box.height,
|
|
286
|
-
xCenter: (box.left + box.right) / 2 - ancestorBox.left,
|
|
287
|
-
yCenter: (box.top + box.bottom) / 2 - ancestorBox.top
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// src/dom/ui/scroll-container.js
|
|
292
|
-
function findScrollContainer(element, direction = "both") {
|
|
293
|
-
if (!element) return;
|
|
294
|
-
let parent = element.parentElement;
|
|
295
|
-
while (parent) {
|
|
296
|
-
const { overflow, overflowX, overflowY } = getComputedStyle(parent);
|
|
297
|
-
if (direction === "both") {
|
|
298
|
-
if (overflow.includes("auto") || overflow.includes("scroll"))
|
|
299
|
-
return parent;
|
|
300
|
-
}
|
|
301
|
-
if (direction === "horizontal") {
|
|
302
|
-
if (overflowX === "auto" || overflowX === "scroll") return parent;
|
|
303
|
-
}
|
|
304
|
-
if (direction === "vertical") {
|
|
305
|
-
if (overflowY === "auto" || overflowY === "scroll") return parent;
|
|
306
|
-
}
|
|
307
|
-
parent = parent.parentElement;
|
|
308
|
-
}
|
|
309
|
-
return document.documentElement;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
// src/dom/actions/sticky.js
|
|
313
|
-
function sticky(node, props = {}) {
|
|
314
|
-
const scrollContainer = findScrollContainer(node);
|
|
315
|
-
let stickyTBLR = getComputedTBLR(node);
|
|
316
|
-
const obs = resizeObserver(node, {
|
|
317
|
-
callback: ({ entry }) => {
|
|
318
|
-
stickyTBLR = getComputedTBLR(node);
|
|
319
|
-
isSticking();
|
|
320
|
-
scrollContainer === document.documentElement ? window.addEventListener("scroll", scrollEventListener) : scrollContainer.addEventListener("scroll", scrollEventListener);
|
|
321
|
-
}
|
|
322
|
-
});
|
|
323
|
-
function scrollEventListener(event) {
|
|
324
|
-
isSticking();
|
|
325
|
-
}
|
|
326
|
-
function isSticking() {
|
|
327
|
-
const { top, bottom, left, right } = stickyTBLR;
|
|
328
|
-
const relativeRect = boundingBoxRelativeToAncestor({
|
|
329
|
-
element: node,
|
|
330
|
-
ancestorElement: scrollContainer
|
|
331
|
-
});
|
|
332
|
-
if (!isNaN(top)) {
|
|
333
|
-
if (relativeRect.top - top <= 1) {
|
|
334
|
-
node.classList.add("sticking");
|
|
335
|
-
} else {
|
|
336
|
-
node.classList.remove("sticking");
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
if (!isNaN(bottom)) {
|
|
340
|
-
if (relativeRect.bottom + bottom >= -1) {
|
|
341
|
-
node.classList.add("sticking");
|
|
342
|
-
} else {
|
|
343
|
-
node.classList.remove("sticking");
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
if (!isNaN(left)) {
|
|
347
|
-
if (relativeRect.left - left <= 1) {
|
|
348
|
-
node.classList.add("sticking");
|
|
349
|
-
} else {
|
|
350
|
-
node.classList.remove("sticking");
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
if (!isNaN(right)) {
|
|
354
|
-
if (relativeRect.right + right >= -1) {
|
|
355
|
-
node.classList.add("sticking");
|
|
356
|
-
} else {
|
|
357
|
-
node.classList.remove("sticking");
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
return {
|
|
362
|
-
destroy() {
|
|
363
|
-
obs.disconnect();
|
|
364
|
-
scrollContainer.removeEventListener("scroll", scrollEventListener);
|
|
365
|
-
}
|
|
366
|
-
};
|
|
367
|
-
}
|
|
368
|
-
function getComputedTBLR(element) {
|
|
369
|
-
const style = getComputedStyle(element);
|
|
370
|
-
return {
|
|
371
|
-
top: parseFloat(style.top),
|
|
372
|
-
bottom: parseFloat(style.bottom),
|
|
373
|
-
left: parseFloat(style.left),
|
|
374
|
-
right: parseFloat(style.right)
|
|
375
|
-
};
|
|
376
|
-
}
|
|
377
|
-
export {
|
|
378
|
-
masonry,
|
|
379
|
-
preferHorizontalScroll,
|
|
380
|
-
sticky
|
|
381
|
-
};
|
|
1
|
+
export * from "./masonry.js";
|
|
2
|
+
export * from "./prefer-horizontal-scroll.js";
|
|
3
|
+
export * from "./sticky.js";
|
|
@@ -1,94 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
if (node instanceof NodeList) return "nodelist";
|
|
5
|
-
if (Array.isArray(node)) return "array";
|
|
6
|
-
}
|
|
7
|
-
function getChildrenElements(node) {
|
|
8
|
-
let children = node.children;
|
|
9
|
-
if (children[0]?.nodeName === "ASTRO-SLOT") children = children[0].children;
|
|
10
|
-
return Array.from(children);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// src/dom/media.js
|
|
14
|
-
async function imagesLoaded(node) {
|
|
15
|
-
const images = Array.from(node.querySelectorAll("img"));
|
|
16
|
-
const promises = images.map((img) => {
|
|
17
|
-
return new Promise((resolve, reject) => {
|
|
18
|
-
if (img.complete) return resolve();
|
|
19
|
-
img.onload = resolve;
|
|
20
|
-
img.onerror = (e) => {
|
|
21
|
-
reject("Image failed to load");
|
|
22
|
-
};
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
return Promise.all(promises);
|
|
26
|
-
}
|
|
27
|
-
async function videosLoaded(node) {
|
|
28
|
-
const videos = Array.from(node.querySelectorAll("video"));
|
|
29
|
-
const promises = videos.map((video) => {
|
|
30
|
-
return new Promise((resolve, reject) => {
|
|
31
|
-
if (video.readyState === 4) return resolve();
|
|
32
|
-
video.onloadedmetadata = resolve;
|
|
33
|
-
video.onerror = reject;
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
return Promise.all(promises);
|
|
37
|
-
}
|
|
38
|
-
async function mediaLoaded(node) {
|
|
39
|
-
return Promise.all([imagesLoaded(node), videosLoaded(node)]);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// src/dom/events.js
|
|
43
|
-
function dispatchEvent(node, eventName, detail, options = {}) {
|
|
44
|
-
node.dispatchEvent(
|
|
45
|
-
new CustomEvent(eventName, {
|
|
46
|
-
...options,
|
|
47
|
-
detail
|
|
48
|
-
})
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// src/dom/observers/observer.js
|
|
53
|
-
function useObserverMethodOnTarget(target, observer, method = "observe", options = void 0) {
|
|
54
|
-
const targetType = getNodeType(target);
|
|
55
|
-
if (targetType === "element") observer[method](target, options);
|
|
56
|
-
if (targetType === "nodelist") {
|
|
57
|
-
const elements = Array.from(target);
|
|
58
|
-
elements.forEach((element) => observer[method](element, options));
|
|
59
|
-
}
|
|
60
|
-
if (targetType === "array") {
|
|
61
|
-
target.forEach((element) => observer[method](element, options));
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// src/dom/observers/resize-observer.js
|
|
66
|
-
function resizeObserver(target, options) {
|
|
67
|
-
const { callback, ...opts } = options;
|
|
68
|
-
const observer = new ResizeObserver(observerFn);
|
|
69
|
-
if (target === window || target === document)
|
|
70
|
-
target = document.documentElement;
|
|
71
|
-
useObserverMethodOnTarget(target, observer, "observe", opts);
|
|
72
|
-
function observerFn(entries) {
|
|
73
|
-
for (const entry of entries) {
|
|
74
|
-
if (callback) callback({ entry, entries, observer });
|
|
75
|
-
else
|
|
76
|
-
dispatchEvent(entry.target, "resize-obs", { entry, entries, observer });
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return {
|
|
80
|
-
observe(target2) {
|
|
81
|
-
useObserverMethodOnTarget(target2, observer, "observe", options);
|
|
82
|
-
},
|
|
83
|
-
unobserve(target2) {
|
|
84
|
-
useObserverMethodOnTarget(target2, observer, "unobserve");
|
|
85
|
-
},
|
|
86
|
-
disconnect: (_) => observer.disconnect(),
|
|
87
|
-
destroy: (_) => observer.disconnect()
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// src/dom/actions/masonry.js
|
|
1
|
+
import { getChildrenElements } from "../get-element.js";
|
|
2
|
+
import { mediaLoaded } from "../media.js";
|
|
3
|
+
import { resizeObserver } from "../observers/resize-observer.js";
|
|
92
4
|
async function masonry(node) {
|
|
93
5
|
if (nativeMasonrySupport(node)) return;
|
|
94
6
|
const colGap = parseFloat(getComputedStyle(node).columnGap);
|
|
@@ -1,48 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const result = Array.isArray(obj) ? [] : {};
|
|
6
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
7
|
-
if (value === null || value === void 0 || value === "" || typeof value === "object" && !(value instanceof Date) && Object.keys(value).length === 0) {
|
|
8
|
-
continue;
|
|
9
|
-
}
|
|
10
|
-
result[key] = shallow ? value : omitEmpty(value);
|
|
11
|
-
}
|
|
12
|
-
return result;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// src/dom/get-element.js
|
|
16
|
-
function getElement(selector) {
|
|
17
|
-
if (!selector) return;
|
|
18
|
-
if (selector instanceof Element) return selector;
|
|
19
|
-
return document.querySelector(selector);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// src/dom/css-vars.js
|
|
23
|
-
function getCSSVar(element, prop) {
|
|
24
|
-
element = getElement(element);
|
|
25
|
-
return getComputedStyle(element).getPropertyValue(prop);
|
|
26
|
-
}
|
|
27
|
-
function setCSSVar(element, prop, value) {
|
|
28
|
-
element = getElement(element);
|
|
29
|
-
element.style.setProperty(prop, value);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// src/dom/events.js
|
|
33
|
-
function addListeners(listeners) {
|
|
34
|
-
listeners.forEach(({ node, event, handler }) => {
|
|
35
|
-
node.addEventListener(event, handler);
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
function removeListeners(listeners) {
|
|
39
|
-
listeners.forEach(({ node, event, handler }) => {
|
|
40
|
-
node.removeEventListener(event, handler);
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// src/dom/actions/prefer-horizontal-scroll.js
|
|
45
|
-
var DEFAULT_OPTIONS = {
|
|
1
|
+
import { omitEmpty } from "../../lib/objects/omit-empty.js";
|
|
2
|
+
import { getCSSVar, setCSSVar } from "../css-vars.js";
|
|
3
|
+
import { addListeners, removeListeners } from "../events.js";
|
|
4
|
+
const DEFAULT_OPTIONS = {
|
|
46
5
|
scrollSnapDelay: 1e3
|
|
47
6
|
};
|
|
48
7
|
function preferHorizontalScroll(node, props = {}) {
|
|
@@ -1,123 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const ret = {};
|
|
5
|
-
for (const prop in box) ret[prop] = box[prop];
|
|
6
|
-
if (!containsPadding) {
|
|
7
|
-
const style = getComputedStyle(element);
|
|
8
|
-
const paddingTop = parseFloat(style.paddingTop);
|
|
9
|
-
const paddingRight = parseFloat(style.paddingRight);
|
|
10
|
-
const paddingBottom = parseFloat(style.paddingBottom);
|
|
11
|
-
const paddingLeft = parseFloat(style.paddingLeft);
|
|
12
|
-
ret.x = ret.x + paddingLeft;
|
|
13
|
-
ret.y = ret.y + paddingTop;
|
|
14
|
-
ret.width = ret.width - paddingLeft - paddingRight;
|
|
15
|
-
ret.height = ret.height - paddingTop - paddingBottom;
|
|
16
|
-
ret.top = ret.top + paddingTop;
|
|
17
|
-
ret.bottom = ret.bottom - paddingBottom;
|
|
18
|
-
ret.right = ret.right - paddingRight;
|
|
19
|
-
ret.left = ret.left + paddingLeft;
|
|
20
|
-
}
|
|
21
|
-
ret.xCenter = (ret.left + ret.right) / 2;
|
|
22
|
-
ret.yCenter = (ret.top + ret.bottom) / 2;
|
|
23
|
-
return ret;
|
|
24
|
-
}
|
|
25
|
-
function boundingBoxRelativeToAncestor({ element, ancestorElement }) {
|
|
26
|
-
ancestorElement = ancestorElement || element.parentElement;
|
|
27
|
-
const box = boundingBox(element);
|
|
28
|
-
const ancestorBox = boundingBox(ancestorElement, {
|
|
29
|
-
containsPadding: false
|
|
30
|
-
});
|
|
31
|
-
return {
|
|
32
|
-
top: box.top - ancestorBox.top,
|
|
33
|
-
right: box.right - ancestorBox.right,
|
|
34
|
-
bottom: box.bottom - ancestorBox.bottom,
|
|
35
|
-
left: box.left - ancestorBox.left,
|
|
36
|
-
width: box.width,
|
|
37
|
-
height: box.height,
|
|
38
|
-
xCenter: (box.left + box.right) / 2 - ancestorBox.left,
|
|
39
|
-
yCenter: (box.top + box.bottom) / 2 - ancestorBox.top
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// src/dom/events.js
|
|
44
|
-
function dispatchEvent(node, eventName, detail, options = {}) {
|
|
45
|
-
node.dispatchEvent(
|
|
46
|
-
new CustomEvent(eventName, {
|
|
47
|
-
...options,
|
|
48
|
-
detail
|
|
49
|
-
})
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// src/dom/get-element.js
|
|
54
|
-
function getNodeType(node) {
|
|
55
|
-
if (node instanceof Element) return "element";
|
|
56
|
-
if (node instanceof NodeList) return "nodelist";
|
|
57
|
-
if (Array.isArray(node)) return "array";
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// src/dom/observers/observer.js
|
|
61
|
-
function useObserverMethodOnTarget(target, observer, method = "observe", options = void 0) {
|
|
62
|
-
const targetType = getNodeType(target);
|
|
63
|
-
if (targetType === "element") observer[method](target, options);
|
|
64
|
-
if (targetType === "nodelist") {
|
|
65
|
-
const elements = Array.from(target);
|
|
66
|
-
elements.forEach((element) => observer[method](element, options));
|
|
67
|
-
}
|
|
68
|
-
if (targetType === "array") {
|
|
69
|
-
target.forEach((element) => observer[method](element, options));
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// src/dom/observers/resize-observer.js
|
|
74
|
-
function resizeObserver(target, options) {
|
|
75
|
-
const { callback, ...opts } = options;
|
|
76
|
-
const observer = new ResizeObserver(observerFn);
|
|
77
|
-
if (target === window || target === document)
|
|
78
|
-
target = document.documentElement;
|
|
79
|
-
useObserverMethodOnTarget(target, observer, "observe", opts);
|
|
80
|
-
function observerFn(entries) {
|
|
81
|
-
for (const entry of entries) {
|
|
82
|
-
if (callback) callback({ entry, entries, observer });
|
|
83
|
-
else
|
|
84
|
-
dispatchEvent(entry.target, "resize-obs", { entry, entries, observer });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return {
|
|
88
|
-
observe(target2) {
|
|
89
|
-
useObserverMethodOnTarget(target2, observer, "observe", options);
|
|
90
|
-
},
|
|
91
|
-
unobserve(target2) {
|
|
92
|
-
useObserverMethodOnTarget(target2, observer, "unobserve");
|
|
93
|
-
},
|
|
94
|
-
disconnect: (_) => observer.disconnect(),
|
|
95
|
-
destroy: (_) => observer.disconnect()
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// src/dom/ui/scroll-container.js
|
|
100
|
-
function findScrollContainer(element, direction = "both") {
|
|
101
|
-
if (!element) return;
|
|
102
|
-
let parent = element.parentElement;
|
|
103
|
-
while (parent) {
|
|
104
|
-
const { overflow, overflowX, overflowY } = getComputedStyle(parent);
|
|
105
|
-
if (direction === "both") {
|
|
106
|
-
if (overflow.includes("auto") || overflow.includes("scroll"))
|
|
107
|
-
return parent;
|
|
108
|
-
}
|
|
109
|
-
if (direction === "horizontal") {
|
|
110
|
-
if (overflowX === "auto" || overflowX === "scroll") return parent;
|
|
111
|
-
}
|
|
112
|
-
if (direction === "vertical") {
|
|
113
|
-
if (overflowY === "auto" || overflowY === "scroll") return parent;
|
|
114
|
-
}
|
|
115
|
-
parent = parent.parentElement;
|
|
116
|
-
}
|
|
117
|
-
return document.documentElement;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// src/dom/actions/sticky.js
|
|
1
|
+
import { boundingBoxRelativeToAncestor } from "../bounding-box.js";
|
|
2
|
+
import { resizeObserver } from "../observers/resize-observer.js";
|
|
3
|
+
import { findScrollContainer } from "../ui/scroll-container.js";
|
|
121
4
|
function sticky(node, props = {}) {
|
|
122
5
|
const scrollContainer = findScrollContainer(node);
|
|
123
6
|
let stickyTBLR = getComputedTBLR(node);
|
package/dist/esm/dom/cookie.js
CHANGED
package/dist/esm/dom/css-vars.js
CHANGED
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
function getElement(selector) {
|
|
3
|
-
if (!selector) return;
|
|
4
|
-
if (selector instanceof Element) return selector;
|
|
5
|
-
return document.querySelector(selector);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
// src/dom/css-vars.js
|
|
1
|
+
import { getElement } from "./get-element.js";
|
|
9
2
|
function getCSSValue(element, prop) {
|
|
10
3
|
return getCSSVar(element, prop);
|
|
11
4
|
}
|
package/dist/esm/dom/events.js
CHANGED