@vielzeug/prism 3.0.0 → 26.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/_dev.cjs +1 -1
  2. package/dist/_dev.cjs.map +1 -1
  3. package/dist/_dev.js +1 -5
  4. package/dist/_dev.js.map +1 -1
  5. package/dist/animation/easing.cjs +1 -1
  6. package/dist/animation/easing.cjs.map +1 -1
  7. package/dist/animation/easing.js +1 -13
  8. package/dist/animation/easing.js.map +1 -1
  9. package/dist/animation/motion.cjs +1 -1
  10. package/dist/animation/motion.cjs.map +1 -1
  11. package/dist/animation/motion.js +1 -12
  12. package/dist/animation/motion.js.map +1 -1
  13. package/dist/animation/transition.cjs +1 -1
  14. package/dist/animation/transition.cjs.map +1 -1
  15. package/dist/animation/transition.js +1 -28
  16. package/dist/animation/transition.js.map +1 -1
  17. package/dist/animation/tween.cjs +1 -1
  18. package/dist/animation/tween.cjs.map +1 -1
  19. package/dist/animation/tween.js +1 -7
  20. package/dist/animation/tween.js.map +1 -1
  21. package/dist/axes/axis.cjs +1 -1
  22. package/dist/axes/axis.cjs.map +1 -1
  23. package/dist/axes/axis.js +1 -63
  24. package/dist/axes/axis.js.map +1 -1
  25. package/dist/axes/grid.cjs +1 -1
  26. package/dist/axes/grid.cjs.map +1 -1
  27. package/dist/axes/grid.js +1 -29
  28. package/dist/axes/grid.js.map +1 -1
  29. package/dist/axes/scale-utils.cjs +1 -1
  30. package/dist/axes/scale-utils.cjs.map +1 -1
  31. package/dist/axes/scale-utils.js +1 -10
  32. package/dist/axes/scale-utils.js.map +1 -1
  33. package/dist/charts/area/area-chart.cjs +1 -1
  34. package/dist/charts/area/area-chart.cjs.map +1 -1
  35. package/dist/charts/area/area-chart.js +1 -57
  36. package/dist/charts/area/area-chart.js.map +1 -1
  37. package/dist/charts/area/area-renderer.cjs +1 -1
  38. package/dist/charts/area/area-renderer.cjs.map +1 -1
  39. package/dist/charts/area/area-renderer.js +1 -73
  40. package/dist/charts/area/area-renderer.js.map +1 -1
  41. package/dist/charts/bar/bar-chart.cjs +1 -1
  42. package/dist/charts/bar/bar-chart.cjs.map +1 -1
  43. package/dist/charts/bar/bar-chart.js +1 -169
  44. package/dist/charts/bar/bar-chart.js.map +1 -1
  45. package/dist/charts/bar/bar-hit-test.cjs +1 -1
  46. package/dist/charts/bar/bar-hit-test.cjs.map +1 -1
  47. package/dist/charts/bar/bar-hit-test.js +1 -29
  48. package/dist/charts/bar/bar-hit-test.js.map +1 -1
  49. package/dist/charts/bar/bar-renderer.cjs +1 -1
  50. package/dist/charts/bar/bar-renderer.cjs.map +1 -1
  51. package/dist/charts/bar/bar-renderer.js +1 -106
  52. package/dist/charts/bar/bar-renderer.js.map +1 -1
  53. package/dist/charts/line/line-chart.cjs +1 -1
  54. package/dist/charts/line/line-chart.cjs.map +1 -1
  55. package/dist/charts/line/line-chart.js +1 -58
  56. package/dist/charts/line/line-chart.js.map +1 -1
  57. package/dist/charts/line/line-renderer.cjs +1 -1
  58. package/dist/charts/line/line-renderer.cjs.map +1 -1
  59. package/dist/charts/line/line-renderer.js +1 -100
  60. package/dist/charts/line/line-renderer.js.map +1 -1
  61. package/dist/charts/pie/pie-chart.cjs +1 -1
  62. package/dist/charts/pie/pie-chart.cjs.map +1 -1
  63. package/dist/charts/pie/pie-chart.js +1 -165
  64. package/dist/charts/pie/pie-chart.js.map +1 -1
  65. package/dist/charts/pie/pie-renderer.cjs +1 -1
  66. package/dist/charts/pie/pie-renderer.cjs.map +1 -1
  67. package/dist/charts/pie/pie-renderer.js +1 -76
  68. package/dist/charts/pie/pie-renderer.js.map +1 -1
  69. package/dist/charts/sparkline/sparkline.cjs +1 -1
  70. package/dist/charts/sparkline/sparkline.cjs.map +1 -1
  71. package/dist/charts/sparkline/sparkline.js +1 -191
  72. package/dist/charts/sparkline/sparkline.js.map +1 -1
  73. package/dist/core/cartesian-model.cjs +1 -1
  74. package/dist/core/cartesian-model.cjs.map +1 -1
  75. package/dist/core/cartesian-model.js +1 -30
  76. package/dist/core/cartesian-model.js.map +1 -1
  77. package/dist/core/cartesian-scales.cjs +1 -1
  78. package/dist/core/cartesian-scales.cjs.map +1 -1
  79. package/dist/core/cartesian-scales.js +1 -37
  80. package/dist/core/cartesian-scales.js.map +1 -1
  81. package/dist/core/chart-base.cjs +1 -1
  82. package/dist/core/chart-base.cjs.map +1 -1
  83. package/dist/core/chart-base.js +1 -53
  84. package/dist/core/chart-base.js.map +1 -1
  85. package/dist/core/chart-scaffold.cjs +1 -1
  86. package/dist/core/chart-scaffold.cjs.map +1 -1
  87. package/dist/core/chart-scaffold.js +1 -89
  88. package/dist/core/chart-scaffold.js.map +1 -1
  89. package/dist/core/layout.cjs +1 -1
  90. package/dist/core/layout.cjs.map +1 -1
  91. package/dist/core/layout.js +1 -22
  92. package/dist/core/layout.js.map +1 -1
  93. package/dist/core/responsive.cjs +1 -1
  94. package/dist/core/responsive.cjs.map +1 -1
  95. package/dist/core/responsive.js +1 -19
  96. package/dist/core/responsive.js.map +1 -1
  97. package/dist/devtools.cjs +1 -1
  98. package/dist/devtools.cjs.map +1 -1
  99. package/dist/devtools.js +1 -18
  100. package/dist/devtools.js.map +1 -1
  101. package/dist/errors.cjs +1 -1
  102. package/dist/errors.cjs.map +1 -1
  103. package/dist/errors.js +1 -9
  104. package/dist/errors.js.map +1 -1
  105. package/dist/index.js +1 -11
  106. package/dist/interaction/crosshair.cjs +1 -1
  107. package/dist/interaction/crosshair.cjs.map +1 -1
  108. package/dist/interaction/crosshair.js +1 -45
  109. package/dist/interaction/crosshair.js.map +1 -1
  110. package/dist/interaction/events.cjs +1 -1
  111. package/dist/interaction/events.cjs.map +1 -1
  112. package/dist/interaction/events.js +1 -11
  113. package/dist/interaction/events.js.map +1 -1
  114. package/dist/interaction/legend.cjs +1 -1
  115. package/dist/interaction/legend.cjs.map +1 -1
  116. package/dist/interaction/legend.js +1 -30
  117. package/dist/interaction/legend.js.map +1 -1
  118. package/dist/interaction/series-interaction.cjs +1 -1
  119. package/dist/interaction/series-interaction.cjs.map +1 -1
  120. package/dist/interaction/series-interaction.js +1 -97
  121. package/dist/interaction/series-interaction.js.map +1 -1
  122. package/dist/interaction/tooltip.cjs +1 -1
  123. package/dist/interaction/tooltip.cjs.map +1 -1
  124. package/dist/interaction/tooltip.js +1 -63
  125. package/dist/interaction/tooltip.js.map +1 -1
  126. package/dist/prism.cjs +1 -1
  127. package/dist/prism.cjs.map +1 -1
  128. package/dist/prism.iife.js +1 -1
  129. package/dist/prism.iife.js.map +1 -1
  130. package/dist/prism.js +1 -1
  131. package/dist/prism.js.map +1 -1
  132. package/dist/scales/band.cjs +1 -1
  133. package/dist/scales/band.cjs.map +1 -1
  134. package/dist/scales/band.js +1 -39
  135. package/dist/scales/band.js.map +1 -1
  136. package/dist/scales/linear.cjs +1 -1
  137. package/dist/scales/linear.cjs.map +1 -1
  138. package/dist/scales/linear.js +1 -43
  139. package/dist/scales/linear.js.map +1 -1
  140. package/dist/scales/time.cjs +1 -1
  141. package/dist/scales/time.cjs.map +1 -1
  142. package/dist/scales/time.js +1 -61
  143. package/dist/scales/time.js.map +1 -1
  144. package/dist/svg/element.cjs +1 -1
  145. package/dist/svg/element.cjs.map +1 -1
  146. package/dist/svg/element.js +1 -22
  147. package/dist/svg/element.js.map +1 -1
  148. package/dist/svg/path.cjs +1 -1
  149. package/dist/svg/path.cjs.map +1 -1
  150. package/dist/svg/path.js +1 -48
  151. package/dist/svg/path.js.map +1 -1
  152. package/dist/svg/text.cjs +1 -1
  153. package/dist/svg/text.cjs.map +1 -1
  154. package/dist/svg/text.js +1 -9
  155. package/dist/svg/text.js.map +1 -1
  156. package/dist/theme/index.cjs +1 -1
  157. package/dist/theme/index.cjs.map +1 -1
  158. package/dist/theme/index.js +1 -19
  159. package/dist/theme/index.js.map +1 -1
  160. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"cartesian-scales.cjs","names":[],"sources":["../../src/core/cartesian-scales.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport { linearScale } from '../scales/linear';\nimport { timeScale } from '../scales/time';\nimport type { Scale } from '../types';\n\nexport function buildXScale(allX: (Date | number)[], width: number): Scale<Date> | Scale<number> {\n if (allX.length === 0) return linearScale({ domain: [0, 1], range: [0, width] });\n\n if (allX.some((v) => v == null)) {\n warn(\n 'buildXScale: one or more x values are null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX.some((v) => typeof v === 'number' && !Number.isFinite(v))) {\n warn('buildXScale: one or more x values are NaN or Infinity — check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX[0] instanceof Date) {\n const dates = allX as Date[];\n const minMs = Math.min(...dates.map(Number));\n const maxMs = Math.max(...dates.map(Number));\n const min = new Date(minMs);\n const max = new Date(minMs === maxMs ? maxMs + 1 : maxMs);\n\n return timeScale({ domain: [min, max], range: [0, width] });\n }\n\n const nums = allX as number[];\n const minN = Math.min(...nums);\n const maxN = Math.max(...nums);\n\n return linearScale({ domain: [minN, minN === maxN ? maxN + 1 : maxN], nice: false, range: [0, width] });\n}\n\nexport function buildYScale(allY: number[], height: number, includeZero = true): Scale<number> {\n if (allY.length === 0) return linearScale({ domain: [0, 1], range: [height, 0] });\n\n if (allY.some((v) => v == null)) {\n warn(\n 'buildYScale: one or more y values are null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n if (allY.some((v) => !Number.isFinite(v))) {\n warn('buildYScale: one or more y values are NaN or Infinity — check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n const rawMin = Math.min(...allY);\n const minY = includeZero ? Math.min(0, rawMin) : rawMin;\n const maxY = Math.max(...allY);\n\n return linearScale({ domain: [minY, minY === maxY ? maxY + 1 : maxY], range: [height, 0] });\n}\n"],"mappings":"+FAKA,SAAgB,EAAY,EAAyB,EAA4C,CAW/F,GAVI,EAAK,SAAW,GAEhB,EAAK,KAAM,GAAM,GAAK,IAAI,GAQ1B,EAAK,KAAM,GAAM,OAAO,GAAM,UAAY,CAAC,OAAO,SAAS,CAAC,CAAC,EAG/D,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAG,CAAC,EAAG,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,EAG1D,GAAI,EAAK,aAAc,KAAM,CAC3B,IAAM,EAAQ,EACR,EAAQ,KAAK,IAAI,GAAG,EAAM,IAAI,MAAM,CAAC,EACrC,EAAQ,KAAK,IAAI,GAAG,EAAM,IAAI,MAAM,CAAC,EACrC,EAAM,IAAI,KAAK,CAAK,EACpB,EAAM,IAAI,KAAK,IAAU,EAAQ,EAAQ,EAAI,CAAK,EAExD,OAAO,EAAA,UAAU,CAAE,OAAQ,CAAC,EAAK,CAAG,EAAG,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,CAC5D,CAEA,IAAM,EAAO,EACP,EAAO,KAAK,IAAI,GAAG,CAAI,EACvB,EAAO,KAAK,IAAI,GAAG,CAAI,EAE7B,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAM,IAAS,EAAO,EAAO,EAAI,CAAI,EAAG,KAAM,GAAO,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,CACxG,CAEA,SAAgB,EAAY,EAAgB,EAAgB,EAAc,GAAqB,CAW7F,GAVI,EAAK,SAAW,GAEhB,EAAK,KAAM,GAAM,GAAK,IAAI,GAQ1B,EAAK,KAAM,GAAM,CAAC,OAAO,SAAS,CAAC,CAAC,EAGtC,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAG,CAAC,EAAG,MAAO,CAAC,EAAQ,CAAC,CAAE,CAAC,EAG3D,IAAM,EAAS,KAAK,IAAI,GAAG,CAAI,EACzB,EAAO,EAAc,KAAK,IAAI,EAAG,CAAM,EAAI,EAC3C,EAAO,KAAK,IAAI,GAAG,CAAI,EAE7B,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAM,IAAS,EAAO,EAAO,EAAI,CAAI,EAAG,MAAO,CAAC,EAAQ,CAAC,CAAE,CAAC,CAC5F"}
