@studiometa/js-toolkit 3.6.0-beta.0 → 3.6.0-beta.1

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 (170) hide show
  1. package/Base/Base.js.map +2 -2
  2. package/Base/types.d.ts +3 -3
  3. package/Base/utils.js.map +2 -2
  4. package/README.md +10 -0
  5. package/decorators/withBreakpointManager.d.ts +1 -1
  6. package/decorators/withBreakpointManager.js.map +1 -1
  7. package/decorators/withBreakpointObserver.d.ts +1 -1
  8. package/decorators/withBreakpointObserver.js.map +1 -1
  9. package/decorators/withDrag.d.ts +1 -1
  10. package/decorators/withDrag.js.map +1 -1
  11. package/decorators/withExtraConfig.d.ts +1 -1
  12. package/decorators/withExtraConfig.js.map +1 -1
  13. package/decorators/withFreezedOptions.d.ts +1 -1
  14. package/decorators/withFreezedOptions.js.map +1 -1
  15. package/decorators/withGroup.js.map +2 -2
  16. package/decorators/withIntersectionObserver.d.ts +1 -1
  17. package/decorators/withIntersectionObserver.js.map +1 -1
  18. package/decorators/withMountOnMediaQuery.d.ts +1 -1
  19. package/decorators/withMountOnMediaQuery.js.map +1 -1
  20. package/decorators/withMountWhenInView.d.ts +1 -1
  21. package/decorators/withMountWhenInView.js.map +1 -1
  22. package/decorators/withMutation.d.ts +1 -1
  23. package/decorators/withMutation.js.map +1 -1
  24. package/decorators/withRelativePointer.d.ts +1 -1
  25. package/decorators/withRelativePointer.js.map +1 -1
  26. package/decorators/withResponsiveOptions.d.ts +1 -1
  27. package/decorators/withResponsiveOptions.js.map +1 -1
  28. package/decorators/withScrolledInView/withScrolledInView.d.ts +1 -1
  29. package/decorators/withScrolledInView/withScrolledInView.js.map +1 -1
  30. package/helpers/createApp.d.ts +1 -1
  31. package/helpers/createApp.js +1 -4
  32. package/helpers/createApp.js.map +2 -2
  33. package/helpers/getClosestParent.d.ts +1 -1
  34. package/helpers/getClosestParent.js.map +1 -1
  35. package/helpers/getDirectChildren.d.ts +2 -2
  36. package/helpers/getDirectChildren.js.map +1 -1
  37. package/helpers/getInstanceFromElement.d.ts +1 -1
  38. package/helpers/getInstanceFromElement.js.map +1 -1
  39. package/helpers/importOnInteraction.d.ts +1 -1
  40. package/helpers/importOnInteraction.js.map +1 -1
  41. package/helpers/importOnMediaQuery.d.ts +1 -1
  42. package/helpers/importOnMediaQuery.js.map +1 -1
  43. package/helpers/importWhenIdle.d.ts +1 -1
  44. package/helpers/importWhenIdle.js.map +1 -1
  45. package/helpers/importWhenPrefersMotion.d.ts +1 -1
  46. package/helpers/importWhenPrefersMotion.js.map +1 -1
  47. package/helpers/importWhenVisible.d.ts +1 -1
  48. package/helpers/importWhenVisible.js.map +1 -1
  49. package/helpers/queryComponent.js.map +2 -2
  50. package/package.json +1 -1
  51. package/services/DragService.d.ts +1 -1
  52. package/services/DragService.js.map +1 -1
  53. package/services/KeyService.d.ts +1 -1
  54. package/services/KeyService.js.map +1 -1
  55. package/services/LoadService.d.ts +1 -1
  56. package/services/LoadService.js.map +1 -1
  57. package/services/MutationService.d.ts +1 -1
  58. package/services/MutationService.js.map +1 -1
  59. package/services/PointerService.d.ts +1 -1
  60. package/services/PointerService.js.map +1 -1
  61. package/services/RafService.d.ts +1 -1
  62. package/services/RafService.js.map +1 -1
  63. package/services/ResizeService.d.ts +1 -1
  64. package/services/ResizeService.js.map +1 -1
  65. package/services/ScrollService.d.ts +1 -1
  66. package/services/ScrollService.js.map +1 -1
  67. package/utils/cache.d.ts +1 -1
  68. package/utils/cache.js.map +1 -1
  69. package/utils/collide/boundingRectToCircle.d.ts +1 -1
  70. package/utils/collide/boundingRectToCircle.js.map +1 -1
  71. package/utils/collide/collideCircleCircle.d.ts +1 -1
  72. package/utils/collide/collideCircleCircle.js.map +1 -1
  73. package/utils/collide/collideCircleRect.d.ts +1 -1
  74. package/utils/collide/collideCircleRect.js.map +1 -1
  75. package/utils/collide/collidePointCircle.d.ts +1 -1
  76. package/utils/collide/collidePointCircle.js.map +1 -1
  77. package/utils/collide/collidePointRect.d.ts +1 -1
  78. package/utils/collide/collidePointRect.js.map +1 -1
  79. package/utils/collide/collideRectRect.d.ts +1 -1
  80. package/utils/collide/collideRectRect.js.map +1 -1
  81. package/utils/css/animate.d.ts +1 -1
  82. package/utils/css/animate.js +2 -6
  83. package/utils/css/animate.js.map +2 -2
  84. package/utils/css/classes.d.ts +3 -3
  85. package/utils/css/classes.js.map +1 -1
  86. package/utils/css/getOffsetSizes.d.ts +1 -1
  87. package/utils/css/getOffsetSizes.js.map +1 -1
  88. package/utils/css/matrix.d.ts +1 -1
  89. package/utils/css/matrix.js.map +1 -1
  90. package/utils/css/styles.d.ts +2 -2
  91. package/utils/css/styles.js.map +1 -1
  92. package/utils/css/transform.d.ts +1 -1
  93. package/utils/css/transform.js.map +1 -1
  94. package/utils/css/transition.d.ts +1 -1
  95. package/utils/css/transition.js.map +1 -1
  96. package/utils/debounce.d.ts +1 -1
  97. package/utils/debounce.js.map +1 -1
  98. package/utils/history.d.ts +3 -3
  99. package/utils/history.js.map +1 -1
  100. package/utils/is.d.ts +10 -10
  101. package/utils/is.js.map +1 -1
  102. package/utils/loadElement.d.ts +5 -5
  103. package/utils/loadElement.js.map +1 -1
  104. package/utils/math/clamp.d.ts +1 -1
  105. package/utils/math/clamp.js.map +1 -1
  106. package/utils/math/clamp01.d.ts +1 -1
  107. package/utils/math/clamp01.js.map +1 -1
  108. package/utils/math/createEases.d.ts +2 -2
  109. package/utils/math/createEases.js.map +1 -1
  110. package/utils/math/createRange.d.ts +1 -1
  111. package/utils/math/createRange.js.map +1 -1
  112. package/utils/math/damp.d.ts +1 -1
  113. package/utils/math/damp.js.map +2 -2
  114. package/utils/math/inertiaFinalValue.d.ts +1 -1
  115. package/utils/math/inertiaFinalValue.js.map +1 -1
  116. package/utils/math/lerp.d.ts +1 -1
  117. package/utils/math/lerp.js.map +1 -1
  118. package/utils/math/map.d.ts +1 -1
  119. package/utils/math/map.js.map +1 -1
  120. package/utils/math/round.d.ts +1 -1
  121. package/utils/math/round.js.map +1 -1
  122. package/utils/math/wrap.d.ts +1 -1
  123. package/utils/math/wrap.js.map +1 -1
  124. package/utils/memo.d.ts +1 -1
  125. package/utils/memo.js.map +1 -1
  126. package/utils/memoize.d.ts +1 -1
  127. package/utils/memoize.js.map +1 -1
  128. package/utils/nextFrame.d.ts +1 -1
  129. package/utils/nextFrame.js.map +1 -1
  130. package/utils/nextMicrotask.d.ts +1 -1
  131. package/utils/nextMicrotask.js.map +1 -1
  132. package/utils/nextTick.d.ts +1 -1
  133. package/utils/nextTick.js.map +1 -1
  134. package/utils/random.d.ts +3 -3
  135. package/utils/random.js.map +1 -1
  136. package/utils/scheduler.d.ts +2 -2
  137. package/utils/scheduler.js.map +1 -1
  138. package/utils/scrollTo.d.ts +1 -1
  139. package/utils/scrollTo.js.map +1 -1
  140. package/utils/storage/createStorage.js +1 -5
  141. package/utils/storage/createStorage.js.map +2 -2
  142. package/utils/storage/createUrlSearchParamsProvider.js.map +2 -2
  143. package/utils/storage/getGlobalStorage.js.map +2 -2
  144. package/utils/storage/index.js.map +2 -2
  145. package/utils/string/changeCase.d.ts +6 -6
  146. package/utils/string/changeCase.js.map +1 -1
  147. package/utils/string/withLeadingCharacters.d.ts +1 -1
  148. package/utils/string/withLeadingCharacters.js.map +1 -1
  149. package/utils/string/withLeadingSlash.d.ts +1 -1
  150. package/utils/string/withLeadingSlash.js.map +1 -1
  151. package/utils/string/withTrailingCharacters.d.ts +1 -1
  152. package/utils/string/withTrailingCharacters.js.map +1 -1
  153. package/utils/string/withTrailingSlash.d.ts +1 -1
  154. package/utils/string/withTrailingSlash.js.map +1 -1
  155. package/utils/string/withoutLeadingCharacters.d.ts +1 -1
  156. package/utils/string/withoutLeadingCharacters.js.map +1 -1
  157. package/utils/string/withoutLeadingCharactersRecursive.d.ts +1 -1
  158. package/utils/string/withoutLeadingCharactersRecursive.js.map +1 -1
  159. package/utils/string/withoutLeadingSlash.d.ts +1 -1
  160. package/utils/string/withoutLeadingSlash.js.map +1 -1
  161. package/utils/string/withoutTrailingCharacters.d.ts +1 -1
  162. package/utils/string/withoutTrailingCharacters.js.map +1 -1
  163. package/utils/string/withoutTrailingCharactersRecursive.d.ts +1 -1
  164. package/utils/string/withoutTrailingCharactersRecursive.js.map +1 -1
  165. package/utils/string/withoutTrailingSlash.d.ts +1 -1
  166. package/utils/string/withoutTrailingSlash.js.map +1 -1
  167. package/utils/throttle.d.ts +1 -1
  168. package/utils/throttle.js.map +1 -1
  169. package/utils/trapFocus.d.ts +2 -2
  170. package/utils/trapFocus.js.map +1 -1
package/utils/random.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * @param {number} [b] Second bound, defaults to 0.
5
5
  * @return {number} A number between `a` and `b`.
6
6
  * @link https://js-toolkit.studiometa.dev/utils/random.html
7
- */
7
+ */
8
8
  export declare function random(a: number, b?: number): number;
9
9
  /**
10
10
  * Get a random integer between bounds
@@ -13,7 +13,7 @@ export declare function random(a: number, b?: number): number;
13
13
  * @param {number} b Second bound.
14
14
  * @return {number} An integer between `a` and `b`;
15
15
  * @link https://js-toolkit.studiometa.dev/utils/randomInt.html
16
- */
16
+ */
17
17
  export declare function randomInt(a: number, b?: number): number;
18
18
  /**
19
19
  * Get a random item of an array or a random character of a string
@@ -22,5 +22,5 @@ export declare function randomInt(a: number, b?: number): number;
22
22
  * @return {T | undefined}
23
23
  * @throws {Error} Throws an error if `items` is not an array or a string.
24
24
  * @link https://js-toolkit.studiometa.dev/utils/randomItem.html
25
- */
25
+ */
26
26
  export declare function randomItem<T>(items: T[] | string): T | string | undefined;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/random.ts"],
