@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.
Files changed (228) hide show
  1. package/dist/cjs/dom/accessibility.cjs +2 -0
  2. package/dist/cjs/dom/actions/index.cjs +392 -7
  3. package/dist/cjs/dom/actions/masonry.cjs +97 -6
  4. package/dist/cjs/dom/actions/prefer-horizontal-scroll.cjs +58 -14
  5. package/dist/cjs/dom/actions/sticky.cjs +126 -6
  6. package/dist/cjs/dom/bounding-box.cjs +2 -0
  7. package/dist/cjs/dom/clipboard.cjs +2 -0
  8. package/dist/cjs/dom/cookie.cjs +3 -1
  9. package/dist/cjs/dom/css-vars.cjs +13 -3
  10. package/dist/cjs/dom/events.cjs +2 -0
  11. package/dist/cjs/dom/focusable.cjs +2 -0
  12. package/dist/cjs/dom/font-size.cjs +15 -3
  13. package/dist/cjs/dom/get-element.cjs +3 -1
  14. package/dist/cjs/dom/hash.cjs +2 -0
  15. package/dist/cjs/dom/index.cjs +1249 -47
  16. package/dist/cjs/dom/keyboard.cjs +2 -0
  17. package/dist/cjs/dom/local-store.cjs +3 -1
  18. package/dist/cjs/dom/media.cjs +2 -0
  19. package/dist/cjs/dom/observers/index.cjs +235 -9
  20. package/dist/cjs/dom/observers/intersection-observer.cjs +38 -6
  21. package/dist/cjs/dom/observers/mutation-observer.cjs +38 -6
  22. package/dist/cjs/dom/observers/observer.cjs +12 -2
  23. package/dist/cjs/dom/observers/resize-observer.cjs +38 -6
  24. package/dist/cjs/dom/observers/scroll-observer.cjs +62 -3
  25. package/dist/cjs/dom/pkce.cjs +13 -3
  26. package/dist/cjs/dom/query-params.cjs +3 -1
  27. package/dist/cjs/dom/random-string.cjs +2 -0
  28. package/dist/cjs/dom/sanitize.cjs +27 -3
  29. package/dist/cjs/dom/session-store.cjs +3 -1
  30. package/dist/cjs/dom/spam-prevention.cjs +2 -0
  31. package/dist/cjs/dom/trap-focus.cjs +131 -9
  32. package/dist/cjs/dom/ui/aria-current.cjs +2 -0
  33. package/dist/cjs/dom/ui/inconsistent-button-fix.cjs +2 -0
  34. package/dist/cjs/dom/ui/index.cjs +87 -9
  35. package/dist/cjs/dom/ui/scroll-container.cjs +2 -0
  36. package/dist/cjs/dom/ui/traverse-and-scramble.cjs +2 -0
  37. package/dist/cjs/lib/arrays/index.cjs +121 -13
  38. package/dist/cjs/lib/arrays/item-position.cjs +2 -0
  39. package/dist/cjs/lib/arrays/join.cjs +10 -2
  40. package/dist/cjs/lib/arrays/shuffle.cjs +2 -0
  41. package/dist/cjs/lib/arrays/sort.cjs +11 -3
  42. package/dist/cjs/lib/arrays/split-array.cjs +2 -0
  43. package/dist/cjs/lib/arrays/unique.cjs +2 -0
  44. package/dist/cjs/lib/auth/index.cjs +35 -3
  45. package/dist/cjs/lib/auth/route-manager.cjs +2 -0
  46. package/dist/cjs/lib/checks.cjs +2 -0
  47. package/dist/cjs/lib/date/days.cjs +3 -1
  48. package/dist/cjs/lib/date/index.cjs +190 -7
  49. package/dist/cjs/lib/date/months.cjs +3 -1
  50. package/dist/cjs/lib/date/time.cjs +14 -2
  51. package/dist/cjs/lib/form/form-data.cjs +2 -0
  52. package/dist/cjs/lib/form/index.cjs +104 -5
  53. package/dist/cjs/lib/form/sanitize.cjs +2 -0
  54. package/dist/cjs/lib/functions/callback.cjs +2 -0
  55. package/dist/cjs/lib/functions/debounce.cjs +2 -0
  56. package/dist/cjs/lib/functions/env.cjs +2 -0
  57. package/dist/cjs/lib/functions/functional.cjs +2 -0
  58. package/dist/cjs/lib/functions/index.cjs +124 -11
  59. package/dist/cjs/lib/functions/throttle.cjs +2 -0
  60. package/dist/cjs/lib/functions/timeout.cjs +2 -0
  61. package/dist/cjs/lib/hash.cjs +2 -0
  62. package/dist/cjs/lib/index.cjs +1160 -29
  63. package/dist/cjs/lib/numbers/index.cjs +17 -4
  64. package/dist/cjs/lib/numbers/math.cjs +2 -0
  65. package/dist/cjs/lib/objects/camelcase-keys.cjs +45 -4
  66. package/dist/cjs/lib/objects/empty.cjs +2 -0
  67. package/dist/cjs/lib/objects/equal.cjs +2 -0
  68. package/dist/cjs/lib/objects/extend.cjs +117 -6
  69. package/dist/cjs/lib/objects/flatten.cjs +11 -3
  70. package/dist/cjs/lib/objects/index.cjs +360 -27
  71. package/dist/cjs/lib/objects/json.cjs +2 -0
  72. package/dist/cjs/lib/objects/loop.cjs +2 -0
  73. package/dist/cjs/lib/objects/mix/mix.cjs +5 -3
  74. package/dist/cjs/lib/objects/nested-property.cjs +2 -0
  75. package/dist/cjs/lib/objects/normalize-object.cjs +78 -4
  76. package/dist/cjs/lib/objects/omit-empty.cjs +2 -0
  77. package/dist/cjs/lib/objects/size.cjs +2 -0
  78. package/dist/cjs/lib/objects/split.cjs +2 -0
  79. package/dist/cjs/lib/promises/index.cjs +51 -3
  80. package/dist/cjs/lib/promises/reject.cjs +19 -2
  81. package/dist/cjs/lib/sse.cjs +29 -4
  82. package/dist/cjs/lib/strings/convert-case/convert-case.cjs +2 -0
  83. package/dist/cjs/lib/strings/index.cjs +179 -11
  84. package/dist/cjs/lib/strings/markdown.cjs +3 -1
  85. package/dist/cjs/lib/strings/name.cjs +2 -0
  86. package/dist/cjs/lib/strings/pluralize.cjs +3 -1
  87. package/dist/cjs/lib/strings/query-string.cjs +2 -0
  88. package/dist/cjs/lib/style/index.cjs +31 -2
  89. package/dist/cjs/lib/symbols/index.cjs +22 -3
  90. package/dist/cjs/lib/symbols/symbols.cjs +2 -0
  91. package/dist/cjs/node/context.cjs +0 -0
  92. package/dist/cjs/node/dirname.cjs +4 -2
  93. package/dist/cjs/node/file-cache.cjs +45 -3
  94. package/dist/cjs/node/file.cjs +4 -2
  95. package/dist/cjs/node/hash.cjs +3 -1
  96. package/dist/cjs/node/index.cjs +278 -15
  97. package/dist/cjs/node/pkce.cjs +20 -8
  98. package/dist/cjs/node/random-string.cjs +3 -1
  99. package/dist/cjs/node/sanitize.cjs +27 -3
  100. package/dist/cjs/node/uuid.cjs +2 -0
  101. package/dist/esm/node/context.js +0 -0
  102. package/dist/esm/node/file-cache.js +1 -1
  103. package/dist/esm/node/pkce.js +3 -2
  104. package/dist/types/node/context.d.cts +2 -0
  105. package/dist/types/node/index.d.cts +1 -1
  106. package/dist/types/node/pkce.d.cts +7 -1
  107. package/package.json +5 -2
  108. package/CHANGELOG.md +0 -231
  109. package/eslint.config.js +0 -2
  110. package/src/dom/accessibility.js +0 -58
  111. package/src/dom/actions/index.js +0 -3
  112. package/src/dom/actions/masonry.js +0 -43
  113. package/src/dom/actions/prefer-horizontal-scroll.js +0 -121
  114. package/src/dom/actions/sticky.js +0 -85
  115. package/src/dom/bounding-box.js +0 -82
  116. package/src/dom/clipboard.js +0 -14
  117. package/src/dom/cookie.js +0 -32
  118. package/src/dom/css-vars.js +0 -19
  119. package/src/dom/events.js +0 -71
  120. package/src/dom/focusable.js +0 -165
  121. package/src/dom/font-size.js +0 -40
  122. package/src/dom/get-element.js +0 -176
  123. package/src/dom/hash.js +0 -9
  124. package/src/dom/index.js +0 -23
  125. package/src/dom/keyboard.js +0 -44
  126. package/src/dom/local-store.js +0 -66
  127. package/src/dom/media.js +0 -30
  128. package/src/dom/observers/index.js +0 -4
  129. package/src/dom/observers/intersection-observer.js +0 -43
  130. package/src/dom/observers/mutation-observer.js +0 -51
  131. package/src/dom/observers/observer.js +0 -18
  132. package/src/dom/observers/resize-observer.js +0 -66
  133. package/src/dom/observers/scroll-observer.js +0 -146
  134. package/src/dom/pkce.js +0 -34
  135. package/src/dom/query-params.js +0 -14
  136. package/src/dom/random-string.js +0 -18
  137. package/src/dom/random-string.test.js +0 -13
  138. package/src/dom/sanitize.js +0 -16
  139. package/src/dom/session-store.js +0 -29
  140. package/src/dom/spam-prevention.js +0 -40
  141. package/src/dom/trap-focus.js +0 -70
  142. package/src/dom/ui/aria-current.js +0 -20
  143. package/src/dom/ui/inconsistent-button-fix.js +0 -20
  144. package/src/dom/ui/index.js +0 -4
  145. package/src/dom/ui/scroll-container.js +0 -25
  146. package/src/dom/ui/traverse-and-scramble.js +0 -61
  147. package/src/lib/arrays/index.js +0 -6
  148. package/src/lib/arrays/item-position.js +0 -23
  149. package/src/lib/arrays/join.js +0 -20
  150. package/src/lib/arrays/shuffle.js +0 -21
  151. package/src/lib/arrays/sort.js +0 -88
  152. package/src/lib/arrays/sort.spec.js +0 -123
  153. package/src/lib/arrays/split-array.js +0 -15
  154. package/src/lib/arrays/unique.js +0 -3
  155. package/src/lib/auth/index.js +0 -1
  156. package/src/lib/auth/route-manager.js +0 -45
  157. package/src/lib/checks.js +0 -57
  158. package/src/lib/date/days.js +0 -9
  159. package/src/lib/date/index.js +0 -3
  160. package/src/lib/date/months.js +0 -74
  161. package/src/lib/date/time.js +0 -83
  162. package/src/lib/form/form-data.js +0 -73
  163. package/src/lib/form/index.js +0 -2
  164. package/src/lib/form/sanitize.js +0 -80
  165. package/src/lib/form/sanitize.spec.js +0 -126
  166. package/src/lib/functions/callback.js +0 -8
  167. package/src/lib/functions/debounce.js +0 -18
  168. package/src/lib/functions/env.js +0 -5
  169. package/src/lib/functions/functional.js +0 -113
  170. package/src/lib/functions/functional.test.js +0 -196
  171. package/src/lib/functions/index.js +0 -5
  172. package/src/lib/functions/throttle.js +0 -11
  173. package/src/lib/functions/timeout.js +0 -15
  174. package/src/lib/hash.js +0 -18
  175. package/src/lib/hash.spec.js +0 -163
  176. package/src/lib/index.js +0 -14
  177. package/src/lib/numbers/index.js +0 -12
  178. package/src/lib/numbers/math.js +0 -9
  179. package/src/lib/numbers/split-unit.test.js +0 -45
  180. package/src/lib/objects/camelcase-keys.js +0 -17
  181. package/src/lib/objects/camelcase-keys.test.js +0 -72
  182. package/src/lib/objects/empty.js +0 -10
  183. package/src/lib/objects/equal.js +0 -9
  184. package/src/lib/objects/extend.js +0 -16
  185. package/src/lib/objects/extend.test.js +0 -35
  186. package/src/lib/objects/flatten.js +0 -19
  187. package/src/lib/objects/index.js +0 -13
  188. package/src/lib/objects/json.js +0 -7
  189. package/src/lib/objects/loop.js +0 -11
  190. package/src/lib/objects/loop.test.js +0 -31
  191. package/src/lib/objects/mix/mix.js +0 -191
  192. package/src/lib/objects/mix/mix.md +0 -78
  193. package/src/lib/objects/mix/mix.test.js +0 -445
  194. package/src/lib/objects/nested-property.js +0 -41
  195. package/src/lib/objects/normalize-object.js +0 -10
  196. package/src/lib/objects/omit-empty.js +0 -23
  197. package/src/lib/objects/omit-empty.test.js +0 -85
  198. package/src/lib/objects/size.js +0 -41
  199. package/src/lib/objects/split.js +0 -19
  200. package/src/lib/promises/index.js +0 -1
  201. package/src/lib/promises/reject.js +0 -17
  202. package/src/lib/sse.js +0 -61
  203. package/src/lib/strings/convert-case/convert-case.js +0 -86
  204. package/src/lib/strings/convert-case/convert-case.md +0 -44
  205. package/src/lib/strings/convert-case/convert-case.test.js +0 -50
  206. package/src/lib/strings/index.js +0 -5
  207. package/src/lib/strings/markdown.js +0 -71
  208. package/src/lib/strings/name.js +0 -24
  209. package/src/lib/strings/name.test.js +0 -67
  210. package/src/lib/strings/pluralize.js +0 -2
  211. package/src/lib/strings/query-string.js +0 -18
  212. package/src/lib/style/index.js +0 -13
  213. package/src/lib/symbols/index.js +0 -1
  214. package/src/lib/symbols/symbols.js +0 -9
  215. package/src/node/dirname.js +0 -17
  216. package/src/node/file-cache.js +0 -184
  217. package/src/node/file.js +0 -13
  218. package/src/node/hash.js +0 -5
  219. package/src/node/index.js +0 -7
  220. package/src/node/pkce.js +0 -33
  221. package/src/node/random-string.js +0 -10
  222. package/src/node/random-string.test.js +0 -15
  223. package/src/node/sanitize.js +0 -13
  224. package/src/node/sanitize.spec.js +0 -142
  225. package/src/node/uuid.js +0 -5
  226. package/tsconfig.json +0 -23
  227. package/tsup.config.js +0 -38
  228. 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
