@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.
Files changed (201) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/dom/accessibility.cjs +0 -2
  3. package/dist/cjs/dom/actions/index.cjs +7 -391
  4. package/dist/cjs/dom/actions/masonry.cjs +6 -97
  5. package/dist/cjs/dom/actions/prefer-horizontal-scroll.cjs +14 -58
  6. package/dist/cjs/dom/actions/sticky.cjs +6 -126
  7. package/dist/cjs/dom/bounding-box.cjs +0 -2
  8. package/dist/cjs/dom/clipboard.cjs +0 -2
  9. package/dist/cjs/dom/cookie.cjs +1 -3
  10. package/dist/cjs/dom/css-vars.cjs +3 -13
  11. package/dist/cjs/dom/events.cjs +0 -2
  12. package/dist/cjs/dom/focusable.cjs +0 -2
  13. package/dist/cjs/dom/font-size.cjs +3 -15
  14. package/dist/cjs/dom/get-element.cjs +1 -3
  15. package/dist/cjs/dom/hash.cjs +0 -2
  16. package/dist/cjs/dom/index.cjs +47 -1248
  17. package/dist/cjs/dom/keyboard.cjs +0 -2
  18. package/dist/cjs/dom/local-store.cjs +1 -3
  19. package/dist/cjs/dom/media.cjs +0 -2
  20. package/dist/cjs/dom/observers/index.cjs +9 -235
  21. package/dist/cjs/dom/observers/intersection-observer.cjs +6 -38
  22. package/dist/cjs/dom/observers/mutation-observer.cjs +6 -38
  23. package/dist/cjs/dom/observers/observer.cjs +2 -12
  24. package/dist/cjs/dom/observers/resize-observer.cjs +6 -38
  25. package/dist/cjs/dom/observers/scroll-observer.cjs +3 -62
  26. package/dist/cjs/dom/pkce.cjs +3 -13
  27. package/dist/cjs/dom/query-params.cjs +1 -3
  28. package/dist/cjs/dom/random-string.cjs +0 -2
  29. package/dist/cjs/dom/sanitize.cjs +3 -27
  30. package/dist/cjs/dom/session-store.cjs +1 -3
  31. package/dist/cjs/dom/spam-prevention.cjs +0 -2
  32. package/dist/cjs/dom/trap-focus.cjs +9 -131
  33. package/dist/cjs/dom/ui/aria-current.cjs +0 -2
  34. package/dist/cjs/dom/ui/inconsistent-button-fix.cjs +0 -2
  35. package/dist/cjs/dom/ui/index.cjs +9 -87
  36. package/dist/cjs/dom/ui/scroll-container.cjs +0 -2
  37. package/dist/cjs/dom/ui/traverse-and-scramble.cjs +0 -2
  38. package/dist/cjs/lib/arrays/index.cjs +13 -121
  39. package/dist/cjs/lib/arrays/item-position.cjs +0 -2
  40. package/dist/cjs/lib/arrays/join.cjs +2 -10
  41. package/dist/cjs/lib/arrays/shuffle.cjs +0 -2
  42. package/dist/cjs/lib/arrays/sort.cjs +3 -11
  43. package/dist/cjs/lib/arrays/split-array.cjs +0 -2
  44. package/dist/cjs/lib/arrays/unique.cjs +0 -2
  45. package/dist/cjs/lib/auth/index.cjs +3 -35
  46. package/dist/cjs/lib/auth/route-manager.cjs +0 -2
  47. package/dist/cjs/lib/checks.cjs +0 -2
  48. package/dist/cjs/lib/date/days.cjs +1 -3
  49. package/dist/cjs/lib/date/index.cjs +7 -190
  50. package/dist/cjs/lib/date/months.cjs +1 -3
  51. package/dist/cjs/lib/date/time.cjs +2 -14
  52. package/dist/cjs/lib/form/form-data.cjs +0 -2
  53. package/dist/cjs/lib/form/index.cjs +5 -104
  54. package/dist/cjs/lib/form/sanitize.cjs +0 -2
  55. package/dist/cjs/lib/functions/callback.cjs +0 -2
  56. package/dist/cjs/lib/functions/debounce.cjs +0 -2
  57. package/dist/cjs/lib/functions/env.cjs +0 -2
  58. package/dist/cjs/lib/functions/functional.cjs +0 -2
  59. package/dist/cjs/lib/functions/index.cjs +11 -124
  60. package/dist/cjs/lib/functions/throttle.cjs +0 -2
  61. package/dist/cjs/lib/functions/timeout.cjs +0 -2
  62. package/dist/cjs/lib/hash.cjs +0 -2
  63. package/dist/cjs/lib/index.cjs +29 -1155
  64. package/dist/cjs/lib/numbers/index.cjs +4 -17
  65. package/dist/cjs/lib/numbers/math.cjs +0 -2
  66. package/dist/cjs/lib/objects/camelcase-keys.cjs +4 -45
  67. package/dist/cjs/lib/objects/empty.cjs +0 -2
  68. package/dist/cjs/lib/objects/equal.cjs +0 -2
  69. package/dist/cjs/lib/objects/extend.cjs +6 -117
  70. package/dist/cjs/lib/objects/flatten.cjs +3 -11
  71. package/dist/cjs/lib/objects/index.cjs +27 -360
  72. package/dist/cjs/lib/objects/json.cjs +0 -2
  73. package/dist/cjs/lib/objects/loop.cjs +0 -2
  74. package/dist/cjs/lib/objects/mix/mix.cjs +3 -5
  75. package/dist/cjs/lib/objects/nested-property.cjs +0 -2
  76. package/dist/cjs/lib/objects/normalize-object.cjs +4 -78
  77. package/dist/cjs/lib/objects/omit-empty.cjs +0 -2
  78. package/dist/cjs/lib/objects/size.cjs +0 -2
  79. package/dist/cjs/lib/objects/split.cjs +0 -2
  80. package/dist/cjs/lib/promises/index.cjs +3 -51
  81. package/dist/cjs/lib/promises/reject.cjs +2 -19
  82. package/dist/cjs/lib/sse.cjs +4 -29
  83. package/dist/cjs/lib/strings/convert-case/convert-case.cjs +0 -2
  84. package/dist/cjs/lib/strings/index.cjs +11 -179
  85. package/dist/cjs/lib/strings/markdown.cjs +1 -3
  86. package/dist/cjs/lib/strings/name.cjs +0 -2
  87. package/dist/cjs/lib/strings/pluralize.cjs +1 -3
  88. package/dist/cjs/lib/strings/query-string.cjs +0 -2
  89. package/dist/cjs/lib/style/index.cjs +2 -31
  90. package/dist/cjs/lib/symbols/index.cjs +3 -22
  91. package/dist/cjs/lib/symbols/symbols.cjs +0 -2
  92. package/dist/cjs/node/common.cjs +0 -2
  93. package/dist/cjs/node/dirname.cjs +2 -4
  94. package/dist/cjs/node/file-cache.cjs +3 -45
  95. package/dist/cjs/node/file.cjs +2 -4
  96. package/dist/cjs/node/hash.cjs +1 -3
  97. package/dist/cjs/node/index.cjs +15 -272
  98. package/dist/cjs/node/pkce.cjs +5 -15
  99. package/dist/cjs/node/random-string.cjs +1 -3
  100. package/dist/cjs/node/sanitize.cjs +3 -27
  101. package/dist/esm/dom/accessibility.js +0 -1
  102. package/dist/esm/dom/actions/index.js +3 -381
  103. package/dist/esm/dom/actions/masonry.js +3 -91
  104. package/dist/esm/dom/actions/prefer-horizontal-scroll.js +4 -45
  105. package/dist/esm/dom/actions/sticky.js +3 -120
  106. package/dist/esm/dom/bounding-box.js +0 -1
  107. package/dist/esm/dom/clipboard.js +0 -1
  108. package/dist/esm/dom/cookie.js +1 -2
  109. package/dist/esm/dom/css-vars.js +1 -8
  110. package/dist/esm/dom/events.js +0 -1
  111. package/dist/esm/dom/focusable.js +0 -1
  112. package/dist/esm/dom/font-size.js +1 -10
  113. package/dist/esm/dom/get-element.js +1 -2
  114. package/dist/esm/dom/hash.js +0 -1
  115. package/dist/esm/dom/index.js +23 -1168
  116. package/dist/esm/dom/keyboard.js +0 -1
  117. package/dist/esm/dom/local-store.js +1 -2
  118. package/dist/esm/dom/media.js +0 -1
  119. package/dist/esm/dom/observers/index.js +4 -224
  120. package/dist/esm/dom/observers/intersection-observer.js +2 -31
  121. package/dist/esm/dom/observers/mutation-observer.js +3 -32
  122. package/dist/esm/dom/observers/observer.js +1 -8
  123. package/dist/esm/dom/observers/resize-observer.js +2 -31
  124. package/dist/esm/dom/observers/scroll-observer.js +2 -58
  125. package/dist/esm/dom/pkce.js +1 -8
  126. package/dist/esm/dom/query-params.js +1 -2
  127. package/dist/esm/dom/random-string.js +0 -1
  128. package/dist/esm/dom/sanitize.js +3 -26
  129. package/dist/esm/dom/session-store.js +1 -2
  130. package/dist/esm/dom/spam-prevention.js +0 -1
  131. package/dist/esm/dom/trap-focus.js +2 -121
  132. package/dist/esm/dom/ui/aria-current.js +0 -1
  133. package/dist/esm/dom/ui/inconsistent-button-fix.js +0 -1
  134. package/dist/esm/dom/ui/index.js +4 -75
  135. package/dist/esm/dom/ui/scroll-container.js +0 -1
  136. package/dist/esm/dom/ui/traverse-and-scramble.js +0 -1
  137. package/dist/esm/lib/arrays/index.js +6 -106
  138. package/dist/esm/lib/arrays/item-position.js +0 -1
  139. package/dist/esm/lib/arrays/join.js +1 -6
  140. package/dist/esm/lib/arrays/shuffle.js +0 -1
  141. package/dist/esm/lib/arrays/sort.js +1 -6
  142. package/dist/esm/lib/arrays/split-array.js +0 -1
  143. package/dist/esm/lib/arrays/unique.js +0 -1
  144. package/dist/esm/lib/auth/index.js +1 -26
  145. package/dist/esm/lib/auth/route-manager.js +0 -1
  146. package/dist/esm/lib/checks.js +0 -1
  147. package/dist/esm/lib/date/days.js +1 -2
  148. package/dist/esm/lib/date/index.js +3 -173
  149. package/dist/esm/lib/date/months.js +1 -2
  150. package/dist/esm/lib/date/time.js +1 -10
  151. package/dist/esm/lib/form/form-data.js +0 -1
  152. package/dist/esm/lib/form/index.js +2 -92
  153. package/dist/esm/lib/form/sanitize.js +0 -1
  154. package/dist/esm/lib/functions/callback.js +0 -1
  155. package/dist/esm/lib/functions/debounce.js +0 -1
  156. package/dist/esm/lib/functions/env.js +0 -1
  157. package/dist/esm/lib/functions/functional.js +0 -1
  158. package/dist/esm/lib/functions/index.js +5 -105
  159. package/dist/esm/lib/functions/throttle.js +0 -1
  160. package/dist/esm/lib/functions/timeout.js +0 -1
  161. package/dist/esm/lib/hash.js +0 -1
  162. package/dist/esm/lib/index.js +14 -1052
  163. package/dist/esm/lib/numbers/index.js +2 -12
  164. package/dist/esm/lib/numbers/math.js +0 -1
  165. package/dist/esm/lib/objects/camelcase-keys.js +2 -40
  166. package/dist/esm/lib/objects/empty.js +0 -1
  167. package/dist/esm/lib/objects/equal.js +0 -1
  168. package/dist/esm/lib/objects/extend.js +3 -111
  169. package/dist/esm/lib/objects/flatten.js +1 -6
  170. package/dist/esm/lib/objects/index.js +13 -323
  171. package/dist/esm/lib/objects/json.js +0 -1
  172. package/dist/esm/lib/objects/loop.js +0 -1
  173. package/dist/esm/lib/objects/mix/mix.js +3 -4
  174. package/dist/esm/lib/objects/nested-property.js +0 -1
  175. package/dist/esm/lib/objects/normalize-object.js +3 -74
  176. package/dist/esm/lib/objects/omit-empty.js +0 -1
  177. package/dist/esm/lib/objects/size.js +0 -1
  178. package/dist/esm/lib/objects/split.js +0 -1
  179. package/dist/esm/lib/promises/index.js +1 -33
  180. package/dist/esm/lib/promises/reject.js +1 -17
  181. package/dist/esm/lib/sse.js +2 -24
  182. package/dist/esm/lib/strings/convert-case/convert-case.js +0 -1
  183. package/dist/esm/lib/strings/index.js +5 -147
  184. package/dist/esm/lib/strings/markdown.js +1 -2
  185. package/dist/esm/lib/strings/name.js +0 -1
  186. package/dist/esm/lib/strings/pluralize.js +1 -2
  187. package/dist/esm/lib/strings/query-string.js +0 -1
  188. package/dist/esm/lib/style/index.js +1 -27
  189. package/dist/esm/lib/symbols/index.js +1 -13
  190. package/dist/esm/lib/symbols/symbols.js +0 -1
  191. package/dist/esm/node/common.js +0 -1
  192. package/dist/esm/node/dirname.js +2 -3
  193. package/dist/esm/node/file-cache.js +2 -43
  194. package/dist/esm/node/file.js +2 -3
  195. package/dist/esm/node/hash.js +1 -2
  196. package/dist/esm/node/index.js +7 -243
  197. package/dist/esm/node/pkce.js +3 -12
  198. package/dist/esm/node/random-string.js +1 -2
  199. package/dist/esm/node/sanitize.js +3 -26
  200. package/package.json +1 -1
  201. package/tsup.config.mjs +2 -0