1
+ {"version":3,"file":"cartesian-scales.cjs","names":[],"sources":["../../src/core/cartesian-scales.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport { linearScale } from '../scales/linear';\nimport { timeScale } from '../scales/time';\nimport type { Scale } from '../types';\n\nexport function buildXScale(allX: (Date | number)[], width: number): Scale<Date> | Scale<number> {\n if (allX.length === 0) return linearScale({ domain: [0, 1], range: [0, width] });\n\n if (allX.some((v) => v == null)) {\n warn(\n 'buildXScale: one or more x values are null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX.some((v) => typeof v === 'number' && !Number.isFinite(v))) {\n warn('buildXScale: one or more x values are NaN or Infinity — check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX[0] instanceof Date) {\n const dates = allX as Date[];\n const minMs = Math.min(...dates.map(Number));\n const maxMs = Math.max(...dates.map(Number));\n const min = new Date(minMs);\n const max = new Date(minMs === maxMs ? maxMs + 1 : maxMs);\n\n return timeScale({ domain: [min, max], range: [0, width] });\n }\n\n const nums = allX as number[];\n const minN = Math.min(...nums);\n const maxN = Math.max(...nums);\n\n return linearScale({ domain: [minN, minN === maxN ? maxN + 1 : maxN], nice: false, range: [0, width] });\n}\n\nexport function buildYScale(allY: number[], height: number, includeZero = true): Scale<number> {\n if (allY.length === 0) return linearScale({ domain: [0, 1], range: [height, 0] });\n\n if (allY.some((v) => v == null)) {\n warn(\n 'buildYScale: one or more y values are null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n if (allY.some((v) => !Number.isFinite(v))) {\n warn('buildYScale: one or more y values are NaN or Infinity — check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n const rawMin = Math.min(...allY);\n const minY = includeZero ? Math.min(0, rawMin) : rawMin;\n const maxY = Math.max(...allY);\n\n return linearScale({ domain: [minY, minY === maxY ? maxY + 1 : maxY], range: [height, 0] });\n}\n"],"mappings":"+FAKA,SAAgB,YAAY,EAAyB,EAA4C,CAW/F,GAVI,EAAK,SAAW,GAEhB,EAAK,KAAM,GAAM,GAAK,IAAI,GAQ1B,EAAK,KAAM,GAAM,OAAO,GAAM,UAAY,CAAC,OAAO,SAAS,CAAC,CAAC,EAG/D,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAG,CAAC,EAAG,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,EAG1D,GAAI,EAAK,aAAc,KAAM,CAC3B,IAAM,EAAQ,EACR,EAAQ,KAAK,IAAI,GAAG,EAAM,IAAI,MAAM,CAAC,EACrC,EAAQ,KAAK,IAAI,GAAG,EAAM,IAAI,MAAM,CAAC,EACrC,EAAM,IAAI,KAAK,CAAK,EACpB,EAAM,IAAI,KAAK,IAAU,EAAQ,EAAQ,EAAI,CAAK,EAExD,OAAO,EAAA,UAAU,CAAE,OAAQ,CAAC,EAAK,CAAG,EAAG,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,CAC5D,CAEA,IAAM,EAAO,EACP,EAAO,KAAK,IAAI,GAAG,CAAI,EACvB,EAAO,KAAK,IAAI,GAAG,CAAI,EAE7B,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAM,IAAS,EAAO,EAAO,EAAI,CAAI,EAAG,KAAM,GAAO,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,CACxG,CAEA,SAAgB,YAAY,EAAgB,EAAgB,EAAc,GAAqB,CAW7F,GAVI,EAAK,SAAW,GAEhB,EAAK,KAAM,GAAM,GAAK,IAAI,GAQ1B,EAAK,KAAM,GAAM,CAAC,OAAO,SAAS,CAAC,CAAC,EAGtC,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAG,CAAC,EAAG,MAAO,CAAC,EAAQ,CAAC,CAAE,CAAC,EAG3D,IAAM,EAAS,KAAK,IAAI,GAAG,CAAI,EACzB,EAAO,EAAc,KAAK,IAAI,EAAG,CAAM,EAAI,EAC3C,EAAO,KAAK,IAAI,GAAG,CAAI,EAE7B,OAAO,EAAA,YAAY,CAAE,OAAQ,CAAC,EAAM,IAAS,EAAO,EAAO,EAAI,CAAI,EAAG,MAAO,CAAC,EAAQ,CAAC,CAAE,CAAC,CAC5F"}
@@ -1,38 +1,2 @@
1
- import "../_dev.js";
2
- import { linearScale as e } from "../scales/linear.js";
3
- import { timeScale as t } from "../scales/time.js";
4
- //#region src/core/cartesian-scales.ts
5
- function n(n, r) {
6
- if (n.length === 0 || n.some((e) => e == null) || n.some((e) => typeof e == "number" && !Number.isFinite(e))) return e({
7
- domain: [0, 1],
8
- range: [0, r]
9
- });
10
- if (n[0] instanceof Date) {
11
- let e = n, i = Math.min(...e.map(Number)), a = Math.max(...e.map(Number)), o = new Date(i), s = new Date(i === a ? a + 1 : a);
12
- return t({
13
- domain: [o, s],
14
- range: [0, r]
15
- });
16
- }
17
- let i = n, a = Math.min(...i), o = Math.max(...i);
18
- return e({
19
- domain: [a, a === o ? o + 1 : o],
20
- nice: !1,
21
- range: [0, r]
22
- });
23
- }
24
- function r(t, n, r = !0) {
25
- if (t.length === 0 || t.some((e) => e == null) || t.some((e) => !Number.isFinite(e))) return e({
26
- domain: [0, 1],
27
- range: [n, 0]
28
- });
29
- let i = Math.min(...t), a = r ? Math.min(0, i) : i, o = Math.max(...t);
30
- return e({
31
- domain: [a, a === o ? o + 1 : o],
32
- range: [n, 0]
33
- });
34
- }
35
- //#endregion
36
- export { n as buildXScale, r as buildYScale };
37
-
1
+ import"../_dev.js";import{linearScale as e}from"../scales/linear.js";import{timeScale as t}from"../scales/time.js";function buildXScale(n,r){if(n.length===0||n.some(e=>e==null)||n.some(e=>typeof e==`number`&&!Number.isFinite(e)))return e({domain:[0,1],range:[0,r]});if(n[0]instanceof Date){let e=n,i=Math.min(...e.map(Number)),a=Math.max(...e.map(Number)),o=new Date(i),s=new Date(i===a?a+1:a);return t({domain:[o,s],range:[0,r]})}let i=n,a=Math.min(...i),o=Math.max(...i);return e({domain:[a,a===o?o+1:o],nice:!1,range:[0,r]})}function buildYScale(t,n,r=!0){if(t.length===0||t.some(e=>e==null)||t.some(e=>!Number.isFinite(e)))return e({domain:[0,1],range:[n,0]});let i=Math.min(...t),a=r?Math.min(0,i):i,o=Math.max(...t);return e({domain:[a,a===o?o+1:o],range:[n,0]})}export{buildXScale,buildYScale};
38
2
  //# sourceMappingURL=cartesian-scales.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cartesian-scales.js","names":[],"sources":["../../src/core/cartesian-scales.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport { linearScale } from '../scales/linear';\nimport { timeScale } from '../scales/time';\nimport type { Scale } from '../types';\n\nexport function buildXScale(allX: (Date | number)[], width: number): Scale<Date> | Scale<number> {\n if (allX.length === 0) return linearScale({ domain: [0, 1], range: [0, width] });\n\n if (allX.some((v) => v == null)) {\n warn(\n 'buildXScale: one or more x values are null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX.some((v) => typeof v === 'number' && !Number.isFinite(v))) {\n warn('buildXScale: one or more x values are NaN or Infinity — check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX[0] instanceof Date) {\n const dates = allX as Date[];\n const minMs = Math.min(...dates.map(Number));\n const maxMs = Math.max(...dates.map(Number));\n const min = new Date(minMs);\n const max = new Date(minMs === maxMs ? maxMs + 1 : maxMs);\n\n return timeScale({ domain: [min, max], range: [0, width] });\n }\n\n const nums = allX as number[];\n const minN = Math.min(...nums);\n const maxN = Math.max(...nums);\n\n return linearScale({ domain: [minN, minN === maxN ? maxN + 1 : maxN], nice: false, range: [0, width] });\n}\n\nexport function buildYScale(allY: number[], height: number, includeZero = true): Scale<number> {\n if (allY.length === 0) return linearScale({ domain: [0, 1], range: [height, 0] });\n\n if (allY.some((v) => v == null)) {\n warn(\n 'buildYScale: one or more y values are null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n if (allY.some((v) => !Number.isFinite(v))) {\n warn('buildYScale: one or more y values are NaN or Infinity — check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n const rawMin = Math.min(...allY);\n const minY = includeZero ? Math.min(0, rawMin) : rawMin;\n const maxY = Math.max(...allY);\n\n return linearScale({ domain: [minY, minY === maxY ? maxY + 1 : maxY], range: [height, 0] });\n}\n"],"mappings":";;;;AAKA,SAAgB,EAAY,GAAyB,GAA4C;CAW/F,IAVI,EAAK,WAAW,KAEhB,EAAK,MAAM,MAAM,KAAK,IAAI,KAQ1B,EAAK,MAAM,MAAM,OAAO,KAAM,YAAY,CAAC,OAAO,SAAS,CAAC,CAAC,GAG/D,OAAO,EAAY;EAAE,QAAQ,CAAC,GAAG,CAAC;EAAG,OAAO,CAAC,GAAG,CAAK;CAAE,CAAC;CAG1D,IAAI,EAAK,cAAc,MAAM;EAC3B,IAAM,IAAQ,GACR,IAAQ,KAAK,IAAI,GAAG,EAAM,IAAI,MAAM,CAAC,GACrC,IAAQ,KAAK,IAAI,GAAG,EAAM,IAAI,MAAM,CAAC,GACrC,IAAM,IAAI,KAAK,CAAK,GACpB,IAAM,IAAI,KAAK,MAAU,IAAQ,IAAQ,IAAI,CAAK;EAExD,OAAO,EAAU;GAAE,QAAQ,CAAC,GAAK,CAAG;GAAG,OAAO,CAAC,GAAG,CAAK;EAAE,CAAC;CAC5D;CAEA,IAAM,IAAO,GACP,IAAO,KAAK,IAAI,GAAG,CAAI,GACvB,IAAO,KAAK,IAAI,GAAG,CAAI;CAE7B,OAAO,EAAY;EAAE,QAAQ,CAAC,GAAM,MAAS,IAAO,IAAO,IAAI,CAAI;EAAG,MAAM;EAAO,OAAO,CAAC,GAAG,CAAK;CAAE,CAAC;AACxG;AAEA,SAAgB,EAAY,GAAgB,GAAgB,IAAc,IAAqB;CAW7F,IAVI,EAAK,WAAW,KAEhB,EAAK,MAAM,MAAM,KAAK,IAAI,KAQ1B,EAAK,MAAM,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC,GAGtC,OAAO,EAAY;EAAE,QAAQ,CAAC,GAAG,CAAC;EAAG,OAAO,CAAC,GAAQ,CAAC;CAAE,CAAC;CAG3D,IAAM,IAAS,KAAK,IAAI,GAAG,CAAI,GACzB,IAAO,IAAc,KAAK,IAAI,GAAG,CAAM,IAAI,GAC3C,IAAO,KAAK,IAAI,GAAG,CAAI;CAE7B,OAAO,EAAY;EAAE,QAAQ,CAAC,GAAM,MAAS,IAAO,IAAO,IAAI,CAAI;EAAG,OAAO,CAAC,GAAQ,CAAC;CAAE,CAAC;AAC5F"}
1
+ {"version":3,"file":"cartesian-scales.js","names":[],"sources":["../../src/core/cartesian-scales.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport { linearScale } from '../scales/linear';\nimport { timeScale } from '../scales/time';\nimport type { Scale } from '../types';\n\nexport function buildXScale(allX: (Date | number)[], width: number): Scale<Date> | Scale<number> {\n if (allX.length === 0) return linearScale({ domain: [0, 1], range: [0, width] });\n\n if (allX.some((v) => v == null)) {\n warn(\n 'buildXScale: one or more x values are null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX.some((v) => typeof v === 'number' && !Number.isFinite(v))) {\n warn('buildXScale: one or more x values are NaN or Infinity — check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [0, width] });\n }\n\n if (allX[0] instanceof Date) {\n const dates = allX as Date[];\n const minMs = Math.min(...dates.map(Number));\n const maxMs = Math.max(...dates.map(Number));\n const min = new Date(minMs);\n const max = new Date(minMs === maxMs ? maxMs + 1 : maxMs);\n\n return timeScale({ domain: [min, max], range: [0, width] });\n }\n\n const nums = allX as number[];\n const minN = Math.min(...nums);\n const maxN = Math.max(...nums);\n\n return linearScale({ domain: [minN, minN === maxN ? maxN + 1 : maxN], nice: false, range: [0, width] });\n}\n\nexport function buildYScale(allY: number[], height: number, includeZero = true): Scale<number> {\n if (allY.length === 0) return linearScale({ domain: [0, 1], range: [height, 0] });\n\n if (allY.some((v) => v == null)) {\n warn(\n 'buildYScale: one or more y values are null or undefined — data must use the Datum shape { key, value }. Did you pass { x, y } instead?',\n );\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n if (allY.some((v) => !Number.isFinite(v))) {\n warn('buildYScale: one or more y values are NaN or Infinity — check upstream data for invalid arithmetic.');\n\n return linearScale({ domain: [0, 1], range: [height, 0] });\n }\n\n const rawMin = Math.min(...allY);\n const minY = includeZero ? Math.min(0, rawMin) : rawMin;\n const maxY = Math.max(...allY);\n\n return linearScale({ domain: [minY, minY === maxY ? maxY + 1 : maxY], range: [height, 0] });\n}\n"],"mappings":"mHAKA,SAAgB,YAAY,EAAyB,EAA4C,CAW/F,GAVI,EAAK,SAAW,GAEhB,EAAK,KAAM,GAAM,GAAK,IAAI,GAQ1B,EAAK,KAAM,GAAM,OAAO,GAAM,UAAY,CAAC,OAAO,SAAS,CAAC,CAAC,EAG/D,OAAO,EAAY,CAAE,OAAQ,CAAC,EAAG,CAAC,EAAG,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,EAG1D,GAAI,EAAK,aAAc,KAAM,CAC3B,IAAM,EAAQ,EACR,EAAQ,KAAK,IAAI,GAAG,EAAM,IAAI,MAAM,CAAC,EACrC,EAAQ,KAAK,IAAI,GAAG,EAAM,IAAI,MAAM,CAAC,EACrC,EAAM,IAAI,KAAK,CAAK,EACpB,EAAM,IAAI,KAAK,IAAU,EAAQ,EAAQ,EAAI,CAAK,EAExD,OAAO,EAAU,CAAE,OAAQ,CAAC,EAAK,CAAG,EAAG,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,CAC5D,CAEA,IAAM,EAAO,EACP,EAAO,KAAK,IAAI,GAAG,CAAI,EACvB,EAAO,KAAK,IAAI,GAAG,CAAI,EAE7B,OAAO,EAAY,CAAE,OAAQ,CAAC,EAAM,IAAS,EAAO,EAAO,EAAI,CAAI,EAAG,KAAM,GAAO,MAAO,CAAC,EAAG,CAAK,CAAE,CAAC,CACxG,CAEA,SAAgB,YAAY,EAAgB,EAAgB,EAAc,GAAqB,CAW7F,GAVI,EAAK,SAAW,GAEhB,EAAK,KAAM,GAAM,GAAK,IAAI,GAQ1B,EAAK,KAAM,GAAM,CAAC,OAAO,SAAS,CAAC,CAAC,EAGtC,OAAO,EAAY,CAAE,OAAQ,CAAC,EAAG,CAAC,EAAG,MAAO,CAAC,EAAQ,CAAC,CAAE,CAAC,EAG3D,IAAM,EAAS,KAAK,IAAI,GAAG,CAAI,EACzB,EAAO,EAAc,KAAK,IAAI,EAAG,CAAM,EAAI,EAC3C,EAAO,KAAK,IAAI,GAAG,CAAI,EAE7B,OAAO,EAAY,CAAE,OAAQ,CAAC,EAAM,IAAS,EAAO,EAAO,EAAI,CAAI,EAAG,MAAO,CAAC,EAAQ,CAAC,CAAE,CAAC,CAC5F"}
@@ -1,2 +1,2 @@
1
- require("../_dev.cjs");const e=require("../svg/element.cjs"),t=require("../errors.cjs"),n=require("./layout.cjs"),r=require("./responsive.cjs");function i(i,a,o){if(!(typeof i==`object`&&i&&i.nodeType===1&&typeof i.appendChild==`function`&&typeof i.getBoundingClientRect==`function`)){let e=i,n=e===null?`null`:typeof e==`object`?e.constructor?.name??`object`:typeof e;throw new t.PrismRenderError(`Invalid chart configuration: \`container\` must be a DOM Element, received ${n}.`)}let s=n.resolveMargin(a.margin),c=a.a11y,l=e.createSvgElement(`svg`,{...!c||c.decorative?{"aria-hidden":`true`}:{"aria-label":c.ariaLabel,role:`img`,tabindex:`0`},class:`prism-chart`,style:`display:block;width:100%;height:100%`}),u=e.createSvgElement(`g`,{class:`prism-chart-area`,transform:`translate(${s.left},${s.top})`});l.appendChild(u);let d=i.getBoundingClientRect();d.width===0||d.height;let f={height:d.height||300,margin:s,width:d.width||600},p=r.observeResize(i,(t,n)=>{f.height=n,f.width=t,e.setAttributes(l,{height:n,viewBox:`0 0 ${t} ${n}`,width:t}),o?.()}),m=d.width||600,h=d.height||300;return e.setAttributes(l,{height:h,viewBox:`0 0 ${m} ${h}`,width:m}),i.appendChild(l),{chartArea:u,dimensions:f,dispose(){p(),l.remove()},svg:l}}exports.createChartBase=i;
1
+ require("../_dev.cjs");const e=require("../svg/element.cjs"),t=require("../errors.cjs"),n=require("./layout.cjs"),r=require("./responsive.cjs");function createChartBase(i,a,o){if(!(typeof i==`object`&&i&&i.nodeType===1&&typeof i.appendChild==`function`&&typeof i.getBoundingClientRect==`function`)){let e=i,n=e===null?`null`:typeof e==`object`?e.constructor?.name??`object`:typeof e;throw new t.PrismRenderError(`Invalid chart configuration: \`container\` must be a DOM Element, received ${n}.`)}let s=n.resolveMargin(a.margin),c=a.a11y,l=e.createSvgElement(`svg`,{...!c||c.decorative?{"aria-hidden":`true`}:{"aria-label":c.ariaLabel,role:`img`,tabindex:`0`},class:`prism-chart`,style:`display:block;width:100%;height:100%`}),u=e.createSvgElement(`g`,{class:`prism-chart-area`,transform:`translate(${s.left},${s.top})`});l.appendChild(u);let d=i.getBoundingClientRect();d.width===0||d.height;let f={height:d.height||300,margin:s,width:d.width||600},p=r.observeResize(i,(t,n)=>{f.height=n,f.width=t,e.setAttributes(l,{height:n,viewBox:`0 0 ${t} ${n}`,width:t}),o?.()}),m=d.width||600,h=d.height||300;return e.setAttributes(l,{height:h,viewBox:`0 0 ${m} ${h}`,width:m}),i.appendChild(l),{chartArea:u,dimensions:f,dispose(){p(),l.remove()},svg:l}}exports.createChartBase=createChartBase;
2
2
  //# sourceMappingURL=chart-base.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-base.cjs","names":[],"sources":["../../src/core/chart-base.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport { PrismRenderError } from '../errors';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { ChartA11y, ChartDimensions, ChartMargin } from '../types';\nimport { resolveMargin } from './layout';\nimport { observeResize } from './responsive';\n\nexport interface ChartBase {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n dispose(): void;\n svg: SVGSVGElement;\n}\n\nexport function createChartBase(\n container: HTMLElement,\n options: { a11y?: ChartA11y; margin?: Partial<ChartMargin> },\n onResize?: () => void,\n): ChartBase {\n // Duck-typed rather than `instanceof Element` — an `instanceof` check would reject a\n // structurally valid Element from a different realm (e.g. an Element created via\n // `iframe.contentDocument.createElement(...)`, whose prototype chain terminates in that\n // iframe's own `Element` constructor), which is a legitimate usage pattern this package\n // doesn't otherwise restrict.\n const isElementLike =\n typeof container === 'object' &&\n container !== null &&\n container.nodeType === 1 &&\n typeof container.appendChild === 'function' &&\n typeof container.getBoundingClientRect === 'function';\n\n if (!isElementLike) {\n const received: unknown = container;\n const kind =\n received === null\n ? 'null'\n : typeof received === 'object'\n ? (received.constructor?.name ?? 'object')\n : typeof received;\n\n throw new PrismRenderError(`Invalid chart configuration: \\`container\\` must be a DOM Element, received ${kind}.`);\n }\n\n const margin = resolveMargin(options.margin);\n const a11y = options.a11y;\n const svg = createSvgElement('svg', {\n ...(!a11y || a11y.decorative\n ? { 'aria-hidden': 'true' }\n : { 'aria-label': a11y.ariaLabel, role: 'img', tabindex: '0' }),\n class: 'prism-chart',\n style: 'display:block;width:100%;height:100%',\n });\n\n const chartAreaGroup = createSvgElement('g', {\n class: 'prism-chart-area',\n transform: `translate(${margin.left},${margin.top})`,\n });\n\n svg.appendChild(chartAreaGroup);\n\n const rect = container.getBoundingClientRect();\n\n if (rect.width === 0 || rect.height === 0) {\n warn(\n 'Chart container has zero dimensions. Ensure the container has a defined width and height before mounting a chart.',\n );\n }\n\n const dimensions: ChartDimensions = {\n height: rect.height || 300,\n margin,\n width: rect.width || 600,\n };\n\n const stopObserving = observeResize(container, (width, height) => {\n dimensions.height = height;\n dimensions.width = width;\n setAttributes(svg, { height, viewBox: `0 0 ${width} ${height}`, width });\n onResize?.();\n });\n\n const initialWidth = rect.width || 600;\n const initialHeight = rect.height || 300;\n\n setAttributes(svg, {\n height: initialHeight,\n viewBox: `0 0 ${initialWidth} ${initialHeight}`,\n width: initialWidth,\n });\n\n container.appendChild(svg);\n\n return {\n chartArea: chartAreaGroup,\n dimensions,\n dispose() {\n stopObserving();\n svg.remove();\n },\n svg,\n };\n}\n"],"mappings":"gJAcA,SAAgB,EACd,EACA,EACA,EACW,CAaX,GAAI,EANF,OAAO,GAAc,UACrB,GACA,EAAU,WAAa,GACvB,OAAO,EAAU,aAAgB,YACjC,OAAO,EAAU,uBAA0B,YAEzB,CAClB,IAAM,EAAoB,EACpB,EACJ,IAAa,KACT,OACA,OAAO,GAAa,SACjB,EAAS,aAAa,MAAQ,SAC/B,OAAO,EAEf,MAAM,IAAI,EAAA,iBAAiB,8EAA8E,EAAK,EAAE,CAClH,CAEA,IAAM,EAAS,EAAA,cAAc,EAAQ,MAAM,EACrC,EAAO,EAAQ,KACf,EAAM,EAAA,iBAAiB,MAAO,CAClC,GAAI,CAAC,GAAQ,EAAK,WACd,CAAE,cAAe,MAAO,EACxB,CAAE,aAAc,EAAK,UAAW,KAAM,MAAO,SAAU,GAAI,EAC/D,MAAO,cACP,MAAO,sCACT,CAAC,EAEK,EAAiB,EAAA,iBAAiB,IAAK,CAC3C,MAAO,mBACP,UAAW,aAAa,EAAO,KAAK,GAAG,EAAO,IAAI,EACpD,CAAC,EAED,EAAI,YAAY,CAAc,EAE9B,IAAM,EAAO,EAAU,sBAAsB,EAEzC,EAAK,QAAU,GAAK,EAAK,OAM7B,IAAM,EAA8B,CAClC,OAAQ,EAAK,QAAU,IACvB,SACA,MAAO,EAAK,OAAS,GACvB,EAEM,EAAgB,EAAA,cAAc,GAAY,EAAO,IAAW,CAChE,EAAW,OAAS,EACpB,EAAW,MAAQ,EACnB,EAAA,cAAc,EAAK,CAAE,SAAQ,QAAS,OAAO,EAAM,GAAG,IAAU,OAAM,CAAC,EACvE,IAAW,CACb,CAAC,EAEK,EAAe,EAAK,OAAS,IAC7B,EAAgB,EAAK,QAAU,IAUrC,OARA,EAAA,cAAc,EAAK,CACjB,OAAQ,EACR,QAAS,OAAO,EAAa,GAAG,IAChC,MAAO,CACT,CAAC,EAED,EAAU,YAAY,CAAG,EAElB,CACL,UAAW,EACX,aACA,SAAU,CACR,EAAc,EACd,EAAI,OAAO,CACb,EACA,KACF,CACF"}