- __reExport(actions_exports, require("./masonry.js"), module.exports);
18
- __reExport(actions_exports, require("./prefer-horizontal-scroll.js"), module.exports);
19
- __reExport(actions_exports, require("./sticky.js"), module.exports);
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
- ...require("./masonry.js"),
23
- ...require("./prefer-horizontal-scroll.js"),
24
- ...require("./sticky.js")
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
- var import_get_element = require("../get-element.js");
24
- var import_media = require("../media.js");
25
- var import_resize_observer = require("../observers/resize-observer.js");
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 = (0, import_get_element.getChildrenElements)(node);
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 (0, import_media.mediaLoaded)(node);
125
+ await mediaLoaded(node);
35
126
  } catch (e) {
36
127
  }
37
128
  layout({ colGap, items });
38
- const obs = (0, import_resize_observer.resizeObserver)(node, {
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
- var import_omit_empty = require("../../lib/objects/omit-empty.js");
24
- var import_css_vars = require("../css-vars.js");
25
- var import_events = require("../events.js");
26
- const DEFAULT_OPTIONS = {
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
- ...(0, import_omit_empty.omitEmpty)({
39
- scrollSnapDelay: (0, import_css_vars.getCSSVar)(node, "--scroll-snap-delay")
82
+ ...omitEmpty({
83
+ scrollSnapDelay: getCSSVar(node, "--scroll-snap-delay")
40
84
  }),
41
- ...(0, import_omit_empty.omitEmpty)(props)
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
- (0, import_events.addListeners)(listeners);
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
- (0, import_css_vars.setCSSVar)(node, "--snap-type", "none");
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 = (0, import_css_vars.getCSSVar)(node, "--snap-type") || "proximity";
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
- (0, import_events.removeListeners)(listeners);
136
+ removeListeners(listeners);
93
137
  }
94
138
  };
95
139
  }
96
140
  function restoreHijackedState(node, state) {
97
141
  const scrollLeft = node.scrollLeft;
98
- (0, import_css_vars.setCSSVar)(node, "--snap-type", state.origSnapType);
142
+ setCSSVar(node, "--snap-type", state.origSnapType);
99
143
  const finalScrollLeft = node.scrollLeft;
100
- (0, import_css_vars.setCSSVar)(node, "--snap-type", "none");
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
- (0, import_css_vars.setCSSVar)(node, "--snap-type", state.origSnapType);
148
+ setCSSVar(node, "--snap-type", state.origSnapType);
105
149
  }, 250);
106
150
  }
107
151
  function isTrackpad(event) {