@vielzeug/prism 26.10.14 → 26.10.16

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 (162) hide show
  1. package/dist/_dev.cjs.map +1 -1
  2. package/dist/_dev.js +6 -1
  3. package/dist/_dev.js.map +1 -1
  4. package/dist/_tappers.cjs.map +1 -1
  5. package/dist/_tappers.js +25 -1
  6. package/dist/_tappers.js.map +1 -1
  7. package/dist/animation/easing.cjs.map +1 -1
  8. package/dist/animation/easing.js +15 -1
  9. package/dist/animation/easing.js.map +1 -1
  10. package/dist/animation/motion.cjs.map +1 -1
  11. package/dist/animation/motion.js +15 -1
  12. package/dist/animation/motion.js.map +1 -1
  13. package/dist/animation/reveal.cjs.map +1 -1
  14. package/dist/animation/reveal.js +97 -1
  15. package/dist/animation/reveal.js.map +1 -1
  16. package/dist/animation/transition.cjs.map +1 -1
  17. package/dist/animation/transition.js +39 -1
  18. package/dist/animation/transition.js.map +1 -1
  19. package/dist/animation/tween.cjs.map +1 -1
  20. package/dist/animation/tween.js +7 -1
  21. package/dist/animation/tween.js.map +1 -1
  22. package/dist/axes/axis.cjs.map +1 -1
  23. package/dist/axes/axis.js +76 -1
  24. package/dist/axes/axis.js.map +1 -1
  25. package/dist/axes/grid.cjs.map +1 -1
  26. package/dist/axes/grid.js +29 -1
  27. package/dist/axes/grid.js.map +1 -1
  28. package/dist/axes/scale-utils.cjs.map +1 -1
  29. package/dist/axes/scale-utils.js +10 -1
  30. package/dist/axes/scale-utils.js.map +1 -1
  31. package/dist/charts/area/area-chart.cjs.map +1 -1
  32. package/dist/charts/area/area-chart.js +71 -1
  33. package/dist/charts/area/area-chart.js.map +1 -1
  34. package/dist/charts/area/area-renderer.cjs.map +1 -1
  35. package/dist/charts/area/area-renderer.js +128 -1
  36. package/dist/charts/area/area-renderer.js.map +1 -1
  37. package/dist/charts/bar/bar-chart.cjs.map +1 -1
  38. package/dist/charts/bar/bar-chart.js +228 -1
  39. package/dist/charts/bar/bar-chart.js.map +1 -1
  40. package/dist/charts/bar/bar-hit-test.cjs.map +1 -1
  41. package/dist/charts/bar/bar-hit-test.js +25 -1
  42. package/dist/charts/bar/bar-hit-test.js.map +1 -1
  43. package/dist/charts/bar/bar-renderer.cjs.map +1 -1
  44. package/dist/charts/bar/bar-renderer.js +139 -1
  45. package/dist/charts/bar/bar-renderer.js.map +1 -1
  46. package/dist/charts/line/line-chart.cjs.map +1 -1
  47. package/dist/charts/line/line-chart.js +93 -1
  48. package/dist/charts/line/line-chart.js.map +1 -1
  49. package/dist/charts/line/line-renderer.cjs.map +1 -1
  50. package/dist/charts/line/line-renderer.js +143 -1
  51. package/dist/charts/line/line-renderer.js.map +1 -1
  52. package/dist/charts/pie/pie-chart.cjs +1 -1
  53. package/dist/charts/pie/pie-chart.cjs.map +1 -1
  54. package/dist/charts/pie/pie-chart.js +207 -1
  55. package/dist/charts/pie/pie-chart.js.map +1 -1
  56. package/dist/charts/pie/pie-renderer.cjs.map +1 -1
  57. package/dist/charts/pie/pie-renderer.js +68 -1
  58. package/dist/charts/pie/pie-renderer.js.map +1 -1
  59. package/dist/charts/radar/radar-chart.cjs +1 -1
  60. package/dist/charts/radar/radar-chart.cjs.map +1 -1
  61. package/dist/charts/radar/radar-chart.js +281 -1
  62. package/dist/charts/radar/radar-chart.js.map +1 -1
  63. package/dist/charts/radar/radar-geometry.cjs.map +1 -1
  64. package/dist/charts/radar/radar-geometry.js +69 -1
  65. package/dist/charts/radar/radar-geometry.js.map +1 -1
  66. package/dist/charts/scatter/scatter-chart.cjs.map +1 -1
  67. package/dist/charts/scatter/scatter-chart.js +69 -1
  68. package/dist/charts/scatter/scatter-chart.js.map +1 -1
  69. package/dist/charts/scatter/scatter-renderer.cjs.map +1 -1
  70. package/dist/charts/scatter/scatter-renderer.js +57 -1
  71. package/dist/charts/scatter/scatter-renderer.js.map +1 -1
  72. package/dist/charts/sparkline/sparkline.cjs +1 -1
  73. package/dist/charts/sparkline/sparkline.cjs.map +1 -1
  74. package/dist/charts/sparkline/sparkline.js +251 -1
  75. package/dist/charts/sparkline/sparkline.js.map +1 -1
  76. package/dist/core/cartesian-model.cjs +1 -1
  77. package/dist/core/cartesian-model.cjs.map +1 -1
  78. package/dist/core/cartesian-model.js +26 -1
  79. package/dist/core/cartesian-model.js.map +1 -1
  80. package/dist/core/cartesian-scales.cjs.map +1 -1
  81. package/dist/core/cartesian-scales.js +38 -1
  82. package/dist/core/cartesian-scales.js.map +1 -1
  83. package/dist/core/chart-base.cjs.map +1 -1
  84. package/dist/core/chart-base.js +62 -1
  85. package/dist/core/chart-base.js.map +1 -1
  86. package/dist/core/chart-scaffold.cjs.map +1 -1
  87. package/dist/core/chart-scaffold.js +103 -1
  88. package/dist/core/chart-scaffold.js.map +1 -1
  89. package/dist/core/datum-style.cjs +1 -1
  90. package/dist/core/datum-style.cjs.map +1 -1
  91. package/dist/core/datum-style.js +22 -1
  92. package/dist/core/datum-style.js.map +1 -1
  93. package/dist/core/ids.cjs.map +1 -1
  94. package/dist/core/ids.js +8 -1
  95. package/dist/core/ids.js.map +1 -1
  96. package/dist/core/layout.cjs.map +1 -1
  97. package/dist/core/layout.js +22 -1
  98. package/dist/core/layout.js.map +1 -1
  99. package/dist/core/polar.cjs.map +1 -1
  100. package/dist/core/polar.js +13 -1
  101. package/dist/core/polar.js.map +1 -1
  102. package/dist/core/responsive.cjs.map +1 -1
  103. package/dist/core/responsive.js +20 -1
  104. package/dist/core/responsive.js.map +1 -1
  105. package/dist/core/series-id.cjs.map +1 -1
  106. package/dist/core/series-id.js +7 -1
  107. package/dist/core/series-id.js.map +1 -1
  108. package/dist/errors.cjs.map +1 -1
  109. package/dist/errors.js +9 -1
  110. package/dist/errors.js.map +1 -1
  111. package/dist/index.js +13 -1
  112. package/dist/interaction/announcer.cjs.map +1 -1
  113. package/dist/interaction/announcer.js +25 -1
  114. package/dist/interaction/announcer.js.map +1 -1
  115. package/dist/interaction/crosshair.cjs.map +1 -1
  116. package/dist/interaction/crosshair.js +37 -1
  117. package/dist/interaction/crosshair.js.map +1 -1
  118. package/dist/interaction/events.cjs.map +1 -1
  119. package/dist/interaction/events.js +11 -1
  120. package/dist/interaction/events.js.map +1 -1
  121. package/dist/interaction/legend.cjs.map +1 -1
  122. package/dist/interaction/legend.js +31 -1
  123. package/dist/interaction/legend.js.map +1 -1
  124. package/dist/interaction/scatter-interaction.cjs.map +1 -1
  125. package/dist/interaction/scatter-interaction.js +105 -1
  126. package/dist/interaction/scatter-interaction.js.map +1 -1
  127. package/dist/interaction/series-interaction.cjs.map +1 -1
  128. package/dist/interaction/series-interaction.js +163 -1
  129. package/dist/interaction/series-interaction.js.map +1 -1
  130. package/dist/interaction/tooltip.cjs +1 -1
  131. package/dist/interaction/tooltip.cjs.map +1 -1
  132. package/dist/interaction/tooltip.js +87 -1
  133. package/dist/interaction/tooltip.js.map +1 -1
  134. package/dist/prism.cjs +1 -1
  135. package/dist/prism.cjs.map +1 -1
  136. package/dist/prism.iife.js +1 -1
  137. package/dist/prism.iife.js.map +1 -1
  138. package/dist/prism.js +2930 -1
  139. package/dist/prism.js.map +1 -1
  140. package/dist/scales/band.cjs.map +1 -1
  141. package/dist/scales/band.js +39 -1
  142. package/dist/scales/band.js.map +1 -1
  143. package/dist/scales/linear.cjs.map +1 -1
  144. package/dist/scales/linear.js +43 -1
  145. package/dist/scales/linear.js.map +1 -1
  146. package/dist/scales/time.cjs.map +1 -1
  147. package/dist/scales/time.js +61 -1
  148. package/dist/scales/time.js.map +1 -1
  149. package/dist/svg/element.cjs +1 -1
  150. package/dist/svg/element.cjs.map +1 -1
  151. package/dist/svg/element.js +16 -1
  152. package/dist/svg/element.js.map +1 -1
  153. package/dist/svg/path.cjs.map +1 -1
  154. package/dist/svg/path.js +48 -1
  155. package/dist/svg/path.js.map +1 -1
  156. package/dist/svg/text.cjs.map +1 -1
  157. package/dist/svg/text.js +13 -1
  158. package/dist/svg/text.js.map +1 -1
  159. package/dist/theme/index.cjs.map +1 -1
  160. package/dist/theme/index.js +37 -1
  161. package/dist/theme/index.js.map +1 -1
  162. package/package.json +5 -5
