@splendidlabz/utils 1.11.3 → 1.11.5

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 (408) hide show
  1. package/dist/cjs/dom/accessibility.cjs +53 -0
  2. package/dist/cjs/dom/actions/index.cjs +410 -0
  3. package/dist/cjs/dom/actions/masonry.cjs +152 -0
  4. package/dist/cjs/dom/actions/prefer-horizontal-scroll.cjs +157 -0
  5. package/dist/cjs/dom/actions/sticky.cjs +213 -0
  6. package/dist/cjs/dom/bounding-box.cjs +70 -0
  7. package/dist/cjs/dom/clipboard.cjs +37 -0
  8. package/dist/cjs/dom/cookie.cjs +57 -0
  9. package/dist/cjs/dom/css-vars.cjs +57 -0
  10. package/dist/cjs/dom/events.cjs +59 -0
  11. package/{src/dom/focusable.js → dist/cjs/dom/focusable.cjs} +51 -73
  12. package/dist/cjs/dom/font-size.cjs +80 -0
  13. package/dist/cjs/dom/get-element.cjs +98 -0
  14. package/dist/cjs/dom/hash.cjs +35 -0
  15. package/dist/cjs/dom/index.cjs +1267 -0
  16. package/dist/cjs/dom/keyboard.cjs +51 -0
  17. package/dist/cjs/dom/local-store.cjs +79 -0
  18. package/dist/cjs/dom/media.cjs +59 -0
  19. package/dist/cjs/dom/observers/index.cjs +253 -0
  20. package/dist/cjs/dom/observers/intersection-observer.cjs +91 -0
  21. package/dist/cjs/dom/observers/mutation-observer.cjs +95 -0
  22. package/dist/cjs/dom/observers/observer.cjs +48 -0
  23. package/dist/cjs/dom/observers/resize-observer.cjs +84 -0
  24. package/dist/cjs/dom/observers/scroll-observer.cjs +177 -0
  25. package/dist/cjs/dom/pkce.cjs +53 -0
  26. package/dist/cjs/dom/query-params.cjs +38 -0
  27. package/dist/cjs/dom/random-string.cjs +38 -0
  28. package/dist/cjs/dom/sanitize.cjs +65 -0
  29. package/dist/cjs/dom/session-store.cjs +49 -0
  30. package/dist/cjs/dom/spam-prevention.cjs +50 -0
  31. package/dist/cjs/dom/trap-focus.cjs +197 -0
  32. package/dist/cjs/dom/ui/aria-current.cjs +43 -0
  33. package/dist/cjs/dom/ui/inconsistent-button-fix.cjs +35 -0
  34. package/dist/cjs/dom/ui/index.cjs +105 -0
  35. package/dist/cjs/dom/ui/scroll-container.cjs +47 -0
  36. package/dist/cjs/dom/ui/traverse-and-scramble.cjs +50 -0
  37. package/dist/cjs/lib/arrays/index.cjs +139 -0
  38. package/dist/cjs/lib/arrays/item-position.cjs +42 -0
  39. package/dist/cjs/lib/arrays/join.cjs +43 -0
  40. package/dist/cjs/lib/arrays/shuffle.cjs +42 -0
  41. package/dist/cjs/lib/arrays/sort.cjs +67 -0
  42. package/dist/cjs/lib/arrays/split-array.cjs +41 -0
  43. package/dist/cjs/lib/arrays/unique.cjs +31 -0
  44. package/dist/cjs/lib/auth/index.cjs +53 -0
  45. package/dist/cjs/lib/auth/route-manager.cjs +51 -0
  46. package/dist/cjs/lib/checks.cjs +63 -0
  47. package/dist/cjs/lib/date/days.cjs +37 -0
  48. package/dist/cjs/lib/date/index.cjs +208 -0
  49. package/dist/cjs/lib/date/months.cjs +102 -0
  50. package/dist/cjs/lib/date/time.cjs +117 -0
  51. package/dist/cjs/lib/form/form-data.cjs +83 -0
  52. package/dist/cjs/lib/form/index.cjs +122 -0
  53. package/dist/cjs/lib/form/sanitize.cjs +61 -0
  54. package/dist/cjs/lib/functions/callback.cjs +31 -0
  55. package/dist/cjs/lib/functions/debounce.cjs +43 -0
  56. package/dist/cjs/lib/functions/env.cjs +32 -0
  57. package/dist/cjs/lib/functions/functional.cjs +82 -0
  58. package/dist/cjs/lib/functions/index.cjs +142 -0
  59. package/dist/cjs/lib/functions/throttle.cjs +38 -0
  60. package/dist/cjs/lib/functions/timeout.cjs +41 -0
  61. package/dist/cjs/lib/hash.cjs +43 -0
  62. package/dist/cjs/lib/index.cjs +1178 -0
  63. package/dist/cjs/lib/numbers/index.cjs +49 -0
  64. package/dist/cjs/lib/numbers/math.cjs +36 -0
  65. package/dist/cjs/lib/objects/camelcase-keys.cjs +80 -0
  66. package/dist/cjs/lib/objects/empty.cjs +39 -0
  67. package/dist/cjs/lib/objects/equal.cjs +47 -0
  68. package/dist/cjs/lib/objects/extend.cjs +147 -0
  69. package/dist/cjs/lib/objects/flatten.cjs +48 -0
  70. package/dist/cjs/lib/objects/index.cjs +378 -0
  71. package/dist/cjs/lib/objects/json.cjs +35 -0
  72. package/dist/cjs/lib/objects/loop.cjs +40 -0
  73. package/dist/cjs/lib/objects/mix/mix.cjs +115 -0
  74. package/dist/cjs/lib/objects/nested-property.cjs +45 -0
  75. package/dist/cjs/lib/objects/normalize-object.cjs +106 -0
  76. package/dist/cjs/lib/objects/omit-empty.cjs +40 -0
  77. package/dist/cjs/lib/objects/size.cjs +63 -0
  78. package/dist/cjs/lib/objects/split.cjs +39 -0
  79. package/dist/cjs/lib/promises/index.cjs +69 -0
  80. package/dist/cjs/lib/promises/reject.cjs +67 -0
  81. package/dist/cjs/lib/sse.cjs +99 -0
  82. package/dist/cjs/lib/strings/convert-case/convert-case.cjs +96 -0
  83. package/dist/cjs/lib/strings/index.cjs +197 -0
  84. package/dist/cjs/lib/strings/markdown.cjs +76 -0
  85. package/dist/cjs/lib/strings/name.cjs +46 -0
  86. package/dist/cjs/lib/strings/pluralize.cjs +40 -0
  87. package/dist/cjs/lib/strings/query-string.cjs +43 -0
  88. package/dist/cjs/lib/style/index.cjs +64 -0
  89. package/dist/cjs/lib/symbols/index.cjs +40 -0
  90. package/dist/cjs/lib/symbols/symbols.cjs +38 -0
  91. package/dist/cjs/node/dirname.cjs +49 -0
  92. package/dist/cjs/node/file-cache.cjs +200 -0
  93. package/dist/cjs/node/file.cjs +50 -0
  94. package/dist/cjs/node/hash.cjs +42 -0
  95. package/dist/cjs/node/index.cjs +296 -0
  96. package/dist/cjs/node/pkce.cjs +64 -0
  97. package/dist/cjs/node/random-string.cjs +43 -0
  98. package/dist/cjs/node/sanitize.cjs +65 -0
  99. package/dist/cjs/node/uuid.cjs +42 -0
  100. package/dist/esm/dom/accessibility.js +26 -0
  101. package/dist/esm/dom/actions/index.js +3 -0
  102. package/dist/esm/dom/actions/masonry.js +38 -0
  103. package/dist/esm/dom/actions/prefer-horizontal-scroll.js +90 -0
  104. package/dist/esm/dom/actions/sticky.js +70 -0
  105. package/dist/esm/dom/bounding-box.js +44 -0
  106. package/dist/esm/dom/clipboard.js +12 -0
  107. package/dist/esm/dom/cookie.js +31 -0
  108. package/dist/esm/dom/css-vars.js +21 -0
  109. package/dist/esm/dom/events.js +31 -0
  110. package/dist/esm/dom/focusable.js +117 -0
  111. package/dist/esm/dom/font-size.js +40 -0
  112. package/dist/esm/dom/get-element.js +66 -0
  113. package/dist/esm/dom/hash.js +10 -0
  114. package/dist/esm/dom/index.js +23 -0
  115. package/dist/esm/dom/keyboard.js +22 -0
  116. package/{src → dist/esm}/dom/local-store.js +16 -28
  117. package/dist/esm/dom/media.js +32 -0
  118. package/dist/esm/dom/observers/index.js +4 -0
  119. package/dist/esm/dom/observers/intersection-observer.js +36 -0
  120. package/dist/esm/dom/observers/mutation-observer.js +40 -0
  121. package/dist/esm/dom/observers/observer.js +15 -0
  122. package/dist/esm/dom/observers/resize-observer.js +29 -0
  123. package/dist/esm/dom/observers/scroll-observer.js +95 -0
  124. package/dist/esm/dom/pkce.js +20 -0
  125. package/dist/esm/dom/query-params.js +13 -0
  126. package/dist/esm/dom/random-string.js +12 -0
  127. package/dist/esm/dom/sanitize.js +8 -0
  128. package/dist/esm/dom/session-store.js +24 -0
  129. package/dist/esm/dom/spam-prevention.js +25 -0
  130. package/dist/esm/dom/trap-focus.js +51 -0
  131. package/dist/esm/dom/ui/aria-current.js +17 -0
  132. package/dist/esm/dom/ui/inconsistent-button-fix.js +10 -0
  133. package/dist/esm/dom/ui/index.js +4 -0
  134. package/dist/esm/dom/ui/scroll-container.js +22 -0
  135. package/dist/esm/dom/ui/traverse-and-scramble.js +25 -0
  136. package/dist/esm/lib/arrays/index.js +6 -0
  137. package/dist/esm/lib/arrays/item-position.js +15 -0
  138. package/dist/esm/lib/arrays/join.js +12 -0
  139. package/dist/esm/lib/arrays/shuffle.js +17 -0
  140. package/dist/esm/lib/arrays/sort.js +36 -0
  141. package/dist/esm/lib/arrays/split-array.js +16 -0
  142. package/dist/esm/lib/arrays/unique.js +6 -0
  143. package/dist/esm/lib/auth/index.js +1 -0
  144. package/dist/esm/lib/auth/route-manager.js +25 -0
  145. package/dist/esm/lib/checks.js +34 -0
  146. package/dist/esm/lib/date/days.js +12 -0
  147. package/dist/esm/lib/date/index.js +3 -0
  148. package/dist/esm/lib/date/months.js +77 -0
  149. package/dist/esm/lib/date/time.js +75 -0
  150. package/dist/esm/lib/form/form-data.js +57 -0
  151. package/dist/esm/lib/form/index.js +2 -0
  152. package/dist/esm/lib/form/sanitize.js +34 -0
  153. package/dist/esm/lib/functions/callback.js +6 -0
  154. package/dist/esm/lib/functions/debounce.js +18 -0
  155. package/dist/esm/lib/functions/env.js +7 -0
  156. package/dist/esm/lib/functions/functional.js +52 -0
  157. package/dist/esm/lib/functions/index.js +5 -0
  158. package/dist/esm/lib/functions/throttle.js +13 -0
  159. package/dist/esm/lib/functions/timeout.js +14 -0
  160. package/dist/esm/lib/hash.js +18 -0
  161. package/dist/esm/lib/index.js +14 -0
  162. package/dist/esm/lib/numbers/index.js +11 -0
  163. package/dist/esm/lib/numbers/math.js +10 -0
  164. package/dist/esm/lib/objects/camelcase-keys.js +16 -0
  165. package/dist/esm/lib/objects/empty.js +13 -0
  166. package/dist/esm/lib/objects/equal.js +11 -0
  167. package/dist/esm/lib/objects/extend.js +13 -0
  168. package/dist/esm/lib/objects/flatten.js +17 -0
  169. package/dist/esm/lib/objects/index.js +13 -0
  170. package/dist/esm/lib/objects/json.js +10 -0
  171. package/dist/esm/lib/objects/loop.js +14 -0
  172. package/dist/esm/lib/objects/mix/mix.js +88 -0
  173. package/dist/esm/lib/objects/nested-property.js +18 -0
  174. package/dist/esm/lib/objects/normalize-object.js +9 -0
  175. package/dist/esm/lib/objects/omit-empty.js +15 -0
  176. package/dist/esm/lib/objects/size.js +38 -0
  177. package/dist/esm/lib/objects/split.js +14 -0
  178. package/dist/esm/lib/promises/index.js +1 -0
  179. package/dist/esm/lib/promises/reject.js +17 -0
  180. package/dist/esm/lib/sse.js +50 -0
  181. package/dist/esm/lib/strings/convert-case/convert-case.js +64 -0
  182. package/dist/esm/lib/strings/index.js +5 -0
  183. package/dist/esm/lib/strings/markdown.js +40 -0
  184. package/dist/esm/lib/strings/name.js +21 -0
  185. package/dist/esm/lib/strings/pluralize.js +5 -0
  186. package/dist/esm/lib/strings/query-string.js +16 -0
  187. package/dist/esm/lib/style/index.js +12 -0
  188. package/dist/esm/lib/symbols/index.js +1 -0
  189. package/dist/esm/lib/symbols/symbols.js +12 -0
  190. package/dist/esm/node/context.js +0 -0
  191. package/dist/esm/node/dirname.js +13 -0
  192. package/dist/esm/node/file-cache.js +121 -0
  193. package/dist/esm/node/file.js +14 -0
  194. package/dist/esm/node/hash.js +7 -0
  195. package/dist/esm/node/index.js +7 -0
  196. package/dist/esm/node/pkce.js +20 -0
  197. package/dist/esm/node/random-string.js +8 -0
  198. package/dist/esm/node/sanitize.js +8 -0
  199. package/dist/esm/node/uuid.js +7 -0
  200. package/dist/types/dom/accessibility.d.cts +30 -0
  201. package/dist/types/dom/actions/index.d.cts +3 -0
  202. package/dist/types/dom/actions/masonry.d.cts +5 -0
  203. package/dist/types/dom/actions/prefer-horizontal-scroll.d.cts +5 -0
  204. package/dist/types/dom/actions/sticky.d.cts +5 -0
  205. package/{src/dom/bounding-box.js → dist/types/dom/bounding-box.d.cts} +8 -49
  206. package/dist/types/dom/clipboard.d.cts +7 -0
  207. package/dist/types/dom/cookie.d.cts +7 -0
  208. package/dist/types/dom/css-vars.d.cts +6 -0
  209. package/{src/dom/events.js → dist/types/dom/events.d.cts} +52 -31
  210. package/dist/types/dom/focusable.d.cts +78 -0
  211. package/dist/types/dom/font-size.d.cts +8 -0
  212. package/{src/dom/get-element.js → dist/types/dom/get-element.d.cts} +25 -99
  213. package/dist/types/dom/hash.d.cts +3 -0
  214. package/dist/types/dom/index.d.cts +31 -0
  215. package/{src/dom/keyboard.js → dist/types/dom/keyboard.d.cts} +7 -19
  216. package/dist/types/dom/local-store.d.cts +31 -0
  217. package/dist/types/dom/media.d.cts +5 -0
  218. package/dist/types/dom/observers/index.d.cts +4 -0
  219. package/dist/types/dom/observers/intersection-observer.d.cts +10 -0
  220. package/dist/types/dom/observers/mutation-observer.d.cts +9 -0
  221. package/dist/types/dom/observers/observer.d.cts +3 -0
  222. package/{src/dom/observers/resize-observer.js → dist/types/dom/observers/resize-observer.d.cts} +6 -32
  223. package/dist/types/dom/observers/scroll-observer.d.cts +40 -0
  224. package/dist/types/dom/pkce.d.cts +8 -0
  225. package/dist/types/dom/query-params.d.cts +6 -0
  226. package/dist/types/dom/random-string.d.cts +9 -0
  227. package/dist/types/dom/sanitize.d.cts +10 -0
  228. package/dist/types/dom/session-store.d.cts +7 -0
  229. package/dist/types/dom/spam-prevention.d.cts +14 -0
  230. package/dist/types/dom/trap-focus.d.cts +32 -0
  231. package/dist/types/dom/ui/aria-current.d.cts +7 -0
  232. package/{src/dom/ui/inconsistent-button-fix.js → dist/types/dom/ui/inconsistent-button-fix.d.cts} +5 -11
  233. package/dist/types/dom/ui/index.d.cts +4 -0
  234. package/dist/types/dom/ui/scroll-container.d.cts +3 -0
  235. package/dist/types/dom/ui/traverse-and-scramble.d.cts +21 -0
  236. package/dist/types/lib/arrays/index.d.cts +6 -0
  237. package/{src/lib/arrays/item-position.js → dist/types/lib/arrays/item-position.d.cts} +5 -12
  238. package/{src/lib/arrays/join.js → dist/types/lib/arrays/join.d.cts} +4 -9
  239. package/dist/types/lib/arrays/shuffle.d.cts +3 -0
  240. package/dist/types/lib/arrays/sort.d.cts +32 -0
  241. package/dist/types/lib/arrays/split-array.d.cts +6 -0
  242. package/dist/types/lib/arrays/unique.d.cts +3 -0
  243. package/dist/types/lib/auth/index.d.cts +1 -0
  244. package/dist/types/lib/auth/route-manager.d.cts +28 -0
  245. package/dist/types/lib/checks.d.cts +33 -0
  246. package/dist/types/lib/date/days.d.cts +7 -0
  247. package/dist/types/lib/date/index.d.cts +3 -0
  248. package/dist/types/lib/date/months.d.cts +11 -0
  249. package/dist/types/lib/date/time.d.cts +21 -0
  250. package/dist/types/lib/form/form-data.d.cts +9 -0
  251. package/dist/types/lib/form/index.d.cts +2 -0
  252. package/{src/lib/form/sanitize.js → dist/types/lib/form/sanitize.d.cts} +19 -39
  253. package/{src/lib/functions/callback.js → dist/types/lib/functions/callback.d.cts} +3 -3
  254. package/dist/types/lib/functions/debounce.d.cts +3 -0
  255. package/dist/types/lib/functions/env.d.cts +3 -0
  256. package/{src/lib/functions/functional.js → dist/types/lib/functions/functional.d.cts} +8 -49
  257. package/dist/types/lib/functions/index.d.cts +5 -0
  258. package/dist/types/lib/functions/throttle.d.cts +3 -0
  259. package/dist/types/lib/functions/timeout.d.cts +5 -0
  260. package/dist/types/lib/hash.d.cts +3 -0
  261. package/dist/types/lib/index.d.cts +43 -0
  262. package/dist/types/lib/numbers/index.d.cts +5 -0
  263. package/dist/types/lib/numbers/math.d.cts +4 -0
  264. package/dist/types/lib/objects/camelcase-keys.d.cts +3 -0
  265. package/dist/types/lib/objects/empty.d.cts +4 -0
  266. package/dist/types/lib/objects/equal.d.cts +4 -0
  267. package/dist/types/lib/objects/extend.d.cts +6 -0
  268. package/dist/types/lib/objects/flatten.d.cts +6 -0
  269. package/dist/types/lib/objects/index.d.cts +13 -0
  270. package/dist/types/lib/objects/json.d.cts +3 -0
  271. package/dist/types/lib/objects/loop.d.cts +4 -0
  272. package/dist/types/lib/objects/mix/mix.d.cts +44 -0
  273. package/{src/lib/objects/nested-property.js → dist/types/lib/objects/nested-property.d.cts} +4 -21
  274. package/dist/types/lib/objects/normalize-object.d.cts +3 -0
  275. package/dist/types/lib/objects/omit-empty.d.cts +3 -0
  276. package/dist/types/lib/objects/size.d.cts +3 -0
  277. package/dist/types/lib/objects/split.d.cts +14 -0
  278. package/dist/types/lib/promises/index.d.cts +1 -0
  279. package/dist/types/lib/promises/reject.d.cts +5 -0
  280. package/dist/types/lib/sse.d.cts +18 -0
  281. package/dist/types/lib/strings/convert-case/convert-case.d.cts +10 -0
  282. package/dist/types/lib/strings/index.d.cts +5 -0
  283. package/dist/types/lib/strings/markdown.d.cts +25 -0
  284. package/dist/types/lib/strings/name.d.cts +7 -0
  285. package/dist/types/lib/strings/pluralize.d.cts +3 -0
  286. package/dist/types/lib/strings/query-string.d.cts +10 -0
  287. package/dist/types/lib/style/index.d.cts +3 -0
  288. package/dist/types/lib/symbols/index.d.cts +1 -0
  289. package/dist/types/lib/symbols/symbols.d.cts +4 -0
  290. package/dist/types/node/context.d.cts +2 -0
  291. package/dist/types/node/dirname.d.cts +9 -0
  292. package/dist/types/node/file-cache.d.cts +56 -0
  293. package/dist/types/node/file.d.cts +4 -0
  294. package/dist/types/node/hash.d.cts +3 -0
  295. package/dist/types/node/index.d.cts +7 -0
  296. package/dist/types/node/pkce.d.cts +14 -0
  297. package/dist/types/node/random-string.d.cts +3 -0
  298. package/{src/node/sanitize.js → dist/types/node/sanitize.d.cts} +3 -6
  299. package/dist/types/node/uuid.d.cts +3 -0
  300. package/package.json +18 -15
  301. package/CHANGELOG.md +0 -237
  302. package/eslint.config.js +0 -2
  303. package/src/dom/accessibility.js +0 -58
  304. package/src/dom/actions/index.js +0 -3
  305. package/src/dom/actions/masonry.js +0 -43
  306. package/src/dom/actions/prefer-horizontal-scroll.js +0 -121
  307. package/src/dom/actions/sticky.js +0 -85
  308. package/src/dom/clipboard.js +0 -14
  309. package/src/dom/cookie.js +0 -32
  310. package/src/dom/css-vars.js +0 -19
  311. package/src/dom/font-size.js +0 -40
  312. package/src/dom/hash.js +0 -9
  313. package/src/dom/index.js +0 -23
  314. package/src/dom/media.js +0 -30
  315. package/src/dom/observers/index.js +0 -4
  316. package/src/dom/observers/intersection-observer.js +0 -43
  317. package/src/dom/observers/mutation-observer.js +0 -51
  318. package/src/dom/observers/observer.js +0 -18
  319. package/src/dom/observers/scroll-observer.js +0 -146
  320. package/src/dom/pkce.js +0 -34
  321. package/src/dom/query-params.js +0 -14
  322. package/src/dom/random-string.js +0 -18
  323. package/src/dom/random-string.test.js +0 -13
  324. package/src/dom/sanitize.js +0 -16
  325. package/src/dom/session-store.js +0 -29
  326. package/src/dom/spam-prevention.js +0 -40
  327. package/src/dom/trap-focus.js +0 -70
  328. package/src/dom/ui/aria-current.js +0 -20
  329. package/src/dom/ui/index.js +0 -4
  330. package/src/dom/ui/scroll-container.js +0 -25
  331. package/src/dom/ui/traverse-and-scramble.js +0 -61
  332. package/src/lib/arrays/index.js +0 -6
  333. package/src/lib/arrays/shuffle.js +0 -21
  334. package/src/lib/arrays/sort.js +0 -88
  335. package/src/lib/arrays/sort.spec.js +0 -123
  336. package/src/lib/arrays/split-array.js +0 -15
  337. package/src/lib/arrays/unique.js +0 -3
  338. package/src/lib/auth/index.js +0 -1
  339. package/src/lib/auth/route-manager.js +0 -45
  340. package/src/lib/checks.js +0 -57
  341. package/src/lib/date/days.js +0 -9
  342. package/src/lib/date/index.js +0 -3
  343. package/src/lib/date/months.js +0 -74
  344. package/src/lib/date/time.js +0 -83
  345. package/src/lib/form/form-data.js +0 -73
  346. package/src/lib/form/index.js +0 -2
  347. package/src/lib/form/sanitize.spec.js +0 -126
  348. package/src/lib/functions/debounce.js +0 -18
  349. package/src/lib/functions/env.js +0 -5
  350. package/src/lib/functions/functional.test.js +0 -196
  351. package/src/lib/functions/index.js +0 -5
  352. package/src/lib/functions/throttle.js +0 -11
  353. package/src/lib/functions/timeout.js +0 -15
  354. package/src/lib/hash.js +0 -18
  355. package/src/lib/hash.spec.js +0 -163
  356. package/src/lib/index.js +0 -14
  357. package/src/lib/numbers/index.js +0 -12
  358. package/src/lib/numbers/math.js +0 -9
  359. package/src/lib/numbers/split-unit.test.js +0 -45
  360. package/src/lib/objects/camelcase-keys.js +0 -17
  361. package/src/lib/objects/camelcase-keys.test.js +0 -72
  362. package/src/lib/objects/empty.js +0 -10
  363. package/src/lib/objects/equal.js +0 -9
  364. package/src/lib/objects/extend.js +0 -16
  365. package/src/lib/objects/extend.test.js +0 -35
  366. package/src/lib/objects/flatten.js +0 -19
  367. package/src/lib/objects/index.js +0 -13
  368. package/src/lib/objects/json.js +0 -7
  369. package/src/lib/objects/loop.js +0 -11
  370. package/src/lib/objects/loop.test.js +0 -31
  371. package/src/lib/objects/mix/mix.js +0 -191
  372. package/src/lib/objects/mix/mix.md +0 -78
  373. package/src/lib/objects/mix/mix.test.js +0 -445
  374. package/src/lib/objects/normalize-object.js +0 -10
  375. package/src/lib/objects/omit-empty.js +0 -23
  376. package/src/lib/objects/omit-empty.test.js +0 -85
  377. package/src/lib/objects/size.js +0 -41
  378. package/src/lib/objects/split.js +0 -19
  379. package/src/lib/promises/index.js +0 -1
  380. package/src/lib/promises/reject.js +0 -17
  381. package/src/lib/sse.js +0 -61
  382. package/src/lib/strings/convert-case/convert-case.js +0 -86
  383. package/src/lib/strings/convert-case/convert-case.md +0 -44
  384. package/src/lib/strings/convert-case/convert-case.test.js +0 -50
  385. package/src/lib/strings/index.js +0 -5
  386. package/src/lib/strings/markdown.js +0 -71
  387. package/src/lib/strings/markdown.spec.js +0 -73
  388. package/src/lib/strings/name.js +0 -24
  389. package/src/lib/strings/name.test.js +0 -67
  390. package/src/lib/strings/pluralize.js +0 -2
  391. package/src/lib/strings/query-string.js +0 -18
  392. package/src/lib/style/index.js +0 -13
  393. package/src/lib/symbols/index.js +0 -1
  394. package/src/lib/symbols/symbols.js +0 -9
  395. package/src/node/dirname.js +0 -17
  396. package/src/node/file-cache.js +0 -184
  397. package/src/node/file.js +0 -13
  398. package/src/node/hash.js +0 -5
  399. package/src/node/index.js +0 -7
  400. package/src/node/pkce.js +0 -33
  401. package/src/node/random-string.js +0 -10
  402. package/src/node/random-string.test.js +0 -15
  403. package/src/node/sanitize.spec.js +0 -142
  404. package/src/node/uuid.js +0 -5
  405. package/tsconfig.json +0 -23
  406. package/tsup.config.js +0 -38
  407. package/tsup.config.mjs +0 -63
  408. /package/{src/node/context.js → dist/cjs/node/context.cjs} +0 -0
