@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
@@ -1,2 +1,14 @@
1
- function polarX(e,t,n){return e+t*Math.sin(n)}function polarY(e,t,n){return e-t*Math.cos(n)}function polarPoint(e,t,n,r){return`${polarX(e,n,r)},${polarY(t,n,r)}`}export{polarPoint,polarX,polarY};
1
+ //#region src/core/polar.ts
2
+ function polarX(e, t, n) {
3
+ return e + t * Math.sin(n);
4
+ }
5
+ function polarY(e, t, n) {
6
+ return e - t * Math.cos(n);
7
+ }
8
+ function polarPoint(e, t, n, r) {
9
+ return `${polarX(e, n, r)},${polarY(t, n, r)}`;
10
+ }
11
+ //#endregion
12
+ export { polarPoint, polarX, polarY };
13
+
2
14
  //# sourceMappingURL=polar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"polar.js","names":[],"sources":["../../src/core/polar.ts"],"sourcesContent":["// Angles are radians measured clockwise from 12 o'clock.\n\nexport function polarX(cx: number, r: number, angle: number): number {\n return cx + r * Math.sin(angle);\n}\n\nexport function polarY(cy: number, r: number, angle: number): number {\n return cy - r * Math.cos(angle);\n}\n\n/** SVG path coordinate pair (`x,y`) for a polar position. */\nexport function polarPoint(cx: number, cy: number, r: number, angle: number): string {\n return `${polarX(cx, r, angle)},${polarY(cy, r, angle)}`;\n}\n"],"mappings":"AAEA,SAAgB,OAAO,EAAY,EAAW,EAAuB,CACnE,OAAO,EAAK,EAAI,KAAK,IAAI,CAAK,CAChC,CAEA,SAAgB,OAAO,EAAY,EAAW,EAAuB,CACnE,OAAO,EAAK,EAAI,KAAK,IAAI,CAAK,CAChC,CAGA,SAAgB,WAAW,EAAY,EAAY,EAAW,EAAuB,CACnF,MAAO,GAAG,OAAO,EAAI,EAAG,CAAK,EAAE,GAAG,OAAO,EAAI,EAAG,CAAK,GACvD"}
