@sckyzo/cosmos-charts 0.2.0 → 0.3.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.
- package/CHANGELOG.md +91 -0
- package/README.md +107 -22
- package/THIRD_PARTY_NOTICES.md +81 -0
- package/dist/BarChart.cjs +137 -0
- package/dist/BarChart.cjs.map +1 -0
- package/dist/BarChart.js +135 -0
- package/dist/BarChart.js.map +1 -0
- package/dist/BoxPlotChart.cjs +214 -0
- package/dist/BoxPlotChart.cjs.map +1 -0
- package/dist/BoxPlotChart.js +212 -0
- package/dist/BoxPlotChart.js.map +1 -0
- package/dist/BumpChart.cjs +328 -0
- package/dist/BumpChart.cjs.map +1 -0
- package/dist/BumpChart.js +326 -0
- package/dist/BumpChart.js.map +1 -0
- package/dist/CalendarChart.cjs +216 -0
- package/dist/CalendarChart.cjs.map +1 -0
- package/dist/CalendarChart.js +214 -0
- package/dist/CalendarChart.js.map +1 -0
- package/dist/DonutChart.cjs +122 -0
- package/dist/DonutChart.cjs.map +1 -0
- package/dist/DonutChart.js +120 -0
- package/dist/DonutChart.js.map +1 -0
- package/dist/FunnelChart.cjs +422 -0
- package/dist/FunnelChart.cjs.map +1 -0
- package/dist/FunnelChart.js +420 -0
- package/dist/FunnelChart.js.map +1 -0
- package/dist/GradientRadial.cjs +51 -0
- package/dist/GradientRadial.cjs.map +1 -0
- package/dist/GradientRadial.js +49 -0
- package/dist/GradientRadial.js.map +1 -0
- package/dist/HeatmapChart.cjs +146 -0
- package/dist/HeatmapChart.cjs.map +1 -0
- package/dist/HeatmapChart.js +144 -0
- package/dist/HeatmapChart.js.map +1 -0
- package/dist/LineAreaChart.cjs +98 -0
- package/dist/LineAreaChart.cjs.map +1 -0
- package/dist/LineAreaChart.js +96 -0
- package/dist/LineAreaChart.js.map +1 -0
- package/dist/MixedChart.cjs +195 -0
- package/dist/MixedChart.cjs.map +1 -0
- package/dist/MixedChart.js +193 -0
- package/dist/MixedChart.js.map +1 -0
- package/dist/RadarChart.cjs +109 -0
- package/dist/RadarChart.cjs.map +1 -0
- package/dist/RadarChart.js +107 -0
- package/dist/RadarChart.js.map +1 -0
- package/dist/RadialBarChart.cjs +99 -0
- package/dist/RadialBarChart.cjs.map +1 -0
- package/dist/RadialBarChart.js +97 -0
- package/dist/RadialBarChart.js.map +1 -0
- package/dist/RangeBarChart.cjs +218 -0
- package/dist/RangeBarChart.cjs.map +1 -0
- package/dist/RangeBarChart.js +216 -0
- package/dist/RangeBarChart.js.map +1 -0
- package/dist/RealtimeChart.cjs +173 -0
- package/dist/RealtimeChart.cjs.map +1 -0
- package/dist/RealtimeChart.js +171 -0
- package/dist/RealtimeChart.js.map +1 -0
- package/dist/ScatterChart.cjs +134 -0
- package/dist/ScatterChart.cjs.map +1 -0
- package/dist/ScatterChart.js +131 -0
- package/dist/ScatterChart.js.map +1 -0
- package/dist/SemiCircleGauge.cjs +142 -0
- package/dist/SemiCircleGauge.cjs.map +1 -0
- package/dist/SemiCircleGauge.js +140 -0
- package/dist/SemiCircleGauge.js.map +1 -0
- package/dist/Sparkline.cjs +117 -0
- package/dist/Sparkline.cjs.map +1 -0
- package/dist/Sparkline.js +115 -0
- package/dist/Sparkline.js.map +1 -0
- package/dist/StrokedGauge.cjs +94 -0
- package/dist/StrokedGauge.cjs.map +1 -0
- package/dist/StrokedGauge.js +92 -0
- package/dist/StrokedGauge.js.map +1 -0
- package/dist/TreemapChart.cjs +263 -0
- package/dist/TreemapChart.cjs.map +1 -0
- package/dist/TreemapChart.js +261 -0
- package/dist/TreemapChart.js.map +1 -0
- package/dist/WaterfallChart.cjs +235 -0
- package/dist/WaterfallChart.cjs.map +1 -0
- package/dist/WaterfallChart.js +233 -0
- package/dist/WaterfallChart.js.map +1 -0
- package/dist/WorldMap.cjs +2088 -0
- package/dist/WorldMap.cjs.map +1 -0
- package/dist/WorldMap.js +603 -0
- package/dist/WorldMap.js.map +1 -0
- package/dist/chunk-3N43QT36.js +60 -0
- package/dist/chunk-3N43QT36.js.map +1 -0
- package/dist/chunk-5C2RLJYZ.js +11 -0
- package/dist/chunk-5C2RLJYZ.js.map +1 -0
- package/dist/chunk-6ALKZLN2.js +127 -0
- package/dist/chunk-6ALKZLN2.js.map +1 -0
- package/dist/chunk-6BKLL7LZ.cjs +30 -0
- package/dist/chunk-6BKLL7LZ.cjs.map +1 -0
- package/dist/chunk-6NRRABPF.cjs +64 -0
- package/dist/chunk-6NRRABPF.cjs.map +1 -0
- package/dist/chunk-AAYHG7YK.cjs +30 -0
- package/dist/chunk-AAYHG7YK.cjs.map +1 -0
- package/dist/chunk-AOSO5QHL.js +19 -0
- package/dist/chunk-AOSO5QHL.js.map +1 -0
- package/dist/chunk-BFEDLXVW.js +12 -0
- package/dist/chunk-BFEDLXVW.js.map +1 -0
- package/dist/chunk-DBZQI4HM.cjs +14 -0
- package/dist/chunk-DBZQI4HM.cjs.map +1 -0
- package/dist/chunk-F2PMFYJ5.cjs +40 -0
- package/dist/chunk-F2PMFYJ5.cjs.map +1 -0
- package/dist/chunk-FUZW3H5X.js +38 -0
- package/dist/chunk-FUZW3H5X.js.map +1 -0
- package/dist/chunk-GDZLYYL2.js +27 -0
- package/dist/chunk-GDZLYYL2.js.map +1 -0
- package/dist/chunk-GVTMZYOM.cjs +30 -0
- package/dist/chunk-GVTMZYOM.cjs.map +1 -0
- package/dist/chunk-GZRMVE4X.cjs +131 -0
- package/dist/chunk-GZRMVE4X.cjs.map +1 -0
- package/dist/chunk-HMH6DI7U.js +27 -0
- package/dist/chunk-HMH6DI7U.js.map +1 -0
- package/dist/chunk-ICL5K2CW.js +280 -0
- package/dist/chunk-ICL5K2CW.js.map +1 -0
- package/dist/chunk-IW6EWB26.cjs +21 -0
- package/dist/chunk-IW6EWB26.cjs.map +1 -0
- package/dist/chunk-K3R7JGOW.cjs +18 -0
- package/dist/chunk-K3R7JGOW.cjs.map +1 -0
- package/dist/chunk-LT3UC65O.cjs +68 -0
- package/dist/chunk-LT3UC65O.cjs.map +1 -0
- package/dist/chunk-MN4CDVOS.cjs +63 -0
- package/dist/chunk-MN4CDVOS.cjs.map +1 -0
- package/dist/chunk-OCD6JIIX.js +23 -0
- package/dist/chunk-OCD6JIIX.js.map +1 -0
- package/dist/chunk-RILUG7JB.js +44 -0
- package/dist/chunk-RILUG7JB.js.map +1 -0
- package/dist/chunk-RLHGPHC7.cjs +51 -0
- package/dist/chunk-RLHGPHC7.cjs.map +1 -0
- package/dist/chunk-SGG7XKOY.js +58 -0
- package/dist/chunk-SGG7XKOY.js.map +1 -0
- package/dist/chunk-T3K6Q34U.cjs +82 -0
- package/dist/chunk-T3K6Q34U.cjs.map +1 -0
- package/dist/chunk-TPH5T3DA.cjs +282 -0
- package/dist/chunk-TPH5T3DA.cjs.map +1 -0
- package/dist/chunk-TYQWZR3S.cjs +13 -0
- package/dist/chunk-TYQWZR3S.cjs.map +1 -0
- package/dist/chunk-UATB2IRY.js +51 -0
- package/dist/chunk-UATB2IRY.js.map +1 -0
- package/dist/chunk-UJIV5PVI.js +13 -0
- package/dist/chunk-UJIV5PVI.js.map +1 -0
- package/dist/chunk-URNXLVSK.js +44 -0
- package/dist/chunk-URNXLVSK.js.map +1 -0
- package/dist/chunk-VIOSQN4Z.js +79 -0
- package/dist/chunk-VIOSQN4Z.js.map +1 -0
- package/dist/chunk-X3YZP5WF.cjs +46 -0
- package/dist/chunk-X3YZP5WF.cjs.map +1 -0
- package/dist/chunk-YWYF5CCJ.js +61 -0
- package/dist/chunk-YWYF5CCJ.js.map +1 -0
- package/dist/chunk-Z4LZFMDH.cjs +60 -0
- package/dist/chunk-Z4LZFMDH.cjs.map +1 -0
- package/dist/index.cjs +154 -1166
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +470 -80
- package/dist/index.d.ts +470 -80
- package/dist/index.js +23 -1144
- package/dist/index.js.map +1 -1
- package/dist/theme.cjs +88 -0
- package/dist/theme.cjs.map +1 -0
- package/dist/theme.js +84 -0
- package/dist/theme.js.map +1 -0
- package/package.json +23 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/world-map-codes.ts","../src/world-map.ts","../src/WorldMap.tsx"],"names":[],"mappings":";;;;;;;;;AAQO,IAAM,iBAAA,GAAsD;AAAA,EACjE,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAA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","file":"WorldMap.js","sourcesContent":["// The ISO 3166-1 numeric code of each country and territory, as the string\n// world-atlas gives as a feature's `id` (zero-padded), to its alpha-2 code,\n// which is what `WorldMap`'s `data` is keyed by. Written from the standard,\n// all 249 officially assigned codes, so `countries-50m.json` is covered as\n// well as `countries-110m.json`. Kosovo has no numeric code (XK is\n// user-assigned) and world-atlas gives it no id: it is drawn and never takes\n// a value, like the other features without an id.\n\nexport const NUMERIC_TO_ALPHA2: Readonly<Record<string, string>> = {\n '004': 'AF',\n '008': 'AL',\n '010': 'AQ',\n '012': 'DZ',\n '016': 'AS',\n '020': 'AD',\n '024': 'AO',\n '028': 'AG',\n '031': 'AZ',\n '032': 'AR',\n '036': 'AU',\n '040': 'AT',\n '044': 'BS',\n '048': 'BH',\n '050': 'BD',\n '051': 'AM',\n '052': 'BB',\n '056': 'BE',\n '060': 'BM',\n '064': 'BT',\n '068': 'BO',\n '070': 'BA',\n '072': 'BW',\n '074': 'BV',\n '076': 'BR',\n '084': 'BZ',\n '086': 'IO',\n '090': 'SB',\n '092': 'VG',\n '096': 'BN',\n '100': 'BG',\n '104': 'MM',\n '108': 'BI',\n '112': 'BY',\n '116': 'KH',\n '120': 'CM',\n '124': 'CA',\n '132': 'CV',\n '136': 'KY',\n '140': 'CF',\n '144': 'LK',\n '148': 'TD',\n '152': 'CL',\n '156': 'CN',\n '158': 'TW',\n '162': 'CX',\n '166': 'CC',\n '170': 'CO',\n '174': 'KM',\n '175': 'YT',\n '178': 'CG',\n '180': 'CD',\n '184': 'CK',\n '188': 'CR',\n '191': 'HR',\n '192': 'CU',\n '196': 'CY',\n '203': 'CZ',\n '204': 'BJ',\n '208': 'DK',\n '212': 'DM',\n '214': 'DO',\n '218': 'EC',\n '222': 'SV',\n '226': 'GQ',\n '231': 'ET',\n '232': 'ER',\n '233': 'EE',\n '234': 'FO',\n '238': 'FK',\n '239': 'GS',\n '242': 'FJ',\n '246': 'FI',\n '248': 'AX',\n '250': 'FR',\n '254': 'GF',\n '258': 'PF',\n '260': 'TF',\n '262': 'DJ',\n '266': 'GA',\n '268': 'GE',\n '270': 'GM',\n '275': 'PS',\n '276': 'DE',\n '288': 'GH',\n '292': 'GI',\n '296': 'KI',\n '300': 'GR',\n '304': 'GL',\n '308': 'GD',\n '312': 'GP',\n '316': 'GU',\n '320': 'GT',\n '324': 'GN',\n '328': 'GY',\n '332': 'HT',\n '334': 'HM',\n '336': 'VA',\n '340': 'HN',\n '344': 'HK',\n '348': 'HU',\n '352': 'IS',\n '356': 'IN',\n '360': 'ID',\n '364': 'IR',\n '368': 'IQ',\n '372': 'IE',\n '376': 'IL',\n '380': 'IT',\n '384': 'CI',\n '388': 'JM',\n '392': 'JP',\n '398': 'KZ',\n '400': 'JO',\n '404': 'KE',\n '408': 'KP',\n '410': 'KR',\n '414': 'KW',\n '417': 'KG',\n '418': 'LA',\n '422': 'LB',\n '426': 'LS',\n '428': 'LV',\n '430': 'LR',\n '434': 'LY',\n '438': 'LI',\n '440': 'LT',\n '442': 'LU',\n '446': 'MO',\n '450': 'MG',\n '454': 'MW',\n '458': 'MY',\n '462': 'MV',\n '466': 'ML',\n '470': 'MT',\n '474': 'MQ',\n '478': 'MR',\n '480': 'MU',\n '484': 'MX',\n '492': 'MC',\n '496': 'MN',\n '498': 'MD',\n '499': 'ME',\n '500': 'MS',\n '504': 'MA',\n '508': 'MZ',\n '512': 'OM',\n '516': 'NA',\n '520': 'NR',\n '524': 'NP',\n '528': 'NL',\n '531': 'CW',\n '533': 'AW',\n '534': 'SX',\n '535': 'BQ',\n '540': 'NC',\n '548': 'VU',\n '554': 'NZ',\n '558': 'NI',\n '562': 'NE',\n '566': 'NG',\n '570': 'NU',\n '574': 'NF',\n '578': 'NO',\n '580': 'MP',\n '581': 'UM',\n '583': 'FM',\n '584': 'MH',\n '585': 'PW',\n '586': 'PK',\n '591': 'PA',\n '598': 'PG',\n '600': 'PY',\n '604': 'PE',\n '608': 'PH',\n '612': 'PN',\n '616': 'PL',\n '620': 'PT',\n '624': 'GW',\n '626': 'TL',\n '630': 'PR',\n '634': 'QA',\n '638': 'RE',\n '642': 'RO',\n '643': 'RU',\n '646': 'RW',\n '652': 'BL',\n '654': 'SH',\n '659': 'KN',\n '660': 'AI',\n '662': 'LC',\n '663': 'MF',\n '666': 'PM',\n '670': 'VC',\n '674': 'SM',\n '678': 'ST',\n '682': 'SA',\n '686': 'SN',\n '688': 'RS',\n '690': 'SC',\n '694': 'SL',\n '702': 'SG',\n '703': 'SK',\n '704': 'VN',\n '705': 'SI',\n '706': 'SO',\n '710': 'ZA',\n '716': 'ZW',\n '724': 'ES',\n '728': 'SS',\n '729': 'SD',\n '732': 'EH',\n '740': 'SR',\n '744': 'SJ',\n '748': 'SZ',\n '752': 'SE',\n '756': 'CH',\n '760': 'SY',\n '762': 'TJ',\n '764': 'TH',\n '768': 'TG',\n '772': 'TK',\n '776': 'TO',\n '780': 'TT',\n '784': 'AE',\n '788': 'TN',\n '792': 'TR',\n '795': 'TM',\n '796': 'TC',\n '798': 'TV',\n '800': 'UG',\n '804': 'UA',\n '807': 'MK',\n '818': 'EG',\n '826': 'GB',\n '831': 'GG',\n '832': 'JE',\n '833': 'IM',\n '834': 'TZ',\n '840': 'US',\n '850': 'VI',\n '854': 'BF',\n '858': 'UY',\n '860': 'UZ',\n '862': 'VE',\n '876': 'WF',\n '882': 'WS',\n '887': 'YE',\n '894': 'ZM',\n};\n","// The maths of WorldMap: the five color steps of a set of values, the step of a\n// value, the bounds the legend prints and the order the keyboard walks the\n// countries in. No DOM and no colors, so it runs in plain Node.\n\n/** How many color steps the scale has. */\nexport const STEPS = 5;\n\nexport type Scale = {\n /** The lower bound of steps 1 to 4: a value at or above `thresholds[i]` is in step `i + 1` at least. */\n thresholds: number[];\n /** The lower bound of each step, step 0 first: what the legend prints. */\n bounds: number[];\n /** The ends values are clamped to, or `undefined` for none. */\n min?: number;\n max?: number;\n};\n\n/** The value kept inside `min` and `max`; an end that is not given leaves that side open. */\nexport const clamp = (value: number, min?: number, max?: number): number =>\n Math.min(Math.max(value, min ?? -Infinity), max ?? Infinity);\n\n/**\n * The scale of a set of values: five steps by quantiles, so each step holds\n * about as many countries. The thresholds are the values a fifth, two fifths…\n * of the way up the sorted list, which a linear scale cannot do: one large\n * country would otherwise wash every other one out. A repeated value can\n * leave a step empty (all values equal: only the top step is used).\n *\n * `min` and `max` clamp every value before the quantiles are taken (a value\n * under `min` counts as `min`, one over `max` as `max`), so an outlier takes\n * the top step without stretching the others. `min` is also the first bound\n * the legend prints. Given the wrong way round they are swapped. `undefined`\n * when there is no finite value.\n */\nexport const scaleOf = (\n values: readonly number[],\n min?: number,\n max?: number\n): Scale | undefined => {\n const [low, high] = min !== undefined && max !== undefined && min > max ? [max, min] : [min, max];\n const sorted = values\n .filter(Number.isFinite)\n .map((value) => clamp(value, low, high))\n .sort((a, b) => a - b);\n if (sorted.length === 0) return undefined;\n const thresholds = [1, 2, 3, 4].map((q) => sorted[Math.floor((sorted.length * q) / STEPS)]);\n return { thresholds, bounds: [low ?? sorted[0], ...thresholds], min: low, max: high };\n};\n\n/** The step, 0 to 4, of a value: the number of thresholds it reaches. */\nexport const stepOf = (value: number, scale: Scale): number => {\n const clamped = clamp(value, scale.min, scale.max);\n return scale.thresholds.filter((threshold) => clamped >= threshold).length;\n};\n\n/** The countries that have a value, largest first and, for equal values, by name: the order of the keyboard walk and of the hidden table. */\nexport const ranked = <T extends { name: string; value?: number }>(\n countries: readonly T[]\n): (T & { value: number })[] =>\n countries\n .filter((country): country is T & { value: number } => country.value !== undefined)\n .sort((a, b) => b.value - a.value || a.name.localeCompare(b.name));\n\n/** The country `delta` places from `current` in `order`, stopping at the ends; the first one when `current` is not in it. */\nexport const walk = <T extends { code: string }>(\n order: readonly T[],\n current: string | undefined,\n delta: number\n): T | undefined => {\n const index = order.findIndex((country) => country.code === current);\n if (index < 0) return order[0];\n return order[Math.min(Math.max(index + delta, 0), order.length - 1)];\n};\n","import { geoNaturalEarth1, geoPath } from 'd3-geo';\nimport {\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type FocusEvent,\n type KeyboardEvent,\n} from 'react';\nimport { feature } from 'topojson-client';\nimport type { Topology } from 'topojson-specification';\nimport { TooltipCard } from './core/ChartTooltip';\nimport { BORDER, MUTED, PANEL, SEQUENTIAL, TEXT, TRACK } from './core/colors';\nimport { NUMERIC_TO_ALPHA2 } from './world-map-codes';\nimport { ranked, scaleOf, stepOf, walk, type Scale } from './world-map';\nimport type { ChartProps } from './types';\n\nexport type WorldMapProps = Omit<ChartProps, 'children'> & {\n /**\n * The value of each country, keyed by ISO 3166-1 alpha-2 code in upper case\n * (`FR`, `US`). A code the `geography` does not hold is not drawn, and a\n * value that is not a finite number counts as none.\n */\n data: Record<string, number>;\n /**\n * The map: a TopoJSON `Topology` with a `countries` object, such as\n * `world-atlas/countries-110m.json` or `countries-50m.json`. The package\n * ships no map data. A country is a feature whose `id` is its ISO 3166-1\n * numeric code and whose `properties.name` is the name the tooltip and the\n * reading table give; a feature without an id (Kosovo) is drawn and never\n * takes a value. Antarctica is left out.\n */\n geography: Topology;\n /** Format the values, in the tooltip, the legend and the table. Default `String`. */\n formatValue?: (value: number) => string;\n /** Names the value in the tooltip, such as `visitors`. Default `Value`. */\n label?: string;\n /**\n * Clamp the values to this end before the color steps are cut: a value under\n * `min` counts as `min`. The legend starts at `min`. Default: the lowest value.\n */\n min?: number;\n /** Clamp the values to this end before the color steps are cut: a value over `max` counts as `max`. Default: no limit. */\n max?: number;\n /** Show the legend: the lower bound of each step, and a swatch for countries without data. Default true. Never shown without a value to draw. */\n showLegend?: boolean;\n /**\n * Called with the code of a country that has a value when it is clicked, or\n * when Enter or Space is pressed on the one the keyboard is on. Without it,\n * the map only shows.\n */\n onSelect?: (code: string) => void;\n};\n\n// The map is drawn in a box this wide, as tall as the map needs (about 470), and\n// scaled to the width it is given.\nconst VIEW_WIDTH = 960;\n// Room left around the map for the strokes at its edge.\nconst MARGIN = 2;\n// world-atlas gives Antarctica the id 010. It would take a fifth of the box for no data.\nconst ANTARCTICA = '010';\n// Room the tooltip card leaves the pointer or the country.\nconst TIP_GAP = 6;\nconst POINTER_GAP = 14;\n\ntype Shape = {\n /** Alpha-2 code, when the feature has an id the table knows. */\n code?: string;\n name: string;\n /** The SVG path. */\n d: string;\n};\n\ntype Country = Shape & { value?: number; step?: number };\n\ntype Tip = {\n code: string;\n /** Where the card is anchored, in px from the map's corner, and on which side. */\n x: number;\n top: number;\n bottom: number;\n align: 'start' | 'center' | 'end';\n below: boolean;\n};\n\n// Visually hidden, still read by screen readers.\nconst HIDDEN: CSSProperties = {\n position: 'absolute',\n width: 1,\n height: 1,\n margin: -1,\n padding: 0,\n overflow: 'hidden',\n clipPath: 'inset(50%)',\n whiteSpace: 'nowrap',\n border: 0,\n};\n\n/**\n * The countries of the topology as SVG paths in the Natural Earth projection,\n * fitted to the width of the box, and the height of the box that holds them.\n */\nconst shapesOf = (geography: Topology): { shapes: Shape[]; viewHeight: number } => {\n const countries = geography.objects.countries;\n if (!countries) {\n throw new Error('WorldMap: `geography` has no `countries` object');\n }\n const collection = feature(geography, countries);\n const features = (\n collection.type === 'FeatureCollection' ? collection.features : [collection]\n ).filter((item) => String(item.id).padStart(3, '0') !== ANTARCTICA);\n const world = { type: 'FeatureCollection' as const, features };\n // `fitWidth` puts the map's top left corner at 0,0: shift it by the margin.\n const projection = geoNaturalEarth1().fitWidth(VIEW_WIDTH - 2 * MARGIN, world);\n const [x, y] = projection.translate();\n projection.translate([x + MARGIN, y + MARGIN]);\n const path = geoPath(projection);\n const [, [, bottom]] = path.bounds(world);\n const shapes = features.flatMap((item): Shape[] => {\n const d = path(item);\n if (!d) return [];\n const name = item.properties?.name;\n return [\n {\n code:\n item.id === undefined ? undefined : NUMERIC_TO_ALPHA2[String(item.id).padStart(3, '0')],\n name: typeof name === 'string' ? name : '',\n d,\n },\n ];\n });\n return { shapes, viewHeight: Math.ceil(bottom) + MARGIN };\n};\n\nexport const WorldMap = ({\n data,\n geography,\n formatValue = String,\n label,\n min,\n max,\n showLegend = true,\n onSelect,\n ariaLabel,\n height,\n width,\n}: WorldMapProps) => {\n const frame = useRef<HTMLDivElement>(null);\n const { shapes, viewHeight } = useMemo(() => shapesOf(geography), [geography]);\n const [hover, setHover] = useState<Tip>();\n const [focus, setFocus] = useState<Tip>();\n // The country the keyboard last stood on, which Tab comes back to.\n const [lastKey, setLastKey] = useState<string>();\n\n const valued = shapes.map((shape): Country => {\n const value = shape.code === undefined ? undefined : data[shape.code];\n return { ...shape, value: Number.isFinite(value) ? value : undefined };\n });\n const order = ranked(\n valued.filter((country): country is Country & { code: string } => country.code !== undefined)\n );\n const scale = scaleOf(\n order.map((country) => country.value),\n min,\n max\n );\n const countries = valued.map((country): Country => ({\n ...country,\n step: scale && country.value !== undefined ? stepOf(country.value, scale) : undefined,\n }));\n const byCode = new Map(\n countries.flatMap((country) => (country.code ? [[country.code, country] as const] : []))\n );\n const interactive = order.length > 0;\n const stepColor = (step: number | undefined) => (step === undefined ? TRACK : SEQUENTIAL[step]);\n\n const name =\n ariaLabel ??\n (interactive\n ? `World map, ${label ?? 'value'} by country, from ${formatValue(order[order.length - 1].value)} to ${formatValue(order[0].value)}`\n : 'World map');\n\n const tip = hover ?? focus;\n const tipCountry = tip && byCode.get(tip.code);\n\n // The card hangs from the side of the anchor nearest the middle of the map,\n // so it never leaves the box.\n const anchor = (code: string, x: number, top: number, bottom: number, gap: number): Tip => {\n const host = (frame.current as HTMLElement).getBoundingClientRect();\n const middle = x - host.left;\n const align =\n middle < host.width / 3 ? 'start' : middle > (2 * host.width) / 3 ? 'end' : 'center';\n return {\n code,\n x: middle,\n top: top - host.top - gap,\n bottom: bottom - host.top + gap,\n align,\n // Not enough room above for the card: it goes under.\n below: top - host.top < 90,\n };\n };\n const tipAtPointer = (code: string, event: { clientX: number; clientY: number }) =>\n anchor(code, event.clientX, event.clientY, event.clientY, POINTER_GAP - TIP_GAP);\n const tipAtCountry = (code: string): Tip | undefined => {\n const element = frame.current?.querySelector<SVGPathElement>(`[data-code=\"${code}\"]`);\n if (!element) return undefined;\n const box = element.getBoundingClientRect();\n const middle = box.top + box.height / 2;\n return anchor(code, box.left + box.width / 2, middle, middle, 0);\n };\n\n const goTo = (country: { code: string } | undefined) => {\n if (!country) return;\n setLastKey(country.code);\n setFocus(tipAtCountry(country.code));\n };\n\n const keyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const current = focus?.code ?? lastKey;\n const targets: Record<string, () => { code: string } | undefined> = {\n ArrowRight: () => walk(order, current, 1),\n ArrowDown: () => walk(order, current, 1),\n ArrowLeft: () => walk(order, current, -1),\n ArrowUp: () => walk(order, current, -1),\n Home: () => order[0],\n End: () => order[order.length - 1],\n };\n if (targets[event.key]) {\n event.preventDefault();\n goTo(targets[event.key]());\n } else if (onSelect && (event.key === 'Enter' || event.key === ' ') && focus) {\n event.preventDefault();\n onSelect(focus.code);\n }\n };\n const focusIn = (event: FocusEvent<HTMLDivElement>) => {\n // A click focuses the map too, and would leave a tooltip up: only the keyboard shows it.\n if (event.target === event.currentTarget && event.currentTarget.matches(':focus-visible')) {\n goTo(order.find((country) => country.code === lastKey) ?? order[0]);\n }\n };\n const focusOut = (event: FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget)) setFocus(undefined);\n };\n\n const tipStyle: CSSProperties | undefined = tip && {\n position: 'absolute',\n left: tip.x,\n top: tip.below ? tip.bottom : tip.top,\n transform: `translate(${{ start: '0', center: '-50%', end: '-100%' }[tip.align]}, ${tip.below ? '0' : '-100%'})`,\n zIndex: 10,\n pointerEvents: 'none',\n };\n const active = tipCountry?.value === undefined ? undefined : tipCountry;\n\n const legend = showLegend && scale && <Legend scale={scale} format={formatValue} />;\n\n return (\n <div\n data-world-map=\"\"\n style={{\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n gap: '0.75rem',\n width: width ?? '100%',\n height,\n maxWidth: '100%',\n minWidth: 0,\n }}\n >\n <div\n ref={frame}\n role={interactive ? 'application' : undefined}\n aria-label={interactive ? name : undefined}\n tabIndex={interactive ? 0 : undefined}\n onKeyDown={interactive ? keyDown : undefined}\n onFocus={interactive ? focusIn : undefined}\n onBlur={interactive ? focusOut : undefined}\n style={{\n position: 'relative',\n flex: height === undefined ? undefined : '1 1 0',\n minHeight: 0,\n // The country outline and the tooltip show where the keyboard is.\n outline: 'none',\n }}\n >\n <svg\n role=\"img\"\n aria-label={name}\n viewBox={`0 0 ${VIEW_WIDTH} ${viewHeight}`}\n style={{\n display: 'block',\n width: '100%',\n height: height === undefined ? 'auto' : '100%',\n }}\n >\n {countries.map((country, i) => {\n const code = country.code;\n const has = code !== undefined && country.value !== undefined;\n return (\n <path\n key={i}\n d={country.d}\n data-code={has ? code : undefined}\n data-step={country.step}\n fill={stepColor(country.step)}\n stroke={PANEL}\n strokeWidth={0.5}\n strokeLinejoin=\"round\"\n style={has && onSelect ? { cursor: 'pointer' } : undefined}\n onMouseEnter={has ? (event) => setHover(tipAtPointer(code, event)) : undefined}\n onMouseMove={has ? (event) => setHover(tipAtPointer(code, event)) : undefined}\n onMouseLeave={has ? () => setHover(undefined) : undefined}\n onClick={has && onSelect ? () => onSelect(code) : undefined}\n />\n );\n })}\n {active && (\n // The same outline for the pointer and the keyboard, in the text color:\n // an accent one would vanish on the darkest steps. Drawn last to sit\n // above the neighbors' borders.\n <path\n d={active.d}\n data-world-active=\"\"\n fill=\"none\"\n stroke={TEXT}\n strokeWidth={1.6}\n strokeLinejoin=\"round\"\n pointerEvents=\"none\"\n />\n )}\n </svg>\n {tip && tipCountry && tipCountry.value !== undefined && tipStyle && (\n <div data-world-tooltip=\"\" aria-hidden style={tipStyle}>\n <TooltipCard\n title={tipCountry.name}\n rows={[\n {\n name: label ?? 'Value',\n value: formatValue(tipCountry.value),\n color: stepColor(tipCountry.step),\n },\n ]}\n />\n </div>\n )}\n {interactive && (\n <span data-world-status=\"\" role=\"status\" aria-live=\"polite\" style={HIDDEN}>\n {focus && tipCountry && tipCountry.value !== undefined\n ? `${tipCountry.name}, ${label ?? 'Value'}: ${formatValue(tipCountry.value)}`\n : ''}\n </span>\n )}\n </div>\n {interactive && (\n <div style={HIDDEN}>\n <table data-world-table=\"\">\n <caption>{name}</caption>\n <thead>\n <tr>\n <th scope=\"col\">Country</th>\n <th scope=\"col\">{label ?? 'Value'}</th>\n </tr>\n </thead>\n <tbody>\n {order.map((country) => (\n <tr key={country.code}>\n <th scope=\"row\">{country.name}</th>\n <td>{formatValue(country.value)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {legend}\n </div>\n );\n};\n\nconst Legend = ({ scale, format }: { scale: Scale; format: (value: number) => string }) => (\n <ul\n data-world-legend=\"\"\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-end',\n columnGap: 2,\n rowGap: '0.5rem',\n margin: 0,\n padding: 0,\n listStyle: 'none',\n fontSize: 'var(--text-2xs, 0.6875rem)',\n color: MUTED,\n }}\n >\n {SEQUENTIAL.map((color, i) => (\n <li key={i} style={{ display: 'flex', flexDirection: 'column', gap: 4, minWidth: '2.75rem' }}>\n <span\n aria-hidden\n data-world-swatch=\"\"\n style={{ height: 10, borderRadius: 2, background: color }}\n />\n <span style={{ fontVariantNumeric: 'tabular-nums', whiteSpace: 'nowrap' }}>\n {format(scale.bounds[i])}+\n </span>\n </li>\n ))}\n <li style={{ display: 'flex', flexDirection: 'column', gap: 4, marginLeft: '0.75rem' }}>\n <span\n aria-hidden\n data-world-swatch=\"\"\n style={{\n width: '1.75rem',\n height: 10,\n borderRadius: 2,\n background: TRACK,\n border: `1px solid ${BORDER}`,\n boxSizing: 'border-box',\n }}\n />\n <span style={{ whiteSpace: 'nowrap' }}>No data</span>\n </li>\n </ul>\n);\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { MUTED } from './chunk-UATB2IRY.js';
|
|
3
|
+
import { useState, useEffect } from 'react';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var frameProps = ({
|
|
7
|
+
height,
|
|
8
|
+
width = "100%",
|
|
9
|
+
ariaLabel,
|
|
10
|
+
keyboard = true
|
|
11
|
+
}) => ({
|
|
12
|
+
responsive: true,
|
|
13
|
+
accessibilityLayer: keyboard,
|
|
14
|
+
...keyboard ? {} : { role: "img" },
|
|
15
|
+
"aria-label": ariaLabel,
|
|
16
|
+
// `maxWidth`: a chart wider than its parent would widen the page.
|
|
17
|
+
style: { width, height, maxWidth: "100%" }
|
|
18
|
+
});
|
|
19
|
+
var useFontsLoaded = () => {
|
|
20
|
+
const [loaded, setLoaded] = useState(0);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
const fonts = typeof document === "undefined" ? void 0 : document.fonts;
|
|
23
|
+
if (!fonts?.addEventListener) return;
|
|
24
|
+
let active = true;
|
|
25
|
+
const done = () => {
|
|
26
|
+
if (active) setLoaded(1);
|
|
27
|
+
};
|
|
28
|
+
fonts.addEventListener("loadingdone", done);
|
|
29
|
+
if (fonts.status === "loading") void fonts.ready.then(done);
|
|
30
|
+
return () => {
|
|
31
|
+
active = false;
|
|
32
|
+
fonts.removeEventListener("loadingdone", done);
|
|
33
|
+
};
|
|
34
|
+
}, []);
|
|
35
|
+
return loaded;
|
|
36
|
+
};
|
|
37
|
+
var ChartEmpty = ({ message, ariaLabel, height, width = "100%" }) => /* @__PURE__ */ jsx(
|
|
38
|
+
"div",
|
|
39
|
+
{
|
|
40
|
+
role: "group",
|
|
41
|
+
"aria-label": ariaLabel,
|
|
42
|
+
"data-chart-empty": "",
|
|
43
|
+
style: {
|
|
44
|
+
display: "flex",
|
|
45
|
+
alignItems: "center",
|
|
46
|
+
justifyContent: "center",
|
|
47
|
+
width,
|
|
48
|
+
height,
|
|
49
|
+
maxWidth: "100%",
|
|
50
|
+
color: MUTED,
|
|
51
|
+
fontSize: "var(--text-sm, 0.875rem)",
|
|
52
|
+
textAlign: "center"
|
|
53
|
+
},
|
|
54
|
+
children: message
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
export { ChartEmpty, frameProps, useFontsLoaded };
|
|
59
|
+
//# sourceMappingURL=chunk-3N43QT36.js.map
|
|
60
|
+
//# sourceMappingURL=chunk-3N43QT36.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/frame.tsx"],"names":[],"mappings":";;;;;AAoBO,IAAM,aAAa,CAAC;AAAA,EACzB,MAAA;AAAA,EACA,KAAA,GAAQ,MAAA;AAAA,EACR,SAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,MAAqB;AAAA,EACnB,UAAA,EAAY,IAAA;AAAA,EACZ,kBAAA,EAAoB,QAAA;AAAA,EACpB,GAAI,QAAA,GAAW,EAAC,GAAI,EAAE,MAAM,KAAA,EAAM;AAAA,EAClC,YAAA,EAAc,SAAA;AAAA;AAAA,EAEd,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAU,MAAA;AACpC,CAAA;AAWO,IAAM,iBAAiB,MAAa;AACzC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAgB,CAAC,CAAA;AAC7C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,KAAa,WAAA,GAAc,SAAY,QAAA,CAAS,KAAA;AACrE,IAAA,IAAI,CAAC,OAAO,gBAAA,EAAkB;AAC9B,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,IAAI,MAAA,YAAkB,CAAC,CAAA;AAAA,IACzB,CAAA;AACA,IAAA,KAAA,CAAM,gBAAA,CAAiB,eAAe,IAAI,CAAA;AAG1C,IAAA,IAAI,MAAM,MAAA,KAAW,SAAA,OAAgB,KAAA,CAAM,KAAA,CAAM,KAAK,IAAI,CAAA;AAC1D,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,GAAS,KAAA;AACT,MAAA,KAAA,CAAM,mBAAA,CAAoB,eAAe,IAAI,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,MAAA;AACT;AASO,IAAM,UAAA,GAAa,CAAC,EAAE,OAAA,EAAS,WAAW,MAAA,EAAQ,KAAA,GAAQ,QAAO,qBACtE,GAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,IAAA,EAAK,OAAA;AAAA,IACL,YAAA,EAAY,SAAA;AAAA,IACZ,kBAAA,EAAiB,EAAA;AAAA,IACjB,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,KAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAO,KAAA;AAAA,MACP,QAAA,EAAU,0BAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAAA,IAEC,QAAA,EAAA;AAAA;AACH","file":"chunk-3N43QT36.js","sourcesContent":["import { useEffect, useState, type CSSProperties } from 'react';\nimport { MUTED } from './colors';\nimport type { ChartSize } from '../types';\n\ntype FrameOptions = ChartSize & {\n ariaLabel: string;\n /**\n * Tab reaches the chart and the arrow keys walk its points (default). Off,\n * the chart is an image out of the tab order: right for a single value.\n */\n keyboard?: boolean;\n};\n\n/**\n * What every Recharts chart takes on its root, spread onto it: it fills the\n * width it is given (`width` default `100%`) at `height`, and is named by\n * `ariaLabel`. With `accessibilityLayer`, Recharts makes the chart an\n * `application` in the tab order, and the arrow keys move the tooltip from\n * point to point.\n */\nexport const frameProps = ({\n height,\n width = '100%',\n ariaLabel,\n keyboard = true,\n}: FrameOptions) => ({\n responsive: true,\n accessibilityLayer: keyboard,\n ...(keyboard ? {} : { role: 'img' }),\n 'aria-label': ariaLabel,\n // `maxWidth`: a chart wider than its parent would widen the page.\n style: { width, height, maxWidth: '100%' } satisfies CSSProperties,\n});\n\n/**\n * `0` until a web font finishes loading after the chart mounted, then `1`\n * (one more render of the chart, no more). `YAxis width=\"auto\"` measures its\n * labels once, in the fallback font if the web font is not there yet, and a\n * label set in the real font can overrun the axis: `useAxis` (axes.ts) hands\n * the axes a new object when this turns `1`, and they measure again. A chart\n * that mounts with the font ready never changes, and nothing runs where\n * `document.fonts` is missing (SSR, old browsers).\n */\nexport const useFontsLoaded = (): 0 | 1 => {\n const [loaded, setLoaded] = useState<0 | 1>(0);\n useEffect(() => {\n const fonts = typeof document === 'undefined' ? undefined : document.fonts;\n if (!fonts?.addEventListener) return;\n let active = true;\n const done = () => {\n if (active) setLoaded(1);\n };\n fonts.addEventListener('loadingdone', done);\n // A font already loading when the chart mounts: its event may be on its way\n // or already gone, `ready` settles once it has loaded.\n if (fonts.status === 'loading') void fonts.ready.then(done);\n return () => {\n active = false;\n fonts.removeEventListener('loadingdone', done);\n };\n }, []);\n return loaded;\n};\n\ntype EmptyProps = ChartSize & {\n /** Plain text. An empty string draws nothing. */\n message: string;\n ariaLabel: string;\n};\n\n/** What a chart with no data draws in place of its plot: the message, centered, and nothing around it. */\nexport const ChartEmpty = ({ message, ariaLabel, height, width = '100%' }: EmptyProps) => (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n data-chart-empty=\"\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width,\n height,\n maxWidth: '100%',\n color: MUTED,\n fontSize: 'var(--text-sm, 0.875rem)',\n textAlign: 'center',\n }}\n >\n {message}\n </div>\n);\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
// src/core/animation.ts
|
|
3
|
+
var ANIMATION = {
|
|
4
|
+
isAnimationActive: "auto",
|
|
5
|
+
animationDuration: 500,
|
|
6
|
+
animationEasing: "ease-out"
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export { ANIMATION };
|
|
10
|
+
//# sourceMappingURL=chunk-5C2RLJYZ.js.map
|
|
11
|
+
//# sourceMappingURL=chunk-5C2RLJYZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/animation.ts"],"names":[],"mappings":";;AAIO,IAAM,SAAA,GAAY;AAAA,EACvB,iBAAA,EAAmB,MAAA;AAAA,EACnB,iBAAA,EAAmB,GAAA;AAAA,EACnB,eAAA,EAAiB;AACnB","file":"chunk-5C2RLJYZ.js","sourcesContent":["/**\n * The animation of every series: short, ease-out. `'auto'` is off for\n * `prefers-reduced-motion` and in SSR.\n */\nexport const ANIMATION = {\n isAnimationActive: 'auto' as const,\n animationDuration: 500,\n animationEasing: 'ease-out' as const,\n};\n"]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { TEXT_SIZE } from './chunk-RILUG7JB.js';
|
|
3
|
+
import { MUTED, TEXT } from './chunk-UATB2IRY.js';
|
|
4
|
+
import { useState, useCallback } from 'react';
|
|
5
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var useHiddenSeries = () => {
|
|
8
|
+
const [hidden, setHidden] = useState(/* @__PURE__ */ new Set());
|
|
9
|
+
const toggle = useCallback((key) => {
|
|
10
|
+
setHidden((current) => {
|
|
11
|
+
const next = new Set(current);
|
|
12
|
+
if (!next.delete(key)) next.add(key);
|
|
13
|
+
return next;
|
|
14
|
+
});
|
|
15
|
+
}, []);
|
|
16
|
+
return { hidden, toggle };
|
|
17
|
+
};
|
|
18
|
+
var ChartLegend = ({ payload, hidden, onToggle, column, detail }) => /* @__PURE__ */ jsx(
|
|
19
|
+
"ul",
|
|
20
|
+
{
|
|
21
|
+
style: {
|
|
22
|
+
display: "flex",
|
|
23
|
+
flexDirection: column ? "column" : "row",
|
|
24
|
+
flexWrap: "wrap",
|
|
25
|
+
gap: column ? "0.375rem" : "0.25rem 1rem",
|
|
26
|
+
margin: 0,
|
|
27
|
+
padding: 0,
|
|
28
|
+
listStyle: "none",
|
|
29
|
+
fontSize: TEXT_SIZE,
|
|
30
|
+
color: MUTED
|
|
31
|
+
},
|
|
32
|
+
children: payload?.map((entry, index) => {
|
|
33
|
+
const key = String(entry.dataKey);
|
|
34
|
+
const figures = detail?.(index);
|
|
35
|
+
const off = hidden.has(key);
|
|
36
|
+
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
37
|
+
"button",
|
|
38
|
+
{
|
|
39
|
+
type: "button",
|
|
40
|
+
"aria-pressed": !off,
|
|
41
|
+
onClick: () => onToggle(key),
|
|
42
|
+
className: "focus-visible:focus-indicator",
|
|
43
|
+
style: {
|
|
44
|
+
display: "inline-flex",
|
|
45
|
+
alignItems: "center",
|
|
46
|
+
gap: "0.375rem",
|
|
47
|
+
padding: "0.125rem 0.25rem",
|
|
48
|
+
font: "inherit",
|
|
49
|
+
color: "inherit",
|
|
50
|
+
background: "none",
|
|
51
|
+
border: 0,
|
|
52
|
+
borderRadius: "0.25rem",
|
|
53
|
+
cursor: "pointer",
|
|
54
|
+
textDecoration: off ? "line-through" : void 0,
|
|
55
|
+
// The figures of a column reach its right edge, which aligns them.
|
|
56
|
+
...figures && column ? { display: "flex", width: "100%", gap: "0.75rem" } : {}
|
|
57
|
+
},
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsx(
|
|
60
|
+
"span",
|
|
61
|
+
{
|
|
62
|
+
"aria-hidden": true,
|
|
63
|
+
style: {
|
|
64
|
+
width: "0.625rem",
|
|
65
|
+
height: "0.625rem",
|
|
66
|
+
borderRadius: "50%",
|
|
67
|
+
background: entry.color,
|
|
68
|
+
// Text keeps its color: dimming it would fail the contrast check.
|
|
69
|
+
opacity: off ? 0.35 : 1
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
),
|
|
73
|
+
figures ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
74
|
+
/* @__PURE__ */ jsx("span", { style: column ? { flex: 1, textAlign: "start" } : void 0, children: entry.value }),
|
|
75
|
+
/* @__PURE__ */ jsx(
|
|
76
|
+
"span",
|
|
77
|
+
{
|
|
78
|
+
style: {
|
|
79
|
+
color: TEXT,
|
|
80
|
+
fontWeight: 600,
|
|
81
|
+
fontVariantNumeric: "tabular-nums",
|
|
82
|
+
textAlign: "end"
|
|
83
|
+
},
|
|
84
|
+
children: figures.value
|
|
85
|
+
}
|
|
86
|
+
),
|
|
87
|
+
/* @__PURE__ */ jsx(
|
|
88
|
+
"span",
|
|
89
|
+
{
|
|
90
|
+
style: {
|
|
91
|
+
minWidth: column ? "3.5ch" : void 0,
|
|
92
|
+
fontVariantNumeric: "tabular-nums",
|
|
93
|
+
textAlign: "end"
|
|
94
|
+
},
|
|
95
|
+
children: figures.share
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
] }) : entry.value
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
) }, key);
|
|
102
|
+
})
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
var GAP = "1rem";
|
|
106
|
+
var legendProps = (position, { hidden, toggle }) => ({
|
|
107
|
+
position,
|
|
108
|
+
itemSorter: null,
|
|
109
|
+
wrapperStyle: {
|
|
110
|
+
top: { width: "100%", paddingBottom: GAP },
|
|
111
|
+
bottom: { width: "100%", paddingTop: GAP },
|
|
112
|
+
left: { paddingRight: GAP },
|
|
113
|
+
right: { paddingLeft: GAP }
|
|
114
|
+
}[position],
|
|
115
|
+
content: /* @__PURE__ */ jsx(
|
|
116
|
+
ChartLegend,
|
|
117
|
+
{
|
|
118
|
+
hidden,
|
|
119
|
+
onToggle: toggle,
|
|
120
|
+
column: position === "left" || position === "right"
|
|
121
|
+
}
|
|
122
|
+
)
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
export { ChartLegend, legendProps, useHiddenSeries };
|
|
126
|
+
//# sourceMappingURL=chunk-6ALKZLN2.js.map
|
|
127
|
+
//# sourceMappingURL=chunk-6ALKZLN2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/ChartLegend.tsx"],"names":[],"mappings":"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","file":"chunk-6ALKZLN2.js","sourcesContent":["import { useCallback, useState, type ReactNode } from 'react';\nimport type { LegendPayload, LegendProps } from 'recharts';\nimport type { ChartLegendPosition } from '../types';\nimport { MUTED, TEXT } from './colors';\nimport { TEXT_SIZE } from './axes';\n\n/**\n * The series a click on the legend hid, and the toggle. A hidden series is\n * passed to its graphical item as `hide`, so the axes fit what is left.\n */\nexport const useHiddenSeries = () => {\n const [hidden, setHidden] = useState<ReadonlySet<string>>(new Set());\n const toggle = useCallback((key: string) => {\n setHidden((current) => {\n const next = new Set(current);\n if (!next.delete(key)) next.add(key);\n return next;\n });\n }, []);\n return { hidden, toggle };\n};\n\ntype ChartLegendProps = {\n /** Given by Recharts: one entry per series, in the order the series are drawn. */\n payload?: readonly LegendPayload[];\n /** The keys of the hidden series. */\n hidden: ReadonlySet<string>;\n onToggle: (key: string) => void;\n /** Items in a column (`left`, `right`) or a row (`top`, `bottom`). */\n column?: boolean;\n /**\n * A figure written after the name of the entry at `index`: a value and its\n * share. In a column the figures sit at the right edge, aligned on their\n * last digit; in a row they follow the name.\n */\n detail?: (index: number) => { value: string; share: string };\n};\n\n/**\n * The legend of every chart: a round chip and the series name in the muted\n * text color, one button per series. A click (or Enter, Space) hides the series\n * and shows it again; the button says which in `aria-pressed`. Pass it as\n * `<Legend content={…} itemSorter={null} />`: Recharts sorts the items by name\n * unless told not to, and the series keep their order.\n */\nexport const ChartLegend = ({ payload, hidden, onToggle, column, detail }: ChartLegendProps) => (\n <ul\n style={{\n display: 'flex',\n flexDirection: column ? 'column' : 'row',\n flexWrap: 'wrap',\n gap: column ? '0.375rem' : '0.25rem 1rem',\n margin: 0,\n padding: 0,\n listStyle: 'none',\n fontSize: TEXT_SIZE,\n color: MUTED,\n }}\n >\n {payload?.map((entry, index) => {\n const key = String(entry.dataKey);\n const figures = detail?.(index);\n const off = hidden.has(key);\n return (\n <li key={key}>\n <button\n type=\"button\"\n aria-pressed={!off}\n onClick={() => onToggle(key)}\n className=\"focus-visible:focus-indicator\"\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.375rem',\n padding: '0.125rem 0.25rem',\n font: 'inherit',\n color: 'inherit',\n background: 'none',\n border: 0,\n borderRadius: '0.25rem',\n cursor: 'pointer',\n textDecoration: off ? 'line-through' : undefined,\n // The figures of a column reach its right edge, which aligns them.\n ...(figures && column ? { display: 'flex', width: '100%', gap: '0.75rem' } : {}),\n }}\n >\n <span\n aria-hidden\n style={{\n width: '0.625rem',\n height: '0.625rem',\n borderRadius: '50%',\n background: entry.color,\n // Text keeps its color: dimming it would fail the contrast check.\n opacity: off ? 0.35 : 1,\n }}\n />\n {figures ? (\n <>\n <span style={column ? { flex: 1, textAlign: 'start' } : undefined}>\n {entry.value as ReactNode}\n </span>\n <span\n style={{\n color: TEXT,\n fontWeight: 600,\n fontVariantNumeric: 'tabular-nums',\n textAlign: 'end',\n }}\n >\n {figures.value}\n </span>\n <span\n style={{\n minWidth: column ? '3.5ch' : undefined,\n fontVariantNumeric: 'tabular-nums',\n textAlign: 'end',\n }}\n >\n {figures.share}\n </span>\n </>\n ) : (\n (entry.value as ReactNode)\n )}\n </button>\n </li>\n );\n })}\n </ul>\n);\n\nconst GAP = '1rem';\n\n/**\n * The props of the `<Legend>` of a chart: on `position`, the chips and names\n * of `ChartLegend`, in series order, a `GAP` away from the plot.\n */\nexport const legendProps = (\n position: ChartLegendPosition,\n { hidden, toggle }: ReturnType<typeof useHiddenSeries>\n): LegendProps => ({\n position,\n itemSorter: null,\n wrapperStyle: {\n top: { width: '100%', paddingBottom: GAP },\n bottom: { width: '100%', paddingTop: GAP },\n left: { paddingRight: GAP },\n right: { paddingLeft: GAP },\n }[position],\n content: (\n <ChartLegend\n hidden={hidden}\n onToggle={toggle}\n column={position === 'left' || position === 'right'}\n />\n ),\n});\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkRLHGPHC7_cjs = require('./chunk-RLHGPHC7.cjs');
|
|
5
|
+
|
|
6
|
+
// src/core/categoryAxis.ts
|
|
7
|
+
var MAX_CHARS = 14;
|
|
8
|
+
var trimLabel = (value) => {
|
|
9
|
+
const text = String(value);
|
|
10
|
+
return text.length > MAX_CHARS ? `${text.slice(0, MAX_CHARS - 1)}\u2026` : text;
|
|
11
|
+
};
|
|
12
|
+
var categoryAxis = (categories, title) => {
|
|
13
|
+
const longest = Math.max(0, ...categories.map((c) => String(c).length));
|
|
14
|
+
const tilted = categories.length > 6 && longest > 8;
|
|
15
|
+
const base = title ? 52 : 30;
|
|
16
|
+
return {
|
|
17
|
+
tickFormatter: trimLabel,
|
|
18
|
+
...tilted ? {
|
|
19
|
+
interval: 0,
|
|
20
|
+
angle: -40,
|
|
21
|
+
tick: { ...chunkRLHGPHC7_cjs.AXIS.tick, textAnchor: "end" },
|
|
22
|
+
height: base + Math.round(Math.min(longest, MAX_CHARS) * 4.2)
|
|
23
|
+
} : {}
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
exports.categoryAxis = categoryAxis;
|
|
28
|
+
exports.trimLabel = trimLabel;
|
|
29
|
+
//# sourceMappingURL=chunk-6BKLL7LZ.cjs.map
|
|
30
|
+
//# sourceMappingURL=chunk-6BKLL7LZ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/categoryAxis.ts"],"names":["AXIS"],"mappings":";;;;;;AAEA,IAAM,SAAA,GAAY,EAAA;AAGX,IAAM,SAAA,GAAY,CAAC,KAAA,KAA2B;AACnD,EAAA,MAAM,IAAA,GAAO,OAAO,KAAK,CAAA;AACzB,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,SAAA,GAAY,CAAC,CAAC,CAAA,MAAA,CAAA,GAAM,IAAA;AACxE;AAOO,IAAM,YAAA,GAAe,CAAC,UAAA,EAA0C,KAAA,KAAmB;AACxF,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,CAAE,MAAM,CAAC,CAAA;AACtE,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,OAAA,GAAU,CAAA;AAClD,EAAA,MAAM,IAAA,GAAO,QAAQ,EAAA,GAAK,EAAA;AAC1B,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,SAAA;AAAA,IACf,GAAI,MAAA,GACA;AAAA,MACE,QAAA,EAAU,CAAA;AAAA,MACV,KAAA,EAAO,GAAA;AAAA,MACP,MAAM,EAAE,GAAGA,sBAAA,CAAK,IAAA,EAAM,YAAY,KAAA,EAAM;AAAA,MACxC,MAAA,EAAQ,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,CAAI,OAAA,EAAS,SAAS,CAAA,GAAI,GAAG;AAAA,QAE9D;AAAC,GACP;AACF","file":"chunk-6BKLL7LZ.cjs","sourcesContent":["import { AXIS } from './axes';\n\nconst MAX_CHARS = 14;\n\n/** A category name cut short with an ellipsis; the tooltip keeps the full name. */\nexport const trimLabel = (value: string | number) => {\n const text = String(value);\n return text.length > MAX_CHARS ? `${text.slice(0, MAX_CHARS - 1)}…` : text;\n};\n\n/**\n * The props of a horizontal category `XAxis` that keeps its labels readable:\n * names that would not fit side by side are tilted and cut short, and every one\n * is kept (Recharts would otherwise skip the ones that overlap).\n */\nexport const categoryAxis = (categories: readonly (string | number)[], title?: string) => {\n const longest = Math.max(0, ...categories.map((c) => String(c).length));\n const tilted = categories.length > 6 && longest > 8;\n const base = title ? 52 : 30;\n return {\n tickFormatter: trimLabel,\n ...(tilted\n ? {\n interval: 0,\n angle: -40,\n tick: { ...AXIS.tick, textAnchor: 'end' },\n height: base + Math.round(Math.min(longest, MAX_CHARS) * 4.2),\n }\n : {}),\n } as const;\n};\n"]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkLT3UC65O_cjs = require('./chunk-LT3UC65O.cjs');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
|
|
8
|
+
var frameProps = ({
|
|
9
|
+
height,
|
|
10
|
+
width = "100%",
|
|
11
|
+
ariaLabel,
|
|
12
|
+
keyboard = true
|
|
13
|
+
}) => ({
|
|
14
|
+
responsive: true,
|
|
15
|
+
accessibilityLayer: keyboard,
|
|
16
|
+
...keyboard ? {} : { role: "img" },
|
|
17
|
+
"aria-label": ariaLabel,
|
|
18
|
+
// `maxWidth`: a chart wider than its parent would widen the page.
|
|
19
|
+
style: { width, height, maxWidth: "100%" }
|
|
20
|
+
});
|
|
21
|
+
var useFontsLoaded = () => {
|
|
22
|
+
const [loaded, setLoaded] = react.useState(0);
|
|
23
|
+
react.useEffect(() => {
|
|
24
|
+
const fonts = typeof document === "undefined" ? void 0 : document.fonts;
|
|
25
|
+
if (!fonts?.addEventListener) return;
|
|
26
|
+
let active = true;
|
|
27
|
+
const done = () => {
|
|
28
|
+
if (active) setLoaded(1);
|
|
29
|
+
};
|
|
30
|
+
fonts.addEventListener("loadingdone", done);
|
|
31
|
+
if (fonts.status === "loading") void fonts.ready.then(done);
|
|
32
|
+
return () => {
|
|
33
|
+
active = false;
|
|
34
|
+
fonts.removeEventListener("loadingdone", done);
|
|
35
|
+
};
|
|
36
|
+
}, []);
|
|
37
|
+
return loaded;
|
|
38
|
+
};
|
|
39
|
+
var ChartEmpty = ({ message, ariaLabel, height, width = "100%" }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
40
|
+
"div",
|
|
41
|
+
{
|
|
42
|
+
role: "group",
|
|
43
|
+
"aria-label": ariaLabel,
|
|
44
|
+
"data-chart-empty": "",
|
|
45
|
+
style: {
|
|
46
|
+
display: "flex",
|
|
47
|
+
alignItems: "center",
|
|
48
|
+
justifyContent: "center",
|
|
49
|
+
width,
|
|
50
|
+
height,
|
|
51
|
+
maxWidth: "100%",
|
|
52
|
+
color: chunkLT3UC65O_cjs.MUTED,
|
|
53
|
+
fontSize: "var(--text-sm, 0.875rem)",
|
|
54
|
+
textAlign: "center"
|
|
55
|
+
},
|
|
56
|
+
children: message
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
exports.ChartEmpty = ChartEmpty;
|
|
61
|
+
exports.frameProps = frameProps;
|
|
62
|
+
exports.useFontsLoaded = useFontsLoaded;
|
|
63
|
+
//# sourceMappingURL=chunk-6NRRABPF.cjs.map
|
|
64
|
+
//# sourceMappingURL=chunk-6NRRABPF.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/frame.tsx"],"names":["useState","useEffect","jsx","MUTED"],"mappings":";;;;;;;AAoBO,IAAM,aAAa,CAAC;AAAA,EACzB,MAAA;AAAA,EACA,KAAA,GAAQ,MAAA;AAAA,EACR,SAAA;AAAA,EACA,QAAA,GAAW;AACb,CAAA,MAAqB;AAAA,EACnB,UAAA,EAAY,IAAA;AAAA,EACZ,kBAAA,EAAoB,QAAA;AAAA,EACpB,GAAI,QAAA,GAAW,EAAC,GAAI,EAAE,MAAM,KAAA,EAAM;AAAA,EAClC,YAAA,EAAc,SAAA;AAAA;AAAA,EAEd,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,UAAU,MAAA;AACpC,CAAA;AAWO,IAAM,iBAAiB,MAAa;AACzC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAgB,CAAC,CAAA;AAC7C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,KAAa,WAAA,GAAc,SAAY,QAAA,CAAS,KAAA;AACrE,IAAA,IAAI,CAAC,OAAO,gBAAA,EAAkB;AAC9B,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,IAAI,MAAA,YAAkB,CAAC,CAAA;AAAA,IACzB,CAAA;AACA,IAAA,KAAA,CAAM,gBAAA,CAAiB,eAAe,IAAI,CAAA;AAG1C,IAAA,IAAI,MAAM,MAAA,KAAW,SAAA,OAAgB,KAAA,CAAM,KAAA,CAAM,KAAK,IAAI,CAAA;AAC1D,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,GAAS,KAAA;AACT,MAAA,KAAA,CAAM,mBAAA,CAAoB,eAAe,IAAI,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,OAAO,MAAA;AACT;AASO,IAAM,UAAA,GAAa,CAAC,EAAE,OAAA,EAAS,WAAW,MAAA,EAAQ,KAAA,GAAQ,QAAO,qBACtEC,cAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,IAAA,EAAK,OAAA;AAAA,IACL,YAAA,EAAY,SAAA;AAAA,IACZ,kBAAA,EAAiB,EAAA;AAAA,IACjB,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,KAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAOC,uBAAA;AAAA,MACP,QAAA,EAAU,0BAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACb;AAAA,IAEC,QAAA,EAAA;AAAA;AACH","file":"chunk-6NRRABPF.cjs","sourcesContent":["import { useEffect, useState, type CSSProperties } from 'react';\nimport { MUTED } from './colors';\nimport type { ChartSize } from '../types';\n\ntype FrameOptions = ChartSize & {\n ariaLabel: string;\n /**\n * Tab reaches the chart and the arrow keys walk its points (default). Off,\n * the chart is an image out of the tab order: right for a single value.\n */\n keyboard?: boolean;\n};\n\n/**\n * What every Recharts chart takes on its root, spread onto it: it fills the\n * width it is given (`width` default `100%`) at `height`, and is named by\n * `ariaLabel`. With `accessibilityLayer`, Recharts makes the chart an\n * `application` in the tab order, and the arrow keys move the tooltip from\n * point to point.\n */\nexport const frameProps = ({\n height,\n width = '100%',\n ariaLabel,\n keyboard = true,\n}: FrameOptions) => ({\n responsive: true,\n accessibilityLayer: keyboard,\n ...(keyboard ? {} : { role: 'img' }),\n 'aria-label': ariaLabel,\n // `maxWidth`: a chart wider than its parent would widen the page.\n style: { width, height, maxWidth: '100%' } satisfies CSSProperties,\n});\n\n/**\n * `0` until a web font finishes loading after the chart mounted, then `1`\n * (one more render of the chart, no more). `YAxis width=\"auto\"` measures its\n * labels once, in the fallback font if the web font is not there yet, and a\n * label set in the real font can overrun the axis: `useAxis` (axes.ts) hands\n * the axes a new object when this turns `1`, and they measure again. A chart\n * that mounts with the font ready never changes, and nothing runs where\n * `document.fonts` is missing (SSR, old browsers).\n */\nexport const useFontsLoaded = (): 0 | 1 => {\n const [loaded, setLoaded] = useState<0 | 1>(0);\n useEffect(() => {\n const fonts = typeof document === 'undefined' ? undefined : document.fonts;\n if (!fonts?.addEventListener) return;\n let active = true;\n const done = () => {\n if (active) setLoaded(1);\n };\n fonts.addEventListener('loadingdone', done);\n // A font already loading when the chart mounts: its event may be on its way\n // or already gone, `ready` settles once it has loaded.\n if (fonts.status === 'loading') void fonts.ready.then(done);\n return () => {\n active = false;\n fonts.removeEventListener('loadingdone', done);\n };\n }, []);\n return loaded;\n};\n\ntype EmptyProps = ChartSize & {\n /** Plain text. An empty string draws nothing. */\n message: string;\n ariaLabel: string;\n};\n\n/** What a chart with no data draws in place of its plot: the message, centered, and nothing around it. */\nexport const ChartEmpty = ({ message, ariaLabel, height, width = '100%' }: EmptyProps) => (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n data-chart-empty=\"\"\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width,\n height,\n maxWidth: '100%',\n color: MUTED,\n fontSize: 'var(--text-sm, 0.875rem)',\n textAlign: 'center',\n }}\n >\n {message}\n </div>\n);\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunkLT3UC65O_cjs = require('./chunk-LT3UC65O.cjs');
|
|
5
|
+
|
|
6
|
+
// src/core/gauge.ts
|
|
7
|
+
var percent = (value) => `${value}%`;
|
|
8
|
+
var clampTo = (value, min, max) => Math.min(max, Math.max(min, value));
|
|
9
|
+
var gaugeName = (name, formatted) => `${name}: ${formatted}`;
|
|
10
|
+
var statusColor = (value, warnAt, critAt) => value >= (critAt ?? Infinity) ? chunkLT3UC65O_cjs.STATUS_CRIT : value >= (warnAt ?? Infinity) ? chunkLT3UC65O_cjs.STATUS_WARN : chunkLT3UC65O_cjs.SUCCESS;
|
|
11
|
+
var rangeShare = (value, min, max) => (clampTo(value, min, max) - min) / (max - min);
|
|
12
|
+
var arcMark = ({ cx, cy }, { inner, outer }, share) => {
|
|
13
|
+
const angle = Math.PI * (1 - share);
|
|
14
|
+
const [cos, sin] = [Math.cos(angle), Math.sin(angle)];
|
|
15
|
+
return {
|
|
16
|
+
x1: cx + inner * cos,
|
|
17
|
+
y1: cy - inner * sin,
|
|
18
|
+
x2: cx + outer * cos,
|
|
19
|
+
y2: cy - outer * sin
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
exports.arcMark = arcMark;
|
|
24
|
+
exports.clampTo = clampTo;
|
|
25
|
+
exports.gaugeName = gaugeName;
|
|
26
|
+
exports.percent = percent;
|
|
27
|
+
exports.rangeShare = rangeShare;
|
|
28
|
+
exports.statusColor = statusColor;
|
|
29
|
+
//# sourceMappingURL=chunk-AAYHG7YK.cjs.map
|
|
30
|
+
//# sourceMappingURL=chunk-AAYHG7YK.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/gauge.ts"],"names":["STATUS_CRIT","STATUS_WARN","SUCCESS"],"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,GAChBA,6BAAA,GACA,KAAA,KAAU,MAAA,IAAU,QAAA,CAAA,GAClBC,6BAAA,GACAC;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-AAYHG7YK.cjs","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"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
|
|
4
|
+
// src/core/useElementWidth.ts
|
|
5
|
+
var useElementWidth = () => {
|
|
6
|
+
const [element, ref] = useState(null);
|
|
7
|
+
const [width, setWidth] = useState();
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
if (!element) return;
|
|
10
|
+
const observer = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));
|
|
11
|
+
observer.observe(element);
|
|
12
|
+
return () => observer.disconnect();
|
|
13
|
+
}, [element]);
|
|
14
|
+
return { ref, width };
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export { useElementWidth };
|
|
18
|
+
//# sourceMappingURL=chunk-AOSO5QHL.js.map
|
|
19
|
+
//# sourceMappingURL=chunk-AOSO5QHL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/useElementWidth.ts"],"names":[],"mappings":";;;;AAMO,IAAM,kBAAkB,MAAM;AACnC,EAAA,MAAM,CAAC,OAAA,EAAS,GAAG,CAAA,GAAI,SAA6B,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,EAAiB;AAC3C,EAAA,SAAA,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-AOSO5QHL.js","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,12 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
// src/core/readable.ts
|
|
3
|
+
var LUMINANCE = "calc(0.2126 * r + 0.7152 * g + 0.0722 * b)";
|
|
4
|
+
var CROSSOVER = 0.1791;
|
|
5
|
+
var textOn = (background) => {
|
|
6
|
+
const channel = `clamp(0, calc((${CROSSOVER} - ${LUMINANCE}) * 1000), 1)`;
|
|
7
|
+
return `color(from ${background} srgb-linear ${channel} ${channel} ${channel})`;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { textOn };
|
|
11
|
+
//# sourceMappingURL=chunk-BFEDLXVW.js.map
|
|
12
|
+
//# sourceMappingURL=chunk-BFEDLXVW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/readable.ts"],"names":[],"mappings":";;AAKA,IAAM,SAAA,GAAY,4CAAA;AAGlB,IAAM,SAAA,GAAY,MAAA;AAQX,IAAM,MAAA,GAAS,CAAC,UAAA,KAA+B;AACpD,EAAA,MAAM,OAAA,GAAU,CAAA,eAAA,EAAkB,SAAS,CAAA,GAAA,EAAM,SAAS,CAAA,aAAA,CAAA;AAC1D,EAAA,OAAO,cAAc,UAAU,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAA,EAAI,OAAO,IAAI,OAAO,CAAA,CAAA,CAAA;AAC9E","file":"chunk-BFEDLXVW.js","sourcesContent":["// The color of text on a fill that is only known to the browser: a CSS\n// variable, a `color-mix()` of two of them. No JavaScript can pick it without\n// reading the computed style, so the choice is a CSS relative color.\n\n// Relative luminance (WCAG) of the color, from its linear channels.\nconst LUMINANCE = 'calc(0.2126 * r + 0.7152 * g + 0.0722 * b)';\n// White on a fill darker than this, black on a lighter one: the luminance at\n// which both reach the same contrast, (L + 0.05)² = 0.0525.\nconst CROSSOVER = 0.1791;\n\n/**\n * White or black text, whichever contrasts more with `background` (any CSS\n * color, `var()` and `color-mix()` included): at least 4.58:1 on any fill.\n * A browser that does not know relative colors keeps the text color it\n * inherits.\n */\nexport const textOn = (background: string): string => {\n const channel = `clamp(0, calc((${CROSSOVER} - ${LUMINANCE}) * 1000), 1)`;\n return `color(from ${background} srgb-linear ${channel} ${channel} ${channel})`;\n};\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// src/core/readable.ts
|
|
5
|
+
var LUMINANCE = "calc(0.2126 * r + 0.7152 * g + 0.0722 * b)";
|
|
6
|
+
var CROSSOVER = 0.1791;
|
|
7
|
+
var textOn = (background) => {
|
|
8
|
+
const channel = `clamp(0, calc((${CROSSOVER} - ${LUMINANCE}) * 1000), 1)`;
|
|
9
|
+
return `color(from ${background} srgb-linear ${channel} ${channel} ${channel})`;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
exports.textOn = textOn;
|
|
13
|
+
//# sourceMappingURL=chunk-DBZQI4HM.cjs.map
|
|
14
|
+
//# sourceMappingURL=chunk-DBZQI4HM.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/readable.ts"],"names":[],"mappings":";;;;AAKA,IAAM,SAAA,GAAY,4CAAA;AAGlB,IAAM,SAAA,GAAY,MAAA;AAQX,IAAM,MAAA,GAAS,CAAC,UAAA,KAA+B;AACpD,EAAA,MAAM,OAAA,GAAU,CAAA,eAAA,EAAkB,SAAS,CAAA,GAAA,EAAM,SAAS,CAAA,aAAA,CAAA;AAC1D,EAAA,OAAO,cAAc,UAAU,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAA,EAAI,OAAO,IAAI,OAAO,CAAA,CAAA,CAAA;AAC9E","file":"chunk-DBZQI4HM.cjs","sourcesContent":["// The color of text on a fill that is only known to the browser: a CSS\n// variable, a `color-mix()` of two of them. No JavaScript can pick it without\n// reading the computed style, so the choice is a CSS relative color.\n\n// Relative luminance (WCAG) of the color, from its linear channels.\nconst LUMINANCE = 'calc(0.2126 * r + 0.7152 * g + 0.0722 * b)';\n// White on a fill darker than this, black on a lighter one: the luminance at\n// which both reach the same contrast, (L + 0.05)² = 0.0525.\nconst CROSSOVER = 0.1791;\n\n/**\n * White or black text, whichever contrasts more with `background` (any CSS\n * color, `var()` and `color-mix()` included): at least 4.58:1 on any fill.\n * A browser that does not know relative colors keeps the text color it\n * inherits.\n */\nexport const textOn = (background: string): string => {\n const channel = `clamp(0, calc((${CROSSOVER} - ${LUMINANCE}) * 1000), 1)`;\n return `color(from ${background} srgb-linear ${channel} ${channel} ${channel})`;\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"]}
|