4
- "sourcesContent": ["import { isArray, isString } from './is.js';\n\n/**\n * Get a random number between given bounds.\n * @param {number} a First bound.\n * @param {number} [b] Second bound, defaults to 0.\n * @return {number} A number between `a` and `b`.\n * @link https://js-toolkit.studiometa.dev/utils/random.html\n*/\nexport function random(a: number, b = 0): number {\n return Math.random() * (b - a) + a;\n}\n\n/**\n * Get a random integer between bounds\n *\n * @param {number} a First bound.\n * @param {number} b Second bound.\n * @return {number} An integer between `a` and `b`;\n * @link https://js-toolkit.studiometa.dev/utils/randomInt.html\n*/\nexport function randomInt(a: number, b = 0): number {\n return Math.round(random(a, b));\n}\n\n/**\n * Get a random item of an array or a random character of a string\n *\n * @param {T[] | string} items Array or string\n * @return {T | undefined}\n * @throws {Error} Throws an error if `items` is not an array or a string.\n * @link https://js-toolkit.studiometa.dev/utils/randomItem.html\n*/\nexport function randomItem<T>(items: T[] | string): T | string | undefined {\n if (!isArray(items) && !isString(items)) {\n throw new Error('randomItem() expects an array or a string as argument.');\n }\n return items.length > 0 ? items[randomInt(items.length - 1)] : undefined;\n}\n"],
4
+ "sourcesContent": ["import { isArray, isString } from './is.js';\n\n/**\n * Get a random number between given bounds.\n * @param {number} a First bound.\n * @param {number} [b] Second bound, defaults to 0.\n * @return {number} A number between `a` and `b`.\n * @link https://js-toolkit.studiometa.dev/utils/random.html\n */\nexport function random(a: number, b = 0): number {\n return Math.random() * (b - a) + a;\n}\n\n/**\n * Get a random integer between bounds\n *\n * @param {number} a First bound.\n * @param {number} b Second bound.\n * @return {number} An integer between `a` and `b`;\n * @link https://js-toolkit.studiometa.dev/utils/randomInt.html\n */\nexport function randomInt(a: number, b = 0): number {\n return Math.round(random(a, b));\n}\n\n/**\n * Get a random item of an array or a random character of a string\n *\n * @param {T[] | string} items Array or string\n * @return {T | undefined}\n * @throws {Error} Throws an error if `items` is not an array or a string.\n * @link https://js-toolkit.studiometa.dev/utils/randomItem.html\n */\nexport function randomItem<T>(items: T[] | string): T | string | undefined {\n if (!isArray(items) && !isString(items)) {\n throw new Error('randomItem() expects an array or a string as argument.');\n }\n return items.length > 0 ? items[randomInt(items.length - 1)] : undefined;\n}\n"],
5
5
  "mappings": "AAAA,SAAS,SAAS,gBAAgB;AAS3B,SAAS,OAAO,GAAW,IAAI,GAAW;AAC/C,SAAO,KAAK,OAAO,KAAK,IAAI,KAAK;AACnC;AAUO,SAAS,UAAU,GAAW,IAAI,GAAW;AAClD,SAAO,KAAK,MAAM,OAAO,GAAG,CAAC,CAAC;AAChC;AAUO,SAAS,WAAc,OAA6C;AACzE,MAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,SAAS,KAAK,GAAG;AACvC,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AACA,SAAO,MAAM,SAAS,IAAI,MAAM,UAAU,MAAM,SAAS,CAAC,CAAC,IAAI;AACjE;",
6
6
  "names": []
7
7
  }
@@ -5,11 +5,11 @@ declare function getScheduler<T extends string>(steps: T[]): Record<T, (fn: () =
5
5
  /**
6
6
  * Use a scheduler based on the given steps.
7
7
  * @link https://js-toolkit.studiometa.dev/utils/useScheduler.html
8
- */
8
+ */
9
9
  export declare function useScheduler<T extends string>(steps?: T[]): ReturnType<typeof getScheduler<T>>;
10
10
  /**
11
11
  * DOM-oriented scheduler using read/write/afterWrite steps.
12
12
  * @link https://js-toolkit.studiometa.dev/utils/domScheduler.html
13
- */
13
+ */
14
14
  export declare const domScheduler: Record<"afterWrite" | "read" | "write", (fn: () => unknown) => void>;
15
15
  export {};
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/scheduler.ts"],
4
- "sourcesContent": ["/**\n * Generate a scheduler.\n */\nfunction getScheduler<T extends string>(steps: T[]): Record<T, (fn: () => unknown) => void> {\n const stepsFns = {} as Record<T, Array<() => void>>;\n const api = {} as Record<T, (fn: () => void) => void>;\n\n let isScheduled = false;\n\n const resolvedPromise = Promise.resolve();\n\n /**\n * Execute the given list of tasks.\n */\n function run(tasks: Array<() => void>) {\n let task;\n // eslint-disable-next-line no-cond-assign\n while ((task = tasks.shift())) {\n task();\n }\n }\n\n /**\n * Flush registered tasks and schedule the next run if needed.\n */\n function flush() {\n for (const step of steps) {\n run(stepsFns[step]);\n }\n isScheduled = false;\n\n if (steps.reduce((length, step) => length + stepsFns[step].length, 0) > 0) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define, no-use-before-define\n scheduleFlush();\n }\n }\n\n /**\n * Schedule the next flush of tasks.\n */\n function scheduleFlush() {\n if (isScheduled) {\n return;\n }\n\n isScheduled = true;\n resolvedPromise.then(flush);\n }\n\n for (const step of steps) {\n stepsFns[step] = [];\n api[step] = function add(fn) {\n stepsFns[step].push(fn);\n scheduleFlush();\n };\n }\n\n return api;\n}\n\nconst instances = new Map();\n\nconst domSchedulerSteps = ['read', 'write', 'afterWrite'];\n\n/**\n * Use a scheduler based on the given steps.\n * @link https://js-toolkit.studiometa.dev/utils/useScheduler.html\n*/\nexport function useScheduler<T extends string>(\n steps: T[] = domSchedulerSteps as T[],\n): ReturnType<typeof getScheduler<T>> {\n const key = steps.join('-');\n\n if (instances.has(key)) {\n return instances.get(key);\n }\n\n const scheduler = getScheduler(steps);\n instances.set(key, scheduler);\n\n return scheduler;\n}\n\n/**\n * DOM-oriented scheduler using read/write/afterWrite steps.\n * @link https://js-toolkit.studiometa.dev/utils/domScheduler.html\n*/\nexport const domScheduler = useScheduler(domSchedulerSteps as ['read', 'write', 'afterWrite']);\n"],
4
+ "sourcesContent": ["/**\n * Generate a scheduler.\n */\nfunction getScheduler<T extends string>(steps: T[]): Record<T, (fn: () => unknown) => void> {\n const stepsFns = {} as Record<T, Array<() => void>>;\n const api = {} as Record<T, (fn: () => void) => void>;\n\n let isScheduled = false;\n\n const resolvedPromise = Promise.resolve();\n\n /**\n * Execute the given list of tasks.\n */\n function run(tasks: Array<() => void>) {\n let task;\n // eslint-disable-next-line no-cond-assign\n while ((task = tasks.shift())) {\n task();\n }\n }\n\n /**\n * Flush registered tasks and schedule the next run if needed.\n */\n function flush() {\n for (const step of steps) {\n run(stepsFns[step]);\n }\n isScheduled = false;\n\n if (steps.reduce((length, step) => length + stepsFns[step].length, 0) > 0) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define, no-use-before-define\n scheduleFlush();\n }\n }\n\n /**\n * Schedule the next flush of tasks.\n */\n function scheduleFlush() {\n if (isScheduled) {\n return;\n }\n\n isScheduled = true;\n resolvedPromise.then(flush);\n }\n\n for (const step of steps) {\n stepsFns[step] = [];\n api[step] = function add(fn) {\n stepsFns[step].push(fn);\n scheduleFlush();\n };\n }\n\n return api;\n}\n\nconst instances = new Map();\n\nconst domSchedulerSteps = ['read', 'write', 'afterWrite'];\n\n/**\n * Use a scheduler based on the given steps.\n * @link https://js-toolkit.studiometa.dev/utils/useScheduler.html\n */\nexport function useScheduler<T extends string>(\n steps: T[] = domSchedulerSteps as T[],\n): ReturnType<typeof getScheduler<T>> {\n const key = steps.join('-');\n\n if (instances.has(key)) {\n return instances.get(key);\n }\n\n const scheduler = getScheduler(steps);\n instances.set(key, scheduler);\n\n return scheduler;\n}\n\n/**\n * DOM-oriented scheduler using read/write/afterWrite steps.\n * @link https://js-toolkit.studiometa.dev/utils/domScheduler.html\n */\nexport const domScheduler = useScheduler(domSchedulerSteps as ['read', 'write', 'afterWrite']);\n"],
5
5
  "mappings": "AAGA,SAAS,aAA+B,OAAoD;AAC1F,QAAM,WAAW,CAAC;AAClB,QAAM,MAAM,CAAC;AAEb,MAAI,cAAc;AAElB,QAAM,kBAAkB,QAAQ,QAAQ;AAKxC,WAAS,IAAI,OAA0B;AACrC,QAAI;AAEJ,WAAQ,OAAO,MAAM,MAAM,GAAI;AAC7B,WAAK;AAAA,IACP;AAAA,EACF;AAKA,WAAS,QAAQ;AACf,eAAW,QAAQ,OAAO;AACxB,UAAI,SAAS,IAAI,CAAC;AAAA,IACpB;AACA,kBAAc;AAEd,QAAI,MAAM,OAAO,CAAC,QAAQ,SAAS,SAAS,SAAS,IAAI,EAAE,QAAQ,CAAC,IAAI,GAAG;AAEzE,oBAAc;AAAA,IAChB;AAAA,EACF;AAKA,WAAS,gBAAgB;AACvB,QAAI,aAAa;AACf;AAAA,IACF;AAEA,kBAAc;AACd,oBAAgB,KAAK,KAAK;AAAA,EAC5B;AAEA,aAAW,QAAQ,OAAO;AACxB,aAAS,IAAI,IAAI,CAAC;AAClB,QAAI,IAAI,IAAI,SAAS,IAAI,IAAI;AAC3B,eAAS,IAAI,EAAE,KAAK,EAAE;AACtB,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,MAAM,YAAY,oBAAI,IAAI;AAE1B,MAAM,oBAAoB,CAAC,QAAQ,SAAS,YAAY;AAMjD,SAAS,aACd,QAAa,mBACuB;AACpC,QAAM,MAAM,MAAM,KAAK,GAAG;AAE1B,MAAI,UAAU,IAAI,GAAG,GAAG;AACtB,WAAO,UAAU,IAAI,GAAG;AAAA,EAC1B;AAEA,QAAM,YAAY,aAAa,KAAK;AACpC,YAAU,IAAI,KAAK,SAAS;AAE5B,SAAO;AACT;AAMO,MAAM,eAAe,aAAa,iBAAoD;",
6
6
  "names": []
7
7
  }
