@motionscript/charts 0.1.0 → 0.1.1-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 +19 -0
- package/dist/bar-chart/bar-chart.d.ts +22 -93
- package/dist/bar-chart/bar-chart.d.ts.map +1 -1
- package/dist/bar-chart/bar-chart.js +48 -121
- package/dist/bar-chart/bar-chart.js.map +1 -1
- package/dist/bar-chart/category-axis.d.ts +11 -38
- package/dist/bar-chart/category-axis.d.ts.map +1 -1
- package/dist/bar-chart/category-axis.js +15 -38
- package/dist/bar-chart/category-axis.js.map +1 -1
- package/dist/bar-chart/chart-bars.d.ts +43 -74
- package/dist/bar-chart/chart-bars.d.ts.map +1 -1
- package/dist/bar-chart/chart-bars.js +31 -59
- package/dist/bar-chart/chart-bars.js.map +1 -1
- package/dist/bar-chart/index.d.ts +2 -10
- package/dist/bar-chart/index.d.ts.map +1 -1
- package/dist/bar-chart/index.js +0 -7
- package/dist/bar-chart/index.js.map +1 -1
- package/dist/bar-chart/shared.d.ts +27 -90
- package/dist/bar-chart/shared.d.ts.map +1 -1
- package/dist/bar-chart/shared.js +15 -54
- package/dist/bar-chart/shared.js.map +1 -1
- package/dist/browser/chunks/chunk-4SMRCU24.js +2 -0
- package/dist/browser/chunks/chunk-4SMRCU24.js.map +7 -0
- package/dist/browser/index.js +1 -1
- package/dist/browser/index.js.map +3 -3
- package/dist/browser/kit.js +1 -1
- package/dist/browser/manifest.json +1 -1
- package/dist/engine.d.ts +4 -16
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +4 -16
- package/dist/engine.js.map +1 -1
- package/dist/kit/cartesian.d.ts +8 -28
- package/dist/kit/cartesian.d.ts.map +1 -1
- package/dist/kit/cartesian.js +7 -19
- package/dist/kit/cartesian.js.map +1 -1
- package/dist/kit/chart-border.d.ts +9 -18
- package/dist/kit/chart-border.d.ts.map +1 -1
- package/dist/kit/chart-border.js +4 -9
- package/dist/kit/chart-border.js.map +1 -1
- package/dist/kit/chart-canvas.d.ts +25 -36
- package/dist/kit/chart-canvas.d.ts.map +1 -1
- package/dist/kit/chart-canvas.js +13 -13
- package/dist/kit/chart-canvas.js.map +1 -1
- package/dist/kit/chart-legend.d.ts +14 -61
- package/dist/kit/chart-legend.d.ts.map +1 -1
- package/dist/kit/chart-legend.js +17 -65
- package/dist/kit/chart-legend.js.map +1 -1
- package/dist/kit/entries.d.ts +2 -0
- package/dist/kit/entries.d.ts.map +1 -1
- package/dist/kit/entries.js +2 -0
- package/dist/kit/entries.js.map +1 -1
- package/dist/kit/motion.d.ts +11 -3
- package/dist/kit/motion.d.ts.map +1 -1
- package/dist/kit/motion.js +7 -1
- package/dist/kit/motion.js.map +1 -1
- package/dist/kit/shared.d.ts +60 -175
- package/dist/kit/shared.d.ts.map +1 -1
- package/dist/kit/shared.js +40 -157
- package/dist/kit/shared.js.map +1 -1
- package/dist/kit/vertical-axis.d.ts +16 -45
- package/dist/kit/vertical-axis.d.ts.map +1 -1
- package/dist/kit/vertical-axis.js +17 -42
- package/dist/kit/vertical-axis.js.map +1 -1
- package/dist/line-chart/chart-line.d.ts +16 -41
- package/dist/line-chart/chart-line.d.ts.map +1 -1
- package/dist/line-chart/chart-line.js +14 -43
- package/dist/line-chart/chart-line.js.map +1 -1
- package/dist/line-chart/chart-region.d.ts +14 -27
- package/dist/line-chart/chart-region.d.ts.map +1 -1
- package/dist/line-chart/chart-region.js +8 -22
- package/dist/line-chart/chart-region.js.map +1 -1
- package/dist/line-chart/horizontal-axis.d.ts +16 -43
- package/dist/line-chart/horizontal-axis.d.ts.map +1 -1
- package/dist/line-chart/horizontal-axis.js +13 -42
- package/dist/line-chart/horizontal-axis.js.map +1 -1
- package/dist/line-chart/index.d.ts +1 -13
- package/dist/line-chart/index.d.ts.map +1 -1
- package/dist/line-chart/index.js +0 -12
- package/dist/line-chart/index.js.map +1 -1
- package/dist/line-chart/line-chart.d.ts +23 -109
- package/dist/line-chart/line-chart.d.ts.map +1 -1
- package/dist/line-chart/line-chart.js +45 -141
- package/dist/line-chart/line-chart.js.map +1 -1
- package/dist/line-chart/shared.d.ts +33 -107
- package/dist/line-chart/shared.d.ts.map +1 -1
- package/dist/line-chart/shared.js +28 -81
- package/dist/line-chart/shared.js.map +1 -1
- package/dist/line-chart/x-scale.d.ts +14 -55
- package/dist/line-chart/x-scale.d.ts.map +1 -1
- package/dist/line-chart/x-scale.js +29 -111
- package/dist/line-chart/x-scale.js.map +1 -1
- package/dist/nodes.d.ts +0 -12
- package/dist/nodes.d.ts.map +1 -1
- package/dist/nodes.js +0 -12
- package/dist/nodes.js.map +1 -1
- package/dist/pie-chart/index.d.ts +1 -12
- package/dist/pie-chart/index.d.ts.map +1 -1
- package/dist/pie-chart/index.js +0 -9
- package/dist/pie-chart/index.js.map +1 -1
- package/dist/pie-chart/pie-chart.d.ts +37 -71
- package/dist/pie-chart/pie-chart.d.ts.map +1 -1
- package/dist/pie-chart/pie-chart.js +31 -65
- package/dist/pie-chart/pie-chart.js.map +1 -1
- package/dist/pie-chart/pie-legend.d.ts +11 -26
- package/dist/pie-chart/pie-legend.d.ts.map +1 -1
- package/dist/pie-chart/pie-legend.js +14 -39
- package/dist/pie-chart/pie-legend.js.map +1 -1
- package/dist/pie-chart/pie-ring.d.ts +50 -192
- package/dist/pie-chart/pie-ring.d.ts.map +1 -1
- package/dist/pie-chart/pie-ring.js +75 -247
- package/dist/pie-chart/pie-ring.js.map +1 -1
- package/dist/pie-chart/shared.d.ts +45 -131
- package/dist/pie-chart/shared.d.ts.map +1 -1
- package/dist/pie-chart/shared.js +29 -72
- package/dist/pie-chart/shared.js.map +1 -1
- package/package.json +4 -4
- package/src/bar-chart/bar-chart.ts +51 -165
- package/src/bar-chart/category-axis.ts +16 -57
- package/src/bar-chart/chart-bars.ts +43 -120
- package/src/bar-chart/index.ts +2 -10
- package/src/bar-chart/shared.ts +29 -97
- package/src/engine.ts +4 -16
- package/src/kit/cartesian.ts +11 -26
- package/src/kit/chart-border.ts +6 -20
- package/src/kit/chart-canvas.ts +15 -40
- package/src/kit/chart-legend.ts +17 -86
- package/src/kit/entries.ts +4 -1
- package/src/kit/motion.ts +11 -2
- package/src/kit/shared.ts +58 -219
- package/src/kit/vertical-axis.ts +18 -71
- package/src/line-chart/chart-line.ts +16 -44
- package/src/line-chart/chart-region.ts +10 -23
- package/src/line-chart/horizontal-axis.ts +13 -42
- package/src/line-chart/index.ts +1 -13
- package/src/line-chart/line-chart.ts +50 -184
- package/src/line-chart/shared.ts +51 -145
- package/src/line-chart/x-scale.ts +31 -121
- package/src/nodes.ts +0 -12
- package/src/pie-chart/index.ts +1 -12
- package/src/pie-chart/pie-chart.ts +34 -102
- package/src/pie-chart/pie-legend.ts +14 -55
- package/src/pie-chart/pie-ring.ts +80 -307
- package/src/pie-chart/shared.ts +50 -139
- package/dist/browser/chunks/chunk-TJNHLQGV.js +0 -2
- package/dist/browser/chunks/chunk-TJNHLQGV.js.map +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pie-ring.js","sourceRoot":"","sources":["../../src/pie-chart/pie-ring.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Graphics2D,\n PathBuilder,\n Rect,\n Text,\n Types,\n component2d,\n fillOps,\n shadowOps,\n strokeOps,\n textOps,\n type Fill,\n type FillResolved,\n type NodeOf,\n type Node2D,\n type Node2DProps,\n type TextStyle,\n type Vector2,\n} from \"@motionscript/sdk\"\n\nimport { asParts, fresh } from \"../kit/entries\"\nimport { frameEase } from \"../kit/motion\"\nimport { loadPaints } from \"../kit/paints\"\nimport { clampUnit, formatPercent } from \"../kit/shared\"\nimport {\n DEFAULT_PIE_CHART_THEME,\n pieArcs,\n relaxLabels,\n ringPoint,\n type CenterConfig,\n type LabelConfig,\n type PieArc,\n type PieLabelMode,\n type PieLabelPlacement,\n type PieSlice,\n type RingConfig,\n} from \"./shared\"\n\nexport interface PieRingProps extends Node2DProps {\n /** One entry per slice: its `category`, `value` and `fill`. */\n slices: PieSlice[]\n /** Ring geometry and paint — gap, hole, start angle, selection growth. */\n ring: RingConfig\n /** How the labels are set, and the leader lines that point at them. */\n label: LabelConfig\n /**\n * How the hole's summary is set.\n *\n * Named `centerStyle` rather than `center` because every node already has a\n * `center` — the anchor its position is measured from.\n */\n centerStyle: CenterConfig\n /** What the labels say, or `\"none\"` to drop them entirely. */\n labelMode: PieLabelMode\n /** Where the labels sit: inside their wedge, outside on a leader, or nowhere. */\n labelPlacement: PieLabelPlacement\n /**\n * Sweep of the ring in `[0, 1]`: 0 draws nothing, 1 the full circle. The\n * wedges grow around clockwise from the ring's `startAngle` as this rises.\n */\n growth: number\n /**\n * Fade of the leader lines and labels in `[0, 1]`, held separate from\n * {@link growth} so they arrive *after* the ring has swept in.\n */\n labelReveal: number\n /**\n * How far each slice is currently pushed out of the ring, `0`–`1` per index.\n * Owned by the chart, so the ring and the legend read one signal.\n */\n pops: number[]\n /** Opacity everything *unselected* falls back to while any slice is selected. */\n dimOpacity: number\n /**\n * Text set in the middle of the ring's hole — the largest uninterrupted area\n * the chart owns, and on a donut otherwise empty. A one-line summary there\n * routinely does more work than the whole ring around it. Empty (the default)\n * leaves the hole clear; ignored when there is no hole.\n */\n centerLabel: string\n /** Smaller second line under {@link centerLabel}. Empty (the default) drops it. */\n centerCaption: string\n /**\n * Fade of the hole's summary in `[0, 1]`. Its own signal, untouched by the\n * ring's entrance — a hole label is usually a *conclusion*, so a scene that\n * wants it to land on a later beat sets this to 0 and calls\n * `PieChart.revealCenter` when it gets there.\n */\n centerReveal: number\n}\n\n/** Vertical breathing room between one label block and the next, in px. */\nconst LABEL_GAP = 12\n/** Breathing room past the outermost label, so it never touches the node's edge, in px. */\nconst LABEL_PAD = 14\n/** Rough width of one glyph as a fraction of the font size, for gutter sizing. */\nconst GLYPH_RATIO = 0.62\n/** Gap between a wedge's outer edge and where its leader lifts off, in px. */\nconst LEADER_LIFTOFF = 6\n/** How far past the ring's outer edge a leader runs before it elbows, in px. */\nconst LEADER_LENGTH = 34\n/** Horizontal run from the elbow to the label, in px. */\nconst LABEL_STUB = 26\n/** Gap between a leader's end and the label text it points at, in px. */\nconst TEXT_INSET = 8\n/**\n * Floor on the elbow's horizontal distance from the ring's axis, as a fraction\n * of the leader radius — so a label pushed clear above (or below) the ring still\n * elbows out sideways rather than running straight down the 12 o'clock line.\n */\nconst MIN_ELBOW = 0.18\n/** Segments used to tessellate a full turn of arc; a wedge takes its share. */\nconst ARC_STEPS = 240\n/** Rounding applied to the leader's elbow, in px. */\nconst ELBOW_RADIUS = 8\n/** Side padding used when nothing is leadered out — no gutter to reserve. */\nconst BARE_PAD = 2\n/** An inside label's caption size, as a fraction of its leading line. */\nconst INSIDE_CAPTION_RATIO = 0.44\n/**\n * Where an inside label sits on a **solid pie** (no hole to split the band\n * with), as a fraction of the wedge's radius — far enough out that the label\n * clears the point every wedge converges on.\n */\nconst PIE_LABEL_RADIUS = 0.62\n/** Fraction of the hole's diameter its summary is allowed to run to. */\nconst CENTER_LABEL_FIT = 0.78\n/** Fraction of the room inside a wedge that its label is allowed to run to. */\nconst INSIDE_LABEL_FIT = 0.9\n/** Below this, a wedge's bisector counts as axis-aligned and that term stops binding. */\nconst AXIS_EPSILON = 1e-3\n/** Fallback type size when a theme style leaves it unset or on autofit. */\nconst FALLBACK_SIZE = 26\n\n/** A style's numeric size, guarding the autofit and unset cases. */\nfunction sizeOf(style: TextStyle, fallback = FALLBACK_SIZE): number {\n const size = style.fontSize\n return typeof size === \"number\" ? size : fallback\n}\n\n/** Where one slice's label sits and the polyline that points at it. */\ninterface LabelPlacement {\n /** Index of the slice. */\n index: number\n /** Which side of the ring the label sits on: +1 right, −1 left. */\n side: 1 | -1\n /** Leader polyline: wedge edge → elbow → label. */\n leader: Vector2[]\n /** Point the label's inner edge is pinned to. */\n text: Vector2\n}\n\n/**\n * A ring-band wedge over `a0`→`a1` (radians, clockwise from 12 o'clock) spanning\n * `rInner`→`rOuter`, centred on `cx`. Ring wedges trace the outer arc, step in,\n * and trace the inner arc back; full pie wedges (`rInner <= 0`) close through the\n * centre.\n *\n * `halfGap` is **half the gap to the neighbouring slice, in px**, shaved off both\n * ends of the wedge. It's converted to an angle *per radius* (`halfGap / r` — a\n * wider angle near the hole than out at the rim), which is what keeps the channel\n * between two slices the same width all the way across the band. A fixed angular\n * gap instead reads as a thin pizza slice: right at the rim, pinched shut at the\n * hole. The inset is capped at the wedge's own half-span so a sliver of a slice\n * narrows to nothing rather than turning inside out.\n */\nfunction wedgePath(\n a0: number,\n a1: number,\n rInner: number,\n rOuter: number,\n halfGap: number,\n cx: number\n): PathBuilder {\n const path = new PathBuilder()\n const span = a1 - a0\n const steps = Math.max(\n 2,\n Math.ceil((Math.abs(span) / (Math.PI * 2)) * ARC_STEPS)\n )\n /** Angular inset at radius `r` that puts the wedge's edge `halfGap` px off the divide. */\n const insetAt = (r: number): number =>\n r <= 0 ? 0 : Math.min(halfGap / r, span / 2.2)\n const arcTo = (r: number, i: number): Vector2 => {\n const inset = insetAt(r)\n const from = a0 + inset\n const to = a1 - inset\n const point = ringPoint(r, from + ((to - from) * i) / steps)\n return { x: point.x + cx, y: point.y }\n }\n\n if (rInner <= 0) {\n // Solid pie wedge: the sides converge on the centre, so only the outer rim\n // carries the gap.\n path.moveTo(cx, 0)\n for (let i = 0; i <= steps; i++) {\n const p = arcTo(rOuter, i)\n path.lineTo(p.x, p.y)\n }\n path.close()\n return path\n }\n\n for (let i = 0; i <= steps; i++) {\n const p = arcTo(rOuter, i)\n if (i === 0) path.moveTo(p.x, p.y)\n else path.lineTo(p.x, p.y)\n }\n // Back along the inner arc — its own (wider) inset makes each side edge a\n // straight chord sitting `halfGap` px off the divide at both ends.\n for (let i = steps; i >= 0; i--) {\n const p = arcTo(rInner, i)\n path.lineTo(p.x, p.y)\n }\n path.close()\n return path\n}\n\n/** What the ring's geometry reads off its entries. */\ninterface RingState {\n readonly slices: PieSlice[]\n readonly ring: RingConfig\n readonly label: LabelConfig\n readonly centerStyle: CenterConfig\n readonly labelMode: PieLabelMode\n readonly labelPlacement: PieLabelPlacement\n readonly pops: readonly number[]\n readonly dimOpacity: number\n readonly centerLabel: string\n readonly centerCaption: string\n}\n\n/**\n * The ring's geometry for one box: every radius, gutter and label position,\n * derived from the entries and the size the ring was laid out at, and asked\n * afresh wherever it is read — the drawing, and the labels' bound positions\n * and sizes alike, so the two cannot disagree.\n */\nexport class RingGeometry {\n constructor(\n private readonly s: RingState,\n private readonly box: { readonly width: number; readonly height: number }\n ) { }\n\n /** The drawn slices' angular spans, re-read every frame so a value tween re-cuts them. */\n get arcs(): PieArc[] {\n return pieArcs(this.s.slices, this.s.ring.startAngle)\n }\n\n /** Whether any slice is labelled on a leader — the only thing that costs a gutter. */\n get hasLeaderLabels(): boolean {\n return this.s.labelPlacement === \"leader\" && this.s.labelMode !== \"none\" && this.arcs.length > 0\n }\n\n // ---- Label sizing ------------------------------------------------------\n\n /**\n * How wide a horizontal label centred in slice `arc`'s band can run before it\n * leaves the wedge, in px.\n *\n * Two things bound it, and which one binds depends entirely on where the wedge\n * sits. Stepping sideways from the label's centre moves you *radially* by\n * `dx·sin(mid)` and *tangentially* by `dx·cos(mid)`, so a wedge at 3 o'clock is\n * limited by the band's thickness (its label runs straight across the band)\n * while a wedge at 12 o'clock is limited by its own arc (its label runs along\n * the band, which is much roomier). Taking the smaller of the two is what stops\n * a label overflowing the ring on one chart and being pointlessly shrunk on the\n * next.\n *\n * Measured off the *unpopped* radius, so a slice growing out of the ring\n * doesn't resize its own text mid-animation.\n */\n insideRoom(arc: PieArc): number {\n const outer = this.outerRadius\n const hole = this.holeRadius\n const band = hole > 0 ? outer - hole : outer * (1 - PIE_LABEL_RADIUS) * 2\n const mid = hole > 0 ? (hole + outer) / 2 : outer * PIE_LABEL_RADIUS\n const sin = Math.abs(Math.sin(arc.mid))\n const cos = Math.abs(Math.cos(arc.mid))\n const acrossBand = sin > AXIS_EPSILON ? band / sin : Infinity\n const alongArc = cos > AXIS_EPSILON ? ((arc.a1 - arc.a0) * mid) / cos : Infinity\n return Math.max(0, Math.min(acrossBand, alongArc))\n }\n\n /** Widest line, in glyphs at the leading line's size, an inside label runs to. */\n insideGlyphs(arc: PieArc): number {\n const mode = this.s.labelMode\n const category = this.s.slices[arc.index]?.category.length ?? 0\n const percent = mode === \"both\" || mode === \"percent\" ? formatPercent(arc.fraction).length : 0\n // The caption is set at a fraction of the leading line, except when it *is*\n // the leading line.\n const caption = mode === \"category\" ? category : mode === \"both\" ? category * INSIDE_CAPTION_RATIO : 0\n return Math.max(1, percent, caption)\n }\n\n /**\n * Font size of an inside label's leading line: what the theme asked for,\n * shrunk if that wouldn't fit inside its wedge. **One size across every inside\n * label** — the smallest any of them needs — because labels at mismatched\n * sizes read as a mistake rather than as emphasis.\n *\n * So the theme's `insideStyle.fontSize` is an upper bound, not a promise: ask\n * for the size the chart wants and the ring keeps it legal.\n */\n get insideFont(): number {\n let size = sizeOf(this.s.label.insideStyle, FALLBACK_SIZE * 1.9)\n for (const arc of this.arcs) {\n const fits = (this.insideRoom(arc) * INSIDE_LABEL_FIT) / (this.insideGlyphs(arc) * GLYPH_RATIO)\n size = Math.min(size, fits)\n }\n return Math.max(1, size)\n }\n\n /**\n * Font size of the hole's summary: the configured size, capped so it still\n * fits across the hole. The cap matters because the hole's radius derives from\n * the box, so a chart that reflows smaller would otherwise push its summary out\n * through the ring.\n */\n get centerFont(): number {\n const { centerStyle, centerLabel, centerCaption } = this.s\n const wanted = sizeOf(centerStyle.labelStyle, 46)\n const hole = this.holeRadius\n if (hole <= 0) return wanted\n const captionRatio = sizeOf(centerStyle.captionStyle, 22) / Math.max(1, wanted)\n // Both lines have to clear the hole, and the caption is set at a fraction of\n // this size — so what binds is whichever is wider once drawn, not whichever\n // has more characters.\n const glyphs = Math.max(1, centerLabel.length, centerCaption.length * captionRatio)\n return Math.min(wanted, (hole * 2 * CENTER_LABEL_FIT) / (glyphs * GLYPH_RATIO))\n }\n\n // ---- Ring geometry, all derived from the box ---------------------------\n\n /** Rim radius of a fully selected slice as a multiple of the ring's, clamped sane. */\n get growFactor(): number {\n return Math.max(1, Math.min(1.6, this.s.ring.selectedGrow))\n }\n\n /** How far past the ring's rim a fully selected slice reaches, in px. */\n get maxPop(): number {\n return this.outerRadius * (this.growFactor - 1)\n }\n\n /** Height of one **leader** label block, in px — the unit those columns are spaced by. */\n get labelRowHeight(): number {\n // Inside labels are stacked in the band, not in a column beside the ring, so\n // they cost no vertical reserve.\n if (!this.hasLeaderLabels) return 0\n const caption = sizeOf(this.s.label.textStyle) * 1.25\n const percent = sizeOf(this.s.label.percentStyle) * 1.25\n if (this.s.labelMode === \"both\") return caption + percent + 2\n return this.s.labelMode === \"category\" ? caption : percent\n }\n\n /** Widest line, in glyphs, that a leader label for slice `index` can run to. */\n captionGlyphs(index: number): number {\n const mode = this.s.labelMode\n // \"100%\" is the widest a percentage gets; captions are their own length.\n const percent = mode === \"percent\" || mode === \"both\" ? 4 : 0\n const category = mode === \"category\" || mode === \"both\" ? (this.s.slices[index]?.category.length ?? 0) : 0\n return Math.max(percent, category)\n }\n\n /**\n * Horizontal room reserved on each side for the leaders and their labels, in\n * px — measured **per side**, from the slices that actually leader out that\n * way. A ring whose labels are all inside reserves nothing and draws bigger.\n *\n * Excludes the ring's own selection-growth allowance, which scales with the\n * radius and so is divided out in {@link outerRadius} instead.\n */\n get labelGutters(): { left: number; right: number } {\n const gutters = { left: BARE_PAD, right: BARE_PAD }\n if (!this.hasLeaderLabels) return gutters\n const glyph = sizeOf(this.s.label.textStyle) * GLYPH_RATIO\n for (const arc of this.arcs) {\n const room = LEADER_LENGTH + LABEL_STUB + TEXT_INSET + this.captionGlyphs(arc.index) * glyph + LABEL_PAD\n const key = sideOf(arc.mid) > 0 ? \"right\" : \"left\"\n gutters[key] = Math.max(gutters[key], room)\n }\n return gutters\n }\n\n /**\n * How far the ring's centre sits from the node's, in px. Zero while the\n * gutters match; when the labels all fall one way it slides the ring into the\n * empty half so the ring-plus-labels group stays centred in the box instead of\n * the ring sitting dead centre with a bald patch beside it.\n */\n get centerX(): number {\n const { left, right } = this.labelGutters\n return (left - right) / 2\n }\n\n /**\n * Radius of the ring's outer edge, fitted to whatever the label gutters leave.\n * A fully selected slice reaches `radius × growFactor`, so the room has to\n * cover that — hence the divisor, which keeps even the grown slice inside the\n * box (and holds the ring the same size whether or not anything is selected).\n */\n get outerRadius(): number {\n const { left, right } = this.labelGutters\n const room = Math.min((this.box.width - left - right) / 2, this.box.height / 2 - this.labelRowHeight - 4)\n return Math.max(0, room / this.growFactor)\n }\n\n /** Radius of the hole in the middle: a fraction of the outer radius, or explicit px. */\n get holeRadius(): number {\n const configured = this.s.ring.holeRadius\n if (configured <= 0) return 0\n const px = configured < 1 ? configured * this.outerRadius : configured\n return Math.min(px, this.outerRadius * 0.95)\n }\n\n /** Radius of the circle every leader elbows on, clear of even a popped-out slice. */\n get elbowRadius(): number {\n return this.outerRadius + this.maxPop + LEADER_LENGTH\n }\n\n /** How far slice `index` is currently pushed out, in `[0, 1]`. */\n popOf(index: number): number {\n return clampUnit(this.s.pops[index] ?? 0)\n }\n\n /** Radius of slice `index`'s outer edge, its selection growth included. */\n anchorRadius(index: number): number {\n return this.outerRadius + this.maxPop * this.popOf(index)\n }\n\n /**\n * Radius an inside label sits at on slice `index`: halfway across the band on a\n * donut, and further out than halfway on a solid pie, where \"halfway\" would\n * crowd the point every wedge converges on. Rides the slice's own pop, so an\n * inside label travels out with the wedge it belongs to.\n */\n bandMidRadius(index: number): number {\n const rim = this.anchorRadius(index)\n const hole = this.holeRadius\n return hole > 0 ? (hole + rim) / 2 : rim * PIE_LABEL_RADIUS\n }\n\n /** The point slice `index`'s inside label is centred on. */\n insideAnchor(index: number): Vector2 {\n const arc = this.arcs.find((a) => a.index === index)\n if (arc === undefined) return { x: this.centerX, y: 0 }\n const point = ringPoint(this.bandMidRadius(index), arc.mid)\n return { x: point.x + this.centerX, y: point.y }\n }\n\n /**\n * How selected the ring is overall, in `[0, 1]` — the most-grown slice. Rides\n * the same tween the pops do, so the dim below arrives with the growth rather\n * than needing an animation of its own.\n */\n get selectionStrength(): number {\n let strongest = 0\n for (let i = 0; i < this.s.slices.length; i++) strongest = Math.max(strongest, this.popOf(i))\n return strongest\n }\n\n /**\n * Opacity slice `index` (and its leader and label) is drawn at: full while\n * nothing is selected, falling toward `dimOpacity` in proportion to how\n * selected the *rest* of the ring is. A slice that's selected itself stays at\n * full — the two factors cancel.\n */\n sliceOpacity(index: number): number {\n const focus = this.selectionStrength\n if (focus <= 0) return 1\n return 1 - (1 - clampUnit(this.s.dimOpacity)) * focus * (1 - this.popOf(index))\n }\n\n /** Slice `index`'s share of the ring as its label reads it, off the live values. */\n percentText(index: number): string {\n const arc = this.arcs.find((a) => a.index === index)\n return formatPercent(arc?.fraction ?? 0)\n }\n\n // ---- Label placement ---------------------------------------------------\n\n /**\n * Where every leader label sits and how its leader gets there. Labels are split\n * into a right and a left column by their slice's bisector, each column is\n * spread so nothing overlaps (and nothing leaves the box), and each leader is\n * then built as wedge edge → elbow → label. The elbow rides the leader circle at\n * the label's *settled* y, which keeps the final run horizontal and the whole\n * polyline outside the ring however far the label was nudged.\n */\n placements(): LabelPlacement[] {\n if (!this.hasLeaderLabels) return []\n const arcs = this.arcs\n if (arcs.length === 0 || this.outerRadius <= 0) return []\n\n const radius = this.elbowRadius\n const rowHeight = this.labelRowHeight\n const top = this.box.height / 2 - rowHeight / 2\n const bottom = -top\n const cx = this.centerX\n\n interface Slot {\n index: number\n side: 1 | -1\n mid: number\n ideal: number\n y: number\n }\n const right: Slot[] = []\n const left: Slot[] = []\n for (const arc of arcs) {\n const side = sideOf(arc.mid)\n const ideal = ringPoint(radius, arc.mid).y\n ;(side > 0 ? right : left).push({ index: arc.index, side, mid: arc.mid, ideal, y: ideal })\n }\n relaxLabels(right, rowHeight + LABEL_GAP, top, bottom)\n relaxLabels(left, rowHeight + LABEL_GAP, top, bottom)\n\n return [...right, ...left].map((slot) => {\n const start = ringPoint(this.anchorRadius(slot.index) + LEADER_LIFTOFF, slot.mid)\n // The elbow sits where the label's y crosses the leader circle. Solving\n // x² + y² = radius² for x keeps it *on* that circle (never inside the\n // ring); a label pushed past the circle's top or bottom falls back to the\n // sideways floor so its leader still reads as pointing outward.\n const onCircle = Math.sqrt(Math.max(0, radius * radius - slot.y * slot.y))\n const elbowX = cx + slot.side * Math.max(onCircle, radius * MIN_ELBOW)\n const endX = cx + slot.side * (radius + LABEL_STUB)\n\n return {\n index: slot.index,\n side: slot.side,\n leader: [\n { x: start.x + cx, y: start.y },\n { x: elbowX, y: slot.y },\n { x: endX, y: slot.y },\n ],\n text: { x: endX + slot.side * TEXT_INSET, y: slot.y },\n }\n })\n }\n\n /** This frame's placement for slice `index`, or `undefined` if it isn't leadered. */\n placementFor(index: number): LabelPlacement | undefined {\n return this.placements().find((placement) => placement.index === index)\n }\n}\n\n/** Which side a leader off bisector `mid` runs to: +1 right, −1 left. */\nfunction sideOf(mid: number): 1 | -1 {\n return Math.sin(mid) >= 0 ? 1 : -1\n}\n\nconst NO_BOX = { width: 0, height: 0 }\n\n/**\n * Each slice's fill, resolved once per paint rather than every frame: the slices\n * are bound to the chart's rows and palette, so a theme tween hands over new\n * paint and the drawing must see it, but a frame that moves nothing must not\n * re-resolve. Keyed by the paint itself, so it is shared and needs no node.\n */\nconst resolvedFills = new WeakMap<object, FillResolved[]>()\n\nfunction resolvedFill(fill: Fill): FillResolved[] {\n if (typeof fill !== \"object\" || fill === null) return fillOps.resolve(fill)\n let resolved = resolvedFills.get(fill)\n if (resolved === undefined) resolvedFills.set(fill, resolved = fillOps.resolve(fill))\n return resolved\n}\n\n/** Each slice's fill, resolved. */\nexport function ringFills(slices: readonly PieSlice[]): FillResolved[][] {\n return slices.map((slice) => resolvedFill(slice.fill))\n}\n\n/**\n * The labels a ring was built with: one per *drawn* slice (a zero-valued slice\n * gets no wedge, so no label either), in whichever of the two forms the chart\n * asked for, then the hole's summary. Both are real Text stacked in a hug\n * vertical flow — the difference is only what they are pinned to and which line\n * leads. The point each is pinned to stays reactive and follows the ring as the\n * box resizes or its slice pops out; only the choice of form, which depends on\n * entries alone, is settled here.\n */\nfunction ringLabels(s: RingState & { readonly labelReveal: number; readonly centerReveal: number }) {\n const blocks: Node2D[] = []\n // A label block's parent is the ring: its box is what the ring was laid out at.\n const geometry = () => new RingGeometry(s, (blocks[0]?.parent as Node2D | null | undefined)?.layoutBounds ?? NO_BOX)\n\n const label = (arc: PieArc): Node2D => {\n // Fades in with the ring's labels, then dims along with its own slice\n // whenever another slice takes the focus.\n const opacity = () => clampUnit(s.labelReveal) * geometry().sliceOpacity(arc.index)\n const wantsCategory = s.labelMode === \"both\" || s.labelMode === \"category\"\n const wantsPercent = s.labelMode === \"both\" || s.labelMode === \"percent\"\n\n if (s.labelPlacement === \"inside\") {\n // The number leads and the caption sits under it: inside a wedge the\n // reader already knows *which* wedge they are looking at, so the magnitude\n // is what the label is for. Both sizes are bound rather than read once —\n // the fitted size derives from the ring's radius, which isn't known until\n // the node has been laid out.\n const inside: Node2D[] = []\n if (wantsPercent) {\n inside.push(new Text({\n ...textOps.styleProps(s.label.insideStyle),\n text: () => geometry().percentText(arc.index),\n fontSize: () => geometry().insideFont,\n }))\n }\n if (wantsCategory) {\n inside.push(new Text({\n ...textOps.styleProps(s.label.insideStyle),\n text: () => s.slices[arc.index]?.category ?? \"\",\n fontSize: () => (s.labelMode === \"category\" ? geometry().insideFont : geometry().insideFont * INSIDE_CAPTION_RATIO),\n }))\n }\n return new Rect({\n flow: \"vertical\",\n width: \"hug\",\n height: \"hug\",\n gap: 0,\n align: \"center\",\n opacity,\n center: () => geometry().insideAnchor(arc.index),\n children: inside,\n })\n }\n\n const side = sideOf(arc.mid)\n const at = () => geometry().placementFor(arc.index)?.text ?? { x: 0, y: 0 }\n const children: Node2D[] = []\n if (wantsCategory) {\n children.push(new Text({\n ...textOps.styleProps(s.label.textStyle),\n text: () => s.slices[arc.index]?.category ?? \"\",\n textAlign: side > 0 ? \"left\" : \"right\",\n }))\n }\n if (wantsPercent) {\n children.push(new Text({\n ...textOps.styleProps(s.label.percentStyle),\n text: () => geometry().percentText(arc.index),\n textAlign: side > 0 ? \"left\" : \"right\",\n }))\n }\n return new Rect({\n flow: \"vertical\",\n width: \"hug\",\n height: \"hug\",\n gap: 2,\n align: side > 0 ? \"centerLeft\" : \"centerRight\",\n opacity,\n // Exactly one of these is set; `undefined` anchors are ignored.\n centerLeft: side > 0 ? at : undefined,\n centerRight: side > 0 ? undefined : at,\n children,\n })\n }\n\n if (s.labelPlacement !== \"none\" && s.labelMode !== \"none\") {\n for (const arc of pieArcs(s.slices, s.ring.startAngle)) blocks.push(label(arc))\n }\n\n // The hole's summary, pinned to the ring's centre so it tracks the sideways\n // shift a one-sided label column puts on the ring.\n if (s.centerLabel !== \"\" || s.centerCaption !== \"\") {\n const children: Node2D[] = []\n if (s.centerLabel !== \"\") {\n children.push(new Text({\n ...textOps.styleProps(s.centerStyle.labelStyle),\n text: s.centerLabel,\n fontSize: () => geometry().centerFont,\n }))\n }\n if (s.centerCaption !== \"\") {\n children.push(new Text({\n ...textOps.styleProps(s.centerStyle.captionStyle),\n text: s.centerCaption,\n fontSize: () =>\n geometry().centerFont * (sizeOf(s.centerStyle.captionStyle, 22) / sizeOf(s.centerStyle.labelStyle, 46)),\n }))\n }\n blocks.push(new Rect({\n flow: \"vertical\",\n width: \"hug\",\n height: \"hug\",\n gap: 2,\n align: \"center\",\n opacity: () => clampUnit(s.centerReveal),\n center: () => ({ x: geometry().centerX, y: 0 }),\n children,\n }))\n }\n return asParts(blocks)\n}\n\n/**\n * The ring itself: one wedge per {@link PieSlice}, sized by its share of the\n * total, swept clockwise from the theme's `startAngle` with a `gap` of clear\n * space between neighbours — a *constant-width* channel, the same at the hole as\n * at the rim (see {@link wedgePath}). A **selected** slice reaches further out\n * while its hole edge stays put — so it reads as that band swelling out of the\n * ring rather than breaking off it — and the rest of the ring dims behind it,\n * leaders and labels included.\n *\n * This is the only part of the chart family that draws a path: the wedges are\n * filled {@link PathBuilder} polygons approximating each arc, and the leaders are\n * stroked polylines — both in the node's centred, y-up space, so neither depends\n * on SVG arc-sweep conventions. The **labels are real {@link Text} nodes**\n * (stacked in a hug vertical flow and pinned by their inner edge), so no\n * glyph-width guesswork decides where a caption starts.\n *\n * ### Label placement\n * Each label sits either **inside** its wedge or **outside** on a leader.\n *\n * An inside label is centred on its slice's band and leads with the number, the\n * caption set small underneath — inside a wedge the reader already knows which\n * slice they're on, so the magnitude is the thing being read. It costs no gutter\n * and no eye round-trip, so a ring labelled that way draws considerably bigger in\n * the same box.\n *\n * A leader label sits outside on the end of a polyline that lifts off its wedge,\n * elbows, and runs horizontally into the text. Labels are split into a left and a\n * right column by which way their slice's bisector points, and each column is\n * de-conflicted independently (see {@link relaxLabels}): a label takes the spot\n * nearest its wedge that still clears its neighbour, and the column is squeezed\n * to fit the node's height rather than spilling out of it. The elbow then rides on\n * a circle just outside the ring **at the label's settled y**, so the run into the\n * text is always horizontal and a nudged label never drags its leader back across\n * the ring.\n *\n * Only the sides that actually carry a leader reserve a gutter, and the ring's\n * centre slides into whatever the other side left over — so a ring whose slices\n * all leader one way doesn't leave a bald patch on the other.\n */\nexport const PieRing = component2d({\n key: \"pieRing\",\n state: {\n slices: fresh<PieSlice[]>(() => []),\n ring: Types.custom<RingConfig>(DEFAULT_PIE_CHART_THEME.ring),\n label: Types.custom<LabelConfig>(DEFAULT_PIE_CHART_THEME.label),\n centerStyle: Types.custom<CenterConfig>(DEFAULT_PIE_CHART_THEME.center),\n labelMode: Types.custom<PieLabelMode>(\"percent\"),\n labelPlacement: Types.custom<PieLabelPlacement>(\"leader\"),\n growth: 1,\n labelReveal: 1,\n pops: fresh<number[]>(() => []),\n dimOpacity: DEFAULT_PIE_CHART_THEME.spotlight.dimOpacity,\n centerLabel: \"\",\n centerCaption: \"\",\n centerReveal: 1,\n },\n // A plain node filled its parent; one made of its labels would hug them.\n defaults: { width: \"fill\", height: \"fill\" },\n children: (state) => ringLabels(state),\n // The ring's paints live nowhere a paint entry would look: one fill per slice,\n // the wedge outline and drop shadow of `ring`, and the leader line's own stroke.\n load: (loader, state) =>\n loadPaints(loader, {\n fills: ringFills(state.slices),\n shadows: [shadowOps.resolve(state.ring.shadow)],\n strokes: [strokeOps.resolve(state.ring.stroke), strokeOps.resolve(state.label.leaderStroke)],\n }),\n commands: {\n /**\n * Tween `growth` `0 → 1`, wiping the wedges in around the ring. No priming\n * to 0 first — the value at `t` is a function of `t`, so a repeat call\n * re-sweeps by definition rather than by having reset something.\n */\n sweep: (timeline) => {\n const ease = frameEase(timeline)\n return timeline.animate((t) => ({ growth: ease(t) }))\n },\n /** Tween `labelReveal` `0 → 1`, fading the leaders and captions up. */\n revealLabels: (timeline) => {\n const ease = frameEase(timeline)\n return timeline.animate((t) => ({ labelReveal: ease(t) }))\n },\n /**\n * Fade the hole's summary up. Deliberately not part of the ring's entrance: a\n * hole label is usually the chart's conclusion, so the scene decides when it\n * lands.\n */\n revealCenter: (timeline, state) => {\n const ease = frameEase(timeline)\n const from = clampUnit(state.centerReveal)\n return timeline.animate((t) => ({ centerReveal: from + (1 - from) * ease(t) }))\n },\n },\n render: (ctx, state) => {\n const g = new RingGeometry(state, ctx.size)\n const rOuter = g.outerRadius\n const arcs = rOuter > 0 ? g.arcs : []\n if (arcs.length > 0) {\n const sweep = clampUnit(state.growth)\n const revealEnd = state.ring.startAngle * (Math.PI / 180) + Math.PI * 2 * sweep\n const hole = g.holeRadius\n const halfGap = Math.max(0, state.ring.gap) / 2\n\n // One shared frame (the whole ring square, grown slices included) pinned onto\n // every wedge path, so `Graphics2D.path()` doesn't re-centre each wedge on its\n // own bbox and collapse them all onto the origin. It stays symmetric about the\n // *node's* origin — so path coordinates land exactly in node space — and is\n // grown by the ring's sideways offset rather than moved with it, which would\n // undo the very shift it has to contain.\n const cx = g.centerX\n const half = rOuter + g.maxPop + 1 + Math.abs(cx)\n const centerBounds: [number, number, number, number] = [-half, -half, half, half]\n // Explicit width/height alongside centerBounds: a wedge path's command list\n // carries no implied extent, so a slice filled with an image or a video needs\n // this to size its decode.\n const span = half * 2\n\n const fills = ringFills(state.slices)\n for (const arc of arcs) {\n // Clip the wedge to the growth-revealed arc; skip it until the sweep\n // reaches it, so the ring draws in as one clockwise wipe.\n const a1 = Math.min(arc.a1, revealEnd)\n if (a1 <= arc.a0) continue\n\n const path = wedgePath(arc.a0, a1, hole, g.anchorRadius(arc.index), halfGap, cx)\n const wedge = new Graphics2D().path(path.toPathState({ centerBounds, width: span, height: span }))\n wedge.shadow(state.ring.shadow)\n wedge.fill(fills[arc.index] ?? [])\n wedge.stroke(state.ring.stroke)\n ctx.draw(wedge.opacity(g.sliceOpacity(arc.index)))\n }\n\n // Leaders. Each polyline gets its own `Graphics2D`: several open polylines\n // chained into one command list are combined into a single surface before the\n // stroke, which closes each contour back on itself and paints the leaders as\n // thin triangles.\n const reveal = clampUnit(state.labelReveal)\n if (reveal > 0.001) {\n for (const placement of g.placements()) {\n ctx.draw(\n new Graphics2D()\n .line({ points: placement.leader, radius: ELBOW_RADIUS })\n .stroke(state.label.leaderStroke)\n .opacity(reveal * g.sliceOpacity(placement.index))\n )\n }\n }\n }\n ctx.children()\n },\n})\n\nexport type PieRing = NodeOf<typeof PieRing>\n"]}
|
|
1
|
+
{"version":3,"file":"pie-ring.js","sourceRoot":"","sources":["../../src/pie-chart/pie-ring.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Graphics2D,\n PathBuilder,\n Rect,\n Text,\n Types,\n clamp,\n component2d,\n fillOps,\n shadowOps,\n strokeOps,\n textOps,\n type Fill,\n type FillResolved,\n type NodeOf,\n // Named so this component's emitted type reaches `Node2D` and its props through the sdk, not core.\n type Node2D,\n type Node2DProps as _Node2DProps,\n type TextStyle,\n type Vector2,\n} from \"@motionscript/sdk\"\n\nimport { asParts, fresh } from \"../kit/entries\"\nimport { frameEase } from \"../kit/motion\"\nimport { loadPaints } from \"../kit/paints\"\nimport { formatPercent } from \"../kit/shared\"\nimport {\n DEFAULT_PIE_CHART_THEME,\n pieArcs,\n relaxLabels,\n ringPoint,\n selectionFade,\n type CenterConfig,\n type LabelConfig,\n type PieArc,\n type PieLabelMode,\n type PieLabelPlacement,\n type PieSlice,\n type RingConfig,\n} from \"./shared\"\n\nconst LABEL_GAP = 12\nconst LABEL_PAD = 14\n/** Rough glyph width as a fraction of the font size, for gutter sizing. */\nconst GLYPH_RATIO = 0.62\nconst LEADER_LIFTOFF = 6\nconst LEADER_LENGTH = 34\nconst LABEL_STUB = 26\nconst TEXT_INSET = 8\n/** Floor on the elbow's distance from the ring's axis, as a fraction of the leader radius, so a label pushed above or below the ring still elbows out sideways. */\nconst MIN_ELBOW = 0.18\nconst ARC_STEPS = 240\nconst ELBOW_RADIUS = 8\nconst BARE_PAD = 2\nconst INSIDE_CAPTION_RATIO = 0.44\n/** Where an inside label sits on a solid pie, as a fraction of the radius: far enough out to clear the point every wedge converges on. */\nconst PIE_LABEL_RADIUS = 0.62\nconst CENTER_LABEL_FIT = 0.78\nconst INSIDE_LABEL_FIT = 0.9\n/** Below this a wedge's bisector counts as axis-aligned and that bound stops binding. */\nconst AXIS_EPSILON = 1e-3\n/** Type size when a theme style leaves it unset or on autofit. */\nconst FALLBACK_SIZE = 26\n\nfunction sizeOf(style: TextStyle, fallback = FALLBACK_SIZE): number {\n const size = style.fontSize\n return typeof size === \"number\" ? size : fallback\n}\n\ninterface LabelPlacement {\n index: number\n /** +1 right, -1 left. */\n side: 1 | -1\n /** Wedge edge, elbow, label. */\n leader: Vector2[]\n /** Where the label's inner edge is pinned. */\n text: Vector2\n}\n\n/**\n * A wedge over `a0`..`a1` (radians clockwise from 12 o'clock) from `rInner` to\n * `rOuter`, centred on `cx`; with `rInner <= 0` it closes through the centre.\n * `halfGap` is half the px gap to the neighbour, converted to an angle per\n * radius (wider near the hole) so the channel keeps one width across the band.\n * The inset is capped at the wedge's half-span so a sliver narrows to nothing\n * rather than turning inside out.\n */\nfunction wedgePath(\n a0: number,\n a1: number,\n rInner: number,\n rOuter: number,\n halfGap: number,\n cx: number\n): PathBuilder {\n const path = new PathBuilder()\n const span = a1 - a0\n const steps = Math.max(\n 2,\n Math.ceil((Math.abs(span) / (Math.PI * 2)) * ARC_STEPS)\n )\n const insetAt = (r: number): number =>\n r <= 0 ? 0 : Math.min(halfGap / r, span / 2.2)\n const arcTo = (r: number, i: number): Vector2 => {\n const inset = insetAt(r)\n const from = a0 + inset\n const to = a1 - inset\n const point = ringPoint(r, from + ((to - from) * i) / steps)\n return { x: point.x + cx, y: point.y }\n }\n\n if (rInner <= 0) {\n // The sides converge on the centre, so only the rim carries the gap.\n path.moveTo(cx, 0)\n for (let i = 0; i <= steps; i++) {\n const p = arcTo(rOuter, i)\n path.lineTo(p.x, p.y)\n }\n path.close()\n return path\n }\n\n for (let i = 0; i <= steps; i++) {\n const p = arcTo(rOuter, i)\n if (i === 0) path.moveTo(p.x, p.y)\n else path.lineTo(p.x, p.y)\n }\n // The inner arc's own wider inset makes each side edge a chord `halfGap` px off the divide at both ends.\n for (let i = steps; i >= 0; i--) {\n const p = arcTo(rInner, i)\n path.lineTo(p.x, p.y)\n }\n path.close()\n return path\n}\n\ninterface RingState {\n readonly slices: PieSlice[]\n readonly ring: RingConfig\n readonly label: LabelConfig\n readonly centerStyle: CenterConfig\n readonly labelMode: PieLabelMode\n readonly labelPlacement: PieLabelPlacement\n readonly pops: readonly number[]\n readonly dimOpacity: number\n readonly centerLabel: string\n readonly centerCaption: string\n}\n\n/** Every radius, gutter and label position for one box, derived afresh wherever read so the drawing and the labels' bound positions cannot disagree. */\nexport class RingGeometry {\n constructor(\n private readonly s: RingState,\n private readonly box: { readonly width: number; readonly height: number }\n ) { }\n\n /** Re-read every frame so a value tween re-cuts them. */\n get arcs(): PieArc[] {\n return pieArcs(this.s.slices, this.s.ring.startAngle)\n }\n\n /** Leader labels are the only thing that costs a gutter. */\n get hasLeaderLabels(): boolean {\n return this.s.labelPlacement === \"leader\" && this.s.labelMode !== \"none\" && this.arcs.length > 0\n }\n\n /**\n * Px a horizontal label centred in `arc`'s band can run before leaving the\n * wedge: bound by the band's thickness near 3 o'clock, by its arc near 12.\n * Measured off the unpopped radius, so a slice growing out of the ring does not\n * resize its own text mid-animation.\n */\n insideRoom(arc: PieArc): number {\n const outer = this.outerRadius\n const hole = this.holeRadius\n const band = hole > 0 ? outer - hole : outer * (1 - PIE_LABEL_RADIUS) * 2\n const mid = hole > 0 ? (hole + outer) / 2 : outer * PIE_LABEL_RADIUS\n const sin = Math.abs(Math.sin(arc.mid))\n const cos = Math.abs(Math.cos(arc.mid))\n const acrossBand = sin > AXIS_EPSILON ? band / sin : Infinity\n const alongArc = cos > AXIS_EPSILON ? ((arc.a1 - arc.a0) * mid) / cos : Infinity\n return Math.max(0, Math.min(acrossBand, alongArc))\n }\n\n /** Widest line, in glyphs at the leading line's size, an inside label runs to. */\n insideGlyphs(arc: PieArc): number {\n const mode = this.s.labelMode\n const category = this.s.slices[arc.index]?.category.length ?? 0\n const percent = mode === \"both\" || mode === \"percent\" ? formatPercent(arc.fraction).length : 0\n // The caption is a fraction of the leading line, unless it is the leading line.\n const caption = mode === \"category\" ? category : mode === \"both\" ? category * INSIDE_CAPTION_RATIO : 0\n return Math.max(1, percent, caption)\n }\n\n /** The theme's `insideStyle.fontSize` shrunk to fit, an upper bound. One size across every inside label (the smallest any needs): mismatched sizes read as a mistake. */\n get insideFont(): number {\n let size = sizeOf(this.s.label.insideStyle, FALLBACK_SIZE * 1.9)\n for (const arc of this.arcs) {\n const fits = (this.insideRoom(arc) * INSIDE_LABEL_FIT) / (this.insideGlyphs(arc) * GLYPH_RATIO)\n size = Math.min(size, fits)\n }\n return Math.max(1, size)\n }\n\n /** The configured size capped to fit across the hole, which derives from the box: a smaller reflow would otherwise push the summary through the ring. */\n get centerFont(): number {\n const { centerStyle, centerLabel, centerCaption } = this.s\n const wanted = sizeOf(centerStyle.labelStyle, 46)\n const hole = this.holeRadius\n if (hole <= 0) return wanted\n const captionRatio = sizeOf(centerStyle.captionStyle, 22) / Math.max(1, wanted)\n // Both lines must clear the hole; the caption is a fraction of this size, so the wider once drawn binds, not the longer.\n const glyphs = Math.max(1, centerLabel.length, centerCaption.length * captionRatio)\n return Math.min(wanted, (hole * 2 * CENTER_LABEL_FIT) / (glyphs * GLYPH_RATIO))\n }\n\n /** Rim radius of a fully selected slice as a multiple of the ring's. */\n get growFactor(): number {\n return Math.max(1, Math.min(1.6, this.s.ring.selectedGrow))\n }\n\n get maxPop(): number {\n return this.outerRadius * (this.growFactor - 1)\n }\n\n /** Height of one leader label block, the unit the columns are spaced by. Inside labels cost no vertical reserve. */\n get labelRowHeight(): number {\n if (!this.hasLeaderLabels) return 0\n const caption = sizeOf(this.s.label.textStyle) * 1.25\n const percent = sizeOf(this.s.label.percentStyle) * 1.25\n if (this.s.labelMode === \"both\") return caption + percent + 2\n return this.s.labelMode === \"category\" ? caption : percent\n }\n\n /** Widest line in glyphs a leader label for slice `index` runs to. */\n captionGlyphs(index: number): number {\n const mode = this.s.labelMode\n // \"100%\" is the widest a percentage gets; captions are their own length.\n const percent = mode === \"percent\" || mode === \"both\" ? 4 : 0\n const category = mode === \"category\" || mode === \"both\" ? (this.s.slices[index]?.category.length ?? 0) : 0\n return Math.max(percent, category)\n }\n\n /** Room reserved per side for leaders and labels, from the slices that leader out that way. Excludes selection growth, which scales with the radius and is divided out in {@link outerRadius}. */\n get labelGutters(): { left: number; right: number } {\n const gutters = { left: BARE_PAD, right: BARE_PAD }\n if (!this.hasLeaderLabels) return gutters\n const glyph = sizeOf(this.s.label.textStyle) * GLYPH_RATIO\n for (const arc of this.arcs) {\n const room = LEADER_LENGTH + LABEL_STUB + TEXT_INSET + this.captionGlyphs(arc.index) * glyph + LABEL_PAD\n const key = sideOf(arc.mid) > 0 ? \"right\" : \"left\"\n gutters[key] = Math.max(gutters[key], room)\n }\n return gutters\n }\n\n /** Slides the ring into the empty half when labels all fall one way, keeping the ring-plus-labels group centred. */\n get centerX(): number {\n const { left, right } = this.labelGutters\n return (left - right) / 2\n }\n\n /** Fitted to what the gutters leave. The divisor keeps a fully selected slice (`radius * growFactor`) inside the box, and the ring one size whether or not anything is selected. */\n get outerRadius(): number {\n const { left, right } = this.labelGutters\n const room = Math.min((this.box.width - left - right) / 2, this.box.height / 2 - this.labelRowHeight - 4)\n return Math.max(0, room / this.growFactor)\n }\n\n get holeRadius(): number {\n const configured = this.s.ring.holeRadius\n if (configured <= 0) return 0\n const px = configured < 1 ? configured * this.outerRadius : configured\n return Math.min(px, this.outerRadius * 0.95)\n }\n\n /** The circle every leader elbows on, clear of even a popped-out slice. */\n get elbowRadius(): number {\n return this.outerRadius + this.maxPop + LEADER_LENGTH\n }\n\n popOf(index: number): number {\n return clamp(this.s.pops[index] ?? 0, 0, 1)\n }\n\n anchorRadius(index: number): number {\n return this.outerRadius + this.maxPop * this.popOf(index)\n }\n\n /** Halfway across the band on a donut, further out on a solid pie, where halfway would crowd the point the wedges converge on. Rides the slice's pop. */\n bandMidRadius(index: number): number {\n const rim = this.anchorRadius(index)\n const hole = this.holeRadius\n return hole > 0 ? (hole + rim) / 2 : rim * PIE_LABEL_RADIUS\n }\n\n insideAnchor(index: number): Vector2 {\n const arc = this.arcs.find((a) => a.index === index)\n if (arc === undefined) return { x: this.centerX, y: 0 }\n const point = ringPoint(this.bandMidRadius(index), arc.mid)\n return { x: point.x + this.centerX, y: point.y }\n }\n\n /** The most-grown slice, so the dim in {@link sliceOpacity} rides the pops' tween. */\n get selectionStrength(): number {\n let strongest = 0\n for (let i = 0; i < this.s.slices.length; i++) strongest = Math.max(strongest, this.popOf(i))\n return strongest\n }\n\n /** Opacity of slice `index` with its leader and label. */\n sliceOpacity(index: number): number {\n return selectionFade(this.selectionStrength, this.s.dimOpacity, this.popOf(index))\n }\n\n percentText(index: number): string {\n const arc = this.arcs.find((a) => a.index === index)\n return formatPercent(arc?.fraction ?? 0)\n }\n\n /** Labels split into left and right columns by their slice's bisector, each spread so nothing overlaps or leaves the box, then a leader built to each. */\n placements(): LabelPlacement[] {\n if (!this.hasLeaderLabels) return []\n const arcs = this.arcs\n if (arcs.length === 0 || this.outerRadius <= 0) return []\n\n const radius = this.elbowRadius\n const rowHeight = this.labelRowHeight\n const top = this.box.height / 2 - rowHeight / 2\n const bottom = -top\n const cx = this.centerX\n\n interface Slot {\n index: number\n side: 1 | -1\n mid: number\n ideal: number\n y: number\n }\n const right: Slot[] = []\n const left: Slot[] = []\n for (const arc of arcs) {\n const side = sideOf(arc.mid)\n const ideal = ringPoint(radius, arc.mid).y\n ;(side > 0 ? right : left).push({ index: arc.index, side, mid: arc.mid, ideal, y: ideal })\n }\n relaxLabels(right, rowHeight + LABEL_GAP, top, bottom)\n relaxLabels(left, rowHeight + LABEL_GAP, top, bottom)\n\n return [...right, ...left].map((slot) => {\n const start = ringPoint(this.anchorRadius(slot.index) + LEADER_LIFTOFF, slot.mid)\n // The elbow sits where the label's y crosses the leader circle. Solving\n // x^2 + y^2 = radius^2 for x keeps it on that circle (never inside the\n // ring); a label pushed past the circle's top or bottom falls back to the\n // sideways floor so its leader still reads as pointing outward.\n const onCircle = Math.sqrt(Math.max(0, radius * radius - slot.y * slot.y))\n const elbowX = cx + slot.side * Math.max(onCircle, radius * MIN_ELBOW)\n const endX = cx + slot.side * (radius + LABEL_STUB)\n\n return {\n index: slot.index,\n side: slot.side,\n leader: [\n { x: start.x + cx, y: start.y },\n { x: elbowX, y: slot.y },\n { x: endX, y: slot.y },\n ],\n text: { x: endX + slot.side * TEXT_INSET, y: slot.y },\n }\n })\n }\n\n placementFor(index: number): LabelPlacement | undefined {\n return this.placements().find((placement) => placement.index === index)\n }\n}\n\nfunction sideOf(mid: number): 1 | -1 {\n return Math.sin(mid) >= 0 ? 1 : -1\n}\n\nconst NO_BOX = { width: 0, height: 0 }\n\n/** Fills resolved once per paint, not per frame: a theme tween hands over new paint, but a frame that moves nothing must not re-resolve. Keyed by the paint, so it needs no node. */\nconst resolvedFills = new WeakMap<object, FillResolved[]>()\n\nfunction resolvedFill(fill: Fill): FillResolved[] {\n if (typeof fill !== \"object\" || fill === null) return fillOps.resolve(fill)\n let resolved = resolvedFills.get(fill)\n if (resolved === undefined) resolvedFills.set(fill, resolved = fillOps.resolve(fill))\n return resolved\n}\n\nexport function ringFills(slices: readonly PieSlice[]): FillResolved[][] {\n return slices.map((slice) => resolvedFill(slice.fill))\n}\n\n/** One label per drawn slice (a zero-valued slice has no wedge), then the hole's summary. Only the choice of form is settled here; the pinned points stay reactive. */\nfunction ringLabels(s: RingState & { readonly labelReveal: number; readonly centerReveal: number }) {\n const blocks: Node2D[] = []\n // A label block's parent is the ring, whose box it was laid out at.\n const geometry = () => new RingGeometry(s, (blocks[0]?.parent as Node2D | null | undefined)?.layoutBounds ?? NO_BOX)\n\n const label = (arc: PieArc): Node2D => {\n const opacity = () => clamp(s.labelReveal, 0, 1) * geometry().sliceOpacity(arc.index)\n const wantsCategory = s.labelMode === \"both\" || s.labelMode === \"category\"\n const wantsPercent = s.labelMode === \"both\" || s.labelMode === \"percent\"\n\n if (s.labelPlacement === \"inside\") {\n // The number leads: inside a wedge the reader knows which slice it is. Sizes are bound because the fitted size derives from a radius unknown until layout.\n const inside: Node2D[] = []\n if (wantsPercent) {\n inside.push(new Text({\n ...textOps.styleProps(s.label.insideStyle),\n text: () => geometry().percentText(arc.index),\n fontSize: () => geometry().insideFont,\n }))\n }\n if (wantsCategory) {\n inside.push(new Text({\n ...textOps.styleProps(s.label.insideStyle),\n text: () => s.slices[arc.index]?.category ?? \"\",\n fontSize: () => (s.labelMode === \"category\" ? geometry().insideFont : geometry().insideFont * INSIDE_CAPTION_RATIO),\n }))\n }\n return new Rect({\n flow: \"vertical\",\n width: \"hug\",\n height: \"hug\",\n gap: 0,\n align: \"center\",\n opacity,\n center: () => geometry().insideAnchor(arc.index),\n children: inside,\n })\n }\n\n const side = sideOf(arc.mid)\n const at = () => geometry().placementFor(arc.index)?.text ?? { x: 0, y: 0 }\n const children: Node2D[] = []\n if (wantsCategory) {\n children.push(new Text({\n ...textOps.styleProps(s.label.textStyle),\n text: () => s.slices[arc.index]?.category ?? \"\",\n textAlign: side > 0 ? \"left\" : \"right\",\n }))\n }\n if (wantsPercent) {\n children.push(new Text({\n ...textOps.styleProps(s.label.percentStyle),\n text: () => geometry().percentText(arc.index),\n textAlign: side > 0 ? \"left\" : \"right\",\n }))\n }\n return new Rect({\n flow: \"vertical\",\n width: \"hug\",\n height: \"hug\",\n gap: 2,\n align: side > 0 ? \"centerLeft\" : \"centerRight\",\n opacity,\n centerLeft: side > 0 ? at : undefined,\n centerRight: side > 0 ? undefined : at,\n children,\n })\n }\n\n if (s.labelPlacement !== \"none\" && s.labelMode !== \"none\") {\n for (const arc of pieArcs(s.slices, s.ring.startAngle)) blocks.push(label(arc))\n }\n\n // Pinned to the ring's centre, so it tracks the sideways shift a one-sided label column causes.\n if (s.centerLabel !== \"\" || s.centerCaption !== \"\") {\n const children: Node2D[] = []\n if (s.centerLabel !== \"\") {\n children.push(new Text({\n ...textOps.styleProps(s.centerStyle.labelStyle),\n text: s.centerLabel,\n fontSize: () => geometry().centerFont,\n }))\n }\n if (s.centerCaption !== \"\") {\n children.push(new Text({\n ...textOps.styleProps(s.centerStyle.captionStyle),\n text: s.centerCaption,\n fontSize: () =>\n geometry().centerFont * (sizeOf(s.centerStyle.captionStyle, 22) / sizeOf(s.centerStyle.labelStyle, 46)),\n }))\n }\n blocks.push(new Rect({\n flow: \"vertical\",\n width: \"hug\",\n height: \"hug\",\n gap: 2,\n align: \"center\",\n opacity: () => clamp(s.centerReveal, 0, 1),\n center: () => ({ x: geometry().centerX, y: 0 }),\n children,\n }))\n }\n return asParts(blocks)\n}\n\n/**\n * The ring: one wedge per {@link PieSlice} swept clockwise from `startAngle`,\n * with a constant-width `gap` (see {@link wedgePath}). A selected slice swells\n * out while its hole edge stays put, and the rest dims, leaders and labels\n * included. The only path-drawing part of the chart family; labels are real\n * {@link Text} nodes, so no glyph-width guesswork places a caption. Only the\n * sides that carry a leader reserve a gutter, and the ring slides into the rest.\n */\nexport const PieRing = component2d({\n key: \"pieRing\",\n state: {\n slices: fresh<PieSlice[]>(() => []),\n ring: Types.custom<RingConfig>(DEFAULT_PIE_CHART_THEME.ring),\n label: Types.custom<LabelConfig>(DEFAULT_PIE_CHART_THEME.label),\n // Not `center`: every node already has one, the anchor its position is measured from.\n centerStyle: Types.custom<CenterConfig>(DEFAULT_PIE_CHART_THEME.center),\n labelMode: Types.custom<PieLabelMode>(\"percent\"),\n labelPlacement: Types.custom<PieLabelPlacement>(\"leader\"),\n /** Sweep `[0, 1]`: the wedges grow clockwise from `startAngle` as it rises. */\n growth: 1,\n /** Fade of leaders and labels, separate from `growth` so they arrive after the sweep. */\n labelReveal: 1,\n /** Per-slice pop `[0, 1]`, owned by the chart so the ring and legend read one signal. */\n pops: fresh<number[]>(() => []),\n /** Opacity everything unselected falls back to while any slice is selected. */\n dimOpacity: DEFAULT_PIE_CHART_THEME.spotlight.dimOpacity,\n /** Empty leaves the hole clear; ignored when there is no hole. */\n centerLabel: \"\",\n centerCaption: \"\",\n /** The hole's summary fade, untouched by the entrance: a scene that wants the conclusion on a later beat sets 0 and calls `revealCenter`. */\n centerReveal: 1,\n },\n // A plain node filled its parent; one made of its labels would hug them.\n defaults: { width: \"fill\", height: \"fill\" },\n children: (state) => ringLabels(state),\n // The paints sit past the paint entries: a fill per slice, the wedge outline and shadow, and the leader stroke.\n load: (loader, state) =>\n loadPaints(loader, {\n fills: ringFills(state.slices),\n shadows: [shadowOps.resolve(state.ring.shadow)],\n strokes: [strokeOps.resolve(state.ring.stroke), strokeOps.resolve(state.label.leaderStroke)],\n }),\n commands: {\n /** Wipe the wedges in around the ring (`growth` 0 to 1). */\n sweep: (timeline) => {\n const ease = frameEase(timeline)\n return timeline.animate((t) => ({ growth: ease(t) }))\n },\n /** Fade the leaders and captions up. */\n revealLabels: (timeline) => {\n const ease = frameEase(timeline)\n return timeline.animate((t) => ({ labelReveal: ease(t) }))\n },\n /** Fade the hole's summary up; not part of the entrance, since it is usually the conclusion. */\n revealCenter: (timeline, state) => {\n const ease = frameEase(timeline)\n const from = clamp(state.centerReveal, 0, 1)\n return timeline.animate((t) => ({ centerReveal: from + (1 - from) * ease(t) }))\n },\n },\n render: (ctx, state) => {\n const g = new RingGeometry(state, ctx.size)\n const rOuter = g.outerRadius\n const arcs = rOuter > 0 ? g.arcs : []\n if (arcs.length > 0) {\n const sweep = clamp(state.growth, 0, 1)\n const revealEnd = state.ring.startAngle * (Math.PI / 180) + Math.PI * 2 * sweep\n const hole = g.holeRadius\n const halfGap = Math.max(0, state.ring.gap) / 2\n\n // One shared frame (the whole ring square, grown slices included) pinned onto\n // every wedge path, so `Graphics2D.path()` doesn't re-centre each wedge on its\n // own bbox and collapse them all onto the origin. It stays symmetric about the\n // node's origin, so path coordinates land exactly in node space, and is grown\n // by the ring's sideways offset rather than moved with it, which would undo\n // the very shift it has to contain.\n const cx = g.centerX\n const half = rOuter + g.maxPop + 1 + Math.abs(cx)\n const centerBounds: [number, number, number, number] = [-half, -half, half, half]\n // Explicit width/height alongside centerBounds: a wedge path's command list\n // carries no implied extent, so a slice filled with an image or a video needs\n // this to size its decode.\n const span = half * 2\n\n const fills = ringFills(state.slices)\n for (const arc of arcs) {\n // Clipped to the revealed arc, so the ring draws in as one clockwise wipe.\n const a1 = Math.min(arc.a1, revealEnd)\n if (a1 <= arc.a0) continue\n\n const path = wedgePath(arc.a0, a1, hole, g.anchorRadius(arc.index), halfGap, cx)\n const wedge = new Graphics2D().path(path.toPathState({ centerBounds, width: span, height: span }))\n wedge.shadow(state.ring.shadow)\n wedge.fill(fills[arc.index] ?? [])\n wedge.stroke(state.ring.stroke)\n ctx.draw(wedge.opacity(g.sliceOpacity(arc.index)))\n }\n\n // One `Graphics2D` per leader: open polylines chained into one command list\n // are combined into a single surface before the stroke, which closes each\n // contour and paints the leaders as thin triangles.\n const reveal = clamp(state.labelReveal, 0, 1)\n if (reveal > 0.001) {\n for (const placement of g.placements()) {\n ctx.draw(\n new Graphics2D()\n .line({ points: placement.leader, radius: ELBOW_RADIUS })\n .stroke(state.label.leaderStroke)\n .opacity(reveal * g.sliceOpacity(placement.index))\n )\n }\n }\n }\n ctx.children()\n },\n})\n\nexport type PieRing = NodeOf<typeof PieRing>\n"]}
|
|
@@ -1,172 +1,96 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Types and pure helpers specific to the {@link PieChart} family: how rows
|
|
3
|
-
* become slices, how slices become arcs on a ring, where the labels around it
|
|
4
|
-
* end up, and the theme all of that is drawn from.
|
|
5
|
-
*
|
|
6
|
-
* The one chart in the family that draws **one mark per row** rather than one
|
|
7
|
-
* per column, which is why almost nothing about its geometry is shared: there is
|
|
8
|
-
* no scale, no axis and no baseline, only a circle divided by share. What it
|
|
9
|
-
* *does* share — the legend, the theme leaf resolvers, the palette, the
|
|
10
|
-
* percentage format — comes from `../kit/shared.ts`.
|
|
11
|
-
*
|
|
12
|
-
* Kept renderer-agnostic (no `Node` imports) so a host's inspector mapping
|
|
13
|
-
* can build a partial {@link PieChartTheme} without
|
|
14
|
-
* pulling the node classes in.
|
|
15
|
-
*/
|
|
16
1
|
import { type DataRecord, type Fill, type Shadow, type Stroke, type TextStyle, type Vector2 } from "@motionscript/sdk";
|
|
17
2
|
import { type LegendConfig, type LegendTheme } from "../kit/shared.js";
|
|
18
|
-
/**
|
|
19
|
-
* One **resolved** slice of a {@link PieChart}: its caption, its magnitude, and
|
|
20
|
-
* the paint its wedge and legend swatch take.
|
|
21
|
-
*
|
|
22
|
-
* This is what the ring and the legend consume, not what a scene authors: the
|
|
23
|
-
* chart takes tabular `data` plus two field names and resolves it into these, so
|
|
24
|
-
* the parts stay unaware of where a slice's caption, magnitude and paint came
|
|
25
|
-
* from.
|
|
26
|
-
*/
|
|
3
|
+
/** One resolved slice, which the ring and legend consume; the chart resolves it from `data` and two field names. */
|
|
27
4
|
export interface PieSlice {
|
|
28
|
-
/**
|
|
5
|
+
/** Label and legend caption. */
|
|
29
6
|
category: string;
|
|
30
|
-
/**
|
|
7
|
+
/** The wedge covers `value / (sum of all values)`. */
|
|
31
8
|
value: number;
|
|
32
9
|
/** Wedge and swatch paint. */
|
|
33
10
|
fill: Fill;
|
|
34
11
|
}
|
|
35
12
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* Paint comes from the palette rather than from the rows because a pie draws one
|
|
41
|
-
* mark per *row* — unlike the line and bar charts, where a colour belongs to a
|
|
42
|
-
* series (a whole column) and rides on the series entry instead. Keeping it out
|
|
43
|
-
* of the rows is what lets a pie be fed straight from a CSV of plain numbers.
|
|
13
|
+
* One slice per row, painted from `palette` by row order (cycling). Paint comes
|
|
14
|
+
* from the palette, not the rows, because a pie's mark is a row where a line's
|
|
15
|
+
* colour belongs to a column; that lets a pie be fed a CSV of plain numbers.
|
|
44
16
|
*/
|
|
45
17
|
export declare function resolvePieSlices(data: DataRecord[], category: string, value: string, palette: Fill[]): PieSlice[];
|
|
46
18
|
/** What a {@link PieChart}'s labels say. */
|
|
47
19
|
export type PieLabelMode =
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
* label reads the percentage big over a small category caption — inside a
|
|
52
|
-
* wedge the reader already knows which slice they're on, so the magnitude is
|
|
53
|
-
* the thing being read.
|
|
54
|
-
*/
|
|
55
|
-
"both"
|
|
56
|
-
/** The category only. */
|
|
57
|
-
| "category"
|
|
58
|
-
/** The percentage only — the pick when a legend already names the categories. */
|
|
59
|
-
| "percent"
|
|
60
|
-
/** No labels and no leader lines at all. */
|
|
20
|
+
/** Two lines, whose order flips with placement: a leader label reads category over percentage, an inside label reads the percentage big over a small category. */
|
|
21
|
+
"both" | "category" | "percent"
|
|
22
|
+
/** No labels and no leader lines. */
|
|
61
23
|
| "none";
|
|
62
|
-
/**
|
|
63
|
-
* Where a slice's label sits.
|
|
64
|
-
*
|
|
65
|
-
* `"inside"` drops the leader line entirely and centres the label in the wedge's
|
|
66
|
-
* own band, which costs no gutter — so the ring draws bigger — and costs the eye
|
|
67
|
-
* no round trip. `"leader"` is the classic treatment, and what a sliver too
|
|
68
|
-
* narrow to hold text needs.
|
|
69
|
-
*/
|
|
24
|
+
/** `"inside"` centres the label in the wedge's band with no leader or gutter, so the ring draws bigger; `"leader"` is what a sliver too narrow for text needs. */
|
|
70
25
|
export type PieLabelPlacement = "inside" | "leader" | "none";
|
|
71
|
-
/** Degrees → radians. */
|
|
72
26
|
export declare const DEG: number;
|
|
27
|
+
/**
|
|
28
|
+
* Opacity of a slice under the selection: 1 while nothing is out (`focus` is the
|
|
29
|
+
* most-grown pop) and for the selected slice itself, falling toward `dimOpacity`
|
|
30
|
+
* for the rest as the selection grows.
|
|
31
|
+
*/
|
|
32
|
+
export declare function selectionFade(focus: number, dimOpacity: number, pop: number): number;
|
|
73
33
|
/** A slice's plotted value: negatives and non-finite values count as 0. */
|
|
74
34
|
export declare function sliceValue(slice: PieSlice): number;
|
|
75
|
-
/** Sum of every slice's plotted value
|
|
35
|
+
/** Sum of every slice's plotted value, the denominator of every share. */
|
|
76
36
|
export declare function sliceTotal(slices: PieSlice[]): number;
|
|
77
|
-
/**
|
|
78
|
-
* The point at radius `r` and angle `a` on a ring centred on the origin, in the
|
|
79
|
-
* node's centred, **y-up** space. Angles run **clockwise from 12 o'clock**:
|
|
80
|
-
* `a = 0` points straight up (+y), and increasing `a` sweeps toward +x then −y.
|
|
81
|
-
*/
|
|
37
|
+
/** The point at radius `r`, angle `a` on a ring about the origin in centred y-up space. Angles run clockwise from 12 o'clock. */
|
|
82
38
|
export declare function ringPoint(r: number, a: number): Vector2;
|
|
83
39
|
/** One slice's resolved angular span on the ring. */
|
|
84
40
|
export interface PieArc {
|
|
85
41
|
/** Index of the slice in the source list. */
|
|
86
42
|
index: number;
|
|
87
|
-
/**
|
|
43
|
+
/** Radians clockwise from 12 o'clock. */
|
|
88
44
|
a0: number;
|
|
89
|
-
/** End angle, radians clockwise from 12 o'clock. */
|
|
90
45
|
a1: number;
|
|
91
|
-
/**
|
|
46
|
+
/** Where the slice's label and pop-out point. */
|
|
92
47
|
mid: number;
|
|
93
|
-
/**
|
|
48
|
+
/** Share of the total, `[0, 1]`. */
|
|
94
49
|
fraction: number;
|
|
95
50
|
}
|
|
96
51
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* Arcs are the *undivided* shares — the gap between neighbours is not carved out
|
|
103
|
-
* here, because a fixed angular gap reads as a wedge: wide at the rim, pinched
|
|
104
|
-
* shut at the hole. It's applied when the wedge is drawn instead, as a
|
|
105
|
-
* constant-width inset off both ends of every arc, so a slice still covers its
|
|
106
|
-
* true percentage of the circle.
|
|
52
|
+
* One arc per positive slice, walking clockwise from `startDegrees` and abutting.
|
|
53
|
+
* Arcs are the undivided shares: a fixed angular gap would pinch shut at the
|
|
54
|
+
* hole, so the gap is applied when the wedge is drawn, as a constant-width inset
|
|
55
|
+
* off both ends.
|
|
107
56
|
*/
|
|
108
57
|
export declare function pieArcs(slices: PieSlice[], startDegrees: number): PieArc[];
|
|
109
|
-
|
|
110
|
-
export interface LabelSlot {
|
|
58
|
+
interface LabelSlot {
|
|
111
59
|
/** Where the label would sit if nothing else were in the way. */
|
|
112
60
|
ideal: number;
|
|
113
|
-
/**
|
|
61
|
+
/** Written by {@link relaxLabels}. */
|
|
114
62
|
y: number;
|
|
115
63
|
}
|
|
116
64
|
/**
|
|
117
|
-
* Spread one column of labels so
|
|
118
|
-
* `
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
* `minGap`; if that pushes the tail past `bottom`, a reverse pass lifts it back
|
|
123
|
-
* up. When there are more labels than the column can hold, the reverse pass wins
|
|
124
|
-
* and the crowding is shared evenly rather than dumped off the bottom edge.
|
|
125
|
-
*
|
|
126
|
-
* Mutates each slot's `y` and returns `slots` re-ordered top-to-bottom.
|
|
65
|
+
* Spread one column of labels so none overlap, each near its `ideal` y and all
|
|
66
|
+
* inside `[bottom, top]`. A top-down pass clears each label from the one above
|
|
67
|
+
* by `minGap`; a reverse pass lifts a tail pushed past `bottom`. When the column
|
|
68
|
+
* cannot hold them all, the reverse pass wins and the crowding is shared evenly.
|
|
69
|
+
* Mutates each `y` and returns `slots` ordered top to bottom.
|
|
127
70
|
*/
|
|
128
71
|
export declare function relaxLabels<T extends LabelSlot>(slots: T[], minGap: number, top: number, bottom: number): T[];
|
|
129
|
-
/** The ring's geometry and paint
|
|
72
|
+
/** The ring's geometry and paint: everything about the wedges but their colour. */
|
|
130
73
|
export interface RingConfig {
|
|
131
|
-
/**
|
|
132
|
-
* Width of the channel between adjacent slices, in px, held constant all the
|
|
133
|
-
* way across the band — the same clearance at the hole as at the rim. (An
|
|
134
|
-
* angular gap would splay open toward the rim instead.)
|
|
135
|
-
*/
|
|
74
|
+
/** Channel between adjacent slices in px, constant across the band (an angular gap would splay open toward the rim). */
|
|
136
75
|
gap: number;
|
|
137
|
-
/**
|
|
138
|
-
* Radius of the hole punched through the middle. Below 1 it reads as a
|
|
139
|
-
* fraction of the ring's outer radius (`0.6` leaves a band 40% of the radius
|
|
140
|
-
* thick); 1 and up as an explicit pixel radius; `0` fills the middle in,
|
|
141
|
-
* drawing solid pie wedges.
|
|
142
|
-
*/
|
|
76
|
+
/** Below 1 a fraction of the outer radius (`0.6` leaves a band 40% thick); 1 and up a pixel radius; `0` draws solid wedges. */
|
|
143
77
|
holeRadius: number;
|
|
144
|
-
/**
|
|
78
|
+
/** Degrees clockwise from 12 o'clock where the first slice begins. */
|
|
145
79
|
startAngle: number;
|
|
146
|
-
/**
|
|
147
|
-
* How far out a selected slice's rim reaches, as a **multiple of the ring's
|
|
148
|
-
* outer radius**. Being relative, the emphasis scales with the chart instead
|
|
149
|
-
* of shrinking on a big one and swamping a small one. Clamped to `[1, 1.6]`.
|
|
150
|
-
*/
|
|
80
|
+
/** How far a selected slice's rim reaches, as a multiple of the outer radius so the emphasis scales with the chart. Clamped to `[1, 1.6]`. */
|
|
151
81
|
selectedGrow: number;
|
|
152
|
-
/** Optional outline on every wedge. */
|
|
153
82
|
stroke: Stroke;
|
|
154
|
-
/** Optional drop shadow on every wedge. */
|
|
155
83
|
shadow: Shadow;
|
|
156
84
|
}
|
|
157
85
|
/** How the ring's labels are set, and the leader lines that point at them. */
|
|
158
86
|
export interface LabelConfig {
|
|
159
|
-
/** The category caption
|
|
87
|
+
/** The category caption. */
|
|
160
88
|
textStyle: TextStyle;
|
|
161
|
-
/** The percentage
|
|
89
|
+
/** The percentage. */
|
|
162
90
|
percentStyle: TextStyle;
|
|
163
|
-
/**
|
|
164
|
-
* Ink for a label set **inside** its wedge, both lines. Separate because an
|
|
165
|
-
* inside label sits on the wedge's own paint rather than on the background, so
|
|
166
|
-
* it usually wants the opposite end of the value range from everything else.
|
|
167
|
-
*/
|
|
91
|
+
/** Both lines of a label inside its wedge: it sits on the wedge's paint, so it usually wants the opposite end of the value range from everything else. */
|
|
168
92
|
insideStyle: TextStyle;
|
|
169
|
-
/**
|
|
93
|
+
/** Runs from a wedge out to its label. */
|
|
170
94
|
leaderStroke: Stroke;
|
|
171
95
|
}
|
|
172
96
|
/** The summary set in the ring's hole. */
|
|
@@ -187,7 +111,7 @@ export interface PieChartConfig {
|
|
|
187
111
|
dimOpacity: number;
|
|
188
112
|
};
|
|
189
113
|
}
|
|
190
|
-
/**
|
|
114
|
+
/** The author's partial theme, deep-merged onto {@link DEFAULT_PIE_CHART_THEME}. */
|
|
191
115
|
export type PieChartTheme = {
|
|
192
116
|
sliceFills?: Fill[];
|
|
193
117
|
ring?: Partial<RingConfig>;
|
|
@@ -196,21 +120,11 @@ export type PieChartTheme = {
|
|
|
196
120
|
legend?: LegendTheme;
|
|
197
121
|
spotlight?: Partial<PieChartConfig["spotlight"]>;
|
|
198
122
|
};
|
|
199
|
-
/**
|
|
200
|
-
* Opacity the other slices fade to under a selection. Fainter than the line and
|
|
201
|
-
* bar charts' `SPOTLIGHT_DIM`: a ring's slices touch, so at that a selected
|
|
202
|
-
* slice barely separates from its neighbours.
|
|
203
|
-
*/
|
|
123
|
+
/** Fainter than `SPOTLIGHT_DIM`: a ring's slices touch, so at that a selected slice barely separates. */
|
|
204
124
|
export declare const PIE_SPOTLIGHT_DIM = 0.1;
|
|
205
|
-
/** The pie chart's out-of-the-box look. */
|
|
206
125
|
export declare const DEFAULT_PIE_CHART_THEME: PieChartConfig;
|
|
207
|
-
/**
|
|
208
|
-
* {@link PieChart}'s `theme` property mapper: merges the author's partial
|
|
209
|
-
* {@link PieChartTheme} onto `previous` (falling back to
|
|
210
|
-
* {@link DEFAULT_PIE_CHART_THEME} on first resolution), fully resolving every
|
|
211
|
-
* leaf so the tween below always has resolved data to interpolate.
|
|
212
|
-
*/
|
|
126
|
+
/** The `theme` entry's resolve: merges a partial {@link PieChartTheme} onto `previous` (first resolution: the default). */
|
|
213
127
|
export declare function resolvePieChartTheme(theme: PieChartTheme | undefined, previous?: PieChartConfig): PieChartConfig;
|
|
214
|
-
/** {@link PieChart}'s `theme` property tween — leaf by leaf. */
|
|
215
128
|
export declare function lerpPieChartTheme(from: PieChartConfig, to: PieChartConfig, t: number): PieChartConfig;
|
|
129
|
+
export {};
|
|
216
130
|
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/pie-chart/shared.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/pie-chart/shared.ts"],"names":[],"mappings":"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"}
|