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