@@ -23,7 +23,7 @@ export interface ScrollToOptions extends TweenOptions {
23
23
  *
24
24
  * @return {Promise<ScrollPosition>} A promising resolving with the scroll position.
25
25
  * @link https://js-toolkit.studiometa.dev/utils/scrollTo.html
26
- */
26
+ */
27
27
  export declare function scrollTo(target: string | HTMLElement | number | Partial<ScrollPosition>, { rootElement, axis, offset, ...tweenOptions }?: ScrollToOptions): Promise<ScrollPosition>;
28
28
  export declare namespace scrollTo {
29
29
  var axis: {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/scrollTo.ts"],
4
- "sourcesContent": ["import { tween } from './tween.js';\nimport type { TweenOptions } from './tween.js';\nimport { isString, isNumber, isFunction, isDefined } from './is.js';\nimport { lerp } from './math/index.js';\n\nexport interface ScrollPosition {\n left: number;\n top: number;\n}\n\nexport type ScrollTarget = string | HTMLElement | number | Partial<ScrollPosition>;\n\nexport interface ScrollToOptions extends TweenOptions {\n /**\n * Root element that will be scrolled.\n */\n rootElement?: HTMLElement | typeof window;\n /**\n * Scroll direction.\n */\n axis?: (typeof scrollTo.axis)[keyof typeof scrollTo.axis];\n /**\n * Distance from the target.\n */\n offset?: number;\n}\n\nconst xAxis = Symbol(0);\nconst yAxis = Symbol(1);\nconst bothAxis = Symbol(2);\n\nfunction isHtmlElement(rootElement: ScrollToOptions['rootElement']): rootElement is HTMLElement {\n return rootElement instanceof HTMLElement;\n}\n\n/**\n * Get the current root element or window scroll position.\n */\nfunction getCurrentScrollPosition(rootElement: ScrollToOptions['rootElement']): ScrollPosition {\n return {\n left: isHtmlElement(rootElement) ? rootElement.scrollTop : rootElement.scrollX,\n top: isHtmlElement(rootElement) ? rootElement.scrollLeft : rootElement.scrollY,\n };\n}\n\n/**\n * Get the maximum scroll position values.\n */\nfunction getMaxScrollPosition(rootElement?: ScrollToOptions['rootElement']): ScrollPosition {\n return {\n left: isHtmlElement(rootElement)\n ? rootElement.scrollWidth - rootElement.offsetWidth\n : document.documentElement.scrollWidth - window.innerWidth,\n top: isHtmlElement(rootElement)\n ? rootElement.scrollHeight - rootElement.offsetHeight\n : document.documentElement.scrollHeight - window.innerHeight,\n };\n}\n\n/**\n * Get the target scroll position.\n */\nfunction getTargetScrollPosition(\n initialScrollPosition: ScrollPosition,\n maxScrollPosition: ScrollPosition,\n target: ScrollTarget,\n axis: ScrollToOptions['axis'],\n offset: number,\n): ScrollPosition {\n let { top, left } = initialScrollPosition;\n\n if (target instanceof HTMLElement || isString(target)) {\n const targetElement = target instanceof HTMLElement ? target : document.querySelector(target);\n\n if (!targetElement) {\n return { top, left };\n }\n\n const sizes = targetElement.getBoundingClientRect();\n const styles = getComputedStyle(targetElement);\n const scrollMargin = {\n left: Number.parseInt(styles.scrollMarginLeft || '0', 10),\n top: Number.parseInt(styles.scrollMarginTop || '0', 10),\n };\n\n // Set the scroll position of the target element.\n left = sizes.left + initialScrollPosition.left - scrollMargin.left;\n top = sizes.top + initialScrollPosition.top - scrollMargin.top;\n } else if (isNumber(target)) {\n left = target;\n top = target;\n } else {\n left = target.left ?? left;\n top = target.top ?? top;\n }\n\n left -= offset;\n top -= offset;\n\n if (axis !== bothAxis) {\n if (axis !== xAxis && !isDefined((target as Partial<ScrollPosition>).left)) {\n left = initialScrollPosition.left;\n }\n\n if (axis !== yAxis) {\n top = initialScrollPosition.top;\n }\n }\n\n return {\n left: Math.min(left, maxScrollPosition.left),\n top: Math.min(top, maxScrollPosition.top),\n };\n}\n\n/**\n * Scroll to an element.\n *\n * @return {Promise<ScrollPosition>} A promising resolving with the scroll position.\n * @link https://js-toolkit.studiometa.dev/utils/scrollTo.html\n*/\nexport function scrollTo(\n target: string | HTMLElement | number | Partial<ScrollPosition>,\n { rootElement = window, axis = yAxis, offset = 0, ...tweenOptions }: ScrollToOptions = {},\n): Promise<ScrollPosition> {\n const initialScrollPosition = getCurrentScrollPosition(rootElement);\n const maxScrollPosition = getMaxScrollPosition(rootElement);\n const targetScrollPosition = getTargetScrollPosition(\n initialScrollPosition,\n maxScrollPosition,\n target,\n axis,\n offset,\n );\n\n return new Promise((resolve) => {\n function eventHandler() {\n /* eslint-disable @typescript-eslint/no-use-before-define */\n tw.pause();\n stop();\n /* eslint-enable @typescript-eslint/no-use-before-define */\n }\n\n function stop() {\n rootElement.removeEventListener('wheel', eventHandler);\n rootElement.removeEventListener('touchmove', eventHandler);\n\n // Resolve the promise on animation finish.\n resolve(getCurrentScrollPosition(rootElement));\n }\n\n // Setup tween.\n const tw = tween(\n (progress) => {\n rootElement.scrollTo({\n left: lerp(initialScrollPosition.left, targetScrollPosition.left, progress),\n top: lerp(initialScrollPosition.top, targetScrollPosition.top, progress),\n behavior: 'instant',\n });\n },\n {\n smooth: 0.2,\n ...tweenOptions,\n onFinish(progress) {\n if (isFunction(tweenOptions.onFinish)) {\n tweenOptions.onFinish(progress);\n }\n\n stop();\n },\n },\n );\n\n rootElement.addEventListener('wheel', eventHandler, { passive: true });\n rootElement.addEventListener('touchmove', eventHandler, { passive: true });\n tw.start();\n });\n}\n\nscrollTo.axis = {\n x: xAxis,\n y: yAxis,\n both: bothAxis,\n};\n"],
4
+ "sourcesContent": ["import { tween } from './tween.js';\nimport type { TweenOptions } from './tween.js';\nimport { isString, isNumber, isFunction, isDefined } from './is.js';\nimport { lerp } from './math/index.js';\n\nexport interface ScrollPosition {\n left: number;\n top: number;\n}\n\nexport type ScrollTarget = string | HTMLElement | number | Partial<ScrollPosition>;\n\nexport interface ScrollToOptions extends TweenOptions {\n /**\n * Root element that will be scrolled.\n */\n rootElement?: HTMLElement | typeof window;\n /**\n * Scroll direction.\n */\n axis?: (typeof scrollTo.axis)[keyof typeof scrollTo.axis];\n /**\n * Distance from the target.\n */\n offset?: number;\n}\n\nconst xAxis = Symbol(0);\nconst yAxis = Symbol(1);\nconst bothAxis = Symbol(2);\n\nfunction isHtmlElement(rootElement: ScrollToOptions['rootElement']): rootElement is HTMLElement {\n return rootElement instanceof HTMLElement;\n}\n\n/**\n * Get the current root element or window scroll position.\n */\nfunction getCurrentScrollPosition(rootElement: ScrollToOptions['rootElement']): ScrollPosition {\n return {\n left: isHtmlElement(rootElement) ? rootElement.scrollTop : rootElement.scrollX,\n top: isHtmlElement(rootElement) ? rootElement.scrollLeft : rootElement.scrollY,\n };\n}\n\n/**\n * Get the maximum scroll position values.\n */\nfunction getMaxScrollPosition(rootElement?: ScrollToOptions['rootElement']): ScrollPosition {\n return {\n left: isHtmlElement(rootElement)\n ? rootElement.scrollWidth - rootElement.offsetWidth\n : document.documentElement.scrollWidth - window.innerWidth,\n top: isHtmlElement(rootElement)\n ? rootElement.scrollHeight - rootElement.offsetHeight\n : document.documentElement.scrollHeight - window.innerHeight,\n };\n}\n\n/**\n * Get the target scroll position.\n */\nfunction getTargetScrollPosition(\n initialScrollPosition: ScrollPosition,\n maxScrollPosition: ScrollPosition,\n target: ScrollTarget,\n axis: ScrollToOptions['axis'],\n offset: number,\n): ScrollPosition {\n let { top, left } = initialScrollPosition;\n\n if (target instanceof HTMLElement || isString(target)) {\n const targetElement = target instanceof HTMLElement ? target : document.querySelector(target);\n\n if (!targetElement) {\n return { top, left };\n }\n\n const sizes = targetElement.getBoundingClientRect();\n const styles = getComputedStyle(targetElement);\n const scrollMargin = {\n left: Number.parseInt(styles.scrollMarginLeft || '0', 10),\n top: Number.parseInt(styles.scrollMarginTop || '0', 10),\n };\n\n // Set the scroll position of the target element.\n left = sizes.left + initialScrollPosition.left - scrollMargin.left;\n top = sizes.top + initialScrollPosition.top - scrollMargin.top;\n } else if (isNumber(target)) {\n left = target;\n top = target;\n } else {\n left = target.left ?? left;\n top = target.top ?? top;\n }\n\n left -= offset;\n top -= offset;\n\n if (axis !== bothAxis) {\n if (axis !== xAxis && !isDefined((target as Partial<ScrollPosition>).left)) {\n left = initialScrollPosition.left;\n }\n\n if (axis !== yAxis) {\n top = initialScrollPosition.top;\n }\n }\n\n return {\n left: Math.min(left, maxScrollPosition.left),\n top: Math.min(top, maxScrollPosition.top),\n };\n}\n\n/**\n * Scroll to an element.\n *\n * @return {Promise<ScrollPosition>} A promising resolving with the scroll position.\n * @link https://js-toolkit.studiometa.dev/utils/scrollTo.html\n */\nexport function scrollTo(\n target: string | HTMLElement | number | Partial<ScrollPosition>,\n { rootElement = window, axis = yAxis, offset = 0, ...tweenOptions }: ScrollToOptions = {},\n): Promise<ScrollPosition> {\n const initialScrollPosition = getCurrentScrollPosition(rootElement);\n const maxScrollPosition = getMaxScrollPosition(rootElement);\n const targetScrollPosition = getTargetScrollPosition(\n initialScrollPosition,\n maxScrollPosition,\n target,\n axis,\n offset,\n );\n\n return new Promise((resolve) => {\n function eventHandler() {\n /* eslint-disable @typescript-eslint/no-use-before-define */\n tw.pause();\n stop();\n /* eslint-enable @typescript-eslint/no-use-before-define */\n }\n\n function stop() {\n rootElement.removeEventListener('wheel', eventHandler);\n rootElement.removeEventListener('touchmove', eventHandler);\n\n // Resolve the promise on animation finish.\n resolve(getCurrentScrollPosition(rootElement));\n }\n\n // Setup tween.\n const tw = tween(\n (progress) => {\n rootElement.scrollTo({\n left: lerp(initialScrollPosition.left, targetScrollPosition.left, progress),\n top: lerp(initialScrollPosition.top, targetScrollPosition.top, progress),\n behavior: 'instant',\n });\n },\n {\n smooth: 0.2,\n ...tweenOptions,\n onFinish(progress) {\n if (isFunction(tweenOptions.onFinish)) {\n tweenOptions.onFinish(progress);\n }\n\n stop();\n },\n },\n );\n\n rootElement.addEventListener('wheel', eventHandler, { passive: true });\n rootElement.addEventListener('touchmove', eventHandler, { passive: true });\n tw.start();\n });\n}\n\nscrollTo.axis = {\n x: xAxis,\n y: yAxis,\n both: bothAxis,\n};\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,11 +2,7 @@ import { hasWindow } from "../has.js";
2
2
  import { localStorageProvider } from "./providers.js";
3
3
  import { jsonSerializer } from "./serializers.js";
4
4
  function createStorage(options = {}) {
5
- const {
6
- provider = localStorageProvider,
7
- serializer = jsonSerializer,
8
- prefix = ""
9
- } = options;
5
+ const { provider = localStorageProvider, serializer = jsonSerializer, prefix = "" } = options;
10
6
  const listeners = /* @__PURE__ */ new Map();
11
7
  function resolveKey(key) {
12
8
  return `${prefix}${key}`;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/storage/createStorage.ts"],
4
- "sourcesContent": ["import { hasWindow } from '../has.js';\nimport { localStorageProvider } from './providers.js';\nimport { jsonSerializer } from './serializers.js';\nimport type { StorageInstance, StorageOptions } from './types.js';\n\nexport function createStorage<T extends Record<string, any> = Record<string, any>>(\n options: StorageOptions = {},\n): StorageInstance<T> {\n const {\n provider = localStorageProvider,\n serializer = jsonSerializer,\n prefix = '',\n } = options;\n\n const listeners = new Map<keyof T, Set<(value: any) => void>>();\n\n function resolveKey(key: string): string {\n return `${prefix}${key}`;\n }\n\n function syncHandler(event: Event): void {\n if (event instanceof StorageEvent) {\n if (provider.storageArea && event.storageArea !== provider.storageArea) {\n return;\n }\n\n const rawKey = event.key;\n for (const [listenerKey, callbacks] of listeners) {\n if (resolveKey(listenerKey as string) === rawKey) {\n const newValue = event.newValue ? serializer.deserialize(event.newValue) : undefined;\n callbacks.forEach((callback) => callback(newValue));\n break;\n }\n }\n return;\n }\n\n listeners.forEach((callbacks, key) => {\n const value = provider.get(resolveKey(key as string));\n const newValue = value !== null ? serializer.deserialize(value) : undefined;\n callbacks.forEach((callback) => callback(newValue));\n });\n }\n\n if (hasWindow() && provider.syncEvent) {\n window.addEventListener(provider.syncEvent, syncHandler);\n }\n\n return {\n get(key, defaultValue?) {\n const storedValue = provider.get(resolveKey(key as string));\n if (storedValue !== null) {\n const deserialized = serializer.deserialize(storedValue);\n if (deserialized !== undefined) {\n return deserialized;\n }\n }\n return defaultValue;\n },\n set(key, value) {\n provider.set(resolveKey(key as string), serializer.serialize(value));\n listeners.get(key)?.forEach((callback) => callback(value));\n },\n delete(key) {\n provider.remove(resolveKey(key as string));\n listeners.get(key)?.forEach((callback) => callback(undefined));\n },\n has(key) {\n return provider.has(resolveKey(key as string));\n },\n keys() {\n const allKeys = provider.keys();\n if (!prefix) {\n return allKeys as (keyof T)[];\n }\n\n return allKeys\n .filter((key) => key.startsWith(prefix))\n .map((key) => key.slice(prefix.length) as keyof T);\n },\n clear() {\n if (prefix) {\n provider\n .keys()\n .filter((key) => key.startsWith(prefix))\n .forEach((key) => provider.remove(key));\n } else {\n provider.clear();\n }\n\n listeners.forEach((callbacks) => {\n callbacks.forEach((callback) => callback(undefined));\n });\n },\n subscribe(key, callback) {\n if (!listeners.has(key)) {\n listeners.set(key, new Set());\n }\n\n listeners.get(key)?.add(callback);\n\n return () => {\n listeners.get(key)?.delete(callback);\n if (listeners.get(key)?.size === 0) {\n listeners.delete(key);\n }\n };\n },\n destroy() {\n listeners.clear();\n if (hasWindow() && provider.syncEvent) {\n window.removeEventListener(provider.syncEvent, syncHandler);\n }\n },\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { hasWindow } from '../has.js';\nimport { localStorageProvider } from './providers.js';\nimport { jsonSerializer } from './serializers.js';\nimport type { StorageInstance, StorageOptions } from './types.js';\n\nexport function createStorage<T extends Record<string, any> = Record<string, any>>(\n options: StorageOptions = {},\n): StorageInstance<T> {\n const { provider = localStorageProvider, serializer = jsonSerializer, prefix = '' } = options;\n\n const listeners = new Map<keyof T, Set<(value: any) => void>>();\n\n function resolveKey(key: string): string {\n return `${prefix}${key}`;\n }\n\n function syncHandler(event: Event): void {\n if (event instanceof StorageEvent) {\n if (provider.storageArea && event.storageArea !== provider.storageArea) {\n return;\n }\n\n const rawKey = event.key;\n for (const [listenerKey, callbacks] of listeners) {\n if (resolveKey(listenerKey as string) === rawKey) {\n const newValue = event.newValue ? serializer.deserialize(event.newValue) : undefined;\n callbacks.forEach((callback) => callback(newValue));\n break;\n }\n }\n return;\n }\n\n listeners.forEach((callbacks, key) => {\n const value = provider.get(resolveKey(key as string));\n const newValue = value !== null ? serializer.deserialize(value) : undefined;\n callbacks.forEach((callback) => callback(newValue));\n });\n }\n\n if (hasWindow() && provider.syncEvent) {\n window.addEventListener(provider.syncEvent, syncHandler);\n }\n\n return {\n get(key, defaultValue?) {\n const storedValue = provider.get(resolveKey(key as string));\n if (storedValue !== null) {\n const deserialized = serializer.deserialize(storedValue);\n if (deserialized !== undefined) {\n return deserialized;\n }\n }\n return defaultValue;\n },\n set(key, value) {\n provider.set(resolveKey(key as string), serializer.serialize(value));\n listeners.get(key)?.forEach((callback) => callback(value));\n },\n delete(key) {\n provider.remove(resolveKey(key as string));\n listeners.get(key)?.forEach((callback) => callback(undefined));\n },\n has(key) {\n return provider.has(resolveKey(key as string));\n },\n keys() {\n const allKeys = provider.keys();\n if (!prefix) {\n return allKeys as (keyof T)[];\n }\n\n return allKeys\n .filter((key) => key.startsWith(prefix))\n .map((key) => key.slice(prefix.length) as keyof T);\n },\n clear() {\n if (prefix) {\n provider\n .keys()\n .filter((key) => key.startsWith(prefix))\n .forEach((key) => provider.remove(key));\n } else {\n provider.clear();\n }\n\n listeners.forEach((callbacks) => {\n callbacks.forEach((callback) => callback(undefined));\n });\n },\n subscribe(key, callback) {\n if (!listeners.has(key)) {\n listeners.set(key, new Set());\n }\n\n listeners.get(key)?.add(callback);\n\n return () => {\n listeners.get(key)?.delete(callback);\n if (listeners.get(key)?.size === 0) {\n listeners.delete(key);\n }\n };\n },\n destroy() {\n listeners.clear();\n if (hasWindow() && provider.syncEvent) {\n window.removeEventListener(provider.syncEvent, syncHandler);\n }\n },\n };\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,sBAAsB;AAGxB,SAAS,cACd,UAA0B,CAAC,GACP;AACpB,QAAM,EAAE,WAAW,sBAAsB,aAAa,gBAAgB,SAAS,GAAG,IAAI;AAEtF,QAAM,YAAY,oBAAI,IAAwC;AAE9D,WAAS,WAAW,KAAqB;AACvC,WAAO,GAAG,MAAM,GAAG,GAAG;AAAA,EACxB;AAEA,WAAS,YAAY,OAAoB;AACvC,QAAI,iBAAiB,cAAc;AACjC,UAAI,SAAS,eAAe,MAAM,gBAAgB,SAAS,aAAa;AACtE;AAAA,MACF;AAEA,YAAM,SAAS,MAAM;AACrB,iBAAW,CAAC,aAAa,SAAS,KAAK,WAAW;AAChD,YAAI,WAAW,WAAqB,MAAM,QAAQ;AAChD,gBAAM,WAAW,MAAM,WAAW,WAAW,YAAY,MAAM,QAAQ,IAAI;AAC3E,oBAAU,QAAQ,CAAC,aAAa,SAAS,QAAQ,CAAC;AAClD;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,cAAU,QAAQ,CAAC,WAAW,QAAQ;AACpC,YAAM,QAAQ,SAAS,IAAI,WAAW,GAAa,CAAC;AACpD,YAAM,WAAW,UAAU,OAAO,WAAW,YAAY,KAAK,IAAI;AAClE,gBAAU,QAAQ,CAAC,aAAa,SAAS,QAAQ,CAAC;AAAA,IACpD,CAAC;AAAA,EACH;AAEA,MAAI,UAAU,KAAK,SAAS,WAAW;AACrC,WAAO,iBAAiB,SAAS,WAAW,WAAW;AAAA,EACzD;AAEA,SAAO;AAAA,IACL,IAAI,KAAK,cAAe;AACtB,YAAM,cAAc,SAAS,IAAI,WAAW,GAAa,CAAC;AAC1D,UAAI,gBAAgB,MAAM;AACxB,cAAM,eAAe,WAAW,YAAY,WAAW;AACvD,YAAI,iBAAiB,QAAW;AAC9B,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA,IAAI,KAAK,OAAO;AACd,eAAS,IAAI,WAAW,GAAa,GAAG,WAAW,UAAU,KAAK,CAAC;AACnE,gBAAU,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,SAAS,KAAK,CAAC;AAAA,IAC3D;AAAA,IACA,OAAO,KAAK;AACV,eAAS,OAAO,WAAW,GAAa,CAAC;AACzC,gBAAU,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,SAAS,MAAS,CAAC;AAAA,IAC/D;AAAA,IACA,IAAI,KAAK;AACP,aAAO,SAAS,IAAI,WAAW,GAAa,CAAC;AAAA,IAC/C;AAAA,IACA,OAAO;AACL,YAAM,UAAU,SAAS,KAAK;AAC9B,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,MACT;AAEA,aAAO,QACJ,OAAO,CAAC,QAAQ,IAAI,WAAW,MAAM,CAAC,EACtC,IAAI,CAAC,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAY;AAAA,IACrD;AAAA,IACA,QAAQ;AACN,UAAI,QAAQ;AACV,iBACG,KAAK,EACL,OAAO,CAAC,QAAQ,IAAI,WAAW,MAAM,CAAC,EACtC,QAAQ,CAAC,QAAQ,SAAS,OAAO,GAAG,CAAC;AAAA,MAC1C,OAAO;AACL,iBAAS,MAAM;AAAA,MACjB;AAEA,gBAAU,QAAQ,CAAC,cAAc;AAC/B,kBAAU,QAAQ,CAAC,aAAa,SAAS,MAAS,CAAC;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,IACA,UAAU,KAAK,UAAU;AACvB,UAAI,CAAC,UAAU,IAAI,GAAG,GAAG;AACvB,kBAAU,IAAI,KAAK,oBAAI,IAAI,CAAC;AAAA,MAC9B;AAEA,gBAAU,IAAI,GAAG,GAAG,IAAI,QAAQ;AAEhC,aAAO,MAAM;AACX,kBAAU,IAAI,GAAG,GAAG,OAAO,QAAQ;AACnC,YAAI,UAAU,IAAI,GAAG,GAAG,SAAS,GAAG;AAClC,oBAAU,OAAO,GAAG;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU;AACR,gBAAU,MAAM;AAChB,UAAI,UAAU,KAAK,SAAS,WAAW;AACrC,eAAO,oBAAoB,SAAS,WAAW,WAAW;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/storage/createUrlSearchParamsProvider.ts"],
4
- "sourcesContent": ["import { createNoopProvider } from './createNoopProvider.js';\nimport { getBrowserContext } from './getBrowserContext.js';\nimport type { StorageProvider, UrlProviderOptions } from './types.js';\n\nexport function createUrlSearchParamsProvider(\n options: UrlProviderOptions = {},\n): StorageProvider {\n const browserContext = getBrowserContext();\n\n if (!browserContext) {\n return createNoopProvider();\n }\n\n const { push = false } = options;\n const method = push ? 'pushState' : 'replaceState';\n const { location, history } = browserContext;\n\n return {\n syncEvent: 'popstate',\n get(key) {\n return new URLSearchParams(location.search).get(key);\n },\n set(key, value) {\n const params = new URLSearchParams(location.search);\n params.set(key, value);\n history[method]({}, '', `${location.pathname}?${params.toString()}${location.hash}`);\n },\n remove(key) {\n const params = new URLSearchParams(location.search);\n params.delete(key);\n const search = params.toString();\n history[method]({}, '', `${location.pathname}${search ? `?${search}` : ''}${location.hash}`);\n },\n has(key) {\n return new URLSearchParams(location.search).has(key);\n },\n keys() {\n return [...new URLSearchParams(location.search).keys()];\n },\n clear() {\n history[method]({}, '', `${location.pathname}${location.hash}`);\n },\n };\n}\n"],
5
- "mappings": "AAAA,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAG3B,SAAS,8BACd,UAA8B,CAAC,GACd;AACjB,QAAM,iBAAiB,kBAAkB;AAEzC,MAAI,CAAC,gBAAgB;AACnB,WAAO,mBAAmB;AAAA,EAC5B;AAEA,QAAM,EAAE,OAAO,MAAM,IAAI;AACzB,QAAM,SAAS,OAAO,cAAc;AACpC,QAAM,EAAE,UAAU,QAAQ,IAAI;AAE9B,SAAO;AAAA,IACL,WAAW;AAAA,IACX,IAAI,KAAK;AACP,aAAO,IAAI,gBAAgB,SAAS,MAAM,EAAE,IAAI,GAAG;AAAA,IACrD;AAAA,IACA,IAAI,KAAK,OAAO;AACd,YAAM,SAAS,IAAI,gBAAgB,SAAS,MAAM;AAClD,aAAO,IAAI,KAAK,KAAK;AACrB,cAAQ,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,QAAQ,IAAI,OAAO,SAAS,CAAC,GAAG,SAAS,IAAI,EAAE;AAAA,IACrF;AAAA,IACA,OAAO,KAAK;AACV,YAAM,SAAS,IAAI,gBAAgB,SAAS,MAAM;AAClD,aAAO,OAAO,GAAG;AACjB,YAAM,SAAS,OAAO,SAAS;AAC/B,cAAQ,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,QAAQ,GAAG,SAAS,IAAI,MAAM,KAAK,EAAE,GAAG,SAAS,IAAI,EAAE;AAAA,IAC7F;AAAA,IACA,IAAI,KAAK;AACP,aAAO,IAAI,gBAAgB,SAAS,MAAM,EAAE,IAAI,GAAG;AAAA,IACrD;AAAA,IACA,OAAO;AACL,aAAO,CAAC,GAAG,IAAI,gBAAgB,SAAS,MAAM,EAAE,KAAK,CAAC;AAAA,IACxD;AAAA,IACA,QAAQ;AACN,cAAQ,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,QAAQ,GAAG,SAAS,IAAI,EAAE;AAAA,IAChE;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { createNoopProvider } from './createNoopProvider.js';\nimport { getBrowserContext } from './getBrowserContext.js';\nimport type { StorageProvider, UrlProviderOptions } from './types.js';\n\nexport function createUrlSearchParamsProvider(options: UrlProviderOptions = {}): StorageProvider {\n const browserContext = getBrowserContext();\n\n if (!browserContext) {\n return createNoopProvider();\n }\n\n const { push = false } = options;\n const method = push ? 'pushState' : 'replaceState';\n const { location, history } = browserContext;\n\n return {\n syncEvent: 'popstate',\n get(key) {\n return new URLSearchParams(location.search).get(key);\n },\n set(key, value) {\n const params = new URLSearchParams(location.search);\n params.set(key, value);\n history[method]({}, '', `${location.pathname}?${params.toString()}${location.hash}`);\n },\n remove(key) {\n const params = new URLSearchParams(location.search);\n params.delete(key);\n const search = params.toString();\n history[method]({}, '', `${location.pathname}${search ? `?${search}` : ''}${location.hash}`);\n },\n has(key) {\n return new URLSearchParams(location.search).has(key);\n },\n keys() {\n return [...new URLSearchParams(location.search).keys()];\n },\n clear() {\n history[method]({}, '', `${location.pathname}${location.hash}`);\n },\n };\n}\n"],
5
+ "mappings": "AAAA,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAG3B,SAAS,8BAA8B,UAA8B,CAAC,GAAoB;AAC/F,QAAM,iBAAiB,kBAAkB;AAEzC,MAAI,CAAC,gBAAgB;AACnB,WAAO,mBAAmB;AAAA,EAC5B;AAEA,QAAM,EAAE,OAAO,MAAM,IAAI;AACzB,QAAM,SAAS,OAAO,cAAc;AACpC,QAAM,EAAE,UAAU,QAAQ,IAAI;AAE9B,SAAO;AAAA,IACL,WAAW;AAAA,IACX,IAAI,KAAK;AACP,aAAO,IAAI,gBAAgB,SAAS,MAAM,EAAE,IAAI,GAAG;AAAA,IACrD;AAAA,IACA,IAAI,KAAK,OAAO;AACd,YAAM,SAAS,IAAI,gBAAgB,SAAS,MAAM;AAClD,aAAO,IAAI,KAAK,KAAK;AACrB,cAAQ,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,QAAQ,IAAI,OAAO,SAAS,CAAC,GAAG,SAAS,IAAI,EAAE;AAAA,IACrF;AAAA,IACA,OAAO,KAAK;AACV,YAAM,SAAS,IAAI,gBAAgB,SAAS,MAAM;AAClD,aAAO,OAAO,GAAG;AACjB,YAAM,SAAS,OAAO,SAAS;AAC/B,cAAQ,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,QAAQ,GAAG,SAAS,IAAI,MAAM,KAAK,EAAE,GAAG,SAAS,IAAI,EAAE;AAAA,IAC7F;AAAA,IACA,IAAI,KAAK;AACP,aAAO,IAAI,gBAAgB,SAAS,MAAM,EAAE,IAAI,GAAG;AAAA,IACrD;AAAA,IACA,OAAO;AACL,aAAO,CAAC,GAAG,IAAI,gBAAgB,SAAS,MAAM,EAAE,KAAK,CAAC;AAAA,IACxD;AAAA,IACA,QAAQ;AACN,cAAQ,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,QAAQ,GAAG,SAAS,IAAI,EAAE;AAAA,IAChE;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/storage/getGlobalStorage.ts"],
4
- "sourcesContent": ["export function getGlobalStorage(name: 'localStorage' | 'sessionStorage'): Storage | undefined {\n return typeof globalThis !== 'undefined' && name in globalThis\n ? globalThis[name]\n : undefined;\n}\n"],
5
- "mappings": "AAAO,SAAS,iBAAiB,MAA8D;AAC7F,SAAO,OAAO,eAAe,eAAe,QAAQ,aAChD,WAAW,IAAI,IACf;AACN;",
4
+ "sourcesContent": ["export function getGlobalStorage(name: 'localStorage' | 'sessionStorage'): Storage | undefined {\n return typeof globalThis !== 'undefined' && name in globalThis ? globalThis[name] : undefined;\n}\n"],
5
+ "mappings": "AAAO,SAAS,iBAAiB,MAA8D;AAC7F,SAAO,OAAO,eAAe,eAAe,QAAQ,aAAa,WAAW,IAAI,IAAI;AACtF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/storage/index.ts"],
4
- "sourcesContent": ["export type {\n StorageInstance,\n StorageOptions,\n StorageProvider,\n StorageSerializer,\n UrlProviderOptions,\n} from './types.js';\n\nexport {\n createLocalStorageProvider,\n createMemoryStorageProvider,\n createNoopProvider,\n createSessionStorageProvider,\n createUrlSearchParamsInHashProvider,\n createUrlSearchParamsProvider,\n localStorageProvider,\n memoryStorageProvider,\n sessionStorageProvider,\n urlSearchParamsInHashProvider,\n urlSearchParamsProvider,\n} from './providers.js';\nexport { createStorage } from './createStorage.js';\n\nimport type { StorageInstance, StorageOptions, UrlProviderOptions } from './types.js';\nimport { createStorage } from './createStorage.js';\nimport {\n createUrlSearchParamsInHashProvider,\n createUrlSearchParamsProvider,\n localStorageProvider,\n sessionStorageProvider,\n urlSearchParamsInHashProvider,\n urlSearchParamsProvider,\n} from './providers.js';\n\nexport function createLocalStorage<T extends Record<string, any> = Record<string, any>>(\n options?: Omit<StorageOptions, 'provider'>,\n): StorageInstance<T> {\n return createStorage({ ...options, provider: localStorageProvider });\n}\n\nexport function createSessionStorage<T extends Record<string, any> = Record<string, any>>(\n options?: Omit<StorageOptions, 'provider'>,\n): StorageInstance<T> {\n return createStorage({ ...options, provider: sessionStorageProvider });\n}\n\nexport function createUrlSearchParamsStorage<T extends Record<string, any> = Record<string, any>>(\n options?: Omit<StorageOptions, 'provider'> & UrlProviderOptions,\n): StorageInstance<T> {\n const { push, ...storageOptions } = options ?? {};\n return createStorage({\n ...storageOptions,\n provider: push ? createUrlSearchParamsProvider({ push }) : urlSearchParamsProvider,\n });\n}\n\nexport function createUrlSearchParamsInHashStorage<\n T extends Record<string, any> = Record<string, any>,\n>(\n options?: Omit<StorageOptions, 'provider'> & UrlProviderOptions,\n): StorageInstance<T> {\n const { push, ...storageOptions } = options ?? {};\n return createStorage({\n ...storageOptions,\n provider: push\n ? createUrlSearchParamsInHashProvider({ push })\n : urlSearchParamsInHashProvider,\n });\n}\n"],
5
- "mappings": "AAQA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AAG9B,SAAS,iBAAAA,sBAAqB;AAC9B;AAAA,EACE,uCAAAC;AAAA,EACA,iCAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,iCAAAC;AAAA,EACA,2BAAAC;AAAA,OACK;AAEA,SAAS,mBACd,SACoB;AACpB,SAAON,eAAc,EAAE,GAAG,SAAS,UAAUG,sBAAqB,CAAC;AACrE;AAEO,SAAS,qBACd,SACoB;AACpB,SAAOH,eAAc,EAAE,GAAG,SAAS,UAAUI,wBAAuB,CAAC;AACvE;AAEO,SAAS,6BACd,SACoB;AACpB,QAAM,EAAE,MAAM,GAAG,eAAe,IAAI,WAAW,CAAC;AAChD,SAAOJ,eAAc;AAAA,IACnB,GAAG;AAAA,IACH,UAAU,OAAOE,+BAA8B,EAAE,KAAK,CAAC,IAAII;AAAA,EAC7D,CAAC;AACH;AAEO,SAAS,mCAGd,SACoB;AACpB,QAAM,EAAE,MAAM,GAAG,eAAe,IAAI,WAAW,CAAC;AAChD,SAAON,eAAc;AAAA,IACnB,GAAG;AAAA,IACH,UAAU,OACNC,qCAAoC,EAAE,KAAK,CAAC,IAC5CI;AAAA,EACN,CAAC;AACH;",
4
+ "sourcesContent": ["export type {\n StorageInstance,\n StorageOptions,\n StorageProvider,\n StorageSerializer,\n UrlProviderOptions,\n} from './types.js';\n\nexport {\n createLocalStorageProvider,\n createMemoryStorageProvider,\n createNoopProvider,\n createSessionStorageProvider,\n createUrlSearchParamsInHashProvider,\n createUrlSearchParamsProvider,\n localStorageProvider,\n memoryStorageProvider,\n sessionStorageProvider,\n urlSearchParamsInHashProvider,\n urlSearchParamsProvider,\n} from './providers.js';\nexport { createStorage } from './createStorage.js';\n\nimport type { StorageInstance, StorageOptions, UrlProviderOptions } from './types.js';\nimport { createStorage } from './createStorage.js';\nimport {\n createUrlSearchParamsInHashProvider,\n createUrlSearchParamsProvider,\n localStorageProvider,\n sessionStorageProvider,\n urlSearchParamsInHashProvider,\n urlSearchParamsProvider,\n} from './providers.js';\n\nexport function createLocalStorage<T extends Record<string, any> = Record<string, any>>(\n options?: Omit<StorageOptions, 'provider'>,\n): StorageInstance<T> {\n return createStorage({ ...options, provider: localStorageProvider });\n}\n\nexport function createSessionStorage<T extends Record<string, any> = Record<string, any>>(\n options?: Omit<StorageOptions, 'provider'>,\n): StorageInstance<T> {\n return createStorage({ ...options, provider: sessionStorageProvider });\n}\n\nexport function createUrlSearchParamsStorage<T extends Record<string, any> = Record<string, any>>(\n options?: Omit<StorageOptions, 'provider'> & UrlProviderOptions,\n): StorageInstance<T> {\n const { push, ...storageOptions } = options ?? {};\n return createStorage({\n ...storageOptions,\n provider: push ? createUrlSearchParamsProvider({ push }) : urlSearchParamsProvider,\n });\n}\n\nexport function createUrlSearchParamsInHashStorage<\n T extends Record<string, any> = Record<string, any>,\n>(options?: Omit<StorageOptions, 'provider'> & UrlProviderOptions): StorageInstance<T> {\n const { push, ...storageOptions } = options ?? {};\n return createStorage({\n ...storageOptions,\n provider: push ? createUrlSearchParamsInHashProvider({ push }) : urlSearchParamsInHashProvider,\n });\n}\n"],
5
+ "mappings": "AAQA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AAG9B,SAAS,iBAAAA,sBAAqB;AAC9B;AAAA,EACE,uCAAAC;AAAA,EACA,iCAAAC;AAAA,EACA,wBAAAC;AAAA,EACA,0BAAAC;AAAA,EACA,iCAAAC;AAAA,EACA,2BAAAC;AAAA,OACK;AAEA,SAAS,mBACd,SACoB;AACpB,SAAON,eAAc,EAAE,GAAG,SAAS,UAAUG,sBAAqB,CAAC;AACrE;AAEO,SAAS,qBACd,SACoB;AACpB,SAAOH,eAAc,EAAE,GAAG,SAAS,UAAUI,wBAAuB,CAAC;AACvE;AAEO,SAAS,6BACd,SACoB;AACpB,QAAM,EAAE,MAAM,GAAG,eAAe,IAAI,WAAW,CAAC;AAChD,SAAOJ,eAAc;AAAA,IACnB,GAAG;AAAA,IACH,UAAU,OAAOE,+BAA8B,EAAE,KAAK,CAAC,IAAII;AAAA,EAC7D,CAAC;AACH;AAEO,SAAS,mCAEd,SAAqF;AACrF,QAAM,EAAE,MAAM,GAAG,eAAe,IAAI,WAAW,CAAC;AAChD,SAAON,eAAc;AAAA,IACnB,GAAG;AAAA,IACH,UAAU,OAAOC,qCAAoC,EAAE,KAAK,CAAC,IAAII;AAAA,EACnE,CAAC;AACH;",
6
6
  "names": ["createStorage", "createUrlSearchParamsInHashProvider", "createUrlSearchParamsProvider", "localStorageProvider", "sessionStorageProvider", "urlSearchParamsInHashProvider", "urlSearchParamsProvider"]
7
7
  }
@@ -1,30 +1,30 @@
1
1
  /**
2
2
  * Convert a string to lowercase.
3
3
  * @link https://js-toolkit.studiometa.dev/utils/string/lowerCase.html
4
- */
4
+ */
5
5
  export declare function lowerCase(string: string): string;
6
6
  /**
7
7
  * Convert a string to UPPERCASE.
8
8
  * @link https://js-toolkit.studiometa.dev/utils/string/upperCase.html
9
- */
9
+ */
10
10
  export declare function upperCase(string: string): string;
11
11
  /**
12
12
  * Convert a string to camelCase.
13
13
  * @link https://js-toolkit.studiometa.dev/utils/string/camelCase.html
14
- */
14
+ */
15
15
  export declare const camelCase: (string: string) => string;
16
16
  /**
17
17
  * Convert a string to PascalCase.
18
18
  * @link https://js-toolkit.studiometa.dev/utils/string/pascalCase.html
19
- */
19
+ */
20
20
  export declare const pascalCase: (string: string) => string;
21
21
  /**
22
22
  * Convert a string to snake_case.
23
23
  * @link https://js-toolkit.studiometa.dev/utils/string/snakeCase.html
24
- */
24
+ */
25
25
  export declare const snakeCase: (string: string) => string;
26
26
  /**
27
27
  * Convert a string to dash-case.
28
28
  * @link https://js-toolkit.studiometa.dev/utils/string/dashCase.html
29
- */
29
+ */
30
30
  export declare const dashCase: (string: string) => string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/changeCase.ts"],
4
- "sourcesContent": ["import { memo } from '../memo.js';\n\nconst SPLIT_LOWER_UPPER_RE = /([\\p{Ll}\\d])(\\p{Lu})/gu;\nconst SPLIT_UPPER_UPPER_RE = /(\\p{Lu})([\\p{Lu}][\\p{Ll}])/gu;\nconst DEFAULT_STRIP_REGEXP = /[^\\p{L}\\d]+/giu;\nconst SPLIT_REPLACE_VALUE = '$1\\0$2';\n\n/**\n * Split function from the `change-case` package.\n * @link https://github.com/blakeembrey/change-case\n */\nfunction split(value: string) {\n let result = value.trim();\n\n result = result\n .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);\n\n result = result.replace(DEFAULT_STRIP_REGEXP, '\\0');\n\n let start = 0;\n let end = result.length;\n\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === '\\0') start++;\n if (start === end) return [];\n while (result.charAt(end - 1) === '\\0') end--;\n\n return result.slice(start, end).split('\\0');\n}\n\n/**\n * Convert a string to lowercase and join each word with the given delimiter.\n */\nfunction delimitedCase(string: string, delimiter: string): string {\n return split(string)\n .map((word) => lowerCase(word))\n .join(delimiter);\n}\n/**\n * Convert a string to lowercase.\n * @link https://js-toolkit.studiometa.dev/utils/string/lowerCase.html\n*/\nexport function lowerCase(string: string): string {\n return string.toLowerCase();\n}\n\n/**\n * Convert a string to UPPERCASE.\n * @link https://js-toolkit.studiometa.dev/utils/string/upperCase.html\n*/\nexport function upperCase(string: string): string {\n return string.toUpperCase();\n}\n\n/**\n * Convert a string to camelCase.\n * @link https://js-toolkit.studiometa.dev/utils/string/camelCase.html\n*/\nexport const camelCase = memo(function camelCase(string: string): string {\n const result = pascalCase(string);\n return lowerCase(result[0]) + result.slice(1);\n});\n\n/**\n * Convert a string to PascalCase.\n * @link https://js-toolkit.studiometa.dev/utils/string/pascalCase.html\n*/\nexport const pascalCase = memo(function pascalCase(string: string): string {\n return split(string)\n .map((word) => upperCase(word[0]) + lowerCase(word.slice(1)))\n .join('');\n});\n\n/**\n * Convert a string to snake_case.\n * @link https://js-toolkit.studiometa.dev/utils/string/snakeCase.html\n*/\nexport const snakeCase = memo(function snakeCase(string: string): string {\n return delimitedCase(string, '_');\n});\n\n/**\n * Convert a string to dash-case.\n * @link https://js-toolkit.studiometa.dev/utils/string/dashCase.html\n*/\nexport const dashCase = memo(function dashCase(string: string): string {\n return delimitedCase(string, '-');\n});\n"],
4
+ "sourcesContent": ["import { memo } from '../memo.js';\n\nconst SPLIT_LOWER_UPPER_RE = /([\\p{Ll}\\d])(\\p{Lu})/gu;\nconst SPLIT_UPPER_UPPER_RE = /(\\p{Lu})([\\p{Lu}][\\p{Ll}])/gu;\nconst DEFAULT_STRIP_REGEXP = /[^\\p{L}\\d]+/giu;\nconst SPLIT_REPLACE_VALUE = '$1\\0$2';\n\n/**\n * Split function from the `change-case` package.\n * @link https://github.com/blakeembrey/change-case\n */\nfunction split(value: string) {\n let result = value.trim();\n\n result = result\n .replace(SPLIT_LOWER_UPPER_RE, SPLIT_REPLACE_VALUE)\n .replace(SPLIT_UPPER_UPPER_RE, SPLIT_REPLACE_VALUE);\n\n result = result.replace(DEFAULT_STRIP_REGEXP, '\\0');\n\n let start = 0;\n let end = result.length;\n\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === '\\0') start++;\n if (start === end) return [];\n while (result.charAt(end - 1) === '\\0') end--;\n\n return result.slice(start, end).split('\\0');\n}\n\n/**\n * Convert a string to lowercase and join each word with the given delimiter.\n */\nfunction delimitedCase(string: string, delimiter: string): string {\n return split(string)\n .map((word) => lowerCase(word))\n .join(delimiter);\n}\n/**\n * Convert a string to lowercase.\n * @link https://js-toolkit.studiometa.dev/utils/string/lowerCase.html\n */\nexport function lowerCase(string: string): string {\n return string.toLowerCase();\n}\n\n/**\n * Convert a string to UPPERCASE.\n * @link https://js-toolkit.studiometa.dev/utils/string/upperCase.html\n */\nexport function upperCase(string: string): string {\n return string.toUpperCase();\n}\n\n/**\n * Convert a string to camelCase.\n * @link https://js-toolkit.studiometa.dev/utils/string/camelCase.html\n */\nexport const camelCase = memo(function camelCase(string: string): string {\n const result = pascalCase(string);\n return lowerCase(result[0]) + result.slice(1);\n});\n\n/**\n * Convert a string to PascalCase.\n * @link https://js-toolkit.studiometa.dev/utils/string/pascalCase.html\n */\nexport const pascalCase = memo(function pascalCase(string: string): string {\n return split(string)\n .map((word) => upperCase(word[0]) + lowerCase(word.slice(1)))\n .join('');\n});\n\n/**\n * Convert a string to snake_case.\n * @link https://js-toolkit.studiometa.dev/utils/string/snakeCase.html\n */\nexport const snakeCase = memo(function snakeCase(string: string): string {\n return delimitedCase(string, '_');\n});\n\n/**\n * Convert a string to dash-case.\n * @link https://js-toolkit.studiometa.dev/utils/string/dashCase.html\n */\nexport const dashCase = memo(function dashCase(string: string): string {\n return delimitedCase(string, '-');\n});\n"],
5
5
  "mappings": "AAAA,SAAS,YAAY;AAErB,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB;AAC7B,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAM5B,SAAS,MAAM,OAAe;AAC5B,MAAI,SAAS,MAAM,KAAK;AAExB,WAAS,OACN,QAAQ,sBAAsB,mBAAmB,EACjD,QAAQ,sBAAsB,mBAAmB;AAEpD,WAAS,OAAO,QAAQ,sBAAsB,IAAI;AAElD,MAAI,QAAQ;AACZ,MAAI,MAAM,OAAO;AAGjB,SAAO,OAAO,OAAO,KAAK,MAAM,KAAM;AACtC,MAAI,UAAU,IAAK,QAAO,CAAC;AAC3B,SAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAExC,SAAO,OAAO,MAAM,OAAO,GAAG,EAAE,MAAM,IAAI;AAC5C;AAKA,SAAS,cAAc,QAAgB,WAA2B;AAChE,SAAO,MAAM,MAAM,EAChB,IAAI,CAAC,SAAS,UAAU,IAAI,CAAC,EAC7B,KAAK,SAAS;AACnB;AAKO,SAAS,UAAU,QAAwB;AAChD,SAAO,OAAO,YAAY;AAC5B;AAMO,SAAS,UAAU,QAAwB;AAChD,SAAO,OAAO,YAAY;AAC5B;AAMO,MAAM,YAAY,KAAK,SAASA,WAAU,QAAwB;AACvE,QAAM,SAAS,WAAW,MAAM;AAChC,SAAO,UAAU,OAAO,CAAC,CAAC,IAAI,OAAO,MAAM,CAAC;AAC9C,CAAC;AAMM,MAAM,aAAa,KAAK,SAASC,YAAW,QAAwB;AACzE,SAAO,MAAM,MAAM,EAChB,IAAI,CAAC,SAAS,UAAU,KAAK,CAAC,CAAC,IAAI,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,EAC3D,KAAK,EAAE;AACZ,CAAC;AAMM,MAAM,YAAY,KAAK,SAASC,WAAU,QAAwB;AACvE,SAAO,cAAc,QAAQ,GAAG;AAClC,CAAC;AAMM,MAAM,WAAW,KAAK,SAASC,UAAS,QAAwB;AACrE,SAAO,cAAc,QAAQ,GAAG;AAClC,CAAC;",
6
6
  "names": ["camelCase", "pascalCase", "snakeCase", "dashCase"]
7
7
  }
@@ -5,5 +5,5 @@
5
5
  * @param {string} characters The characters to add to the start.
6
6
  * @return {string}
7
7
  * @link https://js-toolkit.studiometa.dev/utils/string/withLeadingCharacters.html
8
- */
8
+ */
9
9
  export declare function withLeadingCharacters(string: string, characters: string): string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/withLeadingCharacters.ts"],
4
- "sourcesContent": ["import { withoutLeadingCharacters } from './withoutLeadingCharacters.js';\n\n/**\n * Add the given characters to the start of the given string.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to add to the start.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withLeadingCharacters.html\n*/\nexport function withLeadingCharacters(string: string, characters: string): string {\n return `${characters}${withoutLeadingCharacters(string, characters)}`;\n}\n"],
4
+ "sourcesContent": ["import { withoutLeadingCharacters } from './withoutLeadingCharacters.js';\n\n/**\n * Add the given characters to the start of the given string.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to add to the start.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withLeadingCharacters.html\n */\nexport function withLeadingCharacters(string: string, characters: string): string {\n return `${characters}${withoutLeadingCharacters(string, characters)}`;\n}\n"],
5
5
  "mappings": "AAAA,SAAS,gCAAgC;AAUlC,SAAS,sBAAsB,QAAgB,YAA4B;AAChF,SAAO,GAAG,UAAU,GAAG,yBAAyB,QAAQ,UAAU,CAAC;AACrE;",
6
6
  "names": []
7
7
  }
