@motionscript/charts 0.0.0-stage → 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/LICENSE +201 -0
- package/dist/bar-chart/bar-chart.d.ts +286 -0
- package/dist/bar-chart/bar-chart.d.ts.map +1 -0
- package/dist/bar-chart/bar-chart.js +610 -0
- package/dist/bar-chart/bar-chart.js.map +1 -0
- package/dist/bar-chart/category-axis.d.ts +77 -0
- package/dist/bar-chart/category-axis.d.ts.map +1 -0
- package/dist/bar-chart/category-axis.js +141 -0
- package/dist/bar-chart/category-axis.js.map +1 -0
- package/dist/bar-chart/chart-bars.d.ts +149 -0
- package/dist/bar-chart/chart-bars.d.ts.map +1 -0
- package/dist/bar-chart/chart-bars.js +236 -0
- package/dist/bar-chart/chart-bars.js.map +1 -0
- package/dist/bar-chart/index.d.ts +16 -0
- package/dist/bar-chart/index.d.ts.map +1 -0
- package/dist/bar-chart/index.js +12 -0
- package/dist/bar-chart/index.js.map +1 -0
- package/dist/bar-chart/shared.d.ts +146 -0
- package/dist/bar-chart/shared.d.ts.map +1 -0
- package/dist/bar-chart/shared.js +182 -0
- package/dist/bar-chart/shared.js.map +1 -0
- package/dist/browser/chunks/chunk-ZMBOBHYL.js +2 -0
- package/dist/browser/chunks/chunk-ZMBOBHYL.js.map +7 -0
- package/dist/browser/index.js +2 -0
- package/dist/browser/index.js.map +7 -0
- package/dist/browser/kit.js +2 -0
- package/dist/browser/kit.js.map +7 -0
- package/dist/browser/manifest.json +12 -0
- package/dist/engine.d.ts +27 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +27 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/kit/chart-border.d.ts +28 -0
- package/dist/kit/chart-border.d.ts.map +1 -0
- package/dist/kit/chart-border.js +45 -0
- package/dist/kit/chart-border.js.map +1 -0
- package/dist/kit/chart-canvas.d.ts +56 -0
- package/dist/kit/chart-canvas.d.ts.map +1 -0
- package/dist/kit/chart-canvas.js +125 -0
- package/dist/kit/chart-canvas.js.map +1 -0
- package/dist/kit/chart-legend.d.ts +126 -0
- package/dist/kit/chart-legend.d.ts.map +1 -0
- package/dist/kit/chart-legend.js +212 -0
- package/dist/kit/chart-legend.js.map +1 -0
- package/dist/kit/shared.d.ts +251 -0
- package/dist/kit/shared.d.ts.map +1 -0
- package/dist/kit/shared.js +401 -0
- package/dist/kit/shared.js.map +1 -0
- package/dist/kit/vertical-axis.d.ts +99 -0
- package/dist/kit/vertical-axis.d.ts.map +1 -0
- package/dist/kit/vertical-axis.js +176 -0
- package/dist/kit/vertical-axis.js.map +1 -0
- package/dist/line-chart/chart-line.d.ts +91 -0
- package/dist/line-chart/chart-line.d.ts.map +1 -0
- package/dist/line-chart/chart-line.js +156 -0
- package/dist/line-chart/chart-line.js.map +1 -0
- package/dist/line-chart/chart-region.d.ts +47 -0
- package/dist/line-chart/chart-region.d.ts.map +1 -0
- package/dist/line-chart/chart-region.js +101 -0
- package/dist/line-chart/chart-region.js.map +1 -0
- package/dist/line-chart/horizontal-axis.d.ts +85 -0
- package/dist/line-chart/horizontal-axis.d.ts.map +1 -0
- package/dist/line-chart/horizontal-axis.js +158 -0
- package/dist/line-chart/horizontal-axis.js.map +1 -0
- package/dist/line-chart/index.d.ts +22 -0
- package/dist/line-chart/index.d.ts.map +1 -0
- package/dist/line-chart/index.js +19 -0
- package/dist/line-chart/index.js.map +1 -0
- package/dist/line-chart/line-chart.d.ts +347 -0
- package/dist/line-chart/line-chart.d.ts.map +1 -0
- package/dist/line-chart/line-chart.js +701 -0
- package/dist/line-chart/line-chart.js.map +1 -0
- package/dist/line-chart/shared.d.ts +171 -0
- package/dist/line-chart/shared.d.ts.map +1 -0
- package/dist/line-chart/shared.js +270 -0
- package/dist/line-chart/shared.js.map +1 -0
- package/dist/line-chart/x-scale.d.ts +84 -0
- package/dist/line-chart/x-scale.d.ts.map +1 -0
- package/dist/line-chart/x-scale.js +302 -0
- package/dist/line-chart/x-scale.js.map +1 -0
- package/dist/nodes.d.ts +20 -0
- package/dist/nodes.d.ts.map +1 -0
- package/dist/nodes.js +20 -0
- package/dist/nodes.js.map +1 -0
- package/dist/pie-chart/index.d.ts +18 -0
- package/dist/pie-chart/index.d.ts.map +1 -0
- package/dist/pie-chart/index.js +14 -0
- package/dist/pie-chart/index.js.map +1 -0
- package/dist/pie-chart/pie-chart.d.ts +170 -0
- package/dist/pie-chart/pie-chart.d.ts.map +1 -0
- package/dist/pie-chart/pie-chart.js +291 -0
- package/dist/pie-chart/pie-chart.js.map +1 -0
- package/dist/pie-chart/pie-legend.d.ts +60 -0
- package/dist/pie-chart/pie-legend.d.ts.map +1 -0
- package/dist/pie-chart/pie-legend.js +131 -0
- package/dist/pie-chart/pie-legend.js.map +1 -0
- package/dist/pie-chart/pie-ring.d.ts +266 -0
- package/dist/pie-chart/pie-ring.d.ts.map +1 -0
- package/dist/pie-chart/pie-ring.js +708 -0
- package/dist/pie-chart/pie-ring.js.map +1 -0
- package/dist/pie-chart/shared.d.ts +210 -0
- package/dist/pie-chart/shared.d.ts.map +1 -0
- package/dist/pie-chart/shared.js +240 -0
- package/dist/pie-chart/shared.js.map +1 -0
- package/package.json +69 -3
- package/registry.json +23 -0
- package/src/bar-chart/bar-chart.ts +804 -0
- package/src/bar-chart/category-axis.ts +177 -0
- package/src/bar-chart/chart-bars.ts +310 -0
- package/src/bar-chart/index.ts +31 -0
- package/src/bar-chart/shared.ts +354 -0
- package/src/engine.ts +26 -0
- package/src/index.ts +5 -0
- package/src/kit/chart-border.ts +61 -0
- package/src/kit/chart-canvas.ts +157 -0
- package/src/kit/chart-legend.ts +250 -0
- package/src/kit/shared.ts +675 -0
- package/src/kit/vertical-axis.ts +224 -0
- package/src/line-chart/chart-line.ts +208 -0
- package/src/line-chart/chart-region.ts +135 -0
- package/src/line-chart/horizontal-axis.ts +202 -0
- package/src/line-chart/index.ts +39 -0
- package/src/line-chart/line-chart.ts +894 -0
- package/src/line-chart/shared.ts +459 -0
- package/src/line-chart/x-scale.ts +367 -0
- package/src/nodes.ts +20 -0
- package/src/pie-chart/index.ts +37 -0
- package/src/pie-chart/pie-chart.ts +374 -0
- package/src/pie-chart/pie-legend.ts +159 -0
- package/src/pie-chart/pie-ring.ts +903 -0
- package/src/pie-chart/shared.ts +490 -0
- package/README.md +0 -4
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { command, Rect, Text, easeOut, property, textOps, } from "@motionscript/core";
|
|
8
|
+
import { DEFAULT_LEGEND, clampUnit, } from "../kit/shared.js";
|
|
9
|
+
import { at, compose, hold } from "@motionscript/core/component";
|
|
10
|
+
/** How far an entry starts to the right of its slot when it enters, in px. */
|
|
11
|
+
const SLIDE = 16;
|
|
12
|
+
/**
|
|
13
|
+
* The legend of a {@link PieChart}: a **vertical-flow column** of entries, one per
|
|
14
|
+
* slice, each pairing the slice's caption with its colour swatch.
|
|
15
|
+
*
|
|
16
|
+
* A column rather than the cartesian charts' row, because it sits *beside* the
|
|
17
|
+
* ring rather than beneath the plot — a pie is as tall as it is wide, so the
|
|
18
|
+
* space it leaves over is a vertical strip. It is otherwise the same entry: the
|
|
19
|
+
* swatch carries the colour, the caption reads in the legend's neutral ink, and
|
|
20
|
+
* both take the shared {@link LegendConfig}.
|
|
21
|
+
*
|
|
22
|
+
* There is no show/hide here. A pie's marks are its *rows*, and a row that
|
|
23
|
+
* shouldn't be in the chart shouldn't be in the table — removing one would
|
|
24
|
+
* silently re-cut every other wedge's share, which is a different chart rather
|
|
25
|
+
* than the same chart with something hidden. Selection is what a pie has
|
|
26
|
+
* instead, and it arrives through {@link dims}.
|
|
27
|
+
*/
|
|
28
|
+
export class PieLegend extends Rect {
|
|
29
|
+
/** One entry per slice, ordered top → bottom, for the staggered entrance. */
|
|
30
|
+
items = [];
|
|
31
|
+
constructor(props) {
|
|
32
|
+
// `flow` with the rest of the fixed geometry, and for the reason
|
|
33
|
+
// {@link ChartLegend} spells out: a `Rect` given none lays its children out
|
|
34
|
+
// `freeform`, so an unstated column is every caption drawn on top of the
|
|
35
|
+
// last one.
|
|
36
|
+
super({
|
|
37
|
+
...props,
|
|
38
|
+
flow: "vertical",
|
|
39
|
+
align: "centerLeft",
|
|
40
|
+
width: "hug",
|
|
41
|
+
height: "hug",
|
|
42
|
+
});
|
|
43
|
+
// Fixed column geometry last, so it wins over what super() applied.
|
|
44
|
+
this.set({ gap: this.legend.itemGap / 3, padding: this.legend.padding });
|
|
45
|
+
for (let i = 0; i < this.slices.length; i++) {
|
|
46
|
+
const item = this.buildItem(this.slices[i]);
|
|
47
|
+
this.items.push(item);
|
|
48
|
+
// The selection dim rides a wrapper rather than the entry itself, so the
|
|
49
|
+
// entrance can animate the entry's own opacity without the two fighting
|
|
50
|
+
// over one value — opacity multiplies down the tree, which is exactly the
|
|
51
|
+
// composition wanted here.
|
|
52
|
+
this.add(new Rect({
|
|
53
|
+
width: "hug",
|
|
54
|
+
height: "hug",
|
|
55
|
+
flow: "freeform",
|
|
56
|
+
opacity: () => clampUnit(this.dims[i] ?? 1),
|
|
57
|
+
children: [item],
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** One entry: the slice's colour swatch beside its caption. */
|
|
62
|
+
buildItem(slice) {
|
|
63
|
+
const marker = this.legend.markerStyle;
|
|
64
|
+
return new Rect({ flow: "horizontal",
|
|
65
|
+
gap: 12,
|
|
66
|
+
align: "center",
|
|
67
|
+
width: "hug",
|
|
68
|
+
height: "hug",
|
|
69
|
+
children: [
|
|
70
|
+
new Rect({
|
|
71
|
+
width: marker.height,
|
|
72
|
+
height: marker.height,
|
|
73
|
+
cornerRadius: marker.borderRadius,
|
|
74
|
+
fill: slice.fill,
|
|
75
|
+
stroke: marker.stroke,
|
|
76
|
+
shadow: marker.shadow,
|
|
77
|
+
}),
|
|
78
|
+
new Text({
|
|
79
|
+
...textOps.styleProps(this.legend.textStyle),
|
|
80
|
+
text: slice.category,
|
|
81
|
+
}),
|
|
82
|
+
],
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Prime every entry at its pre-entrance state: shifted right and transparent.
|
|
87
|
+
*
|
|
88
|
+
* Idempotent, and separate from {@link enter} so the chart can arm its whole
|
|
89
|
+
* composition before the first frame is drawn — the resting state is the
|
|
90
|
+
* finished legend, so there is nothing hidden to reveal unless a scene asks.
|
|
91
|
+
*/
|
|
92
|
+
arm(slide = SLIDE) {
|
|
93
|
+
for (const item of this.items)
|
|
94
|
+
item.set({ opacity: 0, x: slide });
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Slide + fade every entry in from the right, staggered top-to-bottom.
|
|
98
|
+
*
|
|
99
|
+
* `duration` is the **whole** entrance: the stagger is carved out of it rather
|
|
100
|
+
* than added on top, so the command takes exactly the time the timeline laid
|
|
101
|
+
* out for it.
|
|
102
|
+
*/
|
|
103
|
+
enter(args) {
|
|
104
|
+
const duration = args.duration;
|
|
105
|
+
const easing = args.easing ?? easeOut();
|
|
106
|
+
const items = this.items;
|
|
107
|
+
if (items.length === 0)
|
|
108
|
+
return hold(duration);
|
|
109
|
+
this.arm();
|
|
110
|
+
// Each gap is a fifth of an entry's own move, the rhythm the axes use;
|
|
111
|
+
// solved for from the budget rather than added to it. The offsets were
|
|
112
|
+
// always `i * step` — written as `wait` inside a generator they merely only
|
|
113
|
+
// existed while it ran.
|
|
114
|
+
const per = duration / (1 + Math.max(0, items.length - 1) / 5);
|
|
115
|
+
const step = per / 5;
|
|
116
|
+
return compose(items.map((item, i) => at(i * step, item.to({ data: { opacity: 1, x: 0 }, duration: per, easing }))));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
__decorate([
|
|
120
|
+
property({ default: () => [] })
|
|
121
|
+
], PieLegend.prototype, "slices", void 0);
|
|
122
|
+
__decorate([
|
|
123
|
+
property({ default: DEFAULT_LEGEND })
|
|
124
|
+
], PieLegend.prototype, "legend", void 0);
|
|
125
|
+
__decorate([
|
|
126
|
+
property({ default: () => [] })
|
|
127
|
+
], PieLegend.prototype, "dims", void 0);
|
|
128
|
+
__decorate([
|
|
129
|
+
command()
|
|
130
|
+
], PieLegend.prototype, "enter", null);
|
|
131
|
+
//# sourceMappingURL=pie-legend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pie-legend.js","sourceRoot":"","sources":["../../src/pie-chart/pie-legend.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n command,\n Rect,\n Text,\n easeOut,\n property,\n textOps,\n type CommandArgs,\n type NodeConfig,\n type RectProps,\n} from \"@motionscript/core\"\n\nimport {\n DEFAULT_LEGEND,\n clampUnit,\n type LegendConfig,\n} from \"../kit/shared\"\nimport { at, compose, hold, type Seekable } from \"@motionscript/core/component\"\nimport type { PieSlice } from \"./shared\"\n\nexport interface PieLegendProps extends RectProps {\n /** One entry per slice, in ring order. */\n slices: PieSlice[]\n /** Padding, caption style, gaps, and swatch geometry — see {@link LegendConfig}. */\n legend: LegendConfig\n /**\n * Per-slice opacity multiplier, by index — the same signal that dims the ring,\n * so an entry fades in step with the wedge it names. Missing entries read as 1.\n */\n dims: number[]\n}\n\n/** How far an entry starts to the right of its slot when it enters, in px. */\nconst SLIDE = 16\n\n/**\n * The legend of a {@link PieChart}: a **vertical-flow column** of entries, one per\n * slice, each pairing the slice's caption with its colour swatch.\n *\n * A column rather than the cartesian charts' row, because it sits *beside* the\n * ring rather than beneath the plot — a pie is as tall as it is wide, so the\n * space it leaves over is a vertical strip. It is otherwise the same entry: the\n * swatch carries the colour, the caption reads in the legend's neutral ink, and\n * both take the shared {@link LegendConfig}.\n *\n * There is no show/hide here. A pie's marks are its *rows*, and a row that\n * shouldn't be in the chart shouldn't be in the table — removing one would\n * silently re-cut every other wedge's share, which is a different chart rather\n * than the same chart with something hidden. Selection is what a pie has\n * instead, and it arrives through {@link dims}.\n */\nexport class PieLegend extends Rect {\n @property({ default: () => [] as PieSlice[] }) declare slices: PieSlice[]\n @property({ default: DEFAULT_LEGEND }) declare legend: LegendConfig\n @property({ default: () => [] as number[] }) declare dims: number[]\n\n /** One entry per slice, ordered top → bottom, for the staggered entrance. */\n private items: Rect[] = []\n\n constructor(props?: NodeConfig<PieLegend, PieLegendProps>) {\n // `flow` with the rest of the fixed geometry, and for the reason\n // {@link ChartLegend} spells out: a `Rect` given none lays its children out\n // `freeform`, so an unstated column is every caption drawn on top of the\n // last one.\n super({\n ...(props as RectProps),\n flow: \"vertical\",\n align: \"centerLeft\",\n width: \"hug\",\n height: \"hug\",\n })\n\n // Fixed column geometry last, so it wins over what super() applied.\n this.set({ gap: this.legend.itemGap / 3, padding: this.legend.padding })\n\n for (let i = 0; i < this.slices.length; i++) {\n const item = this.buildItem(this.slices[i])\n this.items.push(item)\n // The selection dim rides a wrapper rather than the entry itself, so the\n // entrance can animate the entry's own opacity without the two fighting\n // over one value — opacity multiplies down the tree, which is exactly the\n // composition wanted here.\n this.add(\n new Rect({\n width: \"hug\",\n height: \"hug\",\n flow: \"freeform\",\n opacity: () => clampUnit(this.dims[i] ?? 1),\n children: [item],\n })\n )\n }\n }\n\n /** One entry: the slice's colour swatch beside its caption. */\n private buildItem(slice: PieSlice): Rect {\n const marker = this.legend.markerStyle\n return new Rect({ flow: \"horizontal\",\n gap: 12,\n align: \"center\",\n width: \"hug\",\n height: \"hug\",\n children: [\n new Rect({\n width: marker.height,\n height: marker.height,\n cornerRadius: marker.borderRadius,\n fill: slice.fill,\n stroke: marker.stroke,\n shadow: marker.shadow,\n }),\n new Text({\n ...textOps.styleProps(this.legend.textStyle),\n text: slice.category,\n }),\n ],\n })\n }\n\n /**\n * Prime every entry at its pre-entrance state: shifted right and transparent.\n *\n * Idempotent, and separate from {@link enter} so the chart can arm its whole\n * composition before the first frame is drawn — the resting state is the\n * finished legend, so there is nothing hidden to reveal unless a scene asks.\n */\n arm(slide = SLIDE): void {\n for (const item of this.items) item.set({ opacity: 0, x: slide })\n }\n\n /**\n * Slide + fade every entry in from the right, staggered top-to-bottom.\n *\n * `duration` is the **whole** entrance: the stagger is carved out of it rather\n * than added on top, so the command takes exactly the time the timeline laid\n * out for it.\n */\n @command()\n enter(\n args: CommandArgs<Record<string, never>> & { duration: number }\n ): Seekable {\n const duration = args.duration\n const easing = args.easing ?? easeOut()\n const items = this.items\n if (items.length === 0) return hold(duration)\n this.arm()\n\n // Each gap is a fifth of an entry's own move, the rhythm the axes use;\n // solved for from the budget rather than added to it. The offsets were\n // always `i * step` — written as `wait` inside a generator they merely only\n // existed while it ran.\n const per = duration / (1 + Math.max(0, items.length - 1) / 5)\n const step = per / 5\n\n return compose(\n items.map((item, i) => at(i * step, item.to({ data: { opacity: 1, x: 0 }, duration: per, easing })))\n )\n }\n}\n"]}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { type AssetScope, Node2D, type Command, type CommandArgs, type NodeConfig, type Node2DProps, type RenderContext2D } from "@motionscript/core";
|
|
2
|
+
import { type CenterConfig, type LabelConfig, type PieLabelMode, type PieLabelPlacement, type PieSlice, type RingConfig } from "./shared.js";
|
|
3
|
+
export interface PieRingProps extends Node2DProps {
|
|
4
|
+
/** One entry per slice: its `category`, `value` and `fill`. */
|
|
5
|
+
slices: PieSlice[];
|
|
6
|
+
/** Ring geometry and paint — gap, hole, start angle, selection growth. */
|
|
7
|
+
ring: RingConfig;
|
|
8
|
+
/** How the labels are set, and the leader lines that point at them. */
|
|
9
|
+
label: LabelConfig;
|
|
10
|
+
/**
|
|
11
|
+
* How the hole's summary is set.
|
|
12
|
+
*
|
|
13
|
+
* Named `centerStyle` rather than `center` because every node already has a
|
|
14
|
+
* `center` — the anchor its position is measured from.
|
|
15
|
+
*/
|
|
16
|
+
centerStyle: CenterConfig;
|
|
17
|
+
/** What the labels say, or `"none"` to drop them entirely. */
|
|
18
|
+
labelMode: PieLabelMode;
|
|
19
|
+
/** Where the labels sit: inside their wedge, outside on a leader, or nowhere. */
|
|
20
|
+
labelPlacement: PieLabelPlacement;
|
|
21
|
+
/**
|
|
22
|
+
* Sweep of the ring in `[0, 1]`: 0 draws nothing, 1 the full circle. The
|
|
23
|
+
* wedges grow around clockwise from the ring's `startAngle` as this rises.
|
|
24
|
+
*/
|
|
25
|
+
growth: number;
|
|
26
|
+
/**
|
|
27
|
+
* Fade of the leader lines and labels in `[0, 1]`, held separate from
|
|
28
|
+
* {@link growth} so they arrive *after* the ring has swept in.
|
|
29
|
+
*/
|
|
30
|
+
labelReveal: number;
|
|
31
|
+
/**
|
|
32
|
+
* How far each slice is currently pushed out of the ring, `0`–`1` per index.
|
|
33
|
+
* Owned by the chart, so the ring and the legend read one signal.
|
|
34
|
+
*/
|
|
35
|
+
pops: number[];
|
|
36
|
+
/** Opacity everything *unselected* falls back to while any slice is selected. */
|
|
37
|
+
dimOpacity: number;
|
|
38
|
+
/**
|
|
39
|
+
* Text set in the middle of the ring's hole — the largest uninterrupted area
|
|
40
|
+
* the chart owns, and on a donut otherwise empty. A one-line summary there
|
|
41
|
+
* routinely does more work than the whole ring around it. Empty (the default)
|
|
42
|
+
* leaves the hole clear; ignored when there is no hole.
|
|
43
|
+
*/
|
|
44
|
+
centerLabel: string;
|
|
45
|
+
/** Smaller second line under {@link centerLabel}. Empty (the default) drops it. */
|
|
46
|
+
centerCaption: string;
|
|
47
|
+
/**
|
|
48
|
+
* Fade of the hole's summary in `[0, 1]`. Its own signal, untouched by the
|
|
49
|
+
* ring's entrance — a hole label is usually a *conclusion*, so a scene that
|
|
50
|
+
* wants it to land on a later beat sets this to 0 and calls
|
|
51
|
+
* `PieChart.revealCenter` when it gets there.
|
|
52
|
+
*/
|
|
53
|
+
centerReveal: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The ring itself: one wedge per {@link PieSlice}, sized by its share of the
|
|
57
|
+
* total, swept clockwise from the theme's `startAngle` with a `gap` of clear
|
|
58
|
+
* space between neighbours — a *constant-width* channel, the same at the hole as
|
|
59
|
+
* at the rim (see {@link wedgePath}). A **selected** slice reaches further out
|
|
60
|
+
* while its hole edge stays put — so it reads as that band swelling out of the
|
|
61
|
+
* ring rather than breaking off it — and the rest of the ring dims behind it,
|
|
62
|
+
* leaders and labels included.
|
|
63
|
+
*
|
|
64
|
+
* This is the only part of the chart family that draws a path: the wedges are
|
|
65
|
+
* filled {@link PathBuilder} polygons approximating each arc, and the leaders are
|
|
66
|
+
* stroked polylines — both in the node's centred, y-up space, so neither depends
|
|
67
|
+
* on SVG arc-sweep conventions. The **labels are real {@link Text} nodes**
|
|
68
|
+
* (stacked in a hug vertical flow and pinned by their inner edge), so no
|
|
69
|
+
* glyph-width guesswork decides where a caption starts.
|
|
70
|
+
*
|
|
71
|
+
* ### Label placement
|
|
72
|
+
* Each label sits either **inside** its wedge or **outside** on a leader.
|
|
73
|
+
*
|
|
74
|
+
* An inside label is centred on its slice's band and leads with the number, the
|
|
75
|
+
* caption set small underneath — inside a wedge the reader already knows which
|
|
76
|
+
* slice they're on, so the magnitude is the thing being read. It costs no gutter
|
|
77
|
+
* and no eye round-trip, so a ring labelled that way draws considerably bigger in
|
|
78
|
+
* the same box.
|
|
79
|
+
*
|
|
80
|
+
* A leader label sits outside on the end of a polyline that lifts off its wedge,
|
|
81
|
+
* elbows, and runs horizontally into the text. Labels are split into a left and a
|
|
82
|
+
* right column by which way their slice's bisector points, and each column is
|
|
83
|
+
* de-conflicted independently (see {@link relaxLabels}): a label takes the spot
|
|
84
|
+
* nearest its wedge that still clears its neighbour, and the column is squeezed
|
|
85
|
+
* to fit the node's height rather than spilling out of it. The elbow then rides on
|
|
86
|
+
* a circle just outside the ring **at the label's settled y**, so the run into the
|
|
87
|
+
* text is always horizontal and a nudged label never drags its leader back across
|
|
88
|
+
* the ring.
|
|
89
|
+
*
|
|
90
|
+
* Only the sides that actually carry a leader reserve a gutter, and the ring's
|
|
91
|
+
* centre slides into whatever the other side left over ({@link centerX}) — so a
|
|
92
|
+
* ring whose slices all leader one way doesn't leave a bald patch on the other.
|
|
93
|
+
*/
|
|
94
|
+
export declare class PieRing extends Node2D<PieRingProps> {
|
|
95
|
+
slices: PieSlice[];
|
|
96
|
+
ring: RingConfig;
|
|
97
|
+
label: LabelConfig;
|
|
98
|
+
centerStyle: CenterConfig;
|
|
99
|
+
labelMode: PieLabelMode;
|
|
100
|
+
labelPlacement: PieLabelPlacement;
|
|
101
|
+
growth: number;
|
|
102
|
+
labelReveal: number;
|
|
103
|
+
pops: number[];
|
|
104
|
+
dimOpacity: number;
|
|
105
|
+
centerLabel: string;
|
|
106
|
+
centerCaption: string;
|
|
107
|
+
centerReveal: number;
|
|
108
|
+
/** Each slice's fill, resolved once so `renderSelf` doesn't re-resolve every frame. */
|
|
109
|
+
private fills;
|
|
110
|
+
constructor(props?: NodeConfig<PieRing, PieRingProps>);
|
|
111
|
+
/** Build slice `arc`'s label, in whichever form the chart's placement asks for. */
|
|
112
|
+
private addLabel;
|
|
113
|
+
/** Build the hole's summary block. */
|
|
114
|
+
private addCenterLabel;
|
|
115
|
+
/** The drawn slices' angular spans, re-read every frame so a value tween re-cuts them. */
|
|
116
|
+
private get arcs();
|
|
117
|
+
/** Which side a leader off bisector `mid` runs to: +1 right, −1 left. */
|
|
118
|
+
private sideOf;
|
|
119
|
+
/** Whether any slice is labelled on a leader — the only thing that costs a gutter. */
|
|
120
|
+
private get hasLeaderLabels();
|
|
121
|
+
/**
|
|
122
|
+
* How wide a horizontal label centred in slice `arc`'s band can run before it
|
|
123
|
+
* leaves the wedge, in px.
|
|
124
|
+
*
|
|
125
|
+
* Two things bound it, and which one binds depends entirely on where the wedge
|
|
126
|
+
* sits. Stepping sideways from the label's centre moves you *radially* by
|
|
127
|
+
* `dx·sin(mid)` and *tangentially* by `dx·cos(mid)`, so a wedge at 3 o'clock is
|
|
128
|
+
* limited by the band's thickness (its label runs straight across the band)
|
|
129
|
+
* while a wedge at 12 o'clock is limited by its own arc (its label runs along
|
|
130
|
+
* the band, which is much roomier). Taking the smaller of the two is what stops
|
|
131
|
+
* a label overflowing the ring on one chart and being pointlessly shrunk on the
|
|
132
|
+
* next.
|
|
133
|
+
*
|
|
134
|
+
* Measured off the *unpopped* radius, so a slice growing out of the ring
|
|
135
|
+
* doesn't resize its own text mid-animation.
|
|
136
|
+
*/
|
|
137
|
+
private insideRoom;
|
|
138
|
+
/** Widest line, in glyphs at the leading line's size, an inside label runs to. */
|
|
139
|
+
private insideGlyphs;
|
|
140
|
+
/**
|
|
141
|
+
* Font size of an inside label's leading line: what the theme asked for,
|
|
142
|
+
* shrunk if that wouldn't fit inside its wedge. **One size across every inside
|
|
143
|
+
* label** — the smallest any of them needs — because labels at mismatched
|
|
144
|
+
* sizes read as a mistake rather than as emphasis.
|
|
145
|
+
*
|
|
146
|
+
* So the theme's `insideStyle.fontSize` is an upper bound, not a promise: ask
|
|
147
|
+
* for the size the chart wants and the ring keeps it legal.
|
|
148
|
+
*/
|
|
149
|
+
private get insideFont();
|
|
150
|
+
/** Whether the hole carries a summary at all. */
|
|
151
|
+
private get hasCenterLabel();
|
|
152
|
+
/**
|
|
153
|
+
* Font size of the hole's summary: the configured size, capped so it still
|
|
154
|
+
* fits across the hole. The cap matters because the hole's radius derives from
|
|
155
|
+
* the box, so a chart that reflows smaller would otherwise push its summary out
|
|
156
|
+
* through the ring.
|
|
157
|
+
*/
|
|
158
|
+
private get centerFont();
|
|
159
|
+
/** Rim radius of a fully selected slice as a multiple of the ring's, clamped sane. */
|
|
160
|
+
private get growFactor();
|
|
161
|
+
/** How far past the ring's rim a fully selected slice reaches, in px. */
|
|
162
|
+
private get maxPop();
|
|
163
|
+
/** Height of one **leader** label block, in px — the unit those columns are spaced by. */
|
|
164
|
+
private get labelRowHeight();
|
|
165
|
+
/** Widest line, in glyphs, that a leader label for slice `index` can run to. */
|
|
166
|
+
private captionGlyphs;
|
|
167
|
+
/**
|
|
168
|
+
* Horizontal room reserved on each side for the leaders and their labels, in
|
|
169
|
+
* px — measured **per side**, from the slices that actually leader out that
|
|
170
|
+
* way. A ring whose labels are all inside reserves nothing and draws bigger.
|
|
171
|
+
*
|
|
172
|
+
* Excludes the ring's own selection-growth allowance, which scales with the
|
|
173
|
+
* radius and so is divided out in {@link outerRadius} instead.
|
|
174
|
+
*/
|
|
175
|
+
private get labelGutters();
|
|
176
|
+
/**
|
|
177
|
+
* How far the ring's centre sits from the node's, in px. Zero while the
|
|
178
|
+
* gutters match; when the labels all fall one way it slides the ring into the
|
|
179
|
+
* empty half so the ring-plus-labels group stays centred in the box instead of
|
|
180
|
+
* the ring sitting dead centre with a bald patch beside it.
|
|
181
|
+
*/
|
|
182
|
+
private get centerX();
|
|
183
|
+
/**
|
|
184
|
+
* Radius of the ring's outer edge, fitted to whatever the label gutters leave.
|
|
185
|
+
* A fully selected slice reaches `radius × growFactor`, so the room has to
|
|
186
|
+
* cover that — hence the divisor, which keeps even the grown slice inside the
|
|
187
|
+
* box (and holds the ring the same size whether or not anything is selected).
|
|
188
|
+
*/
|
|
189
|
+
private get outerRadius();
|
|
190
|
+
/** Radius of the hole in the middle: a fraction of the outer radius, or explicit px. */
|
|
191
|
+
private get holeRadius();
|
|
192
|
+
/** Radius of the circle every leader elbows on, clear of even a popped-out slice. */
|
|
193
|
+
private get elbowRadius();
|
|
194
|
+
/** How far slice `index` is currently pushed out, in `[0, 1]`. */
|
|
195
|
+
private popOf;
|
|
196
|
+
/** Radius of slice `index`'s outer edge, its selection growth included. */
|
|
197
|
+
private anchorRadius;
|
|
198
|
+
/**
|
|
199
|
+
* Radius an inside label sits at on slice `index`: halfway across the band on a
|
|
200
|
+
* donut, and further out than halfway on a solid pie, where "halfway" would
|
|
201
|
+
* crowd the point every wedge converges on. Rides the slice's own pop, so an
|
|
202
|
+
* inside label travels out with the wedge it belongs to.
|
|
203
|
+
*/
|
|
204
|
+
private bandMidRadius;
|
|
205
|
+
/** Node2D-space point slice `index`'s inside label is centred on. */
|
|
206
|
+
private insideAnchor;
|
|
207
|
+
/**
|
|
208
|
+
* How selected the ring is overall, in `[0, 1]` — the most-grown slice. Rides
|
|
209
|
+
* the same tween the pops do, so the dim below arrives with the growth rather
|
|
210
|
+
* than needing an animation of its own.
|
|
211
|
+
*/
|
|
212
|
+
private get selectionStrength();
|
|
213
|
+
/**
|
|
214
|
+
* Opacity slice `index` (and its leader and label) is drawn at: full while
|
|
215
|
+
* nothing is selected, falling toward {@link dimOpacity} in proportion to how
|
|
216
|
+
* selected the *rest* of the ring is. A slice that's selected itself stays at
|
|
217
|
+
* full — the two factors cancel.
|
|
218
|
+
*/
|
|
219
|
+
private sliceOpacity;
|
|
220
|
+
/**
|
|
221
|
+
* Where every leader label sits and how its leader gets there. Labels are split
|
|
222
|
+
* into a right and a left column by their slice's bisector, each column is
|
|
223
|
+
* spread so nothing overlaps (and nothing leaves the box), and each leader is
|
|
224
|
+
* then built as wedge edge → elbow → label. The elbow rides the leader circle at
|
|
225
|
+
* the label's *settled* y, which keeps the final run horizontal and the whole
|
|
226
|
+
* polyline outside the ring however far the label was nudged.
|
|
227
|
+
*/
|
|
228
|
+
private placements;
|
|
229
|
+
/** This frame's placement for slice `index`, or `undefined` if it isn't leadered. */
|
|
230
|
+
private placementFor;
|
|
231
|
+
/**
|
|
232
|
+
* The ring's paints live nowhere `ShapeNode` would look: one fill per slice,
|
|
233
|
+
* resolved once into {@link fills}, plus the leader line's own stroke. Both are
|
|
234
|
+
* passed explicitly — see {@link declarePaints}.
|
|
235
|
+
*/
|
|
236
|
+
declareAssets(assets: AssetScope): void;
|
|
237
|
+
protected renderSelf(ctx: RenderContext2D): void;
|
|
238
|
+
/** Tween {@link growth} `0 → 1`, wiping the wedges in around the ring. */
|
|
239
|
+
sweep(args: CommandArgs<Record<string, never>> & {
|
|
240
|
+
duration: number;
|
|
241
|
+
}): Command<RingSweep>;
|
|
242
|
+
/** Tween {@link labelReveal} `0 → 1`, fading the leaders and captions up. */
|
|
243
|
+
revealLabels(args: CommandArgs<Record<string, never>> & {
|
|
244
|
+
duration: number;
|
|
245
|
+
}): Command<RingLabels>;
|
|
246
|
+
/**
|
|
247
|
+
* Fade the hole's summary up. Deliberately not part of the ring's entrance: a
|
|
248
|
+
* hole label is usually the chart's conclusion, so the scene decides when it
|
|
249
|
+
* lands.
|
|
250
|
+
*/
|
|
251
|
+
revealCenter(args?: CommandArgs<Record<string, never>> & {
|
|
252
|
+
duration?: number;
|
|
253
|
+
}): Command<RingCenter>;
|
|
254
|
+
}
|
|
255
|
+
/** The signals the ring's own commands move, as props types. */
|
|
256
|
+
type RingSweep = {
|
|
257
|
+
growth: number;
|
|
258
|
+
};
|
|
259
|
+
type RingLabels = {
|
|
260
|
+
labelReveal: number;
|
|
261
|
+
};
|
|
262
|
+
type RingCenter = {
|
|
263
|
+
centerReveal: number;
|
|
264
|
+
};
|
|
265
|
+
export {};
|
|
266
|
+
//# sourceMappingURL=pie-ring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pie-ring.d.ts","sourceRoot":"","sources":["../../src/pie-chart/pie-ring.ts"],"names":[],"mappings":"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"}
|