graphein 0.18.0 → 0.20.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 +24 -0
- package/dist/a11y/apply.d.ts +10 -0
- package/dist/a11y/apply.d.ts.map +1 -0
- package/dist/a11y/apply.js +24 -0
- package/dist/a11y/apply.js.map +7 -0
- package/dist/a11y/describe.d.ts +26 -0
- package/dist/a11y/describe.d.ts.map +1 -0
- package/dist/a11y/describe.js +37 -0
- package/dist/a11y/describe.js.map +7 -0
- package/dist/a11y/index.d.ts +4 -0
- package/dist/a11y/index.d.ts.map +1 -0
- package/dist/a11y/index.js +4 -0
- package/dist/a11y/index.js.map +7 -0
- package/dist/a11y/table.d.ts +18 -0
- package/dist/a11y/table.d.ts.map +1 -0
- package/dist/a11y/table.js +72 -0
- package/dist/a11y/table.js.map +7 -0
- package/dist/analyze/autoInsights.d.ts +22 -0
- package/dist/analyze/autoInsights.d.ts.map +1 -0
- package/dist/analyze/autoInsights.js +63 -0
- package/dist/analyze/autoInsights.js.map +7 -0
- package/dist/analyze/index.d.ts +10 -0
- package/dist/analyze/index.d.ts.map +1 -0
- package/dist/analyze/index.js +6 -0
- package/dist/analyze/index.js.map +7 -0
- package/dist/analyze/insights.d.ts +142 -0
- package/dist/analyze/insights.d.ts.map +1 -0
- package/dist/analyze/insights.js +293 -0
- package/dist/analyze/insights.js.map +7 -0
- package/dist/analyze/recommend.d.ts +40 -0
- package/dist/analyze/recommend.d.ts.map +1 -0
- package/dist/analyze/recommend.js +717 -0
- package/dist/analyze/recommend.js.map +7 -0
- package/dist/analyze/regression.d.ts +26 -0
- package/dist/analyze/regression.d.ts.map +1 -0
- package/dist/analyze/regression.js +21 -0
- package/dist/analyze/regression.js.map +7 -0
- package/dist/analyze/summarize.d.ts +18 -0
- package/dist/analyze/summarize.d.ts.map +1 -0
- package/dist/analyze/summarize.js +122 -0
- package/dist/analyze/summarize.js.map +7 -0
- package/dist/animation/animate.d.ts +14 -0
- package/dist/animation/animate.d.ts.map +1 -0
- package/dist/animation/animate.js +68 -0
- package/dist/animation/animate.js.map +7 -0
- package/dist/animation/easing.d.ts +16 -0
- package/dist/animation/easing.d.ts.map +1 -0
- package/dist/animation/easing.js +116 -0
- package/dist/animation/easing.js.map +7 -0
- package/dist/animation/entrance.d.ts +31 -0
- package/dist/animation/entrance.d.ts.map +1 -0
- package/dist/animation/entrance.js +18 -0
- package/dist/animation/entrance.js.map +7 -0
- package/dist/animation/env.d.ts +2 -0
- package/dist/animation/env.d.ts.map +1 -0
- package/dist/animation/env.js +7 -0
- package/dist/animation/env.js.map +7 -0
- package/dist/animation/index.d.ts +7 -0
- package/dist/animation/index.d.ts.map +1 -0
- package/dist/animation/index.js +7 -0
- package/dist/animation/index.js.map +7 -0
- package/dist/animation/interpolate.d.ts +7 -0
- package/dist/animation/interpolate.d.ts.map +1 -0
- package/dist/animation/interpolate.js +62 -0
- package/dist/animation/interpolate.js.map +7 -0
- package/dist/animation/transition.d.ts +27 -0
- package/dist/animation/transition.d.ts.map +1 -0
- package/dist/animation/transition.js +18 -0
- package/dist/animation/transition.js.map +7 -0
- package/dist/axes/draw.d.ts +16 -0
- package/dist/axes/draw.d.ts.map +1 -0
- package/dist/axes/draw.js +152 -0
- package/dist/axes/draw.js.map +7 -0
- package/dist/axes/index.d.ts +2 -0
- package/dist/axes/index.d.ts.map +1 -0
- package/dist/axes/index.js +2 -0
- package/dist/axes/index.js.map +7 -0
- package/dist/axes/legend.d.ts +5 -0
- package/dist/axes/legend.d.ts.map +1 -0
- package/dist/axes/legend.js +165 -0
- package/dist/axes/legend.js.map +7 -0
- package/dist/axes/overlay.d.ts +5 -0
- package/dist/axes/overlay.d.ts.map +1 -0
- package/dist/axes/overlay.js +130 -0
- package/dist/axes/overlay.js.map +7 -0
- package/dist/axes/text.d.ts +27 -0
- package/dist/axes/text.d.ts.map +1 -0
- package/dist/axes/text.js +60 -0
- package/dist/axes/text.js.map +7 -0
- package/dist/axes/tickLabels.d.ts +40 -0
- package/dist/axes/tickLabels.d.ts.map +1 -0
- package/dist/axes/tickLabels.js +131 -0
- package/dist/axes/tickLabels.js.map +7 -0
- package/dist/axes/title.d.ts +7 -0
- package/dist/axes/title.d.ts.map +1 -0
- package/dist/axes/title.js +151 -0
- package/dist/axes/title.js.map +7 -0
- package/dist/charts/annotations.d.ts +22 -0
- package/dist/charts/annotations.d.ts.map +1 -0
- package/dist/charts/annotations.js +233 -0
- package/dist/charts/annotations.js.map +7 -0
- package/dist/charts/area.d.ts +14 -0
- package/dist/charts/area.d.ts.map +1 -0
- package/dist/charts/area.js +273 -0
- package/dist/charts/area.js.map +7 -0
- package/dist/charts/bar.d.ts +4 -0
- package/dist/charts/bar.d.ts.map +1 -0
- package/dist/charts/bar.js +206 -0
- package/dist/charts/bar.js.map +7 -0
- package/dist/charts/boundary.d.ts +7 -0
- package/dist/charts/boundary.d.ts.map +1 -0
- package/dist/charts/boundary.js +37 -0
- package/dist/charts/boundary.js.map +7 -0
- package/dist/charts/box.d.ts +41 -0
- package/dist/charts/box.d.ts.map +1 -0
- package/dist/charts/box.js +303 -0
- package/dist/charts/box.js.map +7 -0
- package/dist/charts/bullet.d.ts +9 -0
- package/dist/charts/bullet.d.ts.map +1 -0
- package/dist/charts/bullet.js +239 -0
- package/dist/charts/bullet.js.map +7 -0
- package/dist/charts/calendarHeatmap.d.ts +36 -0
- package/dist/charts/calendarHeatmap.d.ts.map +1 -0
- package/dist/charts/calendarHeatmap.js +379 -0
- package/dist/charts/calendarHeatmap.js.map +7 -0
- package/dist/charts/choropleth.d.ts +8 -0
- package/dist/charts/choropleth.d.ts.map +1 -0
- package/dist/charts/choropleth.js +399 -0
- package/dist/charts/choropleth.js.map +7 -0
- package/dist/charts/chrome.d.ts +90 -0
- package/dist/charts/chrome.d.ts.map +1 -0
- package/dist/charts/chrome.js +253 -0
- package/dist/charts/chrome.js.map +7 -0
- package/dist/charts/colorRamp.d.ts +15 -0
- package/dist/charts/colorRamp.d.ts.map +1 -0
- package/dist/charts/colorRamp.js +84 -0
- package/dist/charts/colorRamp.js.map +7 -0
- package/dist/charts/combo.d.ts +16 -0
- package/dist/charts/combo.d.ts.map +1 -0
- package/dist/charts/combo.js +212 -0
- package/dist/charts/combo.js.map +7 -0
- package/dist/charts/condFormat.d.ts +18 -0
- package/dist/charts/condFormat.d.ts.map +1 -0
- package/dist/charts/condFormat.js +88 -0
- package/dist/charts/condFormat.js.map +7 -0
- package/dist/charts/domIds.d.ts +2 -0
- package/dist/charts/domIds.d.ts.map +1 -0
- package/dist/charts/domIds.js +13 -0
- package/dist/charts/domIds.js.map +7 -0
- package/dist/charts/dumbbell.d.ts +8 -0
- package/dist/charts/dumbbell.d.ts.map +1 -0
- package/dist/charts/dumbbell.js +320 -0
- package/dist/charts/dumbbell.js.map +7 -0
- package/dist/charts/emphasis.d.ts +30 -0
- package/dist/charts/emphasis.d.ts.map +1 -0
- package/dist/charts/emphasis.js +27 -0
- package/dist/charts/emphasis.js.map +7 -0
- package/dist/charts/emptyOverlay.d.ts +5 -0
- package/dist/charts/emptyOverlay.d.ts.map +1 -0
- package/dist/charts/emptyOverlay.js +16 -0
- package/dist/charts/emptyOverlay.js.map +7 -0
- package/dist/charts/fill.d.ts +19 -0
- package/dist/charts/fill.d.ts.map +1 -0
- package/dist/charts/fill.js +32 -0
- package/dist/charts/fill.js.map +7 -0
- package/dist/charts/funnel.d.ts +20 -0
- package/dist/charts/funnel.d.ts.map +1 -0
- package/dist/charts/funnel.js +300 -0
- package/dist/charts/funnel.js.map +7 -0
- package/dist/charts/gauge.d.ts +8 -0
- package/dist/charts/gauge.d.ts.map +1 -0
- package/dist/charts/gauge.js +304 -0
- package/dist/charts/gauge.js.map +7 -0
- package/dist/charts/heatmap.d.ts +9 -0
- package/dist/charts/heatmap.d.ts.map +1 -0
- package/dist/charts/heatmap.js +389 -0
- package/dist/charts/heatmap.js.map +7 -0
- package/dist/charts/histogram.d.ts +15 -0
- package/dist/charts/histogram.d.ts.map +1 -0
- package/dist/charts/histogram.js +91 -0
- package/dist/charts/histogram.js.map +7 -0
- package/dist/charts/index.d.ts +101 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +94 -0
- package/dist/charts/index.js.map +7 -0
- package/dist/charts/kpi.d.ts +24 -0
- package/dist/charts/kpi.d.ts.map +1 -0
- package/dist/charts/kpi.js +782 -0
- package/dist/charts/kpi.js.map +7 -0
- package/dist/charts/labelLayout.d.ts +3 -0
- package/dist/charts/labelLayout.d.ts.map +1 -0
- package/dist/charts/labelLayout.js +25 -0
- package/dist/charts/labelLayout.js.map +7 -0
- package/dist/charts/line.d.ts +8 -0
- package/dist/charts/line.d.ts.map +1 -0
- package/dist/charts/line.js +280 -0
- package/dist/charts/line.js.map +7 -0
- package/dist/charts/matrix.d.ts +7 -0
- package/dist/charts/matrix.d.ts.map +1 -0
- package/dist/charts/matrix.js +379 -0
- package/dist/charts/matrix.js.map +7 -0
- package/dist/charts/noData.d.ts +6 -0
- package/dist/charts/noData.d.ts.map +1 -0
- package/dist/charts/noData.js +17 -0
- package/dist/charts/noData.js.map +7 -0
- package/dist/charts/pie.d.ts +8 -0
- package/dist/charts/pie.d.ts.map +1 -0
- package/dist/charts/pie.js +433 -0
- package/dist/charts/pie.js.map +7 -0
- package/dist/charts/pieLabels.d.ts +84 -0
- package/dist/charts/pieLabels.d.ts.map +1 -0
- package/dist/charts/pieLabels.js +207 -0
- package/dist/charts/pieLabels.js.map +7 -0
- package/dist/charts/pointMarkers.d.ts +22 -0
- package/dist/charts/pointMarkers.d.ts.map +1 -0
- package/dist/charts/pointMarkers.js +38 -0
- package/dist/charts/pointMarkers.js.map +7 -0
- package/dist/charts/sankey.d.ts +44 -0
- package/dist/charts/sankey.d.ts.map +1 -0
- package/dist/charts/sankey.js +656 -0
- package/dist/charts/sankey.js.map +7 -0
- package/dist/charts/scatter.d.ts +11 -0
- package/dist/charts/scatter.d.ts.map +1 -0
- package/dist/charts/scatter.js +147 -0
- package/dist/charts/scatter.js.map +7 -0
- package/dist/charts/slicers/common.d.ts +61 -0
- package/dist/charts/slicers/common.d.ts.map +1 -0
- package/dist/charts/slicers/common.js +142 -0
- package/dist/charts/slicers/common.js.map +7 -0
- package/dist/charts/slicers/dateRange.d.ts +15 -0
- package/dist/charts/slicers/dateRange.d.ts.map +1 -0
- package/dist/charts/slicers/dateRange.js +243 -0
- package/dist/charts/slicers/dateRange.js.map +7 -0
- package/dist/charts/slicers/dropdown.d.ts +14 -0
- package/dist/charts/slicers/dropdown.d.ts.map +1 -0
- package/dist/charts/slicers/dropdown.js +320 -0
- package/dist/charts/slicers/dropdown.js.map +7 -0
- package/dist/charts/slicers/index.d.ts +12 -0
- package/dist/charts/slicers/index.d.ts.map +1 -0
- package/dist/charts/slicers/index.js +27 -0
- package/dist/charts/slicers/index.js.map +7 -0
- package/dist/charts/slicers/list.d.ts +14 -0
- package/dist/charts/slicers/list.d.ts.map +1 -0
- package/dist/charts/slicers/list.js +340 -0
- package/dist/charts/slicers/list.js.map +7 -0
- package/dist/charts/slicers/range.d.ts +14 -0
- package/dist/charts/slicers/range.d.ts.map +1 -0
- package/dist/charts/slicers/range.js +137 -0
- package/dist/charts/slicers/range.js.map +7 -0
- package/dist/charts/slicers/search.d.ts +14 -0
- package/dist/charts/slicers/search.d.ts.map +1 -0
- package/dist/charts/slicers/search.js +105 -0
- package/dist/charts/slicers/search.js.map +7 -0
- package/dist/charts/slope.d.ts +14 -0
- package/dist/charts/slope.d.ts.map +1 -0
- package/dist/charts/slope.js +264 -0
- package/dist/charts/slope.js.map +7 -0
- package/dist/charts/table.d.ts +6 -0
- package/dist/charts/table.d.ts.map +1 -0
- package/dist/charts/table.js +324 -0
- package/dist/charts/table.js.map +7 -0
- package/dist/charts/tableView/canvas.d.ts +3 -0
- package/dist/charts/tableView/canvas.d.ts.map +1 -0
- package/dist/charts/tableView/canvas.js +314 -0
- package/dist/charts/tableView/canvas.js.map +7 -0
- package/dist/charts/tableView/conditional.d.ts +51 -0
- package/dist/charts/tableView/conditional.d.ts.map +1 -0
- package/dist/charts/tableView/conditional.js +285 -0
- package/dist/charts/tableView/conditional.js.map +7 -0
- package/dist/charts/tableView/dom.d.ts +3 -0
- package/dist/charts/tableView/dom.d.ts.map +1 -0
- package/dist/charts/tableView/dom.js +299 -0
- package/dist/charts/tableView/dom.js.map +7 -0
- package/dist/charts/tableView/sketch.d.ts +38 -0
- package/dist/charts/tableView/sketch.d.ts.map +1 -0
- package/dist/charts/tableView/sketch.js +74 -0
- package/dist/charts/tableView/sketch.js.map +7 -0
- package/dist/charts/tableView/types.d.ts +103 -0
- package/dist/charts/tableView/types.d.ts.map +1 -0
- package/dist/charts/tableView/types.js +118 -0
- package/dist/charts/tableView/types.js.map +7 -0
- package/dist/charts/tableView.d.ts +7 -0
- package/dist/charts/tableView.d.ts.map +1 -0
- package/dist/charts/tableView.js +16 -0
- package/dist/charts/tableView.js.map +7 -0
- package/dist/charts/treemap.d.ts +17 -0
- package/dist/charts/treemap.d.ts.map +1 -0
- package/dist/charts/treemap.js +404 -0
- package/dist/charts/treemap.js.map +7 -0
- package/dist/charts/trendline.d.ts +25 -0
- package/dist/charts/trendline.d.ts.map +1 -0
- package/dist/charts/trendline.js +125 -0
- package/dist/charts/trendline.js.map +7 -0
- package/dist/charts/waterfall.d.ts +17 -0
- package/dist/charts/waterfall.d.ts.map +1 -0
- package/dist/charts/waterfall.js +206 -0
- package/dist/charts/waterfall.js.map +7 -0
- package/dist/color/contrast.d.ts +16 -0
- package/dist/color/contrast.d.ts.map +1 -0
- package/dist/color/contrast.js +37 -0
- package/dist/color/contrast.js.map +7 -0
- package/dist/color/convert.d.ts +26 -0
- package/dist/color/convert.d.ts.map +1 -0
- package/dist/color/convert.js +59 -0
- package/dist/color/convert.js.map +7 -0
- package/dist/color/format.d.ts +11 -0
- package/dist/color/format.d.ts.map +1 -0
- package/dist/color/format.js +28 -0
- package/dist/color/format.js.map +7 -0
- package/dist/color/index.d.ts +8 -0
- package/dist/color/index.d.ts.map +1 -0
- package/dist/color/index.js +8 -0
- package/dist/color/index.js.map +7 -0
- package/dist/color/interpolate.d.ts +10 -0
- package/dist/color/interpolate.d.ts.map +1 -0
- package/dist/color/interpolate.js +32 -0
- package/dist/color/interpolate.js.map +7 -0
- package/dist/color/palettes.d.ts +21 -0
- package/dist/color/palettes.d.ts.map +1 -0
- package/dist/color/palettes.js +112 -0
- package/dist/color/palettes.js.map +7 -0
- package/dist/color/parse.d.ts +8 -0
- package/dist/color/parse.d.ts.map +1 -0
- package/dist/color/parse.js +115 -0
- package/dist/color/parse.js.map +7 -0
- package/dist/color/scales.d.ts +23 -0
- package/dist/color/scales.d.ts.map +1 -0
- package/dist/color/scales.js +60 -0
- package/dist/color/scales.js.map +7 -0
- package/dist/decimate/index.d.ts +2 -0
- package/dist/decimate/index.d.ts.map +1 -0
- package/dist/decimate/index.js +6 -0
- package/dist/decimate/index.js.map +7 -0
- package/dist/decimate/lttb.d.ts +29 -0
- package/dist/decimate/lttb.d.ts.map +1 -0
- package/dist/decimate/lttb.js +118 -0
- package/dist/decimate/lttb.js.map +7 -0
- package/dist/format/date.d.ts +14 -0
- package/dist/format/date.d.ts.map +1 -0
- package/dist/format/date.js +81 -0
- package/dist/format/date.js.map +7 -0
- package/dist/format/index.d.ts +26 -0
- package/dist/format/index.d.ts.map +1 -0
- package/dist/format/index.js +53 -0
- package/dist/format/index.js.map +7 -0
- package/dist/format/number.d.ts +29 -0
- package/dist/format/number.d.ts.map +1 -0
- package/dist/format/number.js +122 -0
- package/dist/format/number.js.map +7 -0
- package/dist/index.d.ts +60 -4424
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +239 -21456
- package/dist/index.js.map +7 -1
- package/dist/interaction/cartesian.d.ts +16 -0
- package/dist/interaction/cartesian.d.ts.map +1 -0
- package/dist/interaction/cartesian.js +300 -0
- package/dist/interaction/cartesian.js.map +7 -0
- package/dist/interaction/controller.d.ts +48 -0
- package/dist/interaction/controller.d.ts.map +1 -0
- package/dist/interaction/controller.js +126 -0
- package/dist/interaction/controller.js.map +7 -0
- package/dist/interaction/index.d.ts +16 -0
- package/dist/interaction/index.d.ts.map +1 -0
- package/dist/interaction/index.js +40 -0
- package/dist/interaction/index.js.map +7 -0
- package/dist/interaction/predicate.d.ts +29 -0
- package/dist/interaction/predicate.d.ts.map +1 -0
- package/dist/interaction/predicate.js +132 -0
- package/dist/interaction/predicate.js.map +7 -0
- package/dist/interaction/select.d.ts +37 -0
- package/dist/interaction/select.d.ts.map +1 -0
- package/dist/interaction/select.js +78 -0
- package/dist/interaction/select.js.map +7 -0
- package/dist/interaction/store.d.ts +32 -0
- package/dist/interaction/store.d.ts.map +1 -0
- package/dist/interaction/store.js +99 -0
- package/dist/interaction/store.js.map +7 -0
- package/dist/interaction/tooltip.d.ts +27 -0
- package/dist/interaction/tooltip.d.ts.map +1 -0
- package/dist/interaction/tooltip.js +132 -0
- package/dist/interaction/tooltip.js.map +7 -0
- package/dist/interaction/types.d.ts +85 -0
- package/dist/interaction/types.d.ts.map +1 -0
- package/dist/interaction/types.js +1 -0
- package/dist/interaction/types.js.map +7 -0
- package/dist/internal.d.ts +28 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +21 -0
- package/dist/internal.js.map +7 -0
- package/dist/layout/frame.d.ts +133 -0
- package/dist/layout/frame.d.ts.map +1 -0
- package/dist/layout/frame.js +322 -0
- package/dist/layout/frame.js.map +7 -0
- package/dist/layout/index.d.ts +2 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +2 -0
- package/dist/layout/index.js.map +7 -0
- package/dist/pivot/index.d.ts +2 -0
- package/dist/pivot/index.d.ts.map +1 -0
- package/dist/pivot/index.js +2 -0
- package/dist/pivot/index.js.map +7 -0
- package/dist/pivot/pivot.d.ts +61 -0
- package/dist/pivot/pivot.d.ts.map +1 -0
- package/dist/pivot/pivot.js +447 -0
- package/dist/pivot/pivot.js.map +7 -0
- package/dist/render/canvasLayer.d.ts +24 -0
- package/dist/render/canvasLayer.d.ts.map +1 -0
- package/dist/render/canvasLayer.js +84 -0
- package/dist/render/canvasLayer.js.map +7 -0
- package/dist/render/controls.d.ts +114 -0
- package/dist/render/controls.d.ts.map +1 -0
- package/dist/render/controls.js +467 -0
- package/dist/render/controls.js.map +7 -0
- package/dist/render/dom.d.ts +9 -0
- package/dist/render/dom.d.ts.map +1 -0
- package/dist/render/dom.js +32 -0
- package/dist/render/dom.js.map +7 -0
- package/dist/render/env.d.ts +5 -0
- package/dist/render/env.d.ts.map +1 -0
- package/dist/render/env.js +10 -0
- package/dist/render/env.js.map +7 -0
- package/dist/render/evidence.d.ts +126 -0
- package/dist/render/evidence.d.ts.map +1 -0
- package/dist/render/evidence.js +221 -0
- package/dist/render/evidence.js.map +7 -0
- package/dist/render/fonts.d.ts +23 -0
- package/dist/render/fonts.d.ts.map +1 -0
- package/dist/render/fonts.js +36 -0
- package/dist/render/fonts.js.map +7 -0
- package/dist/render/index.d.ts +9 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +9 -0
- package/dist/render/index.js.map +7 -0
- package/dist/render/labelLedger.d.ts +114 -0
- package/dist/render/labelLedger.d.ts.map +1 -0
- package/dist/render/labelLedger.js +237 -0
- package/dist/render/labelLedger.js.map +7 -0
- package/dist/render/metrics.d.ts +43 -0
- package/dist/render/metrics.d.ts.map +1 -0
- package/dist/render/metrics.js +46 -0
- package/dist/render/metrics.js.map +7 -0
- package/dist/render/overlayText.d.ts +69 -0
- package/dist/render/overlayText.d.ts.map +1 -0
- package/dist/render/overlayText.js +99 -0
- package/dist/render/overlayText.js.map +7 -0
- package/dist/render/sizing.d.ts +31 -0
- package/dist/render/sizing.d.ts.map +1 -0
- package/dist/render/sizing.js +36 -0
- package/dist/render/sizing.js.map +7 -0
- package/dist/render/surface.d.ts +49 -0
- package/dist/render/surface.d.ts.map +1 -0
- package/dist/render/surface.js +107 -0
- package/dist/render/surface.js.map +7 -0
- package/dist/render/text.d.ts +27 -0
- package/dist/render/text.d.ts.map +1 -0
- package/dist/render/text.js +88 -0
- package/dist/render/text.js.map +7 -0
- package/dist/rough/draw.d.ts +93 -0
- package/dist/rough/draw.d.ts.map +1 -0
- package/dist/rough/draw.js +259 -0
- package/dist/rough/draw.js.map +7 -0
- package/dist/rough/geom.d.ts +26 -0
- package/dist/rough/geom.d.ts.map +1 -0
- package/dist/rough/geom.js +82 -0
- package/dist/rough/geom.js.map +7 -0
- package/dist/rough/index.d.ts +10 -0
- package/dist/rough/index.d.ts.map +1 -0
- package/dist/rough/index.js +17 -0
- package/dist/rough/index.js.map +7 -0
- package/dist/rough/rng.d.ts +20 -0
- package/dist/rough/rng.d.ts.map +1 -0
- package/dist/rough/rng.js +22 -0
- package/dist/rough/rng.js.map +7 -0
- package/dist/rough/types.d.ts +41 -0
- package/dist/rough/types.d.ts.map +1 -0
- package/dist/rough/types.js +13 -0
- package/dist/rough/types.js.map +7 -0
- package/dist/runtime/cartesian.d.ts +138 -0
- package/dist/runtime/cartesian.d.ts.map +1 -0
- package/dist/runtime/cartesian.js +528 -0
- package/dist/runtime/cartesian.js.map +7 -0
- package/dist/runtime/categories.d.ts +11 -0
- package/dist/runtime/categories.d.ts.map +1 -0
- package/dist/runtime/categories.js +45 -0
- package/dist/runtime/categories.js.map +7 -0
- package/dist/runtime/chartAnimation.d.ts +45 -0
- package/dist/runtime/chartAnimation.d.ts.map +1 -0
- package/dist/runtime/chartAnimation.js +119 -0
- package/dist/runtime/chartAnimation.js.map +7 -0
- package/dist/runtime/chartRuntime.d.ts +88 -0
- package/dist/runtime/chartRuntime.d.ts.map +1 -0
- package/dist/runtime/chartRuntime.js +597 -0
- package/dist/runtime/chartRuntime.js.map +7 -0
- package/dist/runtime/combo.d.ts +56 -0
- package/dist/runtime/combo.d.ts.map +1 -0
- package/dist/runtime/combo.js +450 -0
- package/dist/runtime/combo.js.map +7 -0
- package/dist/runtime/dashboard.d.ts +58 -0
- package/dist/runtime/dashboard.d.ts.map +1 -0
- package/dist/runtime/dashboard.js +21 -0
- package/dist/runtime/dashboard.js.map +7 -0
- package/dist/runtime/dashboardChrome.d.ts +20 -0
- package/dist/runtime/dashboardChrome.d.ts.map +1 -0
- package/dist/runtime/dashboardChrome.js +49 -0
- package/dist/runtime/dashboardChrome.js.map +7 -0
- package/dist/runtime/dashboardDom.d.ts +7 -0
- package/dist/runtime/dashboardDom.d.ts.map +1 -0
- package/dist/runtime/dashboardDom.js +595 -0
- package/dist/runtime/dashboardDom.js.map +7 -0
- package/dist/runtime/dashboardHeadless.d.ts +14 -0
- package/dist/runtime/dashboardHeadless.d.ts.map +1 -0
- package/dist/runtime/dashboardHeadless.js +8 -0
- package/dist/runtime/dashboardHeadless.js.map +7 -0
- package/dist/runtime/dashboardLayout.d.ts +18 -0
- package/dist/runtime/dashboardLayout.d.ts.map +1 -0
- package/dist/runtime/dashboardLayout.js +18 -0
- package/dist/runtime/dashboardLayout.js.map +7 -0
- package/dist/runtime/dashboardPlacement.d.ts +54 -0
- package/dist/runtime/dashboardPlacement.d.ts.map +1 -0
- package/dist/runtime/dashboardPlacement.js +206 -0
- package/dist/runtime/dashboardPlacement.js.map +7 -0
- package/dist/runtime/dashboardSelection.d.ts +23 -0
- package/dist/runtime/dashboardSelection.d.ts.map +1 -0
- package/dist/runtime/dashboardSelection.js +77 -0
- package/dist/runtime/dashboardSelection.js.map +7 -0
- package/dist/runtime/debug.d.ts +48 -0
- package/dist/runtime/debug.d.ts.map +1 -0
- package/dist/runtime/debug.js +384 -0
- package/dist/runtime/debug.js.map +7 -0
- package/dist/runtime/diagnostics.d.ts +56 -0
- package/dist/runtime/diagnostics.d.ts.map +1 -0
- package/dist/runtime/diagnostics.js +59 -0
- package/dist/runtime/diagnostics.js.map +7 -0
- package/dist/runtime/draft.d.ts +95 -0
- package/dist/runtime/draft.d.ts.map +1 -0
- package/dist/runtime/draft.js +112 -0
- package/dist/runtime/draft.js.map +7 -0
- package/dist/runtime/dumbbell.d.ts +46 -0
- package/dist/runtime/dumbbell.d.ts.map +1 -0
- package/dist/runtime/dumbbell.js +116 -0
- package/dist/runtime/dumbbell.js.map +7 -0
- package/dist/runtime/facet.d.ts +74 -0
- package/dist/runtime/facet.d.ts.map +1 -0
- package/dist/runtime/facet.js +354 -0
- package/dist/runtime/facet.js.map +7 -0
- package/dist/runtime/headless.d.ts +54 -0
- package/dist/runtime/headless.d.ts.map +1 -0
- package/dist/runtime/headless.js +159 -0
- package/dist/runtime/headless.js.map +7 -0
- package/dist/runtime/headlessDashboardRenderer.d.ts +14 -0
- package/dist/runtime/headlessDashboardRenderer.d.ts.map +1 -0
- package/dist/runtime/headlessDashboardRenderer.js +484 -0
- package/dist/runtime/headlessDashboardRenderer.js.map +7 -0
- package/dist/runtime/histogram.d.ts +49 -0
- package/dist/runtime/histogram.d.ts.map +1 -0
- package/dist/runtime/histogram.js +162 -0
- package/dist/runtime/histogram.js.map +7 -0
- package/dist/runtime/index.d.ts +14 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +14 -0
- package/dist/runtime/index.js.map +7 -0
- package/dist/runtime/inspect.d.ts +57 -0
- package/dist/runtime/inspect.d.ts.map +1 -0
- package/dist/runtime/inspect.js +83 -0
- package/dist/runtime/inspect.js.map +7 -0
- package/dist/runtime/quality.d.ts +54 -0
- package/dist/runtime/quality.d.ts.map +1 -0
- package/dist/runtime/quality.js +359 -0
- package/dist/runtime/quality.js.map +7 -0
- package/dist/runtime/qualityTarget.d.ts +9 -0
- package/dist/runtime/qualityTarget.d.ts.map +1 -0
- package/dist/runtime/qualityTarget.js +120 -0
- package/dist/runtime/qualityTarget.js.map +7 -0
- package/dist/runtime/render.d.ts +91 -0
- package/dist/runtime/render.d.ts.map +1 -0
- package/dist/runtime/render.js +14 -0
- package/dist/runtime/render.js.map +7 -0
- package/dist/runtime/report/build.d.ts +7 -0
- package/dist/runtime/report/build.d.ts.map +1 -0
- package/dist/runtime/report/build.js +180 -0
- package/dist/runtime/report/build.js.map +7 -0
- package/dist/runtime/report/cartesian.d.ts +37 -0
- package/dist/runtime/report/cartesian.d.ts.map +1 -0
- package/dist/runtime/report/cartesian.js +283 -0
- package/dist/runtime/report/cartesian.js.map +7 -0
- package/dist/runtime/report/constants.d.ts +18 -0
- package/dist/runtime/report/constants.d.ts.map +1 -0
- package/dist/runtime/report/constants.js +22 -0
- package/dist/runtime/report/constants.js.map +7 -0
- package/dist/runtime/report/dashboard.d.ts +17 -0
- package/dist/runtime/report/dashboard.d.ts.map +1 -0
- package/dist/runtime/report/dashboard.js +81 -0
- package/dist/runtime/report/dashboard.js.map +7 -0
- package/dist/runtime/report/evidence.d.ts +4 -0
- package/dist/runtime/report/evidence.d.ts.map +1 -0
- package/dist/runtime/report/evidence.js +47 -0
- package/dist/runtime/report/evidence.js.map +7 -0
- package/dist/runtime/report/text.d.ts +15 -0
- package/dist/runtime/report/text.d.ts.map +1 -0
- package/dist/runtime/report/text.js +208 -0
- package/dist/runtime/report/text.js.map +7 -0
- package/dist/runtime/report/types.d.ts +92 -0
- package/dist/runtime/report/types.d.ts.map +1 -0
- package/dist/runtime/report/types.js +1 -0
- package/dist/runtime/report/types.js.map +7 -0
- package/dist/runtime/report/utils.d.ts +6 -0
- package/dist/runtime/report/utils.d.ts.map +1 -0
- package/dist/runtime/report/utils.js +27 -0
- package/dist/runtime/report/utils.js.map +7 -0
- package/dist/runtime/report.d.ts +27 -0
- package/dist/runtime/report.d.ts.map +1 -0
- package/dist/runtime/report.js +17 -0
- package/dist/runtime/report.js.map +7 -0
- package/dist/runtime/resolve.d.ts +27 -0
- package/dist/runtime/resolve.d.ts.map +1 -0
- package/dist/runtime/resolve.js +109 -0
- package/dist/runtime/resolve.js.map +7 -0
- package/dist/runtime/runtimeShared.d.ts +37 -0
- package/dist/runtime/runtimeShared.d.ts.map +1 -0
- package/dist/runtime/runtimeShared.js +110 -0
- package/dist/runtime/runtimeShared.js.map +7 -0
- package/dist/runtime/slope.d.ts +46 -0
- package/dist/runtime/slope.d.ts.map +1 -0
- package/dist/runtime/slope.js +210 -0
- package/dist/runtime/slope.js.map +7 -0
- package/dist/runtime/waterfall.d.ts +76 -0
- package/dist/runtime/waterfall.d.ts.map +1 -0
- package/dist/runtime/waterfall.js +239 -0
- package/dist/runtime/waterfall.js.map +7 -0
- package/dist/runtime/wire.d.ts +30 -0
- package/dist/runtime/wire.d.ts.map +1 -0
- package/dist/runtime/wire.js +194 -0
- package/dist/runtime/wire.js.map +7 -0
- package/dist/scales/band.d.ts +17 -0
- package/dist/scales/band.d.ts.map +1 -0
- package/dist/scales/band.js +80 -0
- package/dist/scales/band.js.map +7 -0
- package/dist/scales/continuous.d.ts +12 -0
- package/dist/scales/continuous.d.ts.map +1 -0
- package/dist/scales/continuous.js +45 -0
- package/dist/scales/continuous.js.map +7 -0
- package/dist/scales/format.d.ts +3 -0
- package/dist/scales/format.d.ts.map +1 -0
- package/dist/scales/format.js +24 -0
- package/dist/scales/format.js.map +7 -0
- package/dist/scales/index.d.ts +10 -0
- package/dist/scales/index.d.ts.map +1 -0
- package/dist/scales/index.js +12 -0
- package/dist/scales/index.js.map +7 -0
- package/dist/scales/linear.d.ts +8 -0
- package/dist/scales/linear.d.ts.map +1 -0
- package/dist/scales/linear.js +22 -0
- package/dist/scales/linear.js.map +7 -0
- package/dist/scales/log.d.ts +9 -0
- package/dist/scales/log.d.ts.map +1 -0
- package/dist/scales/log.js +153 -0
- package/dist/scales/log.js.map +7 -0
- package/dist/scales/time.d.ts +8 -0
- package/dist/scales/time.d.ts.map +1 -0
- package/dist/scales/time.js +24 -0
- package/dist/scales/time.js.map +7 -0
- package/dist/scales/types.d.ts +24 -0
- package/dist/scales/types.d.ts.map +1 -0
- package/dist/scales/types.js +1 -0
- package/dist/scales/types.js.map +7 -0
- package/dist/shape/arc.d.ts +18 -0
- package/dist/shape/arc.d.ts.map +1 -0
- package/dist/shape/arc.js +51 -0
- package/dist/shape/arc.js.map +7 -0
- package/dist/shape/area.d.ts +12 -0
- package/dist/shape/area.d.ts.map +1 -0
- package/dist/shape/area.js +49 -0
- package/dist/shape/area.js.map +7 -0
- package/dist/shape/curves.d.ts +11 -0
- package/dist/shape/curves.d.ts.map +1 -0
- package/dist/shape/curves.js +123 -0
- package/dist/shape/curves.js.map +7 -0
- package/dist/shape/index.d.ts +7 -0
- package/dist/shape/index.d.ts.map +1 -0
- package/dist/shape/index.js +27 -0
- package/dist/shape/index.js.map +7 -0
- package/dist/shape/line.d.ts +8 -0
- package/dist/shape/line.d.ts.map +1 -0
- package/dist/shape/line.js +26 -0
- package/dist/shape/line.js.map +7 -0
- package/dist/shape/roundedRect.d.ts +3 -0
- package/dist/shape/roundedRect.d.ts.map +1 -0
- package/dist/shape/roundedRect.js +52 -0
- package/dist/shape/roundedRect.js.map +7 -0
- package/dist/shape/sink.d.ts +9 -0
- package/dist/shape/sink.d.ts.map +1 -0
- package/dist/shape/sink.js +1 -0
- package/dist/shape/sink.js.map +7 -0
- package/dist/spec/chartDefinitions.d.ts +57 -0
- package/dist/spec/chartDefinitions.d.ts.map +1 -0
- package/dist/spec/chartDefinitions.js +55 -0
- package/dist/spec/chartDefinitions.js.map +7 -0
- package/dist/spec/dashboard.d.ts +161 -0
- package/dist/spec/dashboard.d.ts.map +1 -0
- package/dist/spec/dashboard.js +1 -0
- package/dist/spec/dashboard.js.map +7 -0
- package/dist/spec/index.d.ts +12 -0
- package/dist/spec/index.d.ts.map +1 -0
- package/dist/spec/index.js +12 -0
- package/dist/spec/index.js.map +7 -0
- package/dist/spec/infer.d.ts +11 -0
- package/dist/spec/infer.d.ts.map +1 -0
- package/dist/spec/infer.js +20 -0
- package/dist/spec/infer.js.map +7 -0
- package/dist/spec/jsonpatch.d.ts +28 -0
- package/dist/spec/jsonpatch.d.ts.map +1 -0
- package/dist/spec/jsonpatch.js +100 -0
- package/dist/spec/jsonpatch.js.map +7 -0
- package/dist/spec/lint.d.ts +24 -0
- package/dist/spec/lint.d.ts.map +1 -0
- package/dist/spec/lint.js +175 -0
- package/dist/spec/lint.js.map +7 -0
- package/dist/spec/repair.d.ts +48 -0
- package/dist/spec/repair.d.ts.map +1 -0
- package/dist/spec/repair.js +131 -0
- package/dist/spec/repair.js.map +7 -0
- package/dist/spec/selection.d.ts +104 -0
- package/dist/spec/selection.d.ts.map +1 -0
- package/dist/spec/selection.js +1 -0
- package/dist/spec/selection.js.map +7 -0
- package/dist/spec/sketch.d.ts +22 -0
- package/dist/spec/sketch.d.ts.map +1 -0
- package/dist/spec/sketch.js +26 -0
- package/dist/spec/sketch.js.map +7 -0
- package/dist/spec/suggest.d.ts +19 -0
- package/dist/spec/suggest.d.ts.map +1 -0
- package/dist/spec/suggest.js +52 -0
- package/dist/spec/suggest.js.map +7 -0
- package/dist/spec/templates.d.ts +63 -0
- package/dist/spec/templates.d.ts.map +1 -0
- package/dist/spec/templates.js +621 -0
- package/dist/spec/templates.js.map +7 -0
- package/dist/spec/transform/aggregate.d.ts +10 -0
- package/dist/spec/transform/aggregate.d.ts.map +1 -0
- package/dist/spec/transform/aggregate.js +40 -0
- package/dist/spec/transform/aggregate.js.map +7 -0
- package/dist/spec/transform/apply.d.ts +12 -0
- package/dist/spec/transform/apply.d.ts.map +1 -0
- package/dist/spec/transform/apply.js +28 -0
- package/dist/spec/transform/apply.js.map +7 -0
- package/dist/spec/transform/bin.d.ts +28 -0
- package/dist/spec/transform/bin.d.ts.map +1 -0
- package/dist/spec/transform/bin.js +71 -0
- package/dist/spec/transform/bin.js.map +7 -0
- package/dist/spec/transform/calculate.d.ts +9 -0
- package/dist/spec/transform/calculate.d.ts.map +1 -0
- package/dist/spec/transform/calculate.js +10 -0
- package/dist/spec/transform/calculate.js.map +7 -0
- package/dist/spec/transform/expr/error.d.ts +7 -0
- package/dist/spec/transform/expr/error.d.ts.map +1 -0
- package/dist/spec/transform/expr/error.js +16 -0
- package/dist/spec/transform/expr/error.js.map +7 -0
- package/dist/spec/transform/expr/evaluate.d.ts +14 -0
- package/dist/spec/transform/expr/evaluate.d.ts.map +1 -0
- package/dist/spec/transform/expr/evaluate.js +163 -0
- package/dist/spec/transform/expr/evaluate.js.map +7 -0
- package/dist/spec/transform/expr/index.d.ts +22 -0
- package/dist/spec/transform/expr/index.d.ts.map +1 -0
- package/dist/spec/transform/expr/index.js +109 -0
- package/dist/spec/transform/expr/index.js.map +7 -0
- package/dist/spec/transform/expr/parse.d.ts +70 -0
- package/dist/spec/transform/expr/parse.d.ts.map +1 -0
- package/dist/spec/transform/expr/parse.js +199 -0
- package/dist/spec/transform/expr/parse.js.map +7 -0
- package/dist/spec/transform/expr/tokenize.d.ts +18 -0
- package/dist/spec/transform/expr/tokenize.d.ts.map +1 -0
- package/dist/spec/transform/expr/tokenize.js +88 -0
- package/dist/spec/transform/expr/tokenize.js.map +7 -0
- package/dist/spec/transform/filter.d.ts +12 -0
- package/dist/spec/transform/filter.d.ts.map +1 -0
- package/dist/spec/transform/filter.js +115 -0
- package/dist/spec/transform/filter.js.map +7 -0
- package/dist/spec/transform/fold.d.ts +10 -0
- package/dist/spec/transform/fold.d.ts.map +1 -0
- package/dist/spec/transform/fold.js +14 -0
- package/dist/spec/transform/fold.js.map +7 -0
- package/dist/spec/transform/index.d.ts +17 -0
- package/dist/spec/transform/index.d.ts.map +1 -0
- package/dist/spec/transform/index.js +27 -0
- package/dist/spec/transform/index.js.map +7 -0
- package/dist/spec/transform/timeUnit.d.ts +11 -0
- package/dist/spec/transform/timeUnit.d.ts.map +1 -0
- package/dist/spec/transform/timeUnit.js +43 -0
- package/dist/spec/transform/timeUnit.js.map +7 -0
- package/dist/spec/transform/types.d.ts +141 -0
- package/dist/spec/transform/types.d.ts.map +1 -0
- package/dist/spec/transform/types.js +16 -0
- package/dist/spec/transform/types.js.map +7 -0
- package/dist/spec/types.d.ts +1067 -0
- package/dist/spec/types.d.ts.map +1 -0
- package/dist/spec/types.js +41 -0
- package/dist/spec/types.js.map +7 -0
- package/dist/spec/validate/charts.d.ts +11 -0
- package/dist/spec/validate/charts.d.ts.map +1 -0
- package/dist/spec/validate/charts.js +416 -0
- package/dist/spec/validate/charts.js.map +7 -0
- package/dist/spec/validate/chrome.d.ts +4 -0
- package/dist/spec/validate/chrome.d.ts.map +1 -0
- package/dist/spec/validate/chrome.js +45 -0
- package/dist/spec/validate/chrome.js.map +7 -0
- package/dist/spec/validate/common.d.ts +101 -0
- package/dist/spec/validate/common.d.ts.map +1 -0
- package/dist/spec/validate/common.js +47 -0
- package/dist/spec/validate/common.js.map +7 -0
- package/dist/spec/validate/conditional.d.ts +8 -0
- package/dist/spec/validate/conditional.d.ts.map +1 -0
- package/dist/spec/validate/conditional.js +89 -0
- package/dist/spec/validate/conditional.js.map +7 -0
- package/dist/spec/validate/dashboard.d.ts +9 -0
- package/dist/spec/validate/dashboard.d.ts.map +1 -0
- package/dist/spec/validate/dashboard.js +183 -0
- package/dist/spec/validate/dashboard.js.map +7 -0
- package/dist/spec/validate/fieldDef.d.ts +14 -0
- package/dist/spec/validate/fieldDef.d.ts.map +1 -0
- package/dist/spec/validate/fieldDef.js +137 -0
- package/dist/spec/validate/fieldDef.js.map +7 -0
- package/dist/spec/validate/interaction.d.ts +10 -0
- package/dist/spec/validate/interaction.d.ts.map +1 -0
- package/dist/spec/validate/interaction.js +92 -0
- package/dist/spec/validate/interaction.js.map +7 -0
- package/dist/spec/validate/overlays.d.ts +28 -0
- package/dist/spec/validate/overlays.d.ts.map +1 -0
- package/dist/spec/validate/overlays.js +110 -0
- package/dist/spec/validate/overlays.js.map +7 -0
- package/dist/spec/validate/spec.d.ts +25 -0
- package/dist/spec/validate/spec.d.ts.map +1 -0
- package/dist/spec/validate/spec.js +141 -0
- package/dist/spec/validate/spec.js.map +7 -0
- package/dist/spec/validate/transform.d.ts +12 -0
- package/dist/spec/validate/transform.d.ts.map +1 -0
- package/dist/spec/validate/transform.js +168 -0
- package/dist/spec/validate/transform.js.map +7 -0
- package/dist/spec/validate.d.ts +3 -0
- package/dist/spec/validate.d.ts.map +1 -0
- package/dist/spec/validate.data.d.ts +5 -0
- package/dist/spec/validate.data.d.ts.map +1 -0
- package/dist/spec/validate.data.js +91 -0
- package/dist/spec/validate.data.js.map +7 -0
- package/dist/spec/validate.js +7 -0
- package/dist/spec/validate.js.map +7 -0
- package/dist/theme/fonts/patrickHand.d.ts +13 -0
- package/dist/theme/fonts/patrickHand.d.ts.map +1 -0
- package/dist/theme/fonts/patrickHand.js +7 -0
- package/dist/theme/fonts/patrickHand.js.map +7 -0
- package/dist/theme/index.d.ts +3 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +3 -0
- package/dist/theme/index.js.map +7 -0
- package/dist/theme/sketch.d.ts +26 -0
- package/dist/theme/sketch.d.ts.map +1 -0
- package/dist/theme/sketch.js +49 -0
- package/dist/theme/sketch.js.map +7 -0
- package/dist/theme/tokens.d.ts +112 -0
- package/dist/theme/tokens.d.ts.map +1 -0
- package/dist/theme/tokens.js +176 -0
- package/dist/theme/tokens.js.map +7 -0
- package/dist/ticks/index.d.ts +3 -0
- package/dist/ticks/index.d.ts.map +1 -0
- package/dist/ticks/index.js +16 -0
- package/dist/ticks/index.js.map +7 -0
- package/dist/ticks/numeric.d.ts +5 -0
- package/dist/ticks/numeric.d.ts.map +1 -0
- package/dist/ticks/numeric.js +98 -0
- package/dist/ticks/numeric.js.map +7 -0
- package/dist/ticks/time.d.ts +3 -0
- package/dist/ticks/time.d.ts.map +1 -0
- package/dist/ticks/time.js +182 -0
- package/dist/ticks/time.js.map +7 -0
- package/dist/types.d.ts +54 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +7 -0
- package/dist/util/calendar.d.ts +27 -0
- package/dist/util/calendar.d.ts.map +1 -0
- package/dist/util/calendar.js +147 -0
- package/dist/util/calendar.js.map +7 -0
- package/dist/util/data.d.ts +60 -0
- package/dist/util/data.d.ts.map +1 -0
- package/dist/util/data.js +145 -0
- package/dist/util/data.js.map +7 -0
- package/dist/util/field.d.ts +4 -0
- package/dist/util/field.d.ts.map +1 -0
- package/dist/util/field.js +15 -0
- package/dist/util/field.js.map +7 -0
- package/dist/util/index.d.ts +5 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +5 -0
- package/dist/util/index.js.map +7 -0
- package/dist/util/infer.d.ts +8 -0
- package/dist/util/infer.d.ts.map +1 -0
- package/dist/util/infer.js +62 -0
- package/dist/util/infer.js.map +7 -0
- package/dist/util/math.d.ts +41 -0
- package/dist/util/math.d.ts.map +1 -0
- package/dist/util/math.js +123 -0
- package/dist/util/math.js.map +7 -0
- package/dist/util/profile.d.ts +133 -0
- package/dist/util/profile.d.ts.map +1 -0
- package/dist/util/profile.js +314 -0
- package/dist/util/profile.js.map +7 -0
- package/package.json +10 -5
- package/dist/chunk-V6TY7KAL.js +0 -7
- package/dist/chunk-V6TY7KAL.js.map +0 -1
- package/dist/patrickHand-ITDQJJE2.js +0 -9
- package/dist/patrickHand-ITDQJJE2.js.map +0 -1
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
import { ordinalColorScale, sequentialColorScale, sequential, rgbaToCss, parseColor } from "../color/index.js";
|
|
2
|
+
import { formatValue } from "../format/index.js";
|
|
3
|
+
import { fontString, measureText, ellipsize } from "../render/text.js";
|
|
4
|
+
import { accessor, toNumber, toKey } from "../util/data.js";
|
|
5
|
+
import { RoughPen } from "../rough/index.js";
|
|
6
|
+
import { resolveSketch } from "../spec/sketch.js";
|
|
7
|
+
import { addOverlayText, drawTitleBlock } from "./chrome.js";
|
|
8
|
+
import { addCenteredEmptyMessage } from "./emptyOverlay.js";
|
|
9
|
+
const MIN_LABEL_WIDTH = 38;
|
|
10
|
+
const MIN_LABEL_HEIGHT = 24;
|
|
11
|
+
function cleanRect(rect) {
|
|
12
|
+
return {
|
|
13
|
+
x: Number.isFinite(rect.x) ? rect.x : 0,
|
|
14
|
+
y: Number.isFinite(rect.y) ? rect.y : 0,
|
|
15
|
+
width: Math.max(0, Number.isFinite(rect.width) ? rect.width : 0),
|
|
16
|
+
height: Math.max(0, Number.isFinite(rect.height) ? rect.height : 0)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function worst(row, side) {
|
|
20
|
+
if (row.length === 0 || side <= 0) return Infinity;
|
|
21
|
+
let sum = 0;
|
|
22
|
+
let min = Infinity;
|
|
23
|
+
let max = 0;
|
|
24
|
+
for (const area of row) {
|
|
25
|
+
sum += area;
|
|
26
|
+
min = Math.min(min, area);
|
|
27
|
+
max = Math.max(max, area);
|
|
28
|
+
}
|
|
29
|
+
if (sum <= 0 || min <= 0) return Infinity;
|
|
30
|
+
const side2 = side * side;
|
|
31
|
+
return Math.max(side2 * max / (sum * sum), sum * sum / (side2 * min));
|
|
32
|
+
}
|
|
33
|
+
function layoutRow(row, rect, out) {
|
|
34
|
+
const area = row.reduce((sum, d) => sum + d.area, 0);
|
|
35
|
+
if (area <= 0 || rect.width <= 0 || rect.height <= 0) return rect;
|
|
36
|
+
if (rect.height >= rect.width) {
|
|
37
|
+
const h = Math.min(rect.height, area / rect.width);
|
|
38
|
+
let x = rect.x;
|
|
39
|
+
for (let i = 0; i < row.length; i++) {
|
|
40
|
+
const w2 = i === row.length - 1 ? rect.x + rect.width - x : row[i].area / h;
|
|
41
|
+
out.push({ item: row[i].item, rect: { x, y: rect.y, width: Math.max(0, w2), height: h } });
|
|
42
|
+
x += w2;
|
|
43
|
+
}
|
|
44
|
+
return { x: rect.x, y: rect.y + h, width: rect.width, height: Math.max(0, rect.height - h) };
|
|
45
|
+
}
|
|
46
|
+
const w = Math.min(rect.width, area / rect.height);
|
|
47
|
+
let y = rect.y;
|
|
48
|
+
for (let i = 0; i < row.length; i++) {
|
|
49
|
+
const h = i === row.length - 1 ? rect.y + rect.height - y : row[i].area / w;
|
|
50
|
+
out.push({ item: row[i].item, rect: { x: rect.x, y, width: w, height: Math.max(0, h) } });
|
|
51
|
+
y += h;
|
|
52
|
+
}
|
|
53
|
+
return { x: rect.x + w, y: rect.y, width: Math.max(0, rect.width - w), height: rect.height };
|
|
54
|
+
}
|
|
55
|
+
function layoutTreemap(items, rect) {
|
|
56
|
+
const box = cleanRect(rect);
|
|
57
|
+
const total = items.reduce((sum, item) => Number.isFinite(item.value) && item.value > 0 ? sum + item.value : sum, 0);
|
|
58
|
+
const area = box.width * box.height;
|
|
59
|
+
if (total <= 0 || area <= 0) return [];
|
|
60
|
+
const pending = items.filter((item) => Number.isFinite(item.value) && item.value > 0).map((item) => ({ item, area: item.value / total * area }));
|
|
61
|
+
const out = [];
|
|
62
|
+
let rest = box;
|
|
63
|
+
let row = [];
|
|
64
|
+
let rowAreas = [];
|
|
65
|
+
const flush = () => {
|
|
66
|
+
if (row.length === 0) return;
|
|
67
|
+
rest = layoutRow(row, rest, out);
|
|
68
|
+
row = [];
|
|
69
|
+
rowAreas = [];
|
|
70
|
+
};
|
|
71
|
+
for (const next of pending) {
|
|
72
|
+
const side = Math.min(rest.width, rest.height);
|
|
73
|
+
if (row.length === 0 || worst([...rowAreas, next.area], side) <= worst(rowAreas, side)) {
|
|
74
|
+
row.push(next);
|
|
75
|
+
rowAreas.push(next.area);
|
|
76
|
+
} else {
|
|
77
|
+
flush();
|
|
78
|
+
row.push(next);
|
|
79
|
+
rowAreas.push(next.area);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
flush();
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
function insetRect(rect, pad) {
|
|
86
|
+
return {
|
|
87
|
+
x: rect.x + pad,
|
|
88
|
+
y: rect.y + pad,
|
|
89
|
+
width: Math.max(0, rect.width - pad * 2),
|
|
90
|
+
height: Math.max(0, rect.height - pad * 2)
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function labelFor(value) {
|
|
94
|
+
const key = toKey(value);
|
|
95
|
+
return key === "" ? "(blank)" : key;
|
|
96
|
+
}
|
|
97
|
+
function textureShade(fill) {
|
|
98
|
+
const lum = (0.299 * fill.r + 0.587 * fill.g + 0.114 * fill.b) / 255;
|
|
99
|
+
const k = lum > 0.5 ? 0.68 : 1.4;
|
|
100
|
+
const c = (n) => Math.max(0, Math.min(255, Math.round(n * k)));
|
|
101
|
+
return rgbaToCss({ r: c(fill.r), g: c(fill.g), b: c(fill.b), a: 1 });
|
|
102
|
+
}
|
|
103
|
+
function buildLeaves(treemap) {
|
|
104
|
+
const readCategory = accessor(treemap.encoding.category.field);
|
|
105
|
+
const readValue = accessor(treemap.encoding.value.field);
|
|
106
|
+
const readGroup = treemap.encoding.group ? accessor(treemap.encoding.group.field) : null;
|
|
107
|
+
const readColor = treemap.encoding.color ? accessor(treemap.encoding.color.field) : null;
|
|
108
|
+
const order = [];
|
|
109
|
+
const totals = /* @__PURE__ */ new Map();
|
|
110
|
+
for (const row of treemap.data ?? []) {
|
|
111
|
+
const rawCategory = readCategory(row);
|
|
112
|
+
const categoryKey = toKey(rawCategory);
|
|
113
|
+
const rawGroup = readGroup ? readGroup(row) : void 0;
|
|
114
|
+
const groupKey = readGroup ? toKey(rawGroup) : void 0;
|
|
115
|
+
const key = groupKey === void 0 ? categoryKey : `${groupKey}\0${categoryKey}`;
|
|
116
|
+
const value = toNumber(readValue(row));
|
|
117
|
+
if (!Number.isFinite(value) || value <= 0) continue;
|
|
118
|
+
let leaf = totals.get(key);
|
|
119
|
+
if (!leaf) {
|
|
120
|
+
const colorValue = readColor ? readColor(row) : void 0;
|
|
121
|
+
const colorNumber = colorValue === void 0 ? void 0 : toNumber(colorValue);
|
|
122
|
+
leaf = {
|
|
123
|
+
key,
|
|
124
|
+
category: rawCategory,
|
|
125
|
+
categoryLabel: labelFor(rawCategory),
|
|
126
|
+
value: 0,
|
|
127
|
+
group: rawGroup,
|
|
128
|
+
groupKey,
|
|
129
|
+
groupLabel: groupKey === void 0 ? void 0 : labelFor(rawGroup),
|
|
130
|
+
colorValue,
|
|
131
|
+
colorNumber: Number.isFinite(colorNumber) ? colorNumber : void 0,
|
|
132
|
+
fill: { r: 0, g: 0, b: 0, a: 1 },
|
|
133
|
+
fillCss: "#000",
|
|
134
|
+
sourceRows: 0
|
|
135
|
+
};
|
|
136
|
+
totals.set(key, leaf);
|
|
137
|
+
order.push(key);
|
|
138
|
+
}
|
|
139
|
+
leaf.value += value;
|
|
140
|
+
leaf.sourceRows++;
|
|
141
|
+
}
|
|
142
|
+
return order.map((key) => totals.get(key));
|
|
143
|
+
}
|
|
144
|
+
function colorLeaves(leaves, treemap, tokens) {
|
|
145
|
+
const fallback = parseColor(tokens.color.surface) ?? parseColor(tokens.color.palette[0] ?? "#14b8a6") ?? { r: 20, g: 184, b: 166, a: 1 };
|
|
146
|
+
const color = treemap.encoding.color;
|
|
147
|
+
const ordinal = ordinalColorScale({ palette: tokens.color.palette });
|
|
148
|
+
const numericValues = color ? leaves.map((leaf) => leaf.colorNumber).filter((n) => n !== void 0) : [];
|
|
149
|
+
const numericColor = Boolean(color && (color.type === "quantitative" || numericValues.length > 0 && numericValues.length === leaves.length));
|
|
150
|
+
const domain = numericValues.length ? [Math.min(...numericValues), Math.max(...numericValues)] : [0, 1];
|
|
151
|
+
const continuous = sequentialColorScale({ domain, interpolator: sequential(treemap.scheme ?? "teal") });
|
|
152
|
+
for (const leaf of leaves) {
|
|
153
|
+
let fill = fallback;
|
|
154
|
+
if (color) {
|
|
155
|
+
if (numericColor) {
|
|
156
|
+
if (leaf.colorNumber === void 0) {
|
|
157
|
+
fill = parseColor(tokens.color.border) ?? fallback;
|
|
158
|
+
leaf.colorNoData = true;
|
|
159
|
+
} else {
|
|
160
|
+
fill = continuous.map(leaf.colorNumber);
|
|
161
|
+
}
|
|
162
|
+
} else fill = ordinal.map(toKey(leaf.colorValue));
|
|
163
|
+
} else if (treemap.encoding.group && leaf.groupKey !== void 0) {
|
|
164
|
+
fill = ordinal.map(leaf.groupKey);
|
|
165
|
+
} else {
|
|
166
|
+
fill = ordinal.map(leaf.categoryLabel);
|
|
167
|
+
}
|
|
168
|
+
leaf.fill = fill;
|
|
169
|
+
leaf.fillCss = rgbaToCss(fill);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function buildGroups(leaves) {
|
|
173
|
+
const order = [];
|
|
174
|
+
const groups = /* @__PURE__ */ new Map();
|
|
175
|
+
for (const leaf of leaves) {
|
|
176
|
+
const key = leaf.groupKey ?? "";
|
|
177
|
+
let group = groups.get(key);
|
|
178
|
+
if (!group) {
|
|
179
|
+
group = { key, label: leaf.groupLabel ?? "(blank)", value: 0, leaves: [] };
|
|
180
|
+
groups.set(key, group);
|
|
181
|
+
order.push(key);
|
|
182
|
+
}
|
|
183
|
+
group.value += leaf.value;
|
|
184
|
+
group.leaves.push(leaf);
|
|
185
|
+
}
|
|
186
|
+
return order.map((key) => groups.get(key));
|
|
187
|
+
}
|
|
188
|
+
function tileProbe(treemap, tile) {
|
|
189
|
+
const probe = { [treemap.encoding.category.field]: tile.category };
|
|
190
|
+
const groupField = treemap.encoding.group?.field;
|
|
191
|
+
if (groupField) probe[groupField] = tile.group;
|
|
192
|
+
return probe;
|
|
193
|
+
}
|
|
194
|
+
function drawRect(ctx, pen, rect, fill, fillCss, stroke) {
|
|
195
|
+
if (rect.width <= 0 || rect.height <= 0) return;
|
|
196
|
+
if (pen) {
|
|
197
|
+
pen.rect(rect.x, rect.y, rect.width, rect.height, { fill: fillCss, fillStyle: "solid" });
|
|
198
|
+
pen.rect(rect.x, rect.y, rect.width, rect.height, {
|
|
199
|
+
fill: textureShade(fill),
|
|
200
|
+
fillStyle: "hachure",
|
|
201
|
+
fillAlpha: 0.4,
|
|
202
|
+
hachureGap: 7,
|
|
203
|
+
stroke
|
|
204
|
+
});
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
ctx.fillStyle = fillCss;
|
|
208
|
+
ctx.fillRect(rect.x, rect.y, rect.width, rect.height);
|
|
209
|
+
ctx.strokeStyle = stroke;
|
|
210
|
+
ctx.lineWidth = 1;
|
|
211
|
+
ctx.strokeRect(rect.x + 0.5, rect.y + 0.5, Math.max(0, rect.width - 1), Math.max(0, rect.height - 1));
|
|
212
|
+
}
|
|
213
|
+
function addTileLabels(surface, tokens, tile, valueFormat) {
|
|
214
|
+
const compact = tile.rect.width < MIN_LABEL_WIDTH || tile.rect.height < MIN_LABEL_HEIGHT;
|
|
215
|
+
const pad = compact ? 2 : 5;
|
|
216
|
+
const padX = compact ? 3 : 6;
|
|
217
|
+
const padY = compact ? 1 : 2;
|
|
218
|
+
const labelSize = tokens.font.size.small;
|
|
219
|
+
if (tile.rect.width <= pad * 2 + padX * 2 + 2 || tile.rect.height < labelSize + padY * 2 + pad * 2 + 2) {
|
|
220
|
+
surface.labels?.omit({ role: "data-label", reason: "space", required: true, example: tile.categoryLabel, path: "/labels" });
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const valueSize = tokens.font.size.tiny;
|
|
224
|
+
const labelFont = fontString(labelSize, tokens.font.family, tokens.font.weight.bold);
|
|
225
|
+
const valueFont = fontString(valueSize, tokens.font.family);
|
|
226
|
+
const maxTextWidth = tile.rect.width - pad * 2 - padX * 2 - 2;
|
|
227
|
+
const labelText = ellipsize(tile.categoryLabel, maxTextWidth, labelFont);
|
|
228
|
+
if (labelText === "" || labelText === "\u2026" || compact && labelText.length / Math.max(1, tile.categoryLabel.length) < 0.5) {
|
|
229
|
+
surface.labels?.omit({ role: "data-label", reason: "unreadable", required: true, example: tile.categoryLabel, path: "/labels" });
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const pill = { background: tokens.color.surface, border: tokens.color.border, padX, padY };
|
|
233
|
+
addOverlayText(surface, tokens, {
|
|
234
|
+
left: tile.rect.x + pad + 2,
|
|
235
|
+
top: tile.rect.y + pad,
|
|
236
|
+
text: tile.categoryLabel,
|
|
237
|
+
maxWidth: maxTextWidth,
|
|
238
|
+
color: tokens.color.text,
|
|
239
|
+
size: labelSize,
|
|
240
|
+
weight: tokens.font.weight.bold,
|
|
241
|
+
pill
|
|
242
|
+
});
|
|
243
|
+
const labelPillH = labelSize + padY * 2 + 2;
|
|
244
|
+
const valuePillH = valueSize + padY * 2 + 2;
|
|
245
|
+
const valueText = formatValue(tile.value, valueFormat);
|
|
246
|
+
if (tile.rect.height >= pad * 2 + labelPillH + 2 + valuePillH && measureText(valueText, valueFont).width <= maxTextWidth) {
|
|
247
|
+
addOverlayText(surface, tokens, {
|
|
248
|
+
left: tile.rect.x + pad + 2,
|
|
249
|
+
top: tile.rect.y + pad + labelPillH + 2,
|
|
250
|
+
text: valueText,
|
|
251
|
+
color: tokens.color.textMuted,
|
|
252
|
+
size: valueSize,
|
|
253
|
+
pill
|
|
254
|
+
});
|
|
255
|
+
} else {
|
|
256
|
+
surface.labels?.omit({ role: "data-label", reason: "space", required: false, example: valueText, path: "/labels" });
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function drawNoPositiveTreemap(surface, tokens, content) {
|
|
260
|
+
addCenteredEmptyMessage(surface, tokens, content, "No positive values");
|
|
261
|
+
}
|
|
262
|
+
function drawTreemapTiles(surface, treemap, tokens, content, leaves, context) {
|
|
263
|
+
const ctx = surface.marks.ctx;
|
|
264
|
+
const emphasis = context?.emphasis ?? null;
|
|
265
|
+
const sketch = resolveSketch(treemap);
|
|
266
|
+
const pen = sketch ? new RoughPen(ctx, sketch) : null;
|
|
267
|
+
const tiles = [];
|
|
268
|
+
const groupRects = [];
|
|
269
|
+
const stroke = tokens.color.textMuted;
|
|
270
|
+
let represented = 0;
|
|
271
|
+
const drawTile = (tile) => {
|
|
272
|
+
const alpha = emphasis ? emphasis.match(tileProbe(treemap, tile)) ? 1 : emphasis.dim : 1;
|
|
273
|
+
if (alpha !== 1) ctx.globalAlpha = alpha;
|
|
274
|
+
drawRect(ctx, pen, tile.rect, tile.fill, tile.fillCss, stroke);
|
|
275
|
+
if (tile.rect.width > 0 && tile.rect.height > 0) {
|
|
276
|
+
surface.evidence?.mark("tile", tile.rect.x, tile.rect.y, tile.rect.width, tile.rect.height, tile.fillCss, alpha, void 0, 1, void 0, alpha < 1, { color: stroke, opacity: 0.65, width: 1 });
|
|
277
|
+
represented += tile.sourceRows;
|
|
278
|
+
}
|
|
279
|
+
if (alpha !== 1) ctx.globalAlpha = 1;
|
|
280
|
+
};
|
|
281
|
+
ctx.save();
|
|
282
|
+
if (treemap.encoding.group) {
|
|
283
|
+
const groups = buildGroups(leaves);
|
|
284
|
+
for (const groupNode of layoutTreemap(groups, content)) {
|
|
285
|
+
const gRect = groupNode.rect;
|
|
286
|
+
const headerH = gRect.width >= 46 && gRect.height >= 40 ? tokens.font.size.tiny + 8 : 0;
|
|
287
|
+
groupRects.push({ group: groupNode.item, rect: gRect, headerH });
|
|
288
|
+
const inner = insetRect(
|
|
289
|
+
{ x: gRect.x, y: gRect.y + headerH, width: gRect.width, height: Math.max(0, gRect.height - headerH) },
|
|
290
|
+
2
|
|
291
|
+
);
|
|
292
|
+
for (const leafNode of layoutTreemap(groupNode.item.leaves, inner)) {
|
|
293
|
+
const tile = { ...leafNode.item, rect: leafNode.rect };
|
|
294
|
+
tiles.push(tile);
|
|
295
|
+
drawTile(tile);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
} else {
|
|
299
|
+
for (const leafNode of layoutTreemap(leaves, content)) {
|
|
300
|
+
const tile = { ...leafNode.item, rect: leafNode.rect };
|
|
301
|
+
tiles.push(tile);
|
|
302
|
+
drawTile(tile);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
ctx.restore();
|
|
306
|
+
return { tiles, groupRects, represented, pen, sketch };
|
|
307
|
+
}
|
|
308
|
+
function drawGroupFrames(surface, tokens, treemap, groups, pen, sketch) {
|
|
309
|
+
const ctx = surface.marks.ctx;
|
|
310
|
+
const stroke = tokens.color.background;
|
|
311
|
+
for (const { group, rect, headerH } of groups) {
|
|
312
|
+
if (pen) pen.rect(rect.x, rect.y, rect.width, rect.height, { stroke, roughness: sketch.roughness * 0.6 });
|
|
313
|
+
else {
|
|
314
|
+
ctx.strokeStyle = stroke;
|
|
315
|
+
ctx.lineWidth = 1;
|
|
316
|
+
ctx.strokeRect(rect.x + 0.5, rect.y + 0.5, Math.max(0, rect.width - 1), Math.max(0, rect.height - 1));
|
|
317
|
+
}
|
|
318
|
+
if (headerH > 0) {
|
|
319
|
+
const headerW = Math.max(0, rect.width - 10);
|
|
320
|
+
addOverlayText(surface, tokens, {
|
|
321
|
+
left: rect.x + 5,
|
|
322
|
+
top: rect.y + 4,
|
|
323
|
+
width: headerW,
|
|
324
|
+
text: group.label,
|
|
325
|
+
maxWidth: headerW,
|
|
326
|
+
color: tokens.color.text,
|
|
327
|
+
size: tokens.font.size.tiny,
|
|
328
|
+
weight: tokens.font.weight.bold,
|
|
329
|
+
opacity: 0.78
|
|
330
|
+
});
|
|
331
|
+
} else if (treemap.labels !== false) {
|
|
332
|
+
surface.labels?.omit({ role: "data-label", reason: "space", required: true, example: group.label, path: "/encoding/group" });
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
function buildTreemapInteraction(treemap, content, tiles, total) {
|
|
337
|
+
const valueLabel = treemap.encoding.value.title ?? treemap.encoding.value.field;
|
|
338
|
+
const colorLabel = treemap.encoding.color?.title ?? treemap.encoding.color?.field;
|
|
339
|
+
const categoryField = treemap.encoding.category.field;
|
|
340
|
+
const groupField = treemap.encoding.group?.field;
|
|
341
|
+
const hitTile = (px, py) => {
|
|
342
|
+
for (let i = tiles.length - 1; i >= 0; i--) {
|
|
343
|
+
const tile = tiles[i];
|
|
344
|
+
if (px >= tile.rect.x && px <= tile.rect.x + tile.rect.width && py >= tile.rect.y && py <= tile.rect.y + tile.rect.height) return tile;
|
|
345
|
+
}
|
|
346
|
+
return null;
|
|
347
|
+
};
|
|
348
|
+
return {
|
|
349
|
+
region: { x: content.x, y: content.y, width: content.width, height: content.height },
|
|
350
|
+
hitTest: (px, py) => {
|
|
351
|
+
const tile = hitTile(px, py);
|
|
352
|
+
if (!tile) return null;
|
|
353
|
+
return {
|
|
354
|
+
key: tile.key,
|
|
355
|
+
anchorX: px,
|
|
356
|
+
anchorY: py,
|
|
357
|
+
content: {
|
|
358
|
+
title: groupField ? `${tile.groupLabel ?? "(blank)"} \u25B8 ${tile.categoryLabel}` : tile.categoryLabel,
|
|
359
|
+
rows: [
|
|
360
|
+
{ swatch: tile.fillCss, label: valueLabel, value: formatValue(tile.value, treemap.encoding.value.format) },
|
|
361
|
+
...colorLabel ? [{
|
|
362
|
+
label: colorLabel,
|
|
363
|
+
value: tile.colorNoData ? "no data" : formatValue(tile.colorValue, treemap.encoding.color?.format),
|
|
364
|
+
muted: true
|
|
365
|
+
}] : [],
|
|
366
|
+
{ label: "share", value: `${(tile.value / total * 100).toFixed(1)}%`, muted: true }
|
|
367
|
+
]
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
},
|
|
371
|
+
pick: (px, py) => {
|
|
372
|
+
const tile = hitTile(px, py);
|
|
373
|
+
if (!tile) return null;
|
|
374
|
+
return groupField ? { kind: "point", fields: [categoryField, groupField], tuples: [[tile.category, tile.group]] } : { kind: "point", fields: [categoryField], tuples: [[tile.category]] };
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
function drawTreemap(surface, spec, tokens, size, context) {
|
|
379
|
+
surface.evidence?.begin("aggregate");
|
|
380
|
+
surface.evidence?.data(0, "aggregate");
|
|
381
|
+
const treemap = spec;
|
|
382
|
+
const content = drawTitleBlock(surface, tokens, size, treemap.title);
|
|
383
|
+
const leaves = buildLeaves(treemap);
|
|
384
|
+
colorLeaves(leaves, treemap, tokens);
|
|
385
|
+
const total = leaves.reduce((sum, leaf) => sum + leaf.value, 0);
|
|
386
|
+
if (leaves.length === 0 || total <= 0 || content.width <= 0 || content.height <= 0) {
|
|
387
|
+
drawNoPositiveTreemap(surface, tokens, content);
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
const { tiles, groupRects, represented, pen, sketch } = drawTreemapTiles(surface, treemap, tokens, content, leaves, context);
|
|
391
|
+
surface.evidence?.data(represented, "aggregate");
|
|
392
|
+
if (treemap.encoding.group) {
|
|
393
|
+
drawGroupFrames(surface, tokens, treemap, groupRects, pen, sketch);
|
|
394
|
+
}
|
|
395
|
+
if (treemap.labels !== false) {
|
|
396
|
+
for (const tile of tiles) addTileLabels(surface, tokens, tile, treemap.encoding.value.format);
|
|
397
|
+
}
|
|
398
|
+
return buildTreemapInteraction(treemap, content, tiles, total);
|
|
399
|
+
}
|
|
400
|
+
export {
|
|
401
|
+
drawTreemap,
|
|
402
|
+
layoutTreemap
|
|
403
|
+
};
|
|
404
|
+
//# sourceMappingURL=treemap.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/charts/treemap.ts"],
|
|
4
|
+
"sourcesContent": ["import { ordinalColorScale, sequentialColorScale, sequential, rgbaToCss, parseColor } from '../color';\nimport { formatValue } from '../format';\nimport { fontString, measureText, ellipsize } from '../render/text';\nimport { accessor, toNumber, toKey } from '../util/data';\nimport { RoughPen } from '../rough';\nimport { resolveSketch } from '../spec/sketch';\nimport { addOverlayText, drawTitleBlock } from './chrome';\nimport type { ChartSpec, TreemapSpec } from '../spec/types';\nimport type { Surface } from '../render/surface';\nimport type { ThemeTokens } from '../theme';\nimport type { InteractionModel } from '../interaction/types';\nimport type { RenderContext } from './index';\nimport type { Datum, Rect, RGBA, Size } from '../types';\nimport { addCenteredEmptyMessage } from './emptyOverlay';\n\nexport interface TreemapLayoutInput {\n value: number;\n}\n\nexport interface TreemapLayoutNode<T extends TreemapLayoutInput = TreemapLayoutInput> {\n item: T;\n rect: Rect;\n}\n\ninterface Leaf extends TreemapLayoutInput {\n key: string;\n category: unknown;\n categoryLabel: string;\n value: number;\n group?: unknown;\n groupKey?: string;\n groupLabel?: string;\n colorValue?: unknown;\n colorNumber?: number;\n colorNoData?: boolean;\n fill: RGBA;\n fillCss: string;\n sourceRows: number;\n}\n\ninterface GroupItem extends TreemapLayoutInput {\n key: string;\n label: string;\n value: number;\n leaves: Leaf[];\n}\n\ninterface Tile extends Leaf {\n rect: Rect;\n}\n\nconst MIN_LABEL_WIDTH = 38;\nconst MIN_LABEL_HEIGHT = 24;\n\nfunction cleanRect(rect: Rect): Rect {\n return {\n x: Number.isFinite(rect.x) ? rect.x : 0,\n y: Number.isFinite(rect.y) ? rect.y : 0,\n width: Math.max(0, Number.isFinite(rect.width) ? rect.width : 0),\n height: Math.max(0, Number.isFinite(rect.height) ? rect.height : 0),\n };\n}\n\nfunction worst(row: readonly number[], side: number): number {\n if (row.length === 0 || side <= 0) return Infinity;\n let sum = 0;\n let min = Infinity;\n let max = 0;\n for (const area of row) {\n sum += area;\n min = Math.min(min, area);\n max = Math.max(max, area);\n }\n if (sum <= 0 || min <= 0) return Infinity;\n const side2 = side * side;\n return Math.max((side2 * max) / (sum * sum), (sum * sum) / (side2 * min));\n}\n\nfunction layoutRow<T extends TreemapLayoutInput>(\n row: readonly { item: T; area: number }[],\n rect: Rect,\n out: TreemapLayoutNode<T>[],\n): Rect {\n const area = row.reduce((sum, d) => sum + d.area, 0);\n if (area <= 0 || rect.width <= 0 || rect.height <= 0) return rect;\n\n if (rect.height >= rect.width) {\n const h = Math.min(rect.height, area / rect.width);\n let x = rect.x;\n for (let i = 0; i < row.length; i++) {\n const w = i === row.length - 1 ? rect.x + rect.width - x : row[i].area / h;\n out.push({ item: row[i].item, rect: { x, y: rect.y, width: Math.max(0, w), height: h } });\n x += w;\n }\n return { x: rect.x, y: rect.y + h, width: rect.width, height: Math.max(0, rect.height - h) };\n }\n\n const w = Math.min(rect.width, area / rect.height);\n let y = rect.y;\n for (let i = 0; i < row.length; i++) {\n const h = i === row.length - 1 ? rect.y + rect.height - y : row[i].area / w;\n out.push({ item: row[i].item, rect: { x: rect.x, y, width: w, height: Math.max(0, h) } });\n y += h;\n }\n return { x: rect.x + w, y: rect.y, width: Math.max(0, rect.width - w), height: rect.height };\n}\n\n/** Squarified treemap layout. Input order is preserved for deterministic agent output. */\nexport function layoutTreemap<T extends TreemapLayoutInput>(items: readonly T[], rect: Rect): TreemapLayoutNode<T>[] {\n const box = cleanRect(rect);\n const total = items.reduce((sum, item) => (Number.isFinite(item.value) && item.value > 0 ? sum + item.value : sum), 0);\n const area = box.width * box.height;\n if (total <= 0 || area <= 0) return [];\n\n const pending = items\n .filter((item) => Number.isFinite(item.value) && item.value > 0)\n .map((item) => ({ item, area: (item.value / total) * area }));\n const out: TreemapLayoutNode<T>[] = [];\n let rest = box;\n let row: { item: T; area: number }[] = [];\n let rowAreas: number[] = [];\n\n const flush = () => {\n if (row.length === 0) return;\n rest = layoutRow(row, rest, out);\n row = [];\n rowAreas = [];\n };\n\n for (const next of pending) {\n const side = Math.min(rest.width, rest.height);\n if (row.length === 0 || worst([...rowAreas, next.area], side) <= worst(rowAreas, side)) {\n row.push(next);\n rowAreas.push(next.area);\n } else {\n flush();\n row.push(next);\n rowAreas.push(next.area);\n }\n }\n flush();\n return out;\n}\n\nfunction insetRect(rect: Rect, pad: number): Rect {\n return {\n x: rect.x + pad,\n y: rect.y + pad,\n width: Math.max(0, rect.width - pad * 2),\n height: Math.max(0, rect.height - pad * 2),\n };\n}\n\nfunction labelFor(value: unknown): string {\n const key = toKey(value);\n return key === '' ? '(blank)' : key;\n}\n\n/**\n * A hand-drawn hachure shade for a tile fill: shifted *away* from the fill's own\n * luminance (darker for light tiles, lighter for dark tiles) so the \"marker\"\n * streaks stay visible on any colour in the sequential/ordinal scale.\n */\nfunction textureShade(fill: RGBA): string {\n const lum = (0.299 * fill.r + 0.587 * fill.g + 0.114 * fill.b) / 255;\n const k = lum > 0.5 ? 0.68 : 1.4;\n const c = (n: number) => Math.max(0, Math.min(255, Math.round(n * k)));\n return rgbaToCss({ r: c(fill.r), g: c(fill.g), b: c(fill.b), a: 1 });\n}\n\nfunction buildLeaves(treemap: TreemapSpec): Leaf[] {\n const readCategory = accessor(treemap.encoding.category.field);\n const readValue = accessor(treemap.encoding.value.field);\n const readGroup = treemap.encoding.group ? accessor(treemap.encoding.group.field) : null;\n const readColor = treemap.encoding.color ? accessor(treemap.encoding.color.field) : null;\n const order: string[] = [];\n const totals = new Map<string, Leaf>();\n\n for (const row of treemap.data ?? []) {\n const rawCategory = readCategory(row);\n const categoryKey = toKey(rawCategory);\n const rawGroup = readGroup ? readGroup(row) : undefined;\n const groupKey = readGroup ? toKey(rawGroup) : undefined;\n const key = groupKey === undefined ? categoryKey : `${groupKey}\\u0000${categoryKey}`;\n const value = toNumber(readValue(row));\n if (!Number.isFinite(value) || value <= 0) continue;\n\n let leaf = totals.get(key);\n if (!leaf) {\n const colorValue = readColor ? readColor(row) : undefined;\n const colorNumber = colorValue === undefined ? undefined : toNumber(colorValue);\n leaf = {\n key,\n category: rawCategory,\n categoryLabel: labelFor(rawCategory),\n value: 0,\n group: rawGroup,\n groupKey,\n groupLabel: groupKey === undefined ? undefined : labelFor(rawGroup),\n colorValue,\n colorNumber: Number.isFinite(colorNumber) ? colorNumber : undefined,\n fill: { r: 0, g: 0, b: 0, a: 1 },\n fillCss: '#000',\n sourceRows: 0,\n };\n totals.set(key, leaf);\n order.push(key);\n }\n leaf.value += value;\n leaf.sourceRows++;\n }\n\n return order.map((key) => totals.get(key)!);\n}\n\nfunction colorLeaves(leaves: Leaf[], treemap: TreemapSpec, tokens: ThemeTokens): void {\n const fallback = parseColor(tokens.color.surface) ?? parseColor(tokens.color.palette[0] ?? '#14b8a6') ?? { r: 20, g: 184, b: 166, a: 1 };\n const color = treemap.encoding.color;\n const ordinal = ordinalColorScale({ palette: tokens.color.palette });\n const numericValues = color ? leaves.map((leaf) => leaf.colorNumber).filter((n): n is number => n !== undefined) : [];\n const numericColor = Boolean(color && (color.type === 'quantitative' || (numericValues.length > 0 && numericValues.length === leaves.length)));\n const domain: [number, number] = numericValues.length\n ? [Math.min(...numericValues), Math.max(...numericValues)]\n : [0, 1];\n const continuous = sequentialColorScale({ domain, interpolator: sequential(treemap.scheme ?? 'teal') });\n\n for (const leaf of leaves) {\n let fill: RGBA = fallback;\n if (color) {\n if (numericColor) {\n if (leaf.colorNumber === undefined) {\n fill = parseColor(tokens.color.border) ?? fallback;\n leaf.colorNoData = true;\n } else {\n fill = continuous.map(leaf.colorNumber);\n }\n }\n else fill = ordinal.map(toKey(leaf.colorValue));\n } else if (treemap.encoding.group && leaf.groupKey !== undefined) {\n fill = ordinal.map(leaf.groupKey);\n } else {\n fill = ordinal.map(leaf.categoryLabel);\n }\n leaf.fill = fill;\n leaf.fillCss = rgbaToCss(fill);\n }\n}\n\nfunction buildGroups(leaves: readonly Leaf[]): GroupItem[] {\n const order: string[] = [];\n const groups = new Map<string, GroupItem>();\n for (const leaf of leaves) {\n const key = leaf.groupKey ?? '';\n let group = groups.get(key);\n if (!group) {\n group = { key, label: leaf.groupLabel ?? '(blank)', value: 0, leaves: [] };\n groups.set(key, group);\n order.push(key);\n }\n group.value += leaf.value;\n group.leaves.push(leaf);\n }\n return order.map((key) => groups.get(key)!);\n}\n\nfunction tileProbe(treemap: TreemapSpec, tile: Tile): Datum {\n const probe: Datum = { [treemap.encoding.category.field]: tile.category };\n const groupField = treemap.encoding.group?.field;\n if (groupField) probe[groupField] = tile.group;\n return probe;\n}\n\nfunction drawRect(ctx: CanvasRenderingContext2D, pen: RoughPen | null, rect: Rect, fill: RGBA, fillCss: string, stroke: string): void {\n if (rect.width <= 0 || rect.height <= 0) return;\n if (pen) {\n // A solid base keeps the value-encoding colour crisp (light tiles stay\n // legible on a dark page), while a same-family hachure overlay adds\n // hand-drawn \"marker shading\" so the tile doesn't read as a flat digital\n // block trapped inside a wobbly outline. The overlay carries the outline.\n pen.rect(rect.x, rect.y, rect.width, rect.height, { fill: fillCss, fillStyle: 'solid' });\n pen.rect(rect.x, rect.y, rect.width, rect.height, {\n fill: textureShade(fill),\n fillStyle: 'hachure',\n fillAlpha: 0.4,\n hachureGap: 7,\n stroke,\n });\n return;\n }\n ctx.fillStyle = fillCss;\n ctx.fillRect(rect.x, rect.y, rect.width, rect.height);\n ctx.strokeStyle = stroke;\n ctx.lineWidth = 1;\n ctx.strokeRect(rect.x + 0.5, rect.y + 0.5, Math.max(0, rect.width - 1), Math.max(0, rect.height - 1));\n}\n\nfunction addTileLabels(surface: Surface, tokens: ThemeTokens, tile: Tile, valueFormat?: string): void {\n const compact = tile.rect.width < MIN_LABEL_WIDTH || tile.rect.height < MIN_LABEL_HEIGHT;\n const pad = compact ? 2 : 5;\n const padX = compact ? 3 : 6;\n const padY = compact ? 1 : 2;\n const labelSize = tokens.font.size.small;\n if (tile.rect.width <= pad * 2 + padX * 2 + 2 ||\n tile.rect.height < labelSize + padY * 2 + pad * 2 + 2) {\n surface.labels?.omit({ role: 'data-label', reason: 'space', required: true, example: tile.categoryLabel, path: '/labels' });\n return;\n }\n const valueSize = tokens.font.size.tiny;\n const labelFont = fontString(labelSize, tokens.font.family, tokens.font.weight.bold);\n const valueFont = fontString(valueSize, tokens.font.family);\n // Text budget inside the tile padding and the pill's own padding + 1px border\n // on each side, so the rounded badge never spills past the tile edge.\n const maxTextWidth = tile.rect.width - pad * 2 - padX * 2 - 2;\n const labelText = ellipsize(tile.categoryLabel, maxTextWidth, labelFont);\n if (labelText === '' || labelText === '\u2026' || (compact && labelText.length / Math.max(1, tile.categoryLabel.length) < 0.5)) {\n surface.labels?.omit({ role: 'data-label', reason: 'unreadable', required: true, example: tile.categoryLabel, path: '/labels' });\n return;\n }\n\n // A themed pill (solid fill + hairline border) keeps every label legible on\n // any tile colour, so labels read identically across fills \u2014 like the funnel.\n const pill = { background: tokens.color.surface, border: tokens.color.border, padX, padY } as const;\n\n addOverlayText(surface, tokens, {\n left: tile.rect.x + pad + 2,\n top: tile.rect.y + pad,\n text: tile.categoryLabel,\n maxWidth: maxTextWidth,\n color: tokens.color.text,\n size: labelSize,\n weight: tokens.font.weight.bold,\n pill,\n });\n\n const labelPillH = labelSize + padY * 2 + 2;\n const valuePillH = valueSize + padY * 2 + 2;\n const valueText = formatValue(tile.value, valueFormat);\n // Stack the value in its own pill only when the whole number fits (a truncated\n // number would mislead) and the tile is tall enough for a second row.\n if (\n tile.rect.height >= pad * 2 + labelPillH + 2 + valuePillH &&\n measureText(valueText, valueFont).width <= maxTextWidth\n ) {\n addOverlayText(surface, tokens, {\n left: tile.rect.x + pad + 2,\n top: tile.rect.y + pad + labelPillH + 2,\n text: valueText,\n color: tokens.color.textMuted,\n size: valueSize,\n pill,\n });\n } else {\n surface.labels?.omit({ role: 'data-label', reason: 'space', required: false, example: valueText, path: '/labels' });\n }\n}\n\ninterface GroupRect {\n group: GroupItem;\n rect: Rect;\n headerH: number;\n}\n\nfunction drawNoPositiveTreemap(\n surface: Surface,\n tokens: ThemeTokens,\n content: Rect,\n): void {\n addCenteredEmptyMessage(surface, tokens, content, 'No positive values');\n}\n\nfunction drawTreemapTiles(\n surface: Surface,\n treemap: TreemapSpec,\n tokens: ThemeTokens,\n content: Rect,\n leaves: Leaf[],\n context?: RenderContext,\n): { tiles: Tile[]; groupRects: GroupRect[]; represented: number; pen: RoughPen | null; sketch: ReturnType<typeof resolveSketch> } {\n const ctx = surface.marks.ctx;\n const emphasis = context?.emphasis ?? null;\n const sketch = resolveSketch(treemap);\n const pen = sketch ? new RoughPen(ctx, sketch) : null;\n const tiles: Tile[] = [];\n const groupRects: GroupRect[] = [];\n const stroke = tokens.color.textMuted;\n let represented = 0;\n const drawTile = (tile: Tile) => {\n const alpha = emphasis ? (emphasis.match(tileProbe(treemap, tile)) ? 1 : emphasis.dim) : 1;\n if (alpha !== 1) ctx.globalAlpha = alpha;\n drawRect(ctx, pen, tile.rect, tile.fill, tile.fillCss, stroke);\n if (tile.rect.width > 0 && tile.rect.height > 0) {\n surface.evidence?.mark('tile', tile.rect.x, tile.rect.y, tile.rect.width, tile.rect.height, tile.fillCss, alpha, undefined, 1, undefined, alpha < 1, { color: stroke, opacity: 0.65, width: 1 });\n represented += tile.sourceRows;\n }\n if (alpha !== 1) ctx.globalAlpha = 1;\n };\n\n ctx.save();\n if (treemap.encoding.group) {\n const groups = buildGroups(leaves);\n for (const groupNode of layoutTreemap(groups, content)) {\n const gRect = groupNode.rect;\n const headerH = gRect.width >= 46 && gRect.height >= 40 ? tokens.font.size.tiny + 8 : 0;\n groupRects.push({ group: groupNode.item, rect: gRect, headerH });\n const inner = insetRect(\n { x: gRect.x, y: gRect.y + headerH, width: gRect.width, height: Math.max(0, gRect.height - headerH) },\n 2,\n );\n for (const leafNode of layoutTreemap(groupNode.item.leaves, inner)) {\n const tile = { ...leafNode.item, rect: leafNode.rect };\n tiles.push(tile);\n drawTile(tile);\n }\n }\n } else {\n for (const leafNode of layoutTreemap(leaves, content)) {\n const tile = { ...leafNode.item, rect: leafNode.rect };\n tiles.push(tile);\n drawTile(tile);\n }\n }\n ctx.restore();\n\n return { tiles, groupRects, represented, pen, sketch };\n}\n\nfunction drawGroupFrames(\n surface: Surface,\n tokens: ThemeTokens,\n treemap: TreemapSpec,\n groups: readonly GroupRect[],\n pen: RoughPen | null,\n sketch: ReturnType<typeof resolveSketch>,\n): void {\n const ctx = surface.marks.ctx;\n const stroke = tokens.color.background;\n for (const { group, rect, headerH } of groups) {\n if (pen) pen.rect(rect.x, rect.y, rect.width, rect.height, { stroke, roughness: sketch!.roughness * 0.6 });\n else {\n ctx.strokeStyle = stroke;\n ctx.lineWidth = 1;\n ctx.strokeRect(rect.x + 0.5, rect.y + 0.5, Math.max(0, rect.width - 1), Math.max(0, rect.height - 1));\n }\n if (headerH > 0) {\n const headerW = Math.max(0, rect.width - 10);\n addOverlayText(surface, tokens, {\n left: rect.x + 5,\n top: rect.y + 4,\n width: headerW,\n text: group.label,\n maxWidth: headerW,\n color: tokens.color.text,\n size: tokens.font.size.tiny,\n weight: tokens.font.weight.bold,\n opacity: 0.78,\n });\n } else if (treemap.labels !== false) {\n surface.labels?.omit({ role: 'data-label', reason: 'space', required: true, example: group.label, path: '/encoding/group' });\n }\n }\n}\n\nfunction buildTreemapInteraction(\n treemap: TreemapSpec,\n content: Rect,\n tiles: readonly Tile[],\n total: number,\n): InteractionModel {\n const valueLabel = treemap.encoding.value.title ?? treemap.encoding.value.field;\n const colorLabel = treemap.encoding.color?.title ?? treemap.encoding.color?.field;\n const categoryField = treemap.encoding.category.field;\n const groupField = treemap.encoding.group?.field;\n const hitTile = (px: number, py: number): Tile | null => {\n for (let i = tiles.length - 1; i >= 0; i--) {\n const tile = tiles[i];\n if (px >= tile.rect.x && px <= tile.rect.x + tile.rect.width && py >= tile.rect.y && py <= tile.rect.y + tile.rect.height) return tile;\n }\n return null;\n };\n\n return {\n region: { x: content.x, y: content.y, width: content.width, height: content.height },\n hitTest: (px, py) => {\n const tile = hitTile(px, py);\n if (!tile) return null;\n return {\n key: tile.key,\n anchorX: px,\n anchorY: py,\n content: {\n title: groupField ? `${tile.groupLabel ?? '(blank)'} \u25B8 ${tile.categoryLabel}` : tile.categoryLabel,\n rows: [\n { swatch: tile.fillCss, label: valueLabel, value: formatValue(tile.value, treemap.encoding.value.format) },\n ...(colorLabel\n ? [{\n label: colorLabel,\n value: tile.colorNoData ? 'no data' : formatValue(tile.colorValue, treemap.encoding.color?.format),\n muted: true,\n }]\n : []),\n { label: 'share', value: `${((tile.value / total) * 100).toFixed(1)}%`, muted: true },\n ],\n },\n };\n },\n pick: (px, py) => {\n const tile = hitTile(px, py);\n if (!tile) return null;\n return groupField\n ? { kind: 'point', fields: [categoryField, groupField], tuples: [[tile.category, tile.group]] }\n : { kind: 'point', fields: [categoryField], tuples: [[tile.category]] };\n },\n };\n}\n\nexport function drawTreemap(\n surface: Surface,\n spec: ChartSpec,\n tokens: ThemeTokens,\n size: Size,\n context?: RenderContext,\n): InteractionModel | void {\n surface.evidence?.begin('aggregate');\n surface.evidence?.data(0, 'aggregate');\n const treemap = spec as TreemapSpec;\n const content = drawTitleBlock(surface, tokens, size, treemap.title);\n const leaves = buildLeaves(treemap);\n colorLeaves(leaves, treemap, tokens);\n const total = leaves.reduce((sum, leaf) => sum + leaf.value, 0);\n\n if (leaves.length === 0 || total <= 0 || content.width <= 0 || content.height <= 0) {\n drawNoPositiveTreemap(surface, tokens, content);\n return;\n }\n\n const { tiles, groupRects, represented, pen, sketch } = drawTreemapTiles(surface, treemap, tokens, content, leaves, context);\n surface.evidence?.data(represented, 'aggregate');\n\n if (treemap.encoding.group) {\n drawGroupFrames(surface, tokens, treemap, groupRects, pen, sketch);\n }\n\n if (treemap.labels !== false) {\n for (const tile of tiles) addTileLabels(surface, tokens, tile, treemap.encoding.value.format);\n }\n\n return buildTreemapInteraction(treemap, content, tiles, total);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["w"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derived trendlines for cartesian charts — a linear line of best fit overlaid
|
|
3
|
+
* on a scatter, line, or area plot via `spec.trendline`.
|
|
4
|
+
*
|
|
5
|
+
* The regression is computed from the already-resolved `CartesianModel` series
|
|
6
|
+
* (one fit per group, or a single overall fit), and the fitted line is stroked
|
|
7
|
+
* across each group's x-extent. Marks land on the marks canvas; optional `R²`
|
|
8
|
+
* labels live in the HTML overlay (or are painted to canvas when headless),
|
|
9
|
+
* mirroring how `annotations` render. Pure presentation — no data reshaping.
|
|
10
|
+
*/
|
|
11
|
+
import type { Surface } from '../render/surface.js';
|
|
12
|
+
import type { CartesianModel } from '../runtime/cartesian.js';
|
|
13
|
+
/**
|
|
14
|
+
* Stroke the fitted line(s) on the marks canvas, clipped to the plot. Call after
|
|
15
|
+
* the chart's data marks so the trendline sits on top. No-op unless the spec
|
|
16
|
+
* opts in via `trendline` and the x-axis is continuous/temporal.
|
|
17
|
+
*/
|
|
18
|
+
export declare function drawTrendlines(surface: Surface, model: CartesianModel): void;
|
|
19
|
+
/**
|
|
20
|
+
* Append `R²` labels for each fitted line to the HTML overlay (or paint them to
|
|
21
|
+
* canvas when headless). Call after `drawAnnotationLabels`. No-op unless
|
|
22
|
+
* `trendline.label` is set.
|
|
23
|
+
*/
|
|
24
|
+
export declare function drawTrendlineLabels(surface: Surface, model: CartesianModel): void;
|
|
25
|
+
//# sourceMappingURL=trendline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trendline.d.ts","sourceRoot":"","sources":["../../src/charts/trendline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA+E3D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAyC5E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAiDjF"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { linearRegression } from "../analyze/regression.js";
|
|
2
|
+
import { fontString, measureText } from "../render/text.js";
|
|
3
|
+
import { overlayTextToCanvasCmd, paintCanvasText } from "../render/overlayText.js";
|
|
4
|
+
import { accessor, toDate, toNumber } from "../util/data.js";
|
|
5
|
+
import { crisp } from "../util/math.js";
|
|
6
|
+
const DEFAULT_STROKE_WIDTH = 2;
|
|
7
|
+
function resolveTrendline(value) {
|
|
8
|
+
if (!value) return null;
|
|
9
|
+
const cfg = typeof value === "object" ? value : {};
|
|
10
|
+
return {
|
|
11
|
+
method: "linear",
|
|
12
|
+
groupBy: cfg.groupBy,
|
|
13
|
+
label: cfg.label ?? false,
|
|
14
|
+
color: cfg.color,
|
|
15
|
+
strokeWidth: cfg.strokeWidth ?? DEFAULT_STROKE_WIDTH,
|
|
16
|
+
strokeDash: cfg.strokeDash ?? []
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function xToNum(model, value) {
|
|
20
|
+
if (model.x.kind === "time") {
|
|
21
|
+
const d = toDate(value);
|
|
22
|
+
return d ? d.getTime() : NaN;
|
|
23
|
+
}
|
|
24
|
+
return toNumber(value);
|
|
25
|
+
}
|
|
26
|
+
function trendGroups(model, cfg) {
|
|
27
|
+
const readX = accessor(model.x.field);
|
|
28
|
+
const readY = accessor(model.y.field ?? "");
|
|
29
|
+
const grouped = cfg.groupBy ?? model.series.length > 1;
|
|
30
|
+
const muted = cfg.color ?? model.tokens.color.textMuted;
|
|
31
|
+
const buckets = grouped ? model.series.map((s) => ({ color: cfg.color ?? s.color, rows: s.rows })) : [{ color: muted, rows: model.series.flatMap((s) => s.rows) }];
|
|
32
|
+
const out = [];
|
|
33
|
+
for (const bucket of buckets) {
|
|
34
|
+
const xs = [];
|
|
35
|
+
const ys = [];
|
|
36
|
+
for (const row of bucket.rows) {
|
|
37
|
+
const xn = xToNum(model, readX(row));
|
|
38
|
+
const yn = toNumber(readY(row));
|
|
39
|
+
if (!Number.isFinite(xn) || !Number.isFinite(yn)) continue;
|
|
40
|
+
xs.push(xn);
|
|
41
|
+
ys.push(yn);
|
|
42
|
+
}
|
|
43
|
+
const fit = linearRegression(xs, ys);
|
|
44
|
+
if (!fit) continue;
|
|
45
|
+
out.push({ color: bucket.color, fit, xMin: Math.min(...xs), xMax: Math.max(...xs) });
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
function drawTrendlines(surface, model) {
|
|
50
|
+
const cfg = resolveTrendline(model.spec.trendline);
|
|
51
|
+
if (!cfg || model.x.kind === "band" || model.x.kind === "point") return;
|
|
52
|
+
const groups = trendGroups(model, cfg);
|
|
53
|
+
if (groups.length === 0) return;
|
|
54
|
+
const ctx = surface.marks.ctx;
|
|
55
|
+
const { plot } = model;
|
|
56
|
+
ctx.save();
|
|
57
|
+
ctx.beginPath();
|
|
58
|
+
ctx.rect(plot.x, plot.y, plot.width, plot.height);
|
|
59
|
+
ctx.clip();
|
|
60
|
+
ctx.lineWidth = cfg.strokeWidth;
|
|
61
|
+
ctx.setLineDash(cfg.strokeDash);
|
|
62
|
+
ctx.lineCap = "round";
|
|
63
|
+
for (const g of groups) {
|
|
64
|
+
const x0 = model.x.pixel(g.xMin);
|
|
65
|
+
const x1 = model.x.pixel(g.xMax);
|
|
66
|
+
const y0 = model.y.pixel(g.fit.predict(g.xMin));
|
|
67
|
+
const y1 = model.y.pixel(g.fit.predict(g.xMax));
|
|
68
|
+
if (x0 == null || x1 == null || !Number.isFinite(x0) || !Number.isFinite(x1) || !Number.isFinite(y0) || !Number.isFinite(y1)) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
ctx.strokeStyle = g.color;
|
|
72
|
+
ctx.beginPath();
|
|
73
|
+
ctx.moveTo(x0, crisp(y0));
|
|
74
|
+
ctx.lineTo(x1, crisp(y1));
|
|
75
|
+
ctx.stroke();
|
|
76
|
+
}
|
|
77
|
+
ctx.restore();
|
|
78
|
+
}
|
|
79
|
+
function drawTrendlineLabels(surface, model) {
|
|
80
|
+
const cfg = resolveTrendline(model.spec.trendline);
|
|
81
|
+
if (!cfg || !cfg.label || model.x.kind === "band" || model.x.kind === "point") return;
|
|
82
|
+
const groups = trendGroups(model, cfg);
|
|
83
|
+
if (groups.length === 0) return;
|
|
84
|
+
const { tokens, plot } = model;
|
|
85
|
+
const f = tokens.font;
|
|
86
|
+
const font = fontString(f.size.small, f.family, f.weight.medium);
|
|
87
|
+
for (const g of groups) {
|
|
88
|
+
const x1 = model.x.pixel(g.xMax);
|
|
89
|
+
const y1 = model.y.pixel(g.fit.predict(g.xMax));
|
|
90
|
+
if (x1 == null || !Number.isFinite(x1) || !Number.isFinite(y1)) continue;
|
|
91
|
+
const text = `R\xB2=${g.fit.r2.toFixed(2)}`;
|
|
92
|
+
const labelW = measureText(text, font).width;
|
|
93
|
+
const nearRight = x1 + 6 + labelW > plot.x + plot.width;
|
|
94
|
+
const left = nearRight ? x1 - 6 : x1 + 6;
|
|
95
|
+
const align = nearRight ? "right" : "left";
|
|
96
|
+
const transform = nearRight ? "translateX(-100%) translateY(-50%)" : "translateY(-50%)";
|
|
97
|
+
const top = Math.min(Math.max(y1, plot.y + f.size.small), plot.y + plot.height - 2);
|
|
98
|
+
const color = g.color;
|
|
99
|
+
if (surface.headless) {
|
|
100
|
+
paintCanvasText(
|
|
101
|
+
surface.marks.ctx,
|
|
102
|
+
overlayTextToCanvasCmd({ left, top, text, color, size: f.size.small, align, transform }, font)
|
|
103
|
+
);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const el = document.createElement("div");
|
|
107
|
+
el.textContent = text;
|
|
108
|
+
el.style.position = "absolute";
|
|
109
|
+
el.style.font = font;
|
|
110
|
+
el.style.fontSize = `${f.size.small}px`;
|
|
111
|
+
el.style.fontWeight = String(f.weight.medium);
|
|
112
|
+
el.style.color = color;
|
|
113
|
+
el.style.whiteSpace = "nowrap";
|
|
114
|
+
el.style.left = `${left}px`;
|
|
115
|
+
el.style.top = `${top}px`;
|
|
116
|
+
el.style.transform = transform;
|
|
117
|
+
el.style.pointerEvents = "none";
|
|
118
|
+
surface.overlay.appendChild(el);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export {
|
|
122
|
+
drawTrendlineLabels,
|
|
123
|
+
drawTrendlines
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=trendline.js.map
|