@@ -4,5 +4,5 @@
4
4
  * @param {string} string The string to modify.
5
5
  * @return {string} The string with a leading slash.
6
6
  * @link https://js-toolkit.studiometa.dev/utils/string/withLeadingSlash.html
7
- */
7
+ */
8
8
  export declare function withLeadingSlash(string: string): string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/withLeadingSlash.ts"],
4
- "sourcesContent": ["import { withLeadingCharacters } from './withLeadingCharacters.js';\n\n/**\n * Add a leading slash to a string.\n *\n * @param {string} string The string to modify.\n * @return {string} The string with a leading slash.\n * @link https://js-toolkit.studiometa.dev/utils/string/withLeadingSlash.html\n*/\nexport function withLeadingSlash(string: string): string {\n return withLeadingCharacters(string, '/');\n}\n"],
4
+ "sourcesContent": ["import { withLeadingCharacters } from './withLeadingCharacters.js';\n\n/**\n * Add a leading slash to a string.\n *\n * @param {string} string The string to modify.\n * @return {string} The string with a leading slash.\n * @link https://js-toolkit.studiometa.dev/utils/string/withLeadingSlash.html\n */\nexport function withLeadingSlash(string: string): string {\n return withLeadingCharacters(string, '/');\n}\n"],
5
5
  "mappings": "AAAA,SAAS,6BAA6B;AAS/B,SAAS,iBAAiB,QAAwB;AACvD,SAAO,sBAAsB,QAAQ,GAAG;AAC1C;",