1
+ {"version":3,"file":"polar.js","names":["cx","r","angle","cy"],"sources":["../../src/core/polar.ts"],"sourcesContent":["// Angles are radians measured clockwise from 12 o'clock.\n\nexport function polarX(cx: number, r: number, angle: number): number {\n return cx + r * Math.sin(angle);\n}\n\nexport function polarY(cy: number, r: number, angle: number): number {\n return cy - r * Math.cos(angle);\n}\n\n/** SVG path coordinate pair (`x,y`) for a polar position. */\nexport function polarPoint(cx: number, cy: number, r: number, angle: number): string {\n return `${polarX(cx, r, angle)},${polarY(cy, r, angle)}`;\n}\n"],"mappings":";AAEA,SAAgB,OAAO,GAAY,GAAW,GAAuB;CACnE,OAAOA,IAAKC,IAAI,KAAK,IAAIC,CAAK;AAChC;AAEA,SAAgB,OAAO,GAAY,GAAW,GAAuB;CACnE,OAAOC,IAAKF,IAAI,KAAK,IAAIC,CAAK;AAChC;AAGA,SAAgB,WAAW,GAAY,GAAY,GAAW,GAAuB;CACnF,OAAO,GAAG,OAAOF,GAAIC,GAAGC,CAAK,EAAE,GAAG,OAAOC,GAAIF,GAAGC,CAAK;AACvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"responsive.cjs","names":[],"sources":["../../src/core/responsive.ts"],"sourcesContent":["export function observeResize(el: HTMLElement, callback: (width: number, height: number) => void): () => void {\n // Environments without ResizeObserver (jsdom, SSR) get a no-op subscription: the chart\n // keeps its initial getBoundingClientRect size and never observes, instead of throwing.\n if (typeof ResizeObserver === 'undefined') return () => {};\n\n let rafId: number | null = null;\n\n const observer = new ResizeObserver((entries) => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n rafId = requestAnimationFrame(() => {\n rafId = null;\n\n const entry = entries[0];\n\n if (entry) {\n const { height, width } = entry.contentRect;\n\n callback(width, height);\n }\n });\n });\n\n observer.observe(el);\n\n return () => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n observer.disconnect();\n };\n}\n"],"mappings":"AAAA,SAAgB,cAAc,EAAiB,EAA+D,CAG5G,GAAI,OAAO,eAAmB,IAAa,UAAa,CAAC,EAEzD,IAAI,EAAuB,KAErB,EAAW,IAAI,eAAgB,GAAY,CAC3C,IAAU,MAAM,qBAAqB,CAAK,EAE9C,EAAQ,0BAA4B,CAClC,EAAQ,KAER,IAAM,EAAQ,EAAQ,GAEtB,GAAI,EAAO,CACT,GAAM,CAAE,SAAQ,SAAU,EAAM,YAEhC,EAAS,EAAO,CAAM,CACxB,CACF,CAAC,CACH,CAAC,EAID,OAFA,EAAS,QAAQ,CAAE,MAEN,CACP,IAAU,MAAM,qBAAqB,CAAK,EAE9C,EAAS,WAAW,CACtB,CACF"}
1
+ {"version":3,"file":"responsive.cjs","names":["rafId","observer","entry","entries","callback","width","height","el"],"sources":["../../src/core/responsive.ts"],"sourcesContent":["export function observeResize(el: HTMLElement, callback: (width: number, height: number) => void): () => void {\n // Environments without ResizeObserver (jsdom, SSR) get a no-op subscription: the chart\n // keeps its initial getBoundingClientRect size and never observes, instead of throwing.\n if (typeof ResizeObserver === 'undefined') return () => {};\n\n let rafId: number | null = null;\n\n const observer = new ResizeObserver((entries) => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n rafId = requestAnimationFrame(() => {\n rafId = null;\n\n const entry = entries[0];\n\n if (entry) {\n const { height, width } = entry.contentRect;\n\n callback(width, height);\n }\n });\n });\n\n observer.observe(el);\n\n return () => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n observer.disconnect();\n };\n}\n"],"mappings":"AAAA,SAAgB,cAAc,EAAiB,EAA+D,CAG5G,GAAI,OAAO,eAAmB,IAAa,UAAa,CAAC,EAEzD,IAAIA,EAAuB,KAErBC,EAAW,IAAI,eAAgB,GAAY,CAC3CD,IAAU,MAAM,qBAAqBA,CAAK,EAE9C,EAAQ,0BAA4B,CAClC,EAAQ,KAER,IAAME,EAAQC,EAAQ,GAEtB,GAAID,EAAO,CACT,GAAM,CAAE,SAAQ,SAAUA,EAAM,YAEhCE,EAASC,EAAOC,CAAM,CACxB,CACF,CAAC,CACH,CAAC,EAID,OAFAL,EAAS,QAAQM,CAAE,MAEN,CACPP,IAAU,MAAM,qBAAqBA,CAAK,EAE9CC,EAAS,WAAW,CACtB,CACF,C"}
@@ -1,2 +1,21 @@
1
- function observeResize(e,t){if(typeof ResizeObserver>`u`)return()=>{};let n=null,r=new ResizeObserver(e=>{n!==null&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{n=null;let r=e[0];if(r){let{height:e,width:n}=r.contentRect;t(n,e)}})});return r.observe(e),()=>{n!==null&&cancelAnimationFrame(n),r.disconnect()}}export{observeResize};
1
+ //#region src/core/responsive.ts
2
+ function observeResize(e, t) {
3
+ if (typeof ResizeObserver > "u") return () => {};
4
+ let n = null, r = new ResizeObserver((e) => {
5
+ n !== null && cancelAnimationFrame(n), n = requestAnimationFrame(() => {
6
+ n = null;
7
+ let r = e[0];
8
+ if (r) {
9
+ let { height: e, width: n } = r.contentRect;
10
+ t(n, e);
11
+ }
12
+ });
13
+ });
14
+ return r.observe(e), () => {
15
+ n !== null && cancelAnimationFrame(n), r.disconnect();
16
+ };
17
+ }
18
+ //#endregion
19
+ export { observeResize };
20
+
2
21
  //# sourceMappingURL=responsive.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"responsive.js","names":[],"sources":["../../src/core/responsive.ts"],"sourcesContent":["export function observeResize(el: HTMLElement, callback: (width: number, height: number) => void): () => void {\n // Environments without ResizeObserver (jsdom, SSR) get a no-op subscription: the chart\n // keeps its initial getBoundingClientRect size and never observes, instead of throwing.\n if (typeof ResizeObserver === 'undefined') return () => {};\n\n let rafId: number | null = null;\n\n const observer = new ResizeObserver((entries) => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n rafId = requestAnimationFrame(() => {\n rafId = null;\n\n const entry = entries[0];\n\n if (entry) {\n const { height, width } = entry.contentRect;\n\n callback(width, height);\n }\n });\n });\n\n observer.observe(el);\n\n return () => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n observer.disconnect();\n };\n}\n"],"mappings":"AAAA,SAAgB,cAAc,EAAiB,EAA+D,CAG5G,GAAI,OAAO,eAAmB,IAAa,UAAa,CAAC,EAEzD,IAAI,EAAuB,KAErB,EAAW,IAAI,eAAgB,GAAY,CAC3C,IAAU,MAAM,qBAAqB,CAAK,EAE9C,EAAQ,0BAA4B,CAClC,EAAQ,KAER,IAAM,EAAQ,EAAQ,GAEtB,GAAI,EAAO,CACT,GAAM,CAAE,SAAQ,SAAU,EAAM,YAEhC,EAAS,EAAO,CAAM,CACxB,CACF,CAAC,CACH,CAAC,EAID,OAFA,EAAS,QAAQ,CAAE,MAEN,CACP,IAAU,MAAM,qBAAqB,CAAK,EAE9C,EAAS,WAAW,CACtB,CACF"}
1
+ {"version":3,"file":"responsive.js","names":["rafId","observer","entry","entries","width","height","el"],"sources":["../../src/core/responsive.ts"],"sourcesContent":["export function observeResize(el: HTMLElement, callback: (width: number, height: number) => void): () => void {\n // Environments without ResizeObserver (jsdom, SSR) get a no-op subscription: the chart\n // keeps its initial getBoundingClientRect size and never observes, instead of throwing.\n if (typeof ResizeObserver === 'undefined') return () => {};\n\n let rafId: number | null = null;\n\n const observer = new ResizeObserver((entries) => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n rafId = requestAnimationFrame(() => {\n rafId = null;\n\n const entry = entries[0];\n\n if (entry) {\n const { height, width } = entry.contentRect;\n\n callback(width, height);\n }\n });\n });\n\n observer.observe(el);\n\n return () => {\n if (rafId !== null) cancelAnimationFrame(rafId);\n\n observer.disconnect();\n };\n}\n"],"mappings":";AAAA,SAAgB,cAAc,GAAiB,GAA+D;CAG5G,IAAI,OAAO,iBAAmB,KAAa,aAAa,CAAC;CAEzD,IAAIA,IAAuB,MAErBC,IAAW,IAAI,gBAAgB,MAAY;EAG/C,AAFID,MAAU,QAAM,qBAAqBA,CAAK,GAE9C,IAAQ,4BAA4B;GAClC,IAAQ;GAER,IAAME,IAAQC,EAAQ;GAEtB,IAAID,GAAO;IACT,IAAM,EAAE,WAAQ,aAAUA,EAAM;IAEhC,EAASE,GAAOC,CAAM;GACxB;EACF,CAAC;CACH,CAAC;CAID,OAFAJ,EAAS,QAAQK,CAAE,SAEN;EAGX,AAFIN,MAAU,QAAM,qBAAqBA,CAAK,GAE9CC,EAAS,WAAW;CACtB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"series-id.cjs","names":[],"sources":["../../src/core/series-id.ts"],"sourcesContent":["import type { Series } from '../types';\n\n/**\n * Stable `data-series-id` value for a series group: the sanitized explicit\n * `id`, else the positional `series-<index>` fallback. Characters outside\n * `[A-Za-z0-9_-]` become `-` so the value is always attribute-safe.\n */\nexport function seriesDomId(series: Pick<Series, 'id' | 'name'> | undefined, index: number): string {\n return series?.id ? series.id.replace(/[^A-Za-z0-9_-]/g, '-') : `series-${index}`;\n}\n"],"mappings":"AAOA,SAAgB,YAAY,EAAiD,EAAuB,CAClG,OAAO,GAAQ,GAAK,EAAO,GAAG,QAAQ,kBAAmB,GAAG,EAAI,UAAU,GAC5E"}
1
+ {"version":3,"file":"series-id.cjs","names":["series","index"],"sources":["../../src/core/series-id.ts"],"sourcesContent":["import type { Series } from '../types';\n\n/**\n * Stable `data-series-id` value for a series group: the sanitized explicit\n * `id`, else the positional `series-<index>` fallback. Characters outside\n * `[A-Za-z0-9_-]` become `-` so the value is always attribute-safe.\n */\nexport function seriesDomId(series: Pick<Series, 'id' | 'name'> | undefined, index: number): string {\n return series?.id ? series.id.replace(/[^A-Za-z0-9_-]/g, '-') : `series-${index}`;\n}\n"],"mappings":"AAOA,SAAgB,YAAY,EAAiD,EAAuB,CAClG,OAAOA,GAAQ,GAAKA,EAAO,GAAG,QAAQ,kBAAmB,GAAG,EAAI,UAAUC,GAC5E,C"}
@@ -1,2 +1,8 @@
1
- function seriesDomId(e,t){return e?.id?e.id.replace(/[^A-Za-z0-9_-]/g,`-`):`series-${t}`}export{seriesDomId};
1
+ //#region src/core/series-id.ts
2
+ function seriesDomId(e, t) {
3
+ return e?.id ? e.id.replace(/[^A-Za-z0-9_-]/g, "-") : `series-${t}`;
4
+ }
5
+ //#endregion
6
+ export { seriesDomId };
7
+
2
8
  //# sourceMappingURL=series-id.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"series-id.js","names":[],"sources":["../../src/core/series-id.ts"],"sourcesContent":["import type { Series } from '../types';\n\n/**\n * Stable `data-series-id` value for a series group: the sanitized explicit\n * `id`, else the positional `series-<index>` fallback. Characters outside\n * `[A-Za-z0-9_-]` become `-` so the value is always attribute-safe.\n */\nexport function seriesDomId(series: Pick<Series, 'id' | 'name'> | undefined, index: number): string {\n return series?.id ? series.id.replace(/[^A-Za-z0-9_-]/g, '-') : `series-${index}`;\n}\n"],"mappings":"AAOA,SAAgB,YAAY,EAAiD,EAAuB,CAClG,OAAO,GAAQ,GAAK,EAAO,GAAG,QAAQ,kBAAmB,GAAG,EAAI,UAAU,GAC5E"}
1
+ {"version":3,"file":"series-id.js","names":["series","index"],"sources":["../../src/core/series-id.ts"],"sourcesContent":["import type { Series } from '../types';\n\n/**\n * Stable `data-series-id` value for a series group: the sanitized explicit\n * `id`, else the positional `series-<index>` fallback. Characters outside\n * `[A-Za-z0-9_-]` become `-` so the value is always attribute-safe.\n */\nexport function seriesDomId(series: Pick<Series, 'id' | 'name'> | undefined, index: number): string {\n return series?.id ? series.id.replace(/[^A-Za-z0-9_-]/g, '-') : `series-${index}`;\n}\n"],"mappings":";AAOA,SAAgB,YAAY,GAAiD,GAAuB;CAClG,OAAOA,GAAQ,KAAKA,EAAO,GAAG,QAAQ,mBAAmB,GAAG,IAAI,UAAUC;AAC5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all prism errors. Use `instanceof PrismError` to catch any prism-originated error. */\nexport class PrismError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a chart is given a structurally invalid configuration it cannot render at all (e.g. a non-Element `container`). Recoverable issues like empty or malformed data emit a dev-mode warning instead: see the package docs for details. */\nexport class PrismRenderError extends PrismError {}\n"],"mappings":"AACA,IAAa,WAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGa,iBAAb,cAAsC,UAAW,CAAC"}
1
+ {"version":3,"file":"errors.cjs","names":["message","opts"],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all prism errors. Use `instanceof PrismError` to catch any prism-originated error. */\nexport class PrismError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a chart is given a structurally invalid configuration it cannot render at all (e.g. a non-Element `container`). Recoverable issues like empty or malformed data emit a dev-mode warning instead: see the package docs for details. */\nexport class PrismRenderError extends PrismError {}\n"],"mappings":"AACA,IAAa,WAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAMA,EAASC,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGa,iBAAb,cAAsC,UAAW,CAAC,E"}
package/dist/errors.js CHANGED
@@ -1,2 +1,10 @@
1
- var PrismError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},PrismRenderError=class extends PrismError{};export{PrismError,PrismRenderError};
1
+ //#region src/errors.ts
2
+ var PrismError = class extends Error {
3
+ constructor(e, t) {
4
+ super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
5
+ }
6
+ }, PrismRenderError = class extends PrismError {};
7
+ //#endregion
8
+ export { PrismError, PrismRenderError };
9
+
2
10
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all prism errors. Use `instanceof PrismError` to catch any prism-originated error. */\nexport class PrismError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a chart is given a structurally invalid configuration it cannot render at all (e.g. a non-Element `container`). Recoverable issues like empty or malformed data emit a dev-mode warning instead: see the package docs for details. */\nexport class PrismRenderError extends PrismError {}\n"],"mappings":"AACA,IAAa,WAAb,cAAgC,KAAM,CACpC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAGa,iBAAb,cAAsC,UAAW,CAAC"}
1
+ {"version":3,"file":"errors.js","names":["message","opts"],"sources":["../src/errors.ts"],"sourcesContent":["/** Base class for all prism errors. Use `instanceof PrismError` to catch any prism-originated error. */\nexport class PrismError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a chart is given a structurally invalid configuration it cannot render at all (e.g. a non-Element `container`). Recoverable issues like empty or malformed data emit a dev-mode warning instead: see the package docs for details. */\nexport class PrismRenderError extends PrismError {}\n"],"mappings":";AACA,IAAa,aAAb,cAAgC,MAAM;CACpC,YAAY,GAAiB,GAAqB;EAGhD,AAFA,MAAMA,GAASC,CAAI,GACnB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;AACF,GAGa,mBAAb,cAAsC,WAAW,CAAC"}
package/dist/index.js CHANGED
@@ -1 +1,13 @@
1
- import{linearScale as e}from"./scales/linear.js";import{timeScale as t}from"./scales/time.js";import{PrismError as n,PrismRenderError as r}from"./errors.js";import{resetTheme as i,seriesColor as a,setTheme as o}from"./theme/index.js";import{createAreaChart as s}from"./charts/area/area-chart.js";import{bandScale as c}from"./scales/band.js";import{createBarChart as l}from"./charts/bar/bar-chart.js";import{createLineChart as u}from"./charts/line/line-chart.js";import{createPieChart as d}from"./charts/pie/pie-chart.js";import{createRadarChart as f}from"./charts/radar/radar-chart.js";import{createScatterChart as p}from"./charts/scatter/scatter-chart.js";import{createSparkline as m}from"./charts/sparkline/sparkline.js";export{n as PrismError,r as PrismRenderError,c as bandScale,s as createAreaChart,l as createBarChart,u as createLineChart,d as createPieChart,f as createRadarChart,p as createScatterChart,m as createSparkline,e as linearScale,i as resetTheme,a as seriesColor,o as setTheme,t as timeScale};
1
+ import { linearScale as e } from "./scales/linear.js";
2
+ import { timeScale as t } from "./scales/time.js";
3
+ import { PrismError as n, PrismRenderError as r } from "./errors.js";
4
+ import { resetTheme as i, seriesColor as a, setTheme as o } from "./theme/index.js";
5
+ import { createAreaChart as s } from "./charts/area/area-chart.js";
6
+ import { bandScale as c } from "./scales/band.js";
7
+ import { createBarChart as l } from "./charts/bar/bar-chart.js";
8
+ import { createLineChart as u } from "./charts/line/line-chart.js";
9
+ import { createPieChart as d } from "./charts/pie/pie-chart.js";
10
+ import { createRadarChart as f } from "./charts/radar/radar-chart.js";
11
+ import { createScatterChart as p } from "./charts/scatter/scatter-chart.js";
12
+ import { createSparkline as m } from "./charts/sparkline/sparkline.js";
13
+ export { n as PrismError, r as PrismRenderError, c as bandScale, s as createAreaChart, l as createBarChart, u as createLineChart, d as createPieChart, f as createRadarChart, p as createScatterChart, m as createSparkline, e as linearScale, i as resetTheme, a as seriesColor, o as setTheme, t as timeScale };
@@ -1 +1 @@
1
- {"version":3,"file":"announcer.cjs","names":[],"sources":["../../src/interaction/announcer.ts"],"sourcesContent":["import { createSvgElement } from '../svg/element';\nimport type { Datum, Series } from '../types';\n\nexport interface Announcer {\n announce(text: string): void;\n clear(): void;\n}\n\n/** \"Label: A 6, B 9\": the comparison text shared by tooltips and announcements. */\nexport function describeValues(\n label: string,\n values: readonly { datum: Datum | undefined; series: Series }[],\n format: (value: number, datum: Datum, series: Series) => string = String,\n): string {\n return `${label}: ${values\n .map(({ datum, series }) => `${series.name} ${datum ? format(datum.value, datum, series) : 'n/a'}`)\n .join(', ')}`;\n}\n\n/** Polite status region for charts whose visuals are aria-hidden. */\nexport function createAnnouncer(parent: SVGElement, className: string): Announcer {\n // Off-canvas rather than CSS-hidden so announcements work without prism's stylesheet.\n const region = createSvgElement('text', {\n 'aria-live': 'polite',\n class: className,\n role: 'status',\n x: -9999,\n y: -9999,\n });\n\n parent.appendChild(region);\n\n return {\n announce(text) {\n region.textContent = text;\n },\n clear() {\n region.textContent = '';\n },\n };\n}\n"],"mappings":"sCASA,SAAgB,eACd,EACA,EACA,EAAkE,OAC1D,CACR,MAAO,GAAG,EAAM,IAAI,EACjB,KAAK,CAAE,QAAO,YAAa,GAAG,EAAO,KAAK,GAAG,EAAQ,EAAO,EAAM,MAAO,EAAO,CAAM,EAAI,OAAO,CAAC,CAClG,KAAK,IAAI,GACd,CAGA,SAAgB,gBAAgB,EAAoB,EAA8B,CAEhF,IAAM,EAAS,EAAA,iBAAiB,OAAQ,CACtC,YAAa,SACb,MAAO,EACP,KAAM,SACN,EAAG,MACH,EAAG,KACL,CAAC,EAID,OAFA,EAAO,YAAY,CAAM,EAElB,CACL,SAAS,EAAM,CACb,EAAO,YAAc,CACvB,EACA,OAAQ,CACN,EAAO,YAAc,EACvB,CACF,CACF"}
1
+ {"version":3,"file":"announcer.cjs","names":["createSvgElement","require_element","label","values","series","datum","format","region","className","parent","text"],"sources":["../../src/interaction/announcer.ts"],"sourcesContent":["import { createSvgElement } from '../svg/element';\nimport type { Datum, Series } from '../types';\n\nexport interface Announcer {\n announce(text: string): void;\n clear(): void;\n}\n\n/** \"Label: A 6, B 9\": the comparison text shared by tooltips and announcements. */\nexport function describeValues(\n label: string,\n values: readonly { datum: Datum | undefined; series: Series }[],\n format: (value: number, datum: Datum, series: Series) => string = String,\n): string {\n return `${label}: ${values\n .map(({ datum, series }) => `${series.name} ${datum ? format(datum.value, datum, series) : 'n/a'}`)\n .join(', ')}`;\n}\n\n/** Polite status region for charts whose visuals are aria-hidden. */\nexport function createAnnouncer(parent: SVGElement, className: string): Announcer {\n // Off-canvas rather than CSS-hidden so announcements work without prism's stylesheet.\n const region = createSvgElement('text', {\n 'aria-live': 'polite',\n class: className,\n role: 'status',\n x: -9999,\n y: -9999,\n });\n\n parent.appendChild(region);\n\n return {\n announce(text) {\n region.textContent = text;\n },\n clear() {\n region.textContent = '';\n },\n };\n}\n"],"mappings":"A,sCASA,SAAgB,eACd,EACA,EACA,EAAkE,OAC1D,CACR,MAAO,GAAGE,EAAM,IAAIC,EACjB,KAAK,CAAE,QAAO,YAAa,GAAGC,EAAO,KAAK,GAAGC,EAAQC,EAAOD,EAAM,MAAOA,EAAOD,CAAM,EAAI,OAAO,CAAC,CAClG,KAAK,IAAI,GACd,CAGA,SAAgB,gBAAgB,EAAoB,EAA8B,CAEhF,IAAMG,EAASP,EAAAA,iBAAiB,OAAQ,CACtC,YAAa,SACb,MAAOQ,EACP,KAAM,SACN,EAAG,MACH,EAAG,KACL,CAAC,EAID,OAFAC,EAAO,YAAYF,CAAM,EAElB,CACL,SAAS,EAAM,CACb,EAAO,YAAcG,CACvB,EACA,OAAQ,CACN,EAAO,YAAc,EACvB,CACF,CACF,C"}
@@ -1,2 +1,26 @@
1
- import{createSvgElement as e}from"../svg/element.js";function describeValues(e,t,n=String){return`${e}: ${t.map(({datum:e,series:t})=>`${t.name} ${e?n(e.value,e,t):`n/a`}`).join(`, `)}`}function createAnnouncer(t,n){let r=e(`text`,{"aria-live":`polite`,class:n,role:`status`,x:-9999,y:-9999});return t.appendChild(r),{announce(e){r.textContent=e},clear(){r.textContent=``}}}export{createAnnouncer,describeValues};
1
+ import { createSvgElement as e } from "../svg/element.js";
2
+ //#region src/interaction/announcer.ts
3
+ function describeValues(e, t, n = String) {
4
+ return `${e}: ${t.map(({ datum: e, series: t }) => `${t.name} ${e ? n(e.value, e, t) : "n/a"}`).join(", ")}`;
5
+ }
6
+ function createAnnouncer(t, n) {
7
+ let r = e("text", {
8
+ "aria-live": "polite",
9
+ class: n,
10
+ role: "status",
11
+ x: -9999,
12
+ y: -9999
13
+ });
14
+ return t.appendChild(r), {
15
+ announce(e) {
16
+ r.textContent = e;
17
+ },
18
+ clear() {
19
+ r.textContent = "";
20
+ }
21
+ };
22
+ }
23
+ //#endregion
24
+ export { createAnnouncer, describeValues };
25
+
2
26
  //# sourceMappingURL=announcer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"announcer.js","names":[],"sources":["../../src/interaction/announcer.ts"],"sourcesContent":["import { createSvgElement } from '../svg/element';\nimport type { Datum, Series } from '../types';\n\nexport interface Announcer {\n announce(text: string): void;\n clear(): void;\n}\n\n/** \"Label: A 6, B 9\": the comparison text shared by tooltips and announcements. */\nexport function describeValues(\n label: string,\n values: readonly { datum: Datum | undefined; series: Series }[],\n format: (value: number, datum: Datum, series: Series) => string = String,\n): string {\n return `${label}: ${values\n .map(({ datum, series }) => `${series.name} ${datum ? format(datum.value, datum, series) : 'n/a'}`)\n .join(', ')}`;\n}\n\n/** Polite status region for charts whose visuals are aria-hidden. */\nexport function createAnnouncer(parent: SVGElement, className: string): Announcer {\n // Off-canvas rather than CSS-hidden so announcements work without prism's stylesheet.\n const region = createSvgElement('text', {\n 'aria-live': 'polite',\n class: className,\n role: 'status',\n x: -9999,\n y: -9999,\n });\n\n parent.appendChild(region);\n\n return {\n announce(text) {\n region.textContent = text;\n },\n clear() {\n region.textContent = '';\n },\n };\n}\n"],"mappings":"qDASA,SAAgB,eACd,EACA,EACA,EAAkE,OAC1D,CACR,MAAO,GAAG,EAAM,IAAI,EACjB,KAAK,CAAE,QAAO,YAAa,GAAG,EAAO,KAAK,GAAG,EAAQ,EAAO,EAAM,MAAO,EAAO,CAAM,EAAI,OAAO,CAAC,CAClG,KAAK,IAAI,GACd,CAGA,SAAgB,gBAAgB,EAAoB,EAA8B,CAEhF,IAAM,EAAS,EAAiB,OAAQ,CACtC,YAAa,SACb,MAAO,EACP,KAAM,SACN,EAAG,MACH,EAAG,KACL,CAAC,EAID,OAFA,EAAO,YAAY,CAAM,EAElB,CACL,SAAS,EAAM,CACb,EAAO,YAAc,CACvB,EACA,OAAQ,CACN,EAAO,YAAc,EACvB,CACF,CACF"}
1
+ {"version":3,"file":"announcer.js","names":["label","values","series","datum","format","region","createSvgElement","className","parent","text"],"sources":["../../src/interaction/announcer.ts"],"sourcesContent":["import { createSvgElement } from '../svg/element';\nimport type { Datum, Series } from '../types';\n\nexport interface Announcer {\n announce(text: string): void;\n clear(): void;\n}\n\n/** \"Label: A 6, B 9\": the comparison text shared by tooltips and announcements. */\nexport function describeValues(\n label: string,\n values: readonly { datum: Datum | undefined; series: Series }[],\n format: (value: number, datum: Datum, series: Series) => string = String,\n): string {\n return `${label}: ${values\n .map(({ datum, series }) => `${series.name} ${datum ? format(datum.value, datum, series) : 'n/a'}`)\n .join(', ')}`;\n}\n\n/** Polite status region for charts whose visuals are aria-hidden. */\nexport function createAnnouncer(parent: SVGElement, className: string): Announcer {\n // Off-canvas rather than CSS-hidden so announcements work without prism's stylesheet.\n const region = createSvgElement('text', {\n 'aria-live': 'polite',\n class: className,\n role: 'status',\n x: -9999,\n y: -9999,\n });\n\n parent.appendChild(region);\n\n return {\n announce(text) {\n region.textContent = text;\n },\n clear() {\n region.textContent = '';\n },\n };\n}\n"],"mappings":";;AASA,SAAgB,eACd,GACA,GACA,IAAkE,QAC1D;CACR,OAAO,GAAGA,EAAM,IAAIC,EACjB,KAAK,EAAE,UAAO,gBAAa,GAAGC,EAAO,KAAK,GAAGC,IAAQC,EAAOD,EAAM,OAAOA,GAAOD,CAAM,IAAI,OAAO,CAAC,CAClG,KAAK,IAAI;AACd;AAGA,SAAgB,gBAAgB,GAAoB,GAA8B;CAEhF,IAAMG,IAASC,EAAiB,QAAQ;EACtC,aAAa;EACb,OAAOC;EACP,MAAM;EACN,GAAG;EACH,GAAG;CACL,CAAC;CAID,OAFAC,EAAO,YAAYH,CAAM,GAElB;EACL,SAAS,GAAM;GACb,EAAO,cAAcI;EACvB;EACA,QAAQ;GACN,EAAO,cAAc;EACvB;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"crosshair.cjs","names":[],"sources":["../../src/interaction/crosshair.ts"],"sourcesContent":["import { createSvgElement, setAttributes } from '../svg/element';\nimport type { CrosshairConfig } from '../types';\n\nexport interface CrosshairState {\n hide(): void;\n show(x: number, y: number, width: number, height: number): void;\n /** When `false`, the crosshair follows the raw mouse position instead of snapping to the nearest datum. */\n readonly snap: boolean;\n}\n\n/**\n * Guide lines for the hovered position. Each line is drawn at the origin and placed\n * with a `transform`, so the CSS transition on `transform` glides a snapped guide to\n * the next datum. (`x1`/`y1` are not animatable CSS geometry properties, so the\n * position has to live in the transform.) Because the group starts `display: none`,\n * the first show places the guide instantly instead of sliding it in from the origin.\n */\nexport function createCrosshair(parent: SVGGElement, config?: CrosshairConfig | true): CrosshairState {\n const showVertical = config === true || config?.vertical !== false;\n const showHorizontal = config !== true && config?.horizontal === true;\n const snap = config === true || config?.snap !== false;\n\n const group = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-crosshair', style: 'display:none' });\n\n const vLine = showVertical\n ? createSvgElement('line', { class: 'prism-crosshair-v', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n const hLine = showHorizontal\n ? createSvgElement('line', { class: 'prism-crosshair-h', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n\n if (vLine) group.appendChild(vLine);\n\n if (hLine) group.appendChild(hLine);\n\n parent.appendChild(group);\n\n return {\n hide() {\n group.style.display = 'none';\n },\n show(x: number, y: number, width: number, height: number) {\n group.style.display = '';\n\n if (vLine) {\n setAttributes(vLine, { x1: 0, x2: 0, y1: 0, y2: height });\n vLine.style.transform = `translateX(${x}px)`;\n }\n\n if (hLine) {\n setAttributes(hLine, { x1: 0, x2: width, y1: 0, y2: 0 });\n hLine.style.transform = `translateY(${y}px)`;\n }\n },\n snap,\n };\n}\n"],"mappings":"sCAiBA,SAAgB,gBAAgB,EAAqB,EAAiD,CACpG,IAAM,EAAe,IAAW,IAAQ,GAAQ,WAAa,GACvD,EAAiB,IAAW,IAAQ,GAAQ,aAAe,GAC3D,EAAO,IAAW,IAAQ,GAAQ,OAAS,GAE3C,EAAQ,EAAA,iBAAiB,IAAK,CAAE,cAAe,OAAQ,MAAO,kBAAmB,MAAO,cAAe,CAAC,EAExG,EAAQ,EACV,EAAA,iBAAiB,OAAQ,CAAE,MAAO,oBAAqB,mBAAoB,kCAAmC,CAAC,EAC/G,KACE,EAAQ,EACV,EAAA,iBAAiB,OAAQ,CAAE,MAAO,oBAAqB,mBAAoB,kCAAmC,CAAC,EAC/G,KAQJ,OANI,GAAO,EAAM,YAAY,CAAK,EAE9B,GAAO,EAAM,YAAY,CAAK,EAElC,EAAO,YAAY,CAAK,EAEjB,CACL,MAAO,CACL,EAAM,MAAM,QAAU,MACxB,EACA,KAAK,EAAW,EAAW,EAAe,EAAgB,CACxD,EAAM,MAAM,QAAU,GAElB,IACF,EAAA,cAAc,EAAO,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,CAAO,CAAC,EACxD,EAAM,MAAM,UAAY,cAAc,EAAE,MAGtC,IACF,EAAA,cAAc,EAAO,CAAE,GAAI,EAAG,GAAI,EAAO,GAAI,EAAG,GAAI,CAAE,CAAC,EACvD,EAAM,MAAM,UAAY,cAAc,EAAE,KAE5C,EACA,MACF,CACF"}
1
+ {"version":3,"file":"crosshair.cjs","names":["createSvgElement","require_element","showVertical","config","showHorizontal","snap","group","vLine","hLine","parent","height","x","width","y"],"sources":["../../src/interaction/crosshair.ts"],"sourcesContent":["import { createSvgElement, setAttributes } from '../svg/element';\nimport type { CrosshairConfig } from '../types';\n\nexport interface CrosshairState {\n hide(): void;\n show(x: number, y: number, width: number, height: number): void;\n /** When `false`, the crosshair follows the raw mouse position instead of snapping to the nearest datum. */\n readonly snap: boolean;\n}\n\n/**\n * Guide lines for the hovered position. Each line is drawn at the origin and placed\n * with a `transform`, so the CSS transition on `transform` glides a snapped guide to\n * the next datum. (`x1`/`y1` are not animatable CSS geometry properties, so the\n * position has to live in the transform.) Because the group starts `display: none`,\n * the first show places the guide instantly instead of sliding it in from the origin.\n */\nexport function createCrosshair(parent: SVGGElement, config?: CrosshairConfig | true): CrosshairState {\n const showVertical = config === true || config?.vertical !== false;\n const showHorizontal = config !== true && config?.horizontal === true;\n const snap = config === true || config?.snap !== false;\n\n const group = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-crosshair', style: 'display:none' });\n\n const vLine = showVertical\n ? createSvgElement('line', { class: 'prism-crosshair-v', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n const hLine = showHorizontal\n ? createSvgElement('line', { class: 'prism-crosshair-h', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n\n if (vLine) group.appendChild(vLine);\n\n if (hLine) group.appendChild(hLine);\n\n parent.appendChild(group);\n\n return {\n hide() {\n group.style.display = 'none';\n },\n show(x: number, y: number, width: number, height: number) {\n group.style.display = '';\n\n if (vLine) {\n setAttributes(vLine, { x1: 0, x2: 0, y1: 0, y2: height });\n vLine.style.transform = `translateX(${x}px)`;\n }\n\n if (hLine) {\n setAttributes(hLine, { x1: 0, x2: width, y1: 0, y2: 0 });\n hLine.style.transform = `translateY(${y}px)`;\n }\n },\n snap,\n };\n}\n"],"mappings":"A,sCAiBA,SAAgB,gBAAgB,EAAqB,EAAiD,CACpG,IAAME,EAAeC,IAAW,IAAQA,GAAQ,WAAa,GACvDC,EAAiBD,IAAW,IAAQA,GAAQ,aAAe,GAC3DE,EAAOF,IAAW,IAAQA,GAAQ,OAAS,GAE3CG,EAAQN,EAAAA,iBAAiB,IAAK,CAAE,cAAe,OAAQ,MAAO,kBAAmB,MAAO,cAAe,CAAC,EAExGO,EAAQL,EACVF,EAAAA,iBAAiB,OAAQ,CAAE,MAAO,oBAAqB,mBAAoB,kCAAmC,CAAC,EAC/G,KACEQ,EAAQJ,EACVJ,EAAAA,iBAAiB,OAAQ,CAAE,MAAO,oBAAqB,mBAAoB,kCAAmC,CAAC,EAC/G,KAQJ,OANIO,GAAOD,EAAM,YAAYC,CAAK,EAE9BC,GAAOF,EAAM,YAAYE,CAAK,EAElCC,EAAO,YAAYH,CAAK,EAEjB,CACL,MAAO,CACL,EAAM,MAAM,QAAU,MACxB,EACA,KAAK,EAAW,EAAW,EAAe,EAAgB,CACxD,EAAM,MAAM,QAAU,GAElBC,IACFN,EAAA,cAAcM,EAAO,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAIG,CAAO,CAAC,EACxD,EAAM,MAAM,UAAY,cAAcC,EAAE,MAGtCH,IACFP,EAAA,cAAcO,EAAO,CAAE,GAAI,EAAG,GAAII,EAAO,GAAI,EAAG,GAAI,CAAE,CAAC,EACvD,EAAM,MAAM,UAAY,cAAcC,EAAE,KAE5C,EACA,MACF,CACF,C"}
@@ -1,2 +1,38 @@
1
- import{createSvgElement as e,setAttributes as t}from"../svg/element.js";function createCrosshair(n,r){let i=r===!0||r?.vertical!==!1,a=r!==!0&&r?.horizontal===!0,o=r===!0||r?.snap!==!1,s=e(`g`,{"aria-hidden":`true`,class:`prism-crosshair`,style:`display:none`}),c=i?e(`line`,{class:`prism-crosshair-v`,"stroke-dasharray":`var(--prism-crosshair-dash, 4 2)`}):null,l=a?e(`line`,{class:`prism-crosshair-h`,"stroke-dasharray":`var(--prism-crosshair-dash, 4 2)`}):null;return c&&s.appendChild(c),l&&s.appendChild(l),n.appendChild(s),{hide(){s.style.display=`none`},show(e,n,r,i){s.style.display=``,c&&(t(c,{x1:0,x2:0,y1:0,y2:i}),c.style.transform=`translateX(${e}px)`),l&&(t(l,{x1:0,x2:r,y1:0,y2:0}),l.style.transform=`translateY(${n}px)`)},snap:o}}export{createCrosshair};
1
+ import { createSvgElement as e, setAttributes as t } from "../svg/element.js";
2
+ //#region src/interaction/crosshair.ts
3
+ function createCrosshair(n, r) {
4
+ let i = r === !0 || r?.vertical !== !1, a = r !== !0 && r?.horizontal === !0, o = r === !0 || r?.snap !== !1, s = e("g", {
5
+ "aria-hidden": "true",
6
+ class: "prism-crosshair",
7
+ style: "display:none"
8
+ }), c = i ? e("line", {
9
+ class: "prism-crosshair-v",
10
+ "stroke-dasharray": "var(--prism-crosshair-dash, 4 2)"
11
+ }) : null, l = a ? e("line", {
12
+ class: "prism-crosshair-h",
13
+ "stroke-dasharray": "var(--prism-crosshair-dash, 4 2)"
14
+ }) : null;
15
+ return c && s.appendChild(c), l && s.appendChild(l), n.appendChild(s), {
16
+ hide() {
17
+ s.style.display = "none";
18
+ },
19
+ show(e, n, r, i) {
20
+ s.style.display = "", c && (t(c, {
21
+ x1: 0,
22
+ x2: 0,
23
+ y1: 0,
24
+ y2: i
25
+ }), c.style.transform = `translateX(${e}px)`), l && (t(l, {
26
+ x1: 0,
27
+ x2: r,
28
+ y1: 0,
29
+ y2: 0
30
+ }), l.style.transform = `translateY(${n}px)`);
31
+ },
32
+ snap: o
33
+ };
34
+ }
35
+ //#endregion
36
+ export { createCrosshair };
37
+
2
38
  //# sourceMappingURL=crosshair.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"crosshair.js","names":[],"sources":["../../src/interaction/crosshair.ts"],"sourcesContent":["import { createSvgElement, setAttributes } from '../svg/element';\nimport type { CrosshairConfig } from '../types';\n\nexport interface CrosshairState {\n hide(): void;\n show(x: number, y: number, width: number, height: number): void;\n /** When `false`, the crosshair follows the raw mouse position instead of snapping to the nearest datum. */\n readonly snap: boolean;\n}\n\n/**\n * Guide lines for the hovered position. Each line is drawn at the origin and placed\n * with a `transform`, so the CSS transition on `transform` glides a snapped guide to\n * the next datum. (`x1`/`y1` are not animatable CSS geometry properties, so the\n * position has to live in the transform.) Because the group starts `display: none`,\n * the first show places the guide instantly instead of sliding it in from the origin.\n */\nexport function createCrosshair(parent: SVGGElement, config?: CrosshairConfig | true): CrosshairState {\n const showVertical = config === true || config?.vertical !== false;\n const showHorizontal = config !== true && config?.horizontal === true;\n const snap = config === true || config?.snap !== false;\n\n const group = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-crosshair', style: 'display:none' });\n\n const vLine = showVertical\n ? createSvgElement('line', { class: 'prism-crosshair-v', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n const hLine = showHorizontal\n ? createSvgElement('line', { class: 'prism-crosshair-h', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n\n if (vLine) group.appendChild(vLine);\n\n if (hLine) group.appendChild(hLine);\n\n parent.appendChild(group);\n\n return {\n hide() {\n group.style.display = 'none';\n },\n show(x: number, y: number, width: number, height: number) {\n group.style.display = '';\n\n if (vLine) {\n setAttributes(vLine, { x1: 0, x2: 0, y1: 0, y2: height });\n vLine.style.transform = `translateX(${x}px)`;\n }\n\n if (hLine) {\n setAttributes(hLine, { x1: 0, x2: width, y1: 0, y2: 0 });\n hLine.style.transform = `translateY(${y}px)`;\n }\n },\n snap,\n };\n}\n"],"mappings":"wEAiBA,SAAgB,gBAAgB,EAAqB,EAAiD,CACpG,IAAM,EAAe,IAAW,IAAQ,GAAQ,WAAa,GACvD,EAAiB,IAAW,IAAQ,GAAQ,aAAe,GAC3D,EAAO,IAAW,IAAQ,GAAQ,OAAS,GAE3C,EAAQ,EAAiB,IAAK,CAAE,cAAe,OAAQ,MAAO,kBAAmB,MAAO,cAAe,CAAC,EAExG,EAAQ,EACV,EAAiB,OAAQ,CAAE,MAAO,oBAAqB,mBAAoB,kCAAmC,CAAC,EAC/G,KACE,EAAQ,EACV,EAAiB,OAAQ,CAAE,MAAO,oBAAqB,mBAAoB,kCAAmC,CAAC,EAC/G,KAQJ,OANI,GAAO,EAAM,YAAY,CAAK,EAE9B,GAAO,EAAM,YAAY,CAAK,EAElC,EAAO,YAAY,CAAK,EAEjB,CACL,MAAO,CACL,EAAM,MAAM,QAAU,MACxB,EACA,KAAK,EAAW,EAAW,EAAe,EAAgB,CACxD,EAAM,MAAM,QAAU,GAElB,IACF,EAAc,EAAO,CAAE,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,CAAO,CAAC,EACxD,EAAM,MAAM,UAAY,cAAc,EAAE,MAGtC,IACF,EAAc,EAAO,CAAE,GAAI,EAAG,GAAI,EAAO,GAAI,EAAG,GAAI,CAAE,CAAC,EACvD,EAAM,MAAM,UAAY,cAAc,EAAE,KAE5C,EACA,MACF,CACF"}
1
+ {"version":3,"file":"crosshair.js","names":["showVertical","config","showHorizontal","snap","group","createSvgElement","vLine","hLine","parent","setAttributes","height","x","width","y"],"sources":["../../src/interaction/crosshair.ts"],"sourcesContent":["import { createSvgElement, setAttributes } from '../svg/element';\nimport type { CrosshairConfig } from '../types';\n\nexport interface CrosshairState {\n hide(): void;\n show(x: number, y: number, width: number, height: number): void;\n /** When `false`, the crosshair follows the raw mouse position instead of snapping to the nearest datum. */\n readonly snap: boolean;\n}\n\n/**\n * Guide lines for the hovered position. Each line is drawn at the origin and placed\n * with a `transform`, so the CSS transition on `transform` glides a snapped guide to\n * the next datum. (`x1`/`y1` are not animatable CSS geometry properties, so the\n * position has to live in the transform.) Because the group starts `display: none`,\n * the first show places the guide instantly instead of sliding it in from the origin.\n */\nexport function createCrosshair(parent: SVGGElement, config?: CrosshairConfig | true): CrosshairState {\n const showVertical = config === true || config?.vertical !== false;\n const showHorizontal = config !== true && config?.horizontal === true;\n const snap = config === true || config?.snap !== false;\n\n const group = createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-crosshair', style: 'display:none' });\n\n const vLine = showVertical\n ? createSvgElement('line', { class: 'prism-crosshair-v', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n const hLine = showHorizontal\n ? createSvgElement('line', { class: 'prism-crosshair-h', 'stroke-dasharray': 'var(--prism-crosshair-dash, 4 2)' })\n : null;\n\n if (vLine) group.appendChild(vLine);\n\n if (hLine) group.appendChild(hLine);\n\n parent.appendChild(group);\n\n return {\n hide() {\n group.style.display = 'none';\n },\n show(x: number, y: number, width: number, height: number) {\n group.style.display = '';\n\n if (vLine) {\n setAttributes(vLine, { x1: 0, x2: 0, y1: 0, y2: height });\n vLine.style.transform = `translateX(${x}px)`;\n }\n\n if (hLine) {\n setAttributes(hLine, { x1: 0, x2: width, y1: 0, y2: 0 });\n hLine.style.transform = `translateY(${y}px)`;\n }\n },\n snap,\n };\n}\n"],"mappings":";;AAiBA,SAAgB,gBAAgB,GAAqB,GAAiD;CACpG,IAAMA,IAAeC,MAAW,MAAQA,GAAQ,aAAa,IACvDC,IAAiBD,MAAW,MAAQA,GAAQ,eAAe,IAC3DE,IAAOF,MAAW,MAAQA,GAAQ,SAAS,IAE3CG,IAAQC,EAAiB,KAAK;EAAE,eAAe;EAAQ,OAAO;EAAmB,OAAO;CAAe,CAAC,GAExGC,IAAQN,IACVK,EAAiB,QAAQ;EAAE,OAAO;EAAqB,oBAAoB;CAAmC,CAAC,IAC/G,MACEE,IAAQL,IACVG,EAAiB,QAAQ;EAAE,OAAO;EAAqB,oBAAoB;CAAmC,CAAC,IAC/G;CAQJ,OANIC,KAAOF,EAAM,YAAYE,CAAK,GAE9BC,KAAOH,EAAM,YAAYG,CAAK,GAElCC,EAAO,YAAYJ,CAAK,GAEjB;EACL,OAAO;GACL,EAAM,MAAM,UAAU;EACxB;EACA,KAAK,GAAW,GAAW,GAAe,GAAgB;GAQxD,AAPA,EAAM,MAAM,UAAU,IAElBE,MACFG,EAAcH,GAAO;IAAE,IAAI;IAAG,IAAI;IAAG,IAAI;IAAG,IAAII;GAAO,CAAC,GACxD,EAAM,MAAM,YAAY,cAAcC,EAAE,OAGtCJ,MACFE,EAAcF,GAAO;IAAE,IAAI;IAAG,IAAIK;IAAO,IAAI;IAAG,IAAI;GAAE,CAAC,GACvD,EAAM,MAAM,YAAY,cAAcC,EAAE;EAE5C;EACA;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"events.cjs","names":[],"sources":["../../src/interaction/events.ts"],"sourcesContent":["import type { Point } from '../svg/path';\n\nexport function getMousePosition(svg: SVGSVGElement, event: MouseEvent, offsetX: number, offsetY: number): Point {\n const rect = svg.getBoundingClientRect();\n\n return {\n x: event.clientX - rect.left - offsetX,\n y: event.clientY - rect.top - offsetY,\n };\n}\n"],"mappings":"AAEA,SAAgB,iBAAiB,EAAoB,EAAmB,EAAiB,EAAwB,CAC/G,IAAM,EAAO,EAAI,sBAAsB,EAEvC,MAAO,CACL,EAAG,EAAM,QAAU,EAAK,KAAO,EAC/B,EAAG,EAAM,QAAU,EAAK,IAAM,CAChC,CACF"}
1
+ {"version":3,"file":"events.cjs","names":["rect","svg","event","offsetX","offsetY"],"sources":["../../src/interaction/events.ts"],"sourcesContent":["import type { Point } from '../svg/path';\n\nexport function getMousePosition(svg: SVGSVGElement, event: MouseEvent, offsetX: number, offsetY: number): Point {\n const rect = svg.getBoundingClientRect();\n\n return {\n x: event.clientX - rect.left - offsetX,\n y: event.clientY - rect.top - offsetY,\n };\n}\n"],"mappings":"AAEA,SAAgB,iBAAiB,EAAoB,EAAmB,EAAiB,EAAwB,CAC/G,IAAMA,EAAOC,EAAI,sBAAsB,EAEvC,MAAO,CACL,EAAGC,EAAM,QAAUF,EAAK,KAAOG,EAC/B,EAAGD,EAAM,QAAUF,EAAK,IAAMI,CAChC,CACF,C"}
@@ -1,2 +1,12 @@
1
- function getMousePosition(e,t,n,r){let i=e.getBoundingClientRect();return{x:t.clientX-i.left-n,y:t.clientY-i.top-r}}export{getMousePosition};
1
+ //#region src/interaction/events.ts
2
+ function getMousePosition(e, t, n, r) {
3
+ let i = e.getBoundingClientRect();
4
+ return {
5
+ x: t.clientX - i.left - n,
6
+ y: t.clientY - i.top - r
7
+ };
8
+ }
9
+ //#endregion
10
+ export { getMousePosition };
11
+
2
12
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","names":[],"sources":["../../src/interaction/events.ts"],"sourcesContent":["import type { Point } from '../svg/path';\n\nexport function getMousePosition(svg: SVGSVGElement, event: MouseEvent, offsetX: number, offsetY: number): Point {\n const rect = svg.getBoundingClientRect();\n\n return {\n x: event.clientX - rect.left - offsetX,\n y: event.clientY - rect.top - offsetY,\n };\n}\n"],"mappings":"AAEA,SAAgB,iBAAiB,EAAoB,EAAmB,EAAiB,EAAwB,CAC/G,IAAM,EAAO,EAAI,sBAAsB,EAEvC,MAAO,CACL,EAAG,EAAM,QAAU,EAAK,KAAO,EAC/B,EAAG,EAAM,QAAU,EAAK,IAAM,CAChC,CACF"}
1
+ {"version":3,"file":"events.js","names":["rect","svg","event","offsetX","offsetY"],"sources":["../../src/interaction/events.ts"],"sourcesContent":["import type { Point } from '../svg/path';\n\nexport function getMousePosition(svg: SVGSVGElement, event: MouseEvent, offsetX: number, offsetY: number): Point {\n const rect = svg.getBoundingClientRect();\n\n return {\n x: event.clientX - rect.left - offsetX,\n y: event.clientY - rect.top - offsetY,\n };\n}\n"],"mappings":";AAEA,SAAgB,iBAAiB,GAAoB,GAAmB,GAAiB,GAAwB;CAC/G,IAAMA,IAAOC,EAAI,sBAAsB;CAEvC,OAAO;EACL,GAAGC,EAAM,UAAUF,EAAK,OAAOG;EAC/B,GAAGD,EAAM,UAAUF,EAAK,MAAMI;CAChC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"legend.cjs","names":[],"sources":["../../src/interaction/legend.ts"],"sourcesContent":["import type { LegendConfig, LegendPosition } from '../types';\n\nexport interface LegendState {\n dispose(): void;\n el: HTMLDivElement | null;\n update(series: { color: string; name: string }[]): void;\n [Symbol.dispose](): void;\n}\n\nfunction resolvePosition(config: LegendConfig | true): LegendPosition {\n if (config === true) return 'bottom';\n\n return config.position ?? 'bottom';\n}\n\nexport function createLegend(container: HTMLElement, config: LegendConfig | true, onLayout?: () => void): LegendState {\n const position = resolvePosition(config);\n const el = document.createElement('div');\n\n el.className = `prism-legend prism-legend-${position}`;\n\n if (position === 'top') {\n container.insertBefore(el, container.firstChild);\n } else {\n container.appendChild(el);\n }\n\n const disposeHandle = (): void => {\n el.remove();\n };\n\n return {\n dispose: disposeHandle,\n el,\n [Symbol.dispose]: disposeHandle,\n update(series) {\n el.replaceChildren();\n for (const s of series) {\n const item = document.createElement('div');\n\n item.className = 'prism-legend-item';\n\n const dot = document.createElement('span');\n\n dot.className = 'prism-legend-dot';\n dot.style.backgroundColor = s.color;\n\n const label = document.createElement('span');\n\n label.className = 'prism-legend-label';\n label.textContent = s.name;\n\n item.appendChild(dot);\n item.appendChild(label);\n el.appendChild(item);\n }\n onLayout?.();\n },\n };\n}\n"],"mappings":"AASA,SAAS,gBAAgB,EAA6C,CAGpE,OAFI,IAAW,GAAa,SAErB,EAAO,UAAY,QAC5B,CAEA,SAAgB,aAAa,EAAwB,EAA6B,EAAoC,CACpH,IAAM,EAAW,gBAAgB,CAAM,EACjC,EAAK,SAAS,cAAc,KAAK,EAEvC,EAAG,UAAY,6BAA6B,IAExC,IAAa,MACf,EAAU,aAAa,EAAI,EAAU,UAAU,EAE/C,EAAU,YAAY,CAAE,EAG1B,IAAM,kBAA4B,CAChC,EAAG,OAAO,CACZ,EAEA,MAAO,CACL,QAAS,cACT,MACC,OAAO,SAAU,cAClB,OAAO,EAAQ,CACb,EAAG,gBAAgB,EACnB,IAAK,IAAM,KAAK,EAAQ,CACtB,IAAM,EAAO,SAAS,cAAc,KAAK,EAEzC,EAAK,UAAY,oBAEjB,IAAM,EAAM,SAAS,cAAc,MAAM,EAEzC,EAAI,UAAY,mBAChB,EAAI,MAAM,gBAAkB,EAAE,MAE9B,IAAM,EAAQ,SAAS,cAAc,MAAM,EAE3C,EAAM,UAAY,qBAClB,EAAM,YAAc,EAAE,KAEtB,EAAK,YAAY,CAAG,EACpB,EAAK,YAAY,CAAK,EACtB,EAAG,YAAY,CAAI,CACrB,CACA,IAAW,CACb,CACF,CACF"}
1
+ {"version":3,"file":"legend.cjs","names":["config","position","el","container","s","series","item","dot","label","onLayout"],"sources":["../../src/interaction/legend.ts"],"sourcesContent":["import type { LegendConfig, LegendPosition } from '../types';\n\nexport interface LegendState {\n dispose(): void;\n el: HTMLDivElement | null;\n update(series: { color: string; name: string }[]): void;\n [Symbol.dispose](): void;\n}\n\nfunction resolvePosition(config: LegendConfig | true): LegendPosition {\n if (config === true) return 'bottom';\n\n return config.position ?? 'bottom';\n}\n\nexport function createLegend(container: HTMLElement, config: LegendConfig | true, onLayout?: () => void): LegendState {\n const position = resolvePosition(config);\n const el = document.createElement('div');\n\n el.className = `prism-legend prism-legend-${position}`;\n\n if (position === 'top') {\n container.insertBefore(el, container.firstChild);\n } else {\n container.appendChild(el);\n }\n\n const disposeHandle = (): void => {\n el.remove();\n };\n\n return {\n dispose: disposeHandle,\n el,\n [Symbol.dispose]: disposeHandle,\n update(series) {\n el.replaceChildren();\n for (const s of series) {\n const item = document.createElement('div');\n\n item.className = 'prism-legend-item';\n\n const dot = document.createElement('span');\n\n dot.className = 'prism-legend-dot';\n dot.style.backgroundColor = s.color;\n\n const label = document.createElement('span');\n\n label.className = 'prism-legend-label';\n label.textContent = s.name;\n\n item.appendChild(dot);\n item.appendChild(label);\n el.appendChild(item);\n }\n onLayout?.();\n },\n };\n}\n"],"mappings":"AASA,SAAS,gBAAgB,EAA6C,CAGpE,OAFIA,IAAW,GAAa,SAErBA,EAAO,UAAY,QAC5B,CAEA,SAAgB,aAAa,EAAwB,EAA6B,EAAoC,CACpH,IAAMC,EAAW,gBAAgBD,CAAM,EACjCE,EAAK,SAAS,cAAc,KAAK,EAEvC,EAAG,UAAY,6BAA6BD,IAExCA,IAAa,MACfE,EAAU,aAAaD,EAAIC,EAAU,UAAU,EAE/CA,EAAU,YAAYD,CAAE,EAG1B,IAAM,kBAA4B,CAChCA,EAAG,OAAO,CACZ,EAEA,MAAO,CACL,QAAS,cACT,MACC,OAAO,SAAU,cAClB,OAAO,EAAQ,CACbA,EAAG,gBAAgB,EACnB,IAAK,IAAME,KAAKC,EAAQ,CACtB,IAAMC,EAAO,SAAS,cAAc,KAAK,EAEzC,EAAK,UAAY,oBAEjB,IAAMC,EAAM,SAAS,cAAc,MAAM,EAEzC,EAAI,UAAY,mBAChB,EAAI,MAAM,gBAAkBH,EAAE,MAE9B,IAAMI,EAAQ,SAAS,cAAc,MAAM,EAE3C,EAAM,UAAY,qBAClB,EAAM,YAAcJ,EAAE,KAEtBE,EAAK,YAAYC,CAAG,EACpBD,EAAK,YAAYE,CAAK,EACtBN,EAAG,YAAYI,CAAI,CACrB,CACAG,IAAW,CACb,CACF,CACF,C"}
@@ -1,2 +1,32 @@
1
- function resolvePosition(e){return e===!0?`bottom`:e.position??`bottom`}function createLegend(e,t,n){let r=resolvePosition(t),i=document.createElement(`div`);i.className=`prism-legend prism-legend-${r}`,r===`top`?e.insertBefore(i,e.firstChild):e.appendChild(i);let disposeHandle=()=>{i.remove()};return{dispose:disposeHandle,el:i,[Symbol.dispose]:disposeHandle,update(e){i.replaceChildren();for(let t of e){let e=document.createElement(`div`);e.className=`prism-legend-item`;let n=document.createElement(`span`);n.className=`prism-legend-dot`,n.style.backgroundColor=t.color;let r=document.createElement(`span`);r.className=`prism-legend-label`,r.textContent=t.name,e.appendChild(n),e.appendChild(r),i.appendChild(e)}n?.()}}}export{createLegend};
1
+ //#region src/interaction/legend.ts
2
+ function resolvePosition(e) {
3
+ return e === !0 ? "bottom" : e.position ?? "bottom";
4
+ }
5
+ function createLegend(e, t, n) {
6
+ let r = resolvePosition(t), i = document.createElement("div");
7
+ i.className = `prism-legend prism-legend-${r}`, r === "top" ? e.insertBefore(i, e.firstChild) : e.appendChild(i);
8
+ let disposeHandle = () => {
9
+ i.remove();
10
+ };
11
+ return {
12
+ dispose: disposeHandle,
13
+ el: i,
14
+ [Symbol.dispose]: disposeHandle,
15
+ update(e) {
16
+ i.replaceChildren();
17
+ for (let t of e) {
18
+ let e = document.createElement("div");
19
+ e.className = "prism-legend-item";
20
+ let n = document.createElement("span");
21
+ n.className = "prism-legend-dot", n.style.backgroundColor = t.color;
22
+ let r = document.createElement("span");
23
+ r.className = "prism-legend-label", r.textContent = t.name, e.appendChild(n), e.appendChild(r), i.appendChild(e);
24
+ }
25
+ n?.();
26
+ }
27
+ };
28
+ }
29
+ //#endregion
30
+ export { createLegend };
31
+
2
32
  //# sourceMappingURL=legend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"legend.js","names":[],"sources":["../../src/interaction/legend.ts"],"sourcesContent":["import type { LegendConfig, LegendPosition } from '../types';\n\nexport interface LegendState {\n dispose(): void;\n el: HTMLDivElement | null;\n update(series: { color: string; name: string }[]): void;\n [Symbol.dispose](): void;\n}\n\nfunction resolvePosition(config: LegendConfig | true): LegendPosition {\n if (config === true) return 'bottom';\n\n return config.position ?? 'bottom';\n}\n\nexport function createLegend(container: HTMLElement, config: LegendConfig | true, onLayout?: () => void): LegendState {\n const position = resolvePosition(config);\n const el = document.createElement('div');\n\n el.className = `prism-legend prism-legend-${position}`;\n\n if (position === 'top') {\n container.insertBefore(el, container.firstChild);\n } else {\n container.appendChild(el);\n }\n\n const disposeHandle = (): void => {\n el.remove();\n };\n\n return {\n dispose: disposeHandle,\n el,\n [Symbol.dispose]: disposeHandle,\n update(series) {\n el.replaceChildren();\n for (const s of series) {\n const item = document.createElement('div');\n\n item.className = 'prism-legend-item';\n\n const dot = document.createElement('span');\n\n dot.className = 'prism-legend-dot';\n dot.style.backgroundColor = s.color;\n\n const label = document.createElement('span');\n\n label.className = 'prism-legend-label';\n label.textContent = s.name;\n\n item.appendChild(dot);\n item.appendChild(label);\n el.appendChild(item);\n }\n onLayout?.();\n },\n };\n}\n"],"mappings":"AASA,SAAS,gBAAgB,EAA6C,CAGpE,OAFI,IAAW,GAAa,SAErB,EAAO,UAAY,QAC5B,CAEA,SAAgB,aAAa,EAAwB,EAA6B,EAAoC,CACpH,IAAM,EAAW,gBAAgB,CAAM,EACjC,EAAK,SAAS,cAAc,KAAK,EAEvC,EAAG,UAAY,6BAA6B,IAExC,IAAa,MACf,EAAU,aAAa,EAAI,EAAU,UAAU,EAE/C,EAAU,YAAY,CAAE,EAG1B,IAAM,kBAA4B,CAChC,EAAG,OAAO,CACZ,EAEA,MAAO,CACL,QAAS,cACT,MACC,OAAO,SAAU,cAClB,OAAO,EAAQ,CACb,EAAG,gBAAgB,EACnB,IAAK,IAAM,KAAK,EAAQ,CACtB,IAAM,EAAO,SAAS,cAAc,KAAK,EAEzC,EAAK,UAAY,oBAEjB,IAAM,EAAM,SAAS,cAAc,MAAM,EAEzC,EAAI,UAAY,mBAChB,EAAI,MAAM,gBAAkB,EAAE,MAE9B,IAAM,EAAQ,SAAS,cAAc,MAAM,EAE3C,EAAM,UAAY,qBAClB,EAAM,YAAc,EAAE,KAEtB,EAAK,YAAY,CAAG,EACpB,EAAK,YAAY,CAAK,EACtB,EAAG,YAAY,CAAI,CACrB,CACA,IAAW,CACb,CACF,CACF"}
1
+ {"version":3,"file":"legend.js","names":["config","position","el","container","s","series","item","dot","label"],"sources":["../../src/interaction/legend.ts"],"sourcesContent":["import type { LegendConfig, LegendPosition } from '../types';\n\nexport interface LegendState {\n dispose(): void;\n el: HTMLDivElement | null;\n update(series: { color: string; name: string }[]): void;\n [Symbol.dispose](): void;\n}\n\nfunction resolvePosition(config: LegendConfig | true): LegendPosition {\n if (config === true) return 'bottom';\n\n return config.position ?? 'bottom';\n}\n\nexport function createLegend(container: HTMLElement, config: LegendConfig | true, onLayout?: () => void): LegendState {\n const position = resolvePosition(config);\n const el = document.createElement('div');\n\n el.className = `prism-legend prism-legend-${position}`;\n\n if (position === 'top') {\n container.insertBefore(el, container.firstChild);\n } else {\n container.appendChild(el);\n }\n\n const disposeHandle = (): void => {\n el.remove();\n };\n\n return {\n dispose: disposeHandle,\n el,\n [Symbol.dispose]: disposeHandle,\n update(series) {\n el.replaceChildren();\n for (const s of series) {\n const item = document.createElement('div');\n\n item.className = 'prism-legend-item';\n\n const dot = document.createElement('span');\n\n dot.className = 'prism-legend-dot';\n dot.style.backgroundColor = s.color;\n\n const label = document.createElement('span');\n\n label.className = 'prism-legend-label';\n label.textContent = s.name;\n\n item.appendChild(dot);\n item.appendChild(label);\n el.appendChild(item);\n }\n onLayout?.();\n },\n };\n}\n"],"mappings":";AASA,SAAS,gBAAgB,GAA6C;CAGpE,OAFIA,MAAW,KAAa,WAErBA,EAAO,YAAY;AAC5B;AAEA,SAAgB,aAAa,GAAwB,GAA6B,GAAoC;CACpH,IAAMC,IAAW,gBAAgBD,CAAM,GACjCE,IAAK,SAAS,cAAc,KAAK;CAIvC,AAFA,EAAG,YAAY,6BAA6BD,KAExCA,MAAa,QACfE,EAAU,aAAaD,GAAIC,EAAU,UAAU,IAE/CA,EAAU,YAAYD,CAAE;CAG1B,IAAM,sBAA4B;EAChC,EAAG,OAAO;CACZ;CAEA,OAAO;EACL,SAAS;EACT;GACC,OAAO,UAAU;EAClB,OAAO,GAAQ;GACb,EAAG,gBAAgB;GACnB,KAAK,IAAME,KAAKC,GAAQ;IACtB,IAAMC,IAAO,SAAS,cAAc,KAAK;IAEzC,EAAK,YAAY;IAEjB,IAAMC,IAAM,SAAS,cAAc,MAAM;IAGzC,AADA,EAAI,YAAY,oBAChB,EAAI,MAAM,kBAAkBH,EAAE;IAE9B,IAAMI,IAAQ,SAAS,cAAc,MAAM;IAO3C,AALA,EAAM,YAAY,sBAClB,EAAM,cAAcJ,EAAE,MAEtBE,EAAK,YAAYC,CAAG,GACpBD,EAAK,YAAYE,CAAK,GACtBN,EAAG,YAAYI,CAAI;GACrB;GACA,IAAW;EACb;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"scatter-interaction.cjs","names":[],"sources":["../../src/interaction/scatter-interaction.ts"],"sourcesContent":["import type { ChartEventHandlers } from '../core/chart-scaffold';\nimport { chartArea } from '../core/layout';\nimport { createSvgElement } from '../svg/element';\nimport type { Point } from '../svg/path';\nimport type { ChartDimensions, ChartEvent, ChartMargin, ContinuousDatum, Series, TooltipConfig } from '../types';\nimport { type Announcer, describeValues } from './announcer';\nimport type { CrosshairState } from './crosshair';\nimport { getMousePosition } from './events';\nimport { keyLabel } from './series-interaction';\nimport { comparisonContent, type TooltipState } from './tooltip';\n\nexport interface ScatterInteractionOptions {\n announcer: Announcer;\n colors: () => string[];\n crosshair?: CrosshairState | null;\n dims: () => ChartDimensions;\n /** Per-series data, parallel to `getPoints`; each datum is one independent point. */\n getData: () => ContinuousDatum[][];\n getPoints: () => Point[][];\n getSeriesList: () => Series[];\n /** Effective chart margin: hit bounds and tooltip offsets use this, never the shared dimensions. */\n margin: ChartMargin;\n /** Receives the single active-point marker. */\n markers: SVGGElement;\n onClick?: ((event: ChartEvent) => void) | undefined;\n onHover?: ((event: ChartEvent | null) => void) | undefined;\n /** Parent of the per-series point groups; the active series is emphasised and the rest dim. */\n seriesGroup: SVGGElement;\n svg: SVGSVGElement;\n tooltip?: TooltipState | null;\n /** Value/title formatters from the tooltip config, applied to the row and spoken text alike. */\n tooltipFormat?: Pick<TooltipConfig, 'titleFormat' | 'valueFormat'>;\n}\n\ninterface Hit {\n datum: ContinuousDatum;\n point: Point;\n seriesIndex: number;\n}\n\n/**\n * Pointer and keyboard interaction for a scatter plot. A scatter point is an\n * independent `(x, y)` pair rather than one sample at a shared key, so the active\n * point is the one nearest the pointer in two dimensions, events carry no\n * cross-series `values`, and keyboard navigation walks every point in x order.\n */\nexport function createScatterInteraction(opts: ScatterInteractionOptions): ChartEventHandlers {\n let keyboardIndex = -1;\n let active = false;\n\n const hitAt = (seriesIndex: number, pointIndex: number): Hit | null => {\n const datum = opts.getData()[seriesIndex]?.[pointIndex];\n const point = opts.getPoints()[seriesIndex]?.[pointIndex];\n\n return datum && point ? { datum, point, seriesIndex } : null;\n };\n\n const renderedHit = (event: Event): Hit | null => {\n const target = event.target;\n\n if (\n !(target instanceof SVGElement) ||\n !target.classList.contains('prism-scatter-point') ||\n !target.parentElement ||\n target.parentElement.parentNode !== opts.seriesGroup\n )\n return null;\n\n return hitAt(\n [...opts.seriesGroup.children].indexOf(target.parentElement),\n [...target.parentElement.children].indexOf(target),\n );\n };\n\n const nearestHit = (pos: Point): Hit | null => {\n let best: Hit | null = null;\n let minDistance = Infinity;\n\n for (const [seriesIndex, points] of opts.getPoints().entries()) {\n for (const pointIndex of points.keys()) {\n const hit = hitAt(seriesIndex, pointIndex);\n\n if (!hit) continue;\n\n const distance = Math.hypot(hit.point.x - pos.x, hit.point.y - pos.y);\n\n if (distance < minDistance) {\n minDistance = distance;\n best = hit;\n }\n }\n }\n\n return best;\n };\n\n // Every point across every series in x order (then y, then series order), for keyboard traversal.\n const orderedHits = (): Hit[] => {\n const hits: Hit[] = [];\n\n for (const [seriesIndex, data] of opts.getData().entries()) {\n for (const pointIndex of data.keys()) {\n const hit = hitAt(seriesIndex, pointIndex);\n\n if (hit) hits.push(hit);\n }\n }\n\n return hits.sort((a, b) => a.point.x - b.point.x || a.point.y - b.point.y || a.seriesIndex - b.seriesIndex);\n };\n\n const eventFor = (hit: Hit, originalEvent: Event): ChartEvent => ({\n datum: hit.datum,\n originalEvent,\n series: opts.getSeriesList()[hit.seriesIndex],\n });\n\n const highlight = (hit: Hit | null): void => {\n const groups = [...opts.seriesGroup.children];\n\n opts.markers.replaceChildren();\n\n if (hit) {\n opts.markers.appendChild(\n createSvgElement('circle', {\n class: 'prism-active-point',\n cx: hit.point.x,\n cy: hit.point.y,\n fill: opts.colors()[hit.seriesIndex],\n r: 4,\n }),\n );\n }\n\n opts.seriesGroup.classList.toggle('prism-series-focused', hit !== null && groups.length > 1);\n for (const [index, group] of groups.entries())\n group.classList.toggle('prism-series-active', index === hit?.seriesIndex);\n };\n\n const clear = (): void => {\n opts.crosshair?.hide();\n opts.tooltip?.hide();\n opts.announcer.clear();\n highlight(null);\n active = false;\n opts.onHover?.(null);\n };\n\n const focus = (hit: Hit, raw: Point | null, originalEvent: Event): void => {\n const dims = opts.dims();\n const area = chartArea(dims.width, dims.height, opts.margin);\n const follow = opts.crosshair?.snap === false && raw;\n const event = eventFor(hit, originalEvent);\n const { datum, series } = event;\n const label = opts.tooltipFormat?.titleFormat ? opts.tooltipFormat.titleFormat(datum.key) : keyLabel(datum.key);\n const valueFormat = opts.tooltipFormat?.valueFormat;\n const spoken = describeValues(label, [{ datum, series }], valueFormat ?? String);\n\n opts.crosshair?.show(follow ? raw.x : hit.point.x, follow ? raw.y : hit.point.y, area.width, area.height);\n highlight(hit);\n\n if (opts.tooltip) {\n const row = {\n color: opts.colors()[hit.seriesIndex],\n name: series.name,\n value: valueFormat ? valueFormat(datum.value, datum, series) : String(datum.value),\n };\n\n opts.tooltip.show(\n hit.point.x + opts.margin.left,\n hit.point.y + opts.margin.top,\n datum,\n series,\n comparisonContent(opts.svg.ownerDocument, label, [row], spoken),\n );\n } else {\n opts.announcer.announce(spoken);\n }\n\n active = true;\n opts.onHover?.(event);\n };\n\n const pointerHit = (event: MouseEvent): { hit: Hit; raw: Point } | null => {\n const rendered = renderedHit(event);\n\n if (rendered) return { hit: rendered, raw: rendered.point };\n\n const dims = opts.dims();\n const raw = getMousePosition(opts.svg, event, opts.margin.left, opts.margin.top);\n const area = chartArea(dims.width, dims.height, opts.margin);\n\n if (raw.x < 0 || raw.x > area.width || raw.y < 0 || raw.y > area.height) return null;\n\n const hit = nearestHit(raw);\n\n return hit ? { hit, raw } : null;\n };\n\n const onMouseMove = (event: MouseEvent): void => {\n const found = pointerHit(event);\n\n if (found) focus(found.hit, found.raw, event);\n else if (active) clear();\n };\n\n const onClick = (event: MouseEvent): void => {\n if (!opts.onClick) return;\n\n const found = pointerHit(event);\n\n if (found) opts.onClick(eventFor(found.hit, event));\n };\n\n const onKeyDown = (event: KeyboardEvent): void => {\n const hits = orderedHits();\n\n if (hits.length === 0) return;\n\n const last = hits.length - 1;\n const target: Record<string, number> = {\n ArrowLeft: keyboardIndex < 0 ? last : Math.max(0, keyboardIndex - 1),\n ArrowRight: keyboardIndex < 0 ? 0 : Math.min(last, keyboardIndex + 1),\n End: last,\n Home: 0,\n };\n\n if (event.key in target) {\n event.preventDefault();\n keyboardIndex = target[event.key];\n focus(hits[keyboardIndex], null, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && keyboardIndex >= 0 && opts.onClick) {\n event.preventDefault();\n opts.onClick(eventFor(hits[keyboardIndex], event));\n } else if (event.key === 'Escape') {\n keyboardIndex = -1;\n clear();\n }\n };\n\n return { onClick, onKeyDown, onMouseLeave: clear, onMouseMove };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"scatter-interaction.cjs","names":["createSvgElement","chartArea","keyLabel","describeValues","comparisonContent","getMousePosition","require_element","require_announcer","require_tooltip","require_layout","require_events","require_series_interaction","keyboardIndex","active","datum","opts","seriesIndex","pointIndex","point","target","event","best","minDistance","points","hit","distance","pos","hits","data","a","b","groups","index","group","dims","area","follow","raw","originalEvent","label","valueFormat","spoken","row","series","rendered","found","last"],"sources":["../../src/interaction/scatter-interaction.ts"],"sourcesContent":["import type { ChartEventHandlers } from '../core/chart-scaffold';\nimport { chartArea } from '../core/layout';\nimport { createSvgElement } from '../svg/element';\nimport type { Point } from '../svg/path';\nimport type { ChartDimensions, ChartEvent, ChartMargin, ContinuousDatum, Series, TooltipConfig } from '../types';\nimport { type Announcer, describeValues } from './announcer';\nimport type { CrosshairState } from './crosshair';\nimport { getMousePosition } from './events';\nimport { keyLabel } from './series-interaction';\nimport { comparisonContent, type TooltipState } from './tooltip';\n\nexport interface ScatterInteractionOptions {\n announcer: Announcer;\n colors: () => string[];\n crosshair?: CrosshairState | null;\n dims: () => ChartDimensions;\n /** Per-series data, parallel to `getPoints`; each datum is one independent point. */\n getData: () => ContinuousDatum[][];\n getPoints: () => Point[][];\n getSeriesList: () => Series[];\n /** Effective chart margin: hit bounds and tooltip offsets use this, never the shared dimensions. */\n margin: ChartMargin;\n /** Receives the single active-point marker. */\n markers: SVGGElement;\n onClick?: ((event: ChartEvent) => void) | undefined;\n onHover?: ((event: ChartEvent | null) => void) | undefined;\n /** Parent of the per-series point groups; the active series is emphasised and the rest dim. */\n seriesGroup: SVGGElement;\n svg: SVGSVGElement;\n tooltip?: TooltipState | null;\n /** Value/title formatters from the tooltip config, applied to the row and spoken text alike. */\n tooltipFormat?: Pick<TooltipConfig, 'titleFormat' | 'valueFormat'>;\n}\n\ninterface Hit {\n datum: ContinuousDatum;\n point: Point;\n seriesIndex: number;\n}\n\n/**\n * Pointer and keyboard interaction for a scatter plot. A scatter point is an\n * independent `(x, y)` pair rather than one sample at a shared key, so the active\n * point is the one nearest the pointer in two dimensions, events carry no\n * cross-series `values`, and keyboard navigation walks every point in x order.\n */\nexport function createScatterInteraction(opts: ScatterInteractionOptions): ChartEventHandlers {\n let keyboardIndex = -1;\n let active = false;\n\n const hitAt = (seriesIndex: number, pointIndex: number): Hit | null => {\n const datum = opts.getData()[seriesIndex]?.[pointIndex];\n const point = opts.getPoints()[seriesIndex]?.[pointIndex];\n\n return datum && point ? { datum, point, seriesIndex } : null;\n };\n\n const renderedHit = (event: Event): Hit | null => {\n const target = event.target;\n\n if (\n !(target instanceof SVGElement) ||\n !target.classList.contains('prism-scatter-point') ||\n !target.parentElement ||\n target.parentElement.parentNode !== opts.seriesGroup\n )\n return null;\n\n return hitAt(\n [...opts.seriesGroup.children].indexOf(target.parentElement),\n [...target.parentElement.children].indexOf(target),\n );\n };\n\n const nearestHit = (pos: Point): Hit | null => {\n let best: Hit | null = null;\n let minDistance = Infinity;\n\n for (const [seriesIndex, points] of opts.getPoints().entries()) {\n for (const pointIndex of points.keys()) {\n const hit = hitAt(seriesIndex, pointIndex);\n\n if (!hit) continue;\n\n const distance = Math.hypot(hit.point.x - pos.x, hit.point.y - pos.y);\n\n if (distance < minDistance) {\n minDistance = distance;\n best = hit;\n }\n }\n }\n\n return best;\n };\n\n // Every point across every series in x order (then y, then series order), for keyboard traversal.\n const orderedHits = (): Hit[] => {\n const hits: Hit[] = [];\n\n for (const [seriesIndex, data] of opts.getData().entries()) {\n for (const pointIndex of data.keys()) {\n const hit = hitAt(seriesIndex, pointIndex);\n\n if (hit) hits.push(hit);\n }\n }\n\n return hits.sort((a, b) => a.point.x - b.point.x || a.point.y - b.point.y || a.seriesIndex - b.seriesIndex);\n };\n\n const eventFor = (hit: Hit, originalEvent: Event): ChartEvent => ({\n datum: hit.datum,\n originalEvent,\n series: opts.getSeriesList()[hit.seriesIndex],\n });\n\n const highlight = (hit: Hit | null): void => {\n const groups = [...opts.seriesGroup.children];\n\n opts.markers.replaceChildren();\n\n if (hit) {\n opts.markers.appendChild(\n createSvgElement('circle', {\n class: 'prism-active-point',\n cx: hit.point.x,\n cy: hit.point.y,\n fill: opts.colors()[hit.seriesIndex],\n r: 4,\n }),\n );\n }\n\n opts.seriesGroup.classList.toggle('prism-series-focused', hit !== null && groups.length > 1);\n for (const [index, group] of groups.entries())\n group.classList.toggle('prism-series-active', index === hit?.seriesIndex);\n };\n\n const clear = (): void => {\n opts.crosshair?.hide();\n opts.tooltip?.hide();\n opts.announcer.clear();\n highlight(null);\n active = false;\n opts.onHover?.(null);\n };\n\n const focus = (hit: Hit, raw: Point | null, originalEvent: Event): void => {\n const dims = opts.dims();\n const area = chartArea(dims.width, dims.height, opts.margin);\n const follow = opts.crosshair?.snap === false && raw;\n const event = eventFor(hit, originalEvent);\n const { datum, series } = event;\n const label = opts.tooltipFormat?.titleFormat ? opts.tooltipFormat.titleFormat(datum.key) : keyLabel(datum.key);\n const valueFormat = opts.tooltipFormat?.valueFormat;\n const spoken = describeValues(label, [{ datum, series }], valueFormat ?? String);\n\n opts.crosshair?.show(follow ? raw.x : hit.point.x, follow ? raw.y : hit.point.y, area.width, area.height);\n highlight(hit);\n\n if (opts.tooltip) {\n const row = {\n color: opts.colors()[hit.seriesIndex],\n name: series.name,\n value: valueFormat ? valueFormat(datum.value, datum, series) : String(datum.value),\n };\n\n opts.tooltip.show(\n hit.point.x + opts.margin.left,\n hit.point.y + opts.margin.top,\n datum,\n series,\n comparisonContent(opts.svg.ownerDocument, label, [row], spoken),\n );\n } else {\n opts.announcer.announce(spoken);\n }\n\n active = true;\n opts.onHover?.(event);\n };\n\n const pointerHit = (event: MouseEvent): { hit: Hit; raw: Point } | null => {\n const rendered = renderedHit(event);\n\n if (rendered) return { hit: rendered, raw: rendered.point };\n\n const dims = opts.dims();\n const raw = getMousePosition(opts.svg, event, opts.margin.left, opts.margin.top);\n const area = chartArea(dims.width, dims.height, opts.margin);\n\n if (raw.x < 0 || raw.x > area.width || raw.y < 0 || raw.y > area.height) return null;\n\n const hit = nearestHit(raw);\n\n return hit ? { hit, raw } : null;\n };\n\n const onMouseMove = (event: MouseEvent): void => {\n const found = pointerHit(event);\n\n if (found) focus(found.hit, found.raw, event);\n else if (active) clear();\n };\n\n const onClick = (event: MouseEvent): void => {\n if (!opts.onClick) return;\n\n const found = pointerHit(event);\n\n if (found) opts.onClick(eventFor(found.hit, event));\n };\n\n const onKeyDown = (event: KeyboardEvent): void => {\n const hits = orderedHits();\n\n if (hits.length === 0) return;\n\n const last = hits.length - 1;\n const target: Record<string, number> = {\n ArrowLeft: keyboardIndex < 0 ? last : Math.max(0, keyboardIndex - 1),\n ArrowRight: keyboardIndex < 0 ? 0 : Math.min(last, keyboardIndex + 1),\n End: last,\n Home: 0,\n };\n\n if (event.key in target) {\n event.preventDefault();\n keyboardIndex = target[event.key];\n focus(hits[keyboardIndex], null, event);\n } else if ((event.key === 'Enter' || event.key === ' ') && keyboardIndex >= 0 && opts.onClick) {\n event.preventDefault();\n opts.onClick(eventFor(hits[keyboardIndex], event));\n } else if (event.key === 'Escape') {\n keyboardIndex = -1;\n clear();\n }\n };\n\n return { onClick, onKeyDown, onMouseLeave: clear, onMouseMove };\n}\n"],"mappings":"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"}
@@ -1,2 +1,106 @@
1
- import{createSvgElement as e}from"../svg/element.js";import{describeValues as t}from"./announcer.js";import{comparisonContent as n}from"./tooltip.js";import{chartArea as r}from"../core/layout.js";import{getMousePosition as i}from"./events.js";import{keyLabel as a}from"./series-interaction.js";function createScatterInteraction(o){let s=-1,c=!1,hitAt=(e,t)=>{let n=o.getData()[e]?.[t],r=o.getPoints()[e]?.[t];return n&&r?{datum:n,point:r,seriesIndex:e}:null},renderedHit=e=>{let t=e.target;return!(t instanceof SVGElement)||!t.classList.contains(`prism-scatter-point`)||!t.parentElement||t.parentElement.parentNode!==o.seriesGroup?null:hitAt([...o.seriesGroup.children].indexOf(t.parentElement),[...t.parentElement.children].indexOf(t))},nearestHit=e=>{let t=null,n=1/0;for(let[r,i]of o.getPoints().entries())for(let a of i.keys()){let i=hitAt(r,a);if(!i)continue;let o=Math.hypot(i.point.x-e.x,i.point.y-e.y);o<n&&(n=o,t=i)}return t},orderedHits=()=>{let e=[];for(let[t,n]of o.getData().entries())for(let r of n.keys()){let n=hitAt(t,r);n&&e.push(n)}return e.sort((e,t)=>e.point.x-t.point.x||e.point.y-t.point.y||e.seriesIndex-t.seriesIndex)},eventFor=(e,t)=>({datum:e.datum,originalEvent:t,series:o.getSeriesList()[e.seriesIndex]}),highlight=t=>{let n=[...o.seriesGroup.children];o.markers.replaceChildren(),t&&o.markers.appendChild(e(`circle`,{class:`prism-active-point`,cx:t.point.x,cy:t.point.y,fill:o.colors()[t.seriesIndex],r:4})),o.seriesGroup.classList.toggle(`prism-series-focused`,t!==null&&n.length>1);for(let[e,r]of n.entries())r.classList.toggle(`prism-series-active`,e===t?.seriesIndex)},clear=()=>{o.crosshair?.hide(),o.tooltip?.hide(),o.announcer.clear(),highlight(null),c=!1,o.onHover?.(null)},focus=(e,i,s)=>{let l=o.dims(),u=r(l.width,l.height,o.margin),d=o.crosshair?.snap===!1&&i,f=eventFor(e,s),{datum:p,series:m}=f,h=o.tooltipFormat?.titleFormat?o.tooltipFormat.titleFormat(p.key):a(p.key),g=o.tooltipFormat?.valueFormat,_=t(h,[{datum:p,series:m}],g??String);if(o.crosshair?.show(d?i.x:e.point.x,d?i.y:e.point.y,u.width,u.height),highlight(e),o.tooltip){let t={color:o.colors()[e.seriesIndex],name:m.name,value:g?g(p.value,p,m):String(p.value)};o.tooltip.show(e.point.x+o.margin.left,e.point.y+o.margin.top,p,m,n(o.svg.ownerDocument,h,[t],_))}else o.announcer.announce(_);c=!0,o.onHover?.(f)},pointerHit=e=>{let t=renderedHit(e);if(t)return{hit:t,raw:t.point};let n=o.dims(),a=i(o.svg,e,o.margin.left,o.margin.top),s=r(n.width,n.height,o.margin);if(a.x<0||a.x>s.width||a.y<0||a.y>s.height)return null;let c=nearestHit(a);return c?{hit:c,raw:a}:null},onMouseMove=e=>{let t=pointerHit(e);t?focus(t.hit,t.raw,e):c&&clear()},onClick=e=>{if(!o.onClick)return;let t=pointerHit(e);t&&o.onClick(eventFor(t.hit,e))},onKeyDown=e=>{let t=orderedHits();if(t.length===0)return;let n=t.length-1,r={ArrowLeft:s<0?n:Math.max(0,s-1),ArrowRight:s<0?0:Math.min(n,s+1),End:n,Home:0};e.key in r?(e.preventDefault(),s=r[e.key],focus(t[s],null,e)):(e.key===`Enter`||e.key===` `)&&s>=0&&o.onClick?(e.preventDefault(),o.onClick(eventFor(t[s],e))):e.key===`Escape`&&(s=-1,clear())};return{onClick,onKeyDown,onMouseLeave:clear,onMouseMove}}export{createScatterInteraction};
1
+ import { createSvgElement as e } from "../svg/element.js";
2
+ import { describeValues as t } from "./announcer.js";
3
+ import { comparisonContent as n } from "./tooltip.js";
4
+ import { chartArea as r } from "../core/layout.js";
5
+ import { getMousePosition as i } from "./events.js";
6
+ import { keyLabel as a } from "./series-interaction.js";
7
+ //#region src/interaction/scatter-interaction.ts
8
+ function createScatterInteraction(o) {
9
+ let s = -1, c = !1, hitAt = (e, t) => {
10
+ let n = o.getData()[e]?.[t], r = o.getPoints()[e]?.[t];
11
+ return n && r ? {
12
+ datum: n,
13
+ point: r,
14
+ seriesIndex: e
15
+ } : null;
16
+ }, renderedHit = (e) => {
17
+ let t = e.target;
18
+ return !(t instanceof SVGElement) || !t.classList.contains("prism-scatter-point") || !t.parentElement || t.parentElement.parentNode !== o.seriesGroup ? null : hitAt([...o.seriesGroup.children].indexOf(t.parentElement), [...t.parentElement.children].indexOf(t));
19
+ }, nearestHit = (e) => {
20
+ let t = null, n = Infinity;
21
+ for (let [r, i] of o.getPoints().entries()) for (let a of i.keys()) {
22
+ let i = hitAt(r, a);
23
+ if (!i) continue;
24
+ let o = Math.hypot(i.point.x - e.x, i.point.y - e.y);
25
+ o < n && (n = o, t = i);
26
+ }
27
+ return t;
28
+ }, orderedHits = () => {
29
+ let e = [];
30
+ for (let [t, n] of o.getData().entries()) for (let r of n.keys()) {
31
+ let n = hitAt(t, r);
32
+ n && e.push(n);
33
+ }
34
+ return e.sort((e, t) => e.point.x - t.point.x || e.point.y - t.point.y || e.seriesIndex - t.seriesIndex);
35
+ }, eventFor = (e, t) => ({
36
+ datum: e.datum,
37
+ originalEvent: t,
38
+ series: o.getSeriesList()[e.seriesIndex]
39
+ }), highlight = (t) => {
40
+ let n = [...o.seriesGroup.children];
41
+ o.markers.replaceChildren(), t && o.markers.appendChild(e("circle", {
42
+ class: "prism-active-point",
43
+ cx: t.point.x,
44
+ cy: t.point.y,
45
+ fill: o.colors()[t.seriesIndex],
46
+ r: 4
47
+ })), o.seriesGroup.classList.toggle("prism-series-focused", t !== null && n.length > 1);
48
+ for (let [e, r] of n.entries()) r.classList.toggle("prism-series-active", e === t?.seriesIndex);
49
+ }, clear = () => {
50
+ o.crosshair?.hide(), o.tooltip?.hide(), o.announcer.clear(), highlight(null), c = !1, o.onHover?.(null);
51
+ }, focus = (e, i, s) => {
52
+ let l = o.dims(), u = r(l.width, l.height, o.margin), d = o.crosshair?.snap === !1 && i, f = eventFor(e, s), { datum: p, series: m } = f, h = o.tooltipFormat?.titleFormat ? o.tooltipFormat.titleFormat(p.key) : a(p.key), g = o.tooltipFormat?.valueFormat, _ = t(h, [{
53
+ datum: p,
54
+ series: m
55
+ }], g ?? String);
56
+ if (o.crosshair?.show(d ? i.x : e.point.x, d ? i.y : e.point.y, u.width, u.height), highlight(e), o.tooltip) {
57
+ let t = {
58
+ color: o.colors()[e.seriesIndex],
59
+ name: m.name,
60
+ value: g ? g(p.value, p, m) : String(p.value)
61
+ };
62
+ o.tooltip.show(e.point.x + o.margin.left, e.point.y + o.margin.top, p, m, n(o.svg.ownerDocument, h, [t], _));
63
+ } else o.announcer.announce(_);
64
+ c = !0, o.onHover?.(f);
65
+ }, pointerHit = (e) => {
66
+ let t = renderedHit(e);
67
+ if (t) return {
68
+ hit: t,
69
+ raw: t.point
70
+ };
71
+ let n = o.dims(), a = i(o.svg, e, o.margin.left, o.margin.top), s = r(n.width, n.height, o.margin);
72
+ if (a.x < 0 || a.x > s.width || a.y < 0 || a.y > s.height) return null;
73
+ let c = nearestHit(a);
74
+ return c ? {
75
+ hit: c,
76
+ raw: a
77
+ } : null;
78
+ }, onMouseMove = (e) => {
79
+ let t = pointerHit(e);
80
+ t ? focus(t.hit, t.raw, e) : c && clear();
81
+ }, onClick = (e) => {
82
+ if (!o.onClick) return;
83
+ let t = pointerHit(e);
84
+ t && o.onClick(eventFor(t.hit, e));
85
+ }, onKeyDown = (e) => {
86
+ let t = orderedHits();
87
+ if (t.length === 0) return;
88
+ let n = t.length - 1, r = {
89
+ ArrowLeft: s < 0 ? n : Math.max(0, s - 1),
90
+ ArrowRight: s < 0 ? 0 : Math.min(n, s + 1),
91
+ End: n,
92
+ Home: 0
93
+ };
94
+ e.key in r ? (e.preventDefault(), s = r[e.key], focus(t[s], null, e)) : (e.key === "Enter" || e.key === " ") && s >= 0 && o.onClick ? (e.preventDefault(), o.onClick(eventFor(t[s], e))) : e.key === "Escape" && (s = -1, clear());
95
+ };
96
+ return {
97
+ onClick,
98
+ onKeyDown,
99
+ onMouseLeave: clear,
100
+ onMouseMove
101
+ };
102
+ }
103
+ //#endregion
104
+ export { createScatterInteraction };
105
+
2
106
  //# sourceMappingURL=scatter-interaction.js.map