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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/analyze/recommend.ts"],
|
|
4
|
+
"sourcesContent": ["import type { ChartSpec, ChartType, Encoding, FieldDef } from '../spec/types';\nimport { validateSpec } from '../spec/validate';\nimport type { Datum, Size } from '../types';\nimport { getField, toDate, toNumber, uniqueValues } from '../util/data';\nimport { isMissingValue, profileData, profileEncoding } from '../util/profile';\nimport type {\n ColumnProfile, DataFinding, DatasetProfile, DetailedColumnProfile, EncodingProfile, ProfileEncoding,\n} from '../util/profile';\n\nexport { profileColumns, profileData } from '../util/profile';\nexport type {\n ColumnProfile, DataFinding, DatasetProfile, DetailedColumnProfile, EncodingProfile,\n NumericEvidence, ProfileEncoding, ProfileField, ProfileOptions, TemporalEvidence, TypeAmbiguity,\n} from '../util/profile';\n\nexport interface RecommendationEvidence {\n columns: DetailedColumnProfile[];\n sampling: DatasetProfile['sampling'];\n encoding?: EncodingProfile;\n intent?: RecommendOptions['intent'];\n targetSize?: Size;\n}\n\nexport interface RecommendedChart {\n spec: ChartSpec;\n score: number;\n rationale: string;\n /** A valid candidate can still need an explicit meaning/field decision. */\n status?: 'ready' | 'needs-decision';\n findings?: DataFinding[];\n evidence?: RecommendationEvidence;\n alternatives?: ChartType[];\n}\n\nexport interface RecommendOptions {\n intent?: 'trend' | 'comparison' | 'distribution' | 'relationship' | 'composition';\n maxResults?: number;\n /** Layout guidance only; no data is filtered or grouped to fit this size. */\n targetSize?: Size;\n}\n\nexport interface RecommendationResult {\n recommendations: RecommendedChart[];\n profile: DatasetProfile;\n findings: DataFinding[];\n status: 'ready' | 'needs-decision' | 'no-candidate';\n}\n\ntype Intent = NonNullable<RecommendOptions['intent']>;\ntype Family = Intent | 'density' | 'value';\n\ninterface Candidate {\n spec: ChartSpec;\n score: number;\n rationale: string;\n family: Family;\n}\n\nfunction title(text: string): string {\n return text\n .replace(/[_-]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n .replace(/\\b\\w/g, (m) => m.toUpperCase());\n}\n\nfunction fieldDef(profile: ColumnProfile): FieldDef {\n return { field: profile.field, type: profile.type };\n}\n\nfunction boost(score: number, family: Family, intent?: Intent): number {\n if (!intent) return score;\n const matches =\n family === intent ||\n (intent === 'comparison' && family === 'density');\n return Math.min(1, score + (matches ? 0.12 : 0));\n}\n\nfunction pushValid(candidates: Candidate[], candidate: Candidate, intent?: Intent) {\n const score = Number(boost(candidate.score, candidate.family, intent).toFixed(3));\n const spec = candidate.spec;\n if (!validateSpec(spec).valid) return;\n candidates.push({ ...candidate, score });\n}\n\nfunction firstLowCardNominal(profiles: DetailedColumnProfile[], exclude = new Set<string>()): DetailedColumnProfile | undefined {\n return profiles.find((p) => p.type === 'nominal' && p.valid > 0 && p.cardinality <= 12 && !exclude.has(p.field));\n}\n\nfunction numericValues(data: Datum[], field: string): number[] {\n return data\n .map((row) => toNumber(getField(row, field)))\n .filter((value) => Number.isFinite(value));\n}\n\nfunction stringValues(data: Datum[], field: string): string[] {\n return data\n .map((row) => getField(row, field))\n .filter((value) => !isMissingValue(value))\n .map((value) => String(value));\n}\n\nfunction hasPositiveValues(data: Datum[], field: string): boolean {\n const values = numericValues(data, field);\n return values.length === data.length && values.length > 0 && values.every((value) => value > 0);\n}\n\nfunction fieldNameMatches(field: string, words: string[]): boolean {\n const normalized = field.toLowerCase();\n return words.some((word) => normalized.includes(word));\n}\n\nfunction hasConversionVocabulary(values: string[]): boolean {\n const vocabulary = [\n 'visit',\n 'lead',\n 'signup',\n 'sign up',\n 'register',\n 'activate',\n 'subscribe',\n 'convert',\n 'purchase',\n 'checkout',\n 'renew',\n 'trial',\n 'demo',\n 'onboard',\n ];\n return values.some((value) => {\n const normalized = value.toLowerCase();\n return vocabulary.some((word) => normalized.includes(word));\n });\n}\n\nfunction isNearMonotoneDecreasing(values: number[]): boolean {\n if (values.length < 3) return false;\n let decreases = 0;\n for (let i = 1; i < values.length; i++) {\n if (values[i] <= values[i - 1] * 1.05) decreases++;\n }\n return decreases / (values.length - 1) >= 0.8;\n}\n\nfunction distinctDates(data: Datum[], field: string): Date[] {\n return uniqueValues(data, field)\n .map(toDate)\n .filter((value): value is Date => value !== null)\n .sort((a, b) => a.getTime() - b.getTime());\n}\n\nfunction groupsWithAllValues(data: Datum[], groupField: string, valueField: string, expected: Set<string>): number {\n const groups = new Map<string, Set<string>>();\n for (const row of data) {\n const group = getField(row, groupField);\n const value = getField(row, valueField);\n if (isMissingValue(group) || isMissingValue(value)) continue;\n const key = String(group);\n const values = groups.get(key) ?? new Set<string>();\n values.add(String(value));\n groups.set(key, values);\n }\n let complete = 0;\n for (const values of groups.values()) {\n if ([...expected].every((value) => values.has(value))) complete++;\n }\n return complete;\n}\n\nfunction profileByName(profiles: ColumnProfile[], words: string[]): ColumnProfile | undefined {\n return profiles.find((profile) => fieldNameMatches(profile.field, words));\n}\n\nfunction hasFlowCycle(data: Datum[], source: string, target: string): boolean {\n const edges = new Map<string, Set<string>>();\n const indegree = new Map<string, number>();\n for (const row of data) {\n const from = String(getField(row, source));\n const to = String(getField(row, target));\n const targets = edges.get(from) ?? new Set<string>();\n if (!targets.has(to)) {\n targets.add(to);\n indegree.set(to, (indegree.get(to) ?? 0) + 1);\n }\n edges.set(from, targets);\n if (!indegree.has(from)) indegree.set(from, 0);\n }\n const queue = [...indegree].filter(([, degree]) => degree === 0).map(([node]) => node);\n for (let i = 0; i < queue.length; i++) {\n for (const target of edges.get(queue[i]) ?? []) {\n const degree = indegree.get(target)! - 1;\n indegree.set(target, degree);\n if (degree === 0) queue.push(target);\n }\n }\n return queue.length < indegree.size;\n}\n\nfunction candidateEncoding(spec: ChartSpec): ProfileEncoding {\n const encoding = ('encoding' in spec ? spec.encoding : {}) as Record<string, FieldDef | undefined>;\n const values = Object.values(encoding).filter((ref): ref is FieldDef => !!ref?.field);\n const key = (channels: string[]) => channels.map((channel) => encoding[channel]).filter((ref): ref is FieldDef => !!ref);\n switch (spec.type) {\n case 'line': case 'area': case 'bar':\n return { keys: key(['x', 'series']), values };\n case 'scatter':\n return { keys: key(['x', 'y', 'color']), values };\n case 'heatmap':\n return { keys: key(['x', 'y']), values, complete: true };\n case 'slope':\n return { keys: key(['x', 'series']), values, complete: true };\n case 'dumbbell':\n return { keys: key(['category', 'group']), values, complete: true };\n case 'pie':\n return { keys: key(['color']), values };\n case 'funnel':\n return { keys: key(['stage']), values };\n case 'treemap':\n return { keys: key(['group', 'category']), values };\n case 'sankey':\n return { keys: key(['source', 'target']), values };\n case 'matrix':\n return {\n keys: [...spec.rows, ...(spec.columns ?? [])],\n values: spec.values.map((value) => ({ field: value.field, type: 'quantitative' as const })),\n complete: true,\n };\n case 'kpi': case 'gauge': case 'bullet':\n return {\n keys: [],\n values: [spec.value, 'target' in spec ? spec.target : undefined]\n .filter((ref): ref is FieldDef => typeof ref === 'object' && ref !== null)\n .map((ref) => ({ field: ref.field, type: 'quantitative' as const })),\n };\n default:\n return { keys: [], values };\n }\n}\n\nfunction explainCandidate(\n candidate: Candidate, data: Datum[], profile: DatasetProfile, opts: RecommendOptions,\n): RecommendedChart | undefined {\n const { spec } = candidate;\n const refs = candidateEncoding(spec);\n const selected = new Set([...refs.keys, ...(refs.values ?? [])].map((ref) => typeof ref === 'string' ? ref : ref.field));\n if (spec.type === 'table') {\n for (const column of spec.columns ?? []) selected.add(column.field);\n }\n const columns = profile.columns.filter((column) => selected.has(column.field));\n const findings = profile.findings.filter((finding) => !finding.fields || finding.fields.some((field) => selected.has(field)));\n const encoding = selected.size && spec.type !== 'table'\n ? profileEncoding(data, refs, profile.columns, true) : undefined;\n if (encoding && encoding.usableRows === 0) return undefined;\n const add = (code: string, message: string, fields: string[], requiresDecision = true, count?: number) => {\n findings.push({ code, message, fields, requiresDecision, severity: requiresDecision ? 'warning' : 'info', ...(count === undefined ? {} : { count }) });\n };\n const measures = profile.columns.filter((column) => column.type === 'quantitative' && column.quantitative.valid > 0);\n const unusedMeasures = measures.filter((column) => !selected.has(column.field));\n if (unusedMeasures.length && spec.type !== 'table') {\n add('measure-choice', `Other quantitative fields are plausible measures: ${unusedMeasures.map((column) => column.field).join(', ')}. Confirm the selected field roles; column order does not establish intent.`, measures.map((column) => column.field));\n }\n const unusedPositions = profile.columns.filter((column) =>\n (column.type === 'temporal' || column.type === 'ordinal') && column.valid > 0 && !selected.has(column.field));\n if (unusedPositions.length && columns.some((column) => column.type === 'temporal' || column.type === 'ordinal') && spec.type !== 'table') {\n add('position-choice', `Other ordered fields are plausible positions: ${unusedPositions.map((column) => column.field).join(', ')}. Confirm which date/order answers the question.`, unusedPositions.map((column) => column.field));\n }\n const unusedCategories = profile.columns.filter((column) => column.type === 'nominal' && column.valid > 0 && !selected.has(column.field));\n if (unusedCategories.length && columns.some((column) => column.type === 'nominal') && spec.type !== 'table') {\n add('category-choice', `Confirm the category/series roles; ${unusedCategories.map((column) => column.field).join(', ')} are also plausible grouping fields.`, unusedCategories.map((column) => column.field));\n }\n if (encoding?.missingRows) {\n add('incomplete-observations', `${encoding.missingRows} rows lack at least one required encoded value. The candidate preserves these rows; missing values are not zero.`, [...selected], true, encoding.missingRows);\n }\n if (encoding?.invalidRows) {\n add('invalid-observations', `${encoding.invalidRows} rows have an invalid encoded value and cannot supply a complete mark.`, [...selected], true, encoding.invalidRows);\n }\n if (encoding?.duplicateRows) {\n if (['pie', 'funnel', 'treemap', 'matrix'].includes(spec.type)) {\n add('aggregation-choice', `${spec.type} combines repeated encoded keys using its aggregation behavior. Confirm that summing these observations is meaningful; no input rows were pre-aggregated.`, encoding.keys, true, encoding.duplicateRows);\n } else if (spec.type === 'scatter' || spec.type === 'sankey') {\n add('overlapping-observations', 'Repeated encoded positions/links remain separate observations and can overlap.', encoding.keys, false, encoding.duplicateRows);\n } else {\n add('duplicate-keys', 'Several observations share an encoded position. Choose a series, an explicit aggregate transform, or a row-preserving display; this candidate does not decide for you.', encoding.keys, true, encoding.duplicateRows);\n }\n }\n if (encoding?.missingCombinations) {\n add('sparse-combinations', 'Some combinations of the observed categories are absent. Confirm whether the comparison is intentionally sparse; no combinations are filled.', encoding.keys, true, encoding.missingCombinations);\n }\n if ((spec.type === 'kpi' || spec.type === 'matrix') && data.length > 1 &&\n !findings.some((finding) => finding.code === 'aggregation-choice')) {\n add('aggregation-choice', 'This candidate proposes a sum. Confirm the aggregation is meaningful for this measure; use an explicit aggregate transform or a different aggregate when appropriate.', columns.filter((column) => column.type === 'quantitative').map((column) => column.field));\n }\n if (spec.type === 'waterfall') {\n add('delta-semantics', 'Signed values alone do not establish ordered changes. Confirm that these rows are deltas in the intended order before using a running total.', [spec.encoding.stage.field, spec.encoding.value.field]);\n }\n if (spec.type === 'calendarHeatmap') {\n const days = new Set<string>();\n let repeated = 0;\n for (const row of data) {\n const date = toDate(getField(row, spec.encoding.date.field));\n if (!date) continue;\n const key = `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;\n if (days.has(key)) repeated++;\n days.add(key);\n }\n if (repeated) add('aggregation-choice', 'Calendar heatmaps sum observations within each local calendar day. Confirm this daily aggregation is intended.', [spec.encoding.date.field], true, repeated);\n }\n const categoricalAxis = columns.find((column) => refs.keys.some((ref) =>\n (typeof ref === 'string' ? ref : ref.field) === column.field) &&\n (column.type === 'nominal' || column.type === 'ordinal'));\n if (categoricalAxis && ['bar', 'line', 'area', 'slope', 'dumbbell'].includes(spec.type)) {\n const count = categoricalAxis.nonMissingCardinality;\n const width = opts.targetSize?.width;\n if (count > 12 || (width && Number.isFinite(width) && count * 24 > width)) {\n add('size-cardinality', `${count} categories may not remain individually legible${width ? ` at ${width}px wide` : ''}. Consider more space, orientation, or a table; filtering/grouping requires your explicit choice.`, [categoricalAxis.field], true, count);\n }\n }\n const decisions = findings.filter((finding) => finding.requiresDecision).length;\n const score = Math.max(0, Number((candidate.score - Math.min(0.3, decisions * 0.06)).toFixed(3)));\n return {\n spec, score, rationale: candidate.rationale,\n status: decisions ? 'needs-decision' : 'ready', findings,\n evidence: {\n columns, sampling: profile.sampling, ...(encoding ? { encoding } : {}),\n ...(opts.intent ? { intent: opts.intent } : {}),\n ...(opts.targetSize ? { targetSize: { ...opts.targetSize } } : {}),\n },\n };\n}\n\ninterface RecommendContext {\n data: Datum[];\n opts: RecommendOptions & { detailed?: boolean };\n profile: DatasetProfile;\n profiles: DetailedColumnProfile[];\n quantitative: DetailedColumnProfile[];\n ordered: DetailedColumnProfile[];\n nominal: DetailedColumnProfile[];\n lowNominal: DetailedColumnProfile[];\n manyNominal: DetailedColumnProfile[];\n candidates: Candidate[];\n guidance: DataFinding[];\n measure?: DetailedColumnProfile;\n}\n\nfunction createRecommendContext(input: readonly Datum[], opts: RecommendOptions & { detailed?: boolean }): RecommendContext {\n const data = (Array.isArray(input) ? input : []) as Datum[];\n const profile = profileData(data);\n const profiles = profile.columns;\n const quantitative = profiles.filter((p) => p.type === 'quantitative' && p.quantitative.valid > 0);\n const nominal = profiles.filter((p) => p.type === 'nominal' && p.valid > 0);\n const measure = quantitative.find((p) => p.cardinality > 2) ?? quantitative[0];\n return {\n data, opts, profile, profiles, quantitative,\n ordered: profiles.filter((p) => (p.type === 'temporal' || p.type === 'ordinal') && p.valid > 0),\n nominal,\n lowNominal: nominal.filter((p) => p.cardinality <= 12),\n manyNominal: nominal.filter((p) => p.cardinality > 12),\n candidates: [],\n guidance: [],\n ...(measure ? { measure } : {}),\n };\n}\n\nfunction finishRecommendations(ctx: RecommendContext, recommendations: RecommendedChart[], extra: DataFinding[] = []): RecommendedChart[] | RecommendationResult {\n if (!ctx.opts.detailed) return recommendations;\n const findings = [...new Set([...ctx.profile.findings, ...(recommendations[0]?.findings ?? []), ...extra])];\n if (!recommendations.length) findings.push({\n code: ctx.data.length ? 'no-usable-candidate' : 'empty-data', severity: 'warning', requiresDecision: true,\n message: ctx.data.length ? 'No candidate can represent the available fields. Supply usable observations or specify the intended field types/roles.' : 'No observations were supplied; no data or chart values were invented.',\n });\n return {\n recommendations, profile: ctx.profile, findings,\n status: !recommendations.length ? 'no-candidate'\n : findings.some((finding) => finding.requiresDecision) || recommendations[0].status === 'needs-decision' ? 'needs-decision' : 'ready',\n };\n}\n\nfunction addGuidance(ctx: RecommendContext): void {\n const { opts, measure, guidance } = ctx;\n if (opts.intent === 'composition' && measure && measure.quantitative.negative > 0) {\n guidance.push({\n code: 'signed-composition', severity: 'warning', fields: [measure.field], requiresDecision: true,\n message: `\"${measure.field}\" contains negative values. A pie/treemap cannot faithfully show signed composition; choose a signed comparison or explicitly define a different measure.`,\n });\n }\n}\n\nfunction addFunnelCandidate(ctx: RecommendContext): void {\n const { data, profiles, candidates, opts, measure } = ctx;\n if (!measure) return;\n const stage = profiles.find((p) => (p.type === 'nominal' || p.type === 'ordinal') &&\n p.cardinality >= 3 && p.cardinality <= 12 && p.cardinality === data.length);\n if (!stage || !hasPositiveValues(data, measure.field)) return;\n const values = numericValues(data, measure.field);\n const stages = stringValues(data, stage.field);\n const stageLike = fieldNameMatches(stage.field, ['stage', 'step', 'funnel', 'phase', 'status']);\n const conversionLike = hasConversionVocabulary(stages);\n if (!isNearMonotoneDecreasing(values) || (!stageLike && !conversionLike)) return;\n pushValid(candidates, {\n spec: {\n type: 'funnel', data,\n encoding: { stage: fieldDef(stage), value: fieldDef(measure) },\n title: `${title(measure.field)} funnel by ${title(stage.field)}`,\n percent: 'first',\n } as ChartSpec,\n score: 0.88, family: 'composition',\n rationale: `${title(stage.field)} looks like ordered funnel stages and ${title(measure.field)} mostly decreases, so a funnel shows conversion drop-off.`,\n }, opts.intent);\n}\n\nfunction addWaterfallCandidate(ctx: RecommendContext): void {\n const { data, profiles, candidates, opts, measure } = ctx;\n if (!measure) return;\n const stage = profiles.find((p) => (p.type === 'nominal' || p.type === 'ordinal') &&\n p.cardinality >= 3 && p.cardinality <= 20 && p.cardinality === data.length);\n if (!stage) return;\n const values = numericValues(data, measure.field);\n const hasIncrease = values.some((value) => value > 0);\n const hasDecrease = values.some((value) => value < 0);\n if (values.length !== data.length || !hasIncrease || !hasDecrease) return;\n pushValid(candidates, {\n spec: {\n type: 'waterfall', data,\n encoding: { stage: fieldDef(stage), value: fieldDef(measure) },\n title: `${title(measure.field)} bridge by ${title(stage.field)}`,\n showTotal: true,\n } as ChartSpec,\n score: 0.87, family: 'comparison',\n rationale: `${title(measure.field)} contains signed positive and negative steps, so a waterfall shows how each ${title(stage.field)} changes the running total.`,\n }, opts.intent);\n}\n\nfunction addSankeyCandidate(ctx: RecommendContext): void {\n const { data, nominal, candidates, guidance, opts, measure } = ctx;\n if (nominal.length < 2 || !measure || !hasPositiveValues(data, measure.field)) return;\n const source = profileByName(nominal, ['source', 'from', 'origin', 'upstream']) ??\n nominal.find((profile) => profile.cardinality >= 2 && profile.cardinality <= 30);\n const target = profileByName(nominal.filter((profile) => profile.field !== source?.field), [\n 'target', 'to', 'destination', 'downstream',\n ]) ?? nominal.find((profile) => profile.field !== source?.field && profile.cardinality >= 2 && profile.cardinality <= 30);\n if (!source || !target) return;\n const sharedNodes = [...new Set(stringValues(data, source.field))].filter((value) => new Set(stringValues(data, target.field)).has(value)).length;\n const namedFlow = fieldNameMatches(source.field, ['source', 'from', 'origin', 'upstream']) ||\n fieldNameMatches(target.field, ['target', 'to', 'destination', 'downstream']);\n const cyclic = hasFlowCycle(data, source.field, target.field);\n if ((namedFlow || sharedNodes > 0) && !cyclic) {\n pushValid(candidates, {\n spec: {\n type: 'sankey', data,\n encoding: { source: fieldDef(source), target: fieldDef(target), value: fieldDef(measure) },\n title: `${title(measure.field)} flow from ${title(source.field)} to ${title(target.field)}`,\n } as ChartSpec,\n score: 0.82, family: 'relationship',\n rationale: `${title(source.field)} and ${title(target.field)} form source and target entities with positive ${title(measure.field)}, so a sankey shows flow magnitude.`,\n }, opts.intent);\n } else if (namedFlow && cyclic) {\n guidance.push({\n code: 'flow-cycle', severity: 'warning', fields: [source.field, target.field], requiresDecision: true,\n message: 'Source/target rows contain a cycle or self-link. Sankey layouts cannot preserve every such link; choose a row-preserving view or explicitly resolve the flow model.',\n });\n }\n}\n\nfunction addTreemapCandidate(ctx: RecommendContext): void {\n const { data, nominal, profiles, candidates, opts, measure } = ctx;\n if (!measure || !hasPositiveValues(data, measure.field)) return;\n const category = nominal.find((profile) => profile.cardinality > 7);\n if (!category) return;\n const group = firstLowCardNominal(profiles, new Set([category.field, measure.field]));\n pushValid(candidates, {\n spec: {\n type: 'treemap', data,\n encoding: {\n category: fieldDef(category),\n value: fieldDef(measure),\n ...(group ? { group: fieldDef(group) } : {}),\n },\n title: `${title(measure.field)} by ${title(category.field)}`,\n } as ChartSpec,\n score: 0.7, family: 'composition',\n rationale: `${title(category.field)} has ${category.cardinality} categories, too many for a clear pie, so a treemap shows part-to-whole area by ${title(measure.field)}.`,\n }, opts.intent);\n}\n\nfunction addBoxCandidate(ctx: RecommendContext): void {\n const { data, lowNominal, candidates, opts, measure } = ctx;\n if (!measure) return;\n const category = lowNominal.find((profile) => {\n const counts = new Map<string, number>();\n for (const row of data) {\n const value = getField(row, profile.field);\n if (isMissingValue(value)) continue;\n const key = String(value);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return counts.size >= 2 && [...counts.values()].every((count) => count >= 5);\n });\n if (!category) return;\n pushValid(candidates, {\n spec: {\n type: 'box', data,\n encoding: { x: fieldDef(category), y: fieldDef(measure) },\n title: `${title(measure.field)} distribution by ${title(category.field)}`,\n } as ChartSpec,\n score: 0.81, family: 'distribution',\n rationale: `${title(category.field)} repeats with many ${title(measure.field)} observations per category, so a box plot summarizes spread and outliers.`,\n }, opts.intent);\n}\n\nfunction addCalendarHeatmapCandidate(ctx: RecommendContext): void {\n const { data, profiles, candidates, opts, measure } = ctx;\n if (!measure) return;\n const date = profiles.find((profile) => profile.type === 'temporal');\n if (!date) return;\n const dates = distinctDates(data, date.field);\n const spanDays = dates.length > 1 ? (dates[dates.length - 1].getTime() - dates[0].getTime()) / 86400000 : 0;\n const density = spanDays > 0 ? dates.length / spanDays : 0;\n if (dates.length < 180 || spanDays < 300 || density < 0.45) return;\n pushValid(candidates, {\n spec: {\n type: 'calendarHeatmap', data,\n encoding: { date: fieldDef(date), color: fieldDef(measure) },\n title: `${title(measure.field)} by day`,\n } as ChartSpec,\n score: 0.72, family: 'density',\n rationale: `${title(date.field)} is daily temporal data spanning about a year, so a calendar heatmap shows day-by-day ${title(measure.field)} intensity.`,\n }, opts.intent);\n}\n\nfunction addSlopeCandidate(ctx: RecommendContext): void {\n const { data, profiles, nominal, candidates, opts, measure } = ctx;\n if (!measure) return;\n const x = profiles.find((profile) =>\n (profile.type === 'temporal' || profile.type === 'nominal' || profile.type === 'ordinal') &&\n profile.cardinality === 2);\n const series = nominal.find((profile) => profile.field !== x?.field && profile.cardinality >= 2);\n if (!x || !series) return;\n const xValues = new Set(stringValues(data, x.field));\n if (groupsWithAllValues(data, series.field, x.field, xValues) < 2) return;\n pushValid(candidates, {\n spec: {\n type: 'slope', data,\n encoding: { x: fieldDef(x), y: fieldDef(measure), series: fieldDef(series) },\n title: `${title(measure.field)} change by ${title(series.field)}`,\n colorByChange: true,\n } as ChartSpec,\n score: 0.79, family: 'trend',\n rationale: `${title(x.field)} has exactly two positions for each ${title(series.field)}, so a slope chart emphasizes before-and-after change in ${title(measure.field)}.`,\n }, opts.intent);\n}\n\nfunction addDumbbellCandidate(ctx: RecommendContext): void {\n const { data, profiles, nominal, candidates, opts, measure } = ctx;\n if (!measure || nominal.length < 1) return;\n const group = profiles.find((profile) => profile.field !== measure.field && profile.cardinality === 2);\n const category = nominal.find((profile) => profile.field !== group?.field && profile.cardinality >= 2);\n if (!group || !category) return;\n const groupValues = new Set(stringValues(data, group.field));\n if (groupsWithAllValues(data, category.field, group.field, groupValues) < 2) return;\n pushValid(candidates, {\n spec: {\n type: 'dumbbell', data,\n encoding: { category: fieldDef(category), value: fieldDef(measure), group: fieldDef(group) },\n title: `${title(measure.field)} gap by ${title(category.field)}`,\n sort: 'gap',\n } as ChartSpec,\n score: 0.78, family: 'comparison',\n rationale: `${title(group.field)} has exactly two groups within each ${title(category.field)}, so a dumbbell chart makes the ${title(measure.field)} gap easy to compare.`,\n }, opts.intent);\n}\n\nfunction addSingleValueCandidates(ctx: RecommendContext): void {\n const { data, quantitative, candidates, guidance, opts } = ctx;\n if (data.length !== 1 || quantitative.length < 2) return;\n const value = profileByName(quantitative, ['value', 'actual', 'current', 'sales', 'revenue']) ?? quantitative[0];\n const target = profileByName(quantitative.filter((profile) => profile.field !== value.field), ['target', 'goal', 'budget', 'plan', 'quota']);\n const max = profileByName(\n quantitative.filter((profile) => profile.field !== value.field && profile.field !== target?.field),\n ['max', 'total', 'limit', 'capacity'],\n );\n const valueNumber = numericValues(data, value.field)[0];\n const targetNumber = target ? numericValues(data, target.field)[0] : undefined;\n const maxNumber = max ? numericValues(data, max.field)[0] : undefined;\n if (target && Number.isFinite(targetNumber)) {\n pushValid(candidates, {\n spec: { type: 'bullet', data, value: { field: value.field }, target: { field: target.field }, max: Number.isFinite(maxNumber) ? maxNumber : undefined, label: title(value.field), title: `${title(value.field)} vs ${title(target.field)}` } as ChartSpec,\n score: 0.86, family: 'value',\n rationale: `${title(value.field)} is a single value with ${title(target.field)} as a target, so a bullet graph shows compact KPI attainment.`,\n }, opts.intent);\n }\n if (max && Number.isFinite(maxNumber) && typeof valueNumber === 'number' && Number.isFinite(valueNumber)) {\n const gaugeMax = maxNumber!;\n if (gaugeMax > 0 && gaugeMax > valueNumber) pushValid(candidates, {\n spec: { type: 'gauge', data, value: { field: value.field }, max: gaugeMax, target: target ? { field: target.field } : undefined, label: title(value.field), title: `${title(value.field)} attainment` } as ChartSpec,\n score: 0.84, family: 'value',\n rationale: `${title(value.field)} is a single value against ${target ? title(target.field) : title(max?.field ?? 'Maximum')}, so a gauge shows progress on a bounded scale.`,\n }, opts.intent);\n } else if (target && !max) {\n guidance.push({\n code: 'missing-maximum', severity: 'info', fields: [value.field, target.field], requiresDecision: true,\n message: 'A target does not establish a gauge maximum. Supply an explicit maximum to recommend a gauge; a bullet chart is available without inventing one.',\n });\n }\n}\n\nfunction addTrendCandidate(ctx: RecommendContext): void {\n const { data, ordered, profiles, candidates, opts, measure } = ctx;\n if (ordered.length === 0 || !measure) return;\n const x = ordered[0];\n const encoding: Encoding & { x: FieldDef; y: FieldDef } = { x: fieldDef(x), y: fieldDef(measure) };\n const series = firstLowCardNominal(profiles, new Set([x.field, measure.field]));\n if (series) encoding.series = fieldDef(series);\n pushValid(candidates, {\n spec: {\n type: 'line', data, encoding,\n title: `${title(measure.field)} over ${title(x.field)}`,\n } as ChartSpec,\n score: 0.92, family: 'trend',\n rationale: `${title(x.field)} is ${x.type}, so a line chart shows how ${title(measure.field)} changes over ordered rows${series ? `, split by low-cardinality ${title(series.field)}` : ''}.`,\n }, opts.intent);\n}\n\nfunction addBarAndPieCandidates(ctx: RecommendContext): void {\n const { data, lowNominal, manyNominal, candidates, opts, measure } = ctx;\n if (!measure) return;\n const category = lowNominal[0];\n if (category) {\n pushValid(candidates, {\n spec: {\n type: 'bar', data,\n encoding: { x: fieldDef(category), y: fieldDef(measure) },\n title: `${title(measure.field)} by ${title(category.field)}`,\n } as ChartSpec,\n score: 0.84, family: 'comparison',\n rationale: `${title(category.field)} has ${category.cardinality} categories, making bars a good comparison of ${title(measure.field)}.`,\n }, opts.intent);\n if (category.cardinality <= 7 && measure.quantitative.negative === 0 &&\n measure.quantitative.positive > 0 && measure.quantitative.valid === data.length) {\n pushValid(candidates, {\n spec: {\n type: 'pie', data,\n encoding: { theta: fieldDef(measure), color: fieldDef(category) },\n title: `${title(measure.field)} share by ${title(category.field)}`,\n } as ChartSpec,\n score: 0.58, family: 'composition',\n rationale: `${title(category.field)} has ${category.cardinality} slices, so a pie can show part-to-whole share for ${title(measure.field)}.`,\n }, opts.intent);\n }\n } else if (manyNominal.length > 0) {\n const wideCategory = manyNominal[0];\n pushValid(candidates, {\n spec: {\n type: 'bar', data,\n encoding: { x: fieldDef(wideCategory), y: fieldDef(measure) },\n title: `${title(measure.field)} by ${title(wideCategory.field)}`,\n } as ChartSpec,\n score: 0.62, family: 'comparison',\n rationale: `${title(wideCategory.field)} has ${wideCategory.cardinality} categories. This bar preserves every row; consider more space or a table, and explicitly choose any filtering or grouping.`,\n }, opts.intent);\n }\n}\n\nfunction addScatterCandidate(ctx: RecommendContext): void {\n const { data, profiles, quantitative, candidates, opts } = ctx;\n if (quantitative.length < 2) return;\n const [x, y] = quantitative;\n const encoding: Encoding & { x: FieldDef; y: FieldDef } = { x: fieldDef(x), y: fieldDef(y) };\n const color = firstLowCardNominal(profiles, new Set([x.field, y.field]));\n if (color) encoding.color = fieldDef(color);\n pushValid(candidates, {\n spec: {\n type: 'scatter', data, encoding,\n title: `${title(y.field)} vs ${title(x.field)}`,\n } as ChartSpec,\n score: 0.86, family: 'relationship',\n rationale: `${title(x.field)} and ${title(y.field)} are quantitative, so scatter reveals their relationship${color ? ` with ${title(color.field)} as color` : ''}. Additional measures are not silently assigned to bubble size.`,\n }, opts.intent);\n}\n\nfunction addSingleMeasureCandidates(ctx: RecommendContext): void {\n const { data, quantitative, candidates, opts } = ctx;\n if (quantitative.length !== 1) return;\n const q = quantitative[0];\n pushValid(candidates, {\n spec: {\n type: 'histogram', data,\n encoding: { x: fieldDef(q) },\n title: `${title(q.field)} distribution`,\n } as ChartSpec,\n score: 0.78, family: 'distribution',\n rationale: `${title(q.field)} is the only quantitative field, so a histogram shows its distribution.`,\n }, opts.intent);\n pushValid(candidates, {\n spec: {\n type: 'kpi', data,\n value: { field: q.field, aggregate: 'sum' },\n label: `Total ${title(q.field)}`,\n title: `Total ${title(q.field)}`,\n } as ChartSpec,\n score: 0.62, family: 'value',\n rationale: `${title(q.field)} is the only quantitative field, so a KPI summarizes it as a total.`,\n }, opts.intent);\n}\n\nfunction addHeatmapAndMatrixCandidates(ctx: RecommendContext): void {\n const { data, lowNominal, candidates, opts, measure } = ctx;\n if (lowNominal.length < 2 || !measure) return;\n const [x, y] = lowNominal;\n pushValid(candidates, {\n spec: {\n type: 'heatmap', data,\n encoding: { x: fieldDef(x), y: fieldDef(y), color: fieldDef(measure) },\n title: `${title(measure.field)} by ${title(x.field)} and ${title(y.field)}`,\n } as ChartSpec,\n score: 0.76, family: 'density',\n rationale: `${title(x.field)} and ${title(y.field)} are low-cardinality categories, so a heatmap shows ${title(measure.field)} across their combinations.`,\n }, opts.intent);\n pushValid(candidates, {\n spec: {\n type: 'matrix', data,\n rows: [y.field],\n columns: [x.field],\n values: [{ field: measure.field, op: 'sum' }],\n title: `${title(measure.field)} matrix`,\n } as ChartSpec,\n score: 0.68, family: 'density',\n rationale: `A matrix summarizes ${title(measure.field)} by ${title(y.field)} rows and ${title(x.field)} columns.`,\n }, opts.intent);\n}\n\nfunction addTableCandidate(ctx: RecommendContext): void {\n const { data, profiles, candidates, opts } = ctx;\n if (!profiles.some((column) => column.valid > 0)) return;\n pushValid(candidates, {\n spec: {\n type: 'table', data,\n columns: profiles.map((column) => ({ field: column.field })),\n title: 'Data detail',\n },\n score: 0.4, family: 'comparison',\n rationale: 'A table retains individual observations without choosing an aggregate, ordering, or quantitative meaning for an identifier. Browser tables can scroll; static exports have finite space.',\n }, opts.intent);\n}\n\nfunction buildCandidates(ctx: RecommendContext): void {\n addGuidance(ctx);\n addFunnelCandidate(ctx);\n addWaterfallCandidate(ctx);\n addSankeyCandidate(ctx);\n addTreemapCandidate(ctx);\n addBoxCandidate(ctx);\n addCalendarHeatmapCandidate(ctx);\n addSlopeCandidate(ctx);\n addDumbbellCandidate(ctx);\n addSingleValueCandidates(ctx);\n addTrendCandidate(ctx);\n addBarAndPieCandidates(ctx);\n addScatterCandidate(ctx);\n addSingleMeasureCandidates(ctx);\n addHeatmapAndMatrixCandidates(ctx);\n addTableCandidate(ctx);\n}\n\nfunction selectRecommendations(ctx: RecommendContext): RecommendedChart[] {\n const max = ctx.opts.maxResults === undefined || !Number.isFinite(ctx.opts.maxResults)\n ? 5 : Math.max(0, Math.floor(ctx.opts.maxResults));\n const results = ctx.candidates\n .map((candidate) => explainCandidate(candidate, ctx.data, ctx.profile, ctx.opts))\n .filter((candidate): candidate is RecommendedChart => candidate !== undefined)\n .sort((a, b) => b.score - a.score)\n .slice(0, max);\n for (const result of results) {\n result.alternatives = [...new Set(results.filter((other) => other !== result).map((other) => other.spec.type))];\n }\n return results;\n}\n\n/** Return ranked valid candidates, without applying any proposed data decisions. */\nexport function recommendChart(data: readonly Datum[], opts: RecommendOptions & { detailed: true }): RecommendationResult;\nexport function recommendChart(data: readonly Datum[], opts?: RecommendOptions): RecommendedChart[];\nexport function recommendChart(\n input: readonly Datum[], opts: RecommendOptions & { detailed?: boolean } = {},\n): RecommendedChart[] | RecommendationResult {\n const ctx = createRecommendContext(input, opts);\n if (ctx.data.length === 0) return finishRecommendations(ctx, []);\n buildCandidates(ctx);\n return finishRecommendations(ctx, selectRecommendations(ctx), ctx.guidance);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["profileData", "target"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure linear-regression helpers — the analytical core behind the `trendline`
|
|
3
|
+
* overlay. Dependency-free and deterministic so the same fit is computed in the
|
|
4
|
+
* browser and headless. Mirrors the covariance math used by `pearson()` in
|
|
5
|
+
* `./insights`, exposed here as a reusable line-of-best-fit.
|
|
6
|
+
*/
|
|
7
|
+
export interface RegressionFit {
|
|
8
|
+
/** Slope (dy/dx) of the fitted line. */
|
|
9
|
+
slope: number;
|
|
10
|
+
/** Y-intercept of the fitted line. */
|
|
11
|
+
intercept: number;
|
|
12
|
+
/** Coefficient of determination (R²), in [0, 1]. */
|
|
13
|
+
r2: number;
|
|
14
|
+
/** Number of finite (x, y) pairs the fit used. */
|
|
15
|
+
n: number;
|
|
16
|
+
/** Predict y for a given x along the fitted line. */
|
|
17
|
+
predict(x: number): number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Ordinary-least-squares linear fit over paired numeric samples.
|
|
21
|
+
*
|
|
22
|
+
* Returns `null` when there are fewer than two points or the x values have no
|
|
23
|
+
* spread (a vertical fit has an undefined slope). Non-finite pairs are ignored.
|
|
24
|
+
*/
|
|
25
|
+
export declare function linearRegression(xs: readonly number[], ys: readonly number[]): RegressionFit | null;
|
|
26
|
+
//# sourceMappingURL=regression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regression.d.ts","sourceRoot":"","sources":["../../src/analyze/regression.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,CAAC,EAAE,MAAM,CAAC;IACV,qDAAqD;IACrD,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,SAAS,MAAM,EAAE,EACrB,EAAE,EAAE,SAAS,MAAM,EAAE,GACpB,aAAa,GAAG,IAAI,CAkBtB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { pairedMoments } from "../util/math.js";
|
|
2
|
+
function linearRegression(xs, ys) {
|
|
3
|
+
const moments = pairedMoments(xs, ys);
|
|
4
|
+
if (!moments) return null;
|
|
5
|
+
const { n, meanX, meanY, cov, vx, vy } = moments;
|
|
6
|
+
if (vx <= 0) return null;
|
|
7
|
+
const slope = cov / vx;
|
|
8
|
+
const intercept = meanY - slope * meanX;
|
|
9
|
+
const r2 = vy <= 0 ? 1 : Math.min(1, cov * cov / (vx * vy));
|
|
10
|
+
return {
|
|
11
|
+
slope,
|
|
12
|
+
intercept,
|
|
13
|
+
r2,
|
|
14
|
+
n,
|
|
15
|
+
predict: (x) => slope * x + intercept
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export {
|
|
19
|
+
linearRegression
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=regression.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/analyze/regression.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Pure linear-regression helpers \u2014 the analytical core behind the `trendline`\n * overlay. Dependency-free and deterministic so the same fit is computed in the\n * browser and headless. Mirrors the covariance math used by `pearson()` in\n * `./insights`, exposed here as a reusable line-of-best-fit.\n */\n\nimport { pairedMoments } from '../util/math';\n\nexport interface RegressionFit {\n /** Slope (dy/dx) of the fitted line. */\n slope: number;\n /** Y-intercept of the fitted line. */\n intercept: number;\n /** Coefficient of determination (R\u00B2), in [0, 1]. */\n r2: number;\n /** Number of finite (x, y) pairs the fit used. */\n n: number;\n /** Predict y for a given x along the fitted line. */\n predict(x: number): number;\n}\n\n/**\n * Ordinary-least-squares linear fit over paired numeric samples.\n *\n * Returns `null` when there are fewer than two points or the x values have no\n * spread (a vertical fit has an undefined slope). Non-finite pairs are ignored.\n */\nexport function linearRegression(\n xs: readonly number[],\n ys: readonly number[],\n): RegressionFit | null {\n const moments = pairedMoments(xs, ys);\n if (!moments) return null;\n const { n, meanX, meanY, cov, vx, vy } = moments;\n if (vx <= 0) return null;\n\n const slope = cov / vx;\n const intercept = meanY - slope * meanX;\n // r\u00B2 = (cov\u00B2 / (vx\u00B7vy)); when y is constant (vy === 0) the line fits exactly.\n const r2 = vy <= 0 ? 1 : Math.min(1, (cov * cov) / (vx * vy));\n\n return {\n slope,\n intercept,\n r2,\n n,\n predict: (x: number) => slope * x + intercept,\n };\n}\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,qBAAqB;AAqBvB,SAAS,iBACd,IACA,IACsB;AACtB,QAAM,UAAU,cAAc,IAAI,EAAE;AACpC,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,EAAE,GAAG,OAAO,OAAO,KAAK,IAAI,GAAG,IAAI;AACzC,MAAI,MAAM,EAAG,QAAO;AAEpB,QAAM,QAAQ,MAAM;AACpB,QAAM,YAAY,QAAQ,QAAQ;AAElC,QAAM,KAAK,MAAM,IAAI,IAAI,KAAK,IAAI,GAAI,MAAM,OAAQ,KAAK,GAAG;AAE5D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,CAAC,MAAc,QAAQ,IAAI;AAAA,EACtC;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic natural-language chart summaries — the chart explains itself.
|
|
3
|
+
*
|
|
4
|
+
* {@link summarize} turns the structured facts from {@link analyzeChart} into one
|
|
5
|
+
* or two plain-English sentences ("Users rose 46% from 4,200 to 6,150…"). It is
|
|
6
|
+
* a pure, LLM-free function of the spec, so the same string is reproducible in a
|
|
7
|
+
* report, an email, or — crucially — as the alt-text behind a canvas chart.
|
|
8
|
+
*
|
|
9
|
+
* Returns `''` for chart types that carry no summarizable trend (tables, maps,
|
|
10
|
+
* sankey), so callers can treat an empty string as "nothing worth narrating".
|
|
11
|
+
*/
|
|
12
|
+
import type { ChartSpec } from '../spec/types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Build a deterministic, plain-English summary of what a chart's data shows.
|
|
15
|
+
* Doubles as alt-text. Returns `''` when the chart type isn't summarizable.
|
|
16
|
+
*/
|
|
17
|
+
export declare function summarize(spec: ChartSpec): string;
|
|
18
|
+
//# sourceMappingURL=summarize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../src/analyze/summarize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AA4H/C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAiBjD"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { formatValue } from "../format/index.js";
|
|
2
|
+
import {
|
|
3
|
+
analyzeChart
|
|
4
|
+
} from "./insights.js";
|
|
5
|
+
const EN_DASH = "\u2013";
|
|
6
|
+
function cap(s) {
|
|
7
|
+
return s ? s.charAt(0).toUpperCase() + s.slice(1) : s;
|
|
8
|
+
}
|
|
9
|
+
function pctText(p) {
|
|
10
|
+
return `${Math.round(Math.abs(p) * 100)}%`;
|
|
11
|
+
}
|
|
12
|
+
function formatter(ins) {
|
|
13
|
+
const hint = ins.measureFormat;
|
|
14
|
+
return (v) => formatValue(v, hint);
|
|
15
|
+
}
|
|
16
|
+
function summarizeSeries(ins) {
|
|
17
|
+
const series = ins.series ?? [];
|
|
18
|
+
const fmt = formatter(ins);
|
|
19
|
+
const measure = cap(ins.measureLabel ?? ins.measureField ?? "Value");
|
|
20
|
+
if (series.length === 1) {
|
|
21
|
+
const s = series[0];
|
|
22
|
+
if (s.count === 1) return `${measure} is ${fmt(s.first.value)}.`;
|
|
23
|
+
const span = s.first.label && s.last.label && s.first.label !== s.last.label ? ` between ${s.first.label} and ${s.last.label}` : "";
|
|
24
|
+
if (s.direction === "flat") {
|
|
25
|
+
return `${measure} held steady around ${fmt(s.mean)}${span}.`;
|
|
26
|
+
}
|
|
27
|
+
const verb = s.direction === "up" ? "rose" : "fell";
|
|
28
|
+
const change = s.pctChange !== null ? pctText(s.pctChange) : `${fmt(Math.abs(s.netChange))}`;
|
|
29
|
+
let out = `${measure} ${verb} ${change} from ${fmt(s.first.value)} to ${fmt(s.last.value)}${span}`;
|
|
30
|
+
const peakIsInterior = s.max.index !== s.last.index && s.max.index !== s.first.index;
|
|
31
|
+
if (s.direction === "up" && peakIsInterior && s.max.value > s.last.value) {
|
|
32
|
+
out += `, peaking at ${fmt(s.max.value)} in ${s.max.label}`;
|
|
33
|
+
} else if (s.direction === "down" && s.min.index !== s.last.index && s.min.index !== s.first.index && s.min.value < s.last.value) {
|
|
34
|
+
out += `, bottoming at ${fmt(s.min.value)} in ${s.min.label}`;
|
|
35
|
+
}
|
|
36
|
+
return `${out}.`;
|
|
37
|
+
}
|
|
38
|
+
if (series.length > 1 && ins.leader && ins.biggestMover) {
|
|
39
|
+
const moverSeries = series.find((s) => s.key === ins.biggestMover.key);
|
|
40
|
+
const moveDelta = ins.biggestMover.delta;
|
|
41
|
+
const moveVerb = moveDelta > 0 ? "rose" : moveDelta < 0 ? "fell" : "held steady";
|
|
42
|
+
let out = `Across ${series.length} series, ${ins.leader.key} leads at ${fmt(ins.leader.value)}`;
|
|
43
|
+
if (moverSeries && moveDelta !== 0 && ins.biggestMover.key !== ins.leader.key) {
|
|
44
|
+
out += `; ${ins.biggestMover.key} ${moveVerb} the most (${moveDelta > 0 ? "+" : "-"}${fmt(Math.abs(moveDelta))})`;
|
|
45
|
+
} else if (moverSeries && moveDelta !== 0) {
|
|
46
|
+
out += ` and ${moveVerb} the most (${moveDelta > 0 ? "+" : "-"}${fmt(Math.abs(moveDelta))})`;
|
|
47
|
+
}
|
|
48
|
+
return `${out}.`;
|
|
49
|
+
}
|
|
50
|
+
return "";
|
|
51
|
+
}
|
|
52
|
+
function summarizeCategory(ins) {
|
|
53
|
+
const c = ins.category;
|
|
54
|
+
if (!c) return "";
|
|
55
|
+
const fmt = formatter(ins);
|
|
56
|
+
const share = `${Math.round(c.topShare * 100)}%`;
|
|
57
|
+
let out = `${cap(c.top.label)} is the largest at ${fmt(c.top.value)} (${share} of the ${fmt(c.total)} total)`;
|
|
58
|
+
if (c.count > 1 && c.bottom.label !== c.top.label) {
|
|
59
|
+
out += `, ${c.bottom.label} the smallest at ${fmt(c.bottom.value)}`;
|
|
60
|
+
}
|
|
61
|
+
if (c.duplicateCategories?.length) {
|
|
62
|
+
const sample = c.duplicateCategories.slice(0, 3).join(", ");
|
|
63
|
+
const more = c.duplicateCategories.length > 3 ? ` and ${c.duplicateCategories.length - 3} more` : "";
|
|
64
|
+
out += `; repeated categories include ${sample}${more}`;
|
|
65
|
+
}
|
|
66
|
+
return `${out}.`;
|
|
67
|
+
}
|
|
68
|
+
function summarizeScatter(ins) {
|
|
69
|
+
const sc = ins.scatter;
|
|
70
|
+
if (!sc) return "";
|
|
71
|
+
const fmt = formatter(ins);
|
|
72
|
+
const xName = ins.categoryField ?? "x";
|
|
73
|
+
const yName = ins.measureLabel ?? ins.measureField ?? "y";
|
|
74
|
+
const r = sc.correlation;
|
|
75
|
+
let corr = "";
|
|
76
|
+
if (r !== null) {
|
|
77
|
+
const strength = Math.abs(r) > 0.6 ? "strong" : Math.abs(r) > 0.3 ? "moderate" : Math.abs(r) > 0.1 ? "weak" : null;
|
|
78
|
+
corr = strength ? `, a ${strength} ${r > 0 ? "positive" : "negative"} correlation` : ", little correlation";
|
|
79
|
+
}
|
|
80
|
+
return `${sc.count} points; ${xName} ranges ${formatValue(sc.xExtent[0])}${EN_DASH}${formatValue(sc.xExtent[1])} and ${yName} ${fmt(sc.yExtent[0])}${EN_DASH}${fmt(sc.yExtent[1])}${corr}.`;
|
|
81
|
+
}
|
|
82
|
+
function summarizeValue(ins) {
|
|
83
|
+
const v = ins.value;
|
|
84
|
+
if (!v) return "";
|
|
85
|
+
const fmt = formatter(ins);
|
|
86
|
+
const label = cap(ins.measureLabel ?? "Value");
|
|
87
|
+
let out = `${label} is ${fmt(v.value)}`;
|
|
88
|
+
if (v.target !== null) {
|
|
89
|
+
const rel = v.value > v.target ? "above" : v.value < v.target ? "below" : "on";
|
|
90
|
+
out += `, ${rel} the target of ${fmt(v.target)}`;
|
|
91
|
+
}
|
|
92
|
+
return `${out}.`;
|
|
93
|
+
}
|
|
94
|
+
function summarizeDistribution(ins) {
|
|
95
|
+
const d = ins.distribution;
|
|
96
|
+
if (!d) return "";
|
|
97
|
+
const fmt = formatter(ins);
|
|
98
|
+
const field = ins.measureLabel ?? ins.measureField ?? "values";
|
|
99
|
+
return `${d.count} ${field} values ranging ${fmt(d.min.value)}${EN_DASH}${fmt(d.max.value)}, averaging ${fmt(d.mean)}.`;
|
|
100
|
+
}
|
|
101
|
+
function summarize(spec) {
|
|
102
|
+
const ins = analyzeChart(spec);
|
|
103
|
+
if (!ins) return "";
|
|
104
|
+
switch (ins.family) {
|
|
105
|
+
case "series":
|
|
106
|
+
return summarizeSeries(ins);
|
|
107
|
+
case "category":
|
|
108
|
+
return summarizeCategory(ins);
|
|
109
|
+
case "scatter":
|
|
110
|
+
return summarizeScatter(ins);
|
|
111
|
+
case "value":
|
|
112
|
+
return summarizeValue(ins);
|
|
113
|
+
case "distribution":
|
|
114
|
+
return summarizeDistribution(ins);
|
|
115
|
+
default:
|
|
116
|
+
return "";
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export {
|
|
120
|
+
summarize
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=summarize.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/analyze/summarize.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Deterministic natural-language chart summaries \u2014 the chart explains itself.\n *\n * {@link summarize} turns the structured facts from {@link analyzeChart} into one\n * or two plain-English sentences (\"Users rose 46% from 4,200 to 6,150\u2026\"). It is\n * a pure, LLM-free function of the spec, so the same string is reproducible in a\n * report, an email, or \u2014 crucially \u2014 as the alt-text behind a canvas chart.\n *\n * Returns `''` for chart types that carry no summarizable trend (tables, maps,\n * sankey), so callers can treat an empty string as \"nothing worth narrating\".\n */\n\nimport type { ChartSpec } from '../spec/types';\nimport { formatValue } from '../format';\nimport {\n analyzeChart,\n type ChartInsights,\n type SeriesInsights,\n} from './insights';\n\nconst EN_DASH = '\\u2013';\n\nfunction cap(s: string): string {\n return s ? s.charAt(0).toUpperCase() + s.slice(1) : s;\n}\n\nfunction pctText(p: number): string {\n return `${Math.round(Math.abs(p) * 100)}%`;\n}\n\n/** A formatter bound to the chart's measure format hint. */\nfunction formatter(ins: ChartInsights): (v: number) => string {\n const hint = ins.measureFormat;\n return (v: number) => formatValue(v, hint);\n}\n\nfunction summarizeSeries(ins: ChartInsights): string {\n const series = ins.series ?? [];\n const fmt = formatter(ins);\n const measure = cap(ins.measureLabel ?? ins.measureField ?? 'Value');\n\n if (series.length === 1) {\n const s = series[0];\n if (s.count === 1) return `${measure} is ${fmt(s.first.value)}.`;\n\n const span =\n s.first.label && s.last.label && s.first.label !== s.last.label\n ? ` between ${s.first.label} and ${s.last.label}`\n : '';\n\n if (s.direction === 'flat') {\n return `${measure} held steady around ${fmt(s.mean)}${span}.`;\n }\n\n const verb = s.direction === 'up' ? 'rose' : 'fell';\n const change = s.pctChange !== null ? pctText(s.pctChange) : `${fmt(Math.abs(s.netChange))}`;\n let out = `${measure} ${verb} ${change} from ${fmt(s.first.value)} to ${fmt(s.last.value)}${span}`;\n\n const peakIsInterior = s.max.index !== s.last.index && s.max.index !== s.first.index;\n if (s.direction === 'up' && peakIsInterior && s.max.value > s.last.value) {\n out += `, peaking at ${fmt(s.max.value)} in ${s.max.label}`;\n } else if (s.direction === 'down' && s.min.index !== s.last.index && s.min.index !== s.first.index && s.min.value < s.last.value) {\n out += `, bottoming at ${fmt(s.min.value)} in ${s.min.label}`;\n }\n return `${out}.`;\n }\n\n if (series.length > 1 && ins.leader && ins.biggestMover) {\n const moverSeries = series.find((s) => s.key === ins.biggestMover!.key) as SeriesInsights | undefined;\n const moveDelta = ins.biggestMover.delta;\n const moveVerb = moveDelta > 0 ? 'rose' : moveDelta < 0 ? 'fell' : 'held steady';\n let out = `Across ${series.length} series, ${ins.leader.key} leads at ${fmt(ins.leader.value)}`;\n if (moverSeries && moveDelta !== 0 && ins.biggestMover.key !== ins.leader.key) {\n out += `; ${ins.biggestMover.key} ${moveVerb} the most (${moveDelta > 0 ? '+' : '-'}${fmt(Math.abs(moveDelta))})`;\n } else if (moverSeries && moveDelta !== 0) {\n out += ` and ${moveVerb} the most (${moveDelta > 0 ? '+' : '-'}${fmt(Math.abs(moveDelta))})`;\n }\n return `${out}.`;\n }\n\n return '';\n}\n\nfunction summarizeCategory(ins: ChartInsights): string {\n const c = ins.category;\n if (!c) return '';\n const fmt = formatter(ins);\n const share = `${Math.round(c.topShare * 100)}%`;\n let out = `${cap(c.top.label)} is the largest at ${fmt(c.top.value)} (${share} of the ${fmt(c.total)} total)`;\n if (c.count > 1 && c.bottom.label !== c.top.label) {\n out += `, ${c.bottom.label} the smallest at ${fmt(c.bottom.value)}`;\n }\n if (c.duplicateCategories?.length) {\n const sample = c.duplicateCategories.slice(0, 3).join(', ');\n const more = c.duplicateCategories.length > 3 ? ` and ${c.duplicateCategories.length - 3} more` : '';\n out += `; repeated categories include ${sample}${more}`;\n }\n return `${out}.`;\n}\n\nfunction summarizeScatter(ins: ChartInsights): string {\n const sc = ins.scatter;\n if (!sc) return '';\n const fmt = formatter(ins);\n const xName = ins.categoryField ?? 'x';\n const yName = ins.measureLabel ?? ins.measureField ?? 'y';\n const r = sc.correlation;\n let corr = '';\n if (r !== null) {\n const strength = Math.abs(r) > 0.6 ? 'strong' : Math.abs(r) > 0.3 ? 'moderate' : Math.abs(r) > 0.1 ? 'weak' : null;\n corr = strength ? `, a ${strength} ${r > 0 ? 'positive' : 'negative'} correlation` : ', little correlation';\n }\n return `${sc.count} points; ${xName} ranges ${formatValue(sc.xExtent[0])}${EN_DASH}${formatValue(sc.xExtent[1])} and ${yName} ${fmt(sc.yExtent[0])}${EN_DASH}${fmt(sc.yExtent[1])}${corr}.`;\n}\n\nfunction summarizeValue(ins: ChartInsights): string {\n const v = ins.value;\n if (!v) return '';\n const fmt = formatter(ins);\n const label = cap(ins.measureLabel ?? 'Value');\n let out = `${label} is ${fmt(v.value)}`;\n if (v.target !== null) {\n const rel = v.value > v.target ? 'above' : v.value < v.target ? 'below' : 'on';\n out += `, ${rel} the target of ${fmt(v.target)}`;\n }\n return `${out}.`;\n}\n\nfunction summarizeDistribution(ins: ChartInsights): string {\n const d = ins.distribution;\n if (!d) return '';\n const fmt = formatter(ins);\n const field = ins.measureLabel ?? ins.measureField ?? 'values';\n return `${d.count} ${field} values ranging ${fmt(d.min.value)}${EN_DASH}${fmt(d.max.value)}, averaging ${fmt(d.mean)}.`;\n}\n\n/**\n * Build a deterministic, plain-English summary of what a chart's data shows.\n * Doubles as alt-text. Returns `''` when the chart type isn't summarizable.\n */\nexport function summarize(spec: ChartSpec): string {\n const ins = analyzeChart(spec);\n if (!ins) return '';\n switch (ins.family) {\n case 'series':\n return summarizeSeries(ins);\n case 'category':\n return summarizeCategory(ins);\n case 'scatter':\n return summarizeScatter(ins);\n case 'value':\n return summarizeValue(ins);\n case 'distribution':\n return summarizeDistribution(ins);\n default:\n return '';\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface AnimateOptions {
|
|
2
|
+
duration: number;
|
|
3
|
+
easing?: (t: number) => number;
|
|
4
|
+
onUpdate: (t: number) => void;
|
|
5
|
+
onComplete?: () => void;
|
|
6
|
+
now?: () => number;
|
|
7
|
+
raf?: (cb: (t: number) => void) => number;
|
|
8
|
+
cancelRaf?: (handle: number) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface AnimationHandle {
|
|
11
|
+
cancel(): void;
|
|
12
|
+
}
|
|
13
|
+
export declare function animate(opts: AnimateOptions): AnimationHandle;
|
|
14
|
+
//# sourceMappingURL=animate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animate.d.ts","sourceRoot":"","sources":["../../src/animation/animate.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,KAAK,MAAM,CAAC;IAC1C,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,IAAI,IAAI,CAAC;CAChB;AA2BD,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,CAmD7D"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { linear } from "./easing.js";
|
|
2
|
+
function defaultNow() {
|
|
3
|
+
return globalThis.performance?.now() ?? Date.now();
|
|
4
|
+
}
|
|
5
|
+
function defaultRaf(cb) {
|
|
6
|
+
if (globalThis.requestAnimationFrame !== void 0) {
|
|
7
|
+
return globalThis.requestAnimationFrame(cb);
|
|
8
|
+
}
|
|
9
|
+
return globalThis.setTimeout(() => cb(defaultNow()), 16);
|
|
10
|
+
}
|
|
11
|
+
function defaultCancelRaf(handle) {
|
|
12
|
+
if (globalThis.cancelAnimationFrame !== void 0) {
|
|
13
|
+
globalThis.cancelAnimationFrame(handle);
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
globalThis.clearTimeout(handle);
|
|
17
|
+
}
|
|
18
|
+
function clamp01(value) {
|
|
19
|
+
return Math.min(1, Math.max(0, value));
|
|
20
|
+
}
|
|
21
|
+
function animate(opts) {
|
|
22
|
+
const easing = opts.easing ?? linear;
|
|
23
|
+
if (opts.duration <= 0) {
|
|
24
|
+
opts.onUpdate(easing(1));
|
|
25
|
+
opts.onComplete?.();
|
|
26
|
+
return {
|
|
27
|
+
cancel() {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const now = opts.now ?? defaultNow;
|
|
33
|
+
const raf = opts.raf ?? defaultRaf;
|
|
34
|
+
const cancelRaf = opts.cancelRaf ?? defaultCancelRaf;
|
|
35
|
+
const start = now();
|
|
36
|
+
let cancelled = false;
|
|
37
|
+
let completed = false;
|
|
38
|
+
let frame;
|
|
39
|
+
const step = () => {
|
|
40
|
+
if (cancelled || completed) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const rawT = clamp01((now() - start) / opts.duration);
|
|
44
|
+
opts.onUpdate(easing(rawT));
|
|
45
|
+
if (rawT >= 1) {
|
|
46
|
+
completed = true;
|
|
47
|
+
opts.onComplete?.();
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
frame = raf(step);
|
|
51
|
+
};
|
|
52
|
+
frame = raf(step);
|
|
53
|
+
return {
|
|
54
|
+
cancel() {
|
|
55
|
+
if (cancelled || completed) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
cancelled = true;
|
|
59
|
+
if (frame !== void 0) {
|
|
60
|
+
cancelRaf(frame);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
animate
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=animate.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/animation/animate.ts"],
|
|
4
|
+
"sourcesContent": ["import { linear } from './easing';\n\nexport interface AnimateOptions {\n duration: number;\n easing?: (t: number) => number;\n onUpdate: (t: number) => void;\n onComplete?: () => void;\n now?: () => number;\n raf?: (cb: (t: number) => void) => number;\n cancelRaf?: (handle: number) => void;\n}\n\nexport interface AnimationHandle {\n cancel(): void;\n}\n\nfunction defaultNow(): number {\n return globalThis.performance?.now() ?? Date.now();\n}\n\nfunction defaultRaf(cb: (t: number) => void): number {\n if (globalThis.requestAnimationFrame !== undefined) {\n return globalThis.requestAnimationFrame(cb);\n }\n\n return globalThis.setTimeout(() => cb(defaultNow()), 16) as unknown as number;\n}\n\nfunction defaultCancelRaf(handle: number): void {\n if (globalThis.cancelAnimationFrame !== undefined) {\n globalThis.cancelAnimationFrame(handle);\n return;\n }\n\n globalThis.clearTimeout(handle);\n}\n\nfunction clamp01(value: number): number {\n return Math.min(1, Math.max(0, value));\n}\n\nexport function animate(opts: AnimateOptions): AnimationHandle {\n const easing = opts.easing ?? linear;\n\n if (opts.duration <= 0) {\n opts.onUpdate(easing(1));\n opts.onComplete?.();\n return {\n cancel(): void {\n return;\n },\n };\n }\n\n const now = opts.now ?? defaultNow;\n const raf = opts.raf ?? defaultRaf;\n const cancelRaf = opts.cancelRaf ?? defaultCancelRaf;\n const start = now();\n let cancelled = false;\n let completed = false;\n let frame: number | undefined;\n\n const step = (): void => {\n if (cancelled || completed) {\n return;\n }\n\n const rawT = clamp01((now() - start) / opts.duration);\n opts.onUpdate(easing(rawT));\n\n if (rawT >= 1) {\n completed = true;\n opts.onComplete?.();\n return;\n }\n\n frame = raf(step);\n };\n\n frame = raf(step);\n\n return {\n cancel(): void {\n if (cancelled || completed) {\n return;\n }\n cancelled = true;\n if (frame !== undefined) {\n cancelRaf(frame);\n }\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,cAAc;AAgBvB,SAAS,aAAqB;AAC5B,SAAO,WAAW,aAAa,IAAI,KAAK,KAAK,IAAI;AACnD;AAEA,SAAS,WAAW,IAAiC;AACnD,MAAI,WAAW,0BAA0B,QAAW;AAClD,WAAO,WAAW,sBAAsB,EAAE;AAAA,EAC5C;AAEA,SAAO,WAAW,WAAW,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;AACzD;AAEA,SAAS,iBAAiB,QAAsB;AAC9C,MAAI,WAAW,yBAAyB,QAAW;AACjD,eAAW,qBAAqB,MAAM;AACtC;AAAA,EACF;AAEA,aAAW,aAAa,MAAM;AAChC;AAEA,SAAS,QAAQ,OAAuB;AACtC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;AAEO,SAAS,QAAQ,MAAuC;AAC7D,QAAM,SAAS,KAAK,UAAU;AAE9B,MAAI,KAAK,YAAY,GAAG;AACtB,SAAK,SAAS,OAAO,CAAC,CAAC;AACvB,SAAK,aAAa;AAClB,WAAO;AAAA,MACL,SAAe;AACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,KAAK,OAAO;AACxB,QAAM,MAAM,KAAK,OAAO;AACxB,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,QAAQ,IAAI;AAClB,MAAI,YAAY;AAChB,MAAI,YAAY;AAChB,MAAI;AAEJ,QAAM,OAAO,MAAY;AACvB,QAAI,aAAa,WAAW;AAC1B;AAAA,IACF;AAEA,UAAM,OAAO,SAAS,IAAI,IAAI,SAAS,KAAK,QAAQ;AACpD,SAAK,SAAS,OAAO,IAAI,CAAC;AAE1B,QAAI,QAAQ,GAAG;AACb,kBAAY;AACZ,WAAK,aAAa;AAClB;AAAA,IACF;AAEA,YAAQ,IAAI,IAAI;AAAA,EAClB;AAEA,UAAQ,IAAI,IAAI;AAEhB,SAAO;AAAA,IACL,SAAe;AACb,UAAI,aAAa,WAAW;AAC1B;AAAA,MACF;AACA,kBAAY;AACZ,UAAI,UAAU,QAAW;AACvB,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type EasingFunction = (t: number) => number;
|
|
2
|
+
export declare function linear(t: number): number;
|
|
3
|
+
export declare function quadIn(t: number): number;
|
|
4
|
+
export declare function quadOut(t: number): number;
|
|
5
|
+
export declare function quadInOut(t: number): number;
|
|
6
|
+
export declare function cubicIn(t: number): number;
|
|
7
|
+
export declare function cubicOut(t: number): number;
|
|
8
|
+
export declare function cubicInOut(t: number): number;
|
|
9
|
+
export declare function expoOut(t: number): number;
|
|
10
|
+
export declare function expoInOut(t: number): number;
|
|
11
|
+
export declare function sinInOut(t: number): number;
|
|
12
|
+
export declare function backOut(t: number): number;
|
|
13
|
+
export declare function bounceOut(t: number): number;
|
|
14
|
+
export declare function elasticOut(t: number): number;
|
|
15
|
+
export declare const easings: Record<string, EasingFunction>;
|
|
16
|
+
//# sourceMappingURL=easing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easing.d.ts","sourceRoot":"","sources":["../../src/animation/easing.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;AAcnD,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG5C;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGzC;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM3C;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG1C;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAOzC;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAuB3C;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAO5C;AAED,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAclD,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
const overshoot = 1.70158;
|
|
2
|
+
function endpoint(t) {
|
|
3
|
+
if (t === 0) {
|
|
4
|
+
return 0;
|
|
5
|
+
}
|
|
6
|
+
if (t === 1) {
|
|
7
|
+
return 1;
|
|
8
|
+
}
|
|
9
|
+
return void 0;
|
|
10
|
+
}
|
|
11
|
+
function linear(t) {
|
|
12
|
+
return t;
|
|
13
|
+
}
|
|
14
|
+
function quadIn(t) {
|
|
15
|
+
return t * t;
|
|
16
|
+
}
|
|
17
|
+
function quadOut(t) {
|
|
18
|
+
return t * (2 - t);
|
|
19
|
+
}
|
|
20
|
+
function quadInOut(t) {
|
|
21
|
+
return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
|
|
22
|
+
}
|
|
23
|
+
function cubicIn(t) {
|
|
24
|
+
return t * t * t;
|
|
25
|
+
}
|
|
26
|
+
function cubicOut(t) {
|
|
27
|
+
const u = t - 1;
|
|
28
|
+
return u * u * u + 1;
|
|
29
|
+
}
|
|
30
|
+
function cubicInOut(t) {
|
|
31
|
+
const u = 2 * t - 2;
|
|
32
|
+
return t < 0.5 ? 4 * t * t * t : 0.5 * u * u * u + 1;
|
|
33
|
+
}
|
|
34
|
+
function expoOut(t) {
|
|
35
|
+
const end = endpoint(t);
|
|
36
|
+
return end ?? 1 - 2 ** (-10 * t);
|
|
37
|
+
}
|
|
38
|
+
function expoInOut(t) {
|
|
39
|
+
const end = endpoint(t);
|
|
40
|
+
if (end !== void 0) {
|
|
41
|
+
return end;
|
|
42
|
+
}
|
|
43
|
+
return t < 0.5 ? 2 ** (20 * t - 10) / 2 : (2 - 2 ** (-20 * t + 10)) / 2;
|
|
44
|
+
}
|
|
45
|
+
function sinInOut(t) {
|
|
46
|
+
const end = endpoint(t);
|
|
47
|
+
return end ?? -(Math.cos(Math.PI * t) - 1) / 2;
|
|
48
|
+
}
|
|
49
|
+
function backOut(t) {
|
|
50
|
+
const end = endpoint(t);
|
|
51
|
+
if (end !== void 0) {
|
|
52
|
+
return end;
|
|
53
|
+
}
|
|
54
|
+
const u = t - 1;
|
|
55
|
+
return 1 + (overshoot + 1) * u * u * u + overshoot * u * u;
|
|
56
|
+
}
|
|
57
|
+
function bounceOut(t) {
|
|
58
|
+
const end = endpoint(t);
|
|
59
|
+
if (end !== void 0) {
|
|
60
|
+
return end;
|
|
61
|
+
}
|
|
62
|
+
const n1 = 7.5625;
|
|
63
|
+
const d1 = 2.75;
|
|
64
|
+
if (t < 1 / d1) {
|
|
65
|
+
return n1 * t * t;
|
|
66
|
+
}
|
|
67
|
+
if (t < 2 / d1) {
|
|
68
|
+
const u2 = t - 1.5 / d1;
|
|
69
|
+
return n1 * u2 * u2 + 0.75;
|
|
70
|
+
}
|
|
71
|
+
if (t < 2.5 / d1) {
|
|
72
|
+
const u2 = t - 2.25 / d1;
|
|
73
|
+
return n1 * u2 * u2 + 0.9375;
|
|
74
|
+
}
|
|
75
|
+
const u = t - 2.625 / d1;
|
|
76
|
+
return n1 * u * u + 0.984375;
|
|
77
|
+
}
|
|
78
|
+
function elasticOut(t) {
|
|
79
|
+
const end = endpoint(t);
|
|
80
|
+
if (end !== void 0) {
|
|
81
|
+
return end;
|
|
82
|
+
}
|
|
83
|
+
return 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * (2 * Math.PI / 3)) + 1;
|
|
84
|
+
}
|
|
85
|
+
const easings = {
|
|
86
|
+
linear,
|
|
87
|
+
quadIn,
|
|
88
|
+
quadOut,
|
|
89
|
+
quadInOut,
|
|
90
|
+
cubicIn,
|
|
91
|
+
cubicOut,
|
|
92
|
+
cubicInOut,
|
|
93
|
+
expoOut,
|
|
94
|
+
expoInOut,
|
|
95
|
+
sinInOut,
|
|
96
|
+
backOut,
|
|
97
|
+
bounceOut,
|
|
98
|
+
elasticOut
|
|
99
|
+
};
|
|
100
|
+
export {
|
|
101
|
+
backOut,
|
|
102
|
+
bounceOut,
|
|
103
|
+
cubicIn,
|
|
104
|
+
cubicInOut,
|
|
105
|
+
cubicOut,
|
|
106
|
+
easings,
|
|
107
|
+
elasticOut,
|
|
108
|
+
expoInOut,
|
|
109
|
+
expoOut,
|
|
110
|
+
linear,
|
|
111
|
+
quadIn,
|
|
112
|
+
quadInOut,
|
|
113
|
+
quadOut,
|
|
114
|
+
sinInOut
|
|
115
|
+
};
|
|
116
|
+
//# sourceMappingURL=easing.js.map
|