@splendidlabz/utils 1.5.1 → 1.7.0

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 (472) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/dom/accessibility.cjs +53 -0
  3. package/dist/cjs/dom/actions/index.cjs +407 -0
  4. package/dist/cjs/dom/actions/masonry.cjs +149 -0
  5. package/dist/cjs/dom/actions/prefer-horizontal-scroll.cjs +157 -0
  6. package/dist/cjs/dom/actions/sticky.cjs +211 -0
  7. package/dist/cjs/dom/bounding-box.cjs +70 -0
  8. package/dist/cjs/dom/clipboard.cjs +37 -0
  9. package/dist/cjs/dom/cookie.cjs +57 -0
  10. package/dist/cjs/dom/css-vars.cjs +57 -0
  11. package/dist/cjs/dom/events.cjs +95 -0
  12. package/dist/cjs/dom/focusable.cjs +143 -0
  13. package/dist/cjs/dom/font-size.cjs +74 -0
  14. package/dist/cjs/dom/get-element.cjs +98 -0
  15. package/dist/cjs/dom/hash.cjs +35 -0
  16. package/dist/cjs/dom/index.cjs +1197 -0
  17. package/dist/cjs/dom/keyboard.cjs +51 -0
  18. package/dist/cjs/dom/local-store.cjs +79 -0
  19. package/dist/cjs/dom/media.cjs +59 -0
  20. package/dist/cjs/dom/observers/index.cjs +156 -0
  21. package/dist/cjs/dom/observers/intersection-observer.cjs +91 -0
  22. package/dist/cjs/dom/observers/mutation-observer.cjs +95 -0
  23. package/dist/cjs/dom/observers/observer.cjs +48 -0
  24. package/dist/cjs/dom/observers/resize-observer.cjs +82 -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 +58 -0
  47. package/dist/cjs/lib/date/days.cjs +37 -0
  48. package/dist/cjs/lib/date/index.cjs +206 -0
  49. package/dist/cjs/lib/date/months.cjs +102 -0
  50. package/dist/cjs/lib/date/time.cjs +115 -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/debounce.cjs +43 -0
  55. package/dist/cjs/lib/functions/env.cjs +32 -0
  56. package/dist/cjs/lib/functions/functional.cjs +62 -0
  57. package/dist/cjs/lib/functions/index.cjs +122 -0
  58. package/dist/cjs/lib/functions/throttle.cjs +38 -0
  59. package/dist/cjs/lib/functions/timeout.cjs +41 -0
  60. package/dist/cjs/lib/hash.cjs +43 -0
  61. package/dist/cjs/lib/index.cjs +1141 -0
  62. package/dist/cjs/lib/numbers/index.cjs +49 -0
  63. package/dist/cjs/lib/numbers/math.cjs +36 -0
  64. package/dist/cjs/lib/objects/camelcase-keys.cjs +80 -0
  65. package/dist/cjs/lib/objects/empty.cjs +39 -0
  66. package/dist/cjs/lib/objects/equal.cjs +47 -0
  67. package/dist/cjs/lib/objects/extend.cjs +146 -0
  68. package/dist/cjs/lib/objects/flatten.cjs +48 -0
  69. package/dist/cjs/lib/objects/index.cjs +375 -0
  70. package/dist/cjs/lib/objects/json.cjs +35 -0
  71. package/dist/cjs/lib/objects/loop.cjs +40 -0
  72. package/dist/cjs/lib/objects/mix/mix.cjs +112 -0
  73. package/dist/cjs/lib/objects/nested-property.cjs +45 -0
  74. package/dist/cjs/lib/objects/normalize-object.cjs +106 -0
  75. package/dist/cjs/lib/objects/omit-empty.cjs +40 -0
  76. package/dist/cjs/lib/objects/size.cjs +63 -0
  77. package/dist/cjs/lib/objects/split.cjs +39 -0
  78. package/dist/cjs/lib/promises/index.cjs +69 -0
  79. package/dist/cjs/lib/promises/reject.cjs +67 -0
  80. package/dist/cjs/lib/sse.cjs +99 -0
  81. package/dist/cjs/lib/strings/convert-case/convert-case.cjs +96 -0
  82. package/dist/cjs/lib/strings/index.cjs +190 -0
  83. package/dist/cjs/lib/strings/markdown.cjs +59 -0
  84. package/dist/cjs/lib/strings/name.cjs +46 -0
  85. package/dist/cjs/lib/strings/pluralize.cjs +40 -0
  86. package/dist/cjs/lib/strings/query-string.cjs +43 -0
  87. package/dist/cjs/lib/style/index.cjs +64 -0
  88. package/dist/cjs/lib/symbols/index.cjs +40 -0
  89. package/dist/cjs/lib/symbols/symbols.cjs +38 -0
  90. package/dist/cjs/node/common.cjs +42 -0
  91. package/dist/cjs/node/dirname.cjs +49 -0
  92. package/dist/cjs/node/file-cache.cjs +196 -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 +290 -0
  96. package/dist/cjs/node/pkce.cjs +62 -0
  97. package/dist/cjs/node/random-string.cjs +43 -0
  98. package/dist/cjs/node/sanitize.cjs +65 -0
  99. package/dist/esm/dom/accessibility.js +27 -0
  100. package/dist/esm/dom/actions/index.js +379 -0
  101. package/dist/esm/dom/actions/masonry.js +123 -0
  102. package/dist/esm/dom/actions/prefer-horizontal-scroll.js +131 -0
  103. package/dist/esm/dom/actions/sticky.js +185 -0
  104. package/dist/esm/dom/bounding-box.js +45 -0
  105. package/dist/esm/dom/clipboard.js +13 -0
  106. package/dist/esm/dom/cookie.js +32 -0
  107. package/dist/esm/dom/css-vars.js +28 -0
  108. package/dist/esm/dom/events.js +67 -0
  109. package/dist/esm/dom/focusable.js +118 -0
  110. package/dist/esm/dom/font-size.js +44 -0
  111. package/dist/esm/dom/get-element.js +67 -0
  112. package/dist/esm/dom/hash.js +11 -0
  113. package/dist/esm/dom/index.js +1100 -0
  114. package/dist/esm/dom/keyboard.js +23 -0
  115. package/dist/esm/dom/local-store.js +55 -0
  116. package/dist/esm/dom/media.js +33 -0
  117. package/dist/esm/dom/observers/index.js +128 -0
  118. package/dist/esm/dom/observers/intersection-observer.js +65 -0
  119. package/dist/esm/dom/observers/mutation-observer.js +69 -0
  120. package/dist/esm/dom/observers/observer.js +22 -0
  121. package/dist/esm/dom/observers/resize-observer.js +56 -0
  122. package/dist/esm/dom/pkce.js +27 -0
  123. package/dist/esm/dom/query-params.js +14 -0
  124. package/dist/esm/dom/random-string.js +13 -0
  125. package/dist/esm/dom/sanitize.js +31 -0
  126. package/dist/esm/dom/session-store.js +25 -0
  127. package/dist/esm/dom/spam-prevention.js +26 -0
  128. package/dist/esm/dom/trap-focus.js +170 -0
  129. package/dist/esm/dom/ui/aria-current.js +18 -0
  130. package/dist/esm/dom/ui/inconsistent-button-fix.js +11 -0
  131. package/dist/esm/dom/ui/index.js +75 -0
  132. package/dist/esm/dom/ui/scroll-container.js +23 -0
  133. package/dist/esm/dom/ui/traverse-and-scramble.js +26 -0
  134. package/dist/esm/lib/arrays/index.js +106 -0
  135. package/dist/esm/lib/arrays/item-position.js +16 -0
  136. package/dist/esm/lib/arrays/join.js +17 -0
  137. package/dist/esm/lib/arrays/shuffle.js +18 -0
  138. package/dist/esm/lib/arrays/sort.js +41 -0
  139. package/dist/esm/lib/arrays/split-array.js +17 -0
  140. package/dist/esm/lib/arrays/unique.js +7 -0
  141. package/dist/esm/lib/auth/index.js +26 -0
  142. package/dist/esm/lib/auth/route-manager.js +26 -0
  143. package/dist/esm/lib/checks.js +31 -0
  144. package/dist/esm/lib/date/days.js +13 -0
  145. package/dist/esm/lib/date/index.js +171 -0
  146. package/dist/esm/lib/date/months.js +78 -0
  147. package/dist/esm/lib/date/time.js +82 -0
  148. package/dist/esm/lib/form/form-data.js +58 -0
  149. package/dist/esm/lib/form/index.js +92 -0
  150. package/dist/esm/lib/form/sanitize.js +35 -0
  151. package/dist/esm/lib/functions/debounce.js +19 -0
  152. package/dist/esm/lib/functions/env.js +8 -0
  153. package/dist/esm/lib/functions/functional.js +35 -0
  154. package/dist/esm/lib/functions/index.js +87 -0
  155. package/dist/esm/lib/functions/throttle.js +14 -0
  156. package/dist/esm/lib/functions/timeout.js +15 -0
  157. package/dist/esm/lib/hash.js +19 -0
  158. package/dist/esm/lib/index.js +1023 -0
  159. package/dist/esm/lib/numbers/index.js +21 -0
  160. package/dist/esm/lib/numbers/math.js +11 -0
  161. package/dist/esm/lib/objects/camelcase-keys.js +54 -0
  162. package/dist/esm/lib/objects/empty.js +14 -0
  163. package/dist/esm/lib/objects/equal.js +12 -0
  164. package/dist/esm/lib/objects/extend.js +120 -0
  165. package/dist/esm/lib/objects/flatten.js +22 -0
  166. package/dist/esm/lib/objects/index.js +321 -0
  167. package/dist/esm/lib/objects/json.js +11 -0
  168. package/dist/esm/lib/objects/loop.js +15 -0
  169. package/dist/esm/lib/objects/mix/mix.js +87 -0
  170. package/dist/esm/lib/objects/nested-property.js +19 -0
  171. package/dist/esm/lib/objects/normalize-object.js +80 -0
  172. package/dist/esm/lib/objects/omit-empty.js +16 -0
  173. package/dist/esm/lib/objects/size.js +39 -0
  174. package/dist/esm/lib/objects/split.js +15 -0
  175. package/dist/esm/lib/promises/index.js +33 -0
  176. package/dist/esm/lib/promises/reject.js +33 -0
  177. package/dist/esm/lib/sse.js +72 -0
  178. package/dist/esm/lib/strings/convert-case/convert-case.js +65 -0
  179. package/dist/esm/lib/strings/index.js +140 -0
  180. package/dist/esm/lib/strings/markdown.js +34 -0
  181. package/dist/esm/lib/strings/name.js +22 -0
  182. package/dist/esm/lib/strings/pluralize.js +6 -0
  183. package/dist/esm/lib/strings/query-string.js +17 -0
  184. package/dist/esm/lib/style/index.js +38 -0
  185. package/dist/esm/lib/symbols/index.js +13 -0
  186. package/dist/esm/lib/symbols/symbols.js +13 -0
  187. package/dist/esm/node/common.js +8 -0
  188. package/dist/esm/node/dirname.js +14 -0
  189. package/dist/esm/node/file-cache.js +158 -0
  190. package/dist/esm/node/file.js +15 -0
  191. package/dist/esm/node/hash.js +8 -0
  192. package/dist/esm/node/index.js +243 -0
  193. package/dist/esm/node/pkce.js +28 -0
  194. package/dist/esm/node/random-string.js +9 -0
  195. package/dist/esm/node/sanitize.js +31 -0
  196. package/dist/{dom/accessibility.d.ts → types/dom/accessibility.d.cts} +5 -3
  197. package/dist/types/dom/actions/index.d.cts +3 -0
  198. package/dist/types/dom/actions/masonry.d.cts +5 -0
  199. package/dist/types/dom/actions/prefer-horizontal-scroll.d.cts +5 -0
  200. package/dist/types/dom/actions/sticky.d.cts +5 -0
  201. package/dist/{dom/bounding-box.d.ts → types/dom/bounding-box.d.cts} +4 -2
  202. package/dist/{dom/clipboard.d.ts → types/dom/clipboard.d.cts} +3 -1
  203. package/dist/types/dom/cookie.d.cts +7 -0
  204. package/dist/types/dom/css-vars.d.cts +6 -0
  205. package/dist/types/dom/events.d.cts +20 -0
  206. package/dist/{dom/focusable.d.ts → types/dom/focusable.d.cts} +5 -3
  207. package/dist/types/dom/font-size.d.cts +7 -0
  208. package/dist/{dom/get-element.d.ts → types/dom/get-element.d.cts} +10 -8
  209. package/dist/types/dom/hash.d.cts +3 -0
  210. package/dist/types/dom/index.d.cts +30 -0
  211. package/dist/{dom/keyboard.d.ts → types/dom/keyboard.d.cts} +7 -5
  212. package/dist/{dom/local-store.d.ts → types/dom/local-store.d.cts} +3 -1
  213. package/dist/types/dom/media.d.cts +5 -0
  214. package/dist/types/dom/observers/index.d.cts +3 -0
  215. package/dist/{dom/observers/intersection-observer.d.ts → types/dom/observers/intersection-observer.d.cts} +3 -1
  216. package/dist/{dom/observers/mutation-observer.d.ts → types/dom/observers/mutation-observer.d.cts} +3 -1
  217. package/dist/types/dom/observers/observer.d.cts +3 -0
  218. package/dist/{dom/observers/resize-observer.d.ts → types/dom/observers/resize-observer.d.cts} +3 -1
  219. package/dist/{node/pkce.d.ts → types/dom/pkce.d.cts} +3 -1
  220. package/dist/{dom/query-params.d.ts → types/dom/query-params.d.cts} +3 -1
  221. package/dist/{dom/random-string.d.ts → types/dom/random-string.d.cts} +4 -2
  222. package/dist/{dom/sanitize.d.ts → types/dom/sanitize.d.cts} +3 -1
  223. package/dist/{dom/session-store.d.ts → types/dom/session-store.d.cts} +3 -1
  224. package/dist/types/dom/spam-prevention.d.cts +14 -0
  225. package/dist/{dom/trap-focus.d.ts → types/dom/trap-focus.d.cts} +8 -4
  226. package/dist/types/dom/ui/aria-current.d.cts +7 -0
  227. package/dist/{dom/ui/inconsistent-button-fix.d.ts → types/dom/ui/inconsistent-button-fix.d.cts} +3 -1
  228. package/dist/types/dom/ui/index.d.cts +4 -0
  229. package/dist/types/dom/ui/scroll-container.d.cts +3 -0
  230. package/dist/{dom/ui/traverse-and-scramble.d.ts → types/dom/ui/traverse-and-scramble.d.cts} +3 -1
  231. package/dist/types/lib/arrays/index.d.cts +6 -0
  232. package/dist/{lib/arrays/item-position.d.ts → types/lib/arrays/item-position.d.cts} +5 -3
  233. package/dist/{lib/arrays/join.d.ts → types/lib/arrays/join.d.cts} +3 -1
  234. package/dist/types/lib/arrays/shuffle.d.cts +3 -0
  235. package/dist/{lib/arrays/sort.d.ts → types/lib/arrays/sort.d.cts} +3 -1
  236. package/dist/types/lib/arrays/split-array.d.cts +6 -0
  237. package/dist/types/lib/arrays/unique.d.cts +3 -0
  238. package/dist/types/lib/auth/index.d.cts +1 -0
  239. package/dist/{lib/auth/route-manager.d.ts → types/lib/auth/route-manager.d.cts} +5 -2
  240. package/{lib/checks.js → dist/types/lib/checks.d.cts} +6 -11
  241. package/dist/{lib/date/days.d.ts → types/lib/date/days.d.cts} +3 -1
  242. package/dist/types/lib/date/index.d.cts +3 -0
  243. package/dist/{lib/date/months.d.ts → types/lib/date/months.d.cts} +3 -1
  244. package/dist/types/lib/date/time.d.cts +21 -0
  245. package/dist/types/lib/form/form-data.d.cts +9 -0
  246. package/dist/types/lib/form/index.d.cts +2 -0
  247. package/dist/{lib/form/sanitize.d.ts → types/lib/form/sanitize.d.cts} +6 -4
  248. package/dist/types/lib/functions/debounce.d.cts +3 -0
  249. package/dist/types/lib/functions/env.d.cts +3 -0
  250. package/dist/types/lib/functions/functional.d.cts +6 -0
  251. package/dist/types/lib/functions/index.d.cts +5 -0
  252. package/dist/types/lib/functions/throttle.d.cts +3 -0
  253. package/dist/types/lib/functions/timeout.d.cts +5 -0
  254. package/dist/types/lib/hash.d.cts +3 -0
  255. package/dist/types/lib/index.d.cts +43 -0
  256. package/dist/types/lib/numbers/index.d.cts +5 -0
  257. package/dist/types/lib/numbers/math.d.cts +4 -0
  258. package/dist/types/lib/objects/camelcase-keys.d.cts +3 -0
  259. package/dist/types/lib/objects/empty.d.cts +4 -0
  260. package/dist/types/lib/objects/equal.d.cts +4 -0
  261. package/dist/types/lib/objects/extend.d.cts +6 -0
  262. package/dist/types/lib/objects/flatten.d.cts +6 -0
  263. package/dist/types/lib/objects/index.d.cts +13 -0
  264. package/dist/types/lib/objects/json.d.cts +3 -0
  265. package/dist/types/lib/objects/loop.d.cts +4 -0
  266. package/dist/types/lib/objects/mix/mix.d.cts +4 -0
  267. package/dist/{lib/objects/nested-property.d.ts → types/lib/objects/nested-property.d.cts} +5 -3
  268. package/dist/types/lib/objects/normalize-object.d.cts +3 -0
  269. package/dist/types/lib/objects/omit-empty.d.cts +3 -0
  270. package/dist/types/lib/objects/size.d.cts +3 -0
  271. package/dist/{lib/objects/split.d.ts → types/lib/objects/split.d.cts} +5 -1
  272. package/dist/types/lib/promises/index.d.cts +1 -0
  273. package/dist/types/lib/promises/reject.d.cts +5 -0
  274. package/dist/{lib/sse.d.ts → types/lib/sse.d.cts} +4 -2
  275. package/dist/types/lib/strings/convert-case/convert-case.d.cts +10 -0
  276. package/dist/types/lib/strings/index.d.cts +5 -0
  277. package/dist/{lib/strings/markdown.d.ts → types/lib/strings/markdown.d.cts} +4 -2
  278. package/dist/types/lib/strings/name.d.cts +7 -0
  279. package/dist/types/lib/strings/pluralize.d.cts +3 -0
  280. package/dist/types/lib/strings/query-string.d.cts +10 -0
  281. package/dist/types/lib/style/index.d.cts +3 -0
  282. package/dist/types/lib/symbols/index.d.cts +1 -0
  283. package/dist/types/lib/symbols/symbols.d.cts +4 -0
  284. package/dist/types/node/common.d.cts +3 -0
  285. package/dist/types/node/dirname.d.cts +9 -0
  286. package/dist/{node/file-cache.d.ts → types/node/file-cache.d.cts} +7 -5
  287. package/dist/types/node/file.d.cts +4 -0
  288. package/dist/types/node/hash.d.cts +3 -0
  289. package/dist/types/node/index.d.cts +7 -0
  290. package/dist/{dom/pkce.d.ts → types/node/pkce.d.cts} +3 -1
  291. package/dist/types/node/random-string.d.cts +3 -0
  292. package/dist/{node/sanitize.d.ts → types/node/sanitize.d.cts} +3 -1
  293. package/package.json +29 -16
  294. package/{dom → src/dom}/cookie.js +8 -7
  295. package/{dom → src/dom}/index.js +1 -0
  296. package/{dom → src/dom}/random-string.js +1 -1
  297. package/src/dom/random-string.test.js +13 -0
  298. package/src/dom/spam-prevention.js +39 -0
  299. package/{dom → src/dom}/ui/aria-current.js +1 -1
  300. package/{lib → src/lib}/arrays/index.js +1 -0
  301. package/{lib → src/lib}/arrays/sort.js +6 -6
  302. package/src/lib/arrays/split-array.js +15 -0
  303. package/{lib → src/lib}/auth/route-manager.js +1 -0
  304. package/src/lib/checks.js +53 -0
  305. package/{lib → src/lib}/date/time.js +36 -5
  306. package/src/lib/hash.js +18 -0
  307. package/src/lib/hash.spec.js +163 -0
  308. package/{lib → src/lib}/index.js +1 -0
  309. package/{lib → src/lib}/objects/mix/mix.js +30 -11
  310. package/{lib → src/lib}/objects/mix/mix.test.js +57 -1
  311. package/{lib → src/lib}/objects/split.js +1 -1
  312. package/{lib → src/lib}/strings/index.js +1 -0
  313. package/src/lib/strings/name.js +24 -0
  314. package/src/lib/strings/name.test.js +67 -0
  315. package/src/lib/strings/pluralize.js +2 -0
  316. package/{lib → src/lib}/style/index.js +2 -0
  317. package/src/node/random-string.js +10 -0
  318. package/src/node/random-string.test.js +15 -0
  319. package/tsconfig.json +6 -6
  320. package/tsup.config.js +38 -0
  321. package/tsup.config.mjs +43 -0
  322. package/dist/dom/actions/index.d.ts +0 -3
  323. package/dist/dom/actions/masonry.d.ts +0 -3
  324. package/dist/dom/actions/prefer-horizontal-scroll.d.ts +0 -3
  325. package/dist/dom/actions/sticky.d.ts +0 -3
  326. package/dist/dom/cookie.d.ts +0 -11
  327. package/dist/dom/css-vars.d.ts +0 -4
  328. package/dist/dom/events.d.ts +0 -18
  329. package/dist/dom/font-size.d.ts +0 -5
  330. package/dist/dom/hash.d.ts +0 -1
  331. package/dist/dom/index.d.ts +0 -22
  332. package/dist/dom/media.d.ts +0 -3
  333. package/dist/dom/observers/index.d.ts +0 -3
  334. package/dist/dom/observers/observer.d.ts +0 -1
  335. package/dist/dom/ui/aria-current.d.ts +0 -5
  336. package/dist/dom/ui/index.d.ts +0 -4
  337. package/dist/dom/ui/scroll-container.d.ts +0 -1
  338. package/dist/lib/arrays/index.d.ts +0 -5
  339. package/dist/lib/arrays/shuffle.d.ts +0 -1
  340. package/dist/lib/arrays/unique.d.ts +0 -1
  341. package/dist/lib/auth/index.d.ts +0 -1
  342. package/dist/lib/checks.d.ts +0 -29
  343. package/dist/lib/date/index.d.ts +0 -3
  344. package/dist/lib/date/time.d.ts +0 -8
  345. package/dist/lib/form/form-data.d.ts +0 -7
  346. package/dist/lib/form/index.d.ts +0 -2
  347. package/dist/lib/functions/debounce.d.ts +0 -1
  348. package/dist/lib/functions/env.d.ts +0 -1
  349. package/dist/lib/functions/functional.d.ts +0 -4
  350. package/dist/lib/functions/index.d.ts +0 -5
  351. package/dist/lib/functions/throttle.d.ts +0 -1
  352. package/dist/lib/functions/timeout.d.ts +0 -3
  353. package/dist/lib/index.d.ts +0 -13
  354. package/dist/lib/numbers/index.d.ts +0 -2
  355. package/dist/lib/numbers/math.d.ts +0 -2
  356. package/dist/lib/objects/camelcase-keys.d.ts +0 -1
  357. package/dist/lib/objects/empty.d.ts +0 -2
  358. package/dist/lib/objects/equal.d.ts +0 -2
  359. package/dist/lib/objects/extend.d.ts +0 -4
  360. package/dist/lib/objects/flatten.d.ts +0 -4
  361. package/dist/lib/objects/index.d.ts +0 -13
  362. package/dist/lib/objects/json.d.ts +0 -1
  363. package/dist/lib/objects/loop.d.ts +0 -2
  364. package/dist/lib/objects/mix/mix.d.ts +0 -1
  365. package/dist/lib/objects/normalize-object.d.ts +0 -1
  366. package/dist/lib/objects/omit-empty.d.ts +0 -1
  367. package/dist/lib/objects/size.d.ts +0 -1
  368. package/dist/lib/promises/index.d.ts +0 -1
  369. package/dist/lib/promises/reject.d.ts +0 -3
  370. package/dist/lib/strings/convert-case/convert-case.d.ts +0 -8
  371. package/dist/lib/strings/index.d.ts +0 -4
  372. package/dist/lib/strings/pluralize.d.ts +0 -1
  373. package/dist/lib/strings/query-string.d.ts +0 -8
  374. package/dist/lib/style/index.d.ts +0 -1
  375. package/dist/lib/symbols/index.d.ts +0 -1
  376. package/dist/lib/symbols/symbols.d.ts +0 -2
  377. package/dist/node/common.d.ts +0 -1
  378. package/dist/node/dirname.d.ts +0 -7
  379. package/dist/node/file.d.ts +0 -2
  380. package/dist/node/hash.d.ts +0 -1
  381. package/dist/node/index.d.ts +0 -7
  382. package/dist/node/random-string.d.ts +0 -2
  383. package/lib/strings/pluralize.js +0 -2
  384. package/node/random-string.js +0 -10
  385. /package/{dom → src/dom}/accessibility.js +0 -0
  386. /package/{dom → src/dom}/actions/index.js +0 -0
  387. /package/{dom → src/dom}/actions/masonry.js +0 -0
  388. /package/{dom → src/dom}/actions/prefer-horizontal-scroll.js +0 -0
  389. /package/{dom → src/dom}/actions/sticky.js +0 -0
  390. /package/{dom → src/dom}/bounding-box.js +0 -0
  391. /package/{dom → src/dom}/clipboard.js +0 -0
  392. /package/{dom → src/dom}/css-vars.js +0 -0
  393. /package/{dom → src/dom}/events.js +0 -0
  394. /package/{dom → src/dom}/events.test.js +0 -0
  395. /package/{dom → src/dom}/focusable.js +0 -0
  396. /package/{dom → src/dom}/font-size.js +0 -0
  397. /package/{dom → src/dom}/get-element.js +0 -0
  398. /package/{dom → src/dom}/hash.js +0 -0
  399. /package/{dom → src/dom}/keyboard.js +0 -0
  400. /package/{dom → src/dom}/local-store.js +0 -0
  401. /package/{dom → src/dom}/media.js +0 -0
  402. /package/{dom → src/dom}/observers/index.js +0 -0
  403. /package/{dom → src/dom}/observers/intersection-observer.js +0 -0
  404. /package/{dom → src/dom}/observers/mutation-observer.js +0 -0
  405. /package/{dom → src/dom}/observers/observer.js +0 -0
  406. /package/{dom → src/dom}/observers/resize-observer.js +0 -0
  407. /package/{dom → src/dom}/pkce.js +0 -0
  408. /package/{dom → src/dom}/query-params.js +0 -0
  409. /package/{dom → src/dom}/sanitize.js +0 -0
  410. /package/{dom → src/dom}/session-store.js +0 -0
  411. /package/{dom → src/dom}/trap-focus.js +0 -0
  412. /package/{dom → src/dom}/ui/inconsistent-button-fix.js +0 -0
  413. /package/{dom → src/dom}/ui/index.js +0 -0
  414. /package/{dom → src/dom}/ui/scroll-container.js +0 -0
  415. /package/{dom → src/dom}/ui/traverse-and-scramble.js +0 -0
  416. /package/{lib → src/lib}/arrays/item-position.js +0 -0
  417. /package/{lib → src/lib}/arrays/join.js +0 -0
  418. /package/{lib → src/lib}/arrays/shuffle.js +0 -0
  419. /package/{lib → src/lib}/arrays/sort.spec.js +0 -0
  420. /package/{lib → src/lib}/arrays/unique.js +0 -0
  421. /package/{lib → src/lib}/auth/index.js +0 -0
  422. /package/{lib → src/lib}/date/days.js +0 -0
  423. /package/{lib → src/lib}/date/index.js +0 -0
  424. /package/{lib → src/lib}/date/months.js +0 -0
  425. /package/{lib → src/lib}/form/form-data.js +0 -0
  426. /package/{lib → src/lib}/form/index.js +0 -0
  427. /package/{lib → src/lib}/form/sanitize.js +0 -0
  428. /package/{lib → src/lib}/form/sanitize.spec.js +0 -0
  429. /package/{lib → src/lib}/functions/debounce.js +0 -0
  430. /package/{lib → src/lib}/functions/env.js +0 -0
  431. /package/{lib → src/lib}/functions/functional.js +0 -0
  432. /package/{lib → src/lib}/functions/index.js +0 -0
  433. /package/{lib → src/lib}/functions/throttle.js +0 -0
  434. /package/{lib → src/lib}/functions/timeout.js +0 -0
  435. /package/{lib → src/lib}/numbers/index.js +0 -0
  436. /package/{lib → src/lib}/numbers/math.js +0 -0
  437. /package/{lib → src/lib}/objects/camelcase-keys.js +0 -0
  438. /package/{lib → src/lib}/objects/camelcase-keys.test.js +0 -0
  439. /package/{lib → src/lib}/objects/empty.js +0 -0
  440. /package/{lib → src/lib}/objects/equal.js +0 -0
  441. /package/{lib → src/lib}/objects/extend.js +0 -0
  442. /package/{lib → src/lib}/objects/extend.test.js +0 -0
  443. /package/{lib → src/lib}/objects/flatten.js +0 -0
  444. /package/{lib → src/lib}/objects/index.js +0 -0
  445. /package/{lib → src/lib}/objects/json.js +0 -0
  446. /package/{lib → src/lib}/objects/loop.js +0 -0
  447. /package/{lib → src/lib}/objects/loop.test.js +0 -0
  448. /package/{lib → src/lib}/objects/mix/mix.md +0 -0
  449. /package/{lib → src/lib}/objects/nested-property.js +0 -0
  450. /package/{lib → src/lib}/objects/normalize-object.js +0 -0
  451. /package/{lib → src/lib}/objects/omit-empty.js +0 -0
  452. /package/{lib → src/lib}/objects/omit-empty.test.js +0 -0
  453. /package/{lib → src/lib}/objects/size.js +0 -0
  454. /package/{lib → src/lib}/promises/index.js +0 -0
  455. /package/{lib → src/lib}/promises/reject.js +0 -0
  456. /package/{lib → src/lib}/sse.js +0 -0
  457. /package/{lib → src/lib}/strings/convert-case/convert-case.js +0 -0
  458. /package/{lib → src/lib}/strings/convert-case/convert-case.md +0 -0
  459. /package/{lib → src/lib}/strings/convert-case/convert-case.test.js +0 -0
  460. /package/{lib → src/lib}/strings/markdown.js +0 -0
  461. /package/{lib → src/lib}/strings/query-string.js +0 -0
  462. /package/{lib → src/lib}/symbols/index.js +0 -0
  463. /package/{lib → src/lib}/symbols/symbols.js +0 -0
  464. /package/{node → src/node}/common.js +0 -0
  465. /package/{node → src/node}/dirname.js +0 -0
  466. /package/{node → src/node}/file-cache.js +0 -0
  467. /package/{node → src/node}/file.js +0 -0
  468. /package/{node → src/node}/hash.js +0 -0
  469. /package/{node → src/node}/index.js +0 -0
  470. /package/{node → src/node}/pkce.js +0 -0
  471. /package/{node → src/node}/sanitize.js +0 -0
  472. /package/{node → src/node}/sanitize.spec.js +0 -0