6
6
  "names": []
7
7
  }
@@ -5,5 +5,5 @@
5
5
  * @param {string} characters The characters to add to the end.
6
6
  * @return {string}
7
7
  * @link https://js-toolkit.studiometa.dev/utils/string/withTrailingCharacters.html
8
- */
8
+ */
9
9
  export declare function withTrailingCharacters(string: string, characters: string): string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/withTrailingCharacters.ts"],
4
- "sourcesContent": ["import { withoutTrailingCharacters } from './withoutTrailingCharacters.js';\n\n/**\n * Add the given characters to the end of the given string.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to add to the end.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withTrailingCharacters.html\n*/\nexport function withTrailingCharacters(string: string, characters: string): string {\n return `${withoutTrailingCharacters(string, characters)}${characters}`;\n}\n"],
4
+ "sourcesContent": ["import { withoutTrailingCharacters } from './withoutTrailingCharacters.js';\n\n/**\n * Add the given characters to the end of the given string.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to add to the end.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withTrailingCharacters.html\n */\nexport function withTrailingCharacters(string: string, characters: string): string {\n return `${withoutTrailingCharacters(string, characters)}${characters}`;\n}\n"],
5
5
  "mappings": "AAAA,SAAS,iCAAiC;AAUnC,SAAS,uBAAuB,QAAgB,YAA4B;AACjF,SAAO,GAAG,0BAA0B,QAAQ,UAAU,CAAC,GAAG,UAAU;AACtE;",