@@ -1,381 +1,3 @@
1
- // src/dom/get-element.js
2
- function getNodeType(node) {
3
- if (node instanceof Element) return "element";
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
- // src/dom/get-element.js
2
- function getNodeType(node) {
3
- if (node instanceof Element) return "element";
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
- // src/lib/objects/omit-empty.js
2
- function omitEmpty(obj, shallow = false) {
3
- if (typeof obj !== "object" || obj === null) return obj;
4
- if (obj instanceof Date) return obj;
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
- // src/dom/bounding-box.js
2
- function boundingBox(element, { containsPadding = true } = {}) {
3
- const box = element.getBoundingClientRect();
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);
@@ -1,4 +1,3 @@
1
- // src/dom/bounding-box.js
2
1
  function boundingBox(element, { containsPadding = true } = {}) {
3
2
  const box = element.getBoundingClientRect();
4
3
  const ret = {};
@@ -1,4 +1,3 @@
1
- // src/dom/clipboard.js
2
1
  function copyRichText(element) {
3
2
  const range = document.createRange();
4
3
  range.selectNode(element);
@@ -1,5 +1,4 @@
1
- // src/dom/cookie.js
2
- var cookies = {
1
+ const cookies = {
3
2
  get(name) {
4
3
  return getCookie(name);
5
4
  },
@@ -1,11 +1,4 @@
1
- // src/dom/get-element.js
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
  }
@@ -1,4 +1,3 @@
1
- // src/dom/events.js
2
1
  function addListeners(listeners) {
3
2
  listeners.forEach(({ node, event, handler }) => {
4
3
  node.addEventListener(event, handler);