package/dist/_dev.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["/** @internal */\nconst isDev = !(globalThis as { __PRISM_PROD__?: boolean }).__PRISM_PROD__;\n\n/**\n * Emits a `console.warn` in development builds only.\n * @internal\n * @security Messages may include user-supplied data (e.g. category names, x-values).\n * Never pass PII, tokens, or secrets as chart data labels.\n */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/prism] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AASA,SAAgB,KAAK,EAAmB,CAExC,CAGA,SAAgB,QAAQ,EAAsB,CAE9C"}
1
+ {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["/** @internal */\nconst isDev = !(globalThis as { __PRISM_PROD__?: boolean }).__PRISM_PROD__;\n\n/**\n * Emits a `console.warn` in development builds only.\n * @internal\n * @security Messages may include user-supplied data (e.g. category names, x-values).\n * Never pass PII, tokens, or secrets as chart data labels.\n */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/prism] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AASA,SAAgB,KAAK,EAAmB,CAExC,CAGA,SAAgB,QAAQ,EAAsB,CAE9C,C"}
package/dist/_dev.js CHANGED
@@ -1,2 +1,7 @@
1
- function warn(e){}function devOnly(e){}export{devOnly,warn};
1
+ //#region src/_dev.ts
2
+ function warn(e) {}
3
+ function devOnly(e) {}
4
+ //#endregion
5
+ export { devOnly, warn };
6
+
2
7
  //# sourceMappingURL=_dev.js.map
package/dist/_dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["/** @internal */\nconst isDev = !(globalThis as { __PRISM_PROD__?: boolean }).__PRISM_PROD__;\n\n/**\n * Emits a `console.warn` in development builds only.\n * @internal\n * @security Messages may include user-supplied data (e.g. category names, x-values).\n * Never pass PII, tokens, or secrets as chart data labels.\n */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/prism] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":"AASA,SAAgB,KAAK,EAAmB,CAExC,CAGA,SAAgB,QAAQ,EAAsB,CAE9C"}
1
+ {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["/** @internal */\nconst isDev = !(globalThis as { __PRISM_PROD__?: boolean }).__PRISM_PROD__;\n\n/**\n * Emits a `console.warn` in development builds only.\n * @internal\n * @security Messages may include user-supplied data (e.g. category names, x-values).\n * Never pass PII, tokens, or secrets as chart data labels.\n */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/prism] ${msg}`);\n}\n\n/** @internal: Run fn only in dev builds. Use when dev-only logic goes beyond a single warn() call. */\nexport function devOnly(fn: () => void): void {\n if (isDev) fn();\n}\n"],"mappings":";AASA,SAAgB,KAAK,GAAmB,CAExC;AAGA,SAAgB,QAAQ,GAAsB,CAE9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"_tappers.cjs","names":[],"sources":["../src/_tappers.ts"],"sourcesContent":["/**\n * Shared `tap()` machinery for chart handles.\n *\n * @internal Private to the package: consumers observe charts through\n * `ChartHandle.tap()`, never through this module.\n */\n\nexport interface Tappers<E extends { readonly type: string }> {\n /** Delivers `event` to every registered handler, swallowing handler errors. */\n emit(event: E): void;\n /** Clears every handler; later `tap()` calls return a no-op unsubscribe. */\n stop(): void;\n tap(handler: (event: E) => void, options?: { readonly signal?: AbortSignal }): () => void;\n}\n\nexport function createTappers<E extends { readonly type: string }>(): Tappers<E> {\n const tappers = new Set<(event: E) => void>();\n let stopped = false;\n\n return {\n emit(event) {\n // Zero-overhead guard: observation costs nothing while nobody is watching.\n if (tappers.size === 0) return;\n\n for (const handler of tappers) {\n try {\n handler(event);\n } catch {\n // Observability must never affect chart behavior.\n }\n }\n },\n stop() {\n stopped = true;\n tappers.clear();\n },\n tap(handler, options) {\n if (stopped || options?.signal?.aborted) return () => {};\n\n tappers.add(handler);\n\n const detach = (): void => {\n tappers.delete(handler);\n };\n\n options?.signal?.addEventListener('abort', detach, { once: true });\n\n return detach;\n },\n };\n}\n"],"mappings":"AAeA,SAAgB,eAAiE,CAC/E,IAAM,EAAU,IAAI,IAChB,EAAU,GAEd,MAAO,CACL,KAAK,EAAO,CAEN,KAAQ,OAAS,EAErB,IAAK,IAAM,KAAW,EACpB,GAAI,CACF,EAAQ,CAAK,CACf,MAAQ,CAER,CAEJ,EACA,MAAO,CACL,EAAU,GACV,EAAQ,MAAM,CAChB,EACA,IAAI,EAAS,EAAS,CACpB,GAAI,GAAW,GAAS,QAAQ,QAAS,UAAa,CAAC,EAEvD,EAAQ,IAAI,CAAO,EAEnB,IAAM,WAAqB,CACzB,EAAQ,OAAO,CAAO,CACxB,EAIA,OAFA,GAAS,QAAQ,iBAAiB,QAAS,OAAQ,CAAE,KAAM,EAAK,CAAC,EAE1D,MACT,CACF,CACF"}
1
+ {"version":3,"file":"_tappers.cjs","names":["tappers","stopped","handler","event","options"],"sources":["../src/_tappers.ts"],"sourcesContent":["/**\n * Shared `tap()` machinery for chart handles.\n *\n * @internal Private to the package: consumers observe charts through\n * `ChartHandle.tap()`, never through this module.\n */\n\nexport interface Tappers<E extends { readonly type: string }> {\n /** Delivers `event` to every registered handler, swallowing handler errors. */\n emit(event: E): void;\n /** Clears every handler; later `tap()` calls return a no-op unsubscribe. */\n stop(): void;\n tap(handler: (event: E) => void, options?: { readonly signal?: AbortSignal }): () => void;\n}\n\nexport function createTappers<E extends { readonly type: string }>(): Tappers<E> {\n const tappers = new Set<(event: E) => void>();\n let stopped = false;\n\n return {\n emit(event) {\n // Zero-overhead guard: observation costs nothing while nobody is watching.\n if (tappers.size === 0) return;\n\n for (const handler of tappers) {\n try {\n handler(event);\n } catch {\n // Observability must never affect chart behavior.\n }\n }\n },\n stop() {\n stopped = true;\n tappers.clear();\n },\n tap(handler, options) {\n if (stopped || options?.signal?.aborted) return () => {};\n\n tappers.add(handler);\n\n const detach = (): void => {\n tappers.delete(handler);\n };\n\n options?.signal?.addEventListener('abort', detach, { once: true });\n\n return detach;\n },\n };\n}\n"],"mappings":"AAeA,SAAgB,eAAiE,CAC/E,IAAMA,EAAU,IAAI,IAChBC,EAAU,GAEd,MAAO,CACL,KAAK,EAAO,CAEV,GAAID,EAAQ,OAAS,EAErB,IAAK,IAAME,KAAWF,EACpB,GAAI,CACFE,EAAQC,CAAK,CACf,MAAQ,CAER,CAEJ,EACA,MAAO,CACL,EAAU,GACVH,EAAQ,MAAM,CAChB,EACA,IAAI,EAAS,EAAS,CACpB,GAAIC,GAAWG,GAAS,QAAQ,QAAS,UAAa,CAAC,EAEvDJ,EAAQ,IAAIE,CAAO,EAEnB,IAAM,WAAqB,CACzBF,EAAQ,OAAOE,CAAO,CACxB,EAIA,OAFAE,GAAS,QAAQ,iBAAiB,QAAS,OAAQ,CAAE,KAAM,EAAK,CAAC,EAE1D,MACT,CACF,CACF,C"}
package/dist/_tappers.js CHANGED
@@ -1,2 +1,26 @@
1
- function createTappers(){let e=new Set,t=!1;return{emit(t){if(e.size!==0)for(let n of e)try{n(t)}catch{}},stop(){t=!0,e.clear()},tap(n,r){if(t||r?.signal?.aborted)return()=>{};e.add(n);let detach=()=>{e.delete(n)};return r?.signal?.addEventListener(`abort`,detach,{once:!0}),detach}}}export{createTappers};
1
+ //#region src/_tappers.ts
2
+ function createTappers() {
3
+ let e = /* @__PURE__ */ new Set(), t = !1;
4
+ return {
5
+ emit(t) {
6
+ if (e.size !== 0) for (let n of e) try {
7
+ n(t);
8
+ } catch {}
9
+ },
10
+ stop() {
11
+ t = !0, e.clear();
12
+ },
13
+ tap(n, r) {
14
+ if (t || r?.signal?.aborted) return () => {};
15
+ e.add(n);
16
+ let detach = () => {
17
+ e.delete(n);
18
+ };
19
+ return r?.signal?.addEventListener("abort", detach, { once: !0 }), detach;
20
+ }
21
+ };
22
+ }
23
+ //#endregion
24
+ export { createTappers };
25
+
2
26
  //# sourceMappingURL=_tappers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_tappers.js","names":[],"sources":["../src/_tappers.ts"],"sourcesContent":["/**\n * Shared `tap()` machinery for chart handles.\n *\n * @internal Private to the package: consumers observe charts through\n * `ChartHandle.tap()`, never through this module.\n */\n\nexport interface Tappers<E extends { readonly type: string }> {\n /** Delivers `event` to every registered handler, swallowing handler errors. */\n emit(event: E): void;\n /** Clears every handler; later `tap()` calls return a no-op unsubscribe. */\n stop(): void;\n tap(handler: (event: E) => void, options?: { readonly signal?: AbortSignal }): () => void;\n}\n\nexport function createTappers<E extends { readonly type: string }>(): Tappers<E> {\n const tappers = new Set<(event: E) => void>();\n let stopped = false;\n\n return {\n emit(event) {\n // Zero-overhead guard: observation costs nothing while nobody is watching.\n if (tappers.size === 0) return;\n\n for (const handler of tappers) {\n try {\n handler(event);\n } catch {\n // Observability must never affect chart behavior.\n }\n }\n },\n stop() {\n stopped = true;\n tappers.clear();\n },\n tap(handler, options) {\n if (stopped || options?.signal?.aborted) return () => {};\n\n tappers.add(handler);\n\n const detach = (): void => {\n tappers.delete(handler);\n };\n\n options?.signal?.addEventListener('abort', detach, { once: true });\n\n return detach;\n },\n };\n}\n"],"mappings":"AAeA,SAAgB,eAAiE,CAC/E,IAAM,EAAU,IAAI,IAChB,EAAU,GAEd,MAAO,CACL,KAAK,EAAO,CAEN,KAAQ,OAAS,EAErB,IAAK,IAAM,KAAW,EACpB,GAAI,CACF,EAAQ,CAAK,CACf,MAAQ,CAER,CAEJ,EACA,MAAO,CACL,EAAU,GACV,EAAQ,MAAM,CAChB,EACA,IAAI,EAAS,EAAS,CACpB,GAAI,GAAW,GAAS,QAAQ,QAAS,UAAa,CAAC,EAEvD,EAAQ,IAAI,CAAO,EAEnB,IAAM,WAAqB,CACzB,EAAQ,OAAO,CAAO,CACxB,EAIA,OAFA,GAAS,QAAQ,iBAAiB,QAAS,OAAQ,CAAE,KAAM,EAAK,CAAC,EAE1D,MACT,CACF,CACF"}
1
+ {"version":3,"file":"_tappers.js","names":["tappers","stopped","handler","event","options"],"sources":["../src/_tappers.ts"],"sourcesContent":["/**\n * Shared `tap()` machinery for chart handles.\n *\n * @internal Private to the package: consumers observe charts through\n * `ChartHandle.tap()`, never through this module.\n */\n\nexport interface Tappers<E extends { readonly type: string }> {\n /** Delivers `event` to every registered handler, swallowing handler errors. */\n emit(event: E): void;\n /** Clears every handler; later `tap()` calls return a no-op unsubscribe. */\n stop(): void;\n tap(handler: (event: E) => void, options?: { readonly signal?: AbortSignal }): () => void;\n}\n\nexport function createTappers<E extends { readonly type: string }>(): Tappers<E> {\n const tappers = new Set<(event: E) => void>();\n let stopped = false;\n\n return {\n emit(event) {\n // Zero-overhead guard: observation costs nothing while nobody is watching.\n if (tappers.size === 0) return;\n\n for (const handler of tappers) {\n try {\n handler(event);\n } catch {\n // Observability must never affect chart behavior.\n }\n }\n },\n stop() {\n stopped = true;\n tappers.clear();\n },\n tap(handler, options) {\n if (stopped || options?.signal?.aborted) return () => {};\n\n tappers.add(handler);\n\n const detach = (): void => {\n tappers.delete(handler);\n };\n\n options?.signal?.addEventListener('abort', detach, { once: true });\n\n return detach;\n },\n };\n}\n"],"mappings":";AAeA,SAAgB,gBAAiE;CAC/E,IAAMA,oBAAU,IAAI,IAAwB,GACxCC,IAAU;CAEd,OAAO;EACL,KAAK,GAAO;GAEV,IAAID,EAAQ,SAAS,GAErB,KAAK,IAAME,KAAWF,GACpB,IAAI;IACF,EAAQG,CAAK;GACf,QAAQ,CAER;EAEJ;EACA,OAAO;GAEL,AADA,IAAU,IACVH,EAAQ,MAAM;EAChB;EACA,IAAI,GAAS,GAAS;GACpB,IAAIC,KAAWG,GAAS,QAAQ,SAAS,aAAa,CAAC;GAEvD,EAAQ,IAAIF,CAAO;GAEnB,IAAM,eAAqB;IACzB,EAAQ,OAAOA,CAAO;GACxB;GAIA,OAFAE,GAAS,QAAQ,iBAAiB,SAAS,QAAQ,EAAE,MAAM,GAAK,CAAC,GAE1D;EACT;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"easing.cjs","names":[],"sources":["../../src/animation/easing.ts"],"sourcesContent":["export type EasingFn = (t: number) => number;\n\n/** Overshoot coefficient behind CSS `cubic-bezier(.34, 1.56, .64, 1)`. */\nconst BACK_OVERSHOOT = 1.70158;\n\n/**\n * The named curves a {@link TransitionConfig} can select. The `ease-*` curves are cubic,\n * matching the feel of the CSS easing keywords; `expo-out` decelerates hard for data\n * reveals and `back-out` overshoots slightly for bar entrances.\n */\nexport const easings = {\n 'back-out': (t: number) => 1 + (BACK_OVERSHOOT + 1) * (t - 1) ** 3 + BACK_OVERSHOOT * (t - 1) ** 2,\n 'ease-in': (t: number) => t * t * t,\n 'ease-in-out': (t: number) => (t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2),\n 'ease-out': (t: number) => 1 - (1 - t) ** 3,\n 'expo-out': (t: number) => (t >= 1 ? 1 : 1 - 2 ** (-10 * t)),\n linear: (t: number) => t,\n} satisfies Record<string, EasingFn>;\n\n/** The literal names {@link resolveEasing} accepts, derived from {@link easings}. */\nexport type EasingName = keyof typeof easings;\n\nexport function resolveEasing(easing: string | ((t: number) => number) | undefined): EasingFn {\n if (typeof easing === 'function') return easing;\n\n // `Object.hasOwn` guards against `easing` being a prototype-chain key (e.g. `'__proto__'`,\n // `'constructor'`): a plain bracket lookup on those would silently resolve to an\n // `Object.prototype` value instead of `undefined`, which is either not callable (throws)\n // or callable but not an easing function (produces garbage interpolation).\n if (easing !== undefined && Object.hasOwn(easings, easing)) {\n return (easings as Record<string, EasingFn>)[easing];\n }\n\n return easings['ease-out'];\n}\n"],"mappings":"AAGA,IAOa,EAAU,CACrB,WAAa,GAAc,EAAK,SAAuB,EAAI,IAAM,EAAI,SAAkB,EAAI,IAAM,EACjG,UAAY,GAAc,EAAI,EAAI,EAClC,cAAgB,GAAe,EAAI,GAAM,EAAI,EAAI,EAAI,EAAI,GAAK,GAAK,EAAI,IAAM,EAAI,EACjF,WAAa,GAAc,GAAK,EAAI,IAAM,EAC1C,WAAa,GAAe,GAAK,EAAI,EAAI,EAAI,IAAM,IAAM,GACzD,OAAS,GAAc,CACzB,EAKA,SAAgB,cAAc,EAAgE,CAW5F,OAVI,OAAO,GAAW,WAAmB,EAMrC,IAAW,IAAA,IAAa,OAAO,OAAO,EAAS,CAAM,EAC/C,EAAqC,GAGxC,EAAQ,WACjB"}
1
+ {"version":3,"file":"easing.cjs","names":["easings","t","easing"],"sources":["../../src/animation/easing.ts"],"sourcesContent":["export type EasingFn = (t: number) => number;\n\n/** Overshoot coefficient behind CSS `cubic-bezier(.34, 1.56, .64, 1)`. */\nconst BACK_OVERSHOOT = 1.70158;\n\n/**\n * The named curves a {@link TransitionConfig} can select. The `ease-*` curves are cubic,\n * matching the feel of the CSS easing keywords; `expo-out` decelerates hard for data\n * reveals and `back-out` overshoots slightly for bar entrances.\n */\nexport const easings = {\n 'back-out': (t: number) => 1 + (BACK_OVERSHOOT + 1) * (t - 1) ** 3 + BACK_OVERSHOOT * (t - 1) ** 2,\n 'ease-in': (t: number) => t * t * t,\n 'ease-in-out': (t: number) => (t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2),\n 'ease-out': (t: number) => 1 - (1 - t) ** 3,\n 'expo-out': (t: number) => (t >= 1 ? 1 : 1 - 2 ** (-10 * t)),\n linear: (t: number) => t,\n} satisfies Record<string, EasingFn>;\n\n/** The literal names {@link resolveEasing} accepts, derived from {@link easings}. */\nexport type EasingName = keyof typeof easings;\n\nexport function resolveEasing(easing: string | ((t: number) => number) | undefined): EasingFn {\n if (typeof easing === 'function') return easing;\n\n // `Object.hasOwn` guards against `easing` being a prototype-chain key (e.g. `'__proto__'`,\n // `'constructor'`): a plain bracket lookup on those would silently resolve to an\n // `Object.prototype` value instead of `undefined`, which is either not callable (throws)\n // or callable but not an easing function (produces garbage interpolation).\n if (easing !== undefined && Object.hasOwn(easings, easing)) {\n return (easings as Record<string, EasingFn>)[easing];\n }\n\n return easings['ease-out'];\n}\n"],"mappings":"AAGA,IAOaA,EAAU,CACrB,WAAa,GAAc,EAAK,SAAuBC,EAAI,IAAM,EAAI,SAAkBA,EAAI,IAAM,EACjG,UAAY,GAAcA,EAAIA,EAAIA,EAClC,cAAgB,GAAeA,EAAI,GAAM,EAAIA,EAAIA,EAAIA,EAAI,GAAK,GAAKA,EAAI,IAAM,EAAI,EACjF,WAAa,GAAc,GAAK,EAAIA,IAAM,EAC1C,WAAa,GAAeA,GAAK,EAAI,EAAI,EAAI,IAAM,IAAMA,GACzD,OAAS,GAAcA,CACzB,EAKA,SAAgB,cAAc,EAAgE,CAW5F,OAVI,OAAOC,GAAW,WAAmBA,EAMrCA,IAAW,IAAA,IAAa,OAAO,OAAOF,EAASE,CAAM,EAC/CF,EAAqCE,GAGxCF,EAAQ,WACjB,C"}
@@ -1,2 +1,16 @@
1
- var e={"back-out":e=>1+2.70158*(e-1)**3+1.70158*(e-1)**2,"ease-in":e=>e*e*e,"ease-in-out":e=>e<.5?4*e*e*e:1-(-2*e+2)**3/2,"ease-out":e=>1-(1-e)**3,"expo-out":e=>e>=1?1:1-2**(-10*e),linear:e=>e};function resolveEasing(t){return typeof t==`function`?t:t!==void 0&&Object.hasOwn(e,t)?e[t]:e[`ease-out`]}export{e as easings,resolveEasing};
1
+ //#region src/animation/easing.ts
2
+ var e = {
3
+ "back-out": (e) => 1 + 2.70158 * (e - 1) ** 3 + 1.70158 * (e - 1) ** 2,
4
+ "ease-in": (e) => e * e * e,
5
+ "ease-in-out": (e) => e < .5 ? 4 * e * e * e : 1 - (-2 * e + 2) ** 3 / 2,
6
+ "ease-out": (e) => 1 - (1 - e) ** 3,
7
+ "expo-out": (e) => e >= 1 ? 1 : 1 - 2 ** (-10 * e),
8
+ linear: (e) => e
9
+ };
10
+ function resolveEasing(t) {
11
+ return typeof t == "function" ? t : t !== void 0 && Object.hasOwn(e, t) ? e[t] : e["ease-out"];
12
+ }
13
+ //#endregion
14
+ export { e as easings, resolveEasing };
15
+
2
16
  //# sourceMappingURL=easing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"easing.js","names":[],"sources":["../../src/animation/easing.ts"],"sourcesContent":["export type EasingFn = (t: number) => number;\n\n/** Overshoot coefficient behind CSS `cubic-bezier(.34, 1.56, .64, 1)`. */\nconst BACK_OVERSHOOT = 1.70158;\n\n/**\n * The named curves a {@link TransitionConfig} can select. The `ease-*` curves are cubic,\n * matching the feel of the CSS easing keywords; `expo-out` decelerates hard for data\n * reveals and `back-out` overshoots slightly for bar entrances.\n */\nexport const easings = {\n 'back-out': (t: number) => 1 + (BACK_OVERSHOOT + 1) * (t - 1) ** 3 + BACK_OVERSHOOT * (t - 1) ** 2,\n 'ease-in': (t: number) => t * t * t,\n 'ease-in-out': (t: number) => (t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2),\n 'ease-out': (t: number) => 1 - (1 - t) ** 3,\n 'expo-out': (t: number) => (t >= 1 ? 1 : 1 - 2 ** (-10 * t)),\n linear: (t: number) => t,\n} satisfies Record<string, EasingFn>;\n\n/** The literal names {@link resolveEasing} accepts, derived from {@link easings}. */\nexport type EasingName = keyof typeof easings;\n\nexport function resolveEasing(easing: string | ((t: number) => number) | undefined): EasingFn {\n if (typeof easing === 'function') return easing;\n\n // `Object.hasOwn` guards against `easing` being a prototype-chain key (e.g. `'__proto__'`,\n // `'constructor'`): a plain bracket lookup on those would silently resolve to an\n // `Object.prototype` value instead of `undefined`, which is either not callable (throws)\n // or callable but not an easing function (produces garbage interpolation).\n if (easing !== undefined && Object.hasOwn(easings, easing)) {\n return (easings as Record<string, EasingFn>)[easing];\n }\n\n return easings['ease-out'];\n}\n"],"mappings":"AAGA,IAOa,EAAU,CACrB,WAAa,GAAc,EAAK,SAAuB,EAAI,IAAM,EAAI,SAAkB,EAAI,IAAM,EACjG,UAAY,GAAc,EAAI,EAAI,EAClC,cAAgB,GAAe,EAAI,GAAM,EAAI,EAAI,EAAI,EAAI,GAAK,GAAK,EAAI,IAAM,EAAI,EACjF,WAAa,GAAc,GAAK,EAAI,IAAM,EAC1C,WAAa,GAAe,GAAK,EAAI,EAAI,EAAI,IAAM,IAAM,GACzD,OAAS,GAAc,CACzB,EAKA,SAAgB,cAAc,EAAgE,CAW5F,OAVI,OAAO,GAAW,WAAmB,EAMrC,IAAW,IAAA,IAAa,OAAO,OAAO,EAAS,CAAM,EAC/C,EAAqC,GAGxC,EAAQ,WACjB"}
1
+ {"version":3,"file":"easing.js","names":["easings","t","easing"],"sources":["../../src/animation/easing.ts"],"sourcesContent":["export type EasingFn = (t: number) => number;\n\n/** Overshoot coefficient behind CSS `cubic-bezier(.34, 1.56, .64, 1)`. */\nconst BACK_OVERSHOOT = 1.70158;\n\n/**\n * The named curves a {@link TransitionConfig} can select. The `ease-*` curves are cubic,\n * matching the feel of the CSS easing keywords; `expo-out` decelerates hard for data\n * reveals and `back-out` overshoots slightly for bar entrances.\n */\nexport const easings = {\n 'back-out': (t: number) => 1 + (BACK_OVERSHOOT + 1) * (t - 1) ** 3 + BACK_OVERSHOOT * (t - 1) ** 2,\n 'ease-in': (t: number) => t * t * t,\n 'ease-in-out': (t: number) => (t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2),\n 'ease-out': (t: number) => 1 - (1 - t) ** 3,\n 'expo-out': (t: number) => (t >= 1 ? 1 : 1 - 2 ** (-10 * t)),\n linear: (t: number) => t,\n} satisfies Record<string, EasingFn>;\n\n/** The literal names {@link resolveEasing} accepts, derived from {@link easings}. */\nexport type EasingName = keyof typeof easings;\n\nexport function resolveEasing(easing: string | ((t: number) => number) | undefined): EasingFn {\n if (typeof easing === 'function') return easing;\n\n // `Object.hasOwn` guards against `easing` being a prototype-chain key (e.g. `'__proto__'`,\n // `'constructor'`): a plain bracket lookup on those would silently resolve to an\n // `Object.prototype` value instead of `undefined`, which is either not callable (throws)\n // or callable but not an easing function (produces garbage interpolation).\n if (easing !== undefined && Object.hasOwn(easings, easing)) {\n return (easings as Record<string, EasingFn>)[easing];\n }\n\n return easings['ease-out'];\n}\n"],"mappings":";AAGA,IAOaA,IAAU;CACrB,aAAa,MAAc,IAAK,WAAuBC,IAAI,MAAM,IAAI,WAAkBA,IAAI,MAAM;CACjG,YAAY,MAAcA,IAAIA,IAAIA;CAClC,gBAAgB,MAAeA,IAAI,KAAM,IAAIA,IAAIA,IAAIA,IAAI,KAAK,KAAKA,IAAI,MAAM,IAAI;CACjF,aAAa,MAAc,KAAK,IAAIA,MAAM;CAC1C,aAAa,MAAeA,KAAK,IAAI,IAAI,IAAI,MAAM,MAAMA;CACzD,SAAS,MAAcA;AACzB;AAKA,SAAgB,cAAc,GAAgE;CAW5F,OAVI,OAAOC,KAAW,aAAmBA,IAMrCA,MAAW,KAAA,KAAa,OAAO,OAAOF,GAASE,CAAM,IAC/CF,EAAqCE,KAGxCF,EAAQ;AACjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"motion.cjs","names":[],"sources":["../../src/animation/motion.ts"],"sourcesContent":["import type { TransitionConfig, TransitionOption } from '../types';\n\n/** Duration (ms) every chart uses when motion is enabled without an explicit `duration`. */\nexport const DEFAULT_DURATION = 300;\n\n/**\n * Resolves a user-facing `transition` option into concrete motion values.\n *\n * - `false` disables motion entirely: renderers apply their final state synchronously.\n * - `true` (or omitted) enables motion with the chart's `defaultDuration`/`defaultStagger`.\n * - `preference: 'system'` (the default) disables motion when the user prefers reduced motion.\n */\nexport function resolveMotion(\n config?: TransitionOption,\n defaults?: { defaultDuration?: number; defaultStagger?: number },\n): TransitionConfig & { duration: number; stagger: number } {\n if (config === false) return { duration: 0, stagger: 0 };\n\n const options = config === true ? undefined : config;\n const preference = options?.preference ?? 'system';\n const reduced = typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration =\n preference === 'never' || (preference === 'system' && reduced)\n ? 0\n : (options?.duration ?? defaults?.defaultDuration ?? DEFAULT_DURATION);\n\n return { ...options, duration, stagger: Math.max(0, options?.stagger ?? defaults?.defaultStagger ?? 0) };\n}\n"],"mappings":"AAYA,SAAgB,cACd,EACA,EAC0D,CAC1D,GAAI,IAAW,GAAO,MAAO,CAAE,SAAU,EAAG,QAAS,CAAE,EAEvD,IAAM,EAAU,IAAW,GAAO,IAAA,GAAY,EACxC,EAAa,GAAS,YAAc,SACpC,EAAU,OAAO,WAAe,KAAe,WAAW,kCAAkC,CAAC,CAAC,QAC9F,EACJ,IAAe,SAAY,IAAe,UAAY,EAClD,EACC,GAAS,UAAY,GAAU,iBAAA,IAEtC,MAAO,CAAE,GAAG,EAAS,WAAU,QAAS,KAAK,IAAI,EAAG,GAAS,SAAW,GAAU,gBAAkB,CAAC,CAAE,CACzG"}
1
+ {"version":3,"file":"motion.cjs","names":["config","options","preference","reduced","duration","defaults"],"sources":["../../src/animation/motion.ts"],"sourcesContent":["import type { TransitionConfig, TransitionOption } from '../types';\n\n/** Duration (ms) every chart uses when motion is enabled without an explicit `duration`. */\nexport const DEFAULT_DURATION = 300;\n\n/**\n * Resolves a user-facing `transition` option into concrete motion values.\n *\n * - `false` disables motion entirely: renderers apply their final state synchronously.\n * - `true` (or omitted) enables motion with the chart's `defaultDuration`/`defaultStagger`.\n * - `preference: 'system'` (the default) disables motion when the user prefers reduced motion.\n */\nexport function resolveMotion(\n config?: TransitionOption,\n defaults?: { defaultDuration?: number; defaultStagger?: number },\n): TransitionConfig & { duration: number; stagger: number } {\n if (config === false) return { duration: 0, stagger: 0 };\n\n const options = config === true ? undefined : config;\n const preference = options?.preference ?? 'system';\n const reduced = typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration =\n preference === 'never' || (preference === 'system' && reduced)\n ? 0\n : (options?.duration ?? defaults?.defaultDuration ?? DEFAULT_DURATION);\n\n return { ...options, duration, stagger: Math.max(0, options?.stagger ?? defaults?.defaultStagger ?? 0) };\n}\n"],"mappings":"AAYA,SAAgB,cACd,EACA,EAC0D,CAC1D,GAAIA,IAAW,GAAO,MAAO,CAAE,SAAU,EAAG,QAAS,CAAE,EAEvD,IAAMC,EAAUD,IAAW,GAAO,IAAA,GAAYA,EACxCE,EAAaD,GAAS,YAAc,SACpCE,EAAU,OAAO,WAAe,KAAe,WAAW,kCAAkC,CAAC,CAAC,QAC9FC,EACJF,IAAe,SAAYA,IAAe,UAAYC,EAClD,EACCF,GAAS,UAAYI,GAAU,iBAAA,IAEtC,MAAO,CAAE,GAAGJ,EAAS,WAAU,QAAS,KAAK,IAAI,EAAGA,GAAS,SAAWI,GAAU,gBAAkB,CAAC,CAAE,CACzG,C"}
@@ -1,2 +1,16 @@
1
- function resolveMotion(e,t){if(e===!1)return{duration:0,stagger:0};let n=e===!0?void 0:e,r=n?.preference??`system`,i=typeof matchMedia<`u`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,a=r===`never`||r===`system`&&i?0:n?.duration??t?.defaultDuration??300;return{...n,duration:a,stagger:Math.max(0,n?.stagger??t?.defaultStagger??0)}}export{resolveMotion};
1
+ function resolveMotion(e, t) {
2
+ if (e === !1) return {
3
+ duration: 0,
4
+ stagger: 0
5
+ };
6
+ let n = e === !0 ? void 0 : e, r = n?.preference ?? "system", i = typeof matchMedia < "u" && matchMedia("(prefers-reduced-motion: reduce)").matches, a = r === "never" || r === "system" && i ? 0 : n?.duration ?? t?.defaultDuration ?? 300;
7
+ return {
8
+ ...n,
9
+ duration: a,
10
+ stagger: Math.max(0, n?.stagger ?? t?.defaultStagger ?? 0)
11
+ };
12
+ }
13
+ //#endregion
14
+ export { resolveMotion };
15
+
2
16
  //# sourceMappingURL=motion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"motion.js","names":[],"sources":["../../src/animation/motion.ts"],"sourcesContent":["import type { TransitionConfig, TransitionOption } from '../types';\n\n/** Duration (ms) every chart uses when motion is enabled without an explicit `duration`. */\nexport const DEFAULT_DURATION = 300;\n\n/**\n * Resolves a user-facing `transition` option into concrete motion values.\n *\n * - `false` disables motion entirely: renderers apply their final state synchronously.\n * - `true` (or omitted) enables motion with the chart's `defaultDuration`/`defaultStagger`.\n * - `preference: 'system'` (the default) disables motion when the user prefers reduced motion.\n */\nexport function resolveMotion(\n config?: TransitionOption,\n defaults?: { defaultDuration?: number; defaultStagger?: number },\n): TransitionConfig & { duration: number; stagger: number } {\n if (config === false) return { duration: 0, stagger: 0 };\n\n const options = config === true ? undefined : config;\n const preference = options?.preference ?? 'system';\n const reduced = typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration =\n preference === 'never' || (preference === 'system' && reduced)\n ? 0\n : (options?.duration ?? defaults?.defaultDuration ?? DEFAULT_DURATION);\n\n return { ...options, duration, stagger: Math.max(0, options?.stagger ?? defaults?.defaultStagger ?? 0) };\n}\n"],"mappings":"AAYA,SAAgB,cACd,EACA,EAC0D,CAC1D,GAAI,IAAW,GAAO,MAAO,CAAE,SAAU,EAAG,QAAS,CAAE,EAEvD,IAAM,EAAU,IAAW,GAAO,IAAA,GAAY,EACxC,EAAa,GAAS,YAAc,SACpC,EAAU,OAAO,WAAe,KAAe,WAAW,kCAAkC,CAAC,CAAC,QAC9F,EACJ,IAAe,SAAY,IAAe,UAAY,EAClD,EACC,GAAS,UAAY,GAAU,iBAAA,IAEtC,MAAO,CAAE,GAAG,EAAS,WAAU,QAAS,KAAK,IAAI,EAAG,GAAS,SAAW,GAAU,gBAAkB,CAAC,CAAE,CACzG"}
1
+ {"version":3,"file":"motion.js","names":["config","options","preference","reduced","duration","defaults"],"sources":["../../src/animation/motion.ts"],"sourcesContent":["import type { TransitionConfig, TransitionOption } from '../types';\n\n/** Duration (ms) every chart uses when motion is enabled without an explicit `duration`. */\nexport const DEFAULT_DURATION = 300;\n\n/**\n * Resolves a user-facing `transition` option into concrete motion values.\n *\n * - `false` disables motion entirely: renderers apply their final state synchronously.\n * - `true` (or omitted) enables motion with the chart's `defaultDuration`/`defaultStagger`.\n * - `preference: 'system'` (the default) disables motion when the user prefers reduced motion.\n */\nexport function resolveMotion(\n config?: TransitionOption,\n defaults?: { defaultDuration?: number; defaultStagger?: number },\n): TransitionConfig & { duration: number; stagger: number } {\n if (config === false) return { duration: 0, stagger: 0 };\n\n const options = config === true ? undefined : config;\n const preference = options?.preference ?? 'system';\n const reduced = typeof matchMedia !== 'undefined' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n const duration =\n preference === 'never' || (preference === 'system' && reduced)\n ? 0\n : (options?.duration ?? defaults?.defaultDuration ?? DEFAULT_DURATION);\n\n return { ...options, duration, stagger: Math.max(0, options?.stagger ?? defaults?.defaultStagger ?? 0) };\n}\n"],"mappings":"AAYA,SAAgB,cACd,GACA,GAC0D;CAC1D,IAAIA,MAAW,IAAO,OAAO;EAAE,UAAU;EAAG,SAAS;CAAE;CAEvD,IAAMC,IAAUD,MAAW,KAAO,KAAA,IAAYA,GACxCE,IAAaD,GAAS,cAAc,UACpCE,IAAU,OAAO,aAAe,OAAe,WAAW,kCAAkC,CAAC,CAAC,SAC9FC,IACJF,MAAe,WAAYA,MAAe,YAAYC,IAClD,IACCF,GAAS,YAAYI,GAAU,mBAAA;CAEtC,OAAO;EAAE,GAAGJ;EAAS;EAAU,SAAS,KAAK,IAAI,GAAGA,GAAS,WAAWI,GAAU,kBAAkB,CAAC;CAAE;AACzG"}
@@ -1 +1 @@
1
- {"version":3,"file":"reveal.cjs","names":[],"sources":["../../src/animation/reveal.ts"],"sourcesContent":["import { uniqueId } from '../core/ids';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { TransitionConfig } from '../types';\nimport { resolveEasing } from './easing';\nimport { startTween } from './transition';\n\nconst activeReveals = new WeakMap<Element, () => void>();\n\nexport function cancelReveal(parent: Element): void {\n activeReveals.get(parent)?.();\n}\n\n/** Traces final line geometry without replacing its dash or per-datum styling. */\nexport function playTraceReveal(\n parent: SVGGElement,\n bounds: { height: number; width: number },\n paths: readonly { d: string; end: number; start: number }[],\n strokeWidth: number,\n motion: TransitionConfig & { duration: number },\n signal?: AbortSignal,\n): () => void {\n cancelReveal(parent);\n if (motion.duration <= 0 || signal?.aborted) return () => {};\n\n const maskId = uniqueId('prism-trace');\n const host = createSvgElement('defs');\n const padding = strokeWidth / 2;\n const mask = createSvgElement('mask', {\n height: bounds.height + strokeWidth,\n id: maskId,\n maskContentUnits: 'userSpaceOnUse',\n maskUnits: 'userSpaceOnUse',\n width: bounds.width + strokeWidth,\n x: -padding,\n y: -padding,\n });\n const traces = paths.map(({ d }) => {\n const trace = createSvgElement('path', {\n d,\n fill: 'none',\n pathLength: 1,\n stroke: 'white',\n 'stroke-dasharray': '1 1',\n 'stroke-dashoffset': 1,\n 'stroke-width': strokeWidth,\n });\n mask.appendChild(trace);\n return trace;\n });\n host.appendChild(mask);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('mask', `url(#${maskId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('mask');\n host.remove();\n signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: 1,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n const e = progress(0);\n for (const [i, trace] of traces.entries()) {\n const { start, end } = paths[i];\n const revealed = Math.max(0, Math.min(1, (e - start) / (end - start)));\n trace.setAttribute('stroke-dashoffset', String(1 - revealed));\n }\n },\n signal,\n });\n return finish;\n}\n\nexport interface GrowRevealLane {\n anchor: number;\n height: number;\n width: number;\n x: number;\n y: number;\n}\n\n/** Reveals finished bars from their own baseline without distorting rounded corners. */\nexport function playGrowReveal(\n parent: SVGGElement,\n lanes: readonly GrowRevealLane[],\n paintFinal: () => void,\n motion: TransitionConfig & { duration: number },\n options: { axis: 'x' | 'y'; signal?: AbortSignal; stagger?: number },\n): () => void {\n cancelReveal(parent);\n paintFinal();\n if (motion.duration <= 0 || lanes.length === 0 || options.signal?.aborted) return () => {};\n\n const clipId = uniqueId('prism-reveal');\n const host = createSvgElement('defs');\n const clipPath = createSvgElement('clipPath', { id: clipId });\n const rects = lanes.map((lane) => {\n const rect = createSvgElement('rect', { height: 0, width: 0, x: lane.x, y: lane.y });\n clipPath.appendChild(rect);\n return rect;\n });\n host.appendChild(clipPath);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('clip-path', `url(#${clipId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('clip-path');\n host.remove();\n options.signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n options.signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: lanes.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n for (const [i, rect] of rects.entries()) {\n const lane = lanes[i];\n const e = Math.max(0, Math.min(1, progress(i)));\n if (options.axis === 'y') {\n const top = lane.anchor + (lane.y - lane.anchor) * e;\n const bottom = lane.anchor + (lane.y + lane.height - lane.anchor) * e;\n setAttributes(rect, { height: Math.max(0, bottom - top), width: lane.width, y: top });\n } else {\n const left = lane.anchor + (lane.x - lane.anchor) * e;\n const right = lane.anchor + (lane.x + lane.width - lane.anchor) * e;\n setAttributes(rect, { height: lane.height, width: Math.max(0, right - left), x: left });\n }\n }\n },\n signal: options.signal,\n stagger: options.stagger,\n });\n return finish;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"reveal.cjs","names":["uniqueId","createSvgElement","startTween","resolveEasing","require_element","require_easing","require_transition","require_ids","activeReveals","parent","motion","signal","maskId","host","padding","strokeWidth","mask","bounds","traces","paths","trace","e","progress","i","revealed","start","end","paintFinal","lanes","options","clipId","clipPath","rects","rect","lane","top","bottom","left","right"],"sources":["../../src/animation/reveal.ts"],"sourcesContent":["import { uniqueId } from '../core/ids';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { TransitionConfig } from '../types';\nimport { resolveEasing } from './easing';\nimport { startTween } from './transition';\n\nconst activeReveals = new WeakMap<Element, () => void>();\n\nexport function cancelReveal(parent: Element): void {\n activeReveals.get(parent)?.();\n}\n\n/** Traces final line geometry without replacing its dash or per-datum styling. */\nexport function playTraceReveal(\n parent: SVGGElement,\n bounds: { height: number; width: number },\n paths: readonly { d: string; end: number; start: number }[],\n strokeWidth: number,\n motion: TransitionConfig & { duration: number },\n signal?: AbortSignal,\n): () => void {\n cancelReveal(parent);\n if (motion.duration <= 0 || signal?.aborted) return () => {};\n\n const maskId = uniqueId('prism-trace');\n const host = createSvgElement('defs');\n const padding = strokeWidth / 2;\n const mask = createSvgElement('mask', {\n height: bounds.height + strokeWidth,\n id: maskId,\n maskContentUnits: 'userSpaceOnUse',\n maskUnits: 'userSpaceOnUse',\n width: bounds.width + strokeWidth,\n x: -padding,\n y: -padding,\n });\n const traces = paths.map(({ d }) => {\n const trace = createSvgElement('path', {\n d,\n fill: 'none',\n pathLength: 1,\n stroke: 'white',\n 'stroke-dasharray': '1 1',\n 'stroke-dashoffset': 1,\n 'stroke-width': strokeWidth,\n });\n mask.appendChild(trace);\n return trace;\n });\n host.appendChild(mask);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('mask', `url(#${maskId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('mask');\n host.remove();\n signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: 1,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n const e = progress(0);\n for (const [i, trace] of traces.entries()) {\n const { start, end } = paths[i];\n const revealed = Math.max(0, Math.min(1, (e - start) / (end - start)));\n trace.setAttribute('stroke-dashoffset', String(1 - revealed));\n }\n },\n signal,\n });\n return finish;\n}\n\nexport interface GrowRevealLane {\n anchor: number;\n height: number;\n width: number;\n x: number;\n y: number;\n}\n\n/** Reveals finished bars from their own baseline without distorting rounded corners. */\nexport function playGrowReveal(\n parent: SVGGElement,\n lanes: readonly GrowRevealLane[],\n paintFinal: () => void,\n motion: TransitionConfig & { duration: number },\n options: { axis: 'x' | 'y'; signal?: AbortSignal; stagger?: number },\n): () => void {\n cancelReveal(parent);\n paintFinal();\n if (motion.duration <= 0 || lanes.length === 0 || options.signal?.aborted) return () => {};\n\n const clipId = uniqueId('prism-reveal');\n const host = createSvgElement('defs');\n const clipPath = createSvgElement('clipPath', { id: clipId });\n const rects = lanes.map((lane) => {\n const rect = createSvgElement('rect', { height: 0, width: 0, x: lane.x, y: lane.y });\n clipPath.appendChild(rect);\n return rect;\n });\n host.appendChild(clipPath);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('clip-path', `url(#${clipId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('clip-path');\n host.remove();\n options.signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n options.signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: lanes.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n for (const [i, rect] of rects.entries()) {\n const lane = lanes[i];\n const e = Math.max(0, Math.min(1, progress(i)));\n if (options.axis === 'y') {\n const top = lane.anchor + (lane.y - lane.anchor) * e;\n const bottom = lane.anchor + (lane.y + lane.height - lane.anchor) * e;\n setAttributes(rect, { height: Math.max(0, bottom - top), width: lane.width, y: top });\n } else {\n const left = lane.anchor + (lane.x - lane.anchor) * e;\n const right = lane.anchor + (lane.x + lane.width - lane.anchor) * e;\n setAttributes(rect, { height: lane.height, width: Math.max(0, right - left), x: left });\n }\n }\n },\n signal: options.signal,\n stagger: options.stagger,\n });\n return finish;\n}\n"],"mappings":"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"}
@@ -1,2 +1,98 @@
1
- import{createSvgElement as e,setAttributes as t}from"../svg/element.js";import{resolveEasing as n}from"./easing.js";import{startTween as r}from"./transition.js";import{uniqueId as i}from"../core/ids.js";var a=new WeakMap;function cancelReveal(e){a.get(e)?.()}function playTraceReveal(t,o,s,c,l,u){if(cancelReveal(t),l.duration<=0||u?.aborted)return()=>{};let d=i(`prism-trace`),f=e(`defs`),p=c/2,m=e(`mask`,{height:o.height+c,id:d,maskContentUnits:`userSpaceOnUse`,maskUnits:`userSpaceOnUse`,width:o.width+c,x:-p,y:-p}),h=s.map(({d:t})=>{let n=e(`path`,{d:t,fill:`none`,pathLength:1,stroke:`white`,"stroke-dasharray":`1 1`,"stroke-dashoffset":1,"stroke-width":c});return m.appendChild(n),n});f.appendChild(m),t.insertBefore(f,t.firstChild),t.setAttribute(`mask`,`url(#${d})`);let cancelTween=()=>{},finish=()=>{a.delete(t),t.removeAttribute(`mask`),f.remove(),u?.removeEventListener(`abort`,finish),cancelTween()};return a.set(t,finish),u?.addEventListener(`abort`,finish,{once:!0}),cancelTween=r({count:1,duration:l.duration,easing:n(l.easing),onComplete:finish,onFrame:e=>{let t=e(0);for(let[e,n]of h.entries()){let{start:r,end:i}=s[e],a=Math.max(0,Math.min(1,(t-r)/(i-r)));n.setAttribute(`stroke-dashoffset`,String(1-a))}},signal:u}),finish}function playGrowReveal(o,s,c,l,u){if(cancelReveal(o),c(),l.duration<=0||s.length===0||u.signal?.aborted)return()=>{};let d=i(`prism-reveal`),f=e(`defs`),p=e(`clipPath`,{id:d}),m=s.map(t=>{let n=e(`rect`,{height:0,width:0,x:t.x,y:t.y});return p.appendChild(n),n});f.appendChild(p),o.insertBefore(f,o.firstChild),o.setAttribute(`clip-path`,`url(#${d})`);let cancelTween=()=>{},finish=()=>{a.delete(o),o.removeAttribute(`clip-path`),f.remove(),u.signal?.removeEventListener(`abort`,finish),cancelTween()};return a.set(o,finish),u.signal?.addEventListener(`abort`,finish,{once:!0}),cancelTween=r({count:s.length,duration:l.duration,easing:n(l.easing),onComplete:finish,onFrame:e=>{for(let[n,r]of m.entries()){let i=s[n],a=Math.max(0,Math.min(1,e(n)));if(u.axis===`y`){let e=i.anchor+(i.y-i.anchor)*a,n=i.anchor+(i.y+i.height-i.anchor)*a;t(r,{height:Math.max(0,n-e),width:i.width,y:e})}else{let e=i.anchor+(i.x-i.anchor)*a,n=i.anchor+(i.x+i.width-i.anchor)*a;t(r,{height:i.height,width:Math.max(0,n-e),x:e})}}},signal:u.signal,stagger:u.stagger}),finish}export{cancelReveal,playGrowReveal,playTraceReveal};
1
+ import { createSvgElement as e, setAttributes as t } from "../svg/element.js";
2
+ import { resolveEasing as n } from "./easing.js";
3
+ import { startTween as r } from "./transition.js";
4
+ import { uniqueId as i } from "../core/ids.js";
5
+ //#region src/animation/reveal.ts
6
+ var a = /* @__PURE__ */ new WeakMap();
7
+ function cancelReveal(e) {
8
+ a.get(e)?.();
9
+ }
10
+ function playTraceReveal(t, o, s, c, l, u) {
11
+ if (cancelReveal(t), l.duration <= 0 || u?.aborted) return () => {};
12
+ let d = i("prism-trace"), f = e("defs"), p = c / 2, m = e("mask", {
13
+ height: o.height + c,
14
+ id: d,
15
+ maskContentUnits: "userSpaceOnUse",
16
+ maskUnits: "userSpaceOnUse",
17
+ width: o.width + c,
18
+ x: -p,
19
+ y: -p
20
+ }), h = s.map(({ d: t }) => {
21
+ let n = e("path", {
22
+ d: t,
23
+ fill: "none",
24
+ pathLength: 1,
25
+ stroke: "white",
26
+ "stroke-dasharray": "1 1",
27
+ "stroke-dashoffset": 1,
28
+ "stroke-width": c
29
+ });
30
+ return m.appendChild(n), n;
31
+ });
32
+ f.appendChild(m), t.insertBefore(f, t.firstChild), t.setAttribute("mask", `url(#${d})`);
33
+ let cancelTween = () => {}, finish = () => {
34
+ a.delete(t), t.removeAttribute("mask"), f.remove(), u?.removeEventListener("abort", finish), cancelTween();
35
+ };
36
+ return a.set(t, finish), u?.addEventListener("abort", finish, { once: !0 }), cancelTween = r({
37
+ count: 1,
38
+ duration: l.duration,
39
+ easing: n(l.easing),
40
+ onComplete: finish,
41
+ onFrame: (e) => {
42
+ let t = e(0);
43
+ for (let [e, n] of h.entries()) {
44
+ let { start: r, end: i } = s[e], a = Math.max(0, Math.min(1, (t - r) / (i - r)));
45
+ n.setAttribute("stroke-dashoffset", String(1 - a));
46
+ }
47
+ },
48
+ signal: u
49
+ }), finish;
50
+ }
51
+ function playGrowReveal(o, s, c, l, u) {
52
+ if (cancelReveal(o), c(), l.duration <= 0 || s.length === 0 || u.signal?.aborted) return () => {};
53
+ let d = i("prism-reveal"), f = e("defs"), p = e("clipPath", { id: d }), m = s.map((t) => {
54
+ let n = e("rect", {
55
+ height: 0,
56
+ width: 0,
57
+ x: t.x,
58
+ y: t.y
59
+ });
60
+ return p.appendChild(n), n;
61
+ });
62
+ f.appendChild(p), o.insertBefore(f, o.firstChild), o.setAttribute("clip-path", `url(#${d})`);
63
+ let cancelTween = () => {}, finish = () => {
64
+ a.delete(o), o.removeAttribute("clip-path"), f.remove(), u.signal?.removeEventListener("abort", finish), cancelTween();
65
+ };
66
+ return a.set(o, finish), u.signal?.addEventListener("abort", finish, { once: !0 }), cancelTween = r({
67
+ count: s.length,
68
+ duration: l.duration,
69
+ easing: n(l.easing),
70
+ onComplete: finish,
71
+ onFrame: (e) => {
72
+ for (let [n, r] of m.entries()) {
73
+ let i = s[n], a = Math.max(0, Math.min(1, e(n)));
74
+ if (u.axis === "y") {
75
+ let e = i.anchor + (i.y - i.anchor) * a, n = i.anchor + (i.y + i.height - i.anchor) * a;
76
+ t(r, {
77
+ height: Math.max(0, n - e),
78
+ width: i.width,
79
+ y: e
80
+ });
81
+ } else {
82
+ let e = i.anchor + (i.x - i.anchor) * a, n = i.anchor + (i.x + i.width - i.anchor) * a;
83
+ t(r, {
84
+ height: i.height,
85
+ width: Math.max(0, n - e),
86
+ x: e
87
+ });
88
+ }
89
+ }
90
+ },
91
+ signal: u.signal,
92
+ stagger: u.stagger
93
+ }), finish;
94
+ }
95
+ //#endregion
96
+ export { cancelReveal, playGrowReveal, playTraceReveal };
97
+
2
98
  //# sourceMappingURL=reveal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reveal.js","names":[],"sources":["../../src/animation/reveal.ts"],"sourcesContent":["import { uniqueId } from '../core/ids';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { TransitionConfig } from '../types';\nimport { resolveEasing } from './easing';\nimport { startTween } from './transition';\n\nconst activeReveals = new WeakMap<Element, () => void>();\n\nexport function cancelReveal(parent: Element): void {\n activeReveals.get(parent)?.();\n}\n\n/** Traces final line geometry without replacing its dash or per-datum styling. */\nexport function playTraceReveal(\n parent: SVGGElement,\n bounds: { height: number; width: number },\n paths: readonly { d: string; end: number; start: number }[],\n strokeWidth: number,\n motion: TransitionConfig & { duration: number },\n signal?: AbortSignal,\n): () => void {\n cancelReveal(parent);\n if (motion.duration <= 0 || signal?.aborted) return () => {};\n\n const maskId = uniqueId('prism-trace');\n const host = createSvgElement('defs');\n const padding = strokeWidth / 2;\n const mask = createSvgElement('mask', {\n height: bounds.height + strokeWidth,\n id: maskId,\n maskContentUnits: 'userSpaceOnUse',\n maskUnits: 'userSpaceOnUse',\n width: bounds.width + strokeWidth,\n x: -padding,\n y: -padding,\n });\n const traces = paths.map(({ d }) => {\n const trace = createSvgElement('path', {\n d,\n fill: 'none',\n pathLength: 1,\n stroke: 'white',\n 'stroke-dasharray': '1 1',\n 'stroke-dashoffset': 1,\n 'stroke-width': strokeWidth,\n });\n mask.appendChild(trace);\n return trace;\n });\n host.appendChild(mask);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('mask', `url(#${maskId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('mask');\n host.remove();\n signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: 1,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n const e = progress(0);\n for (const [i, trace] of traces.entries()) {\n const { start, end } = paths[i];\n const revealed = Math.max(0, Math.min(1, (e - start) / (end - start)));\n trace.setAttribute('stroke-dashoffset', String(1 - revealed));\n }\n },\n signal,\n });\n return finish;\n}\n\nexport interface GrowRevealLane {\n anchor: number;\n height: number;\n width: number;\n x: number;\n y: number;\n}\n\n/** Reveals finished bars from their own baseline without distorting rounded corners. */\nexport function playGrowReveal(\n parent: SVGGElement,\n lanes: readonly GrowRevealLane[],\n paintFinal: () => void,\n motion: TransitionConfig & { duration: number },\n options: { axis: 'x' | 'y'; signal?: AbortSignal; stagger?: number },\n): () => void {\n cancelReveal(parent);\n paintFinal();\n if (motion.duration <= 0 || lanes.length === 0 || options.signal?.aborted) return () => {};\n\n const clipId = uniqueId('prism-reveal');\n const host = createSvgElement('defs');\n const clipPath = createSvgElement('clipPath', { id: clipId });\n const rects = lanes.map((lane) => {\n const rect = createSvgElement('rect', { height: 0, width: 0, x: lane.x, y: lane.y });\n clipPath.appendChild(rect);\n return rect;\n });\n host.appendChild(clipPath);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('clip-path', `url(#${clipId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('clip-path');\n host.remove();\n options.signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n options.signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: lanes.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n for (const [i, rect] of rects.entries()) {\n const lane = lanes[i];\n const e = Math.max(0, Math.min(1, progress(i)));\n if (options.axis === 'y') {\n const top = lane.anchor + (lane.y - lane.anchor) * e;\n const bottom = lane.anchor + (lane.y + lane.height - lane.anchor) * e;\n setAttributes(rect, { height: Math.max(0, bottom - top), width: lane.width, y: top });\n } else {\n const left = lane.anchor + (lane.x - lane.anchor) * e;\n const right = lane.anchor + (lane.x + lane.width - lane.anchor) * e;\n setAttributes(rect, { height: lane.height, width: Math.max(0, right - left), x: left });\n }\n }\n },\n signal: options.signal,\n stagger: options.stagger,\n });\n return finish;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"reveal.js","names":["activeReveals","parent","motion","signal","maskId","uniqueId","host","createSvgElement","padding","strokeWidth","mask","bounds","traces","paths","trace","startTween","resolveEasing","e","progress","i","revealed","start","end","paintFinal","lanes","options","clipId","clipPath","rects","rect","lane","top","bottom","left","right"],"sources":["../../src/animation/reveal.ts"],"sourcesContent":["import { uniqueId } from '../core/ids';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { TransitionConfig } from '../types';\nimport { resolveEasing } from './easing';\nimport { startTween } from './transition';\n\nconst activeReveals = new WeakMap<Element, () => void>();\n\nexport function cancelReveal(parent: Element): void {\n activeReveals.get(parent)?.();\n}\n\n/** Traces final line geometry without replacing its dash or per-datum styling. */\nexport function playTraceReveal(\n parent: SVGGElement,\n bounds: { height: number; width: number },\n paths: readonly { d: string; end: number; start: number }[],\n strokeWidth: number,\n motion: TransitionConfig & { duration: number },\n signal?: AbortSignal,\n): () => void {\n cancelReveal(parent);\n if (motion.duration <= 0 || signal?.aborted) return () => {};\n\n const maskId = uniqueId('prism-trace');\n const host = createSvgElement('defs');\n const padding = strokeWidth / 2;\n const mask = createSvgElement('mask', {\n height: bounds.height + strokeWidth,\n id: maskId,\n maskContentUnits: 'userSpaceOnUse',\n maskUnits: 'userSpaceOnUse',\n width: bounds.width + strokeWidth,\n x: -padding,\n y: -padding,\n });\n const traces = paths.map(({ d }) => {\n const trace = createSvgElement('path', {\n d,\n fill: 'none',\n pathLength: 1,\n stroke: 'white',\n 'stroke-dasharray': '1 1',\n 'stroke-dashoffset': 1,\n 'stroke-width': strokeWidth,\n });\n mask.appendChild(trace);\n return trace;\n });\n host.appendChild(mask);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('mask', `url(#${maskId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('mask');\n host.remove();\n signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: 1,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n const e = progress(0);\n for (const [i, trace] of traces.entries()) {\n const { start, end } = paths[i];\n const revealed = Math.max(0, Math.min(1, (e - start) / (end - start)));\n trace.setAttribute('stroke-dashoffset', String(1 - revealed));\n }\n },\n signal,\n });\n return finish;\n}\n\nexport interface GrowRevealLane {\n anchor: number;\n height: number;\n width: number;\n x: number;\n y: number;\n}\n\n/** Reveals finished bars from their own baseline without distorting rounded corners. */\nexport function playGrowReveal(\n parent: SVGGElement,\n lanes: readonly GrowRevealLane[],\n paintFinal: () => void,\n motion: TransitionConfig & { duration: number },\n options: { axis: 'x' | 'y'; signal?: AbortSignal; stagger?: number },\n): () => void {\n cancelReveal(parent);\n paintFinal();\n if (motion.duration <= 0 || lanes.length === 0 || options.signal?.aborted) return () => {};\n\n const clipId = uniqueId('prism-reveal');\n const host = createSvgElement('defs');\n const clipPath = createSvgElement('clipPath', { id: clipId });\n const rects = lanes.map((lane) => {\n const rect = createSvgElement('rect', { height: 0, width: 0, x: lane.x, y: lane.y });\n clipPath.appendChild(rect);\n return rect;\n });\n host.appendChild(clipPath);\n parent.insertBefore(host, parent.firstChild);\n parent.setAttribute('clip-path', `url(#${clipId})`);\n\n let cancelTween: () => void = () => {};\n const finish = (): void => {\n activeReveals.delete(parent);\n parent.removeAttribute('clip-path');\n host.remove();\n options.signal?.removeEventListener('abort', finish);\n cancelTween();\n };\n activeReveals.set(parent, finish);\n options.signal?.addEventListener('abort', finish, { once: true });\n cancelTween = startTween({\n count: lanes.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete: finish,\n onFrame: (progress) => {\n for (const [i, rect] of rects.entries()) {\n const lane = lanes[i];\n const e = Math.max(0, Math.min(1, progress(i)));\n if (options.axis === 'y') {\n const top = lane.anchor + (lane.y - lane.anchor) * e;\n const bottom = lane.anchor + (lane.y + lane.height - lane.anchor) * e;\n setAttributes(rect, { height: Math.max(0, bottom - top), width: lane.width, y: top });\n } else {\n const left = lane.anchor + (lane.x - lane.anchor) * e;\n const right = lane.anchor + (lane.x + lane.width - lane.anchor) * e;\n setAttributes(rect, { height: lane.height, width: Math.max(0, right - left), x: left });\n }\n }\n },\n signal: options.signal,\n stagger: options.stagger,\n });\n return finish;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"transition.cjs","names":[],"sources":["../../src/animation/transition.ts"],"sourcesContent":["import type { TransitionConfig } from '../types';\nimport type { EasingFn } from './easing';\nimport { resolveEasing } from './easing';\nimport { resolveMotion } from './motion';\nimport { tweenNumber } from './tween';\n\nexport interface AnimationTarget {\n attrs: Record<string, { from: number; to: number }>;\n el: SVGElement;\n}\n\nexport interface TweenOptions {\n /** Number of staggered lanes; the loop runs until the last lane finishes. */\n count: number;\n /** Milliseconds per lane. A non-positive value completes synchronously. */\n duration: number;\n easing: EasingFn;\n onComplete?: () => void;\n /**\n * Runs once per frame (and once synchronously for a zero-length tween). Receives a\n * `progress(lane)` resolver returning that lane's eased 0-1 value, so callers\n * interpolate their own values without re-deriving elapsed time.\n */\n onFrame: (progress: (lane: number) => number) => void;\n /** Aborted when the owning chart is disposed: cancels the in-flight frame. */\n signal?: AbortSignal;\n /** Per-lane delay in milliseconds; each lane starts `stagger` ms after the previous. */\n stagger?: number;\n}\n\n/**\n * The package's single `requestAnimationFrame` tween loop. Every animated surface\n * (bar, line, area, pie, radar, sparkline) drives its transition through here, so\n * disposal-correctness is enforced in exactly one place: an aborted `signal` cancels\n * the in-flight frame and stops rescheduling.\n *\n * Elapsed time comes from the timestamp the browser passes to the frame callback,\n * never a captured `performance.now()`. Returns a `cancel()` function for superseding\n * a tween before it ends.\n */\nexport function startTween(options: TweenOptions): () => void {\n const { count, duration, easing, stagger = 0, signal, onFrame, onComplete } = options;\n\n if (signal?.aborted) return () => {};\n\n // A zero-length (or reduced-motion) tween applies its final frame synchronously: no rAF.\n if (duration <= 0) {\n onFrame(() => 1);\n onComplete?.();\n\n return () => {};\n }\n\n if (count === 0) {\n onComplete?.();\n\n return () => {};\n }\n\n const totalDuration = duration + stagger * (count - 1);\n let startTime: number | null = null;\n let rafId: number | null = null;\n let cancelled = false;\n\n const cancel = (): void => {\n cancelled = true;\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n signal?.removeEventListener('abort', cancel);\n };\n\n const frame = (timestamp: number): void => {\n if (cancelled || signal?.aborted) return;\n\n if (startTime === null) startTime = timestamp;\n\n const elapsed = timestamp - startTime;\n\n onFrame((lane) => easing(Math.max(0, Math.min(1, (elapsed - lane * stagger) / duration))));\n\n if (elapsed < totalDuration) {\n rafId = requestAnimationFrame(frame);\n } else {\n rafId = null;\n signal?.removeEventListener('abort', cancel);\n onComplete?.();\n }\n };\n\n signal?.addEventListener('abort', cancel, { once: true });\n rafId = requestAnimationFrame(frame);\n\n return cancel;\n}\n\n/**\n * Runs a batch of numeric-attribute tweens through {@link startTween}, sharing one\n * `requestAnimationFrame` loop. Returns the loop's `cancel()` function.\n */\nexport function animate(\n targets: AnimationTarget[],\n config?: TransitionConfig,\n onComplete?: () => void,\n signal?: AbortSignal,\n): () => void {\n const motion = resolveMotion(config);\n\n return startTween({\n count: targets.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete,\n onFrame: (progress) => {\n for (const [lane, target] of targets.entries()) {\n const eased = progress(lane);\n\n for (const [attr, { from, to }] of Object.entries(target.attrs)) {\n target.el.setAttribute(attr, String(tweenNumber(from, to, eased)));\n }\n }\n },\n signal,\n stagger: motion.stagger,\n });\n}\n"],"mappings":"mFAwCA,SAAgB,WAAW,EAAmC,CAC5D,GAAM,CAAE,QAAO,WAAU,SAAQ,UAAU,EAAG,SAAQ,UAAS,cAAe,EAE9E,GAAI,GAAQ,QAAS,UAAa,CAAC,EAGnC,GAAI,GAAY,EAId,OAHA,MAAc,CAAC,EACf,IAAa,MAEA,CAAC,EAGhB,GAAI,IAAU,EAGZ,OAFA,IAAa,MAEA,CAAC,EAGhB,IAAM,EAAgB,EAAW,GAAW,EAAQ,GAChD,EAA2B,KAC3B,EAAuB,KACvB,EAAY,GAEV,WAAqB,CACzB,EAAY,GAER,IAAU,OACZ,qBAAqB,CAAK,EAC1B,EAAQ,MAGV,GAAQ,oBAAoB,QAAS,MAAM,CAC7C,EAEM,MAAS,GAA4B,CACzC,GAAI,GAAa,GAAQ,QAAS,OAE9B,IAAc,OAAM,EAAY,GAEpC,IAAM,EAAU,EAAY,EAE5B,EAAS,GAAS,EAAO,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,EAAU,EAAO,GAAW,CAAQ,CAAC,CAAC,CAAC,EAErF,EAAU,EACZ,EAAQ,sBAAsB,KAAK,GAEnC,EAAQ,KACR,GAAQ,oBAAoB,QAAS,MAAM,EAC3C,IAAa,EAEjB,EAKA,OAHA,GAAQ,iBAAiB,QAAS,OAAQ,CAAE,KAAM,EAAK,CAAC,EACxD,EAAQ,sBAAsB,KAAK,EAE5B,MACT,CAMA,SAAgB,QACd,EACA,EACA,EACA,EACY,CACZ,IAAM,EAAS,EAAA,cAAc,CAAM,EAEnC,OAAO,WAAW,CAChB,MAAO,EAAQ,OACf,SAAU,EAAO,SACjB,OAAQ,EAAA,cAAc,EAAO,MAAM,EACnC,aACA,QAAU,GAAa,CACrB,IAAK,GAAM,CAAC,EAAM,KAAW,EAAQ,QAAQ,EAAG,CAC9C,IAAM,EAAQ,EAAS,CAAI,EAE3B,IAAK,GAAM,CAAC,EAAM,CAAE,OAAM,SAAS,OAAO,QAAQ,EAAO,KAAK,EAC5D,EAAO,GAAG,aAAa,EAAM,OAAO,EAAA,YAAY,EAAM,EAAI,CAAK,CAAC,CAAC,CAErE,CACF,EACA,SACA,QAAS,EAAO,OAClB,CAAC,CACH"}
1
+ {"version":3,"file":"transition.cjs","names":["resolveMotion","resolveEasing","tweenNumber","require_easing","require_motion","require_tween","options","signal","duration","onFrame","onComplete","count","totalDuration","stagger","startTime","rafId","cancelled","timestamp","elapsed","easing","lane","motion","config","targets","target","eased","progress","attr","from","to"],"sources":["../../src/animation/transition.ts"],"sourcesContent":["import type { TransitionConfig } from '../types';\nimport type { EasingFn } from './easing';\nimport { resolveEasing } from './easing';\nimport { resolveMotion } from './motion';\nimport { tweenNumber } from './tween';\n\nexport interface AnimationTarget {\n attrs: Record<string, { from: number; to: number }>;\n el: SVGElement;\n}\n\nexport interface TweenOptions {\n /** Number of staggered lanes; the loop runs until the last lane finishes. */\n count: number;\n /** Milliseconds per lane. A non-positive value completes synchronously. */\n duration: number;\n easing: EasingFn;\n onComplete?: () => void;\n /**\n * Runs once per frame (and once synchronously for a zero-length tween). Receives a\n * `progress(lane)` resolver returning that lane's eased 0-1 value, so callers\n * interpolate their own values without re-deriving elapsed time.\n */\n onFrame: (progress: (lane: number) => number) => void;\n /** Aborted when the owning chart is disposed: cancels the in-flight frame. */\n signal?: AbortSignal;\n /** Per-lane delay in milliseconds; each lane starts `stagger` ms after the previous. */\n stagger?: number;\n}\n\n/**\n * The package's single `requestAnimationFrame` tween loop. Every animated surface\n * (bar, line, area, pie, radar, sparkline) drives its transition through here, so\n * disposal-correctness is enforced in exactly one place: an aborted `signal` cancels\n * the in-flight frame and stops rescheduling.\n *\n * Elapsed time comes from the timestamp the browser passes to the frame callback,\n * never a captured `performance.now()`. Returns a `cancel()` function for superseding\n * a tween before it ends.\n */\nexport function startTween(options: TweenOptions): () => void {\n const { count, duration, easing, stagger = 0, signal, onFrame, onComplete } = options;\n\n if (signal?.aborted) return () => {};\n\n // A zero-length (or reduced-motion) tween applies its final frame synchronously: no rAF.\n if (duration <= 0) {\n onFrame(() => 1);\n onComplete?.();\n\n return () => {};\n }\n\n if (count === 0) {\n onComplete?.();\n\n return () => {};\n }\n\n const totalDuration = duration + stagger * (count - 1);\n let startTime: number | null = null;\n let rafId: number | null = null;\n let cancelled = false;\n\n const cancel = (): void => {\n cancelled = true;\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n signal?.removeEventListener('abort', cancel);\n };\n\n const frame = (timestamp: number): void => {\n if (cancelled || signal?.aborted) return;\n\n if (startTime === null) startTime = timestamp;\n\n const elapsed = timestamp - startTime;\n\n onFrame((lane) => easing(Math.max(0, Math.min(1, (elapsed - lane * stagger) / duration))));\n\n if (elapsed < totalDuration) {\n rafId = requestAnimationFrame(frame);\n } else {\n rafId = null;\n signal?.removeEventListener('abort', cancel);\n onComplete?.();\n }\n };\n\n signal?.addEventListener('abort', cancel, { once: true });\n rafId = requestAnimationFrame(frame);\n\n return cancel;\n}\n\n/**\n * Runs a batch of numeric-attribute tweens through {@link startTween}, sharing one\n * `requestAnimationFrame` loop. Returns the loop's `cancel()` function.\n */\nexport function animate(\n targets: AnimationTarget[],\n config?: TransitionConfig,\n onComplete?: () => void,\n signal?: AbortSignal,\n): () => void {\n const motion = resolveMotion(config);\n\n return startTween({\n count: targets.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete,\n onFrame: (progress) => {\n for (const [lane, target] of targets.entries()) {\n const eased = progress(lane);\n\n for (const [attr, { from, to }] of Object.entries(target.attrs)) {\n target.el.setAttribute(attr, String(tweenNumber(from, to, eased)));\n }\n }\n },\n signal,\n stagger: motion.stagger,\n });\n}\n"],"mappings":"A,mFAwCA,SAAgB,WAAW,EAAmC,CAC5D,GAAM,CAAE,QAAO,WAAU,SAAQ,UAAU,EAAG,SAAQ,UAAS,cAAeM,EAE9E,GAAIC,GAAQ,QAAS,UAAa,CAAC,EAGnC,GAAIC,GAAY,EAId,OAHAC,MAAc,CAAC,EACfC,IAAa,MAEA,CAAC,EAGhB,GAAIC,IAAU,EAGZ,OAFAD,IAAa,MAEA,CAAC,EAGhB,IAAME,EAAgBJ,EAAWK,GAAWF,EAAQ,GAChDG,EAA2B,KAC3BC,EAAuB,KACvBC,EAAY,GAEV,WAAqB,CACzB,EAAY,GAERD,IAAU,OACZ,qBAAqBA,CAAK,EAC1B,EAAQ,MAGVR,GAAQ,oBAAoB,QAAS,MAAM,CAC7C,EAEM,MAAS,GAA4B,CACzC,GAAIS,GAAaT,GAAQ,QAAS,OAE9BO,IAAc,OAAM,EAAYG,GAEpC,IAAMC,EAAUD,EAAYH,EAE5BL,EAAS,GAASU,EAAO,KAAK,IAAI,EAAG,KAAK,IAAI,GAAID,EAAUE,EAAOP,GAAWL,CAAQ,CAAC,CAAC,CAAC,EAErFU,EAAUN,EACZ,EAAQ,sBAAsB,KAAK,GAEnC,EAAQ,KACRL,GAAQ,oBAAoB,QAAS,MAAM,EAC3CG,IAAa,EAEjB,EAKA,OAHAH,GAAQ,iBAAiB,QAAS,OAAQ,CAAE,KAAM,EAAK,CAAC,EACxD,EAAQ,sBAAsB,KAAK,EAE5B,MACT,CAMA,SAAgB,QACd,EACA,EACA,EACA,EACY,CACZ,IAAMc,EAASrB,EAAAA,cAAcsB,CAAM,EAEnC,OAAO,WAAW,CAChB,MAAOC,EAAQ,OACf,SAAUF,EAAO,SACjB,OAAQpB,EAAAA,cAAcoB,EAAO,MAAM,EACnC,aACA,QAAU,GAAa,CACrB,IAAK,GAAM,CAACD,EAAMI,KAAWD,EAAQ,QAAQ,EAAG,CAC9C,IAAME,EAAQC,EAASN,CAAI,EAE3B,IAAK,GAAM,CAACO,EAAM,CAAE,OAAM,SAAS,OAAO,QAAQH,EAAO,KAAK,EAC5DA,EAAO,GAAG,aAAaG,EAAM,OAAOzB,EAAAA,YAAY0B,EAAMC,EAAIJ,CAAK,CAAC,CAAC,CAErE,CACF,EACA,SACA,QAASJ,EAAO,OAClB,CAAC,CACH,C"}
@@ -1,2 +1,40 @@
1
- import{resolveEasing as e}from"./easing.js";import{resolveMotion as t}from"./motion.js";import{tweenNumber as n}from"./tween.js";function startTween(e){let{count:t,duration:n,easing:r,stagger:i=0,signal:a,onFrame:o,onComplete:s}=e;if(a?.aborted)return()=>{};if(n<=0)return o(()=>1),s?.(),()=>{};if(t===0)return s?.(),()=>{};let c=n+i*(t-1),l=null,u=null,d=!1,cancel=()=>{d=!0,u!==null&&(cancelAnimationFrame(u),u=null),a?.removeEventListener(`abort`,cancel)},frame=e=>{if(d||a?.aborted)return;l===null&&(l=e);let t=e-l;o(e=>r(Math.max(0,Math.min(1,(t-e*i)/n)))),t<c?u=requestAnimationFrame(frame):(u=null,a?.removeEventListener(`abort`,cancel),s?.())};return a?.addEventListener(`abort`,cancel,{once:!0}),u=requestAnimationFrame(frame),cancel}function animate(r,i,a,o){let s=t(i);return startTween({count:r.length,duration:s.duration,easing:e(s.easing),onComplete:a,onFrame:e=>{for(let[t,i]of r.entries()){let r=e(t);for(let[e,{from:t,to:a}]of Object.entries(i.attrs))i.el.setAttribute(e,String(n(t,a,r)))}},signal:o,stagger:s.stagger})}export{animate,startTween};
1
+ import { resolveEasing as e } from "./easing.js";
2
+ import { resolveMotion as t } from "./motion.js";
3
+ import { tweenNumber as n } from "./tween.js";
4
+ //#region src/animation/transition.ts
5
+ function startTween(e) {
6
+ let { count: t, duration: n, easing: r, stagger: i = 0, signal: a, onFrame: o, onComplete: s } = e;
7
+ if (a?.aborted) return () => {};
8
+ if (n <= 0) return o(() => 1), s?.(), () => {};
9
+ if (t === 0) return s?.(), () => {};
10
+ let c = n + i * (t - 1), l = null, u = null, d = !1, cancel = () => {
11
+ d = !0, u !== null && (cancelAnimationFrame(u), u = null), a?.removeEventListener("abort", cancel);
12
+ }, frame = (e) => {
13
+ if (d || a?.aborted) return;
14
+ l === null && (l = e);
15
+ let t = e - l;
16
+ o((e) => r(Math.max(0, Math.min(1, (t - e * i) / n)))), t < c ? u = requestAnimationFrame(frame) : (u = null, a?.removeEventListener("abort", cancel), s?.());
17
+ };
18
+ return a?.addEventListener("abort", cancel, { once: !0 }), u = requestAnimationFrame(frame), cancel;
19
+ }
20
+ function animate(r, i, a, o) {
21
+ let s = t(i);
22
+ return startTween({
23
+ count: r.length,
24
+ duration: s.duration,
25
+ easing: e(s.easing),
26
+ onComplete: a,
27
+ onFrame: (e) => {
28
+ for (let [t, i] of r.entries()) {
29
+ let r = e(t);
30
+ for (let [e, { from: t, to: a }] of Object.entries(i.attrs)) i.el.setAttribute(e, String(n(t, a, r)));
31
+ }
32
+ },
33
+ signal: o,
34
+ stagger: s.stagger
35
+ });
36
+ }
37
+ //#endregion
38
+ export { animate, startTween };
39
+
2
40
  //# sourceMappingURL=transition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transition.js","names":[],"sources":["../../src/animation/transition.ts"],"sourcesContent":["import type { TransitionConfig } from '../types';\nimport type { EasingFn } from './easing';\nimport { resolveEasing } from './easing';\nimport { resolveMotion } from './motion';\nimport { tweenNumber } from './tween';\n\nexport interface AnimationTarget {\n attrs: Record<string, { from: number; to: number }>;\n el: SVGElement;\n}\n\nexport interface TweenOptions {\n /** Number of staggered lanes; the loop runs until the last lane finishes. */\n count: number;\n /** Milliseconds per lane. A non-positive value completes synchronously. */\n duration: number;\n easing: EasingFn;\n onComplete?: () => void;\n /**\n * Runs once per frame (and once synchronously for a zero-length tween). Receives a\n * `progress(lane)` resolver returning that lane's eased 0-1 value, so callers\n * interpolate their own values without re-deriving elapsed time.\n */\n onFrame: (progress: (lane: number) => number) => void;\n /** Aborted when the owning chart is disposed: cancels the in-flight frame. */\n signal?: AbortSignal;\n /** Per-lane delay in milliseconds; each lane starts `stagger` ms after the previous. */\n stagger?: number;\n}\n\n/**\n * The package's single `requestAnimationFrame` tween loop. Every animated surface\n * (bar, line, area, pie, radar, sparkline) drives its transition through here, so\n * disposal-correctness is enforced in exactly one place: an aborted `signal` cancels\n * the in-flight frame and stops rescheduling.\n *\n * Elapsed time comes from the timestamp the browser passes to the frame callback,\n * never a captured `performance.now()`. Returns a `cancel()` function for superseding\n * a tween before it ends.\n */\nexport function startTween(options: TweenOptions): () => void {\n const { count, duration, easing, stagger = 0, signal, onFrame, onComplete } = options;\n\n if (signal?.aborted) return () => {};\n\n // A zero-length (or reduced-motion) tween applies its final frame synchronously: no rAF.\n if (duration <= 0) {\n onFrame(() => 1);\n onComplete?.();\n\n return () => {};\n }\n\n if (count === 0) {\n onComplete?.();\n\n return () => {};\n }\n\n const totalDuration = duration + stagger * (count - 1);\n let startTime: number | null = null;\n let rafId: number | null = null;\n let cancelled = false;\n\n const cancel = (): void => {\n cancelled = true;\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n signal?.removeEventListener('abort', cancel);\n };\n\n const frame = (timestamp: number): void => {\n if (cancelled || signal?.aborted) return;\n\n if (startTime === null) startTime = timestamp;\n\n const elapsed = timestamp - startTime;\n\n onFrame((lane) => easing(Math.max(0, Math.min(1, (elapsed - lane * stagger) / duration))));\n\n if (elapsed < totalDuration) {\n rafId = requestAnimationFrame(frame);\n } else {\n rafId = null;\n signal?.removeEventListener('abort', cancel);\n onComplete?.();\n }\n };\n\n signal?.addEventListener('abort', cancel, { once: true });\n rafId = requestAnimationFrame(frame);\n\n return cancel;\n}\n\n/**\n * Runs a batch of numeric-attribute tweens through {@link startTween}, sharing one\n * `requestAnimationFrame` loop. Returns the loop's `cancel()` function.\n */\nexport function animate(\n targets: AnimationTarget[],\n config?: TransitionConfig,\n onComplete?: () => void,\n signal?: AbortSignal,\n): () => void {\n const motion = resolveMotion(config);\n\n return startTween({\n count: targets.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete,\n onFrame: (progress) => {\n for (const [lane, target] of targets.entries()) {\n const eased = progress(lane);\n\n for (const [attr, { from, to }] of Object.entries(target.attrs)) {\n target.el.setAttribute(attr, String(tweenNumber(from, to, eased)));\n }\n }\n },\n signal,\n stagger: motion.stagger,\n });\n}\n"],"mappings":"iIAwCA,SAAgB,WAAW,EAAmC,CAC5D,GAAM,CAAE,QAAO,WAAU,SAAQ,UAAU,EAAG,SAAQ,UAAS,cAAe,EAE9E,GAAI,GAAQ,QAAS,UAAa,CAAC,EAGnC,GAAI,GAAY,EAId,OAHA,MAAc,CAAC,EACf,IAAa,MAEA,CAAC,EAGhB,GAAI,IAAU,EAGZ,OAFA,IAAa,MAEA,CAAC,EAGhB,IAAM,EAAgB,EAAW,GAAW,EAAQ,GAChD,EAA2B,KAC3B,EAAuB,KACvB,EAAY,GAEV,WAAqB,CACzB,EAAY,GAER,IAAU,OACZ,qBAAqB,CAAK,EAC1B,EAAQ,MAGV,GAAQ,oBAAoB,QAAS,MAAM,CAC7C,EAEM,MAAS,GAA4B,CACzC,GAAI,GAAa,GAAQ,QAAS,OAE9B,IAAc,OAAM,EAAY,GAEpC,IAAM,EAAU,EAAY,EAE5B,EAAS,GAAS,EAAO,KAAK,IAAI,EAAG,KAAK,IAAI,GAAI,EAAU,EAAO,GAAW,CAAQ,CAAC,CAAC,CAAC,EAErF,EAAU,EACZ,EAAQ,sBAAsB,KAAK,GAEnC,EAAQ,KACR,GAAQ,oBAAoB,QAAS,MAAM,EAC3C,IAAa,EAEjB,EAKA,OAHA,GAAQ,iBAAiB,QAAS,OAAQ,CAAE,KAAM,EAAK,CAAC,EACxD,EAAQ,sBAAsB,KAAK,EAE5B,MACT,CAMA,SAAgB,QACd,EACA,EACA,EACA,EACY,CACZ,IAAM,EAAS,EAAc,CAAM,EAEnC,OAAO,WAAW,CAChB,MAAO,EAAQ,OACf,SAAU,EAAO,SACjB,OAAQ,EAAc,EAAO,MAAM,EACnC,aACA,QAAU,GAAa,CACrB,IAAK,GAAM,CAAC,EAAM,KAAW,EAAQ,QAAQ,EAAG,CAC9C,IAAM,EAAQ,EAAS,CAAI,EAE3B,IAAK,GAAM,CAAC,EAAM,CAAE,OAAM,SAAS,OAAO,QAAQ,EAAO,KAAK,EAC5D,EAAO,GAAG,aAAa,EAAM,OAAO,EAAY,EAAM,EAAI,CAAK,CAAC,CAAC,CAErE,CACF,EACA,SACA,QAAS,EAAO,OAClB,CAAC,CACH"}
1
+ {"version":3,"file":"transition.js","names":["options","signal","duration","onFrame","onComplete","count","totalDuration","stagger","startTime","rafId","cancelled","timestamp","elapsed","easing","lane","motion","resolveMotion","config","targets","resolveEasing","target","eased","progress","attr","tweenNumber","from","to"],"sources":["../../src/animation/transition.ts"],"sourcesContent":["import type { TransitionConfig } from '../types';\nimport type { EasingFn } from './easing';\nimport { resolveEasing } from './easing';\nimport { resolveMotion } from './motion';\nimport { tweenNumber } from './tween';\n\nexport interface AnimationTarget {\n attrs: Record<string, { from: number; to: number }>;\n el: SVGElement;\n}\n\nexport interface TweenOptions {\n /** Number of staggered lanes; the loop runs until the last lane finishes. */\n count: number;\n /** Milliseconds per lane. A non-positive value completes synchronously. */\n duration: number;\n easing: EasingFn;\n onComplete?: () => void;\n /**\n * Runs once per frame (and once synchronously for a zero-length tween). Receives a\n * `progress(lane)` resolver returning that lane's eased 0-1 value, so callers\n * interpolate their own values without re-deriving elapsed time.\n */\n onFrame: (progress: (lane: number) => number) => void;\n /** Aborted when the owning chart is disposed: cancels the in-flight frame. */\n signal?: AbortSignal;\n /** Per-lane delay in milliseconds; each lane starts `stagger` ms after the previous. */\n stagger?: number;\n}\n\n/**\n * The package's single `requestAnimationFrame` tween loop. Every animated surface\n * (bar, line, area, pie, radar, sparkline) drives its transition through here, so\n * disposal-correctness is enforced in exactly one place: an aborted `signal` cancels\n * the in-flight frame and stops rescheduling.\n *\n * Elapsed time comes from the timestamp the browser passes to the frame callback,\n * never a captured `performance.now()`. Returns a `cancel()` function for superseding\n * a tween before it ends.\n */\nexport function startTween(options: TweenOptions): () => void {\n const { count, duration, easing, stagger = 0, signal, onFrame, onComplete } = options;\n\n if (signal?.aborted) return () => {};\n\n // A zero-length (or reduced-motion) tween applies its final frame synchronously: no rAF.\n if (duration <= 0) {\n onFrame(() => 1);\n onComplete?.();\n\n return () => {};\n }\n\n if (count === 0) {\n onComplete?.();\n\n return () => {};\n }\n\n const totalDuration = duration + stagger * (count - 1);\n let startTime: number | null = null;\n let rafId: number | null = null;\n let cancelled = false;\n\n const cancel = (): void => {\n cancelled = true;\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n\n signal?.removeEventListener('abort', cancel);\n };\n\n const frame = (timestamp: number): void => {\n if (cancelled || signal?.aborted) return;\n\n if (startTime === null) startTime = timestamp;\n\n const elapsed = timestamp - startTime;\n\n onFrame((lane) => easing(Math.max(0, Math.min(1, (elapsed - lane * stagger) / duration))));\n\n if (elapsed < totalDuration) {\n rafId = requestAnimationFrame(frame);\n } else {\n rafId = null;\n signal?.removeEventListener('abort', cancel);\n onComplete?.();\n }\n };\n\n signal?.addEventListener('abort', cancel, { once: true });\n rafId = requestAnimationFrame(frame);\n\n return cancel;\n}\n\n/**\n * Runs a batch of numeric-attribute tweens through {@link startTween}, sharing one\n * `requestAnimationFrame` loop. Returns the loop's `cancel()` function.\n */\nexport function animate(\n targets: AnimationTarget[],\n config?: TransitionConfig,\n onComplete?: () => void,\n signal?: AbortSignal,\n): () => void {\n const motion = resolveMotion(config);\n\n return startTween({\n count: targets.length,\n duration: motion.duration,\n easing: resolveEasing(motion.easing),\n onComplete,\n onFrame: (progress) => {\n for (const [lane, target] of targets.entries()) {\n const eased = progress(lane);\n\n for (const [attr, { from, to }] of Object.entries(target.attrs)) {\n target.el.setAttribute(attr, String(tweenNumber(from, to, eased)));\n }\n }\n },\n signal,\n stagger: motion.stagger,\n });\n}\n"],"mappings":";;;;AAwCA,SAAgB,WAAW,GAAmC;CAC5D,IAAM,EAAE,UAAO,aAAU,WAAQ,aAAU,GAAG,WAAQ,YAAS,kBAAeA;CAE9E,IAAIC,GAAQ,SAAS,aAAa,CAAC;CAGnC,IAAIC,KAAY,GAId,OAHAC,QAAc,CAAC,GACfC,IAAa,SAEA,CAAC;CAGhB,IAAIC,MAAU,GAGZ,OAFAD,IAAa,SAEA,CAAC;CAGhB,IAAME,IAAgBJ,IAAWK,KAAWF,IAAQ,IAChDG,IAA2B,MAC3BC,IAAuB,MACvBC,IAAY,IAEV,eAAqB;EAQzB,AAPA,IAAY,IAERD,MAAU,SACZ,qBAAqBA,CAAK,GAC1B,IAAQ,OAGVR,GAAQ,oBAAoB,SAAS,MAAM;CAC7C,GAEM,SAAS,MAA4B;EACzC,IAAIS,KAAaT,GAAQ,SAAS;EAElC,AAAIO,MAAc,SAAM,IAAYG;EAEpC,IAAMC,IAAUD,IAAYH;EAI5B,AAFAL,GAAS,MAASU,EAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAID,IAAUE,IAAOP,KAAWL,CAAQ,CAAC,CAAC,CAAC,GAErFU,IAAUN,IACZ,IAAQ,sBAAsB,KAAK,KAEnC,IAAQ,MACRL,GAAQ,oBAAoB,SAAS,MAAM,GAC3CG,IAAa;CAEjB;CAKA,OAHAH,GAAQ,iBAAiB,SAAS,QAAQ,EAAE,MAAM,GAAK,CAAC,GACxD,IAAQ,sBAAsB,KAAK,GAE5B;AACT;AAMA,SAAgB,QACd,GACA,GACA,GACA,GACY;CACZ,IAAMc,IAASC,EAAcC,CAAM;CAEnC,OAAO,WAAW;EAChB,OAAOC,EAAQ;EACf,UAAUH,EAAO;EACjB,QAAQI,EAAcJ,EAAO,MAAM;EACnC;EACA,UAAU,MAAa;GACrB,KAAK,IAAM,CAACD,GAAMM,MAAWF,EAAQ,QAAQ,GAAG;IAC9C,IAAMG,IAAQC,EAASR,CAAI;IAE3B,KAAK,IAAM,CAACS,GAAM,EAAE,SAAM,YAAS,OAAO,QAAQH,EAAO,KAAK,GAC5D,EAAO,GAAG,aAAaG,GAAM,OAAOC,EAAYC,GAAMC,GAAIL,CAAK,CAAC,CAAC;GAErE;EACF;EACA;EACA,SAASN,EAAO;CAClB,CAAC;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"tween.cjs","names":[],"sources":["../../src/animation/tween.ts"],"sourcesContent":["export function tweenNumber(from: number, to: number, t: number): number {\n return from + (to - from) * t;\n}\n"],"mappings":"AAAA,SAAgB,YAAY,EAAc,EAAY,EAAmB,CACvE,OAAO,GAAQ,EAAK,GAAQ,CAC9B"}
1
+ {"version":3,"file":"tween.cjs","names":["from","to","t"],"sources":["../../src/animation/tween.ts"],"sourcesContent":["export function tweenNumber(from: number, to: number, t: number): number {\n return from + (to - from) * t;\n}\n"],"mappings":"AAAA,SAAgB,YAAY,EAAc,EAAY,EAAmB,CACvE,OAAOA,GAAQC,EAAKD,GAAQE,CAC9B,C"}
@@ -1,2 +1,8 @@
1
- function tweenNumber(e,t,n){return e+(t-e)*n}export{tweenNumber};
1
+ //#region src/animation/tween.ts
2
+ function tweenNumber(e, t, n) {
3
+ return e + (t - e) * n;
4
+ }
5
+ //#endregion
6
+ export { tweenNumber };
7
+
2
8
  //# sourceMappingURL=tween.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tween.js","names":[],"sources":["../../src/animation/tween.ts"],"sourcesContent":["export function tweenNumber(from: number, to: number, t: number): number {\n return from + (to - from) * t;\n}\n"],"mappings":"AAAA,SAAgB,YAAY,EAAc,EAAY,EAAmB,CACvE,OAAO,GAAQ,EAAK,GAAQ,CAC9B"}
1
+ {"version":3,"file":"tween.js","names":["from","to","t"],"sources":["../../src/animation/tween.ts"],"sourcesContent":["export function tweenNumber(from: number, to: number, t: number): number {\n return from + (to - from) * t;\n}\n"],"mappings":";AAAA,SAAgB,YAAY,GAAc,GAAY,GAAmB;CACvE,OAAOA,KAAQC,IAAKD,KAAQE;AAC9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"axis.cjs","names":[],"sources":["../../src/axes/axis.ts"],"sourcesContent":["import { devOnly, warn } from '../_dev';\nimport { createSvgElement, removeChildren, setAttributes } from '../svg/element';\nimport { createTextElement, estimateTextWidth } from '../svg/text';\nimport type { AxisConfig, AxisPosition } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\n/** Default `--prism-font-size-label` in px, used to estimate category label size. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 8;\n\nconst COMPACT = new Intl.NumberFormat(undefined, { maximumSignificantDigits: 3, notation: 'compact' });\n\n/**\n * Dates localize; magnitudes of 1e5 and above render in compact notation (\"123K\",\n * \"1.23M\") so a long number cannot crop against the default 50 px value-axis margin.\n * With three significant digits every compact label is at most as wide as \"99999\",\n * the widest plain label below the threshold. Opt out with `tickFormat: String`.\n */\nconst defaultTickFormat = (v: Date | number | string): string => {\n if (v instanceof Date) return v.toLocaleDateString(undefined, { month: 'short', year: 'numeric' });\n if (typeof v === 'number' && Math.abs(v) >= 1e5) return COMPACT.format(v);\n\n return String(v);\n};\n\n/**\n * The single tick source for an axis and its gridlines: explicit `tickValues` when set,\n * scale-generated ticks otherwise. Keeping grid on this same array is what stops\n * gridlines from drifting off the rendered ticks.\n */\nexport function resolveTicks(scale: AnyScale, config: AxisConfig, tickCount: number): (Date | number | string)[] {\n return config.tickValues ? [...config.tickValues] : scale.ticks(tickCount);\n}\n\n/** Development-only check that explicit tickValues match the scale they render on. */\nfunction warnOffScaleTicks(scale: AnyScale, tickValues: ReadonlyArray<Date | number | string>): void {\n devOnly(() => {\n if ('bandwidth' in scale) {\n for (const tick of tickValues) {\n if (!scale.domain.includes(tick as string)) {\n warn(`renderAxis: tickValue \"${String(tick)}\" is not a category in the band scale's domain.`);\n }\n }\n\n return;\n }\n\n const toMs = (v: Date | number): number => (v instanceof Date ? v.getTime() : v);\n const [a, b] = scale.domain;\n const lo = Math.min(toMs(a), toMs(b));\n const hi = Math.max(toMs(a), toMs(b));\n\n for (const tick of tickValues) {\n const value = tick instanceof Date ? tick.getTime() : Number(tick);\n\n if (Number.isNaN(value) || value < lo || value > hi) {\n warn(`renderAxis: tickValue \"${String(tick)}\" is outside the axis domain and renders off-canvas.`);\n }\n }\n });\n}\n\n/**\n * Resolves the tick count an axis will render for a given scale/length: charts pass it to\n * `resolveTicks` for both the axis and its gridlines so the two stay aligned.\n * `defaultPosition` must match the one passed to the corresponding `renderAxis` call\n * ('bottom' for xAxis, 'left' for yAxis).\n */\nexport function positionAxis(parent: SVGGElement, position: AxisPosition, width: number, height: number): void {\n const transform =\n position === 'bottom' ? `translate(0,${height})` : position === 'right' ? `translate(${width},0)` : undefined;\n\n if (transform) parent.setAttribute('transform', transform);\n else parent.removeAttribute('transform');\n}\n\nexport function resolveTickCount(config: AxisConfig, length: number, defaultPosition: AxisPosition): number {\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const defaultTickCount = isHorizontal ? Math.max(2, Math.floor(length / 80)) : Math.max(2, Math.floor(length / 50));\n\n return config.tickCount ?? defaultTickCount;\n}\n\n/** How many category labels fit along the axis without their estimated boxes overlapping. */\nfunction categoryTickCount(\n domain: readonly string[],\n format: (value: string) => string,\n length: number,\n isHorizontal: boolean,\n): number {\n if (domain.length === 0) return 0;\n\n const size = isHorizontal\n ? Math.max(...domain.map((value) => estimateTextWidth(format(value), LABEL_FONT_SIZE)))\n : LABEL_FONT_SIZE * 1.3;\n\n return Math.max(1, Math.min(domain.length, Math.floor(length / (size + LABEL_GAP))));\n}\n\n/**\n * `defaultPosition` is applied when `config.position` is unset: pass `'bottom'` for an\n * xAxis call and `'left'` for a yAxis call so an unconfigured axis renders on its\n * conventional side instead of always defaulting to a horizontal bottom axis.\n */\nexport function renderAxis(\n parent: SVGGElement,\n scale: AnyScale,\n config: AxisConfig,\n length: number,\n defaultPosition: AxisPosition = 'bottom',\n): void {\n removeChildren(parent);\n\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const isInverted = position === 'top' || position === 'left';\n const tickSize = 6;\n const tickDirection = isInverted ? -1 : 1;\n\n const axisLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-line',\n x1: isHorizontal ? 0 : 0,\n x2: isHorizontal ? length : 0,\n y1: isHorizontal ? 0 : 0,\n y2: isHorizontal ? 0 : length,\n });\n\n parent.appendChild(axisLine);\n\n const format = config.tickFormat ?? defaultTickFormat;\n const tickCount =\n config.tickCount === undefined && 'bandwidth' in scale\n ? categoryTickCount(scale.domain, format, length, isHorizontal)\n : resolveTickCount(config, length, defaultPosition);\n const ticks = resolveTicks(scale, config, tickCount);\n\n if (config.tickValues) warnOffScaleTicks(scale, config.tickValues);\n\n for (const tick of ticks) {\n const pos = mapTick(scale, tick);\n const tickLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-tick',\n x1: isHorizontal ? pos : 0,\n x2: isHorizontal ? pos : tickSize * tickDirection,\n y1: isHorizontal ? 0 : pos,\n y2: isHorizontal ? tickSize * tickDirection : pos,\n });\n\n parent.appendChild(tickLine);\n\n const label = createTextElement(format(tick), {\n 'aria-hidden': 'true',\n class: 'prism-axis-label',\n 'dominant-baseline': isHorizontal ? (isInverted ? 'auto' : 'hanging') : 'middle',\n 'text-anchor': isHorizontal ? 'middle' : isInverted ? 'end' : 'start',\n x: isHorizontal ? pos : tickSize * tickDirection * 1.5,\n y: isHorizontal ? tickSize * tickDirection * 1.5 : pos,\n });\n\n parent.appendChild(label);\n }\n\n if (config.label) {\n const labelEl = createTextElement(config.label, {\n class: 'prism-axis-title',\n 'dominant-baseline': 'middle',\n 'text-anchor': 'middle',\n });\n\n if (isHorizontal) {\n setAttributes(labelEl, { x: length / 2, y: tickSize * tickDirection * 6 });\n } else {\n setAttributes(labelEl, {\n transform: `translate(${tickSize * tickDirection * 7}, ${length / 2}) rotate(-90)`,\n });\n }\n\n parent.appendChild(labelEl);\n }\n}\n"],"mappings":"yHAOA,IAAM,EAAkB,GAClB,EAAY,EAEZ,EAAU,IAAI,KAAK,aAAa,IAAA,GAAW,CAAE,yBAA0B,EAAG,SAAU,SAAU,CAAC,EAQ/F,kBAAqB,GACrB,aAAa,KAAa,EAAE,mBAAmB,IAAA,GAAW,CAAE,MAAO,QAAS,KAAM,SAAU,CAAC,EAC7F,OAAO,GAAM,UAAY,KAAK,IAAI,CAAC,GAAK,IAAY,EAAQ,OAAO,CAAC,EAEjE,OAAO,CAAC,EAQjB,SAAgB,aAAa,EAAiB,EAAoB,EAA+C,CAC/G,OAAO,EAAO,WAAa,CAAC,GAAG,EAAO,UAAU,EAAI,EAAM,MAAM,CAAS,CAC3E,CAoCA,SAAgB,aAAa,EAAqB,EAAwB,EAAe,EAAsB,CAC7G,IAAM,EACJ,IAAa,SAAW,eAAe,EAAO,GAAK,IAAa,QAAU,aAAa,EAAM,KAAO,IAAA,GAElG,EAAW,EAAO,aAAa,YAAa,CAAS,EACpD,EAAO,gBAAgB,WAAW,CACzC,CAEA,SAAgB,iBAAiB,EAAoB,EAAgB,EAAuC,CAC1G,IAAM,EAAW,EAAO,UAAY,EAE9B,EADe,IAAa,UAAY,IAAa,MACnB,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,EAAE,CAAC,EAAI,KAAK,IAAI,EAAG,KAAK,MAAM,EAAS,EAAE,CAAC,EAElH,OAAO,EAAO,WAAa,CAC7B,CAGA,SAAS,kBACP,EACA,EACA,EACA,EACQ,CACR,GAAI,EAAO,SAAW,EAAG,MAAO,GAEhC,IAAM,EAAO,EACT,KAAK,IAAI,GAAG,EAAO,IAAK,GAAU,EAAA,kBAAkB,EAAO,CAAK,EAAG,CAAe,CAAC,CAAC,EACpF,EAAkB,IAEtB,OAAO,KAAK,IAAI,EAAG,KAAK,IAAI,EAAO,OAAQ,KAAK,MAAM,GAAU,EAAO,EAAU,CAAC,CAAC,CACrF,CAOA,SAAgB,WACd,EACA,EACA,EACA,EACA,EAAgC,SAC1B,CACN,EAAA,eAAe,CAAM,EAErB,IAAM,EAAW,EAAO,UAAY,EAC9B,EAAe,IAAa,UAAY,IAAa,MACrD,EAAa,IAAa,OAAS,IAAa,OAEhD,EAAgB,EAAa,GAAK,EAElC,EAAW,EAAA,iBAAiB,OAAQ,CACxC,cAAe,OACf,MAAO,kBACP,GAAmB,EACnB,GAAI,EAAe,EAAS,EAC5B,GAAmB,EACnB,GAAI,EAAe,EAAI,CACzB,CAAC,EAED,EAAO,YAAY,CAAQ,EAE3B,IAAM,EAAS,EAAO,YAAc,kBAK9B,EAAQ,aAAa,EAAO,EAHhC,EAAO,YAAc,IAAA,IAAa,cAAe,EAC7C,kBAAkB,EAAM,OAAQ,EAAQ,EAAQ,CAAY,EAC5D,iBAAiB,EAAQ,EAAQ,CAAe,CACH,EAE/C,EAAO,YAAqC,EAAO,WAEvD,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAM,EAAA,QAAQ,EAAO,CAAI,EACzB,EAAW,EAAA,iBAAiB,OAAQ,CACxC,cAAe,OACf,MAAO,kBACP,GAAI,EAAe,EAAM,EACzB,GAAI,EAAe,EAAM,EAAW,EACpC,GAAI,EAAe,EAAI,EACvB,GAAI,EAAe,EAAW,EAAgB,CAChD,CAAC,EAED,EAAO,YAAY,CAAQ,EAE3B,IAAM,EAAQ,EAAA,kBAAkB,EAAO,CAAI,EAAG,CAC5C,cAAe,OACf,MAAO,mBACP,oBAAqB,EAAgB,EAAa,OAAS,UAAa,SACxE,cAAe,EAAe,SAAW,EAAa,MAAQ,QAC9D,EAAG,EAAe,EAAM,EAAW,EAAgB,IACnD,EAAG,EAAe,EAAW,EAAgB,IAAM,CACrD,CAAC,EAED,EAAO,YAAY,CAAK,CAC1B,CAEA,GAAI,EAAO,MAAO,CAChB,IAAM,EAAU,EAAA,kBAAkB,EAAO,MAAO,CAC9C,MAAO,mBACP,oBAAqB,SACrB,cAAe,QACjB,CAAC,EAEG,EACF,EAAA,cAAc,EAAS,CAAE,EAAG,EAAS,EAAG,EAAG,EAAW,EAAgB,CAAE,CAAC,EAEzE,EAAA,cAAc,EAAS,CACrB,UAAW,aAAa,EAAW,EAAgB,EAAE,IAAI,EAAS,EAAE,cACtE,CAAC,EAGH,EAAO,YAAY,CAAO,CAC5B,CACF"}
1
+ {"version":3,"file":"axis.cjs","names":["estimateTextWidth","createSvgElement","mapTick","createTextElement","require_element","require_text","require_scale_utils","LABEL_FONT_SIZE","LABEL_GAP","COMPACT","v","config","scale","tickCount","transform","position","height","width","parent","defaultPosition","defaultTickCount","length","domain","size","isHorizontal","format","value","isInverted","tickDirection","axisLine","ticks","tick","pos","tickLine","label","labelEl"],"sources":["../../src/axes/axis.ts"],"sourcesContent":["import { devOnly, warn } from '../_dev';\nimport { createSvgElement, removeChildren, setAttributes } from '../svg/element';\nimport { createTextElement, estimateTextWidth } from '../svg/text';\nimport type { AxisConfig, AxisPosition } from '../types';\nimport { type AnyScale, mapTick } from './scale-utils';\n\n/** Default `--prism-font-size-label` in px, used to estimate category label size. */\nconst LABEL_FONT_SIZE = 11;\nconst LABEL_GAP = 8;\n\nconst COMPACT = new Intl.NumberFormat(undefined, { maximumSignificantDigits: 3, notation: 'compact' });\n\n/**\n * Dates localize; magnitudes of 1e5 and above render in compact notation (\"123K\",\n * \"1.23M\") so a long number cannot crop against the default 50 px value-axis margin.\n * With three significant digits every compact label is at most as wide as \"99999\",\n * the widest plain label below the threshold. Opt out with `tickFormat: String`.\n */\nconst defaultTickFormat = (v: Date | number | string): string => {\n if (v instanceof Date) return v.toLocaleDateString(undefined, { month: 'short', year: 'numeric' });\n if (typeof v === 'number' && Math.abs(v) >= 1e5) return COMPACT.format(v);\n\n return String(v);\n};\n\n/**\n * The single tick source for an axis and its gridlines: explicit `tickValues` when set,\n * scale-generated ticks otherwise. Keeping grid on this same array is what stops\n * gridlines from drifting off the rendered ticks.\n */\nexport function resolveTicks(scale: AnyScale, config: AxisConfig, tickCount: number): (Date | number | string)[] {\n return config.tickValues ? [...config.tickValues] : scale.ticks(tickCount);\n}\n\n/** Development-only check that explicit tickValues match the scale they render on. */\nfunction warnOffScaleTicks(scale: AnyScale, tickValues: ReadonlyArray<Date | number | string>): void {\n devOnly(() => {\n if ('bandwidth' in scale) {\n for (const tick of tickValues) {\n if (!scale.domain.includes(tick as string)) {\n warn(`renderAxis: tickValue \"${String(tick)}\" is not a category in the band scale's domain.`);\n }\n }\n\n return;\n }\n\n const toMs = (v: Date | number): number => (v instanceof Date ? v.getTime() : v);\n const [a, b] = scale.domain;\n const lo = Math.min(toMs(a), toMs(b));\n const hi = Math.max(toMs(a), toMs(b));\n\n for (const tick of tickValues) {\n const value = tick instanceof Date ? tick.getTime() : Number(tick);\n\n if (Number.isNaN(value) || value < lo || value > hi) {\n warn(`renderAxis: tickValue \"${String(tick)}\" is outside the axis domain and renders off-canvas.`);\n }\n }\n });\n}\n\n/**\n * Resolves the tick count an axis will render for a given scale/length: charts pass it to\n * `resolveTicks` for both the axis and its gridlines so the two stay aligned.\n * `defaultPosition` must match the one passed to the corresponding `renderAxis` call\n * ('bottom' for xAxis, 'left' for yAxis).\n */\nexport function positionAxis(parent: SVGGElement, position: AxisPosition, width: number, height: number): void {\n const transform =\n position === 'bottom' ? `translate(0,${height})` : position === 'right' ? `translate(${width},0)` : undefined;\n\n if (transform) parent.setAttribute('transform', transform);\n else parent.removeAttribute('transform');\n}\n\nexport function resolveTickCount(config: AxisConfig, length: number, defaultPosition: AxisPosition): number {\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const defaultTickCount = isHorizontal ? Math.max(2, Math.floor(length / 80)) : Math.max(2, Math.floor(length / 50));\n\n return config.tickCount ?? defaultTickCount;\n}\n\n/** How many category labels fit along the axis without their estimated boxes overlapping. */\nfunction categoryTickCount(\n domain: readonly string[],\n format: (value: string) => string,\n length: number,\n isHorizontal: boolean,\n): number {\n if (domain.length === 0) return 0;\n\n const size = isHorizontal\n ? Math.max(...domain.map((value) => estimateTextWidth(format(value), LABEL_FONT_SIZE)))\n : LABEL_FONT_SIZE * 1.3;\n\n return Math.max(1, Math.min(domain.length, Math.floor(length / (size + LABEL_GAP))));\n}\n\n/**\n * `defaultPosition` is applied when `config.position` is unset: pass `'bottom'` for an\n * xAxis call and `'left'` for a yAxis call so an unconfigured axis renders on its\n * conventional side instead of always defaulting to a horizontal bottom axis.\n */\nexport function renderAxis(\n parent: SVGGElement,\n scale: AnyScale,\n config: AxisConfig,\n length: number,\n defaultPosition: AxisPosition = 'bottom',\n): void {\n removeChildren(parent);\n\n const position = config.position ?? defaultPosition;\n const isHorizontal = position === 'bottom' || position === 'top';\n const isInverted = position === 'top' || position === 'left';\n const tickSize = 6;\n const tickDirection = isInverted ? -1 : 1;\n\n const axisLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-line',\n x1: isHorizontal ? 0 : 0,\n x2: isHorizontal ? length : 0,\n y1: isHorizontal ? 0 : 0,\n y2: isHorizontal ? 0 : length,\n });\n\n parent.appendChild(axisLine);\n\n const format = config.tickFormat ?? defaultTickFormat;\n const tickCount =\n config.tickCount === undefined && 'bandwidth' in scale\n ? categoryTickCount(scale.domain, format, length, isHorizontal)\n : resolveTickCount(config, length, defaultPosition);\n const ticks = resolveTicks(scale, config, tickCount);\n\n if (config.tickValues) warnOffScaleTicks(scale, config.tickValues);\n\n for (const tick of ticks) {\n const pos = mapTick(scale, tick);\n const tickLine = createSvgElement('line', {\n 'aria-hidden': 'true',\n class: 'prism-axis-tick',\n x1: isHorizontal ? pos : 0,\n x2: isHorizontal ? pos : tickSize * tickDirection,\n y1: isHorizontal ? 0 : pos,\n y2: isHorizontal ? tickSize * tickDirection : pos,\n });\n\n parent.appendChild(tickLine);\n\n const label = createTextElement(format(tick), {\n 'aria-hidden': 'true',\n class: 'prism-axis-label',\n 'dominant-baseline': isHorizontal ? (isInverted ? 'auto' : 'hanging') : 'middle',\n 'text-anchor': isHorizontal ? 'middle' : isInverted ? 'end' : 'start',\n x: isHorizontal ? pos : tickSize * tickDirection * 1.5,\n y: isHorizontal ? tickSize * tickDirection * 1.5 : pos,\n });\n\n parent.appendChild(label);\n }\n\n if (config.label) {\n const labelEl = createTextElement(config.label, {\n class: 'prism-axis-title',\n 'dominant-baseline': 'middle',\n 'text-anchor': 'middle',\n });\n\n if (isHorizontal) {\n setAttributes(labelEl, { x: length / 2, y: tickSize * tickDirection * 6 });\n } else {\n setAttributes(labelEl, {\n transform: `translate(${tickSize * tickDirection * 7}, ${length / 2}) rotate(-90)`,\n });\n }\n\n parent.appendChild(labelEl);\n }\n}\n"],"mappings":"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"}