@@ -0,0 +1,131 @@
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/events.js
9
+ function addListeners(listeners) {
10
+ listeners.forEach(({ node, event, handler }) => {
11
+ node.addEventListener(event, handler);
12
+ });
13
+ }
14
+ function removeListeners(listeners) {
15
+ listeners.forEach(({ node, event, handler }) => {
16
+ node.removeEventListener(event, handler);
17
+ });
18
+ }
19
+
20
+ // src/dom/css-vars.js
21
+ function getCSSVar(element, prop) {
22
+ element = getElement(element);
23
+ return getComputedStyle(element).getPropertyValue(prop);
24
+ }
25
+ function setCSSVar(element, prop, value) {
26
+ element = getElement(element);
27
+ element.style.setProperty(prop, value);
28
+ }
29
+
30
+ // src/lib/objects/omit-empty.js
31
+ function omitEmpty(obj, shallow = false) {
32
+ if (typeof obj !== "object" || obj === null) return obj;
33
+ if (obj instanceof Date) return obj;
34
+ const result = Array.isArray(obj) ? [] : {};
35
+ for (const [key, value] of Object.entries(obj)) {
36
+ if (value === null || value === void 0 || value === "" || typeof value === "object" && !(value instanceof Date) && Object.keys(value).length === 0) {
37
+ continue;
38
+ }
39
+ result[key] = shallow ? value : omitEmpty(value);
40
+ }
41
+ return result;
42
+ }
43
+
44
+ // src/dom/actions/prefer-horizontal-scroll.js
45
+ var DEFAULT_OPTIONS = {
46
+ scrollSnapDelay: 1e3
47
+ };
48
+ function preferHorizontalScroll(node, props = {}) {
49
+ if (!node.classList.contains("scrollable-prefer-horizontal")) return;
50
+ const state = {
51
+ origSnapType: null,
52
+ currentSnapType: null,
53
+ snapTimeoutID: null
54
+ };
55
+ const options = {
56
+ ...DEFAULT_OPTIONS,
57
+ ...omitEmpty({
58
+ scrollSnapDelay: getCSSVar(node, "--scroll-snap-delay")
59
+ }),
60
+ ...omitEmpty(props)
61
+ };
62
+ const listeners = [
63
+ {
64
+ event: "wheel",
65
+ node,
66
+ handler: handleWheel
67
+ },
68
+ {
69
+ event: "pointerenter",
70
+ node,
71
+ handler: handlePointerEnter
72
+ },
73
+ {
74
+ event: "pointerleave",
75
+ node,
76
+ handler: handlePointerLeave
77
+ }
78
+ ];
79
+ addListeners(listeners);
80
+ function handleWheel(event) {
81
+ const direction = event.deltaY > 0 ? "down" : "up";
82
+ const updatedDelta = event.deltaY;
83
+ if (isTrackpad(event)) return false;
84
+ setCSSVar(node, "--snap-type", "none");
85
+ const scrolledAmount = node.scrollLeft;
86
+ const scrollWidth = node.scrollWidth;
87
+ const clientWidth = node.clientWidth;
88
+ const scrollableAmount = scrollWidth - clientWidth;
89
+ if (direction === "down" && scrolledAmount < scrollableAmount) {
90
+ node.scrollLeft += updatedDelta;
91
+ event.preventDefault();
92
+ }
93
+ if (direction === "up" && scrolledAmount > 0) {
94
+ node.scrollLeft += updatedDelta;
95
+ event.preventDefault();
96
+ }
97
+ const { snapTimeoutID } = state;
98
+ if (snapTimeoutID) clearTimeout(snapTimeoutID);
99
+ state.snapTimeoutID = setTimeout((_) => {
100
+ restoreHijackedState(node, state);
101
+ }, options.scrollSnapDelay);
102
+ }
103
+ function handlePointerEnter(event) {
104
+ state.origSnapType = getCSSVar(node, "--snap-type") || "proximity";
105
+ }
106
+ function handlePointerLeave(event) {
107
+ restoreHijackedState(node, state);
108
+ }
109
+ return {
110
+ destroy() {
111
+ removeListeners(listeners);
112
+ }
113
+ };
114
+ }
115
+ function restoreHijackedState(node, state) {
116
+ const scrollLeft = node.scrollLeft;
117
+ setCSSVar(node, "--snap-type", state.origSnapType);
118
+ const finalScrollLeft = node.scrollLeft;
119
+ setCSSVar(node, "--snap-type", "none");
120
+ node.scrollTo({ left: scrollLeft, behavior: "instant" });
121
+ node.scrollTo({ left: finalScrollLeft, behavior: "smooth" });
122
+ setTimeout((_) => {
123
+ setCSSVar(node, "--snap-type", state.origSnapType);
124
+ }, 250);
125
+ }
126
+ function isTrackpad(event) {
127
+ if (event.wheelDeltaY === event.deltaY * -3) return true;
128
+ }
129
+ export {
130
+ preferHorizontalScroll
131
+ };
@@ -0,0 +1,185 @@
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.body;
78
+ useObserverMethodOnTarget(target, observer, "observe", opts);
79
+ function observerFn(entries) {
80
+ for (const entry of entries) {
81
+ if (callback) callback({ entry, entries, observer });
82
+ else dispatchEvent(target, "resize-obs", { entry, entries, observer });
83
+ }
84
+ }
85
+ return {
86
+ observe(target2) {
87
+ useObserverMethodOnTarget(target2, observer, "observe", options);
88
+ },
89
+ unobserve(target2) {
90
+ useObserverMethodOnTarget(target2, observer, "unobserve");
91
+ },
92
+ disconnect: (_) => observer.disconnect(),
93
+ destroy: (_) => observer.disconnect()
94
+ };
95
+ }
96
+
97
+ // src/dom/ui/scroll-container.js
98
+ function findScrollContainer(element, direction = "both") {
99
+ if (!element) return;
100
+ let parent = element.parentElement;
101
+ while (parent) {
102
+ const { overflow, overflowX, overflowY } = getComputedStyle(parent);
103
+ if (direction === "both") {
104
+ if (overflow.includes("auto") || overflow.includes("scroll"))
105
+ return parent;
106
+ }
107
+ if (direction === "horizontal") {
108
+ if (overflowX === "auto" || overflowX === "scroll") return parent;
109
+ }
110
+ if (direction === "vertical") {
111
+ if (overflowY === "auto" || overflowY === "scroll") return parent;
112
+ }
113
+ parent = parent.parentElement;
114
+ }
115
+ return document.documentElement;
116
+ }
117
+
118
+ // src/dom/actions/sticky.js
119
+ function sticky(node, props = {}) {
120
+ const scrollContainer = findScrollContainer(node);
121
+ let stickyTBLR = getComputedTBLR(node);
122
+ const obs = resizeObserver(node, {
123
+ callback: ({ entry }) => {
124
+ stickyTBLR = getComputedTBLR(node);
125
+ isSticking();
126
+ scrollContainer === document.documentElement ? window.addEventListener("scroll", scrollEventListener) : scrollContainer.addEventListener("scroll", scrollEventListener);
127
+ }
128
+ });
129
+ function scrollEventListener(event) {
130
+ isSticking();
131
+ }
132
+ function isSticking() {
133
+ const { top, bottom, left, right } = stickyTBLR;
134
+ const relativeRect = boundingBoxRelativeToAncestor({
135
+ element: node,
136
+ ancestorElement: scrollContainer
137
+ });
138
+ if (!isNaN(top)) {
139
+ if (relativeRect.top - top <= 1) {
140
+ node.classList.add("sticking");
141
+ } else {
142
+ node.classList.remove("sticking");
143
+ }
144
+ }
145
+ if (!isNaN(bottom)) {
146
+ if (relativeRect.bottom + bottom >= -1) {
147
+ node.classList.add("sticking");
148
+ } else {
149
+ node.classList.remove("sticking");
150
+ }
151
+ }
152
+ if (!isNaN(left)) {
153
+ if (relativeRect.left - left <= 1) {
154
+ node.classList.add("sticking");
155
+ } else {
156
+ node.classList.remove("sticking");
157
+ }
158
+ }
159
+ if (!isNaN(right)) {
160
+ if (relativeRect.right + right >= -1) {
161
+ node.classList.add("sticking");
162
+ } else {
163
+ node.classList.remove("sticking");
164
+ }
165
+ }
166
+ }
167
+ return {
168
+ destroy() {
169
+ obs.disconnect();
170
+ scrollContainer.removeEventListener("scroll", scrollEventListener);
171
+ }
172
+ };
173
+ }
174
+ function getComputedTBLR(element) {
175
+ const style = getComputedStyle(element);
176
+ return {
177
+ top: parseFloat(style.top),
178
+ bottom: parseFloat(style.bottom),
179
+ left: parseFloat(style.left),
180
+ right: parseFloat(style.right)
181
+ };
182
+ }
183
+ export {
184
+ sticky
185
+ };
@@ -0,0 +1,45 @@
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
+ export {
43
+ boundingBox,
44
+ boundingBoxRelativeToAncestor
45
+ };
@@ -0,0 +1,13 @@
1
+ // src/dom/clipboard.js
2
+ function copyRichText(element) {
3
+ const range = document.createRange();
4
+ range.selectNode(element);
5
+ const selection = window.getSelection();
6
+ selection.removeAllRanges();
7
+ selection.addRange(range);
8
+ document.execCommand("copy");
9
+ selection.removeAllRanges();
10
+ }
11
+ export {
12
+ copyRichText
13
+ };
@@ -0,0 +1,32 @@
1
+ // src/dom/cookie.js
2
+ var cookies = {
3
+ get(name) {
4
+ return getCookie(name);
5
+ },
6
+ set(name, value, days) {
7
+ setCookie(name, value, days);
8
+ }
9
+ };
10
+ function getCookie(name) {
11
+ const match = document.cookie.match(new RegExp("(^| )" + name + "=([^;]+)"));
12
+ if (!match) return null;
13
+ const decoded = decodeURIComponent(match[2]);
14
+ try {
15
+ return JSON.parse(decoded);
16
+ } catch (e) {
17
+ return decoded;
18
+ }
19
+ }
20
+ function setCookie(name, value, days) {
21
+ let expires = "";
22
+ if (days) {
23
+ const date = /* @__PURE__ */ new Date();
24
+ date.setTime(date.getTime() + days * 24 * 60 * 60 * 1e3);
25
+ expires = "; expires=" + date.toUTCString();
26
+ }
27
+ document.cookie = name + "=" + (value || "") + expires + "; path=/";
28
+ }
29
+ export {
30
+ cookies,
31
+ getCookie
32
+ };
@@ -0,0 +1,28 @@
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
9
+ function getCSSValue(element, prop) {
10
+ return getCSSVar(element, prop);
11
+ }
12
+ function setCSSValue(element, prop, value) {
13
+ setCSSVar(element, prop, value);
14
+ }
15
+ function getCSSVar(element, prop) {
16
+ element = getElement(element);
17
+ return getComputedStyle(element).getPropertyValue(prop);
18
+ }
19
+ function setCSSVar(element, prop, value) {
20
+ element = getElement(element);
21
+ element.style.setProperty(prop, value);
22
+ }
23
+ export {
24
+ getCSSValue,
25
+ getCSSVar,
26
+ setCSSValue,
27
+ setCSSVar
28
+ };
@@ -0,0 +1,67 @@
1
+ // src/dom/events.js
2
+ function addListeners(listeners) {
3
+ listeners.forEach(({ node, event, handler }) => {
4
+ node.addEventListener(event, handler);
5
+ });
6
+ }
7
+ function removeListeners(listeners) {
8
+ listeners.forEach(({ node, event, handler }) => {
9
+ node.removeEventListener(event, handler);
10
+ });
11
+ }
12
+ function dispatchEvent(node, eventName, detail, options = {}) {
13
+ node.dispatchEvent(
14
+ new CustomEvent(eventName, {
15
+ ...options,
16
+ detail
17
+ })
18
+ );
19
+ }
20
+ function updateEvent(event, updates) {
21
+ const { type, ...rest } = event;
22
+ return new CustomEvent(event.type, {
23
+ ...rest,
24
+ ...updates
25
+ });
26
+ }
27
+ function createListeners(listeners) {
28
+ listeners = listeners || [];
29
+ listeners.forEach((listener) => {
30
+ const { node, event, handler } = listener;
31
+ node.addEventListener(event, handler);
32
+ });
33
+ return {
34
+ get list() {
35
+ return listeners;
36
+ },
37
+ add({ node, event, handler }) {
38
+ listeners.push({ node, event, handler });
39
+ node.addEventListener(event, handler);
40
+ },
41
+ remove({ node, event, handler }) {
42
+ const index = listeners.findIndex((listener) => {
43
+ if (listener.node === node && listener.event === event && listener.handler === handler) {
44
+ return true;
45
+ }
46
+ return false;
47
+ });
48
+ if (index !== -1) {
49
+ listeners.splice(index, 1);
50
+ node.removeEventListener(event, handler);
51
+ }
52
+ },
53
+ clear() {
54
+ listeners.forEach(({ node, event, handler }) => {
55
+ listeners = [];
56
+ node.removeEventListener(event, handler);
57
+ });
58
+ }
59
+ };
60
+ }
61
+ export {
62
+ addListeners,
63
+ createListeners,
64
+ dispatchEvent,
65
+ removeListeners,
66
+ updateEvent
67
+ };
@@ -0,0 +1,118 @@
1
+ // src/dom/focusable.js
2
+ function getFocusableElements(container = document.body) {
3
+ return {
4
+ /**
5
+ * Gets the number of keyboard focusable elements.
6
+ * This is useful for checking if there are any focusable elements
7
+ * before attempting to focus them.
8
+ *
9
+ * @returns {number} The number of keyboard focusable elements
10
+ */
11
+ get length() {
12
+ return this.keyboard.length;
13
+ },
14
+ /**
15
+ * Gets all focusable elements within the container that are visible and enabled.
16
+ * This includes elements that can be focused via mouse or programmatically,
17
+ * but may not be keyboard focusable.
18
+ *
19
+ * Elements are considered focusable if they:
20
+ * - Are not disabled
21
+ * - Are not hidden
22
+ * - Are not display:none
23
+ *
24
+ * @returns {HTMLElement[]} Array of focusable elements that are visible and enabled
25
+ */
26
+ get all() {
27
+ const elements = Array.from(
28
+ container.querySelectorAll(
29
+ `a,
30
+ button,
31
+ input,
32
+ textarea,
33
+ select,
34
+ details,
35
+ iframe,
36
+ embed,
37
+ object,
38
+ summary,
39
+ dialog,
40
+ audio[controls],
41
+ video[controls],
42
+ [contenteditable],
43
+ [tabindex]
44
+ `
45
+ )
46
+ );
47
+ return elements.filter((el) => {
48
+ if (el.hasAttribute("disabled")) return false;
49
+ if (el.hasAttribute("hidden")) return false;
50
+ if (window.getComputedStyle(el).display === "none") return false;
51
+ return true;
52
+ });
53
+ },
54
+ /**
55
+ * Gets elements that can be focused via keyboard (tabIndex > -1).
56
+ * These are the elements that will be focused when using the Tab key.
57
+ *
58
+ * @returns {HTMLElement[]} Array of keyboard focusable elements
59
+ */
60
+ get keyboard() {
61
+ return this.all.filter((el) => el instanceof HTMLElement && el.tabIndex > -1);
62
+ },
63
+ /**
64
+ * Alias for keyboard focusable elements.
65
+ * This is provided for semantic clarity in certain contexts.
66
+ *
67
+ * @returns {HTMLElement[]} Array of keyboard focusable elements
68
+ */
69
+ get keyboardOnly() {
70
+ return this.keyboard;
71
+ },
72
+ /**
73
+ * Gets the first keyboard focusable element.
74
+ * This is useful for setting initial focus when opening a modal or dialog.
75
+ *
76
+ * @returns {HTMLElement|null} The first focusable element or null if none exist
77
+ */
78
+ get first() {
79
+ return this.keyboard[0] || null;
80
+ },
81
+ /**
82
+ * Gets the last keyboard focusable element.
83
+ * This is useful for focus trapping when using Shift+Tab.
84
+ *
85
+ * @returns {HTMLElement|null} The last focusable element or null if none exist
86
+ */
87
+ get last() {
88
+ return this.keyboard[this.length - 1] || null;
89
+ },
90
+ /**
91
+ * Gets the next focusable element after the given index.
92
+ * This is useful for implementing custom tab order or focus management.
93
+ *
94
+ * @param {number} index - The current element's index in the keyboard focusable array
95
+ * @returns {HTMLElement|null} The next focusable element or null if none exists
96
+ */
97
+ next(index) {
98
+ return this.keyboard[index + 1] || null;
99
+ },
100
+ /**
101
+ * Gets the previous focusable element before the given index.
102
+ * This is useful for implementing custom tab order or focus management.
103
+ *
104
+ * @param {number} index - The current element's index in the keyboard focusable array
105
+ * @returns {HTMLElement|null} The previous focusable element or null if none exists
106
+ */
107
+ prev(index) {
108
+ return this.keyboard[index - 1] || null;
109
+ }
110
+ };
111
+ }
112
+ function Focusable(container = document.body) {
113
+ return getFocusableElements(container);
114
+ }
115
+ export {
116
+ Focusable,
117
+ getFocusableElements
118
+ };
@@ -0,0 +1,44 @@
1
+ // src/lib/numbers/index.js
2
+ function splitUnit(string) {
3
+ if (typeof string === "number") return [string, null];
4
+ const regex = /(-?\d*\.?\d+)([a-z]+)/i;
5
+ const match = string.match(regex);
6
+ if (match) return [parseFloat(match[1]), match[2]];
7
+ return [parseFloat(string), null];
8
+ }
9
+
10
+ // src/dom/font-size.js
11
+ function getUnit(value) {
12
+ const [, unit] = splitUnit(value);
13
+ return unit;
14
+ }
15
+ function em(element = document.body, multiple = 1) {
16
+ const value = parseFloat(getComputedStyle(element)["font-size"]);
17
+ return Math.round(value * multiple);
18
+ }
19
+ function rem(multiple = 1) {
20
+ const value = parseFloat(getComputedStyle(document.body)["font-size"]);
21
+ return Math.round(value * multiple);
22
+ }
23
+ function lh(element = document.body, multiple = 1) {
24
+ const lineHeight = getComputedStyle(element)["line-height"];
25
+ const value = parseFloat(lineHeight);
26
+ return Math.round(value * multiple);
27
+ }
28
+ function toPx(value, element = null) {
29
+ const [numeric, unit] = splitUnit(value);
30
+ let finalValue = 0;
31
+ if (unit === "rem") finalValue = rem(numeric);
32
+ if (unit === "em") finalValue = em(element, numeric);
33
+ if (unit === "lh") finalValue = lh(element, numeric);
34
+ if (unit === "px") finalValue = numeric;
35
+ if (!unit) finalValue = numeric;
36
+ return finalValue;
37
+ }
38
+ export {
39
+ em,
40
+ getUnit,
41
+ lh,
42
+ rem,
43
+ toPx
44
+ };