@@ -0,0 +1,66 @@
1
+ const astroNodes = ["ASTRO-SLOT", "ASTRO-ISLAND"];
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
+ function getParentElement(element) {
18
+ const parent = element.parentElement;
19
+ if (astroNodes.includes(parent.nodeName)) return getParentElement(parent);
20
+ return parent;
21
+ }
22
+ function getSiblingElements(element) {
23
+ return Array.from(element.parentElement.children).filter(
24
+ (child) => child !== element
25
+ );
26
+ }
27
+ function getSelfIndex(element) {
28
+ return Array.from(element.parentElement.children).indexOf(element);
29
+ }
30
+ function isAncestor(ancestor, element, { searchLevels = 0 } = {}) {
31
+ if (ancestor === element) return true;
32
+ let parent = element.parentElement;
33
+ if (searchLevels === 0) {
34
+ while (parent) {
35
+ if (ancestor === parent) return true;
36
+ parent = parent.parentElement;
37
+ }
38
+ } else {
39
+ for (let i = 0; i < searchLevels; i++) {
40
+ if (ancestor === parent) return true;
41
+ parent = parent.parentElement;
42
+ }
43
+ }
44
+ return false;
45
+ }
46
+ function getAncestorWithSiblings(element, { limit = false } = {}) {
47
+ const ancestor = element.parentElement;
48
+ const siblings = getSiblingElements(ancestor);
49
+ if (siblings.length) return siblings;
50
+ if (!ancestor) return null;
51
+ if (limit === false) return getAncestorWithSiblings(ancestor);
52
+ if (typeof limit === "number" && limit > 0) {
53
+ return getAncestorWithSiblings(ancestor, { limit: limit - 1 });
54
+ }
55
+ if (limit === 0) return null;
56
+ }
57
+ export {
58
+ getAncestorWithSiblings,
59
+ getChildrenElements,
60
+ getElement,
61
+ getNodeType,
62
+ getParentElement,
63
+ getSelfIndex,
64
+ getSiblingElements,
65
+ isAncestor
66
+ };
@@ -0,0 +1,10 @@
1
+ async function sha256Hash(string) {
2
+ const utf8 = new TextEncoder().encode(string);
3
+ const hashBuffer = await crypto.subtle.digest("SHA-256", utf8);
4
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
5
+ const hashHex = hashArray.map((bytes) => bytes.toString(16).padStart(2, "0")).join("");
6
+ return hashHex;
7
+ }
8
+ export {
9
+ sha256Hash
10
+ };
@@ -0,0 +1,23 @@
1
+ export * from "./accessibility.js";
2
+ export * from "./actions/index.js";
3
+ export * from "./bounding-box.js";
4
+ export * from "./clipboard.js";
5
+ export * from "./cookie.js";
6
+ export * from "./css-vars.js";
7
+ export * from "./events.js";
8
+ export * from "./focusable.js";
9
+ export * from "./font-size.js";
10
+ export * from "./get-element.js";
11
+ export * from "./hash.js";
12
+ export * from "./keyboard.js";
13
+ export * from "./local-store.js";
14
+ export * from "./media.js";
15
+ export * from "./observers/index.js";
16
+ export * from "./pkce.js";
17
+ export * from "./query-params.js";
18
+ export * from "./random-string.js";
19
+ export * from "./sanitize.js";
20
+ export * from "./session-store.js";
21
+ export * from "./spam-prevention.js";
22
+ export * from "./trap-focus.js";
23
+ export * from "./ui/index.js";
@@ -0,0 +1,22 @@
1
+ function isTab(event) {
2
+ return !event.shiftKey && event.key === "Tab";
3
+ }
4
+ function isShiftTab(event) {
5
+ return event.shiftKey && event.key === "Tab";
6
+ }
7
+ function isTabKey(key) {
8
+ return key === "Tab";
9
+ }
10
+ function isArrowKey(key) {
11
+ return ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"].includes(key);
12
+ }
13
+ function isEscapeKey(key) {
14
+ return key === "Escape";
15
+ }
16
+ export {
17
+ isArrowKey,
18
+ isEscapeKey,
19
+ isShiftTab,
20
+ isTab,
21
+ isTabKey
22
+ };
@@ -1,66 +1,54 @@
1
- // ========================
2
- // Local Storage
3
- // ========================
4
-
5
- /**
6
- * Utility object for managing localStorage operations with JSON support
7
- * @namespace localStore
8
- */
9
- export const localStore = {
1
+ const localStore = {
10
2
  /**
11
3
  * Retrieves a value from localStorage
12
4
  * @param {string} key - The key to retrieve from localStorage
13
5
  * @returns {any} The stored value. Returns parsed JSON if the value was stored as JSON. Returns the original string if not JSON, or undefined if key doesn't exist
14
6
  */
15
7
  get(key) {
16
- const value = localStorage.getItem(key)
17
- if (!value) return
18
-
8
+ const value = localStorage.getItem(key);
9
+ if (!value) return;
19
10
  try {
20
- // Returns an object if stored value is JSON
21
- return JSON.parse(value)
11
+ return JSON.parse(value);
22
12
  } catch (error) {
23
- // Returns plain string if stored value is not JSON
24
- return value
13
+ return value;
25
14
  }
26
15
  },
27
-
28
16
  /**
29
17
  * Stores a value in localStorage
30
18
  * @param {string} key - The key to store the value under
31
19
  * @param {any} value - The value to store. Objects will be stringified to JSON
32
20
  */
33
21
  set(key, value) {
34
- if (typeof value === 'string') {
35
- localStorage.setItem(key, value)
22
+ if (typeof value === "string") {
23
+ localStorage.setItem(key, value);
36
24
  } else {
37
- localStorage.setItem(key, JSON.stringify(value))
25
+ localStorage.setItem(key, JSON.stringify(value));
38
26
  }
39
27
  },
40
-
41
28
  /**
42
29
  * Stores multiple key-value pairs in localStorage
43
30
  * @param {Object|Map} data - An object or Map containing key-value pairs to store
44
31
  */
45
32
  setMultiple(data) {
46
33
  for (const [key, value] of Object.entries(data)) {
47
- this.set(key, value)
34
+ this.set(key, value);
48
35
  }
49
36
  },
50
-
51
37
  /**
52
38
  * Removes a value from localStorage
53
39
  * @param {string} key - The key to remove from localStorage
54
40
  */
55
41
  remove(key) {
56
- localStorage.removeItem(key)
42
+ localStorage.removeItem(key);
57
43
  },
58
-
59
44
  /**
60
45
  * Removes multiple keys from localStorage
61
46
  * @param {string[]} keys - Array of keys to remove from localStorage
62
47
  */
63
48
  removeMultiple(keys) {
64
- keys.forEach(key => this.remove(key))
65
- },
66
- }
49
+ keys.forEach((key) => this.remove(key));
50
+ }
51
+ };
52
+ export {
53
+ localStore
54
+ };
@@ -0,0 +1,32 @@
1
+ async function imagesLoaded(node) {
2
+ const images = Array.from(node.querySelectorAll("img"));
3
+ const promises = images.map((img) => {
4
+ return new Promise((resolve, reject) => {
5
+ if (img.complete) return resolve();
6
+ img.onload = resolve;
7
+ img.onerror = (e) => {
8
+ reject("Image failed to load");
9
+ };
10
+ });
11
+ });
12
+ return Promise.all(promises);
13
+ }
14
+ async function videosLoaded(node) {
15
+ const videos = Array.from(node.querySelectorAll("video"));
16
+ const promises = videos.map((video) => {
17
+ return new Promise((resolve, reject) => {
18
+ if (video.readyState === 4) return resolve();
19
+ video.onloadedmetadata = resolve;
20
+ video.onerror = reject;
21
+ });
22
+ });
23
+ return Promise.all(promises);
24
+ }
25
+ async function mediaLoaded(node) {
26
+ return Promise.all([imagesLoaded(node), videosLoaded(node)]);
27
+ }
28
+ export {
29
+ imagesLoaded,
30
+ mediaLoaded,
31
+ videosLoaded
32
+ };
@@ -0,0 +1,4 @@
1
+ export * from "./intersection-observer.js";
2
+ export * from "./mutation-observer.js";
3
+ export * from "./resize-observer.js";
4
+ export * from "./scroll-observer.js";
@@ -0,0 +1,36 @@
1
+ import { dispatchEvent } from "../events.js";
2
+ import { useObserverMethodOnTarget } from "./observer.js";
3
+ function intersectionObserver(target, options = {}) {
4
+ const { callback, ...opts } = options;
5
+ const observer = new IntersectionObserver(observerFn, opts);
6
+ useObserverMethodOnTarget(target, observer, "observe");
7
+ function observerFn(entries) {
8
+ for (const entry of entries) {
9
+ if (callback) callback({ entry, entries, observer });
10
+ else dispatchEvent(target, "intersect", { entry, entries, observer });
11
+ }
12
+ }
13
+ return {
14
+ observer,
15
+ observe(target2) {
16
+ useObserverMethodOnTarget(target2, observer, "observe", options);
17
+ },
18
+ unobserve(target2) {
19
+ useObserverMethodOnTarget(target2, observer, "unobserve");
20
+ },
21
+ takeRecords() {
22
+ return observer.takeRecords();
23
+ },
24
+ disconnect() {
25
+ const records = observer.takeRecords();
26
+ observer.disconnect();
27
+ if (records.length > 0) observerFn(records);
28
+ },
29
+ destroy() {
30
+ observer.disconnect();
31
+ }
32
+ };
33
+ }
34
+ export {
35
+ intersectionObserver
36
+ };
@@ -0,0 +1,40 @@
1
+ import { dispatchEvent } from "../events.js";
2
+ import { useObserverMethodOnTarget } from "./observer.js";
3
+ const defaultOptions = {
4
+ attributes: false,
5
+ childList: false,
6
+ subtree: false
7
+ };
8
+ function mutationObserver(target, options) {
9
+ options = { ...defaultOptions, ...options };
10
+ const { callback, ...opts } = options;
11
+ const observer = new MutationObserver(observerFn);
12
+ if (target === window) target = document.body;
13
+ useObserverMethodOnTarget(target, observer, "observe", opts);
14
+ function observerFn(entries) {
15
+ for (const entry of entries) {
16
+ if (callback) callback({ entry, entries, observer });
17
+ else dispatchEvent(target, "mutate", { entry, entries, observer });
18
+ }
19
+ }
20
+ return {
21
+ observer,
22
+ observe(target2) {
23
+ useObserverMethodOnTarget(target2, observer, "observe", options);
24
+ },
25
+ takeRecords() {
26
+ return observer.takeRecords();
27
+ },
28
+ disconnect() {
29
+ const records = observer.takeRecords();
30
+ observer.disconnect();
31
+ if (records.length > 0) observerFn(records);
32
+ },
33
+ destroy() {
34
+ observer.disconnect();
35
+ }
36
+ };
37
+ }
38
+ export {
39
+ mutationObserver
40
+ };
@@ -0,0 +1,15 @@
1
+ import { getNodeType } from "../get-element.js";
2
+ function useObserverMethodOnTarget(target, observer, method = "observe", options = void 0) {
3
+ const targetType = getNodeType(target);
4
+ if (targetType === "element") observer[method](target, options);
5
+ if (targetType === "nodelist") {
6
+ const elements = Array.from(target);
7
+ elements.forEach((element) => observer[method](element, options));
8
+ }
9
+ if (targetType === "array") {
10
+ target.forEach((element) => observer[method](element, options));
11
+ }
12
+ }
13
+ export {
14
+ useObserverMethodOnTarget
15
+ };
@@ -0,0 +1,29 @@
1
+ import { dispatchEvent } from "../events.js";
2
+ import { useObserverMethodOnTarget } from "./observer.js";
3
+ function resizeObserver(target, options) {
4
+ const { callback, ...opts } = options;
5
+ const observer = new ResizeObserver(observerFn);
6
+ if (target === window || target === document)
7
+ target = document.documentElement;
8
+ useObserverMethodOnTarget(target, observer, "observe", opts);
9
+ function observerFn(entries) {
10
+ for (const entry of entries) {
11
+ if (callback) callback({ entry, entries, observer });
12
+ else
13
+ dispatchEvent(entry.target, "resize-obs", { entry, entries, observer });
14
+ }
15
+ }
16
+ return {
17
+ observe(target2) {
18
+ useObserverMethodOnTarget(target2, observer, "observe", options);
19
+ },
20
+ unobserve(target2) {
21
+ useObserverMethodOnTarget(target2, observer, "unobserve");
22
+ },
23
+ disconnect: (_) => observer.disconnect(),
24
+ destroy: (_) => observer.disconnect()
25
+ };
26
+ }
27
+ export {
28
+ resizeObserver
29
+ };
@@ -0,0 +1,95 @@
1
+ import { resizeObserver } from "./resize-observer.js";
2
+ const defaultOptions = {
3
+ threshold: 0,
4
+ // Float between 0 to 1.
5
+ tolerance: 0.1,
6
+ // Float between 0 to 1. Tolerance for event firing
7
+ once: false
8
+ // Only fire threshold callback once
9
+ };
10
+ function getScrollElement(node) {
11
+ if (node === document || node === window || node === document.documentElement) {
12
+ return document.documentElement;
13
+ }
14
+ return (
15
+ /** @type {Element} */
16
+ node
17
+ );
18
+ }
19
+ function scrollObserver(node, options = {}) {
20
+ const { callback, onScrollDown, onScrollUp, onEnterThreshold, ...userOpts } = options;
21
+ const opts = { ...defaultOptions, ...userOpts };
22
+ const { threshold, tolerance, once } = opts;
23
+ let prevScrollDirection = null;
24
+ let prevScrollTop = 0;
25
+ let prevScrollPercent = 0;
26
+ let thresholdFired = false;
27
+ let rafId = null;
28
+ const isDocumentScroll = node === document || node === window || node === document.documentElement;
29
+ const scrollElement = getScrollElement(node);
30
+ const eventTarget = isDocumentScroll ? window : node;
31
+ let cachedScrollHeight = 0;
32
+ let cachedClientHeight = 0;
33
+ updateCache();
34
+ const cacheObserver = resizeObserver(scrollElement, {
35
+ callback: updateCache
36
+ });
37
+ eventTarget.addEventListener("scroll", throttledObserve, { passive: true });
38
+ function throttledObserve() {
39
+ rafId = requestAnimationFrame(observe);
40
+ }
41
+ function updateCache() {
42
+ cachedScrollHeight = scrollElement.scrollHeight;
43
+ cachedClientHeight = scrollElement.clientHeight;
44
+ }
45
+ function observe() {
46
+ const scrollTop = scrollElement.scrollTop;
47
+ if (Math.abs(scrollTop - prevScrollTop) < 1) return;
48
+ const scrollDirection = scrollTop > prevScrollTop ? "down" : "up";
49
+ const maxScroll = Math.max(1, cachedScrollHeight - cachedClientHeight);
50
+ const scrollPercent = Math.min(1, Math.max(0, scrollTop / maxScroll));
51
+ const thresholdMin = threshold - tolerance / 2;
52
+ const thresholdMax = threshold + tolerance / 2;
53
+ const wasInThreshold = prevScrollPercent >= thresholdMin && prevScrollPercent <= thresholdMax;
54
+ const isInThreshold = scrollPercent >= thresholdMin && scrollPercent <= thresholdMax;
55
+ const hasEnteredThreshold = !wasInThreshold && isInThreshold && (!once || !thresholdFired);
56
+ if (hasEnteredThreshold && once) {
57
+ thresholdFired = true;
58
+ }
59
+ const callbackData = {
60
+ scrollTop,
61
+ scrollDirection,
62
+ scrollPercent,
63
+ directionChanged: scrollDirection !== prevScrollDirection,
64
+ hasEnteredThreshold,
65
+ isInThreshold
66
+ };
67
+ if (typeof callback === "function") {
68
+ callback(callbackData);
69
+ }
70
+ if (scrollDirection !== prevScrollDirection) {
71
+ if (scrollDirection === "down" && typeof onScrollDown === "function") {
72
+ onScrollDown(callbackData);
73
+ }
74
+ if (scrollDirection === "up" && typeof onScrollUp === "function") {
75
+ onScrollUp(callbackData);
76
+ }
77
+ }
78
+ if (hasEnteredThreshold && typeof onEnterThreshold === "function") {
79
+ onEnterThreshold(callbackData);
80
+ }
81
+ prevScrollTop = scrollTop;
82
+ prevScrollPercent = scrollPercent;
83
+ prevScrollDirection = scrollDirection;
84
+ }
85
+ return {
86
+ destroy() {
87
+ eventTarget.removeEventListener("scroll", throttledObserve);
88
+ if (rafId) cancelAnimationFrame(rafId);
89
+ cacheObserver.destroy();
90
+ }
91
+ };
92
+ }
93
+ export {
94
+ scrollObserver
95
+ };
@@ -0,0 +1,20 @@
1
+ import { randomString } from "./random-string.js";
2
+ async function PKCE() {
3
+ const codeVerifier = await randomString();
4
+ const codeChallenge = await getCodeChallenge(codeVerifier);
5
+ return {
6
+ state: await randomString(),
7
+ code_verifier: codeVerifier,
8
+ code_challenge: codeChallenge,
9
+ code_challenge_method: "S256"
10
+ };
11
+ }
12
+ async function getCodeChallenge(verifier) {
13
+ const encoder = new TextEncoder();
14
+ const data = encoder.encode(verifier);
15
+ const hashed = await window.crypto.subtle.digest("SHA-256", data);
16
+ return window.btoa(String.fromCharCode.apply(null, new Uint8Array(hashed))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
17
+ }
18
+ export {
19
+ PKCE
20
+ };
@@ -0,0 +1,13 @@
1
+ const queryParams = {
2
+ get(key) {
3
+ const searchParams = new URLSearchParams(location.search);
4
+ return searchParams.get(key);
5
+ },
6
+ stringify(params) {
7
+ const searchParams = new URLSearchParams(location.search);
8
+ return searchParams.toString();
9
+ }
10
+ };
11
+ export {
12
+ queryParams
13
+ };
@@ -0,0 +1,12 @@
1
+ function randomString(length = 10) {
2
+ const firstLetter = String.fromCharCode(65 + Math.floor(Math.random() * 26));
3
+ const others = Math.random().toString(36).substring(2, 2 + length - 1);
4
+ return firstLetter + others;
5
+ }
6
+ function uuid() {
7
+ return crypto.randomUUID();
8
+ }
9
+ export {
10
+ randomString,
11
+ uuid
12
+ };
@@ -0,0 +1,8 @@
1
+ import DOMPurify from "dompurify";
2
+ import { sanitize as sanitizeLib } from "../lib/form/sanitize.js";
3
+ function sanitize(value, options = {}) {
4
+ return sanitizeLib(value, { sanitizer: DOMPurify.sanitize, ...options });
5
+ }
6
+ export {
7
+ sanitize
8
+ };
@@ -0,0 +1,24 @@
1
+ const sessionStore = {
2
+ get(key) {
3
+ const value = sessionStorage.getItem(key);
4
+ if (!value) return;
5
+ try {
6
+ return JSON.parse(value);
7
+ } catch (error) {
8
+ return value;
9
+ }
10
+ },
11
+ set(key, value) {
12
+ if (typeof value === "string") {
13
+ sessionStorage.setItem(key, value);
14
+ } else {
15
+ sessionStorage.setItem(key, JSON.stringify(value));
16
+ }
17
+ },
18
+ remove(key) {
19
+ sessionStorage.removeItem(key);
20
+ }
21
+ };
22
+ export {
23
+ sessionStore
24
+ };
@@ -0,0 +1,25 @@
1
+ function preventSpam(form, { honeypotField = "hp", honeypotDuration = 2e3 } = {}) {
2
+ const startTime = Date.now();
3
+ let hasInteraction = false;
4
+ function checkForInteraction() {
5
+ hasInteraction = true;
6
+ }
7
+ const events = ["keydown", "mousemove", "touchstart", "click"];
8
+ events.forEach((event) => {
9
+ form.addEventListener(event, checkForInteraction, { once: true });
10
+ });
11
+ form.containsSpam = function() {
12
+ const fillTime = Date.now() - startTime;
13
+ const isTooFast = fillTime < honeypotDuration;
14
+ const honeypotInput = form.querySelector(`[name="${honeypotField}"]`);
15
+ const hasHoneypotValue = honeypotInput?.value?.trim();
16
+ const noInteraction = !hasInteraction;
17
+ events.forEach(
18
+ (event) => form.removeEventListener(event, checkForInteraction)
19
+ );
20
+ return isTooFast || !!hasHoneypotValue || noInteraction;
21
+ };
22
+ }
23
+ export {
24
+ preventSpam
25
+ };
@@ -0,0 +1,51 @@
1
+ import { getFocusableElements } from "./focusable.js";
2
+ import { isShiftTab, isTab } from "./keyboard.js";
3
+ function trapFocus({ event, focusables }) {
4
+ if (event.key !== "Tab") return;
5
+ if (isTab(event) && document.activeElement === focusables.last) {
6
+ event.preventDefault();
7
+ focusables.first.focus();
8
+ }
9
+ if (isShiftTab(event) && document.activeElement === focusables.first) {
10
+ event.preventDefault();
11
+ focusables.last.focus();
12
+ }
13
+ }
14
+ function manageFocus({
15
+ event,
16
+ triggerNode,
17
+ contentNode,
18
+ focusables,
19
+ tabOutFocus = "next",
20
+ // 'trigger'
21
+ onLeave = function() {
22
+ }
23
+ }) {
24
+ const activeEl = document.activeElement;
25
+ if (activeEl === contentNode && isShiftTab(event)) return backFocus();
26
+ if (activeEl === contentNode && focusables.length === 0 && isTab(event))
27
+ return nextFocus();
28
+ if (activeEl === focusables.last && isTab(event)) return nextFocus();
29
+ if (activeEl === focusables.first && isShiftTab(event)) return backFocus();
30
+ function backFocus() {
31
+ event.preventDefault();
32
+ triggerNode.focus();
33
+ onLeave("back");
34
+ }
35
+ function nextFocus() {
36
+ if (tabOutFocus === "trigger") triggerNode.focus();
37
+ if (tabOutFocus === "next") {
38
+ event.preventDefault();
39
+ const DOMFocusables = getFocusableElements().keyboard;
40
+ const index = DOMFocusables.findIndex((e) => e === triggerNode);
41
+ const next = DOMFocusables[index + 1];
42
+ if (next) next.focus();
43
+ else triggerNode.focus();
44
+ }
45
+ onLeave("forward");
46
+ }
47
+ }
48
+ export {
49
+ manageFocus,
50
+ trapFocus
51
+ };
@@ -0,0 +1,17 @@
1
+ function markActiveAnchorIn(container, anchorType = "page") {
2
+ if (!container) return;
3
+ const { pathname } = window.location;
4
+ const element = container.querySelector(`[href="${pathname}"]`);
5
+ if (!element) return;
6
+ element.setAttribute("aria-current", "page");
7
+ return element;
8
+ }
9
+ function scrollToElement(element, { scrollBehaviour = "instant", scrollMargin = "3rem" } = {}) {
10
+ if (!element) return;
11
+ element.style.scrollMarginTop = scrollMargin;
12
+ element.scrollIntoView({ behavior: scrollBehaviour });
13
+ }
14
+ export {
15
+ markActiveAnchorIn,
16
+ scrollToElement
17
+ };
@@ -0,0 +1,10 @@
1
+ function inconsistentButtonFix() {
2
+ document.addEventListener("click", (event) => {
3
+ if (event.target instanceof HTMLButtonElement) {
4
+ event.target.focus();
5
+ }
6
+ });
7
+ }
8
+ export {
9
+ inconsistentButtonFix
10
+ };
@@ -0,0 +1,4 @@
1
+ export * from "./aria-current.js";
2
+ export * from "./inconsistent-button-fix.js";
3
+ export * from "./scroll-container.js";
4
+ export * from "./traverse-and-scramble.js";