@voila.dev/chart 4.0.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/README.md +85 -0
- package/dist/brush/brush-layer.d.ts +16 -0
- package/dist/brush/brush-layer.d.ts.map +1 -0
- package/dist/brush/brush-layer.js +137 -0
- package/dist/brush/brush-layer.js.map +7 -0
- package/dist/brush/index.d.ts +10 -0
- package/dist/brush/index.d.ts.map +1 -0
- package/dist/brush/index.js +8 -0
- package/dist/brush/index.js.map +7 -0
- package/dist/canvas/canvas-renderer.d.ts +11 -0
- package/dist/canvas/canvas-renderer.d.ts.map +1 -0
- package/dist/canvas/canvas-renderer.js +49 -0
- package/dist/canvas/canvas-renderer.js.map +7 -0
- package/dist/canvas/index.d.ts +2 -0
- package/dist/canvas/index.d.ts.map +1 -0
- package/dist/canvas/index.js +5 -0
- package/dist/canvas/index.js.map +7 -0
- package/dist/canvas/paint-scene.d.ts +4 -0
- package/dist/canvas/paint-scene.d.ts.map +1 -0
- package/dist/canvas/paint-scene.js +130 -0
- package/dist/canvas/paint-scene.js.map +7 -0
- package/dist/canvas/resolve-color.d.ts +18 -0
- package/dist/canvas/resolve-color.d.ts.map +1 -0
- package/dist/canvas/resolve-color.js +52 -0
- package/dist/canvas/resolve-color.js.map +7 -0
- package/dist/contour/density.d.ts +20 -0
- package/dist/contour/density.d.ts.map +1 -0
- package/dist/contour/density.js +59 -0
- package/dist/contour/density.js.map +7 -0
- package/dist/contour/index.d.ts +2 -0
- package/dist/contour/index.d.ts.map +1 -0
- package/dist/contour/index.js +5 -0
- package/dist/contour/index.js.map +7 -0
- package/dist/core/channel.d.ts +11 -0
- package/dist/core/channel.d.ts.map +1 -0
- package/dist/core/channel.js +44 -0
- package/dist/core/channel.js.map +7 -0
- package/dist/core/compile.d.ts +22 -0
- package/dist/core/compile.d.ts.map +1 -0
- package/dist/core/compile.js +295 -0
- package/dist/core/compile.js.map +7 -0
- package/dist/core/define-chart.d.ts +96 -0
- package/dist/core/define-chart.d.ts.map +1 -0
- package/dist/core/define-chart.js +7 -0
- package/dist/core/define-chart.js.map +7 -0
- package/dist/core/facet.d.ts +7 -0
- package/dist/core/facet.d.ts.map +1 -0
- package/dist/core/facet.js +134 -0
- package/dist/core/facet.js.map +7 -0
- package/dist/core/format.d.ts +37 -0
- package/dist/core/format.d.ts.map +1 -0
- package/dist/core/format.js +108 -0
- package/dist/core/format.js.map +7 -0
- package/dist/core/guides/axes.d.ts +25 -0
- package/dist/core/guides/axes.d.ts.map +1 -0
- package/dist/core/guides/axes.js +204 -0
- package/dist/core/guides/axes.js.map +7 -0
- package/dist/core/marks/area.d.ts +23 -0
- package/dist/core/marks/area.d.ts.map +1 -0
- package/dist/core/marks/area.js +187 -0
- package/dist/core/marks/area.js.map +7 -0
- package/dist/core/marks/bar.d.ts +26 -0
- package/dist/core/marks/bar.d.ts.map +1 -0
- package/dist/core/marks/bar.js +200 -0
- package/dist/core/marks/bar.js.map +7 -0
- package/dist/core/marks/cell.d.ts +16 -0
- package/dist/core/marks/cell.d.ts.map +1 -0
- package/dist/core/marks/cell.js +98 -0
- package/dist/core/marks/cell.js.map +7 -0
- package/dist/core/marks/dot.d.ts +17 -0
- package/dist/core/marks/dot.d.ts.map +1 -0
- package/dist/core/marks/dot.js +125 -0
- package/dist/core/marks/dot.js.map +7 -0
- package/dist/core/marks/funnel-layout.d.ts +37 -0
- package/dist/core/marks/funnel-layout.d.ts.map +1 -0
- package/dist/core/marks/funnel-layout.js +61 -0
- package/dist/core/marks/funnel-layout.js.map +7 -0
- package/dist/core/marks/funnel.d.ts +19 -0
- package/dist/core/marks/funnel.d.ts.map +1 -0
- package/dist/core/marks/funnel.js +143 -0
- package/dist/core/marks/funnel.js.map +7 -0
- package/dist/core/marks/line.d.ts +17 -0
- package/dist/core/marks/line.d.ts.map +1 -0
- package/dist/core/marks/line.js +150 -0
- package/dist/core/marks/line.js.map +7 -0
- package/dist/core/marks/polar.d.ts +61 -0
- package/dist/core/marks/polar.d.ts.map +1 -0
- package/dist/core/marks/polar.js +436 -0
- package/dist/core/marks/polar.js.map +7 -0
- package/dist/core/marks/rect.d.ts +22 -0
- package/dist/core/marks/rect.d.ts.map +1 -0
- package/dist/core/marks/rect.js +119 -0
- package/dist/core/marks/rect.js.map +7 -0
- package/dist/core/marks/rule.d.ts +17 -0
- package/dist/core/marks/rule.d.ts.map +1 -0
- package/dist/core/marks/rule.js +73 -0
- package/dist/core/marks/rule.js.map +7 -0
- package/dist/core/marks/shared.d.ts +41 -0
- package/dist/core/marks/shared.d.ts.map +1 -0
- package/dist/core/marks/shared.js +74 -0
- package/dist/core/marks/shared.js.map +7 -0
- package/dist/core/marks/stack.d.ts +13 -0
- package/dist/core/marks/stack.d.ts.map +1 -0
- package/dist/core/marks/stack.js +28 -0
- package/dist/core/marks/stack.js.map +7 -0
- package/dist/core/marks/stats/difference.d.ts +20 -0
- package/dist/core/marks/stats/difference.d.ts.map +1 -0
- package/dist/core/marks/stats/difference.js +168 -0
- package/dist/core/marks/stats/difference.js.map +7 -0
- package/dist/core/marks/stats/distribution.d.ts +41 -0
- package/dist/core/marks/stats/distribution.d.ts.map +1 -0
- package/dist/core/marks/stats/distribution.js +354 -0
- package/dist/core/marks/stats/distribution.js.map +7 -0
- package/dist/core/marks/stats/dodge.d.ts +16 -0
- package/dist/core/marks/stats/dodge.d.ts.map +1 -0
- package/dist/core/marks/stats/dodge.js +104 -0
- package/dist/core/marks/stats/dodge.js.map +7 -0
- package/dist/core/marks/stats/hexbin.d.ts +26 -0
- package/dist/core/marks/stats/hexbin.d.ts.map +1 -0
- package/dist/core/marks/stats/hexbin.js +113 -0
- package/dist/core/marks/stats/hexbin.js.map +7 -0
- package/dist/core/marks/stats/histogram.d.ts +27 -0
- package/dist/core/marks/stats/histogram.d.ts.map +1 -0
- package/dist/core/marks/stats/histogram.js +70 -0
- package/dist/core/marks/stats/histogram.js.map +7 -0
- package/dist/core/marks/stats/regression.d.ts +13 -0
- package/dist/core/marks/stats/regression.d.ts.map +1 -0
- package/dist/core/marks/stats/regression.js +80 -0
- package/dist/core/marks/stats/regression.js.map +7 -0
- package/dist/core/marks/stats/statistics.d.ts +34 -0
- package/dist/core/marks/stats/statistics.d.ts.map +1 -0
- package/dist/core/marks/stats/statistics.js +111 -0
- package/dist/core/marks/stats/statistics.js.map +7 -0
- package/dist/core/marks/stats/waffle.d.ts +18 -0
- package/dist/core/marks/stats/waffle.d.ts.map +1 -0
- package/dist/core/marks/stats/waffle.js +117 -0
- package/dist/core/marks/stats/waffle.js.map +7 -0
- package/dist/core/marks/text.d.ts +19 -0
- package/dist/core/marks/text.d.ts.map +1 -0
- package/dist/core/marks/text.js +60 -0
- package/dist/core/marks/text.js.map +7 -0
- package/dist/core/motion/tween.d.ts +6 -0
- package/dist/core/motion/tween.d.ts.map +1 -0
- package/dist/core/motion/tween.js +98 -0
- package/dist/core/motion/tween.js.map +7 -0
- package/dist/core/nearest.d.ts +25 -0
- package/dist/core/nearest.d.ts.map +1 -0
- package/dist/core/nearest.js +151 -0
- package/dist/core/nearest.js.map +7 -0
- package/dist/core/paths.d.ts +65 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +192 -0
- package/dist/core/paths.js.map +7 -0
- package/dist/core/scales/color.d.ts +11 -0
- package/dist/core/scales/color.d.ts.map +1 -0
- package/dist/core/scales/color.js +35 -0
- package/dist/core/scales/color.js.map +7 -0
- package/dist/core/scales/continuous.d.ts +18 -0
- package/dist/core/scales/continuous.d.ts.map +1 -0
- package/dist/core/scales/continuous.js +82 -0
- package/dist/core/scales/continuous.js.map +7 -0
- package/dist/core/scales/discrete.d.ts +22 -0
- package/dist/core/scales/discrete.d.ts.map +1 -0
- package/dist/core/scales/discrete.js +103 -0
- package/dist/core/scales/discrete.js.map +7 -0
- package/dist/core/scales/resolve.d.ts +18 -0
- package/dist/core/scales/resolve.d.ts.map +1 -0
- package/dist/core/scales/resolve.js +112 -0
- package/dist/core/scales/resolve.js.map +7 -0
- package/dist/core/scales/time.d.ts +4 -0
- package/dist/core/scales/time.d.ts.map +1 -0
- package/dist/core/scales/time.js +140 -0
- package/dist/core/scales/time.js.map +7 -0
- package/dist/core/text.d.ts +3 -0
- package/dist/core/text.d.ts.map +1 -0
- package/dist/core/text.js +29 -0
- package/dist/core/text.js.map +7 -0
- package/dist/core/theme.d.ts +8 -0
- package/dist/core/theme.d.ts.map +1 -0
- package/dist/core/theme.js +21 -0
- package/dist/core/theme.js.map +7 -0
- package/dist/core/ticks.d.ts +27 -0
- package/dist/core/ticks.d.ts.map +1 -0
- package/dist/core/ticks.js +76 -0
- package/dist/core/ticks.js.map +7 -0
- package/dist/core/types.d.ts +305 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +1 -0
- package/dist/core/types.js.map +7 -0
- package/dist/force/force.d.ts +30 -0
- package/dist/force/force.d.ts.map +1 -0
- package/dist/force/force.js +143 -0
- package/dist/force/force.js.map +7 -0
- package/dist/force/index.d.ts +2 -0
- package/dist/force/index.d.ts.map +1 -0
- package/dist/force/index.js +7 -0
- package/dist/force/index.js.map +7 -0
- package/dist/geo/geo.d.ts +59 -0
- package/dist/geo/geo.d.ts.map +1 -0
- package/dist/geo/geo.js +231 -0
- package/dist/geo/geo.js.map +7 -0
- package/dist/geo/index.d.ts +2 -0
- package/dist/geo/index.d.ts.map +1 -0
- package/dist/geo/index.js +13 -0
- package/dist/geo/index.js.map +7 -0
- package/dist/hierarchy/hierarchy.d.ts +24 -0
- package/dist/hierarchy/hierarchy.d.ts.map +1 -0
- package/dist/hierarchy/hierarchy.js +279 -0
- package/dist/hierarchy/hierarchy.js.map +7 -0
- package/dist/hierarchy/index.d.ts +2 -0
- package/dist/hierarchy/index.d.ts.map +1 -0
- package/dist/hierarchy/index.js +11 -0
- package/dist/hierarchy/index.js.map +7 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +96 -0
- package/dist/index.js.map +7 -0
- package/dist/react/brush-contract.d.ts +23 -0
- package/dist/react/brush-contract.d.ts.map +1 -0
- package/dist/react/brush-contract.js +7 -0
- package/dist/react/brush-contract.js.map +7 -0
- package/dist/react/chart-data-table.d.ts +18 -0
- package/dist/react/chart-data-table.d.ts.map +1 -0
- package/dist/react/chart-data-table.js +55 -0
- package/dist/react/chart-data-table.js.map +7 -0
- package/dist/react/chart-legend.d.ts +17 -0
- package/dist/react/chart-legend.d.ts.map +1 -0
- package/dist/react/chart-legend.js +126 -0
- package/dist/react/chart-legend.js.map +7 -0
- package/dist/react/chart-tooltip.d.ts +18 -0
- package/dist/react/chart-tooltip.d.ts.map +1 -0
- package/dist/react/chart-tooltip.js +95 -0
- package/dist/react/chart-tooltip.js.map +7 -0
- package/dist/react/chart.d.ts +45 -0
- package/dist/react/chart.d.ts.map +1 -0
- package/dist/react/chart.js +383 -0
- package/dist/react/chart.js.map +7 -0
- package/dist/react/focus-overlay.d.ts +14 -0
- package/dist/react/focus-overlay.d.ts.map +1 -0
- package/dist/react/focus-overlay.js +147 -0
- package/dist/react/focus-overlay.js.map +7 -0
- package/dist/react/index.d.ts +7 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +11 -0
- package/dist/react/index.js.map +7 -0
- package/dist/react/messages.d.ts +16 -0
- package/dist/react/messages.d.ts.map +1 -0
- package/dist/react/messages.js +33 -0
- package/dist/react/messages.js.map +7 -0
- package/dist/react/renderer.d.ts +14 -0
- package/dist/react/renderer.d.ts.map +1 -0
- package/dist/react/renderer.js +1 -0
- package/dist/react/renderer.js.map +7 -0
- package/dist/react/sr-only.d.ts +4 -0
- package/dist/react/sr-only.d.ts.map +1 -0
- package/dist/react/sr-only.js +15 -0
- package/dist/react/sr-only.js.map +7 -0
- package/dist/react/svg-renderer.d.ts +4 -0
- package/dist/react/svg-renderer.d.ts.map +1 -0
- package/dist/react/svg-renderer.js +20 -0
- package/dist/react/svg-renderer.js.map +7 -0
- package/dist/react/svg-scene.d.ts +8 -0
- package/dist/react/svg-scene.d.ts.map +1 -0
- package/dist/react/svg-scene.js +121 -0
- package/dist/react/svg-scene.js.map +7 -0
- package/dist/react/use-animated-scene.d.ts +10 -0
- package/dist/react/use-animated-scene.d.ts.map +1 -0
- package/dist/react/use-animated-scene.js +41 -0
- package/dist/react/use-animated-scene.js.map +7 -0
- package/dist/react/use-chart-focus.d.ts +29 -0
- package/dist/react/use-chart-focus.d.ts.map +1 -0
- package/dist/react/use-chart-focus.js +180 -0
- package/dist/react/use-chart-focus.js.map +7 -0
- package/dist/react/use-chart-width.d.ts +12 -0
- package/dist/react/use-chart-width.d.ts.map +1 -0
- package/dist/react/use-chart-width.js +23 -0
- package/dist/react/use-chart-width.js.map +7 -0
- package/dist/react/use-chart-zoom.d.ts +13 -0
- package/dist/react/use-chart-zoom.d.ts.map +1 -0
- package/dist/react/use-chart-zoom.js +52 -0
- package/dist/react/use-chart-zoom.js.map +7 -0
- package/dist/react/use-text-measurer.d.ts +8 -0
- package/dist/react/use-text-measurer.d.ts.map +1 -0
- package/dist/react/use-text-measurer.js +44 -0
- package/dist/react/use-text-measurer.js.map +7 -0
- package/dist/sankey/index.d.ts +2 -0
- package/dist/sankey/index.d.ts.map +1 -0
- package/dist/sankey/index.js +7 -0
- package/dist/sankey/index.js.map +7 -0
- package/dist/sankey/sankey.d.ts +29 -0
- package/dist/sankey/sankey.d.ts.map +1 -0
- package/dist/sankey/sankey.js +127 -0
- package/dist/sankey/sankey.js.map +7 -0
- package/dist/voronoi/index.d.ts +2 -0
- package/dist/voronoi/index.d.ts.map +1 -0
- package/dist/voronoi/index.js +5 -0
- package/dist/voronoi/index.js.map +7 -0
- package/dist/voronoi/voronoi.d.ts +16 -0
- package/dist/voronoi/voronoi.d.ts.map +1 -0
- package/dist/voronoi/voronoi.js +62 -0
- package/dist/voronoi/voronoi.js.map +7 -0
- package/package.json +74 -0
- package/src/brush/brush-layer.tsx +174 -0
- package/src/brush/index.ts +14 -0
- package/src/canvas/canvas-renderer.tsx +56 -0
- package/src/canvas/index.ts +1 -0
- package/src/canvas/paint-scene.ts +152 -0
- package/src/canvas/resolve-color.ts +65 -0
- package/src/contour/density.ts +90 -0
- package/src/contour/index.ts +1 -0
- package/src/core/channel.ts +53 -0
- package/src/core/compile.ts +436 -0
- package/src/core/define-chart.ts +128 -0
- package/src/core/facet.ts +189 -0
- package/src/core/format.ts +163 -0
- package/src/core/guides/axes.ts +283 -0
- package/src/core/marks/area.ts +238 -0
- package/src/core/marks/bar.ts +278 -0
- package/src/core/marks/cell.ts +123 -0
- package/src/core/marks/dot.ts +157 -0
- package/src/core/marks/funnel-layout.ts +113 -0
- package/src/core/marks/funnel.ts +172 -0
- package/src/core/marks/line.ts +206 -0
- package/src/core/marks/polar.ts +568 -0
- package/src/core/marks/rect.ts +156 -0
- package/src/core/marks/rule.ts +104 -0
- package/src/core/marks/shared.ts +134 -0
- package/src/core/marks/stack.ts +42 -0
- package/src/core/marks/stats/difference.ts +205 -0
- package/src/core/marks/stats/distribution.ts +425 -0
- package/src/core/marks/stats/dodge.ts +136 -0
- package/src/core/marks/stats/hexbin.ts +152 -0
- package/src/core/marks/stats/histogram.ts +108 -0
- package/src/core/marks/stats/regression.ts +108 -0
- package/src/core/marks/stats/statistics.ts +153 -0
- package/src/core/marks/stats/waffle.ts +141 -0
- package/src/core/marks/text.ts +97 -0
- package/src/core/motion/tween.ts +131 -0
- package/src/core/nearest.ts +223 -0
- package/src/core/paths.ts +323 -0
- package/src/core/scales/color.ts +51 -0
- package/src/core/scales/continuous.ts +111 -0
- package/src/core/scales/discrete.ts +156 -0
- package/src/core/scales/resolve.ts +158 -0
- package/src/core/scales/time.ts +180 -0
- package/src/core/text.ts +42 -0
- package/src/core/theme.ts +26 -0
- package/src/core/ticks.ts +118 -0
- package/src/core/types.ts +358 -0
- package/src/force/force.ts +200 -0
- package/src/force/index.ts +6 -0
- package/src/geo/geo.ts +346 -0
- package/src/geo/index.ts +10 -0
- package/src/hierarchy/hierarchy.ts +377 -0
- package/src/hierarchy/index.ts +6 -0
- package/src/index.ts +70 -0
- package/src/react/brush-contract.ts +35 -0
- package/src/react/chart-data-table.tsx +98 -0
- package/src/react/chart-legend.tsx +130 -0
- package/src/react/chart-tooltip.tsx +111 -0
- package/src/react/chart.tsx +489 -0
- package/src/react/focus-overlay.tsx +164 -0
- package/src/react/index.ts +9 -0
- package/src/react/messages.ts +49 -0
- package/src/react/renderer.ts +15 -0
- package/src/react/sr-only.ts +14 -0
- package/src/react/svg-renderer.tsx +18 -0
- package/src/react/svg-scene.tsx +146 -0
- package/src/react/use-animated-scene.ts +57 -0
- package/src/react/use-chart-focus.ts +245 -0
- package/src/react/use-chart-width.ts +27 -0
- package/src/react/use-chart-zoom.ts +67 -0
- package/src/react/use-text-measurer.ts +49 -0
- package/src/sankey/index.ts +6 -0
- package/src/sankey/sankey.ts +179 -0
- package/src/voronoi/index.ts +1 -0
- package/src/voronoi/voronoi.ts +84 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/react/focus-overlay.tsx"],
|
|
4
|
+
"sourcesContent": ["import type * as React from \"react\";\nimport { arcPath, roundedBarPath } from \"#/core/paths.ts\";\nimport type { ChartPoint, ChartScene, ChartTheme } from \"#/core/types.ts\";\nimport type { ActiveFocus } from \"#/react/use-chart-focus.ts\";\n\nconst RING_RADIUS = 4.5;\nconst RING_OUTSET = 2;\n\nfunction PointRing({\n\tpoint,\n\tkeyboard,\n\ttheme,\n}: {\n\tpoint: ChartPoint;\n\tkeyboard: boolean;\n\ttheme: ChartTheme;\n}) {\n\tconst ring = keyboard ? \"var(--ring, Highlight)\" : theme.background;\n\tif (point.hit?.kind === \"rect\" && point.hit.rect.width > RING_RADIUS * 4) {\n\t\tif (!keyboard) {\n\t\t\treturn null;\n\t\t}\n\t\tconst { rect } = point.hit;\n\t\treturn (\n\t\t\t<path\n\t\t\t\tdata-slot=\"chart-focus-ring\"\n\t\t\t\td={roundedBarPath({\n\t\t\t\t\tx: rect.x - RING_OUTSET,\n\t\t\t\t\ty: rect.y - RING_OUTSET,\n\t\t\t\t\twidth: rect.width + RING_OUTSET * 2,\n\t\t\t\t\theight: rect.height + RING_OUTSET * 2,\n\t\t\t\t\tradius: 4,\n\t\t\t\t})}\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={ring}\n\t\t\t\tstrokeWidth={2}\n\t\t\t/>\n\t\t);\n\t}\n\tif (point.hit?.kind === \"arc\") {\n\t\treturn (\n\t\t\t<path\n\t\t\t\tdata-slot=\"chart-focus-ring\"\n\t\t\t\td={arcPath({\n\t\t\t\t\t...point.hit,\n\t\t\t\t\touterRadius: point.hit.outerRadius + RING_OUTSET,\n\t\t\t\t})}\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke={keyboard ? ring : theme.foreground}\n\t\t\t\tstrokeWidth={2}\n\t\t\t/>\n\t\t);\n\t}\n\treturn (\n\t\t<circle\n\t\t\tdata-slot=\"chart-focus-ring\"\n\t\t\tcx={point.x}\n\t\t\tcy={point.y}\n\t\t\tr={RING_RADIUS}\n\t\t\tfill={point.color}\n\t\t\tstroke={ring}\n\t\t\tstrokeWidth={2}\n\t\t/>\n\t);\n}\n\n/**\n * The focus layer, drawn over the marks whichever renderer drew them: the\n * column or row band under the pointer, and a ring on the focused point.\n * Hidden from assistive tech: the live region says what it shows.\n */\nexport function FocusOverlay({\n\tscene,\n\tactive,\n\ttheme,\n}: {\n\tscene: ChartScene;\n\tactive: ActiveFocus | null;\n\ttheme: ChartTheme;\n}) {\n\tif (active === null) {\n\t\treturn null;\n\t}\n\tconst { focusOrder, scales } = scene;\n\t// On a faceted chart the cursor spans the focused point's own cell.\n\tconst plot =\n\t\tscene.cells?.find((cell) => cell.key === active.point.facet)?.plot ??\n\t\tscene.plot;\n\tconst keyboard = active.source === \"keyboard\";\n\tconst along = focusOrder === \"y\" ? scales.y : scales.x;\n\tconst band = along?.kind === \"band\" ? along.bandwidth : 0;\n\tlet cursor: React.ReactNode = null;\n\tif (focusOrder !== \"point\") {\n\t\tcursor =\n\t\t\tband > 0 ? (\n\t\t\t\t<rect\n\t\t\t\t\tdata-slot=\"chart-cursor\"\n\t\t\t\t\t{...(focusOrder === \"y\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx: plot.x,\n\t\t\t\t\t\t\t\ty: active.stop.at - band / 2,\n\t\t\t\t\t\t\t\twidth: plot.width,\n\t\t\t\t\t\t\t\theight: band,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx: active.stop.at - band / 2,\n\t\t\t\t\t\t\t\ty: plot.y,\n\t\t\t\t\t\t\t\twidth: band,\n\t\t\t\t\t\t\t\theight: plot.height,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\topacity={0.06}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<line\n\t\t\t\t\tdata-slot=\"chart-cursor\"\n\t\t\t\t\t{...(focusOrder === \"y\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tx1: plot.x,\n\t\t\t\t\t\t\t\tx2: plot.x + plot.width,\n\t\t\t\t\t\t\t\ty1: active.stop.at,\n\t\t\t\t\t\t\t\ty2: active.stop.at,\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\tx1: active.stop.at,\n\t\t\t\t\t\t\t\tx2: active.stop.at,\n\t\t\t\t\t\t\t\ty1: plot.y,\n\t\t\t\t\t\t\t\ty2: plot.y + plot.height,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\tstroke={theme.muted}\n\t\t\t\t\tstrokeWidth={1}\n\t\t\t\t\tstrokeDasharray=\"3 3\"\n\t\t\t\t/>\n\t\t\t);\n\t}\n\tconst ringed =\n\t\tfocusOrder === \"point\" || (keyboard && active.stop.points.length > 1)\n\t\t\t? [active.point]\n\t\t\t: active.stop.points;\n\treturn (\n\t\t<svg\n\t\t\taria-hidden=\"true\"\n\t\t\tdata-slot=\"chart-focus\"\n\t\t\twidth={scene.width}\n\t\t\theight={scene.height}\n\t\t\tstyle={{\n\t\t\t\tposition: \"absolute\",\n\t\t\t\tinset: 0,\n\t\t\t\toverflow: \"visible\",\n\t\t\t\tpointerEvents: \"none\",\n\t\t\t}}\n\t\t>\n\t\t\t{cursor}\n\t\t\t{ringed.map((point) => (\n\t\t\t\t<PointRing\n\t\t\t\t\tkey={point.key}\n\t\t\t\t\tpoint={point}\n\t\t\t\t\tkeyboard={keyboard}\n\t\t\t\t\ttheme={theme}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</svg>\n\t);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { ChartBrush, ChartBrushRange } from "./brush-contract.js";
|
|
2
|
+
export { Chart } from "./chart.js";
|
|
3
|
+
export { ChartTooltipContent, type ChartTooltipRenderProps, } from "./chart-tooltip.js";
|
|
4
|
+
export type { ChartRenderer, ChartRendererProps } from "./renderer.js";
|
|
5
|
+
export { SvgRenderer } from "./svg-renderer.js";
|
|
6
|
+
export type { ActiveFocus } from "./use-chart-focus.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EACN,mBAAmB,EACnB,KAAK,uBAAuB,GAC5B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/react/index.ts"],
|
|
4
|
+
"sourcesContent": ["export type { ChartBrush, ChartBrushRange } from \"#/react/brush-contract.ts\";\nexport { Chart } from \"#/react/chart.tsx\";\nexport {\n\tChartTooltipContent,\n\ttype ChartTooltipRenderProps,\n} from \"#/react/chart-tooltip.tsx\";\nexport type { ChartRenderer, ChartRendererProps } from \"#/react/renderer.ts\";\nexport { SvgRenderer } from \"#/react/svg-renderer.tsx\";\nexport type { ActiveFocus } from \"#/react/use-chart-focus.ts\";\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,aAAa;AACtB;AAAA,EACC;AAAA,OAEM;AAEP,SAAS,mBAAmB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** The few words the chart says itself. French when the chart's locale is, English otherwise. */
|
|
2
|
+
export interface ChartMessages {
|
|
3
|
+
readonly keyboardHint: string;
|
|
4
|
+
readonly roleDescription: string;
|
|
5
|
+
readonly legend: string;
|
|
6
|
+
readonly series: string;
|
|
7
|
+
readonly resetZoom: string;
|
|
8
|
+
readonly showing: (from: string, to: string) => string;
|
|
9
|
+
readonly zoomHint: string;
|
|
10
|
+
readonly brushStart: string;
|
|
11
|
+
readonly brushEnd: string;
|
|
12
|
+
readonly selected: (from: string, to: string) => string;
|
|
13
|
+
readonly dataTable: (label: string) => string;
|
|
14
|
+
}
|
|
15
|
+
export declare function messagesFor(locale: string): ChartMessages;
|
|
16
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/react/messages.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AAiCD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAEzD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const FRENCH = {
|
|
2
|
+
keyboardHint: "Fl\xE8ches pour parcourir les valeurs, Entr\xE9e pour \xE9pingler, \xC9chap pour quitter.",
|
|
3
|
+
roleDescription: "graphique",
|
|
4
|
+
legend: "L\xE9gende",
|
|
5
|
+
series: "S\xE9rie",
|
|
6
|
+
resetZoom: "R\xE9initialiser le zoom",
|
|
7
|
+
showing: (from, to) => `Affich\xE9 : ${from} \u2013 ${to}`,
|
|
8
|
+
zoomHint: " + et \u2212 pour zoomer, Maj et fl\xE8ches pour se d\xE9placer, 0 pour revenir.",
|
|
9
|
+
brushStart: "D\xE9but de la s\xE9lection",
|
|
10
|
+
brushEnd: "Fin de la s\xE9lection",
|
|
11
|
+
selected: (from, to) => `S\xE9lection : ${from} \u2013 ${to}`,
|
|
12
|
+
dataTable: (label) => `Donn\xE9es : ${label}`
|
|
13
|
+
};
|
|
14
|
+
const ENGLISH = {
|
|
15
|
+
keyboardHint: "Arrow keys to move through the values, Enter to pin, Escape to leave.",
|
|
16
|
+
roleDescription: "chart",
|
|
17
|
+
legend: "Legend",
|
|
18
|
+
series: "Series",
|
|
19
|
+
resetZoom: "Reset zoom",
|
|
20
|
+
showing: (from, to) => `Showing ${from} \u2013 ${to}`,
|
|
21
|
+
zoomHint: " + and \u2212 to zoom, Shift and the arrows to pan, 0 to reset.",
|
|
22
|
+
brushStart: "Selection start",
|
|
23
|
+
brushEnd: "Selection end",
|
|
24
|
+
selected: (from, to) => `Selected ${from} \u2013 ${to}`,
|
|
25
|
+
dataTable: (label) => `Data: ${label}`
|
|
26
|
+
};
|
|
27
|
+
function messagesFor(locale) {
|
|
28
|
+
return locale.toLowerCase().startsWith("fr") ? FRENCH : ENGLISH;
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
messagesFor
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/react/messages.ts"],
|
|
4
|
+
"sourcesContent": ["/** The few words the chart says itself. French when the chart's locale is, English otherwise. */\nexport interface ChartMessages {\n\treadonly keyboardHint: string;\n\treadonly roleDescription: string;\n\treadonly legend: string;\n\treadonly series: string;\n\treadonly resetZoom: string;\n\treadonly showing: (from: string, to: string) => string;\n\treadonly zoomHint: string;\n\treadonly brushStart: string;\n\treadonly brushEnd: string;\n\treadonly selected: (from: string, to: string) => string;\n\treadonly dataTable: (label: string) => string;\n}\n\nconst FRENCH: ChartMessages = {\n\tkeyboardHint:\n\t\t\"Fl\u00E8ches pour parcourir les valeurs, Entr\u00E9e pour \u00E9pingler, \u00C9chap pour quitter.\",\n\troleDescription: \"graphique\",\n\tlegend: \"L\u00E9gende\",\n\tseries: \"S\u00E9rie\",\n\tresetZoom: \"R\u00E9initialiser le zoom\",\n\tshowing: (from, to) => `Affich\u00E9 : ${from} \u2013 ${to}`,\n\tzoomHint:\n\t\t\" + et \u2212 pour zoomer, Maj et fl\u00E8ches pour se d\u00E9placer, 0 pour revenir.\",\n\tbrushStart: \"D\u00E9but de la s\u00E9lection\",\n\tbrushEnd: \"Fin de la s\u00E9lection\",\n\tselected: (from, to) => `S\u00E9lection : ${from} \u2013 ${to}`,\n\tdataTable: (label) => `Donn\u00E9es : ${label}`,\n};\n\nconst ENGLISH: ChartMessages = {\n\tkeyboardHint:\n\t\t\"Arrow keys to move through the values, Enter to pin, Escape to leave.\",\n\troleDescription: \"chart\",\n\tlegend: \"Legend\",\n\tseries: \"Series\",\n\tresetZoom: \"Reset zoom\",\n\tshowing: (from, to) => `Showing ${from} \u2013 ${to}`,\n\tzoomHint: \" + and \u2212 to zoom, Shift and the arrows to pan, 0 to reset.\",\n\tbrushStart: \"Selection start\",\n\tbrushEnd: \"Selection end\",\n\tselected: (from, to) => `Selected ${from} \u2013 ${to}`,\n\tdataTable: (label) => `Data: ${label}`,\n};\n\nexport function messagesFor(locale: string): ChartMessages {\n\treturn locale.toLowerCase().startsWith(\"fr\") ? FRENCH : ENGLISH;\n}\n"],
|
|
5
|
+
"mappings": "AAeA,MAAM,SAAwB;AAAA,EAC7B,cACC;AAAA,EACD,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS,CAAC,MAAM,OAAO,gBAAa,IAAI,WAAM,EAAE;AAAA,EAChD,UACC;AAAA,EACD,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU,CAAC,MAAM,OAAO,kBAAe,IAAI,WAAM,EAAE;AAAA,EACnD,WAAW,CAAC,UAAU,gBAAa,KAAK;AACzC;AAEA,MAAM,UAAyB;AAAA,EAC9B,cACC;AAAA,EACD,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS,CAAC,MAAM,OAAO,WAAW,IAAI,WAAM,EAAE;AAAA,EAC9C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU,CAAC,MAAM,OAAO,YAAY,IAAI,WAAM,EAAE;AAAA,EAChD,WAAW,CAAC,UAAU,SAAS,KAAK;AACrC;AAEO,SAAS,YAAY,QAA+B;AAC1D,SAAO,OAAO,YAAY,EAAE,WAAW,IAAI,IAAI,SAAS;AACzD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import type { ChartScene } from "../core/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* What draws the scene. The SVG renderer is the default; `@voila.dev/chart/canvas`
|
|
5
|
+
* exports one that paints the same scene onto a canvas, for thousands of marks.
|
|
6
|
+
* Either way the focus ring, tooltip, legend and data table are the same.
|
|
7
|
+
*/
|
|
8
|
+
export interface ChartRendererProps {
|
|
9
|
+
readonly scene: ChartScene;
|
|
10
|
+
/** Unique per chart, for clip-path ids. */
|
|
11
|
+
readonly chartId: string;
|
|
12
|
+
}
|
|
13
|
+
export type ChartRenderer = React.ComponentType<ChartRendererProps>;
|
|
14
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/react/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sr-only.d.ts","sourceRoot":"","sources":["../../src/react/sr-only.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,sFAAsF;AACtF,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,aAU3B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const SR_ONLY = {
|
|
2
|
+
position: "absolute",
|
|
3
|
+
width: 1,
|
|
4
|
+
height: 1,
|
|
5
|
+
padding: 0,
|
|
6
|
+
margin: -1,
|
|
7
|
+
overflow: "hidden",
|
|
8
|
+
clip: "rect(0, 0, 0, 0)",
|
|
9
|
+
whiteSpace: "nowrap",
|
|
10
|
+
border: 0
|
|
11
|
+
};
|
|
12
|
+
export {
|
|
13
|
+
SR_ONLY
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=sr-only.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/react/sr-only.ts"],
|
|
4
|
+
"sourcesContent": ["import type * as React from \"react\";\n\n/** Present to assistive tech, invisible on screen, and never wider than one pixel. */\nexport const SR_ONLY: React.CSSProperties = {\n\tposition: \"absolute\",\n\twidth: 1,\n\theight: 1,\n\tpadding: 0,\n\tmargin: -1,\n\toverflow: \"hidden\",\n\tclip: \"rect(0, 0, 0, 0)\",\n\twhiteSpace: \"nowrap\",\n\tborder: 0,\n};\n"],
|
|
5
|
+
"mappings": "AAGO,MAAM,UAA+B;AAAA,EAC3C,UAAU;AAAA,EACV,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,QAAQ;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ChartRendererProps } from "./renderer.js";
|
|
2
|
+
/** The default renderer: the scene as inline SVG, server-renderable and crisp at any zoom. */
|
|
3
|
+
export declare function SvgRenderer({ scene, chartId }: ChartRendererProps): import("react").JSX.Element;
|
|
4
|
+
//# sourceMappingURL=svg-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-renderer.d.ts","sourceRoot":"","sources":["../../src/react/svg-renderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,kBAAkB,+BAajE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { SvgSceneNodes } from "./svg-scene.js";
|
|
3
|
+
function SvgRenderer({ scene, chartId }) {
|
|
4
|
+
return /* @__PURE__ */ jsx(
|
|
5
|
+
"svg",
|
|
6
|
+
{
|
|
7
|
+
"data-slot": "chart-svg",
|
|
8
|
+
"aria-hidden": "true",
|
|
9
|
+
width: scene.width,
|
|
10
|
+
height: scene.height,
|
|
11
|
+
viewBox: `0 0 ${scene.width} ${scene.height}`,
|
|
12
|
+
style: { position: "absolute", inset: 0, overflow: "visible" },
|
|
13
|
+
children: /* @__PURE__ */ jsx(SvgSceneNodes, { scene, clipPrefix: chartId })
|
|
14
|
+
}
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
SvgRenderer
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=svg-renderer.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/react/svg-renderer.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { ChartRendererProps } from \"#/react/renderer.ts\";\nimport { SvgSceneNodes } from \"#/react/svg-scene.tsx\";\n\n/** The default renderer: the scene as inline SVG, server-renderable and crisp at any zoom. */\nexport function SvgRenderer({ scene, chartId }: ChartRendererProps) {\n\treturn (\n\t\t<svg\n\t\t\tdata-slot=\"chart-svg\"\n\t\t\taria-hidden=\"true\"\n\t\t\twidth={scene.width}\n\t\t\theight={scene.height}\n\t\t\tviewBox={`0 0 ${scene.width} ${scene.height}`}\n\t\t\tstyle={{ position: \"absolute\", inset: 0, overflow: \"visible\" }}\n\t\t>\n\t\t\t<SvgSceneNodes scene={scene} clipPrefix={chartId} />\n\t\t</svg>\n\t);\n}\n"],
|
|
5
|
+
"mappings": "AAcG;AAbH,SAAS,qBAAqB;AAGvB,SAAS,YAAY,EAAE,OAAO,QAAQ,GAAuB;AACnE,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,eAAY;AAAA,MACZ,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,SAAS,OAAO,MAAM,KAAK,IAAI,MAAM,MAAM;AAAA,MAC3C,OAAO,EAAE,UAAU,YAAY,OAAO,GAAG,UAAU,UAAU;AAAA,MAE7D,8BAAC,iBAAc,OAAc,YAAY,SAAS;AAAA;AAAA,EACnD;AAEF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
import type { ChartScene } from "../core/types.js";
|
|
3
|
+
/** The scene's nodes as SVG elements, keyed so React reconciles a data update in place. */
|
|
4
|
+
export declare function SvgSceneNodes({ scene, clipPrefix, }: {
|
|
5
|
+
scene: ChartScene;
|
|
6
|
+
clipPrefix: string;
|
|
7
|
+
}): React.JSX.Element[];
|
|
8
|
+
//# sourceMappingURL=svg-scene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-scene.d.ts","sourceRoot":"","sources":["../../src/react/svg-scene.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,OAAO,KAAK,EAEX,UAAU,EAGV,MAAM,iBAAiB,CAAC;AA+HzB,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,EAC7B,KAAK,EACL,UAAU,GACV,EAAE;IACF,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACnB,uBAIA"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { roundedBarPath } from "../core/paths.js";
|
|
3
|
+
const BASELINE = {
|
|
4
|
+
top: "hanging",
|
|
5
|
+
middle: "central",
|
|
6
|
+
bottom: "text-after-edge",
|
|
7
|
+
alphabetic: "alphabetic"
|
|
8
|
+
};
|
|
9
|
+
function paintProps(paint) {
|
|
10
|
+
return {
|
|
11
|
+
fill: paint.fill ?? "none",
|
|
12
|
+
stroke: paint.stroke,
|
|
13
|
+
strokeWidth: paint.strokeWidth,
|
|
14
|
+
strokeDasharray: paint.strokeDasharray,
|
|
15
|
+
strokeLinecap: paint.strokeLinecap,
|
|
16
|
+
strokeLinejoin: paint.strokeLinejoin,
|
|
17
|
+
opacity: paint.opacity,
|
|
18
|
+
fillOpacity: paint.fillOpacity,
|
|
19
|
+
strokeOpacity: paint.strokeOpacity
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function SceneElement({
|
|
23
|
+
node,
|
|
24
|
+
clipPrefix
|
|
25
|
+
}) {
|
|
26
|
+
const data = { "data-role": node.role, "data-series": node.series };
|
|
27
|
+
switch (node.kind) {
|
|
28
|
+
case "group": {
|
|
29
|
+
const clipId = node.clip ? `${clipPrefix}-${node.key}` : void 0;
|
|
30
|
+
return /* @__PURE__ */ jsxs(
|
|
31
|
+
"g",
|
|
32
|
+
{
|
|
33
|
+
...data,
|
|
34
|
+
transform: node.translate ? `translate(${node.translate.x} ${node.translate.y})` : void 0,
|
|
35
|
+
clipPath: clipId ? `url(#${clipId})` : void 0,
|
|
36
|
+
children: [
|
|
37
|
+
node.clip && clipId ? /* @__PURE__ */ jsx("clipPath", { id: clipId, children: /* @__PURE__ */ jsx("rect", { ...node.clip }) }) : null,
|
|
38
|
+
node.children.map((child) => /* @__PURE__ */ jsx(
|
|
39
|
+
SceneElement,
|
|
40
|
+
{
|
|
41
|
+
node: child,
|
|
42
|
+
clipPrefix
|
|
43
|
+
},
|
|
44
|
+
child.key
|
|
45
|
+
))
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
case "rect":
|
|
51
|
+
return node.corners ? /* @__PURE__ */ jsx(
|
|
52
|
+
"path",
|
|
53
|
+
{
|
|
54
|
+
...data,
|
|
55
|
+
d: roundedBarPath({ ...node, radius: node.corners }),
|
|
56
|
+
...paintProps(node.paint)
|
|
57
|
+
}
|
|
58
|
+
) : /* @__PURE__ */ jsx(
|
|
59
|
+
"rect",
|
|
60
|
+
{
|
|
61
|
+
...data,
|
|
62
|
+
x: node.x,
|
|
63
|
+
y: node.y,
|
|
64
|
+
width: node.width,
|
|
65
|
+
height: node.height,
|
|
66
|
+
...paintProps(node.paint)
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
case "path":
|
|
70
|
+
return /* @__PURE__ */ jsx("path", { ...data, d: node.d, ...paintProps(node.paint) });
|
|
71
|
+
case "circle":
|
|
72
|
+
return /* @__PURE__ */ jsx(
|
|
73
|
+
"circle",
|
|
74
|
+
{
|
|
75
|
+
...data,
|
|
76
|
+
cx: node.cx,
|
|
77
|
+
cy: node.cy,
|
|
78
|
+
r: node.r,
|
|
79
|
+
...paintProps(node.paint)
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
case "line":
|
|
83
|
+
return /* @__PURE__ */ jsx(
|
|
84
|
+
"line",
|
|
85
|
+
{
|
|
86
|
+
...data,
|
|
87
|
+
x1: node.x1,
|
|
88
|
+
y1: node.y1,
|
|
89
|
+
x2: node.x2,
|
|
90
|
+
y2: node.y2,
|
|
91
|
+
...paintProps(node.paint)
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
case "text":
|
|
95
|
+
return /* @__PURE__ */ jsx(
|
|
96
|
+
"text",
|
|
97
|
+
{
|
|
98
|
+
...data,
|
|
99
|
+
x: node.x,
|
|
100
|
+
y: node.y,
|
|
101
|
+
transform: node.rotate ? `rotate(${node.rotate} ${node.x} ${node.y})` : void 0,
|
|
102
|
+
fontSize: node.paint.fontSize,
|
|
103
|
+
fontWeight: node.paint.fontWeight,
|
|
104
|
+
textAnchor: node.paint.textAnchor,
|
|
105
|
+
dominantBaseline: node.paint.baseline ? BASELINE[node.paint.baseline] : void 0,
|
|
106
|
+
...paintProps(node.paint),
|
|
107
|
+
children: node.text
|
|
108
|
+
}
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function SvgSceneNodes({
|
|
113
|
+
scene,
|
|
114
|
+
clipPrefix
|
|
115
|
+
}) {
|
|
116
|
+
return scene.nodes.map((node) => /* @__PURE__ */ jsx(SceneElement, { node, clipPrefix }, node.key));
|
|
117
|
+
}
|
|
118
|
+
export {
|
|
119
|
+
SvgSceneNodes
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=svg-scene.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/react/svg-scene.tsx"],
|
|
4
|
+
"sourcesContent": ["import type * as React from \"react\";\nimport { roundedBarPath } from \"#/core/paths.ts\";\nimport type {\n\tChartPaint,\n\tChartScene,\n\tChartTextPaint,\n\tSceneNode,\n} from \"#/core/types.ts\";\n\nconst BASELINE: Record<\n\tNonNullable<ChartTextPaint[\"baseline\"]>,\n\tReact.SVGAttributes<SVGTextElement>[\"dominantBaseline\"]\n> = {\n\ttop: \"hanging\",\n\tmiddle: \"central\",\n\tbottom: \"text-after-edge\",\n\talphabetic: \"alphabetic\",\n};\n\nfunction paintProps(paint: ChartPaint): React.SVGAttributes<SVGElement> {\n\treturn {\n\t\tfill: paint.fill ?? \"none\",\n\t\tstroke: paint.stroke,\n\t\tstrokeWidth: paint.strokeWidth,\n\t\tstrokeDasharray: paint.strokeDasharray,\n\t\tstrokeLinecap: paint.strokeLinecap,\n\t\tstrokeLinejoin: paint.strokeLinejoin,\n\t\topacity: paint.opacity,\n\t\tfillOpacity: paint.fillOpacity,\n\t\tstrokeOpacity: paint.strokeOpacity,\n\t};\n}\n\nfunction SceneElement({\n\tnode,\n\tclipPrefix,\n}: {\n\tnode: SceneNode;\n\tclipPrefix: string;\n}) {\n\tconst data = { \"data-role\": node.role, \"data-series\": node.series };\n\tswitch (node.kind) {\n\t\tcase \"group\": {\n\t\t\tconst clipId = node.clip ? `${clipPrefix}-${node.key}` : undefined;\n\t\t\treturn (\n\t\t\t\t<g\n\t\t\t\t\t{...data}\n\t\t\t\t\ttransform={\n\t\t\t\t\t\tnode.translate\n\t\t\t\t\t\t\t? `translate(${node.translate.x} ${node.translate.y})`\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tclipPath={clipId ? `url(#${clipId})` : undefined}\n\t\t\t\t>\n\t\t\t\t\t{node.clip && clipId ? (\n\t\t\t\t\t\t<clipPath id={clipId}>\n\t\t\t\t\t\t\t<rect {...node.clip} />\n\t\t\t\t\t\t</clipPath>\n\t\t\t\t\t) : null}\n\t\t\t\t\t{node.children.map((child) => (\n\t\t\t\t\t\t<SceneElement\n\t\t\t\t\t\t\tkey={child.key}\n\t\t\t\t\t\t\tnode={child}\n\t\t\t\t\t\t\tclipPrefix={clipPrefix}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</g>\n\t\t\t);\n\t\t}\n\t\tcase \"rect\":\n\t\t\treturn node.corners ? (\n\t\t\t\t<path\n\t\t\t\t\t{...data}\n\t\t\t\t\td={roundedBarPath({ ...node, radius: node.corners })}\n\t\t\t\t\t{...paintProps(node.paint)}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<rect\n\t\t\t\t\t{...data}\n\t\t\t\t\tx={node.x}\n\t\t\t\t\ty={node.y}\n\t\t\t\t\twidth={node.width}\n\t\t\t\t\theight={node.height}\n\t\t\t\t\t{...paintProps(node.paint)}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"path\":\n\t\t\treturn <path {...data} d={node.d} {...paintProps(node.paint)} />;\n\t\tcase \"circle\":\n\t\t\treturn (\n\t\t\t\t<circle\n\t\t\t\t\t{...data}\n\t\t\t\t\tcx={node.cx}\n\t\t\t\t\tcy={node.cy}\n\t\t\t\t\tr={node.r}\n\t\t\t\t\t{...paintProps(node.paint)}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"line\":\n\t\t\treturn (\n\t\t\t\t<line\n\t\t\t\t\t{...data}\n\t\t\t\t\tx1={node.x1}\n\t\t\t\t\ty1={node.y1}\n\t\t\t\t\tx2={node.x2}\n\t\t\t\t\ty2={node.y2}\n\t\t\t\t\t{...paintProps(node.paint)}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase \"text\":\n\t\t\treturn (\n\t\t\t\t<text\n\t\t\t\t\t{...data}\n\t\t\t\t\tx={node.x}\n\t\t\t\t\ty={node.y}\n\t\t\t\t\ttransform={\n\t\t\t\t\t\tnode.rotate\n\t\t\t\t\t\t\t? `rotate(${node.rotate} ${node.x} ${node.y})`\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t}\n\t\t\t\t\tfontSize={node.paint.fontSize}\n\t\t\t\t\tfontWeight={node.paint.fontWeight}\n\t\t\t\t\ttextAnchor={node.paint.textAnchor}\n\t\t\t\t\tdominantBaseline={\n\t\t\t\t\t\tnode.paint.baseline ? BASELINE[node.paint.baseline] : undefined\n\t\t\t\t\t}\n\t\t\t\t\t{...paintProps(node.paint)}\n\t\t\t\t>\n\t\t\t\t\t{node.text}\n\t\t\t\t</text>\n\t\t\t);\n\t}\n}\n\n/** The scene's nodes as SVG elements, keyed so React reconciles a data update in place. */\nexport function SvgSceneNodes({\n\tscene,\n\tclipPrefix,\n}: {\n\tscene: ChartScene;\n\tclipPrefix: string;\n}) {\n\treturn scene.nodes.map((node) => (\n\t\t<SceneElement key={node.key} node={node} clipPrefix={clipPrefix} />\n\t));\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ChartScene } from "../core/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* The scene to draw this frame. A data change (`trigger` changed: a new
|
|
4
|
+
* definition, a series toggled) tweens from what is on screen to the new
|
|
5
|
+
* scene; a resize snaps, since watching bars slide while a window is dragged
|
|
6
|
+
* helps no one. Reduced motion always snaps. An update that lands mid-tween
|
|
7
|
+
* starts from the frame already painted, so nothing jumps.
|
|
8
|
+
*/
|
|
9
|
+
export declare function useAnimatedScene(scene: ChartScene, trigger: unknown, duration: number): ChartScene;
|
|
10
|
+
//# sourceMappingURL=use-animated-scene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-animated-scene.d.ts","sourceRoot":"","sources":["../../src/react/use-animated-scene.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AASlD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,GACd,UAAU,CAkCZ"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { easeOutCubic, tweenScene } from "../core/motion/tween.js";
|
|
3
|
+
function prefersReducedMotion() {
|
|
4
|
+
return typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches === true;
|
|
5
|
+
}
|
|
6
|
+
function useAnimatedScene(scene, trigger, duration) {
|
|
7
|
+
const [shown, setShown] = React.useState(scene);
|
|
8
|
+
const shownRef = React.useRef(scene);
|
|
9
|
+
const triggerRef = React.useRef(trigger);
|
|
10
|
+
React.useLayoutEffect(() => {
|
|
11
|
+
const changed = triggerRef.current !== trigger;
|
|
12
|
+
triggerRef.current = trigger;
|
|
13
|
+
if (!changed || duration <= 0 || prefersReducedMotion()) {
|
|
14
|
+
shownRef.current = scene;
|
|
15
|
+
setShown(scene);
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const from = shownRef.current;
|
|
19
|
+
const first = tweenScene(from, scene, 0);
|
|
20
|
+
shownRef.current = first;
|
|
21
|
+
setShown(first);
|
|
22
|
+
const start = performance.now();
|
|
23
|
+
let frame = 0;
|
|
24
|
+
function step(now) {
|
|
25
|
+
const t = Math.min(1, (now - start) / duration);
|
|
26
|
+
const next = tweenScene(from, scene, easeOutCubic(t));
|
|
27
|
+
shownRef.current = next;
|
|
28
|
+
setShown(next);
|
|
29
|
+
if (t < 1) {
|
|
30
|
+
frame = requestAnimationFrame(step);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
frame = requestAnimationFrame(step);
|
|
34
|
+
return () => cancelAnimationFrame(frame);
|
|
35
|
+
}, [scene, trigger, duration]);
|
|
36
|
+
return shown;
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
useAnimatedScene
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=use-animated-scene.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/react/use-animated-scene.ts"],
|
|
4
|
+
"sourcesContent": ["import * as React from \"react\";\nimport { easeOutCubic, tweenScene } from \"#/core/motion/tween.ts\";\nimport type { ChartScene } from \"#/core/types.ts\";\n\nfunction prefersReducedMotion(): boolean {\n\treturn (\n\t\ttypeof window !== \"undefined\" &&\n\t\twindow.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches === true\n\t);\n}\n\n/**\n * The scene to draw this frame. A data change (`trigger` changed: a new\n * definition, a series toggled) tweens from what is on screen to the new\n * scene; a resize snaps, since watching bars slide while a window is dragged\n * helps no one. Reduced motion always snaps. An update that lands mid-tween\n * starts from the frame already painted, so nothing jumps.\n */\nexport function useAnimatedScene(\n\tscene: ChartScene,\n\ttrigger: unknown,\n\tduration: number,\n): ChartScene {\n\tconst [shown, setShown] = React.useState(scene);\n\tconst shownRef = React.useRef(scene);\n\tconst triggerRef = React.useRef(trigger);\n\n\tReact.useLayoutEffect(() => {\n\t\tconst changed = triggerRef.current !== trigger;\n\t\ttriggerRef.current = trigger;\n\t\tif (!changed || duration <= 0 || prefersReducedMotion()) {\n\t\t\tshownRef.current = scene;\n\t\t\tsetShown(scene);\n\t\t\treturn;\n\t\t}\n\t\tconst from = shownRef.current;\n\t\t// Frame zero now, before paint: nodes that left are gone at once.\n\t\tconst first = tweenScene(from, scene, 0);\n\t\tshownRef.current = first;\n\t\tsetShown(first);\n\t\tconst start = performance.now();\n\t\tlet frame = 0;\n\t\tfunction step(now: number) {\n\t\t\tconst t = Math.min(1, (now - start) / duration);\n\t\t\tconst next = tweenScene(from, scene, easeOutCubic(t));\n\t\t\tshownRef.current = next;\n\t\t\tsetShown(next);\n\t\t\tif (t < 1) {\n\t\t\t\tframe = requestAnimationFrame(step);\n\t\t\t}\n\t\t}\n\t\tframe = requestAnimationFrame(step);\n\t\treturn () => cancelAnimationFrame(frame);\n\t}, [scene, trigger, duration]);\n\n\treturn shown;\n}\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;AACvB,SAAS,cAAc,kBAAkB;AAGzC,SAAS,uBAAgC;AACxC,SACC,OAAO,WAAW,eAClB,OAAO,aAAa,kCAAkC,EAAE,YAAY;AAEtE;AASO,SAAS,iBACf,OACA,SACA,UACa;AACb,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,KAAK;AAC9C,QAAM,WAAW,MAAM,OAAO,KAAK;AACnC,QAAM,aAAa,MAAM,OAAO,OAAO;AAEvC,QAAM,gBAAgB,MAAM;AAC3B,UAAM,UAAU,WAAW,YAAY;AACvC,eAAW,UAAU;AACrB,QAAI,CAAC,WAAW,YAAY,KAAK,qBAAqB,GAAG;AACxD,eAAS,UAAU;AACnB,eAAS,KAAK;AACd;AAAA,IACD;AACA,UAAM,OAAO,SAAS;AAEtB,UAAM,QAAQ,WAAW,MAAM,OAAO,CAAC;AACvC,aAAS,UAAU;AACnB,aAAS,KAAK;AACd,UAAM,QAAQ,YAAY,IAAI;AAC9B,QAAI,QAAQ;AACZ,aAAS,KAAK,KAAa;AAC1B,YAAM,IAAI,KAAK,IAAI,IAAI,MAAM,SAAS,QAAQ;AAC9C,YAAM,OAAO,WAAW,MAAM,OAAO,aAAa,CAAC,CAAC;AACpD,eAAS,UAAU;AACnB,eAAS,IAAI;AACb,UAAI,IAAI,GAAG;AACV,gBAAQ,sBAAsB,IAAI;AAAA,MACnC;AAAA,IACD;AACA,YAAQ,sBAAsB,IAAI;AAClC,WAAO,MAAM,qBAAqB,KAAK;AAAA,EACxC,GAAG,CAAC,OAAO,SAAS,QAAQ,CAAC;AAE7B,SAAO;AACR;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import type { ChartFocusStop, findNearest } from "../core/nearest.js";
|
|
3
|
+
import type { ChartFocusOrder, ChartPoint } from "../core/types.js";
|
|
4
|
+
export interface ActiveFocus {
|
|
5
|
+
readonly stop: ChartFocusStop;
|
|
6
|
+
readonly point: ChartPoint;
|
|
7
|
+
readonly source: "pointer" | "keyboard";
|
|
8
|
+
readonly pinned: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface Options {
|
|
11
|
+
readonly stops: ReadonlyArray<ChartFocusStop>;
|
|
12
|
+
readonly order: ChartFocusOrder;
|
|
13
|
+
readonly hitTest: (x: number, y: number) => ReturnType<typeof findNearest>;
|
|
14
|
+
readonly onFocusChange?: (point: ChartPoint | null) => void;
|
|
15
|
+
readonly onSelect?: (point: ChartPoint | null) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare function useChartFocus({ stops, order, hitTest, onFocusChange, onSelect, }: Options): {
|
|
18
|
+
active: ActiveFocus | null;
|
|
19
|
+
handlers: {
|
|
20
|
+
onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => void;
|
|
21
|
+
onPointerMove: (event: React.PointerEvent<HTMLElement>) => void;
|
|
22
|
+
onPointerLeave: () => void;
|
|
23
|
+
onClick: (event: React.MouseEvent<HTMLElement>) => void;
|
|
24
|
+
onFocus: (event: React.FocusEvent<HTMLElement>) => void;
|
|
25
|
+
onBlur: () => void;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=use-chart-focus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-chart-focus.d.ts","sourceRoot":"","sources":["../../src/react/use-chart-focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAcnE,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAED,UAAU,OAAO;IAChB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;IAC3E,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5D,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;CACvD;AAiCD,wBAAgB,aAAa,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,OAAO,EACP,aAAa,EACb,QAAQ,GACR,EAAE,OAAO;;;2BAsCiB,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC;+BAqE5B,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC;;yBA4BrC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;yBAoB7B,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC;;;EAqBrD"}
|