1
+ {"version":3,"file":"chart-base.cjs","names":[],"sources":["../../src/core/chart-base.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport { PrismRenderError } from '../errors';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { ChartA11y, ChartDimensions, ChartMargin } from '../types';\nimport { resolveMargin } from './layout';\nimport { observeResize } from './responsive';\n\nexport interface ChartBase {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n dispose(): void;\n svg: SVGSVGElement;\n}\n\nexport function createChartBase(\n container: HTMLElement,\n options: { a11y?: ChartA11y; margin?: Partial<ChartMargin> },\n onResize?: () => void,\n): ChartBase {\n // Duck-typed rather than `instanceof Element` — an `instanceof` check would reject a\n // structurally valid Element from a different realm (e.g. an Element created via\n // `iframe.contentDocument.createElement(...)`, whose prototype chain terminates in that\n // iframe's own `Element` constructor), which is a legitimate usage pattern this package\n // doesn't otherwise restrict.\n const isElementLike =\n typeof container === 'object' &&\n container !== null &&\n container.nodeType === 1 &&\n typeof container.appendChild === 'function' &&\n typeof container.getBoundingClientRect === 'function';\n\n if (!isElementLike) {\n const received: unknown = container;\n const kind =\n received === null\n ? 'null'\n : typeof received === 'object'\n ? (received.constructor?.name ?? 'object')\n : typeof received;\n\n throw new PrismRenderError(`Invalid chart configuration: \\`container\\` must be a DOM Element, received ${kind}.`);\n }\n\n const margin = resolveMargin(options.margin);\n const a11y = options.a11y;\n const svg = createSvgElement('svg', {\n ...(!a11y || a11y.decorative\n ? { 'aria-hidden': 'true' }\n : { 'aria-label': a11y.ariaLabel, role: 'img', tabindex: '0' }),\n class: 'prism-chart',\n style: 'display:block;width:100%;height:100%',\n });\n\n const chartAreaGroup = createSvgElement('g', {\n class: 'prism-chart-area',\n transform: `translate(${margin.left},${margin.top})`,\n });\n\n svg.appendChild(chartAreaGroup);\n\n const rect = container.getBoundingClientRect();\n\n if (rect.width === 0 || rect.height === 0) {\n warn(\n 'Chart container has zero dimensions. Ensure the container has a defined width and height before mounting a chart.',\n );\n }\n\n const dimensions: ChartDimensions = {\n height: rect.height || 300,\n margin,\n width: rect.width || 600,\n };\n\n const stopObserving = observeResize(container, (width, height) => {\n dimensions.height = height;\n dimensions.width = width;\n setAttributes(svg, { height, viewBox: `0 0 ${width} ${height}`, width });\n onResize?.();\n });\n\n const initialWidth = rect.width || 600;\n const initialHeight = rect.height || 300;\n\n setAttributes(svg, {\n height: initialHeight,\n viewBox: `0 0 ${initialWidth} ${initialHeight}`,\n width: initialWidth,\n });\n\n container.appendChild(svg);\n\n return {\n chartArea: chartAreaGroup,\n dimensions,\n dispose() {\n stopObserving();\n svg.remove();\n },\n svg,\n };\n}\n"],"mappings":"gJAcA,SAAgB,gBACd,EACA,EACA,EACW,CAaX,GAAI,EANF,OAAO,GAAc,UACrB,GACA,EAAU,WAAa,GACvB,OAAO,EAAU,aAAgB,YACjC,OAAO,EAAU,uBAA0B,YAEzB,CAClB,IAAM,EAAoB,EACpB,EACJ,IAAa,KACT,OACA,OAAO,GAAa,SACjB,EAAS,aAAa,MAAQ,SAC/B,OAAO,EAEf,MAAM,IAAI,EAAA,iBAAiB,8EAA8E,EAAK,EAAE,CAClH,CAEA,IAAM,EAAS,EAAA,cAAc,EAAQ,MAAM,EACrC,EAAO,EAAQ,KACf,EAAM,EAAA,iBAAiB,MAAO,CAClC,GAAI,CAAC,GAAQ,EAAK,WACd,CAAE,cAAe,MAAO,EACxB,CAAE,aAAc,EAAK,UAAW,KAAM,MAAO,SAAU,GAAI,EAC/D,MAAO,cACP,MAAO,sCACT,CAAC,EAEK,EAAiB,EAAA,iBAAiB,IAAK,CAC3C,MAAO,mBACP,UAAW,aAAa,EAAO,KAAK,GAAG,EAAO,IAAI,EACpD,CAAC,EAED,EAAI,YAAY,CAAc,EAE9B,IAAM,EAAO,EAAU,sBAAsB,EAEzC,EAAK,QAAU,GAAK,EAAK,OAM7B,IAAM,EAA8B,CAClC,OAAQ,EAAK,QAAU,IACvB,SACA,MAAO,EAAK,OAAS,GACvB,EAEM,EAAgB,EAAA,cAAc,GAAY,EAAO,IAAW,CAChE,EAAW,OAAS,EACpB,EAAW,MAAQ,EACnB,EAAA,cAAc,EAAK,CAAE,SAAQ,QAAS,OAAO,EAAM,GAAG,IAAU,OAAM,CAAC,EACvE,IAAW,CACb,CAAC,EAEK,EAAe,EAAK,OAAS,IAC7B,EAAgB,EAAK,QAAU,IAUrC,OARA,EAAA,cAAc,EAAK,CACjB,OAAQ,EACR,QAAS,OAAO,EAAa,GAAG,IAChC,MAAO,CACT,CAAC,EAED,EAAU,YAAY,CAAG,EAElB,CACL,UAAW,EACX,aACA,SAAU,CACR,EAAc,EACd,EAAI,OAAO,CACb,EACA,KACF,CACF"}
@@ -1,54 +1,2 @@
1
- import "../_dev.js";
2
- import { createSvgElement as e, setAttributes as t } from "../svg/element.js";
3
- import { PrismRenderError as n } from "../errors.js";
4
- import { resolveMargin as r } from "./layout.js";
5
- import { observeResize as i } from "./responsive.js";
6
- //#region src/core/chart-base.ts
7
- function a(a, o, s) {
8
- if (!(typeof a == "object" && a && a.nodeType === 1 && typeof a.appendChild == "function" && typeof a.getBoundingClientRect == "function")) {
9
- let e = a, t = e === null ? "null" : typeof e == "object" ? e.constructor?.name ?? "object" : typeof e;
10
- throw new n(`Invalid chart configuration: \`container\` must be a DOM Element, received ${t}.`);
11
- }
12
- let c = r(o.margin), l = o.a11y, u = e("svg", {
13
- ...!l || l.decorative ? { "aria-hidden": "true" } : {
14
- "aria-label": l.ariaLabel,
15
- role: "img",
16
- tabindex: "0"
17
- },
18
- class: "prism-chart",
19
- style: "display:block;width:100%;height:100%"
20
- }), d = e("g", {
21
- class: "prism-chart-area",
22
- transform: `translate(${c.left},${c.top})`
23
- });
24
- u.appendChild(d);
25
- let f = a.getBoundingClientRect();
26
- f.width === 0 || f.height;
27
- let p = {
28
- height: f.height || 300,
29
- margin: c,
30
- width: f.width || 600
31
- }, m = i(a, (e, n) => {
32
- p.height = n, p.width = e, t(u, {
33
- height: n,
34
- viewBox: `0 0 ${e} ${n}`,
35
- width: e
36
- }), s?.();
37
- }), h = f.width || 600, g = f.height || 300;
38
- return t(u, {
39
- height: g,
40
- viewBox: `0 0 ${h} ${g}`,
41
- width: h
42
- }), a.appendChild(u), {
43
- chartArea: d,
44
- dimensions: p,
45
- dispose() {
46
- m(), u.remove();
47
- },
48
- svg: u
49
- };
50
- }
51
- //#endregion
52
- export { a as createChartBase };
53
-
1
+ import"../_dev.js";import{createSvgElement as e,setAttributes as t}from"../svg/element.js";import{PrismRenderError as n}from"../errors.js";import{resolveMargin as r}from"./layout.js";import{observeResize as i}from"./responsive.js";function createChartBase(a,o,s){if(!(typeof a==`object`&&a&&a.nodeType===1&&typeof a.appendChild==`function`&&typeof a.getBoundingClientRect==`function`)){let e=a,t=e===null?`null`:typeof e==`object`?e.constructor?.name??`object`:typeof e;throw new n(`Invalid chart configuration: \`container\` must be a DOM Element, received ${t}.`)}let c=r(o.margin),l=o.a11y,u=e(`svg`,{...!l||l.decorative?{"aria-hidden":`true`}:{"aria-label":l.ariaLabel,role:`img`,tabindex:`0`},class:`prism-chart`,style:`display:block;width:100%;height:100%`}),d=e(`g`,{class:`prism-chart-area`,transform:`translate(${c.left},${c.top})`});u.appendChild(d);let f=a.getBoundingClientRect();f.width===0||f.height;let p={height:f.height||300,margin:c,width:f.width||600},m=i(a,(e,n)=>{p.height=n,p.width=e,t(u,{height:n,viewBox:`0 0 ${e} ${n}`,width:e}),s?.()}),h=f.width||600,g=f.height||300;return t(u,{height:g,viewBox:`0 0 ${h} ${g}`,width:h}),a.appendChild(u),{chartArea:d,dimensions:p,dispose(){m(),u.remove()},svg:u}}export{createChartBase};
54
2
  //# sourceMappingURL=chart-base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-base.js","names":[],"sources":["../../src/core/chart-base.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport { PrismRenderError } from '../errors';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { ChartA11y, ChartDimensions, ChartMargin } from '../types';\nimport { resolveMargin } from './layout';\nimport { observeResize } from './responsive';\n\nexport interface ChartBase {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n dispose(): void;\n svg: SVGSVGElement;\n}\n\nexport function createChartBase(\n container: HTMLElement,\n options: { a11y?: ChartA11y; margin?: Partial<ChartMargin> },\n onResize?: () => void,\n): ChartBase {\n // Duck-typed rather than `instanceof Element` — an `instanceof` check would reject a\n // structurally valid Element from a different realm (e.g. an Element created via\n // `iframe.contentDocument.createElement(...)`, whose prototype chain terminates in that\n // iframe's own `Element` constructor), which is a legitimate usage pattern this package\n // doesn't otherwise restrict.\n const isElementLike =\n typeof container === 'object' &&\n container !== null &&\n container.nodeType === 1 &&\n typeof container.appendChild === 'function' &&\n typeof container.getBoundingClientRect === 'function';\n\n if (!isElementLike) {\n const received: unknown = container;\n const kind =\n received === null\n ? 'null'\n : typeof received === 'object'\n ? (received.constructor?.name ?? 'object')\n : typeof received;\n\n throw new PrismRenderError(`Invalid chart configuration: \\`container\\` must be a DOM Element, received ${kind}.`);\n }\n\n const margin = resolveMargin(options.margin);\n const a11y = options.a11y;\n const svg = createSvgElement('svg', {\n ...(!a11y || a11y.decorative\n ? { 'aria-hidden': 'true' }\n : { 'aria-label': a11y.ariaLabel, role: 'img', tabindex: '0' }),\n class: 'prism-chart',\n style: 'display:block;width:100%;height:100%',\n });\n\n const chartAreaGroup = createSvgElement('g', {\n class: 'prism-chart-area',\n transform: `translate(${margin.left},${margin.top})`,\n });\n\n svg.appendChild(chartAreaGroup);\n\n const rect = container.getBoundingClientRect();\n\n if (rect.width === 0 || rect.height === 0) {\n warn(\n 'Chart container has zero dimensions. Ensure the container has a defined width and height before mounting a chart.',\n );\n }\n\n const dimensions: ChartDimensions = {\n height: rect.height || 300,\n margin,\n width: rect.width || 600,\n };\n\n const stopObserving = observeResize(container, (width, height) => {\n dimensions.height = height;\n dimensions.width = width;\n setAttributes(svg, { height, viewBox: `0 0 ${width} ${height}`, width });\n onResize?.();\n });\n\n const initialWidth = rect.width || 600;\n const initialHeight = rect.height || 300;\n\n setAttributes(svg, {\n height: initialHeight,\n viewBox: `0 0 ${initialWidth} ${initialHeight}`,\n width: initialWidth,\n });\n\n container.appendChild(svg);\n\n return {\n chartArea: chartAreaGroup,\n dimensions,\n dispose() {\n stopObserving();\n svg.remove();\n },\n svg,\n };\n}\n"],"mappings":";;;;;;AAcA,SAAgB,EACd,GACA,GACA,GACW;CAaX,IAAI,EANF,OAAO,KAAc,YACrB,KACA,EAAU,aAAa,KACvB,OAAO,EAAU,eAAgB,cACjC,OAAO,EAAU,yBAA0B,aAEzB;EAClB,IAAM,IAAoB,GACpB,IACJ,MAAa,OACT,SACA,OAAO,KAAa,WACjB,EAAS,aAAa,QAAQ,WAC/B,OAAO;EAEf,MAAM,IAAI,EAAiB,8EAA8E,EAAK,EAAE;CAClH;CAEA,IAAM,IAAS,EAAc,EAAQ,MAAM,GACrC,IAAO,EAAQ,MACf,IAAM,EAAiB,OAAO;EAClC,GAAI,CAAC,KAAQ,EAAK,aACd,EAAE,eAAe,OAAO,IACxB;GAAE,cAAc,EAAK;GAAW,MAAM;GAAO,UAAU;EAAI;EAC/D,OAAO;EACP,OAAO;CACT,CAAC,GAEK,IAAiB,EAAiB,KAAK;EAC3C,OAAO;EACP,WAAW,aAAa,EAAO,KAAK,GAAG,EAAO,IAAI;CACpD,CAAC;CAED,EAAI,YAAY,CAAc;CAE9B,IAAM,IAAO,EAAU,sBAAsB;CAE7C,AAAI,EAAK,UAAU,KAAK,EAAK;CAM7B,IAAM,IAA8B;EAClC,QAAQ,EAAK,UAAU;EACvB;EACA,OAAO,EAAK,SAAS;CACvB,GAEM,IAAgB,EAAc,IAAY,GAAO,MAAW;EAIhE,AAHA,EAAW,SAAS,GACpB,EAAW,QAAQ,GACnB,EAAc,GAAK;GAAE;GAAQ,SAAS,OAAO,EAAM,GAAG;GAAU;EAAM,CAAC,GACvE,IAAW;CACb,CAAC,GAEK,IAAe,EAAK,SAAS,KAC7B,IAAgB,EAAK,UAAU;CAUrC,OARA,EAAc,GAAK;EACjB,QAAQ;EACR,SAAS,OAAO,EAAa,GAAG;EAChC,OAAO;CACT,CAAC,GAED,EAAU,YAAY,CAAG,GAElB;EACL,WAAW;EACX;EACA,UAAU;GAER,AADA,EAAc,GACd,EAAI,OAAO;EACb;EACA;CACF;AACF"}