6
6
  "names": []
7
7
  }
@@ -4,5 +4,5 @@
4
4
  * @param {string} string The string to modify.
5
5
  * @return {string} The string with a trailing slash.
6
6
  * @link https://js-toolkit.studiometa.dev/utils/string/withTrailingSlash.html
7
- */
7
+ */
8
8
  export declare function withTrailingSlash(string: string): string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/withTrailingSlash.ts"],
4
- "sourcesContent": ["import { withTrailingCharacters } from './withTrailingCharacters.js';\n\n/**\n * Add a trailing slash to a string.\n *\n * @param {string} string The string to modify.\n * @return {string} The string with a trailing slash.\n * @link https://js-toolkit.studiometa.dev/utils/string/withTrailingSlash.html\n*/\nexport function withTrailingSlash(string: string): string {\n return withTrailingCharacters(string, '/');\n}\n"],
4
+ "sourcesContent": ["import { withTrailingCharacters } from './withTrailingCharacters.js';\n\n/**\n * Add a trailing slash to a string.\n *\n * @param {string} string The string to modify.\n * @return {string} The string with a trailing slash.\n * @link https://js-toolkit.studiometa.dev/utils/string/withTrailingSlash.html\n */\nexport function withTrailingSlash(string: string): string {\n return withTrailingCharacters(string, '/');\n}\n"],
5
5
  "mappings": "AAAA,SAAS,8BAA8B;AAShC,SAAS,kBAAkB,QAAwB;AACxD,SAAO,uBAAuB,QAAQ,GAAG;AAC3C;",
