@sckyzo/cosmos-charts 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/README.md +107 -22
  3. package/THIRD_PARTY_NOTICES.md +81 -0
  4. package/dist/BarChart.cjs +137 -0
  5. package/dist/BarChart.cjs.map +1 -0
  6. package/dist/BarChart.js +135 -0
  7. package/dist/BarChart.js.map +1 -0
  8. package/dist/BoxPlotChart.cjs +214 -0
  9. package/dist/BoxPlotChart.cjs.map +1 -0
  10. package/dist/BoxPlotChart.js +212 -0
  11. package/dist/BoxPlotChart.js.map +1 -0
  12. package/dist/BumpChart.cjs +328 -0
  13. package/dist/BumpChart.cjs.map +1 -0
  14. package/dist/BumpChart.js +326 -0
  15. package/dist/BumpChart.js.map +1 -0
  16. package/dist/CalendarChart.cjs +218 -0
  17. package/dist/CalendarChart.cjs.map +1 -0
  18. package/dist/CalendarChart.js +216 -0
  19. package/dist/CalendarChart.js.map +1 -0
  20. package/dist/DonutChart.cjs +122 -0
  21. package/dist/DonutChart.cjs.map +1 -0
  22. package/dist/DonutChart.js +120 -0
  23. package/dist/DonutChart.js.map +1 -0
  24. package/dist/FunnelChart.cjs +424 -0
  25. package/dist/FunnelChart.cjs.map +1 -0
  26. package/dist/FunnelChart.js +422 -0
  27. package/dist/FunnelChart.js.map +1 -0
  28. package/dist/GradientRadial.cjs +51 -0
  29. package/dist/GradientRadial.cjs.map +1 -0
  30. package/dist/GradientRadial.js +49 -0
  31. package/dist/GradientRadial.js.map +1 -0
  32. package/dist/HeatmapChart.cjs +148 -0
  33. package/dist/HeatmapChart.cjs.map +1 -0
  34. package/dist/HeatmapChart.js +146 -0
  35. package/dist/HeatmapChart.js.map +1 -0
  36. package/dist/LineAreaChart.cjs +98 -0
  37. package/dist/LineAreaChart.cjs.map +1 -0
  38. package/dist/LineAreaChart.js +96 -0
  39. package/dist/LineAreaChart.js.map +1 -0
  40. package/dist/MixedChart.cjs +195 -0
  41. package/dist/MixedChart.cjs.map +1 -0
  42. package/dist/MixedChart.js +193 -0
  43. package/dist/MixedChart.js.map +1 -0
  44. package/dist/RadarChart.cjs +109 -0
  45. package/dist/RadarChart.cjs.map +1 -0
  46. package/dist/RadarChart.js +107 -0
  47. package/dist/RadarChart.js.map +1 -0
  48. package/dist/RadialBarChart.cjs +99 -0
  49. package/dist/RadialBarChart.cjs.map +1 -0
  50. package/dist/RadialBarChart.js +97 -0
  51. package/dist/RadialBarChart.js.map +1 -0
  52. package/dist/RangeBarChart.cjs +218 -0
  53. package/dist/RangeBarChart.cjs.map +1 -0
  54. package/dist/RangeBarChart.js +216 -0
  55. package/dist/RangeBarChart.js.map +1 -0
  56. package/dist/RealtimeChart.cjs +173 -0
  57. package/dist/RealtimeChart.cjs.map +1 -0
  58. package/dist/RealtimeChart.js +171 -0
  59. package/dist/RealtimeChart.js.map +1 -0
  60. package/dist/ScatterChart.cjs +134 -0
  61. package/dist/ScatterChart.cjs.map +1 -0
  62. package/dist/ScatterChart.js +131 -0
  63. package/dist/ScatterChart.js.map +1 -0
  64. package/dist/SemiCircleGauge.cjs +142 -0
  65. package/dist/SemiCircleGauge.cjs.map +1 -0
  66. package/dist/SemiCircleGauge.js +140 -0
  67. package/dist/SemiCircleGauge.js.map +1 -0
  68. package/dist/Sparkline.cjs +117 -0
  69. package/dist/Sparkline.cjs.map +1 -0
  70. package/dist/Sparkline.js +115 -0
  71. package/dist/Sparkline.js.map +1 -0
  72. package/dist/StrokedGauge.cjs +94 -0
  73. package/dist/StrokedGauge.cjs.map +1 -0
  74. package/dist/StrokedGauge.js +92 -0
  75. package/dist/StrokedGauge.js.map +1 -0
  76. package/dist/TreemapChart.cjs +263 -0
  77. package/dist/TreemapChart.cjs.map +1 -0
  78. package/dist/TreemapChart.js +261 -0
  79. package/dist/TreemapChart.js.map +1 -0
  80. package/dist/WaterfallChart.cjs +235 -0
  81. package/dist/WaterfallChart.cjs.map +1 -0
  82. package/dist/WaterfallChart.js +233 -0
  83. package/dist/WaterfallChart.js.map +1 -0
  84. package/dist/WorldMap.cjs +2088 -0
  85. package/dist/WorldMap.cjs.map +1 -0
  86. package/dist/WorldMap.js +603 -0
  87. package/dist/WorldMap.js.map +1 -0
  88. package/dist/chunk-4AKHZNWP.js +127 -0
  89. package/dist/chunk-4AKHZNWP.js.map +1 -0
  90. package/dist/chunk-56WD3OHA.js +62 -0
  91. package/dist/chunk-56WD3OHA.js.map +1 -0
  92. package/dist/chunk-5C2RLJYZ.js +11 -0
  93. package/dist/chunk-5C2RLJYZ.js.map +1 -0
  94. package/dist/chunk-6FGJZBTC.js +61 -0
  95. package/dist/chunk-6FGJZBTC.js.map +1 -0
  96. package/dist/chunk-AAYHG7YK.cjs +30 -0
  97. package/dist/chunk-AAYHG7YK.cjs.map +1 -0
  98. package/dist/chunk-AOSO5QHL.js +19 -0
  99. package/dist/chunk-AOSO5QHL.js.map +1 -0
  100. package/dist/chunk-BFEDLXVW.js +12 -0
  101. package/dist/chunk-BFEDLXVW.js.map +1 -0
  102. package/dist/chunk-CMBNNLIV.cjs +63 -0
  103. package/dist/chunk-CMBNNLIV.cjs.map +1 -0
  104. package/dist/chunk-DBZQI4HM.cjs +14 -0
  105. package/dist/chunk-DBZQI4HM.cjs.map +1 -0
  106. package/dist/chunk-DI2FBGKM.js +44 -0
  107. package/dist/chunk-DI2FBGKM.js.map +1 -0
  108. package/dist/chunk-ESVGCUJN.js +58 -0
  109. package/dist/chunk-ESVGCUJN.js.map +1 -0
  110. package/dist/chunk-F2PMFYJ5.cjs +40 -0
  111. package/dist/chunk-F2PMFYJ5.cjs.map +1 -0
  112. package/dist/chunk-FUZW3H5X.js +38 -0
  113. package/dist/chunk-FUZW3H5X.js.map +1 -0
  114. package/dist/chunk-G4WOPX4D.cjs +51 -0
  115. package/dist/chunk-G4WOPX4D.cjs.map +1 -0
  116. package/dist/chunk-GDZLYYL2.js +27 -0
  117. package/dist/chunk-GDZLYYL2.js.map +1 -0
  118. package/dist/chunk-GVTMZYOM.cjs +30 -0
  119. package/dist/chunk-GVTMZYOM.cjs.map +1 -0
  120. package/dist/chunk-IW6EWB26.cjs +21 -0
  121. package/dist/chunk-IW6EWB26.cjs.map +1 -0
  122. package/dist/chunk-K3R7JGOW.cjs +18 -0
  123. package/dist/chunk-K3R7JGOW.cjs.map +1 -0
  124. package/dist/chunk-LT3UC65O.cjs +68 -0
  125. package/dist/chunk-LT3UC65O.cjs.map +1 -0
  126. package/dist/chunk-OCD6JIIX.js +23 -0
  127. package/dist/chunk-OCD6JIIX.js.map +1 -0
  128. package/dist/chunk-RCDTBZC2.cjs +131 -0
  129. package/dist/chunk-RCDTBZC2.cjs.map +1 -0
  130. package/dist/chunk-SR2ESX3R.cjs +66 -0
  131. package/dist/chunk-SR2ESX3R.cjs.map +1 -0
  132. package/dist/chunk-T3K6Q34U.cjs +82 -0
  133. package/dist/chunk-T3K6Q34U.cjs.map +1 -0
  134. package/dist/chunk-TYQWZR3S.cjs +13 -0
  135. package/dist/chunk-TYQWZR3S.cjs.map +1 -0
  136. package/dist/chunk-UATB2IRY.js +51 -0
  137. package/dist/chunk-UATB2IRY.js.map +1 -0
  138. package/dist/chunk-UJIV5PVI.js +13 -0
  139. package/dist/chunk-UJIV5PVI.js.map +1 -0
  140. package/dist/chunk-UL3SNXQR.js +280 -0
  141. package/dist/chunk-UL3SNXQR.js.map +1 -0
  142. package/dist/chunk-URNXLVSK.js +44 -0
  143. package/dist/chunk-URNXLVSK.js.map +1 -0
  144. package/dist/chunk-VIOSQN4Z.js +79 -0
  145. package/dist/chunk-VIOSQN4Z.js.map +1 -0
  146. package/dist/chunk-X3YZP5WF.cjs +46 -0
  147. package/dist/chunk-X3YZP5WF.cjs.map +1 -0
  148. package/dist/chunk-XMFBVMW7.cjs +30 -0
  149. package/dist/chunk-XMFBVMW7.cjs.map +1 -0
  150. package/dist/chunk-XUGQ6VXO.cjs +60 -0
  151. package/dist/chunk-XUGQ6VXO.cjs.map +1 -0
  152. package/dist/chunk-YMRNTIOK.js +27 -0
  153. package/dist/chunk-YMRNTIOK.js.map +1 -0
  154. package/dist/chunk-ZWHCUYIN.cjs +282 -0
  155. package/dist/chunk-ZWHCUYIN.cjs.map +1 -0
  156. package/dist/index.cjs +154 -1166
  157. package/dist/index.cjs.map +1 -1
  158. package/dist/index.d.cts +470 -80
  159. package/dist/index.d.ts +470 -80
  160. package/dist/index.js +23 -1144
  161. package/dist/index.js.map +1 -1
  162. package/dist/theme.cjs +88 -0
  163. package/dist/theme.cjs.map +1 -0
  164. package/dist/theme.js +84 -0
  165. package/dist/theme.js.map +1 -0
  166. package/package.json +23 -12
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ import { useFontsLoaded } from './chunk-56WD3OHA.js';
3
+ import { MUTED, GRID } from './chunk-UATB2IRY.js';
4
+
5
+ // src/core/axes.ts
6
+ var TEXT_SIZE = "var(--text-xs, 0.75rem)";
7
+ var AXIS = {
8
+ axisLine: false,
9
+ tickLine: false,
10
+ tickMargin: 8,
11
+ tick: { fill: MUTED, style: { fontSize: TEXT_SIZE } }
12
+ };
13
+ var AXIS_AFTER_FONTS = { ...AXIS, tick: { ...AXIS.tick } };
14
+ var useAxis = () => useFontsLoaded() ? AXIS_AFTER_FONTS : AXIS;
15
+ var GRID_PROPS = {
16
+ vertical: false,
17
+ stroke: GRID,
18
+ strokeDasharray: "4 4"
19
+ };
20
+ var titleStyle = { fill: MUTED, fontSize: TEXT_SIZE };
21
+ var xAxisTitle = (title) => title ? {
22
+ height: 52,
23
+ label: {
24
+ value: title,
25
+ position: "insideBottom",
26
+ offset: 0,
27
+ fill: MUTED,
28
+ style: titleStyle
29
+ }
30
+ } : {};
31
+ var yAxisTitle = (title) => title ? {
32
+ label: {
33
+ value: title,
34
+ angle: -90,
35
+ position: "insideLeft",
36
+ offset: 4,
37
+ fill: MUTED,
38
+ style: { ...titleStyle, textAnchor: "middle" }
39
+ }
40
+ } : {};
41
+
42
+ export { AXIS, GRID_PROPS, TEXT_SIZE, useAxis, xAxisTitle, yAxisTitle };
43
+ //# sourceMappingURL=chunk-DI2FBGKM.js.map
44
+ //# sourceMappingURL=chunk-DI2FBGKM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/axes.ts"],"names":[],"mappings":";;;;;AAMO,IAAM,SAAA,GAAY;AAGlB,IAAM,IAAA,GAAO;AAAA,EAClB,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,UAAA,EAAY,CAAA;AAAA,EACZ,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,EAAE,QAAA,EAAU,WAAU;AACpD;AAMA,IAAM,gBAAA,GAAmB,EAAE,GAAG,IAAA,EAAM,MAAM,EAAE,GAAG,IAAA,CAAK,IAAA,EAAK,EAAE;AAQpD,IAAM,OAAA,GAAU,MAAO,cAAA,EAAe,GAAI,gBAAA,GAAmB;AAG7D,IAAM,UAAA,GAAa;AAAA,EACxB,QAAA,EAAU,KAAA;AAAA,EACV,MAAA,EAAQ,IAAA;AAAA,EACR,eAAA,EAAiB;AACnB;AAGA,IAAM,UAAA,GAAa,EAAE,IAAA,EAAM,KAAA,EAAO,UAAU,SAAA,EAAU;AAG/C,IAAM,UAAA,GAAa,CAAC,KAAA,KACzB,KAAA,GACK;AAAA,EACC,MAAA,EAAQ,EAAA;AAAA,EACR,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,QAAA,EAAU,cAAA;AAAA,IACV,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAA,GACA;AAGC,IAAM,UAAA,GAAa,CAAC,KAAA,KACzB,KAAA,GACK;AAAA,EACC,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,GAAA;AAAA,IACP,QAAA,EAAU,YAAA;AAAA,IACV,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,YAAY,QAAA;AAAS;AAEjD,CAAA,GACA","file":"chunk-DI2FBGKM.js","sourcesContent":["import { GRID, MUTED } from './colors';\nimport { useFontsLoaded } from './frame';\n\n// Axis text is 12px at the normal text size and follows the text size setting:\n// `--text-xs` is rescaled on <html> by `data-text-size`. The fallback is the\n// normal size, for an app that doesn't load the theme.\nexport const TEXT_SIZE = 'var(--text-xs, 0.75rem)';\n\n/** The look of every axis: no line, no tick mark, muted text. */\nexport const AXIS = {\n axisLine: false,\n tickLine: false,\n tickMargin: 8,\n tick: { fill: MUTED, style: { fontSize: TEXT_SIZE } },\n} as const;\n\n// `AXIS` again, with a `tick` object of its own. Recharts measures a\n// `width=\"auto\"` axis when its settings change, and reads the same `tick`\n// object as no change: handing it a new one after a web font has loaded makes\n// the axis measure its labels again, in the font that is drawn.\nconst AXIS_AFTER_FONTS = { ...AXIS, tick: { ...AXIS.tick } } as const;\n\n/**\n * `AXIS` for the axes of a chart. Once a web font has finished loading after\n * the chart mounted it is another object, once: the labels were measured in\n * the fallback font, and an axis with `width=\"auto\"` makes room for them in\n * the font that is drawn (recharts 3.10.1 measures on a settings change).\n */\nexport const useAxis = () => (useFontsLoaded() ? AXIS_AFTER_FONTS : AXIS);\n\n/** The grid: horizontal dashed lines only. */\nexport const GRID_PROPS = {\n vertical: false,\n stroke: GRID,\n strokeDasharray: '4 4',\n} as const;\n\n// `fill` as an attribute too: the label's own default is gray.\nconst titleStyle = { fill: MUTED, fontSize: TEXT_SIZE } as const;\n\n/** Props for an `XAxis` with an optional title under it. The title is SVG text: markup shows as written. */\nexport const xAxisTitle = (title?: string) =>\n title\n ? ({\n height: 52,\n label: {\n value: title,\n position: 'insideBottom',\n offset: 0,\n fill: MUTED,\n style: titleStyle,\n },\n } as const)\n : {};\n\n/** Props for a `YAxis` with an optional title beside it. */\nexport const yAxisTitle = (title?: string) =>\n title\n ? ({\n label: {\n value: title,\n angle: -90,\n position: 'insideLeft',\n offset: 4,\n fill: MUTED,\n style: { ...titleStyle, textAnchor: 'middle' },\n },\n } as const)\n : {};\n"]}
@@ -0,0 +1,58 @@
1
+ "use client";
2
+ import { TEXT_SIZE } from './chunk-DI2FBGKM.js';
3
+ import { INTENT_COLORS, MUTED } from './chunk-UATB2IRY.js';
4
+ import { ReferenceArea, ReferenceLine } from 'recharts';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ var DASH = "6 4";
8
+ var BAND_LAYER = 50;
9
+ var labelOf = (value, position) => ({
10
+ value,
11
+ position,
12
+ className: "recharts-reference-label",
13
+ fill: MUTED,
14
+ style: { fontSize: TEXT_SIZE }
15
+ });
16
+ var referenceMarks = ({
17
+ referenceLines = [],
18
+ referenceBands = [],
19
+ axis = "y",
20
+ axisId
21
+ }) => {
22
+ const onAxis = axisId === void 0 ? {} : { [`${axis}AxisId`]: axisId };
23
+ return [
24
+ ...referenceBands.map((band, i) => {
25
+ const [low, high] = [Math.min(band.from, band.to), Math.max(band.from, band.to)];
26
+ return /* @__PURE__ */ jsx(
27
+ ReferenceArea,
28
+ {
29
+ ...{ [`${axis}1`]: low, [`${axis}2`]: high },
30
+ ...onAxis,
31
+ fill: INTENT_COLORS[band.intent ?? "neutral"],
32
+ fillOpacity: 0.14,
33
+ ifOverflow: "extendDomain",
34
+ zIndex: BAND_LAYER,
35
+ label: band.label ? labelOf(band.label, "insideTopLeft") : void 0
36
+ },
37
+ `band-${i}`
38
+ );
39
+ }),
40
+ ...referenceLines.map((line, i) => /* @__PURE__ */ jsx(
41
+ ReferenceLine,
42
+ {
43
+ ...{ [axis]: line.value },
44
+ ...onAxis,
45
+ stroke: INTENT_COLORS[line.intent ?? "neutral"],
46
+ strokeWidth: 1.5,
47
+ strokeDasharray: line.dashed ? DASH : void 0,
48
+ ifOverflow: "extendDomain",
49
+ label: line.label ? labelOf(line.label, "insideTopRight") : void 0
50
+ },
51
+ `line-${i}`
52
+ ))
53
+ ];
54
+ };
55
+
56
+ export { referenceMarks };
57
+ //# sourceMappingURL=chunk-ESVGCUJN.js.map
58
+ //# sourceMappingURL=chunk-ESVGCUJN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/reference.tsx"],"names":[],"mappings":";;;;;;AAYA,IAAM,IAAA,GAAO,KAAA;AAEb,IAAM,UAAA,GAAa,EAAA;AAInB,IAAM,OAAA,GAAU,CAAC,KAAA,EAAe,QAAA,MAAkD;AAAA,EAChF,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,EAAW,0BAAA;AAAA,EACX,IAAA,EAAM,KAAA;AAAA,EACN,KAAA,EAAO,EAAE,QAAA,EAAU,SAAA;AACrB,CAAA,CAAA;AASO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,iBAAiB,EAAC;AAAA,EAClB,iBAAiB,EAAC;AAAA,EAClB,IAAA,GAAO,GAAA;AAAA,EACP;AACF,CAAA,KAAwB;AACtB,EAAA,MAAM,MAAA,GAAS,MAAA,KAAW,MAAA,GAAY,EAAC,GAAI,EAAE,CAAC,CAAA,EAAG,IAAI,CAAA,MAAA,CAAQ,GAAG,MAAA,EAAO;AACvE,EAAA,OAAO;AAAA,IACL,GAAG,cAAA,CAAe,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AACjC,MAAA,MAAM,CAAC,GAAA,EAAK,IAAI,IAAI,CAAC,IAAA,CAAK,IAAI,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,GAAG,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAC/E,MAAA,uBACE,GAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UAEE,GAAG,EAAE,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,GAAG,GAAA,EAAK,CAAC,CAAA,EAAG,IAAI,CAAA,CAAA,CAAG,GAAG,IAAA,EAAK;AAAA,UAC3C,GAAG,MAAA;AAAA,UACJ,IAAA,EAAM,aAAA,CAAc,IAAA,CAAK,MAAA,IAAU,SAAS,CAAA;AAAA,UAC5C,WAAA,EAAa,IAAA;AAAA,UACb,UAAA,EAAW,cAAA;AAAA,UACX,MAAA,EAAQ,UAAA;AAAA,UACR,OAAO,IAAA,CAAK,KAAA,GAAQ,QAAQ,IAAA,CAAK,KAAA,EAAO,eAAe,CAAA,GAAI;AAAA,SAAA;AAAA,QAPtD,QAAQ,CAAC,CAAA;AAAA,OAQhB;AAAA,IAEJ,CAAC,CAAA;AAAA,IACD,GAAG,cAAA,CAAe,GAAA,CAAI,CAAC,MAAM,CAAA,qBAC3B,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QAEE,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,KAAA,EAAM;AAAA,QACxB,GAAG,MAAA;AAAA,QACJ,MAAA,EAAQ,aAAA,CAAc,IAAA,CAAK,MAAA,IAAU,SAAS,CAAA;AAAA,QAC9C,WAAA,EAAa,GAAA;AAAA,QACb,eAAA,EAAiB,IAAA,CAAK,MAAA,GAAS,IAAA,GAAO,MAAA;AAAA,QACtC,UAAA,EAAW,cAAA;AAAA,QACX,OAAO,IAAA,CAAK,KAAA,GAAQ,QAAQ,IAAA,CAAK,KAAA,EAAO,gBAAgB,CAAA,GAAI;AAAA,OAAA;AAAA,MAPvD,QAAQ,CAAC,CAAA;AAAA,KASjB;AAAA,GACH;AACF","file":"chunk-ESVGCUJN.js","sourcesContent":["import { ReferenceArea, ReferenceLine } from 'recharts';\nimport type { ChartReferenceProps } from '../types';\nimport { TEXT_SIZE } from './axes';\nimport { INTENT_COLORS, MUTED } from './colors';\n\ntype ReferenceOptions = ChartReferenceProps & {\n /** The axis the values are read on: `y` (default), or `x` on a chart of horizontal bars. */\n axis?: 'x' | 'y';\n /** The id of that axis, when the chart has several. */\n axisId?: string;\n};\n\nconst DASH = '6 4';\n// Behind the series (an area is at 100, a bar at 300) and above the grid.\nconst BAND_LAYER = 50;\n\n// Plain SVG text in the muted color: an amber or red label would not read on\n// the card in every theme, so the line and the band carry the intent.\nconst labelOf = (value: string, position: 'insideTopRight' | 'insideTopLeft') => ({\n value,\n position,\n className: 'recharts-reference-label',\n fill: MUTED,\n style: { fontSize: TEXT_SIZE },\n});\n\n/**\n * The `ReferenceArea`s then the `ReferenceLine`s of a chart's `referenceBands`\n * and `referenceLines`, to render inside it, before `children`. A mark outside\n * the data makes the axis reach it (`ifOverflow=\"extendDomain\"`) instead of\n * vanishing. Colors come from `INTENT_COLORS`, so a theme switch repaints\n * them; labels are text, not markup.\n */\nexport const referenceMarks = ({\n referenceLines = [],\n referenceBands = [],\n axis = 'y',\n axisId,\n}: ReferenceOptions) => {\n const onAxis = axisId === undefined ? {} : { [`${axis}AxisId`]: axisId };\n return [\n ...referenceBands.map((band, i) => {\n const [low, high] = [Math.min(band.from, band.to), Math.max(band.from, band.to)];\n return (\n <ReferenceArea\n key={`band-${i}`}\n {...{ [`${axis}1`]: low, [`${axis}2`]: high }}\n {...onAxis}\n fill={INTENT_COLORS[band.intent ?? 'neutral']}\n fillOpacity={0.14}\n ifOverflow=\"extendDomain\"\n zIndex={BAND_LAYER}\n label={band.label ? labelOf(band.label, 'insideTopLeft') : undefined}\n />\n );\n }),\n ...referenceLines.map((line, i) => (\n <ReferenceLine\n key={`line-${i}`}\n {...{ [axis]: line.value }}\n {...onAxis}\n stroke={INTENT_COLORS[line.intent ?? 'neutral']}\n strokeWidth={1.5}\n strokeDasharray={line.dashed ? DASH : undefined}\n ifOverflow=\"extendDomain\"\n label={line.label ? labelOf(line.label, 'insideTopRight') : undefined}\n />\n )),\n ];\n};\n"]}
@@ -0,0 +1,40 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+
6
+ // src/core/categoryKeys.ts
7
+ var AS_RECHARTS = {
8
+ ArrowDown: "ArrowLeft",
9
+ ArrowRight: "ArrowLeft",
10
+ ArrowUp: "ArrowRight",
11
+ ArrowLeft: "ArrowRight"
12
+ };
13
+ var remapped = /* @__PURE__ */ new WeakSet();
14
+ var useCategoryKeys = (layout) => react.useCallback(
15
+ (svg) => {
16
+ if (!svg || layout !== "vertical") return;
17
+ const onKeyDown = (event) => {
18
+ const key = AS_RECHARTS[event.key];
19
+ if (!key || remapped.has(event) || event.ctrlKey || event.metaKey || event.altKey) return;
20
+ if (event.key === "ArrowUp" || event.key === "ArrowDown") event.preventDefault();
21
+ event.stopPropagation();
22
+ const copy = new KeyboardEvent("keydown", {
23
+ key,
24
+ bubbles: true,
25
+ cancelable: true,
26
+ repeat: event.repeat,
27
+ shiftKey: event.shiftKey
28
+ });
29
+ remapped.add(copy);
30
+ svg.dispatchEvent(copy);
31
+ };
32
+ svg.addEventListener("keydown", onKeyDown, true);
33
+ return () => svg.removeEventListener("keydown", onKeyDown, true);
34
+ },
35
+ [layout]
36
+ );
37
+
38
+ exports.useCategoryKeys = useCategoryKeys;
39
+ //# sourceMappingURL=chunk-F2PMFYJ5.cjs.map
40
+ //# sourceMappingURL=chunk-F2PMFYJ5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/categoryKeys.ts"],"names":["useCallback"],"mappings":";;;;;;AAWA,IAAM,WAAA,GAAsC;AAAA,EAC1C,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,WAAA;AAAA,EACZ,OAAA,EAAS,YAAA;AAAA,EACT,SAAA,EAAW;AACb,CAAA;AAGA,IAAM,QAAA,uBAAe,OAAA,EAAe;AAc7B,IAAM,eAAA,GAAkB,CAAC,MAAA,KAC9BA,iBAAA;AAAA,EACE,CAAC,GAAA,KAA8B;AAC7B,IAAA,IAAI,CAAC,GAAA,IAAO,MAAA,KAAW,UAAA,EAAY;AACnC,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AACjC,MAAA,IAAI,CAAC,GAAA,IAAO,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,IAAK,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,MAAA,EAAQ;AACnF,MAAA,IAAI,MAAM,GAAA,KAAQ,SAAA,IAAa,MAAM,GAAA,KAAQ,WAAA,QAAmB,cAAA,EAAe;AAC/E,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,MAAM,IAAA,GAAO,IAAI,aAAA,CAAc,SAAA,EAAW;AAAA,QACxC,GAAA;AAAA,QACA,OAAA,EAAS,IAAA;AAAA,QACT,UAAA,EAAY,IAAA;AAAA,QACZ,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,UAAU,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,QAAA,CAAS,IAAI,IAAI,CAAA;AACjB,MAAA,GAAA,CAAI,cAAc,IAAI,CAAA;AAAA,IACxB,CAAA;AACA,IAAA,GAAA,CAAI,gBAAA,CAAiB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAA;AAC/C,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,SAAA,EAAW,WAAW,IAAI,CAAA;AAAA,EACjE,CAAA;AAAA,EACA,CAAC,MAAM;AACT","file":"chunk-F2PMFYJ5.cjs","sourcesContent":["import { useCallback } from 'react';\n\n// Recharts 3.10.1: `keyboardEventsMiddleware` reads ArrowLeft and ArrowRight\n// only, and treats every chart direction but `left-to-right` as reversed.\n// `selectChartDirection` answers `top-to-bottom` for a vertical layout, so\n// there ArrowRight goes back, ArrowLeft goes forward and ArrowUp and ArrowDown\n// do nothing. Remove this once a Recharts release walks the categories\n// downward on ArrowDown.\n\n// The key to hand Recharts for each key pressed: in a vertical layout its\n// ArrowLeft is the next category and its ArrowRight the previous one.\nconst AS_RECHARTS: Record<string, string> = {\n ArrowDown: 'ArrowLeft',\n ArrowRight: 'ArrowLeft',\n ArrowUp: 'ArrowRight',\n ArrowLeft: 'ArrowRight',\n};\n\n// The events this hook made, which it must let through.\nconst remapped = new WeakSet<Event>();\n\n/**\n * The `ref` of a Recharts chart whose `layout` is `vertical`, the categories on\n * the vertical axis (a horizontal `BarChart`): ArrowDown and ArrowRight move\n * to the next category and ArrowUp and ArrowLeft to the previous one. In a\n * `horizontal` layout the ref does nothing.\n *\n * Recharts reads `event.key` from the keydown that reaches its wrapper, so the\n * arrow key is replaced there by the one Recharts reads the way we want: the\n * original is stopped on the chart and a copy with the other key is dispatched\n * in its place. ArrowUp and ArrowDown walk the chart now, so they no longer\n * scroll the page.\n */\nexport const useCategoryKeys = (layout: 'horizontal' | 'vertical') =>\n useCallback(\n (svg: SVGSVGElement | null) => {\n if (!svg || layout !== 'vertical') return;\n const onKeyDown = (event: KeyboardEvent) => {\n const key = AS_RECHARTS[event.key];\n if (!key || remapped.has(event) || event.ctrlKey || event.metaKey || event.altKey) return;\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') event.preventDefault();\n event.stopPropagation();\n const copy = new KeyboardEvent('keydown', {\n key,\n bubbles: true,\n cancelable: true,\n repeat: event.repeat,\n shiftKey: event.shiftKey,\n });\n remapped.add(copy);\n svg.dispatchEvent(copy);\n };\n svg.addEventListener('keydown', onKeyDown, true);\n return () => svg.removeEventListener('keydown', onKeyDown, true);\n },\n [layout]\n );\n"]}
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import { useCallback } from 'react';
3
+
4
+ // src/core/categoryKeys.ts
5
+ var AS_RECHARTS = {
6
+ ArrowDown: "ArrowLeft",
7
+ ArrowRight: "ArrowLeft",
8
+ ArrowUp: "ArrowRight",
9
+ ArrowLeft: "ArrowRight"
10
+ };
11
+ var remapped = /* @__PURE__ */ new WeakSet();
12
+ var useCategoryKeys = (layout) => useCallback(
13
+ (svg) => {
14
+ if (!svg || layout !== "vertical") return;
15
+ const onKeyDown = (event) => {
16
+ const key = AS_RECHARTS[event.key];
17
+ if (!key || remapped.has(event) || event.ctrlKey || event.metaKey || event.altKey) return;
18
+ if (event.key === "ArrowUp" || event.key === "ArrowDown") event.preventDefault();
19
+ event.stopPropagation();
20
+ const copy = new KeyboardEvent("keydown", {
21
+ key,
22
+ bubbles: true,
23
+ cancelable: true,
24
+ repeat: event.repeat,
25
+ shiftKey: event.shiftKey
26
+ });
27
+ remapped.add(copy);
28
+ svg.dispatchEvent(copy);
29
+ };
30
+ svg.addEventListener("keydown", onKeyDown, true);
31
+ return () => svg.removeEventListener("keydown", onKeyDown, true);
32
+ },
33
+ [layout]
34
+ );
35
+
36
+ export { useCategoryKeys };
37
+ //# sourceMappingURL=chunk-FUZW3H5X.js.map
38
+ //# sourceMappingURL=chunk-FUZW3H5X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/categoryKeys.ts"],"names":[],"mappings":";;;;AAWA,IAAM,WAAA,GAAsC;AAAA,EAC1C,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,WAAA;AAAA,EACZ,OAAA,EAAS,YAAA;AAAA,EACT,SAAA,EAAW;AACb,CAAA;AAGA,IAAM,QAAA,uBAAe,OAAA,EAAe;AAc7B,IAAM,eAAA,GAAkB,CAAC,MAAA,KAC9B,WAAA;AAAA,EACE,CAAC,GAAA,KAA8B;AAC7B,IAAA,IAAI,CAAC,GAAA,IAAO,MAAA,KAAW,UAAA,EAAY;AACnC,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AACjC,MAAA,IAAI,CAAC,GAAA,IAAO,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,IAAK,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,MAAA,EAAQ;AACnF,MAAA,IAAI,MAAM,GAAA,KAAQ,SAAA,IAAa,MAAM,GAAA,KAAQ,WAAA,QAAmB,cAAA,EAAe;AAC/E,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,MAAM,IAAA,GAAO,IAAI,aAAA,CAAc,SAAA,EAAW;AAAA,QACxC,GAAA;AAAA,QACA,OAAA,EAAS,IAAA;AAAA,QACT,UAAA,EAAY,IAAA;AAAA,QACZ,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,UAAU,KAAA,CAAM;AAAA,OACjB,CAAA;AACD,MAAA,QAAA,CAAS,IAAI,IAAI,CAAA;AACjB,MAAA,GAAA,CAAI,cAAc,IAAI,CAAA;AAAA,IACxB,CAAA;AACA,IAAA,GAAA,CAAI,gBAAA,CAAiB,SAAA,EAAW,SAAA,EAAW,IAAI,CAAA;AAC/C,IAAA,OAAO,MAAM,GAAA,CAAI,mBAAA,CAAoB,SAAA,EAAW,WAAW,IAAI,CAAA;AAAA,EACjE,CAAA;AAAA,EACA,CAAC,MAAM;AACT","file":"chunk-FUZW3H5X.js","sourcesContent":["import { useCallback } from 'react';\n\n// Recharts 3.10.1: `keyboardEventsMiddleware` reads ArrowLeft and ArrowRight\n// only, and treats every chart direction but `left-to-right` as reversed.\n// `selectChartDirection` answers `top-to-bottom` for a vertical layout, so\n// there ArrowRight goes back, ArrowLeft goes forward and ArrowUp and ArrowDown\n// do nothing. Remove this once a Recharts release walks the categories\n// downward on ArrowDown.\n\n// The key to hand Recharts for each key pressed: in a vertical layout its\n// ArrowLeft is the next category and its ArrowRight the previous one.\nconst AS_RECHARTS: Record<string, string> = {\n ArrowDown: 'ArrowLeft',\n ArrowRight: 'ArrowLeft',\n ArrowUp: 'ArrowRight',\n ArrowLeft: 'ArrowRight',\n};\n\n// The events this hook made, which it must let through.\nconst remapped = new WeakSet<Event>();\n\n/**\n * The `ref` of a Recharts chart whose `layout` is `vertical`, the categories on\n * the vertical axis (a horizontal `BarChart`): ArrowDown and ArrowRight move\n * to the next category and ArrowUp and ArrowLeft to the previous one. In a\n * `horizontal` layout the ref does nothing.\n *\n * Recharts reads `event.key` from the keydown that reaches its wrapper, so the\n * arrow key is replaced there by the one Recharts reads the way we want: the\n * original is stopped on the chart and a copy with the other key is dispatched\n * in its place. ArrowUp and ArrowDown walk the chart now, so they no longer\n * scroll the page.\n */\nexport const useCategoryKeys = (layout: 'horizontal' | 'vertical') =>\n useCallback(\n (svg: SVGSVGElement | null) => {\n if (!svg || layout !== 'vertical') return;\n const onKeyDown = (event: KeyboardEvent) => {\n const key = AS_RECHARTS[event.key];\n if (!key || remapped.has(event) || event.ctrlKey || event.metaKey || event.altKey) return;\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') event.preventDefault();\n event.stopPropagation();\n const copy = new KeyboardEvent('keydown', {\n key,\n bubbles: true,\n cancelable: true,\n repeat: event.repeat,\n shiftKey: event.shiftKey,\n });\n remapped.add(copy);\n svg.dispatchEvent(copy);\n };\n svg.addEventListener('keydown', onKeyDown, true);\n return () => svg.removeEventListener('keydown', onKeyDown, true);\n },\n [layout]\n );\n"]}
@@ -0,0 +1,51 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkSR2ESX3R_cjs = require('./chunk-SR2ESX3R.cjs');
5
+ var chunkLT3UC65O_cjs = require('./chunk-LT3UC65O.cjs');
6
+
7
+ // src/core/axes.ts
8
+ var TEXT_SIZE = "var(--text-xs, 0.75rem)";
9
+ var AXIS = {
10
+ axisLine: false,
11
+ tickLine: false,
12
+ tickMargin: 8,
13
+ tick: { fill: chunkLT3UC65O_cjs.MUTED, style: { fontSize: TEXT_SIZE } }
14
+ };
15
+ var AXIS_AFTER_FONTS = { ...AXIS, tick: { ...AXIS.tick } };
16
+ var useAxis = () => chunkSR2ESX3R_cjs.useFontsLoaded() ? AXIS_AFTER_FONTS : AXIS;
17
+ var GRID_PROPS = {
18
+ vertical: false,
19
+ stroke: chunkLT3UC65O_cjs.GRID,
20
+ strokeDasharray: "4 4"
21
+ };
22
+ var titleStyle = { fill: chunkLT3UC65O_cjs.MUTED, fontSize: TEXT_SIZE };
23
+ var xAxisTitle = (title) => title ? {
24
+ height: 52,
25
+ label: {
26
+ value: title,
27
+ position: "insideBottom",
28
+ offset: 0,
29
+ fill: chunkLT3UC65O_cjs.MUTED,
30
+ style: titleStyle
31
+ }
32
+ } : {};
33
+ var yAxisTitle = (title) => title ? {
34
+ label: {
35
+ value: title,
36
+ angle: -90,
37
+ position: "insideLeft",
38
+ offset: 4,
39
+ fill: chunkLT3UC65O_cjs.MUTED,
40
+ style: { ...titleStyle, textAnchor: "middle" }
41
+ }
42
+ } : {};
43
+
44
+ exports.AXIS = AXIS;
45
+ exports.GRID_PROPS = GRID_PROPS;
46
+ exports.TEXT_SIZE = TEXT_SIZE;
47
+ exports.useAxis = useAxis;
48
+ exports.xAxisTitle = xAxisTitle;
49
+ exports.yAxisTitle = yAxisTitle;
50
+ //# sourceMappingURL=chunk-G4WOPX4D.cjs.map
51
+ //# sourceMappingURL=chunk-G4WOPX4D.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/axes.ts"],"names":["MUTED","useFontsLoaded","GRID"],"mappings":";;;;;;;AAMO,IAAM,SAAA,GAAY;AAGlB,IAAM,IAAA,GAAO;AAAA,EAClB,QAAA,EAAU,KAAA;AAAA,EACV,QAAA,EAAU,KAAA;AAAA,EACV,UAAA,EAAY,CAAA;AAAA,EACZ,IAAA,EAAM,EAAE,IAAA,EAAMA,uBAAA,EAAO,OAAO,EAAE,QAAA,EAAU,WAAU;AACpD;AAMA,IAAM,gBAAA,GAAmB,EAAE,GAAG,IAAA,EAAM,MAAM,EAAE,GAAG,IAAA,CAAK,IAAA,EAAK,EAAE;AAQpD,IAAM,OAAA,GAAU,MAAOC,gCAAA,EAAe,GAAI,gBAAA,GAAmB;AAG7D,IAAM,UAAA,GAAa;AAAA,EACxB,QAAA,EAAU,KAAA;AAAA,EACV,MAAA,EAAQC,sBAAA;AAAA,EACR,eAAA,EAAiB;AACnB;AAGA,IAAM,UAAA,GAAa,EAAE,IAAA,EAAMF,uBAAA,EAAO,UAAU,SAAA,EAAU;AAG/C,IAAM,UAAA,GAAa,CAAC,KAAA,KACzB,KAAA,GACK;AAAA,EACC,MAAA,EAAQ,EAAA;AAAA,EACR,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,QAAA,EAAU,cAAA;AAAA,IACV,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAMA,uBAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAA,GACA;AAGC,IAAM,UAAA,GAAa,CAAC,KAAA,KACzB,KAAA,GACK;AAAA,EACC,KAAA,EAAO;AAAA,IACL,KAAA,EAAO,KAAA;AAAA,IACP,KAAA,EAAO,GAAA;AAAA,IACP,QAAA,EAAU,YAAA;AAAA,IACV,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAMA,uBAAA;AAAA,IACN,KAAA,EAAO,EAAE,GAAG,UAAA,EAAY,YAAY,QAAA;AAAS;AAEjD,CAAA,GACA","file":"chunk-G4WOPX4D.cjs","sourcesContent":["import { GRID, MUTED } from './colors';\nimport { useFontsLoaded } from './frame';\n\n// Axis text is 12px at the normal text size and follows the text size setting:\n// `--text-xs` is rescaled on <html> by `data-text-size`. The fallback is the\n// normal size, for an app that doesn't load the theme.\nexport const TEXT_SIZE = 'var(--text-xs, 0.75rem)';\n\n/** The look of every axis: no line, no tick mark, muted text. */\nexport const AXIS = {\n axisLine: false,\n tickLine: false,\n tickMargin: 8,\n tick: { fill: MUTED, style: { fontSize: TEXT_SIZE } },\n} as const;\n\n// `AXIS` again, with a `tick` object of its own. Recharts measures a\n// `width=\"auto\"` axis when its settings change, and reads the same `tick`\n// object as no change: handing it a new one after a web font has loaded makes\n// the axis measure its labels again, in the font that is drawn.\nconst AXIS_AFTER_FONTS = { ...AXIS, tick: { ...AXIS.tick } } as const;\n\n/**\n * `AXIS` for the axes of a chart. Once a web font has finished loading after\n * the chart mounted it is another object, once: the labels were measured in\n * the fallback font, and an axis with `width=\"auto\"` makes room for them in\n * the font that is drawn (recharts 3.10.1 measures on a settings change).\n */\nexport const useAxis = () => (useFontsLoaded() ? AXIS_AFTER_FONTS : AXIS);\n\n/** The grid: horizontal dashed lines only. */\nexport const GRID_PROPS = {\n vertical: false,\n stroke: GRID,\n strokeDasharray: '4 4',\n} as const;\n\n// `fill` as an attribute too: the label's own default is gray.\nconst titleStyle = { fill: MUTED, fontSize: TEXT_SIZE } as const;\n\n/** Props for an `XAxis` with an optional title under it. The title is SVG text: markup shows as written. */\nexport const xAxisTitle = (title?: string) =>\n title\n ? ({\n height: 52,\n label: {\n value: title,\n position: 'insideBottom',\n offset: 0,\n fill: MUTED,\n style: titleStyle,\n },\n } as const)\n : {};\n\n/** Props for a `YAxis` with an optional title beside it. */\nexport const yAxisTitle = (title?: string) =>\n title\n ? ({\n label: {\n value: title,\n angle: -90,\n position: 'insideLeft',\n offset: 4,\n fill: MUTED,\n style: { ...titleStyle, textAnchor: 'middle' },\n },\n } as const)\n : {};\n"]}
@@ -0,0 +1,27 @@
1
+ "use client";
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ // src/core/roundedBar.tsx
5
+ var roundedRect = (x, y, w, h, [tl, tr, br, bl]) => `M${x + tl},${y}H${x + w - tr}a${tr},${tr} 0 0 1 ${tr},${tr}V${y + h - br}a${br},${br} 0 0 1 ${-br},${br}H${x + bl}a${bl},${bl} 0 0 1 ${-bl},${-bl}V${y + tl}a${tl},${tl} 0 0 1 ${tl},${-tl}Z`;
6
+ var roundedBarShape = ({ layout, radius, dataKey, isOuter, fillFor }) => (props) => {
7
+ const { x, y, width, height } = props;
8
+ const row = props.payload ?? {};
9
+ const fill = fillFor?.(Number(row[dataKey]), props.index) ?? props.fill;
10
+ const left = Math.min(x, x + width);
11
+ const top = Math.min(y, y + height);
12
+ const w = Math.abs(width);
13
+ const h = Math.abs(height);
14
+ if (!(w > 0) || !(h > 0)) return null;
15
+ const negative = Number(row[dataKey]) < 0;
16
+ const r = !isOuter || isOuter(row) ? Math.min(radius, w / 2, h / 2) : 0;
17
+ const corners = layout === "horizontal" ? negative ? [0, 0, r, r] : [r, r, 0, 0] : negative ? [r, 0, 0, r] : [0, r, r, 0];
18
+ return /* @__PURE__ */ jsx("path", { d: roundedRect(left, top, w, h, corners), fill });
19
+ };
20
+ var isOuterInStack = (keys, key) => (row) => {
21
+ const value = Number(row[key]);
22
+ return !keys.slice(keys.indexOf(key) + 1).some((other) => Number(row[other]) !== 0 && Number(row[other]) * value > 0);
23
+ };
24
+
25
+ export { isOuterInStack, roundedBarShape };
26
+ //# sourceMappingURL=chunk-GDZLYYL2.js.map
27
+ //# sourceMappingURL=chunk-GDZLYYL2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/roundedBar.tsx"],"names":[],"mappings":"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","file":"chunk-GDZLYYL2.js","sourcesContent":["import type { BarShapeProps } from 'recharts';\n\n/** The side of the plot a bar grows from: `horizontal` is a column chart, `vertical` a chart of horizontal bars (Recharts' own words for `layout`). */\nexport type BarLayout = 'horizontal' | 'vertical';\n\n// A rectangle with its own radius at each corner: top-left, top-right,\n// bottom-right, bottom-left.\nconst roundedRect = (\n x: number,\n y: number,\n w: number,\n h: number,\n [tl, tr, br, bl]: [number, number, number, number]\n) =>\n `M${x + tl},${y}H${x + w - tr}a${tr},${tr} 0 0 1 ${tr},${tr}V${y + h - br}` +\n `a${br},${br} 0 0 1 ${-br},${br}H${x + bl}a${bl},${bl} 0 0 1 ${-bl},${-bl}` +\n `V${y + tl}a${tl},${tl} 0 0 1 ${tl},${-tl}Z`;\n\ntype RoundedBarOptions = {\n layout: BarLayout;\n /** The corner radius of the outer end, in px. */\n radius: number;\n /** The key of the series in the data rows, to read the sign of the value. */\n dataKey: string;\n /**\n * Whether this bar is the outer end of its stack in `row`. A bar outside a\n * stack, or the last of it on its side of the axis, is. Default: always.\n */\n isOuter?: (row: Record<string, unknown>) => boolean;\n /**\n * The fill of a bar from its value and the index of its category, or\n * `undefined` for the series' own color.\n */\n fillFor?: (value: number, index: number) => string | undefined;\n};\n\n/**\n * The `shape` of a `Bar` that rounds the end away from the axis only: the top\n * of a column, the right of a horizontal bar, and the other end when the value\n * is negative. In a stack only the outermost segment on each side is rounded,\n * so the stack reads as one bar. The radius shrinks to fit a short bar. With\n * `fillFor`, a bar can take a color of its own.\n */\nexport const roundedBarShape =\n ({ layout, radius, dataKey, isOuter, fillFor }: RoundedBarOptions) =>\n (props: BarShapeProps) => {\n const { x, y, width, height } = props;\n const row = (props.payload ?? {}) as Record<string, unknown>;\n const fill = fillFor?.(Number(row[dataKey]), props.index) ?? props.fill;\n // The rectangle has a negative size when the value is below zero.\n const left = Math.min(x, x + width);\n const top = Math.min(y, y + height);\n const w = Math.abs(width);\n const h = Math.abs(height);\n if (!(w > 0) || !(h > 0)) return null;\n const negative = Number(row[dataKey]) < 0;\n const r = !isOuter || isOuter(row) ? Math.min(radius, w / 2, h / 2) : 0;\n const corners: [number, number, number, number] =\n layout === 'horizontal'\n ? negative\n ? [0, 0, r, r]\n : [r, r, 0, 0]\n : negative\n ? [r, 0, 0, r]\n : [0, r, r, 0];\n return <path d={roundedRect(left, top, w, h, corners)} fill={fill} />;\n };\n\n/**\n * For a stack, whether the series `key` is the last one drawn on its side of\n * the axis in a row, among the `keys` of the series that are shown.\n */\nexport const isOuterInStack =\n (keys: readonly string[], key: string) => (row: Record<string, unknown>) => {\n const value = Number(row[key]);\n return !keys\n .slice(keys.indexOf(key) + 1)\n .some((other) => Number(row[other]) !== 0 && Number(row[other]) * value > 0);\n };\n"]}
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+
6
+ // src/core/roundedBar.tsx
7
+ var roundedRect = (x, y, w, h, [tl, tr, br, bl]) => `M${x + tl},${y}H${x + w - tr}a${tr},${tr} 0 0 1 ${tr},${tr}V${y + h - br}a${br},${br} 0 0 1 ${-br},${br}H${x + bl}a${bl},${bl} 0 0 1 ${-bl},${-bl}V${y + tl}a${tl},${tl} 0 0 1 ${tl},${-tl}Z`;
8
+ var roundedBarShape = ({ layout, radius, dataKey, isOuter, fillFor }) => (props) => {
9
+ const { x, y, width, height } = props;
10
+ const row = props.payload ?? {};
11
+ const fill = fillFor?.(Number(row[dataKey]), props.index) ?? props.fill;
12
+ const left = Math.min(x, x + width);
13
+ const top = Math.min(y, y + height);
14
+ const w = Math.abs(width);
15
+ const h = Math.abs(height);
16
+ if (!(w > 0) || !(h > 0)) return null;
17
+ const negative = Number(row[dataKey]) < 0;
18
+ const r = !isOuter || isOuter(row) ? Math.min(radius, w / 2, h / 2) : 0;
19
+ const corners = layout === "horizontal" ? negative ? [0, 0, r, r] : [r, r, 0, 0] : negative ? [r, 0, 0, r] : [0, r, r, 0];
20
+ return /* @__PURE__ */ jsxRuntime.jsx("path", { d: roundedRect(left, top, w, h, corners), fill });
21
+ };
22
+ var isOuterInStack = (keys, key) => (row) => {
23
+ const value = Number(row[key]);
24
+ return !keys.slice(keys.indexOf(key) + 1).some((other) => Number(row[other]) !== 0 && Number(row[other]) * value > 0);
25
+ };
26
+
27
+ exports.isOuterInStack = isOuterInStack;
28
+ exports.roundedBarShape = roundedBarShape;
29
+ //# sourceMappingURL=chunk-GVTMZYOM.cjs.map
30
+ //# sourceMappingURL=chunk-GVTMZYOM.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/roundedBar.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-GVTMZYOM.cjs","sourcesContent":["import type { BarShapeProps } from 'recharts';\n\n/** The side of the plot a bar grows from: `horizontal` is a column chart, `vertical` a chart of horizontal bars (Recharts' own words for `layout`). */\nexport type BarLayout = 'horizontal' | 'vertical';\n\n// A rectangle with its own radius at each corner: top-left, top-right,\n// bottom-right, bottom-left.\nconst roundedRect = (\n x: number,\n y: number,\n w: number,\n h: number,\n [tl, tr, br, bl]: [number, number, number, number]\n) =>\n `M${x + tl},${y}H${x + w - tr}a${tr},${tr} 0 0 1 ${tr},${tr}V${y + h - br}` +\n `a${br},${br} 0 0 1 ${-br},${br}H${x + bl}a${bl},${bl} 0 0 1 ${-bl},${-bl}` +\n `V${y + tl}a${tl},${tl} 0 0 1 ${tl},${-tl}Z`;\n\ntype RoundedBarOptions = {\n layout: BarLayout;\n /** The corner radius of the outer end, in px. */\n radius: number;\n /** The key of the series in the data rows, to read the sign of the value. */\n dataKey: string;\n /**\n * Whether this bar is the outer end of its stack in `row`. A bar outside a\n * stack, or the last of it on its side of the axis, is. Default: always.\n */\n isOuter?: (row: Record<string, unknown>) => boolean;\n /**\n * The fill of a bar from its value and the index of its category, or\n * `undefined` for the series' own color.\n */\n fillFor?: (value: number, index: number) => string | undefined;\n};\n\n/**\n * The `shape` of a `Bar` that rounds the end away from the axis only: the top\n * of a column, the right of a horizontal bar, and the other end when the value\n * is negative. In a stack only the outermost segment on each side is rounded,\n * so the stack reads as one bar. The radius shrinks to fit a short bar. With\n * `fillFor`, a bar can take a color of its own.\n */\nexport const roundedBarShape =\n ({ layout, radius, dataKey, isOuter, fillFor }: RoundedBarOptions) =>\n (props: BarShapeProps) => {\n const { x, y, width, height } = props;\n const row = (props.payload ?? {}) as Record<string, unknown>;\n const fill = fillFor?.(Number(row[dataKey]), props.index) ?? props.fill;\n // The rectangle has a negative size when the value is below zero.\n const left = Math.min(x, x + width);\n const top = Math.min(y, y + height);\n const w = Math.abs(width);\n const h = Math.abs(height);\n if (!(w > 0) || !(h > 0)) return null;\n const negative = Number(row[dataKey]) < 0;\n const r = !isOuter || isOuter(row) ? Math.min(radius, w / 2, h / 2) : 0;\n const corners: [number, number, number, number] =\n layout === 'horizontal'\n ? negative\n ? [0, 0, r, r]\n : [r, r, 0, 0]\n : negative\n ? [r, 0, 0, r]\n : [0, r, r, 0];\n return <path d={roundedRect(left, top, w, h, corners)} fill={fill} />;\n };\n\n/**\n * For a stack, whether the series `key` is the last one drawn on its side of\n * the axis in a row, among the `keys` of the series that are shown.\n */\nexport const isOuterInStack =\n (keys: readonly string[], key: string) => (row: Record<string, unknown>) => {\n const value = Number(row[key]);\n return !keys\n .slice(keys.indexOf(key) + 1)\n .some((other) => Number(row[other]) !== 0 && Number(row[other]) * value > 0);\n };\n"]}
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+
6
+ // src/core/useElementWidth.ts
7
+ var useElementWidth = () => {
8
+ const [element, ref] = react.useState(null);
9
+ const [width, setWidth] = react.useState();
10
+ react.useEffect(() => {
11
+ if (!element) return;
12
+ const observer = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));
13
+ observer.observe(element);
14
+ return () => observer.disconnect();
15
+ }, [element]);
16
+ return { ref, width };
17
+ };
18
+
19
+ exports.useElementWidth = useElementWidth;
20
+ //# sourceMappingURL=chunk-IW6EWB26.cjs.map
21
+ //# sourceMappingURL=chunk-IW6EWB26.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/useElementWidth.ts"],"names":["useState","useEffect"],"mappings":";;;;;;AAMO,IAAM,kBAAkB,MAAM;AACnC,EAAA,MAAM,CAAC,OAAA,EAAS,GAAG,CAAA,GAAIA,eAA6B,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,cAAA,EAAiB;AAC3C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,CAAC,CAAC,KAAK,CAAA,KAAM,QAAA,CAAS,KAAA,CAAM,WAAA,CAAY,KAAK,CAAC,CAAA;AAClF,IAAA,QAAA,CAAS,QAAQ,OAAO,CAAA;AACxB,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACZ,EAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AACtB","file":"chunk-IW6EWB26.cjs","sourcesContent":["import { useEffect, useState } from 'react';\n\n/**\n * The width of an element, kept up to date while it resizes. Attach `ref` to\n * the element; `width` is `undefined` until it is measured (and in SSR).\n */\nexport const useElementWidth = () => {\n const [element, ref] = useState<HTMLElement | null>(null);\n const [width, setWidth] = useState<number>();\n useEffect(() => {\n if (!element) return;\n const observer = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));\n observer.observe(element);\n return () => observer.disconnect();\n }, [element]);\n return { ref, width };\n};\n"]}
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ // src/core/data.ts
5
+ var seriesKey = (index) => `s${index}`;
6
+ var toRows = (categories, series) => categories.map((category, i) => ({
7
+ category,
8
+ ...Object.fromEntries(series.map((s, k) => [seriesKey(k), s.data[i]]))
9
+ }));
10
+ var hasNoData = (series) => series.every((s) => s.data.length === 0);
11
+ var safeId = (id) => id.replace(/[^a-zA-Z0-9_-]/g, "");
12
+
13
+ exports.hasNoData = hasNoData;
14
+ exports.safeId = safeId;
15
+ exports.seriesKey = seriesKey;
16
+ exports.toRows = toRows;
17
+ //# sourceMappingURL=chunk-K3R7JGOW.cjs.map
18
+ //# sourceMappingURL=chunk-K3R7JGOW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/data.ts"],"names":[],"mappings":";;;;AAGO,IAAM,SAAA,GAAY,CAAC,KAAA,KAAkB,CAAA,CAAA,EAAI,KAAK,CAAA;AAG9C,IAAM,MAAA,GAAS,CAAC,UAAA,EAA0C,MAAA,KAC/D,WAAW,GAAA,CAAI,CAAC,UAAU,CAAA,MAAO;AAAA,EAC/B,QAAA;AAAA,EACA,GAAG,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,SAAA,CAAU,CAAC,CAAA,EAAG,CAAA,CAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AACvE,CAAA,CAAE;AAGG,IAAM,SAAA,GAAY,CAAC,MAAA,KACxB,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,MAAA,KAAW,CAAC;AAGlC,IAAM,SAAS,CAAC,EAAA,KAAe,EAAA,CAAG,OAAA,CAAQ,mBAAmB,EAAE","file":"chunk-K3R7JGOW.cjs","sourcesContent":["export type SeriesInput = { name: string; data: number[] };\n\n/** The data key of series `index`. Series are keyed by position: a name may hold dots, which Recharts reads as a path. */\nexport const seriesKey = (index: number) => `s${index}`;\n\n/** One row per category, with a value under each series key. */\nexport const toRows = (categories: readonly (string | number)[], series: readonly SeriesInput[]) =>\n categories.map((category, i) => ({\n category,\n ...Object.fromEntries(series.map((s, k) => [seriesKey(k), s.data[i]])),\n }));\n\n/** Whether there is nothing to draw: no series, or only series without a point. */\nexport const hasNoData = (series: readonly { data: readonly unknown[] }[]): boolean =>\n series.every((s) => s.data.length === 0);\n\n/** An id safe in `url(#…)`, from React's `useId` (`:r1:`). */\nexport const safeId = (id: string) => id.replace(/[^a-zA-Z0-9_-]/g, '');\n"]}
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ // src/core/colors.ts
5
+ var token = (name, fallback) => `var(${name}, ${fallback})`;
6
+ var SERIES_FALLBACKS = [
7
+ "#465fff",
8
+ "#06b6d4",
9
+ "#8b5cf6",
10
+ "#ec4899",
11
+ "#64748b",
12
+ "#f97316",
13
+ "#14b8a6",
14
+ "#84cc16"
15
+ ];
16
+ var SERIES_TOKENS = [
17
+ "--color-brand-500",
18
+ ...SERIES_FALLBACKS.slice(1).map((_, i) => `--color-chart-${i + 2}`)
19
+ ];
20
+ var SERIES = SERIES_TOKENS.map((name, i) => token(name, SERIES_FALLBACKS[i]));
21
+ var seriesColor = (index, colors) => colors?.length ? colors[index % colors.length] : SERIES[index % SERIES.length];
22
+ var SUCCESS = token("--color-success-500", "#12b76a");
23
+ var ERROR = token("--color-error-500", "#f04438");
24
+ var STATUS_WARN = token("--color-status-warn", "#f59e0b");
25
+ var STATUS_CRIT = token("--color-status-crit", "#ef4444");
26
+ var PANEL = token("--color-bg-panel", "#fff");
27
+ var TEXT = token("--color-text-primary", "#101828");
28
+ var MUTED = token("--color-text-muted", "#677185");
29
+ var BORDER = token("--color-border", "#d0d5dd");
30
+ var GRID = `color-mix(in srgb, ${BORDER} 55%, transparent)`;
31
+ var TRACK = `color-mix(in srgb, ${BORDER} 70%, transparent)`;
32
+ var INTENT_COLORS = {
33
+ neutral: MUTED,
34
+ warning: STATUS_WARN,
35
+ danger: STATUS_CRIT,
36
+ success: SUCCESS
37
+ };
38
+ var SEQUENTIAL = [42, 56, 70, 84, 100].map(
39
+ (share) => `color-mix(in oklab, ${SERIES[0]} ${share}%, ${PANEL})`
40
+ );
41
+ var calendarStep = (index, share) => `color-mix(in oklab, ${SERIES[0]} calc(var(--calendar-share-${index}, ${share}) * 1%), ${PANEL})`;
42
+ var CALENDAR_STEPS = [
43
+ TRACK,
44
+ calendarStep(1, 48),
45
+ calendarStep(2, 65),
46
+ calendarStep(3, 82),
47
+ `var(--calendar-top, ${SERIES[0]})`
48
+ ];
49
+ var CALENDAR_DARK_CLASS = "dark:[--calendar-share-1:50] dark:[--calendar-share-2:70] dark:[--calendar-share-3:100] dark:[--calendar-top:var(--color-brand-400)]";
50
+
51
+ exports.BORDER = BORDER;
52
+ exports.CALENDAR_DARK_CLASS = CALENDAR_DARK_CLASS;
53
+ exports.CALENDAR_STEPS = CALENDAR_STEPS;
54
+ exports.ERROR = ERROR;
55
+ exports.GRID = GRID;
56
+ exports.INTENT_COLORS = INTENT_COLORS;
57
+ exports.MUTED = MUTED;
58
+ exports.PANEL = PANEL;
59
+ exports.SEQUENTIAL = SEQUENTIAL;
60
+ exports.SERIES = SERIES;
61
+ exports.STATUS_CRIT = STATUS_CRIT;
62
+ exports.STATUS_WARN = STATUS_WARN;
63
+ exports.SUCCESS = SUCCESS;
64
+ exports.TEXT = TEXT;
65
+ exports.TRACK = TRACK;
66
+ exports.seriesColor = seriesColor;
67
+ //# sourceMappingURL=chunk-LT3UC65O.cjs.map
68
+ //# sourceMappingURL=chunk-LT3UC65O.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/colors.ts"],"names":[],"mappings":";;;;AASA,IAAM,QAAQ,CAAC,IAAA,EAAc,aAAqB,CAAA,IAAA,EAAO,IAAI,KAAK,QAAQ,CAAA,CAAA,CAAA;AAGnE,IAAM,gBAAA,GAAmB;AAAA,EAC9B,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,aAAA,GAAgB;AAAA,EACpB,mBAAA;AAAA,EACA,GAAG,gBAAA,CAAiB,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,cAAA,EAAiB,CAAA,GAAI,CAAC,CAAA,CAAE;AACrE,CAAA;AAOO,IAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM,KAAA,CAAM,IAAA,EAAM,gBAAA,CAAiB,CAAC,CAAC,CAAC;AAG9E,IAAM,WAAA,GAAc,CAAC,KAAA,EAAe,MAAA,KACzC,QAAQ,MAAA,GAAS,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,GAAQ,OAAO,MAAM;AAGxE,IAAM,OAAA,GAAU,KAAA,CAAM,qBAAA,EAAuB,SAAS;AAEtD,IAAM,KAAA,GAAQ,KAAA,CAAM,mBAAA,EAAqB,SAAS;AAElD,IAAM,WAAA,GAAc,KAAA,CAAM,qBAAA,EAAuB,SAAS;AAC1D,IAAM,WAAA,GAAc,KAAA,CAAM,qBAAA,EAAuB,SAAS;AAG1D,IAAM,KAAA,GAAQ,KAAA,CAAM,kBAAA,EAAoB,MAAM;AAC9C,IAAM,IAAA,GAAO,KAAA,CAAM,sBAAA,EAAwB,SAAS;AACpD,IAAM,KAAA,GAAQ,KAAA,CAAM,oBAAA,EAAsB,SAAS;AACnD,IAAM,MAAA,GAAS,KAAA,CAAM,gBAAA,EAAkB,SAAS;AAGhD,IAAM,IAAA,GAAO,sBAAsB,MAAM,CAAA,kBAAA;AACzC,IAAM,KAAA,GAAQ,sBAAsB,MAAM,CAAA,kBAAA;AAG1C,IAAM,aAAA,GAA6C;AAAA,EACxD,OAAA,EAAS,KAAA;AAAA,EACT,OAAA,EAAS,WAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,OAAA,EAAS;AACX;AASO,IAAM,aAAa,CAAC,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,CAAE,GAAA;AAAA,EAC9C,CAAC,UAAU,CAAA,oBAAA,EAAuB,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA;AACjE;AAKA,IAAM,YAAA,GAAe,CAAC,KAAA,EAAe,KAAA,KACnC,CAAA,oBAAA,EAAuB,MAAA,CAAO,CAAC,CAAC,CAAA,2BAAA,EAA8B,KAAK,CAAA,EAAA,EAAK,KAAK,YAAY,KAAK,CAAA,CAAA,CAAA;AAUzF,IAAM,cAAA,GAAiB;AAAA,EAC5B,KAAA;AAAA,EACA,YAAA,CAAa,GAAG,EAAE,CAAA;AAAA,EAClB,YAAA,CAAa,GAAG,EAAE,CAAA;AAAA,EAClB,YAAA,CAAa,GAAG,EAAE,CAAA;AAAA,EAClB,CAAA,oBAAA,EAAuB,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAClC;AAGO,IAAM,mBAAA,GACX","file":"chunk-LT3UC65O.cjs","sourcesContent":["import type { ChartIntent } from '../types';\n\n// The colors every Recharts-based chart draws with. Each one is a CSS variable\n// string handed straight to the SVG (`fill`, `stroke`, `stopColor`, `cursor`):\n// a theme, accent or text size switch on <html> repaints the chart with no\n// observer and no `getComputedStyle`. The hex after the comma is the fallback\n// when the theme CSS isn't loaded or during SSR; with the theme it is never\n// used, since `@sckyzo/cosmos-theme` always emits these variables.\n\nconst token = (name: string, fallback: string) => `var(${name}, ${fallback})`;\n\n/** The hex of each series color in the default theme, series 1 first: the blue accent, then the hues of `--color-chart-2` to `--color-chart-8`. */\nexport const SERIES_FALLBACKS = [\n '#465fff',\n '#06b6d4',\n '#8b5cf6',\n '#ec4899',\n '#64748b',\n '#f97316',\n '#14b8a6',\n '#84cc16',\n];\n\nconst SERIES_TOKENS = [\n '--color-brand-500',\n ...SERIES_FALLBACKS.slice(1).map((_, i) => `--color-chart-${i + 2}`),\n];\n\n/**\n * The categorical palette: the accent, then seven hues. Which hues is decided\n * in the theme CSS: each accent skips the ones that look like it. None of the\n * first four reads as a status (green, amber, red).\n */\nexport const SERIES = SERIES_TOKENS.map((name, i) => token(name, SERIES_FALLBACKS[i]));\n\n/** The color of series `index`: `colors[index]` when given (cycling), the palette otherwise. */\nexport const seriesColor = (index: number, colors?: readonly string[]): string =>\n colors?.length ? colors[index % colors.length] : SERIES[index % SERIES.length];\n\n// A chart whose series are statuses passes these as `colors`.\nexport const SUCCESS = token('--color-success-500', '#12b76a');\nexport const WARNING = token('--color-warning-500', '#f79009');\nexport const ERROR = token('--color-error-500', '#f04438');\n/** The monitoring statuses, for thresholds. */\nexport const STATUS_WARN = token('--color-status-warn', '#f59e0b');\nexport const STATUS_CRIT = token('--color-status-crit', '#ef4444');\n\n/** The card the chart sits on. */\nexport const PANEL = token('--color-bg-panel', '#fff');\nexport const TEXT = token('--color-text-primary', '#101828');\nexport const MUTED = token('--color-text-muted', '#677185');\nexport const BORDER = token('--color-border', '#d0d5dd');\n// One semantic border variable reads right on every theme; the grid and the\n// empty part of a gauge are lighter steps of it.\nexport const GRID = `color-mix(in srgb, ${BORDER} 55%, transparent)`;\nexport const TRACK = `color-mix(in srgb, ${BORDER} 70%, transparent)`;\n\n/** The color of a reference line or band by its meaning: muted text for `neutral`, the status colors otherwise. */\nexport const INTENT_COLORS: Record<ChartIntent, string> = {\n neutral: MUTED,\n warning: STATUS_WARN,\n danger: STATUS_CRIT,\n success: SUCCESS,\n};\n\n/**\n * Five sequential steps of the accent over the card, low to high, on any\n * theme. Mixed in OKLab, which spaces the steps evenly to the eye: against the\n * card, the lowest step stays at 1.5:1 or more in the dark themes whatever the\n * accent (where a 24% share sat at 1.2:1), and two neighbors differ by 1.19:1\n * or more.\n */\nexport const SEQUENTIAL = [42, 56, 70, 84, 100].map(\n (share) => `color-mix(in oklab, ${SERIES[0]} ${share}%, ${PANEL})`\n);\n\n// A calendar step: a share of the accent over the card. The shares and the top\n// step are variables so that the dark themes can set their own on the chart's\n// root (`CalendarChart`); the fallbacks are the light themes' values.\nconst calendarStep = (index: number, share: number) =>\n `color-mix(in oklab, ${SERIES[0]} calc(var(--calendar-share-${index}, ${share}) * 1%), ${PANEL})`;\n\n/**\n * Five steps for a calendar of days: the neutral track for a day with no\n * value, then four of the accent. A day without activity is a cell of its own,\n * not a hole, and the four steps stay apart on any theme and accent. In the\n * light themes they are 48, 65, 82 and 100% of the accent over the card; the\n * dark themes set lower shares and a light accent for the top step through\n * `--calendar-share-1` to `-3` and `--calendar-top`.\n */\nexport const CALENDAR_STEPS = [\n TRACK,\n calendarStep(1, 48),\n calendarStep(2, 65),\n calendarStep(3, 82),\n `var(--calendar-top, ${SERIES[0]})`,\n];\n\n/** Sets the dark themes' calendar scale on the chart's root: Tailwind's `dark:` covers both of them. */\nexport const CALENDAR_DARK_CLASS =\n 'dark:[--calendar-share-1:50] dark:[--calendar-share-2:70] dark:[--calendar-share-3:100] dark:[--calendar-top:var(--color-brand-400)]';\n"]}
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { STATUS_CRIT, STATUS_WARN, SUCCESS } from './chunk-UATB2IRY.js';
3
+
4
+ // src/core/gauge.ts
5
+ var percent = (value) => `${value}%`;
6
+ var clampTo = (value, min, max) => Math.min(max, Math.max(min, value));
7
+ var gaugeName = (name, formatted) => `${name}: ${formatted}`;
8
+ var statusColor = (value, warnAt, critAt) => value >= (critAt ?? Infinity) ? STATUS_CRIT : value >= (warnAt ?? Infinity) ? STATUS_WARN : SUCCESS;
9
+ var rangeShare = (value, min, max) => (clampTo(value, min, max) - min) / (max - min);
10
+ var arcMark = ({ cx, cy }, { inner, outer }, share) => {
11
+ const angle = Math.PI * (1 - share);
12
+ const [cos, sin] = [Math.cos(angle), Math.sin(angle)];
13
+ return {
14
+ x1: cx + inner * cos,
15
+ y1: cy - inner * sin,
16
+ x2: cx + outer * cos,
17
+ y2: cy - outer * sin
18
+ };
19
+ };
20
+
21
+ export { arcMark, clampTo, gaugeName, percent, rangeShare, statusColor };
22
+ //# sourceMappingURL=chunk-OCD6JIIX.js.map
23
+ //# sourceMappingURL=chunk-OCD6JIIX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/gauge.ts"],"names":[],"mappings":";;;;AAGO,IAAM,OAAA,GAAU,CAAC,KAAA,KAAkB,CAAA,EAAG,KAAK,CAAA,CAAA;AAG3C,IAAM,OAAA,GAAU,CAAC,KAAA,EAAe,GAAA,EAAa,GAAA,KAClD,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC;AAG7B,IAAM,YAAY,CAAC,IAAA,EAAc,cAAsB,CAAA,EAAG,IAAI,KAAK,SAAS,CAAA;AAM5E,IAAM,WAAA,GAAc,CAAC,KAAA,EAAe,MAAA,EAAiB,MAAA,KAC1D,KAAA,KAAU,MAAA,IAAU,QAAA,CAAA,GAChB,WAAA,GACA,KAAA,KAAU,MAAA,IAAU,QAAA,CAAA,GAClB,WAAA,GACA;AAGD,IAAM,UAAA,GAAa,CAAC,KAAA,EAAe,GAAA,EAAa,GAAA,KAAA,CACpD,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,GAAG,CAAA,GAAI,GAAA,KAAQ,GAAA,GAAM,GAAA;AAOrC,IAAM,OAAA,GAAU,CACrB,EAAE,EAAA,EAAI,EAAA,IACN,EAAE,KAAA,EAAO,KAAA,EAAM,EACf,KAAA,KACG;AACH,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,IAAM,CAAA,GAAI,KAAA,CAAA;AAC7B,EAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,CAAC,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AACpD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,KAAK,KAAA,GAAQ,GAAA;AAAA,IACjB,EAAA,EAAI,KAAK,KAAA,GAAQ,GAAA;AAAA,IACjB,EAAA,EAAI,KAAK,KAAA,GAAQ,GAAA;AAAA,IACjB,EAAA,EAAI,KAAK,KAAA,GAAQ;AAAA,GACnB;AACF","file":"chunk-OCD6JIIX.js","sourcesContent":["import { STATUS_CRIT, STATUS_WARN, SUCCESS } from './colors';\n\n/** A value as a percentage, the default `formatValue` of the radial charts. */\nexport const percent = (value: number) => `${value}%`;\n\n/** The value clamped to `min`–`max`: a gauge's arc stops at an end, its text still gives the value. */\nexport const clampTo = (value: number, min: number, max: number) =>\n Math.min(max, Math.max(min, value));\n\n/** The name a gauge is read by: `name` (the host's `ariaLabel`, else the label) and the formatted value. */\nexport const gaugeName = (name: string, formatted: string) => `${name}: ${formatted}`;\n\n/**\n * The arc color of a status gauge: success, then warning from `warnAt` and\n * critical from `critAt`. A threshold left out is never reached.\n */\nexport const statusColor = (value: number, warnAt?: number, critAt?: number) =>\n value >= (critAt ?? Infinity)\n ? STATUS_CRIT\n : value >= (warnAt ?? Infinity)\n ? STATUS_WARN\n : SUCCESS;\n\n/** Where `value` sits in `min`–`max`, from 0 (the start) to 1 (the end); one outside the range stops at an end. */\nexport const rangeShare = (value: number, min: number, max: number) =>\n (clampTo(value, min, max) - min) / (max - min);\n\n/**\n * The two ends of a radial mark across a half-circle arc that opens upward,\n * centered on (`cx`, `cy`): at `share` of the arc (0 on the left end, 1 on the\n * right one), from the radius `inner` to the radius `outer`.\n */\nexport const arcMark = (\n { cx, cy }: { cx: number; cy: number },\n { inner, outer }: { inner: number; outer: number },\n share: number\n) => {\n const angle = Math.PI * (1 - share);\n const [cos, sin] = [Math.cos(angle), Math.sin(angle)];\n return {\n x1: cx + inner * cos,\n y1: cy - inner * sin,\n x2: cx + outer * cos,\n y2: cy - outer * sin,\n };\n};\n"]}