1
+ {"version":3,"file":"chart-base.js","names":[],"sources":["../../src/core/chart-base.ts"],"sourcesContent":["import { warn } from '../_dev';\nimport { PrismRenderError } from '../errors';\nimport { createSvgElement, setAttributes } from '../svg/element';\nimport type { ChartA11y, ChartDimensions, ChartMargin } from '../types';\nimport { resolveMargin } from './layout';\nimport { observeResize } from './responsive';\n\nexport interface ChartBase {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n dispose(): void;\n svg: SVGSVGElement;\n}\n\nexport function createChartBase(\n container: HTMLElement,\n options: { a11y?: ChartA11y; margin?: Partial<ChartMargin> },\n onResize?: () => void,\n): ChartBase {\n // Duck-typed rather than `instanceof Element` — an `instanceof` check would reject a\n // structurally valid Element from a different realm (e.g. an Element created via\n // `iframe.contentDocument.createElement(...)`, whose prototype chain terminates in that\n // iframe's own `Element` constructor), which is a legitimate usage pattern this package\n // doesn't otherwise restrict.\n const isElementLike =\n typeof container === 'object' &&\n container !== null &&\n container.nodeType === 1 &&\n typeof container.appendChild === 'function' &&\n typeof container.getBoundingClientRect === 'function';\n\n if (!isElementLike) {\n const received: unknown = container;\n const kind =\n received === null\n ? 'null'\n : typeof received === 'object'\n ? (received.constructor?.name ?? 'object')\n : typeof received;\n\n throw new PrismRenderError(`Invalid chart configuration: \\`container\\` must be a DOM Element, received ${kind}.`);\n }\n\n const margin = resolveMargin(options.margin);\n const a11y = options.a11y;\n const svg = createSvgElement('svg', {\n ...(!a11y || a11y.decorative\n ? { 'aria-hidden': 'true' }\n : { 'aria-label': a11y.ariaLabel, role: 'img', tabindex: '0' }),\n class: 'prism-chart',\n style: 'display:block;width:100%;height:100%',\n });\n\n const chartAreaGroup = createSvgElement('g', {\n class: 'prism-chart-area',\n transform: `translate(${margin.left},${margin.top})`,\n });\n\n svg.appendChild(chartAreaGroup);\n\n const rect = container.getBoundingClientRect();\n\n if (rect.width === 0 || rect.height === 0) {\n warn(\n 'Chart container has zero dimensions. Ensure the container has a defined width and height before mounting a chart.',\n );\n }\n\n const dimensions: ChartDimensions = {\n height: rect.height || 300,\n margin,\n width: rect.width || 600,\n };\n\n const stopObserving = observeResize(container, (width, height) => {\n dimensions.height = height;\n dimensions.width = width;\n setAttributes(svg, { height, viewBox: `0 0 ${width} ${height}`, width });\n onResize?.();\n });\n\n const initialWidth = rect.width || 600;\n const initialHeight = rect.height || 300;\n\n setAttributes(svg, {\n height: initialHeight,\n viewBox: `0 0 ${initialWidth} ${initialHeight}`,\n width: initialWidth,\n });\n\n container.appendChild(svg);\n\n return {\n chartArea: chartAreaGroup,\n dimensions,\n dispose() {\n stopObserving();\n svg.remove();\n },\n svg,\n };\n}\n"],"mappings":"uOAcA,SAAgB,gBACd,EACA,EACA,EACW,CAaX,GAAI,EANF,OAAO,GAAc,UACrB,GACA,EAAU,WAAa,GACvB,OAAO,EAAU,aAAgB,YACjC,OAAO,EAAU,uBAA0B,YAEzB,CAClB,IAAM,EAAoB,EACpB,EACJ,IAAa,KACT,OACA,OAAO,GAAa,SACjB,EAAS,aAAa,MAAQ,SAC/B,OAAO,EAEf,MAAM,IAAI,EAAiB,8EAA8E,EAAK,EAAE,CAClH,CAEA,IAAM,EAAS,EAAc,EAAQ,MAAM,EACrC,EAAO,EAAQ,KACf,EAAM,EAAiB,MAAO,CAClC,GAAI,CAAC,GAAQ,EAAK,WACd,CAAE,cAAe,MAAO,EACxB,CAAE,aAAc,EAAK,UAAW,KAAM,MAAO,SAAU,GAAI,EAC/D,MAAO,cACP,MAAO,sCACT,CAAC,EAEK,EAAiB,EAAiB,IAAK,CAC3C,MAAO,mBACP,UAAW,aAAa,EAAO,KAAK,GAAG,EAAO,IAAI,EACpD,CAAC,EAED,EAAI,YAAY,CAAc,EAE9B,IAAM,EAAO,EAAU,sBAAsB,EAEzC,EAAK,QAAU,GAAK,EAAK,OAM7B,IAAM,EAA8B,CAClC,OAAQ,EAAK,QAAU,IACvB,SACA,MAAO,EAAK,OAAS,GACvB,EAEM,EAAgB,EAAc,GAAY,EAAO,IAAW,CAChE,EAAW,OAAS,EACpB,EAAW,MAAQ,EACnB,EAAc,EAAK,CAAE,SAAQ,QAAS,OAAO,EAAM,GAAG,IAAU,OAAM,CAAC,EACvE,IAAW,CACb,CAAC,EAEK,EAAe,EAAK,OAAS,IAC7B,EAAgB,EAAK,QAAU,IAUrC,OARA,EAAc,EAAK,CACjB,OAAQ,EACR,QAAS,OAAO,EAAa,GAAG,IAChC,MAAO,CACT,CAAC,EAED,EAAU,YAAY,CAAG,EAElB,CACL,UAAW,EACX,aACA,SAAU,CACR,EAAc,EACd,EAAI,OAAO,CACb,EACA,KACF,CACF"}
@@ -1,2 +1,2 @@
1
- const e=require("../svg/element.cjs"),t=require("../errors.cjs"),n=require("../interaction/legend.cjs"),r=require("../interaction/tooltip.cjs"),i=require("./chart-base.cjs");function a(t,n,r,i){e.removeChildren(t.series),e.removeChildren(t.grid),e.removeChildren(t.xAxis),e.removeChildren(t.yAxis),n?.update([]),r?.hide(),i?.hide()}function o(e,a,o,c,l){let u=()=>{},d=i.createChartBase(e,{a11y:a.a11y,margin:a.margin},()=>u()),f=a.tooltip?r.createTooltip(e,a.tooltip):null,p=a.legend?n.createLegend(e,a.legend):null,m=new AbortController,h=o(d,f,p,m.signal),g=!1,_=s(d.svg);u=()=>{g||_.attach(c(h))};try{u()}catch(e){throw g=!0,m.abort(),_.detach(),f?.dispose(),p?.dispose(),d.dispose(),e instanceof t.PrismRenderError?e:new t.PrismRenderError(`Failed to render chart.`,{cause:e})}return{get disposalSignal(){return m.signal},dispose(){g||(g=!0,m.abort(),_.detach(),f?.dispose(),p?.dispose(),d.dispose())},get disposed(){return g},el:d.svg,update(e){if(g)throw new t.PrismRenderError(`Cannot update a disposed chart.`);l(e),u()},[Symbol.dispose](){this.dispose()}}}function s(e){let t=null;return{attach(n){t&&=(t.onMouseMove&&e.removeEventListener(`mousemove`,t.onMouseMove),t.onMouseLeave&&e.removeEventListener(`mouseleave`,t.onMouseLeave),t.onClick&&e.removeEventListener(`click`,t.onClick),t.onKeyDown&&e.removeEventListener(`keydown`,t.onKeyDown),null),n&&(t=n,n.onMouseMove&&e.addEventListener(`mousemove`,n.onMouseMove),n.onMouseLeave&&e.addEventListener(`mouseleave`,n.onMouseLeave),n.onClick&&e.addEventListener(`click`,n.onClick),n.onKeyDown&&e.addEventListener(`keydown`,n.onKeyDown))},detach(){this.attach(void 0)}}}function c(t,n,r,i){return o(t,n,(n,r,i,a)=>{let o={grid:e.createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-grid`}),series:e.createSvgElement(`g`,{class:`prism-series`}),xAxis:e.createSvgElement(`g`,{class:`prism-x-axis`}),yAxis:e.createSvgElement(`g`,{class:`prism-y-axis`})};return n.chartArea.appendChild(o.grid),n.chartArea.appendChild(o.xAxis),n.chartArea.appendChild(o.yAxis),n.chartArea.appendChild(o.series),{chartArea:n.chartArea,container:t,dimensions:n.dimensions,disposalSignal:a,groups:o,legend:i,svg:n.svg,tooltip:r}},r,i)}function l(e,t,n,r){return o(e,t,(t,n,r,i)=>({container:e,dimensions:t.dimensions,disposalSignal:i,legend:r,svg:t.svg,tooltip:n}),n,r)}exports.clearCartesianDom=a,exports.createChartScaffold=c,exports.createRadialScaffold=l;
1
+ const e=require("../svg/element.cjs"),t=require("../errors.cjs"),n=require("../interaction/legend.cjs"),r=require("../interaction/tooltip.cjs"),i=require("./chart-base.cjs");function clearCartesianDom(t,n,r,i){e.removeChildren(t.series),e.removeChildren(t.grid),e.removeChildren(t.xAxis),e.removeChildren(t.yAxis),n?.update([]),r?.hide(),i?.hide()}function runScaffold(e,a,o,s,c){let render=()=>{},l=i.createChartBase(e,{a11y:a.a11y,margin:a.margin},()=>render()),u=a.tooltip?r.createTooltip(e,a.tooltip):null,d=a.legend?n.createLegend(e,a.legend):null,f=new AbortController,p=o(l,u,d,f.signal),m=!1,h=makeEventManager(l.svg);render=()=>{m||h.attach(s(p))};try{render()}catch(e){throw m=!0,f.abort(),h.detach(),u?.dispose(),d?.dispose(),l.dispose(),e instanceof t.PrismRenderError?e:new t.PrismRenderError(`Failed to render chart.`,{cause:e})}return{get disposalSignal(){return f.signal},dispose(){m||(m=!0,f.abort(),h.detach(),u?.dispose(),d?.dispose(),l.dispose())},get disposed(){return m},el:l.svg,update(e){if(m)throw new t.PrismRenderError(`Cannot update a disposed chart.`);c(e),render()},[Symbol.dispose](){this.dispose()}}}function makeEventManager(e){let t=null;return{attach(n){t&&=(t.onMouseMove&&e.removeEventListener(`mousemove`,t.onMouseMove),t.onMouseLeave&&e.removeEventListener(`mouseleave`,t.onMouseLeave),t.onClick&&e.removeEventListener(`click`,t.onClick),t.onKeyDown&&e.removeEventListener(`keydown`,t.onKeyDown),null),n&&(t=n,n.onMouseMove&&e.addEventListener(`mousemove`,n.onMouseMove),n.onMouseLeave&&e.addEventListener(`mouseleave`,n.onMouseLeave),n.onClick&&e.addEventListener(`click`,n.onClick),n.onKeyDown&&e.addEventListener(`keydown`,n.onKeyDown))},detach(){this.attach(void 0)}}}function createChartScaffold(t,n,r,i){return runScaffold(t,n,(n,r,i,a)=>{let o={grid:e.createSvgElement(`g`,{"aria-hidden":`true`,class:`prism-grid`}),series:e.createSvgElement(`g`,{class:`prism-series`}),xAxis:e.createSvgElement(`g`,{class:`prism-x-axis`}),yAxis:e.createSvgElement(`g`,{class:`prism-y-axis`})};return n.chartArea.appendChild(o.grid),n.chartArea.appendChild(o.xAxis),n.chartArea.appendChild(o.yAxis),n.chartArea.appendChild(o.series),{chartArea:n.chartArea,container:t,dimensions:n.dimensions,disposalSignal:a,groups:o,legend:i,svg:n.svg,tooltip:r}},r,i)}function createRadialScaffold(e,t,n,r){return runScaffold(e,t,(t,n,r,i)=>({container:e,dimensions:t.dimensions,disposalSignal:i,legend:r,svg:t.svg,tooltip:n}),n,r)}exports.clearCartesianDom=clearCartesianDom,exports.createChartScaffold=createChartScaffold,exports.createRadialScaffold=createRadialScaffold;
2
2
  //# sourceMappingURL=chart-scaffold.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-scaffold.cjs","names":[],"sources":["../../src/core/chart-scaffold.ts"],"sourcesContent":["import { PrismRenderError } from '../errors';\nimport type { CrosshairState } from '../interaction/crosshair';\nimport type { LegendState } from '../interaction/legend';\nimport { createLegend } from '../interaction/legend';\nimport type { TooltipState } from '../interaction/tooltip';\nimport { createTooltip } from '../interaction/tooltip';\nimport { createSvgElement, removeChildren } from '../svg/element';\nimport type { BaseChartConfig, ChartDimensions, ChartHandle } from '../types';\nimport { createChartBase } from './chart-base';\n\nexport interface ScaffoldGroups {\n grid: SVGGElement;\n series: SVGGElement;\n xAxis: SVGGElement;\n yAxis: SVGGElement;\n}\n\n/**\n * Clears a cartesian chart's series/grid/axis groups and hides its legend/tooltip/crosshair —\n * shared by every cartesian chart factory's \"no data\" early-return so an update\n * to empty data leaves a fully blank chart, not a half-cleared one.\n */\nexport function clearCartesianDom(\n groups: ScaffoldGroups,\n legend: LegendState | null,\n tooltip: TooltipState | null,\n crosshair?: CrosshairState | null,\n): void {\n removeChildren(groups.series);\n removeChildren(groups.grid);\n removeChildren(groups.xAxis);\n removeChildren(groups.yAxis);\n legend?.update([]);\n tooltip?.hide();\n crosshair?.hide();\n}\n\nexport interface ScaffoldContext {\n chartArea: SVGGElement;\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed — renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n groups: ScaffoldGroups;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface RadialScaffoldContext {\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed — renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface ChartEventHandlers {\n onClick?: (event: MouseEvent) => void;\n onKeyDown?: (event: KeyboardEvent) => void;\n onMouseLeave?: (event: MouseEvent) => void;\n onMouseMove?: (event: MouseEvent) => void;\n}\n\nfunction runScaffold<TCtx, TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n buildCtx: (\n base: {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n svg: SVGSVGElement;\n },\n tooltip: TooltipState | null,\n legend: LegendState | null,\n disposalSignal: AbortSignal,\n ) => TCtx,\n renderFn: (ctx: TCtx) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n let render = () => {};\n const base = createChartBase(container, { a11y: config.a11y, margin: config.margin }, () => render());\n const tooltip = config.tooltip ? createTooltip(container, config.tooltip) : null;\n const legend = config.legend ? createLegend(container, config.legend) : null;\n const ac = new AbortController();\n const ctx = buildCtx(base, tooltip, legend, ac.signal);\n\n let disposed = false;\n const events = makeEventManager(base.svg);\n\n render = () => {\n if (disposed) return;\n events.attach(renderFn(ctx));\n };\n\n try {\n render();\n } catch (error) {\n disposed = true;\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n throw error instanceof PrismRenderError ? error : new PrismRenderError('Failed to render chart.', { cause: error });\n }\n\n return {\n get disposalSignal(): AbortSignal {\n return ac.signal;\n },\n\n dispose() {\n if (disposed) return;\n\n disposed = true;\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n },\n\n get disposed(): boolean {\n return disposed;\n },\n\n el: base.svg,\n\n update(data) {\n if (disposed) throw new PrismRenderError('Cannot update a disposed chart.');\n updateData(data);\n render();\n },\n\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n}\n\nfunction makeEventManager(svg: SVGSVGElement): {\n attach(handlers: ChartEventHandlers | undefined): void;\n detach(): void;\n} {\n let active: ChartEventHandlers | null = null;\n\n return {\n attach(handlers) {\n if (active) {\n if (active.onMouseMove) svg.removeEventListener('mousemove', active.onMouseMove);\n\n if (active.onMouseLeave) svg.removeEventListener('mouseleave', active.onMouseLeave);\n\n if (active.onClick) svg.removeEventListener('click', active.onClick);\n\n if (active.onKeyDown) svg.removeEventListener('keydown', active.onKeyDown);\n\n active = null;\n }\n\n if (!handlers) return;\n\n active = handlers;\n\n if (handlers.onMouseMove) svg.addEventListener('mousemove', handlers.onMouseMove);\n\n if (handlers.onMouseLeave) svg.addEventListener('mouseleave', handlers.onMouseLeave);\n\n if (handlers.onClick) svg.addEventListener('click', handlers.onClick);\n\n if (handlers.onKeyDown) svg.addEventListener('keydown', handlers.onKeyDown);\n },\n detach() {\n this.attach(undefined);\n },\n };\n}\n\n/**\n * Cartesian scaffold: provides grid/axis/series SVG groups and a render loop.\n * `renderFn` returns optional `ChartEventHandlers` that are attached/replaced\n * after every data update or resize.\n */\nexport function createChartScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: ScaffoldContext) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal) => {\n const groups: ScaffoldGroups = {\n // Grid lines are purely decorative relative to the root svg's own role=\"img\"/aria-label.\n // Axis groups are NOT hidden wholesale — they can contain a meaningful `.prism-axis-title`;\n // `renderAxis` marks its own decorative tick lines/labels individually instead.\n grid: createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-grid' }),\n series: createSvgElement('g', { class: 'prism-series' }),\n xAxis: createSvgElement('g', { class: 'prism-x-axis' }),\n yAxis: createSvgElement('g', { class: 'prism-y-axis' }),\n };\n\n base.chartArea.appendChild(groups.grid);\n base.chartArea.appendChild(groups.xAxis);\n base.chartArea.appendChild(groups.yAxis);\n base.chartArea.appendChild(groups.series);\n\n return {\n chartArea: base.chartArea,\n container,\n dimensions: base.dimensions,\n disposalSignal,\n groups,\n legend,\n svg: base.svg,\n tooltip,\n } satisfies ScaffoldContext;\n },\n renderFn,\n updateData,\n );\n}\n\n/**\n * Radial scaffold: for charts that do not use cartesian axis groups\n * (pie, donut, semi). Provides only tooltip, legend, and the SVG root.\n */\nexport function createRadialScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: RadialScaffoldContext) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal) =>\n ({\n container,\n dimensions: base.dimensions,\n disposalSignal,\n legend,\n svg: base.svg,\n tooltip,\n }) satisfies RadialScaffoldContext,\n renderFn,\n updateData,\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-scaffold.cjs","names":[],"sources":["../../src/core/chart-scaffold.ts"],"sourcesContent":["import { PrismRenderError } from '../errors';\nimport type { CrosshairState } from '../interaction/crosshair';\nimport type { LegendState } from '../interaction/legend';\nimport { createLegend } from '../interaction/legend';\nimport type { TooltipState } from '../interaction/tooltip';\nimport { createTooltip } from '../interaction/tooltip';\nimport { createSvgElement, removeChildren } from '../svg/element';\nimport type { BaseChartConfig, ChartDimensions, ChartHandle } from '../types';\nimport { createChartBase } from './chart-base';\n\nexport interface ScaffoldGroups {\n grid: SVGGElement;\n series: SVGGElement;\n xAxis: SVGGElement;\n yAxis: SVGGElement;\n}\n\n/**\n * Clears a cartesian chart's series/grid/axis groups and hides its legend/tooltip/crosshair —\n * shared by every cartesian chart factory's \"no data\" early-return so an update\n * to empty data leaves a fully blank chart, not a half-cleared one.\n */\nexport function clearCartesianDom(\n groups: ScaffoldGroups,\n legend: LegendState | null,\n tooltip: TooltipState | null,\n crosshair?: CrosshairState | null,\n): void {\n removeChildren(groups.series);\n removeChildren(groups.grid);\n removeChildren(groups.xAxis);\n removeChildren(groups.yAxis);\n legend?.update([]);\n tooltip?.hide();\n crosshair?.hide();\n}\n\nexport interface ScaffoldContext {\n chartArea: SVGGElement;\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed — renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n groups: ScaffoldGroups;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface RadialScaffoldContext {\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed — renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface ChartEventHandlers {\n onClick?: (event: MouseEvent) => void;\n onKeyDown?: (event: KeyboardEvent) => void;\n onMouseLeave?: (event: MouseEvent) => void;\n onMouseMove?: (event: MouseEvent) => void;\n}\n\nfunction runScaffold<TCtx, TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n buildCtx: (\n base: {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n svg: SVGSVGElement;\n },\n tooltip: TooltipState | null,\n legend: LegendState | null,\n disposalSignal: AbortSignal,\n ) => TCtx,\n renderFn: (ctx: TCtx) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n let render = () => {};\n const base = createChartBase(container, { a11y: config.a11y, margin: config.margin }, () => render());\n const tooltip = config.tooltip ? createTooltip(container, config.tooltip) : null;\n const legend = config.legend ? createLegend(container, config.legend) : null;\n const ac = new AbortController();\n const ctx = buildCtx(base, tooltip, legend, ac.signal);\n\n let disposed = false;\n const events = makeEventManager(base.svg);\n\n render = () => {\n if (disposed) return;\n events.attach(renderFn(ctx));\n };\n\n try {\n render();\n } catch (error) {\n disposed = true;\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n throw error instanceof PrismRenderError ? error : new PrismRenderError('Failed to render chart.', { cause: error });\n }\n\n return {\n get disposalSignal(): AbortSignal {\n return ac.signal;\n },\n\n dispose() {\n if (disposed) return;\n\n disposed = true;\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n },\n\n get disposed(): boolean {\n return disposed;\n },\n\n el: base.svg,\n\n update(data) {\n if (disposed) throw new PrismRenderError('Cannot update a disposed chart.');\n updateData(data);\n render();\n },\n\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n}\n\nfunction makeEventManager(svg: SVGSVGElement): {\n attach(handlers: ChartEventHandlers | undefined): void;\n detach(): void;\n} {\n let active: ChartEventHandlers | null = null;\n\n return {\n attach(handlers) {\n if (active) {\n if (active.onMouseMove) svg.removeEventListener('mousemove', active.onMouseMove);\n\n if (active.onMouseLeave) svg.removeEventListener('mouseleave', active.onMouseLeave);\n\n if (active.onClick) svg.removeEventListener('click', active.onClick);\n\n if (active.onKeyDown) svg.removeEventListener('keydown', active.onKeyDown);\n\n active = null;\n }\n\n if (!handlers) return;\n\n active = handlers;\n\n if (handlers.onMouseMove) svg.addEventListener('mousemove', handlers.onMouseMove);\n\n if (handlers.onMouseLeave) svg.addEventListener('mouseleave', handlers.onMouseLeave);\n\n if (handlers.onClick) svg.addEventListener('click', handlers.onClick);\n\n if (handlers.onKeyDown) svg.addEventListener('keydown', handlers.onKeyDown);\n },\n detach() {\n this.attach(undefined);\n },\n };\n}\n\n/**\n * Cartesian scaffold: provides grid/axis/series SVG groups and a render loop.\n * `renderFn` returns optional `ChartEventHandlers` that are attached/replaced\n * after every data update or resize.\n */\nexport function createChartScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: ScaffoldContext) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal) => {\n const groups: ScaffoldGroups = {\n // Grid lines are purely decorative relative to the root svg's own role=\"img\"/aria-label.\n // Axis groups are NOT hidden wholesale — they can contain a meaningful `.prism-axis-title`;\n // `renderAxis` marks its own decorative tick lines/labels individually instead.\n grid: createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-grid' }),\n series: createSvgElement('g', { class: 'prism-series' }),\n xAxis: createSvgElement('g', { class: 'prism-x-axis' }),\n yAxis: createSvgElement('g', { class: 'prism-y-axis' }),\n };\n\n base.chartArea.appendChild(groups.grid);\n base.chartArea.appendChild(groups.xAxis);\n base.chartArea.appendChild(groups.yAxis);\n base.chartArea.appendChild(groups.series);\n\n return {\n chartArea: base.chartArea,\n container,\n dimensions: base.dimensions,\n disposalSignal,\n groups,\n legend,\n svg: base.svg,\n tooltip,\n } satisfies ScaffoldContext;\n },\n renderFn,\n updateData,\n );\n}\n\n/**\n * Radial scaffold: for charts that do not use cartesian axis groups\n * (pie, donut, semi). Provides only tooltip, legend, and the SVG root.\n */\nexport function createRadialScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: RadialScaffoldContext) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal) =>\n ({\n container,\n dimensions: base.dimensions,\n disposalSignal,\n legend,\n svg: base.svg,\n tooltip,\n }) satisfies RadialScaffoldContext,\n renderFn,\n updateData,\n );\n}\n"],"mappings":"8KAsBA,SAAgB,kBACd,EACA,EACA,EACA,EACM,CACN,EAAA,eAAe,EAAO,MAAM,EAC5B,EAAA,eAAe,EAAO,IAAI,EAC1B,EAAA,eAAe,EAAO,KAAK,EAC3B,EAAA,eAAe,EAAO,KAAK,EAC3B,GAAQ,OAAO,CAAC,CAAC,EACjB,GAAS,KAAK,EACd,GAAW,KAAK,CAClB,CA+BA,SAAS,YACP,EACA,EACA,EAUA,EACA,EACoB,CACpB,IAAI,WAAe,CAAC,EACd,EAAO,EAAA,gBAAgB,EAAW,CAAE,KAAM,EAAO,KAAM,OAAQ,EAAO,MAAO,MAAS,OAAO,CAAC,EAC9F,EAAU,EAAO,QAAU,EAAA,cAAc,EAAW,EAAO,OAAO,EAAI,KACtE,EAAS,EAAO,OAAS,EAAA,aAAa,EAAW,EAAO,MAAM,EAAI,KAClE,EAAK,IAAI,gBACT,EAAM,EAAS,EAAM,EAAS,EAAQ,EAAG,MAAM,EAEjD,EAAW,GACT,EAAS,iBAAiB,EAAK,GAAG,EAExC,WAAe,CACT,GACJ,EAAO,OAAO,EAAS,CAAG,CAAC,CAC7B,EAEA,GAAI,CACF,OAAO,CACT,OAAS,EAAO,CAOd,KANA,GAAW,GACX,EAAG,MAAM,EACT,EAAO,OAAO,EACd,GAAS,QAAQ,EACjB,GAAQ,QAAQ,EAChB,EAAK,QAAQ,EACP,aAAiB,EAAA,iBAAmB,EAAQ,IAAI,EAAA,iBAAiB,0BAA2B,CAAE,MAAO,CAAM,CAAC,CACpH,CAEA,MAAO,CACL,IAAI,gBAA8B,CAChC,OAAO,EAAG,MACZ,EAEA,SAAU,CACJ,IAEJ,EAAW,GACX,EAAG,MAAM,EACT,EAAO,OAAO,EACd,GAAS,QAAQ,EACjB,GAAQ,QAAQ,EAChB,EAAK,QAAQ,EACf,EAEA,IAAI,UAAoB,CACtB,OAAO,CACT,EAEA,GAAI,EAAK,IAET,OAAO,EAAM,CACX,GAAI,EAAU,MAAM,IAAI,EAAA,iBAAiB,iCAAiC,EAC1E,EAAW,CAAI,EACf,OAAO,CACT,EAEA,CAAC,OAAO,UAAW,CACjB,KAAK,QAAQ,CACf,CACF,CACF,CAEA,SAAS,iBAAiB,EAGxB,CACA,IAAI,EAAoC,KAExC,MAAO,CACL,OAAO,EAAU,CACf,AASE,KARI,EAAO,aAAa,EAAI,oBAAoB,YAAa,EAAO,WAAW,EAE3E,EAAO,cAAc,EAAI,oBAAoB,aAAc,EAAO,YAAY,EAE9E,EAAO,SAAS,EAAI,oBAAoB,QAAS,EAAO,OAAO,EAE/D,EAAO,WAAW,EAAI,oBAAoB,UAAW,EAAO,SAAS,EAEhE,MAGN,IAEL,EAAS,EAEL,EAAS,aAAa,EAAI,iBAAiB,YAAa,EAAS,WAAW,EAE5E,EAAS,cAAc,EAAI,iBAAiB,aAAc,EAAS,YAAY,EAE/E,EAAS,SAAS,EAAI,iBAAiB,QAAS,EAAS,OAAO,EAEhE,EAAS,WAAW,EAAI,iBAAiB,UAAW,EAAS,SAAS,EAC5E,EACA,QAAS,CACP,KAAK,OAAO,IAAA,EAAS,CACvB,CACF,CACF,CAOA,SAAgB,oBACd,EACA,EACA,EACA,EACoB,CACpB,OAAO,YACL,EACA,GACC,EAAM,EAAS,EAAQ,IAAmB,CACzC,IAAM,EAAyB,CAI7B,KAAM,EAAA,iBAAiB,IAAK,CAAE,cAAe,OAAQ,MAAO,YAAa,CAAC,EAC1E,OAAQ,EAAA,iBAAiB,IAAK,CAAE,MAAO,cAAe,CAAC,EACvD,MAAO,EAAA,iBAAiB,IAAK,CAAE,MAAO,cAAe,CAAC,EACtD,MAAO,EAAA,iBAAiB,IAAK,CAAE,MAAO,cAAe,CAAC,CACxD,EAOA,OALA,EAAK,UAAU,YAAY,EAAO,IAAI,EACtC,EAAK,UAAU,YAAY,EAAO,KAAK,EACvC,EAAK,UAAU,YAAY,EAAO,KAAK,EACvC,EAAK,UAAU,YAAY,EAAO,MAAM,EAEjC,CACL,UAAW,EAAK,UAChB,YACA,WAAY,EAAK,WACjB,iBACA,SACA,SACA,IAAK,EAAK,IACV,SACF,CACF,EACA,EACA,CACF,CACF,CAMA,SAAgB,qBACd,EACA,EACA,EACA,EACoB,CACpB,OAAO,YACL,EACA,GACC,EAAM,EAAS,EAAQ,KACrB,CACC,YACA,WAAY,EAAK,WACjB,iBACA,SACA,IAAK,EAAK,IACV,SACF,GACF,EACA,CACF,CACF"}
@@ -1,90 +1,2 @@
1
- import { createSvgElement as e, removeChildren as t } from "../svg/element.js";
2
- import { PrismRenderError as n } from "../errors.js";
3
- import { createLegend as r } from "../interaction/legend.js";
4
- import { createTooltip as i } from "../interaction/tooltip.js";
5
- import { createChartBase as a } from "./chart-base.js";
6
- //#region src/core/chart-scaffold.ts
7
- function o(e, n, r, i) {
8
- t(e.series), t(e.grid), t(e.xAxis), t(e.yAxis), n?.update([]), r?.hide(), i?.hide();
9
- }
10
- function s(e, t, o, s, l) {
11
- let u = () => {}, d = a(e, {
12
- a11y: t.a11y,
13
- margin: t.margin
14
- }, () => u()), f = t.tooltip ? i(e, t.tooltip) : null, p = t.legend ? r(e, t.legend) : null, m = new AbortController(), h = o(d, f, p, m.signal), g = !1, _ = c(d.svg);
15
- u = () => {
16
- g || _.attach(s(h));
17
- };
18
- try {
19
- u();
20
- } catch (e) {
21
- throw g = !0, m.abort(), _.detach(), f?.dispose(), p?.dispose(), d.dispose(), e instanceof n ? e : new n("Failed to render chart.", { cause: e });
22
- }
23
- return {
24
- get disposalSignal() {
25
- return m.signal;
26
- },
27
- dispose() {
28
- g || (g = !0, m.abort(), _.detach(), f?.dispose(), p?.dispose(), d.dispose());
29
- },
30
- get disposed() {
31
- return g;
32
- },
33
- el: d.svg,
34
- update(e) {
35
- if (g) throw new n("Cannot update a disposed chart.");
36
- l(e), u();
37
- },
38
- [Symbol.dispose]() {
39
- this.dispose();
40
- }
41
- };
42
- }
43
- function c(e) {
44
- let t = null;
45
- return {
46
- attach(n) {
47
- t &&= (t.onMouseMove && e.removeEventListener("mousemove", t.onMouseMove), t.onMouseLeave && e.removeEventListener("mouseleave", t.onMouseLeave), t.onClick && e.removeEventListener("click", t.onClick), t.onKeyDown && e.removeEventListener("keydown", t.onKeyDown), null), n && (t = n, n.onMouseMove && e.addEventListener("mousemove", n.onMouseMove), n.onMouseLeave && e.addEventListener("mouseleave", n.onMouseLeave), n.onClick && e.addEventListener("click", n.onClick), n.onKeyDown && e.addEventListener("keydown", n.onKeyDown));
48
- },
49
- detach() {
50
- this.attach(void 0);
51
- }
52
- };
53
- }
54
- function l(t, n, r, i) {
55
- return s(t, n, (n, r, i, a) => {
56
- let o = {
57
- grid: e("g", {
58
- "aria-hidden": "true",
59
- class: "prism-grid"
60
- }),
61
- series: e("g", { class: "prism-series" }),
62
- xAxis: e("g", { class: "prism-x-axis" }),
63
- yAxis: e("g", { class: "prism-y-axis" })
64
- };
65
- return n.chartArea.appendChild(o.grid), n.chartArea.appendChild(o.xAxis), n.chartArea.appendChild(o.yAxis), n.chartArea.appendChild(o.series), {
66
- chartArea: n.chartArea,
67
- container: t,
68
- dimensions: n.dimensions,
69
- disposalSignal: a,
70
- groups: o,
71
- legend: i,
72
- svg: n.svg,
73
- tooltip: r
74
- };
75
- }, r, i);
76
- }
77
- function u(e, t, n, r) {
78
- return s(e, t, (t, n, r, i) => ({
79
- container: e,
80
- dimensions: t.dimensions,
81
- disposalSignal: i,
82
- legend: r,
83
- svg: t.svg,
84
- tooltip: n
85
- }), n, r);
86
- }
87
- //#endregion
88
- export { o as clearCartesianDom, l as createChartScaffold, u as createRadialScaffold };
89
-
1
+ import{createSvgElement as e,removeChildren as t}from"../svg/element.js";import{PrismRenderError as n}from"../errors.js";import{createLegend as r}from"../interaction/legend.js";import{createTooltip as i}from"../interaction/tooltip.js";import{createChartBase as a}from"./chart-base.js";function clearCartesianDom(e,n,r,i){t(e.series),t(e.grid),t(e.xAxis),t(e.yAxis),n?.update([]),r?.hide(),i?.hide()}function runScaffold(e,t,o,s,c){let render=()=>{},l=a(e,{a11y:t.a11y,margin:t.margin},()=>render()),u=t.tooltip?i(e,t.tooltip):null,d=t.legend?r(e,t.legend):null,f=new AbortController,p=o(l,u,d,f.signal),m=!1,h=makeEventManager(l.svg);render=()=>{m||h.attach(s(p))};try{render()}catch(e){throw m=!0,f.abort(),h.detach(),u?.dispose(),d?.dispose(),l.dispose(),e instanceof n?e:new n(`Failed to render chart.`,{cause:e})}return{get disposalSignal(){return f.signal},dispose(){m||(m=!0,f.abort(),h.detach(),u?.dispose(),d?.dispose(),l.dispose())},get disposed(){return m},el:l.svg,update(e){if(m)throw new n(`Cannot update a disposed chart.`);c(e),render()},[Symbol.dispose](){this.dispose()}}}function makeEventManager(e){let t=null;return{attach(n){t&&=(t.onMouseMove&&e.removeEventListener(`mousemove`,t.onMouseMove),t.onMouseLeave&&e.removeEventListener(`mouseleave`,t.onMouseLeave),t.onClick&&e.removeEventListener(`click`,t.onClick),t.onKeyDown&&e.removeEventListener(`keydown`,t.onKeyDown),null),n&&(t=n,n.onMouseMove&&e.addEventListener(`mousemove`,n.onMouseMove),n.onMouseLeave&&e.addEventListener(`mouseleave`,n.onMouseLeave),n.onClick&&e.addEventListener(`click`,n.onClick),n.onKeyDown&&e.addEventListener(`keydown`,n.onKeyDown))},detach(){this.attach(void 0)}}}function createChartScaffold(t,n,r,i){return runScaffold(t,n,(n,r,i,a)=>{let o={grid:e(`g`,{"aria-hidden":`true`,class:`prism-grid`}),series:e(`g`,{class:`prism-series`}),xAxis:e(`g`,{class:`prism-x-axis`}),yAxis:e(`g`,{class:`prism-y-axis`})};return n.chartArea.appendChild(o.grid),n.chartArea.appendChild(o.xAxis),n.chartArea.appendChild(o.yAxis),n.chartArea.appendChild(o.series),{chartArea:n.chartArea,container:t,dimensions:n.dimensions,disposalSignal:a,groups:o,legend:i,svg:n.svg,tooltip:r}},r,i)}function createRadialScaffold(e,t,n,r){return runScaffold(e,t,(t,n,r,i)=>({container:e,dimensions:t.dimensions,disposalSignal:i,legend:r,svg:t.svg,tooltip:n}),n,r)}export{clearCartesianDom,createChartScaffold,createRadialScaffold};
90
2
  //# sourceMappingURL=chart-scaffold.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chart-scaffold.js","names":[],"sources":["../../src/core/chart-scaffold.ts"],"sourcesContent":["import { PrismRenderError } from '../errors';\nimport type { CrosshairState } from '../interaction/crosshair';\nimport type { LegendState } from '../interaction/legend';\nimport { createLegend } from '../interaction/legend';\nimport type { TooltipState } from '../interaction/tooltip';\nimport { createTooltip } from '../interaction/tooltip';\nimport { createSvgElement, removeChildren } from '../svg/element';\nimport type { BaseChartConfig, ChartDimensions, ChartHandle } from '../types';\nimport { createChartBase } from './chart-base';\n\nexport interface ScaffoldGroups {\n grid: SVGGElement;\n series: SVGGElement;\n xAxis: SVGGElement;\n yAxis: SVGGElement;\n}\n\n/**\n * Clears a cartesian chart's series/grid/axis groups and hides its legend/tooltip/crosshair —\n * shared by every cartesian chart factory's \"no data\" early-return so an update\n * to empty data leaves a fully blank chart, not a half-cleared one.\n */\nexport function clearCartesianDom(\n groups: ScaffoldGroups,\n legend: LegendState | null,\n tooltip: TooltipState | null,\n crosshair?: CrosshairState | null,\n): void {\n removeChildren(groups.series);\n removeChildren(groups.grid);\n removeChildren(groups.xAxis);\n removeChildren(groups.yAxis);\n legend?.update([]);\n tooltip?.hide();\n crosshair?.hide();\n}\n\nexport interface ScaffoldContext {\n chartArea: SVGGElement;\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed — renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n groups: ScaffoldGroups;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface RadialScaffoldContext {\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed — renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface ChartEventHandlers {\n onClick?: (event: MouseEvent) => void;\n onKeyDown?: (event: KeyboardEvent) => void;\n onMouseLeave?: (event: MouseEvent) => void;\n onMouseMove?: (event: MouseEvent) => void;\n}\n\nfunction runScaffold<TCtx, TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n buildCtx: (\n base: {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n svg: SVGSVGElement;\n },\n tooltip: TooltipState | null,\n legend: LegendState | null,\n disposalSignal: AbortSignal,\n ) => TCtx,\n renderFn: (ctx: TCtx) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n let render = () => {};\n const base = createChartBase(container, { a11y: config.a11y, margin: config.margin }, () => render());\n const tooltip = config.tooltip ? createTooltip(container, config.tooltip) : null;\n const legend = config.legend ? createLegend(container, config.legend) : null;\n const ac = new AbortController();\n const ctx = buildCtx(base, tooltip, legend, ac.signal);\n\n let disposed = false;\n const events = makeEventManager(base.svg);\n\n render = () => {\n if (disposed) return;\n events.attach(renderFn(ctx));\n };\n\n try {\n render();\n } catch (error) {\n disposed = true;\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n throw error instanceof PrismRenderError ? error : new PrismRenderError('Failed to render chart.', { cause: error });\n }\n\n return {\n get disposalSignal(): AbortSignal {\n return ac.signal;\n },\n\n dispose() {\n if (disposed) return;\n\n disposed = true;\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n },\n\n get disposed(): boolean {\n return disposed;\n },\n\n el: base.svg,\n\n update(data) {\n if (disposed) throw new PrismRenderError('Cannot update a disposed chart.');\n updateData(data);\n render();\n },\n\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n}\n\nfunction makeEventManager(svg: SVGSVGElement): {\n attach(handlers: ChartEventHandlers | undefined): void;\n detach(): void;\n} {\n let active: ChartEventHandlers | null = null;\n\n return {\n attach(handlers) {\n if (active) {\n if (active.onMouseMove) svg.removeEventListener('mousemove', active.onMouseMove);\n\n if (active.onMouseLeave) svg.removeEventListener('mouseleave', active.onMouseLeave);\n\n if (active.onClick) svg.removeEventListener('click', active.onClick);\n\n if (active.onKeyDown) svg.removeEventListener('keydown', active.onKeyDown);\n\n active = null;\n }\n\n if (!handlers) return;\n\n active = handlers;\n\n if (handlers.onMouseMove) svg.addEventListener('mousemove', handlers.onMouseMove);\n\n if (handlers.onMouseLeave) svg.addEventListener('mouseleave', handlers.onMouseLeave);\n\n if (handlers.onClick) svg.addEventListener('click', handlers.onClick);\n\n if (handlers.onKeyDown) svg.addEventListener('keydown', handlers.onKeyDown);\n },\n detach() {\n this.attach(undefined);\n },\n };\n}\n\n/**\n * Cartesian scaffold: provides grid/axis/series SVG groups and a render loop.\n * `renderFn` returns optional `ChartEventHandlers` that are attached/replaced\n * after every data update or resize.\n */\nexport function createChartScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: ScaffoldContext) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal) => {\n const groups: ScaffoldGroups = {\n // Grid lines are purely decorative relative to the root svg's own role=\"img\"/aria-label.\n // Axis groups are NOT hidden wholesale — they can contain a meaningful `.prism-axis-title`;\n // `renderAxis` marks its own decorative tick lines/labels individually instead.\n grid: createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-grid' }),\n series: createSvgElement('g', { class: 'prism-series' }),\n xAxis: createSvgElement('g', { class: 'prism-x-axis' }),\n yAxis: createSvgElement('g', { class: 'prism-y-axis' }),\n };\n\n base.chartArea.appendChild(groups.grid);\n base.chartArea.appendChild(groups.xAxis);\n base.chartArea.appendChild(groups.yAxis);\n base.chartArea.appendChild(groups.series);\n\n return {\n chartArea: base.chartArea,\n container,\n dimensions: base.dimensions,\n disposalSignal,\n groups,\n legend,\n svg: base.svg,\n tooltip,\n } satisfies ScaffoldContext;\n },\n renderFn,\n updateData,\n );\n}\n\n/**\n * Radial scaffold: for charts that do not use cartesian axis groups\n * (pie, donut, semi). Provides only tooltip, legend, and the SVG root.\n */\nexport function createRadialScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: RadialScaffoldContext) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal) =>\n ({\n container,\n dimensions: base.dimensions,\n disposalSignal,\n legend,\n svg: base.svg,\n tooltip,\n }) satisfies RadialScaffoldContext,\n renderFn,\n updateData,\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart-scaffold.js","names":[],"sources":["../../src/core/chart-scaffold.ts"],"sourcesContent":["import { PrismRenderError } from '../errors';\nimport type { CrosshairState } from '../interaction/crosshair';\nimport type { LegendState } from '../interaction/legend';\nimport { createLegend } from '../interaction/legend';\nimport type { TooltipState } from '../interaction/tooltip';\nimport { createTooltip } from '../interaction/tooltip';\nimport { createSvgElement, removeChildren } from '../svg/element';\nimport type { BaseChartConfig, ChartDimensions, ChartHandle } from '../types';\nimport { createChartBase } from './chart-base';\n\nexport interface ScaffoldGroups {\n grid: SVGGElement;\n series: SVGGElement;\n xAxis: SVGGElement;\n yAxis: SVGGElement;\n}\n\n/**\n * Clears a cartesian chart's series/grid/axis groups and hides its legend/tooltip/crosshair —\n * shared by every cartesian chart factory's \"no data\" early-return so an update\n * to empty data leaves a fully blank chart, not a half-cleared one.\n */\nexport function clearCartesianDom(\n groups: ScaffoldGroups,\n legend: LegendState | null,\n tooltip: TooltipState | null,\n crosshair?: CrosshairState | null,\n): void {\n removeChildren(groups.series);\n removeChildren(groups.grid);\n removeChildren(groups.xAxis);\n removeChildren(groups.yAxis);\n legend?.update([]);\n tooltip?.hide();\n crosshair?.hide();\n}\n\nexport interface ScaffoldContext {\n chartArea: SVGGElement;\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed — renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n groups: ScaffoldGroups;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface RadialScaffoldContext {\n container: HTMLElement;\n dimensions: ChartDimensions;\n /** Aborted when the chart is disposed — renderers use this to stop rescheduling in-flight `requestAnimationFrame` transitions. */\n disposalSignal: AbortSignal;\n legend: LegendState | null;\n svg: SVGSVGElement;\n tooltip: TooltipState | null;\n}\n\nexport interface ChartEventHandlers {\n onClick?: (event: MouseEvent) => void;\n onKeyDown?: (event: KeyboardEvent) => void;\n onMouseLeave?: (event: MouseEvent) => void;\n onMouseMove?: (event: MouseEvent) => void;\n}\n\nfunction runScaffold<TCtx, TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n buildCtx: (\n base: {\n chartArea: SVGGElement;\n dimensions: ChartDimensions;\n svg: SVGSVGElement;\n },\n tooltip: TooltipState | null,\n legend: LegendState | null,\n disposalSignal: AbortSignal,\n ) => TCtx,\n renderFn: (ctx: TCtx) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n let render = () => {};\n const base = createChartBase(container, { a11y: config.a11y, margin: config.margin }, () => render());\n const tooltip = config.tooltip ? createTooltip(container, config.tooltip) : null;\n const legend = config.legend ? createLegend(container, config.legend) : null;\n const ac = new AbortController();\n const ctx = buildCtx(base, tooltip, legend, ac.signal);\n\n let disposed = false;\n const events = makeEventManager(base.svg);\n\n render = () => {\n if (disposed) return;\n events.attach(renderFn(ctx));\n };\n\n try {\n render();\n } catch (error) {\n disposed = true;\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n throw error instanceof PrismRenderError ? error : new PrismRenderError('Failed to render chart.', { cause: error });\n }\n\n return {\n get disposalSignal(): AbortSignal {\n return ac.signal;\n },\n\n dispose() {\n if (disposed) return;\n\n disposed = true;\n ac.abort();\n events.detach();\n tooltip?.dispose();\n legend?.dispose();\n base.dispose();\n },\n\n get disposed(): boolean {\n return disposed;\n },\n\n el: base.svg,\n\n update(data) {\n if (disposed) throw new PrismRenderError('Cannot update a disposed chart.');\n updateData(data);\n render();\n },\n\n [Symbol.dispose]() {\n this.dispose();\n },\n };\n}\n\nfunction makeEventManager(svg: SVGSVGElement): {\n attach(handlers: ChartEventHandlers | undefined): void;\n detach(): void;\n} {\n let active: ChartEventHandlers | null = null;\n\n return {\n attach(handlers) {\n if (active) {\n if (active.onMouseMove) svg.removeEventListener('mousemove', active.onMouseMove);\n\n if (active.onMouseLeave) svg.removeEventListener('mouseleave', active.onMouseLeave);\n\n if (active.onClick) svg.removeEventListener('click', active.onClick);\n\n if (active.onKeyDown) svg.removeEventListener('keydown', active.onKeyDown);\n\n active = null;\n }\n\n if (!handlers) return;\n\n active = handlers;\n\n if (handlers.onMouseMove) svg.addEventListener('mousemove', handlers.onMouseMove);\n\n if (handlers.onMouseLeave) svg.addEventListener('mouseleave', handlers.onMouseLeave);\n\n if (handlers.onClick) svg.addEventListener('click', handlers.onClick);\n\n if (handlers.onKeyDown) svg.addEventListener('keydown', handlers.onKeyDown);\n },\n detach() {\n this.attach(undefined);\n },\n };\n}\n\n/**\n * Cartesian scaffold: provides grid/axis/series SVG groups and a render loop.\n * `renderFn` returns optional `ChartEventHandlers` that are attached/replaced\n * after every data update or resize.\n */\nexport function createChartScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: ScaffoldContext) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal) => {\n const groups: ScaffoldGroups = {\n // Grid lines are purely decorative relative to the root svg's own role=\"img\"/aria-label.\n // Axis groups are NOT hidden wholesale — they can contain a meaningful `.prism-axis-title`;\n // `renderAxis` marks its own decorative tick lines/labels individually instead.\n grid: createSvgElement('g', { 'aria-hidden': 'true', class: 'prism-grid' }),\n series: createSvgElement('g', { class: 'prism-series' }),\n xAxis: createSvgElement('g', { class: 'prism-x-axis' }),\n yAxis: createSvgElement('g', { class: 'prism-y-axis' }),\n };\n\n base.chartArea.appendChild(groups.grid);\n base.chartArea.appendChild(groups.xAxis);\n base.chartArea.appendChild(groups.yAxis);\n base.chartArea.appendChild(groups.series);\n\n return {\n chartArea: base.chartArea,\n container,\n dimensions: base.dimensions,\n disposalSignal,\n groups,\n legend,\n svg: base.svg,\n tooltip,\n } satisfies ScaffoldContext;\n },\n renderFn,\n updateData,\n );\n}\n\n/**\n * Radial scaffold: for charts that do not use cartesian axis groups\n * (pie, donut, semi). Provides only tooltip, legend, and the SVG root.\n */\nexport function createRadialScaffold<TData>(\n container: HTMLElement,\n config: BaseChartConfig,\n renderFn: (ctx: RadialScaffoldContext) => ChartEventHandlers | undefined,\n updateData: (data: TData) => void,\n): ChartHandle<TData> {\n return runScaffold(\n container,\n config,\n (base, tooltip, legend, disposalSignal) =>\n ({\n container,\n dimensions: base.dimensions,\n disposalSignal,\n legend,\n svg: base.svg,\n tooltip,\n }) satisfies RadialScaffoldContext,\n renderFn,\n updateData,\n );\n}\n"],"mappings":"6RAsBA,SAAgB,kBACd,EACA,EACA,EACA,EACM,CACN,EAAe,EAAO,MAAM,EAC5B,EAAe,EAAO,IAAI,EAC1B,EAAe,EAAO,KAAK,EAC3B,EAAe,EAAO,KAAK,EAC3B,GAAQ,OAAO,CAAC,CAAC,EACjB,GAAS,KAAK,EACd,GAAW,KAAK,CAClB,CA+BA,SAAS,YACP,EACA,EACA,EAUA,EACA,EACoB,CACpB,IAAI,WAAe,CAAC,EACd,EAAO,EAAgB,EAAW,CAAE,KAAM,EAAO,KAAM,OAAQ,EAAO,MAAO,MAAS,OAAO,CAAC,EAC9F,EAAU,EAAO,QAAU,EAAc,EAAW,EAAO,OAAO,EAAI,KACtE,EAAS,EAAO,OAAS,EAAa,EAAW,EAAO,MAAM,EAAI,KAClE,EAAK,IAAI,gBACT,EAAM,EAAS,EAAM,EAAS,EAAQ,EAAG,MAAM,EAEjD,EAAW,GACT,EAAS,iBAAiB,EAAK,GAAG,EAExC,WAAe,CACT,GACJ,EAAO,OAAO,EAAS,CAAG,CAAC,CAC7B,EAEA,GAAI,CACF,OAAO,CACT,OAAS,EAAO,CAOd,KANA,GAAW,GACX,EAAG,MAAM,EACT,EAAO,OAAO,EACd,GAAS,QAAQ,EACjB,GAAQ,QAAQ,EAChB,EAAK,QAAQ,EACP,aAAiB,EAAmB,EAAQ,IAAI,EAAiB,0BAA2B,CAAE,MAAO,CAAM,CAAC,CACpH,CAEA,MAAO,CACL,IAAI,gBAA8B,CAChC,OAAO,EAAG,MACZ,EAEA,SAAU,CACJ,IAEJ,EAAW,GACX,EAAG,MAAM,EACT,EAAO,OAAO,EACd,GAAS,QAAQ,EACjB,GAAQ,QAAQ,EAChB,EAAK,QAAQ,EACf,EAEA,IAAI,UAAoB,CACtB,OAAO,CACT,EAEA,GAAI,EAAK,IAET,OAAO,EAAM,CACX,GAAI,EAAU,MAAM,IAAI,EAAiB,iCAAiC,EAC1E,EAAW,CAAI,EACf,OAAO,CACT,EAEA,CAAC,OAAO,UAAW,CACjB,KAAK,QAAQ,CACf,CACF,CACF,CAEA,SAAS,iBAAiB,EAGxB,CACA,IAAI,EAAoC,KAExC,MAAO,CACL,OAAO,EAAU,CACf,AASE,KARI,EAAO,aAAa,EAAI,oBAAoB,YAAa,EAAO,WAAW,EAE3E,EAAO,cAAc,EAAI,oBAAoB,aAAc,EAAO,YAAY,EAE9E,EAAO,SAAS,EAAI,oBAAoB,QAAS,EAAO,OAAO,EAE/D,EAAO,WAAW,EAAI,oBAAoB,UAAW,EAAO,SAAS,EAEhE,MAGN,IAEL,EAAS,EAEL,EAAS,aAAa,EAAI,iBAAiB,YAAa,EAAS,WAAW,EAE5E,EAAS,cAAc,EAAI,iBAAiB,aAAc,EAAS,YAAY,EAE/E,EAAS,SAAS,EAAI,iBAAiB,QAAS,EAAS,OAAO,EAEhE,EAAS,WAAW,EAAI,iBAAiB,UAAW,EAAS,SAAS,EAC5E,EACA,QAAS,CACP,KAAK,OAAO,IAAA,EAAS,CACvB,CACF,CACF,CAOA,SAAgB,oBACd,EACA,EACA,EACA,EACoB,CACpB,OAAO,YACL,EACA,GACC,EAAM,EAAS,EAAQ,IAAmB,CACzC,IAAM,EAAyB,CAI7B,KAAM,EAAiB,IAAK,CAAE,cAAe,OAAQ,MAAO,YAAa,CAAC,EAC1E,OAAQ,EAAiB,IAAK,CAAE,MAAO,cAAe,CAAC,EACvD,MAAO,EAAiB,IAAK,CAAE,MAAO,cAAe,CAAC,EACtD,MAAO,EAAiB,IAAK,CAAE,MAAO,cAAe,CAAC,CACxD,EAOA,OALA,EAAK,UAAU,YAAY,EAAO,IAAI,EACtC,EAAK,UAAU,YAAY,EAAO,KAAK,EACvC,EAAK,UAAU,YAAY,EAAO,KAAK,EACvC,EAAK,UAAU,YAAY,EAAO,MAAM,EAEjC,CACL,UAAW,EAAK,UAChB,YACA,WAAY,EAAK,WACjB,iBACA,SACA,SACA,IAAK,EAAK,IACV,SACF,CACF,EACA,EACA,CACF,CACF,CAMA,SAAgB,qBACd,EACA,EACA,EACA,EACoB,CACpB,OAAO,YACL,EACA,GACC,EAAM,EAAS,EAAQ,KACrB,CACC,YACA,WAAY,EAAK,WACjB,iBACA,SACA,IAAK,EAAK,IACV,SACF,GACF,EACA,CACF,CACF"}
@@ -1,2 +1,2 @@
1
- var e={bottom:48,left:50,right:20,top:20};function t(t){return{...e,...t}}function n(e,t,n){return{height:Math.max(0,t-n.top-n.bottom),width:Math.max(0,e-n.left-n.right)}}exports.chartArea=n,exports.resolveMargin=t;
1
+ var e={bottom:48,left:50,right:20,top:20};function resolveMargin(t){return{...e,...t}}function chartArea(e,t,n){return{height:Math.max(0,t-n.top-n.bottom),width:Math.max(0,e-n.left-n.right)}}exports.chartArea=chartArea,exports.resolveMargin=resolveMargin;
2
2
  //# sourceMappingURL=layout.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout.cjs","names":[],"sources":["../../src/core/layout.ts"],"sourcesContent":["import type { ChartMargin } from '../types';\n\nconst DEFAULT_MARGIN: ChartMargin = { bottom: 48, left: 50, right: 20, top: 20 };\n\nexport function resolveMargin(margin?: Partial<ChartMargin>): ChartMargin {\n return { ...DEFAULT_MARGIN, ...margin };\n}\n\nexport function chartArea(width: number, height: number, margin: ChartMargin): { height: number; width: number } {\n return {\n height: Math.max(0, height - margin.top - margin.bottom),\n width: Math.max(0, width - margin.left - margin.right),\n };\n}\n"],"mappings":"AAEA,IAAM,EAA8B,CAAE,OAAQ,GAAI,KAAM,GAAI,MAAO,GAAI,IAAK,EAAG,EAE/E,SAAgB,EAAc,EAA4C,CACxE,MAAO,CAAE,GAAG,EAAgB,GAAG,CAAO,CACxC,CAEA,SAAgB,EAAU,EAAe,EAAgB,EAAwD,CAC/G,MAAO,CACL,OAAQ,KAAK,IAAI,EAAG,EAAS,EAAO,IAAM,EAAO,MAAM,EACvD,MAAO,KAAK,IAAI,EAAG,EAAQ,EAAO,KAAO,EAAO,KAAK,CACvD,CACF"}
1
+ {"version":3,"file":"layout.cjs","names":[],"sources":["../../src/core/layout.ts"],"sourcesContent":["import type { ChartMargin } from '../types';\n\nconst DEFAULT_MARGIN: ChartMargin = { bottom: 48, left: 50, right: 20, top: 20 };\n\nexport function resolveMargin(margin?: Partial<ChartMargin>): ChartMargin {\n return { ...DEFAULT_MARGIN, ...margin };\n}\n\nexport function chartArea(width: number, height: number, margin: ChartMargin): { height: number; width: number } {\n return {\n height: Math.max(0, height - margin.top - margin.bottom),\n width: Math.max(0, width - margin.left - margin.right),\n };\n}\n"],"mappings":"AAEA,IAAM,EAA8B,CAAE,OAAQ,GAAI,KAAM,GAAI,MAAO,GAAI,IAAK,EAAG,EAE/E,SAAgB,cAAc,EAA4C,CACxE,MAAO,CAAE,GAAG,EAAgB,GAAG,CAAO,CACxC,CAEA,SAAgB,UAAU,EAAe,EAAgB,EAAwD,CAC/G,MAAO,CACL,OAAQ,KAAK,IAAI,EAAG,EAAS,EAAO,IAAM,EAAO,MAAM,EACvD,MAAO,KAAK,IAAI,EAAG,EAAQ,EAAO,KAAO,EAAO,KAAK,CACvD,CACF"}
@@ -1,23 +1,2 @@
1
- //#region src/core/layout.ts
2
- var e = {
3
- bottom: 48,
4
- left: 50,
5
- right: 20,
6
- top: 20
7
- };
8
- function t(t) {
9
- return {
10
- ...e,
11
- ...t
12
- };
13
- }
14
- function n(e, t, n) {
15
- return {
16
- height: Math.max(0, t - n.top - n.bottom),
17
- width: Math.max(0, e - n.left - n.right)
18
- };
19
- }
20
- //#endregion
21
- export { n as chartArea, t as resolveMargin };
22
-
1
+ var e={bottom:48,left:50,right:20,top:20};function resolveMargin(t){return{...e,...t}}function chartArea(e,t,n){return{height:Math.max(0,t-n.top-n.bottom),width:Math.max(0,e-n.left-n.right)}}export{chartArea,resolveMargin};
23
2
  //# sourceMappingURL=layout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","names":[],"sources":["../../src/core/layout.ts"],"sourcesContent":["import type { ChartMargin } from '../types';\n\nconst DEFAULT_MARGIN: ChartMargin = { bottom: 48, left: 50, right: 20, top: 20 };\n\nexport function resolveMargin(margin?: Partial<ChartMargin>): ChartMargin {\n return { ...DEFAULT_MARGIN, ...margin };\n}\n\nexport function chartArea(width: number, height: number, margin: ChartMargin): { height: number; width: number } {\n return {\n height: Math.max(0, height - margin.top - margin.bottom),\n width: Math.max(0, width - margin.left - margin.right),\n };\n}\n"],"mappings":";AAEA,IAAM,IAA8B;CAAE,QAAQ;CAAI,MAAM;CAAI,OAAO;CAAI,KAAK;AAAG;AAE/E,SAAgB,EAAc,GAA4C;CACxE,OAAO;EAAE,GAAG;EAAgB,GAAG;CAAO;AACxC;AAEA,SAAgB,EAAU,GAAe,GAAgB,GAAwD;CAC/G,OAAO;EACL,QAAQ,KAAK,IAAI,GAAG,IAAS,EAAO,MAAM,EAAO,MAAM;EACvD,OAAO,KAAK,IAAI,GAAG,IAAQ,EAAO,OAAO,EAAO,KAAK;CACvD;AACF"}
1
+ {"version":3,"file":"layout.js","names":[],"sources":["../../src/core/layout.ts"],"sourcesContent":["import type { ChartMargin } from '../types';\n\nconst DEFAULT_MARGIN: ChartMargin = { bottom: 48, left: 50, right: 20, top: 20 };\n\nexport function resolveMargin(margin?: Partial<ChartMargin>): ChartMargin {\n return { ...DEFAULT_MARGIN, ...margin };\n}\n\nexport function chartArea(width: number, height: number, margin: ChartMargin): { height: number; width: number } {\n return {\n height: Math.max(0, height - margin.top - margin.bottom),\n width: Math.max(0, width - margin.left - margin.right),\n };\n}\n"],"mappings":"AAEA,IAAM,EAA8B,CAAE,OAAQ,GAAI,KAAM,GAAI,MAAO,GAAI,IAAK,EAAG,EAE/E,SAAgB,cAAc,EAA4C,CACxE,MAAO,CAAE,GAAG,EAAgB,GAAG,CAAO,CACxC,CAEA,SAAgB,UAAU,EAAe,EAAgB,EAAwD,CAC/G,MAAO,CACL,OAAQ,KAAK,IAAI,EAAG,EAAS,EAAO,IAAM,EAAO,MAAM,EACvD,MAAO,KAAK,IAAI,EAAG,EAAQ,EAAO,KAAO,EAAO,KAAK,CACvD,CACF"}
@@ -1,2 +1,2 @@
1
- function e(e,t){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()}}exports.observeResize=e;
1
+ function observeResize(e,t){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()}}exports.observeResize=observeResize;
2
2
  //# sourceMappingURL=responsive.cjs.map
@@ -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 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,EAAc,EAAiB,EAA+D,CAC5G,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":[],"sources":["../../src/core/responsive.ts"],"sourcesContent":["export function observeResize(el: HTMLElement, callback: (width: number, height: number) => void): () => void {\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,CAC5G,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,20 +1,2 @@
1
- //#region src/core/responsive.ts
2
- function e(e, t) {
3
- let n = null, r = new ResizeObserver((e) => {
4
- n !== null && cancelAnimationFrame(n), n = requestAnimationFrame(() => {
5
- n = null;
6
- let r = e[0];
7
- if (r) {
8
- let { height: e, width: n } = r.contentRect;
9
- t(n, e);
10
- }
11
- });
12
- });
13
- return r.observe(e), () => {
14
- n !== null && cancelAnimationFrame(n), r.disconnect();
15
- };
16
- }
17
- //#endregion
18
- export { e as observeResize };
19
-
1
+ function observeResize(e,t){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};
20
2
  //# 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 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,EAAc,GAAiB,GAA+D;CAC5G,IAAI,IAAuB,MAErB,IAAW,IAAI,gBAAgB,MAAY;EAG/C,AAFI,MAAU,QAAM,qBAAqB,CAAK,GAE9C,IAAQ,4BAA4B;GAClC,IAAQ;GAER,IAAM,IAAQ,EAAQ;GAEtB,IAAI,GAAO;IACT,IAAM,EAAE,WAAQ,aAAU,EAAM;IAEhC,EAAS,GAAO,CAAM;GACxB;EACF,CAAC;CACH,CAAC;CAID,OAFA,EAAS,QAAQ,CAAE,SAEN;EAGX,AAFI,MAAU,QAAM,qBAAqB,CAAK,GAE9C,EAAS,WAAW;CACtB;AACF"}
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 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,CAC5G,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"}
package/dist/devtools.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e,t){let n=`[prism:${t?.label??`chart`}]`;console.debug(`${n} mounted`);let r=new ResizeObserver(e=>{let t=e[0];if(t){let{height:e,width:r}=t.contentRect;console.debug(`${n} resized ${Math.round(r)}×${Math.round(e)}`)}});return r.observe(e.el),e.disposalSignal.addEventListener(`abort`,()=>{r.disconnect(),console.debug(`${n} disposed`)},{once:!0}),e}exports.debugChart=e;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function debugChart(e,t){let n=`[prism:${t?.label??`chart`}]`;console.debug(`${n} mounted`);let r=new ResizeObserver(e=>{let t=e[0];if(t){let{height:e,width:r}=t.contentRect;console.debug(`${n} resized ${Math.round(r)}×${Math.round(e)}`)}});return r.observe(e.el),e.disposalSignal.addEventListener(`abort`,()=>{r.disconnect(),console.debug(`${n} disposed`)},{once:!0}),e}exports.debugChart=debugChart;
2
2
  //# sourceMappingURL=devtools.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtools.cjs","names":[],"sources":["../src/devtools/index.ts"],"sourcesContent":["/**\n * @vielzeug/prism — debug utilities for chart visualisation.\n *\n * Import from the dedicated sub-path so debug code is tree-shaken from\n * production bundles:\n * ```ts\n * import { debugChart } from '@vielzeug/prism/devtools';\n * ```\n *\n * Internal validation warnings (misuse of the public API) are emitted\n * automatically in development builds and live in the private `src/_dev.ts`\n * module. They are not part of this sub-path.\n */\n\nimport type { ChartHandle } from '../types';\n\n/** Options for {@link debugChart}. */\nexport interface DebugChartOptions {\n /**\n * Label used in log prefixes. Defaults to `'chart'`, producing `[prism:chart]`.\n * Useful when debugging multiple charts on the same page so their log output\n * can be distinguished:\n * ```ts\n * debugChart(createLineChart(el, config), { label: 'revenue' });\n * // [prism:revenue] mounted\n * ```\n */\n label?: string;\n}\n\n/**\n * Wraps an already-created {@link ChartHandle} with lifecycle logging pre-wired to\n * `console.debug`, imported from a dedicated sub-path so `console.debug` references\n * and the `ResizeObserver` it uses are tree-shaken from production bundles when this\n * sub-path is not imported.\n *\n * Logs the chart's mount, every resize (via its own `ResizeObserver` on `handle.el`,\n * independent of the chart's internal one), and disposal, each with `[prism:<label>]`\n * prefixes. Returns the same handle unchanged so it can wrap any `create*Chart()` call\n * in place.\n *\n * @example\n * ```ts\n * import { createLineChart } from '@vielzeug/prism';\n * import { debugChart } from '@vielzeug/prism/devtools';\n *\n * const chart = debugChart(createLineChart(container, config), { label: 'revenue' });\n * // [prism:revenue] mounted\n * // [prism:revenue] resized 600×300\n * chart.dispose();\n * // [prism:revenue] disposed\n * ```\n */\nexport function debugChart<T extends ChartHandle>(handle: T, options?: DebugChartOptions): T {\n const prefix = `[prism:${options?.label ?? 'chart'}]`;\n\n console.debug(`${prefix} mounted`);\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n\n if (entry) {\n const { height, width } = entry.contentRect;\n\n console.debug(`${prefix} resized ${Math.round(width)}×${Math.round(height)}`);\n }\n });\n\n resizeObserver.observe(handle.el);\n\n handle.disposalSignal.addEventListener(\n 'abort',\n () => {\n resizeObserver.disconnect();\n console.debug(`${prefix} disposed`);\n },\n { once: true },\n );\n\n return handle;\n}\n"],"mappings":"mEAqDA,SAAgB,EAAkC,EAAW,EAAgC,CAC3F,IAAM,EAAS,UAAU,GAAS,OAAS,QAAQ,GAEnD,QAAQ,MAAM,GAAG,EAAO,SAAS,EAEjC,IAAM,EAAiB,IAAI,eAAgB,GAAY,CACrD,IAAM,EAAQ,EAAQ,GAEtB,GAAI,EAAO,CACT,GAAM,CAAE,SAAQ,SAAU,EAAM,YAEhC,QAAQ,MAAM,GAAG,EAAO,YAAY,KAAK,MAAM,CAAK,EAAE,GAAG,KAAK,MAAM,CAAM,GAAG,CAC/E,CACF,CAAC,EAaD,OAXA,EAAe,QAAQ,EAAO,EAAE,EAEhC,EAAO,eAAe,iBACpB,YACM,CACJ,EAAe,WAAW,EAC1B,QAAQ,MAAM,GAAG,EAAO,UAAU,CACpC,EACA,CAAE,KAAM,EAAK,CACf,EAEO,CACT"}
1
+ {"version":3,"file":"devtools.cjs","names":[],"sources":["../src/devtools/index.ts"],"sourcesContent":["/**\n * @vielzeug/prism — debug utilities for chart visualisation.\n *\n * Import from the dedicated sub-path so debug code is tree-shaken from\n * production bundles:\n * ```ts\n * import { debugChart } from '@vielzeug/prism/devtools';\n * ```\n *\n * Internal validation warnings (misuse of the public API) are emitted\n * automatically in development builds and live in the private `src/_dev.ts`\n * module. They are not part of this sub-path.\n */\n\nimport type { ChartHandle } from '../types';\n\n/** Options for {@link debugChart}. */\nexport interface DebugChartOptions {\n /**\n * Label used in log prefixes. Defaults to `'chart'`, producing `[prism:chart]`.\n * Useful when debugging multiple charts on the same page so their log output\n * can be distinguished:\n * ```ts\n * debugChart(createLineChart(el, config), { label: 'revenue' });\n * // [prism:revenue] mounted\n * ```\n */\n label?: string;\n}\n\n/**\n * Wraps an already-created {@link ChartHandle} with lifecycle logging pre-wired to\n * `console.debug`, imported from a dedicated sub-path so `console.debug` references\n * and the `ResizeObserver` it uses are tree-shaken from production bundles when this\n * sub-path is not imported.\n *\n * Logs the chart's mount, every resize (via its own `ResizeObserver` on `handle.el`,\n * independent of the chart's internal one), and disposal, each with `[prism:<label>]`\n * prefixes. Returns the same handle unchanged so it can wrap any `create*Chart()` call\n * in place.\n *\n * @example\n * ```ts\n * import { createLineChart } from '@vielzeug/prism';\n * import { debugChart } from '@vielzeug/prism/devtools';\n *\n * const chart = debugChart(createLineChart(container, config), { label: 'revenue' });\n * // [prism:revenue] mounted\n * // [prism:revenue] resized 600×300\n * chart.dispose();\n * // [prism:revenue] disposed\n * ```\n */\nexport function debugChart<T extends ChartHandle>(handle: T, options?: DebugChartOptions): T {\n const prefix = `[prism:${options?.label ?? 'chart'}]`;\n\n console.debug(`${prefix} mounted`);\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n\n if (entry) {\n const { height, width } = entry.contentRect;\n\n console.debug(`${prefix} resized ${Math.round(width)}×${Math.round(height)}`);\n }\n });\n\n resizeObserver.observe(handle.el);\n\n handle.disposalSignal.addEventListener(\n 'abort',\n () => {\n resizeObserver.disconnect();\n console.debug(`${prefix} disposed`);\n },\n { once: true },\n );\n\n return handle;\n}\n"],"mappings":"mEAqDA,SAAgB,WAAkC,EAAW,EAAgC,CAC3F,IAAM,EAAS,UAAU,GAAS,OAAS,QAAQ,GAEnD,QAAQ,MAAM,GAAG,EAAO,SAAS,EAEjC,IAAM,EAAiB,IAAI,eAAgB,GAAY,CACrD,IAAM,EAAQ,EAAQ,GAEtB,GAAI,EAAO,CACT,GAAM,CAAE,SAAQ,SAAU,EAAM,YAEhC,QAAQ,MAAM,GAAG,EAAO,YAAY,KAAK,MAAM,CAAK,EAAE,GAAG,KAAK,MAAM,CAAM,GAAG,CAC/E,CACF,CAAC,EAaD,OAXA,EAAe,QAAQ,EAAO,EAAE,EAEhC,EAAO,eAAe,iBACpB,YACM,CACJ,EAAe,WAAW,EAC1B,QAAQ,MAAM,GAAG,EAAO,UAAU,CACpC,EACA,CAAE,KAAM,EAAK,CACf,EAEO,CACT"}
package/dist/devtools.js CHANGED
@@ -1,19 +1,2 @@
1
- //#region src/devtools/index.ts
2
- function e(e, t) {
3
- let n = `[prism:${t?.label ?? "chart"}]`;
4
- console.debug(`${n} mounted`);
5
- let r = new ResizeObserver((e) => {
6
- let t = e[0];
7
- if (t) {
8
- let { height: e, width: r } = t.contentRect;
9
- console.debug(`${n} resized ${Math.round(r)}×${Math.round(e)}`);
10
- }
11
- });
12
- return r.observe(e.el), e.disposalSignal.addEventListener("abort", () => {
13
- r.disconnect(), console.debug(`${n} disposed`);
14
- }, { once: !0 }), e;
15
- }
16
- //#endregion
17
- export { e as debugChart };
18
-
1
+ function debugChart(e,t){let n=`[prism:${t?.label??`chart`}]`;console.debug(`${n} mounted`);let r=new ResizeObserver(e=>{let t=e[0];if(t){let{height:e,width:r}=t.contentRect;console.debug(`${n} resized ${Math.round(r)}×${Math.round(e)}`)}});return r.observe(e.el),e.disposalSignal.addEventListener(`abort`,()=>{r.disconnect(),console.debug(`${n} disposed`)},{once:!0}),e}export{debugChart};
19
2
  //# sourceMappingURL=devtools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtools.js","names":[],"sources":["../src/devtools/index.ts"],"sourcesContent":["/**\n * @vielzeug/prism — debug utilities for chart visualisation.\n *\n * Import from the dedicated sub-path so debug code is tree-shaken from\n * production bundles:\n * ```ts\n * import { debugChart } from '@vielzeug/prism/devtools';\n * ```\n *\n * Internal validation warnings (misuse of the public API) are emitted\n * automatically in development builds and live in the private `src/_dev.ts`\n * module. They are not part of this sub-path.\n */\n\nimport type { ChartHandle } from '../types';\n\n/** Options for {@link debugChart}. */\nexport interface DebugChartOptions {\n /**\n * Label used in log prefixes. Defaults to `'chart'`, producing `[prism:chart]`.\n * Useful when debugging multiple charts on the same page so their log output\n * can be distinguished:\n * ```ts\n * debugChart(createLineChart(el, config), { label: 'revenue' });\n * // [prism:revenue] mounted\n * ```\n */\n label?: string;\n}\n\n/**\n * Wraps an already-created {@link ChartHandle} with lifecycle logging pre-wired to\n * `console.debug`, imported from a dedicated sub-path so `console.debug` references\n * and the `ResizeObserver` it uses are tree-shaken from production bundles when this\n * sub-path is not imported.\n *\n * Logs the chart's mount, every resize (via its own `ResizeObserver` on `handle.el`,\n * independent of the chart's internal one), and disposal, each with `[prism:<label>]`\n * prefixes. Returns the same handle unchanged so it can wrap any `create*Chart()` call\n * in place.\n *\n * @example\n * ```ts\n * import { createLineChart } from '@vielzeug/prism';\n * import { debugChart } from '@vielzeug/prism/devtools';\n *\n * const chart = debugChart(createLineChart(container, config), { label: 'revenue' });\n * // [prism:revenue] mounted\n * // [prism:revenue] resized 600×300\n * chart.dispose();\n * // [prism:revenue] disposed\n * ```\n */\nexport function debugChart<T extends ChartHandle>(handle: T, options?: DebugChartOptions): T {\n const prefix = `[prism:${options?.label ?? 'chart'}]`;\n\n console.debug(`${prefix} mounted`);\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n\n if (entry) {\n const { height, width } = entry.contentRect;\n\n console.debug(`${prefix} resized ${Math.round(width)}×${Math.round(height)}`);\n }\n });\n\n resizeObserver.observe(handle.el);\n\n handle.disposalSignal.addEventListener(\n 'abort',\n () => {\n resizeObserver.disconnect();\n console.debug(`${prefix} disposed`);\n },\n { once: true },\n );\n\n return handle;\n}\n"],"mappings":";AAqDA,SAAgB,EAAkC,GAAW,GAAgC;CAC3F,IAAM,IAAS,UAAU,GAAS,SAAS,QAAQ;CAEnD,QAAQ,MAAM,GAAG,EAAO,SAAS;CAEjC,IAAM,IAAiB,IAAI,gBAAgB,MAAY;EACrD,IAAM,IAAQ,EAAQ;EAEtB,IAAI,GAAO;GACT,IAAM,EAAE,WAAQ,aAAU,EAAM;GAEhC,QAAQ,MAAM,GAAG,EAAO,YAAY,KAAK,MAAM,CAAK,EAAE,GAAG,KAAK,MAAM,CAAM,GAAG;EAC/E;CACF,CAAC;CAaD,OAXA,EAAe,QAAQ,EAAO,EAAE,GAEhC,EAAO,eAAe,iBACpB,eACM;EAEJ,AADA,EAAe,WAAW,GAC1B,QAAQ,MAAM,GAAG,EAAO,UAAU;CACpC,GACA,EAAE,MAAM,GAAK,CACf,GAEO;AACT"}
1
+ {"version":3,"file":"devtools.js","names":[],"sources":["../src/devtools/index.ts"],"sourcesContent":["/**\n * @vielzeug/prism — debug utilities for chart visualisation.\n *\n * Import from the dedicated sub-path so debug code is tree-shaken from\n * production bundles:\n * ```ts\n * import { debugChart } from '@vielzeug/prism/devtools';\n * ```\n *\n * Internal validation warnings (misuse of the public API) are emitted\n * automatically in development builds and live in the private `src/_dev.ts`\n * module. They are not part of this sub-path.\n */\n\nimport type { ChartHandle } from '../types';\n\n/** Options for {@link debugChart}. */\nexport interface DebugChartOptions {\n /**\n * Label used in log prefixes. Defaults to `'chart'`, producing `[prism:chart]`.\n * Useful when debugging multiple charts on the same page so their log output\n * can be distinguished:\n * ```ts\n * debugChart(createLineChart(el, config), { label: 'revenue' });\n * // [prism:revenue] mounted\n * ```\n */\n label?: string;\n}\n\n/**\n * Wraps an already-created {@link ChartHandle} with lifecycle logging pre-wired to\n * `console.debug`, imported from a dedicated sub-path so `console.debug` references\n * and the `ResizeObserver` it uses are tree-shaken from production bundles when this\n * sub-path is not imported.\n *\n * Logs the chart's mount, every resize (via its own `ResizeObserver` on `handle.el`,\n * independent of the chart's internal one), and disposal, each with `[prism:<label>]`\n * prefixes. Returns the same handle unchanged so it can wrap any `create*Chart()` call\n * in place.\n *\n * @example\n * ```ts\n * import { createLineChart } from '@vielzeug/prism';\n * import { debugChart } from '@vielzeug/prism/devtools';\n *\n * const chart = debugChart(createLineChart(container, config), { label: 'revenue' });\n * // [prism:revenue] mounted\n * // [prism:revenue] resized 600×300\n * chart.dispose();\n * // [prism:revenue] disposed\n * ```\n */\nexport function debugChart<T extends ChartHandle>(handle: T, options?: DebugChartOptions): T {\n const prefix = `[prism:${options?.label ?? 'chart'}]`;\n\n console.debug(`${prefix} mounted`);\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n\n if (entry) {\n const { height, width } = entry.contentRect;\n\n console.debug(`${prefix} resized ${Math.round(width)}×${Math.round(height)}`);\n }\n });\n\n resizeObserver.observe(handle.el);\n\n handle.disposalSignal.addEventListener(\n 'abort',\n () => {\n resizeObserver.disconnect();\n console.debug(`${prefix} disposed`);\n },\n { once: true },\n );\n\n return handle;\n}\n"],"mappings":"AAqDA,SAAgB,WAAkC,EAAW,EAAgC,CAC3F,IAAM,EAAS,UAAU,GAAS,OAAS,QAAQ,GAEnD,QAAQ,MAAM,GAAG,EAAO,SAAS,EAEjC,IAAM,EAAiB,IAAI,eAAgB,GAAY,CACrD,IAAM,EAAQ,EAAQ,GAEtB,GAAI,EAAO,CACT,GAAM,CAAE,SAAQ,SAAU,EAAM,YAEhC,QAAQ,MAAM,GAAG,EAAO,YAAY,KAAK,MAAM,CAAK,EAAE,GAAG,KAAK,MAAM,CAAM,GAAG,CAC/E,CACF,CAAC,EAaD,OAXA,EAAe,QAAQ,EAAO,EAAE,EAEhC,EAAO,eAAe,iBACpB,YACM,CACJ,EAAe,WAAW,EAC1B,QAAQ,MAAM,GAAG,EAAO,UAAU,CACpC,EACA,CAAE,KAAM,EAAK,CACf,EAEO,CACT"}
package/dist/errors.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{};exports.PrismError=e,exports.PrismRenderError=t;
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{};exports.PrismError=PrismError,exports.PrismRenderError=PrismRenderError;
2
2
  //# sourceMappingURL=errors.cjs.map