6
6
  "names": []
7
7
  }
@@ -5,5 +5,5 @@
5
5
  * @param {string} characters The characters to remove from the start.
6
6
  * @return {string}
7
7
  * @link https://js-toolkit.studiometa.dev/utils/string/withoutLeadingCharacters.html
8
- */
8
+ */
9
9
  export declare function withoutLeadingCharacters(string: string, characters: string): string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/withoutLeadingCharacters.ts"],
4
- "sourcesContent": ["/**\n * Remove the given characters from the start of the given string.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to remove from the start.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutLeadingCharacters.html\n*/\nexport function withoutLeadingCharacters(string: string, characters: string): string {\n return string.replace(new RegExp(`^${characters}`), '');\n}\n"],
4
+ "sourcesContent": ["/**\n * Remove the given characters from the start of the given string.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to remove from the start.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutLeadingCharacters.html\n */\nexport function withoutLeadingCharacters(string: string, characters: string): string {\n return string.replace(new RegExp(`^${characters}`), '');\n}\n"],
5
5
  "mappings": "AAQO,SAAS,yBAAyB,QAAgB,YAA4B;AACnF,SAAO,OAAO,QAAQ,IAAI,OAAO,IAAI,UAAU,EAAE,GAAG,EAAE;AACxD;",
6
6
  "names": []
7
7
  }
@@ -5,5 +5,5 @@
5
5
  * @param {string} characters The characters to add to the start.
6
6
  * @return {string}
7
7
  * @link https://js-toolkit.studiometa.dev/utils/string/withoutLeadingCharactersRecursive.html
8
- */
8
+ */
9
9
  export declare function withoutLeadingCharactersRecursive(string: string, characters: string): string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/withoutLeadingCharactersRecursive.ts"],
4
- "sourcesContent": ["import { withoutLeadingCharacters } from './withoutLeadingCharacters.js';\n\n/**\n * Remove the given characters to the start of the given string recursively.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to add to the start.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutLeadingCharactersRecursive.html\n*/\nexport function withoutLeadingCharactersRecursive(string: string, characters: string): string {\n let str = withoutLeadingCharacters(string, characters);\n const regex = new RegExp(`^${characters}`);\n\n while (regex.test(str)) {\n str = withoutLeadingCharacters(str, characters);\n }\n\n return str;\n}\n"],
4
+ "sourcesContent": ["import { withoutLeadingCharacters } from './withoutLeadingCharacters.js';\n\n/**\n * Remove the given characters to the start of the given string recursively.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to add to the start.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutLeadingCharactersRecursive.html\n */\nexport function withoutLeadingCharactersRecursive(string: string, characters: string): string {\n let str = withoutLeadingCharacters(string, characters);\n const regex = new RegExp(`^${characters}`);\n\n while (regex.test(str)) {\n str = withoutLeadingCharacters(str, characters);\n }\n\n return str;\n}\n"],
5
5
  "mappings": "AAAA,SAAS,gCAAgC;AAUlC,SAAS,kCAAkC,QAAgB,YAA4B;AAC5F,MAAI,MAAM,yBAAyB,QAAQ,UAAU;AACrD,QAAM,QAAQ,IAAI,OAAO,IAAI,UAAU,EAAE;AAEzC,SAAO,MAAM,KAAK,GAAG,GAAG;AACtB,UAAM,yBAAyB,KAAK,UAAU;AAAA,EAChD;AAEA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -4,5 +4,5 @@
4
4
  * @param {string} string The string to modify.
5
5
  * @return {string} The string without leading slash.
6
6
  * @link https://js-toolkit.studiometa.dev/utils/string/withoutLeadingSlash.html
7
- */
7
+ */
8
8
  export declare function withoutLeadingSlash(string: string): string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/withoutLeadingSlash.ts"],
4
- "sourcesContent": ["import { withoutLeadingCharacters } from './withoutLeadingCharacters.js';\n\n/**\n * Remove the leading slash from a string.\n *\n * @param {string} string The string to modify.\n * @return {string} The string without leading slash.\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutLeadingSlash.html\n*/\nexport function withoutLeadingSlash(string: string): string {\n return withoutLeadingCharacters(string, '/');\n}\n"],
4
+ "sourcesContent": ["import { withoutLeadingCharacters } from './withoutLeadingCharacters.js';\n\n/**\n * Remove the leading slash from a string.\n *\n * @param {string} string The string to modify.\n * @return {string} The string without leading slash.\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutLeadingSlash.html\n */\nexport function withoutLeadingSlash(string: string): string {\n return withoutLeadingCharacters(string, '/');\n}\n"],
5
5
  "mappings": "AAAA,SAAS,gCAAgC;AASlC,SAAS,oBAAoB,QAAwB;AAC1D,SAAO,yBAAyB,QAAQ,GAAG;AAC7C;",
6
6
  "names": []
7
7
  }
@@ -5,5 +5,5 @@
5
5
  * @param {string} characters The characters to remove from the end.
6
6
  * @return {string}
7
7
  * @link https://js-toolkit.studiometa.dev/utils/string/withoutTrailingCharacters.html
8
- */
8
+ */
9
9
  export declare function withoutTrailingCharacters(string: string, characters: string): string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/withoutTrailingCharacters.ts"],
4
- "sourcesContent": ["/**\n * Remove the given characters from the end of the given string.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to remove from the end.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutTrailingCharacters.html\n*/\nexport function withoutTrailingCharacters(string: string, characters: string): string {\n return string.replace(new RegExp(`${characters}$`), '');\n}\n"],
4
+ "sourcesContent": ["/**\n * Remove the given characters from the end of the given string.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to remove from the end.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutTrailingCharacters.html\n */\nexport function withoutTrailingCharacters(string: string, characters: string): string {\n return string.replace(new RegExp(`${characters}$`), '');\n}\n"],
5
5
  "mappings": "AAQO,SAAS,0BAA0B,QAAgB,YAA4B;AACpF,SAAO,OAAO,QAAQ,IAAI,OAAO,GAAG,UAAU,GAAG,GAAG,EAAE;AACxD;",
6
6
  "names": []
7
7
  }
@@ -5,5 +5,5 @@
5
5
  * @param {string} characters The characters to add to the start.
6
6
  * @return {string}
7
7
  * @link https://js-toolkit.studiometa.dev/utils/string/withoutTrailingCharactersRecursive.html
8
- */
8
+ */
9
9
  export declare function withoutTrailingCharactersRecursive(string: string, characters: string): string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/withoutTrailingCharactersRecursive.ts"],
4
- "sourcesContent": ["import { withoutTrailingCharacters } from './withoutTrailingCharacters.js';\n\n/**\n * Remove the given characters to the start of the given string recursively.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to add to the start.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutTrailingCharactersRecursive.html\n*/\nexport function withoutTrailingCharactersRecursive(string: string, characters: string): string {\n let str = withoutTrailingCharacters(string, characters);\n const regex = new RegExp(`${characters}$`);\n\n while (regex.test(str)) {\n str = withoutTrailingCharacters(str, characters);\n }\n\n return str;\n}\n"],
4
+ "sourcesContent": ["import { withoutTrailingCharacters } from './withoutTrailingCharacters.js';\n\n/**\n * Remove the given characters to the start of the given string recursively.\n *\n * @param {string} string The string to modify.\n * @param {string} characters The characters to add to the start.\n * @return {string}\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutTrailingCharactersRecursive.html\n */\nexport function withoutTrailingCharactersRecursive(string: string, characters: string): string {\n let str = withoutTrailingCharacters(string, characters);\n const regex = new RegExp(`${characters}$`);\n\n while (regex.test(str)) {\n str = withoutTrailingCharacters(str, characters);\n }\n\n return str;\n}\n"],
5
5
  "mappings": "AAAA,SAAS,iCAAiC;AAUnC,SAAS,mCAAmC,QAAgB,YAA4B;AAC7F,MAAI,MAAM,0BAA0B,QAAQ,UAAU;AACtD,QAAM,QAAQ,IAAI,OAAO,GAAG,UAAU,GAAG;AAEzC,SAAO,MAAM,KAAK,GAAG,GAAG;AACtB,UAAM,0BAA0B,KAAK,UAAU;AAAA,EACjD;AAEA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -4,5 +4,5 @@
4
4
  * @param {string} string The string to modify.
5
5
  * @return {string} The string without trailing slash.
6
6
  * @link https://js-toolkit.studiometa.dev/utils/string/withoutTrailingSlash.html
7
- */
7
+ */
8
8
  export declare function withoutTrailingSlash(string: string): string;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/utils/string/withoutTrailingSlash.ts"],
4
- "sourcesContent": ["import { withoutTrailingCharacters } from './withoutTrailingCharacters.js';\n\n/**\n * Remove the trailing slash from a string.\n *\n * @param {string} string The string to modify.\n * @return {string} The string without trailing slash.\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutTrailingSlash.html\n*/\nexport function withoutTrailingSlash(string: string): string {\n return withoutTrailingCharacters(string, '/');\n}\n"],
4
+ "sourcesContent": ["import { withoutTrailingCharacters } from './withoutTrailingCharacters.js';\n\n/**\n * Remove the trailing slash from a string.\n *\n * @param {string} string The string to modify.\n * @return {string} The string without trailing slash.\n * @link https://js-toolkit.studiometa.dev/utils/string/withoutTrailingSlash.html\n */\nexport function withoutTrailingSlash(string: string): string {\n return withoutTrailingCharacters(string, '/');\n}\n"],
5
5
  "mappings": "AAAA,SAAS,iCAAiC;AASnC,SAAS,qBAAqB,QAAwB;AAC3D,SAAO,0BAA0B,QAAQ,GAAG;AAC9C;",
6
6
  "names": []
7
7
  }
@@ -5,5 +5,5 @@
5
5
  * @param {number} [delay] The delay in ms
6
6
  * @return {Function} The throttled function.
7
7
  * @link https://js-toolkit.studiometa.dev/utils/throttle.html
8
- */
8
+ */
9
9
  export declare function throttle(fn: (...args: unknown[]) => void, delay?: number): (...args: unknown[]) => void;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/throttle.ts"],
4
- "sourcesContent": ["/**\n * Simple throttling helper that limits a function to only run once every {delay}ms.\n *\n * @param {Function} fn The function to throttle\n * @param {number} [delay] The delay in ms\n * @return {Function} The throttled function.\n * @link https://js-toolkit.studiometa.dev/utils/throttle.html\n*/\nexport function throttle(\n fn: (...args: unknown[]) => void,\n delay = 16,\n): (...args: unknown[]) => void {\n let lastCall = 0;\n return function throttled(...args) {\n const now = Date.now();\n if (now - lastCall < delay) {\n return;\n }\n lastCall = now;\n // eslint-disable-next-line consistent-return\n return fn(...args);\n };\n}\n"],
4
+ "sourcesContent": ["/**\n * Simple throttling helper that limits a function to only run once every {delay}ms.\n *\n * @param {Function} fn The function to throttle\n * @param {number} [delay] The delay in ms\n * @return {Function} The throttled function.\n * @link https://js-toolkit.studiometa.dev/utils/throttle.html\n */\nexport function throttle(\n fn: (...args: unknown[]) => void,\n delay = 16,\n): (...args: unknown[]) => void {\n let lastCall = 0;\n return function throttled(...args) {\n const now = Date.now();\n if (now - lastCall < delay) {\n return;\n }\n lastCall = now;\n // eslint-disable-next-line consistent-return\n return fn(...args);\n };\n}\n"],
5
5
  "mappings": "AAQO,SAAS,SACd,IACA,QAAQ,IACsB;AAC9B,MAAI,WAAW;AACf,SAAO,SAAS,aAAa,MAAM;AACjC,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,WAAW,OAAO;AAC1B;AAAA,IACF;AACA,eAAW;AAEX,WAAO,GAAG,GAAG,IAAI;AAAA,EACnB;AACF;",
6
6
  "names": []
7
7
  }
@@ -8,10 +8,10 @@ export declare function saveActiveElement(): void;
8
8
  * @param {HTMLElement} element The element in which to trap the tabulations.
9
9
  * @param {KeyboardEvent} event The keydown or keyup event.
10
10
  * @link https://js-toolkit.studiometa.dev/utils/trapFocus.html
11
- */
11
+ */
12
12
  export declare function trapFocus(element: HTMLElement, event: KeyboardEvent): void;
13
13
  /**
14
14
  * Untrap the tab navigation.
15
15
  * @link https://js-toolkit.studiometa.dev/utils/trapFocus.html
16
- */
16
+ */
17
17
  export declare function untrapFocus(): void;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/utils/trapFocus.ts"],
4
- "sourcesContent": ["import { keyCodes } from './keyCodes.js';\nimport { isFunction } from './is.js';\n\nconst FOCUSABLE_ELEMENTS = [\n 'a[href]:not([tabindex^=\"-\"]):not([inert])',\n 'area[href]:not([tabindex^=\"-\"]):not([inert])',\n 'input:not([disabled]):not([inert])',\n 'select:not([disabled]):not([inert])',\n 'textarea:not([disabled]):not([inert])',\n 'button:not([disabled]):not([inert])',\n 'iframe:not([tabindex^=\"-\"]):not([inert])',\n 'audio:not([tabindex^=\"-\"]):not([inert])',\n 'video:not([tabindex^=\"-\"]):not([inert])',\n '[contenteditable]:not([tabindex^=\"-\"]):not([inert])',\n '[tabindex]:not([tabindex^=\"-\"]):not([inert])',\n];\n\nlet focusedBefore;\n\n/**\n * Save the current active element.\n */\nexport function saveActiveElement() {\n focusedBefore = document.activeElement;\n}\n\n/**\n * Trap tab navigation inside the given element.\n *\n * @param {HTMLElement} element The element in which to trap the tabulations.\n * @param {KeyboardEvent} event The keydown or keyup event.\n * @link https://js-toolkit.studiometa.dev/utils/trapFocus.html\n*/\nexport function trapFocus(element: HTMLElement, event: KeyboardEvent) {\n if (event.keyCode !== keyCodes.TAB) {\n return;\n }\n\n // Save the previous focused element\n if (!focusedBefore) {\n focusedBefore = document.activeElement;\n }\n\n const focusableChildren: HTMLElement[] = Array.from(\n element.querySelectorAll(FOCUSABLE_ELEMENTS.join(', ')),\n ) as HTMLElement[];\n const focusedItemIndex =\n document.activeElement instanceof HTMLElement\n ? focusableChildren.indexOf(document.activeElement)\n : -1;\n\n if (!focusableChildren.length) {\n return;\n }\n\n if (focusedItemIndex < 0) {\n focusableChildren[0].focus();\n event.preventDefault();\n }\n\n // If the SHIFT key is being pressed while tabbing (moving backwards) and\n // the currently focused item is the first one, move the focus to the last\n // focusable item from the dialog element\n if (event.shiftKey && focusedItemIndex === 0) {\n focusableChildren.at(-1).focus();\n event.preventDefault();\n }\n\n // If the SHIFT key is not being pressed (moving forwards) and the currently\n // focused item is the last one, move the focus to the first focusable item\n // from the dialog element\n else if (!event.shiftKey && focusedItemIndex === focusableChildren.length - 1) {\n focusableChildren[0].focus();\n event.preventDefault();\n }\n}\n\n/**\n * Untrap the tab navigation.\n * @link https://js-toolkit.studiometa.dev/utils/trapFocus.html\n*/\nexport function untrapFocus() {\n if (focusedBefore && isFunction(focusedBefore.focus)) {\n focusedBefore.focus();\n focusedBefore = null;\n }\n}\n"],
4
+ "sourcesContent": ["import { keyCodes } from './keyCodes.js';\nimport { isFunction } from './is.js';\n\nconst FOCUSABLE_ELEMENTS = [\n 'a[href]:not([tabindex^=\"-\"]):not([inert])',\n 'area[href]:not([tabindex^=\"-\"]):not([inert])',\n 'input:not([disabled]):not([inert])',\n 'select:not([disabled]):not([inert])',\n 'textarea:not([disabled]):not([inert])',\n 'button:not([disabled]):not([inert])',\n 'iframe:not([tabindex^=\"-\"]):not([inert])',\n 'audio:not([tabindex^=\"-\"]):not([inert])',\n 'video:not([tabindex^=\"-\"]):not([inert])',\n '[contenteditable]:not([tabindex^=\"-\"]):not([inert])',\n '[tabindex]:not([tabindex^=\"-\"]):not([inert])',\n];\n\nlet focusedBefore;\n\n/**\n * Save the current active element.\n */\nexport function saveActiveElement() {\n focusedBefore = document.activeElement;\n}\n\n/**\n * Trap tab navigation inside the given element.\n *\n * @param {HTMLElement} element The element in which to trap the tabulations.\n * @param {KeyboardEvent} event The keydown or keyup event.\n * @link https://js-toolkit.studiometa.dev/utils/trapFocus.html\n */\nexport function trapFocus(element: HTMLElement, event: KeyboardEvent) {\n if (event.keyCode !== keyCodes.TAB) {\n return;\n }\n\n // Save the previous focused element\n if (!focusedBefore) {\n focusedBefore = document.activeElement;\n }\n\n const focusableChildren: HTMLElement[] = Array.from(\n element.querySelectorAll(FOCUSABLE_ELEMENTS.join(', ')),\n ) as HTMLElement[];\n const focusedItemIndex =\n document.activeElement instanceof HTMLElement\n ? focusableChildren.indexOf(document.activeElement)\n : -1;\n\n if (!focusableChildren.length) {\n return;\n }\n\n if (focusedItemIndex < 0) {\n focusableChildren[0].focus();\n event.preventDefault();\n }\n\n // If the SHIFT key is being pressed while tabbing (moving backwards) and\n // the currently focused item is the first one, move the focus to the last\n // focusable item from the dialog element\n if (event.shiftKey && focusedItemIndex === 0) {\n focusableChildren.at(-1).focus();\n event.preventDefault();\n }\n\n // If the SHIFT key is not being pressed (moving forwards) and the currently\n // focused item is the last one, move the focus to the first focusable item\n // from the dialog element\n else if (!event.shiftKey && focusedItemIndex === focusableChildren.length - 1) {\n focusableChildren[0].focus();\n event.preventDefault();\n }\n}\n\n/**\n * Untrap the tab navigation.\n * @link https://js-toolkit.studiometa.dev/utils/trapFocus.html\n */\nexport function untrapFocus() {\n if (focusedBefore && isFunction(focusedBefore.focus)) {\n focusedBefore.focus();\n focusedBefore = null;\n }\n}\n"],
5
5
  "mappings": "AAAA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAE3B,MAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAI;AAKG,SAAS,oBAAoB;AAClC,kBAAgB,SAAS;AAC3B;AASO,SAAS,UAAU,SAAsB,OAAsB;AACpE,MAAI,MAAM,YAAY,SAAS,KAAK;AAClC;AAAA,EACF;AAGA,MAAI,CAAC,eAAe;AAClB,oBAAgB,SAAS;AAAA,EAC3B;AAEA,QAAM,oBAAmC,MAAM;AAAA,IAC7C,QAAQ,iBAAiB,mBAAmB,KAAK,IAAI,CAAC;AAAA,EACxD;AACA,QAAM,mBACJ,SAAS,yBAAyB,cAC9B,kBAAkB,QAAQ,SAAS,aAAa,IAChD;AAEN,MAAI,CAAC,kBAAkB,QAAQ;AAC7B;AAAA,EACF;AAEA,MAAI,mBAAmB,GAAG;AACxB,sBAAkB,CAAC,EAAE,MAAM;AAC3B,UAAM,eAAe;AAAA,EACvB;AAKA,MAAI,MAAM,YAAY,qBAAqB,GAAG;AAC5C,sBAAkB,GAAG,EAAE,EAAE,MAAM;AAC/B,UAAM,eAAe;AAAA,EACvB,WAKS,CAAC,MAAM,YAAY,qBAAqB,kBAAkB,SAAS,GAAG;AAC7E,sBAAkB,CAAC,EAAE,MAAM;AAC3B,UAAM,eAAe;AAAA,EACvB;AACF;AAMO,SAAS,cAAc;AAC5B,MAAI,iBAAiB,WAAW,cAAc,KAAK,GAAG;AACpD,kBAAc,MAAM;AACpB,oBAAgB;AAAA,EAClB;AACF;",
6
6
  "names": []
7
7
  }