@motionscript/charts 0.1.1-alpha.0 → 0.1.1-alpha.1

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.
Files changed (207) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +98 -28
  3. package/dist/bar-chart/bar-chart.d.ts +233 -39
  4. package/dist/bar-chart/bar-chart.d.ts.map +1 -1
  5. package/dist/bar-chart/bar-chart.js +215 -171
  6. package/dist/bar-chart/bar-chart.js.map +1 -1
  7. package/dist/bar-chart/category-axis.d.ts +12 -7
  8. package/dist/bar-chart/category-axis.d.ts.map +1 -1
  9. package/dist/bar-chart/category-axis.js +56 -42
  10. package/dist/bar-chart/category-axis.js.map +1 -1
  11. package/dist/bar-chart/chart-bars.d.ts +52 -52
  12. package/dist/bar-chart/chart-bars.d.ts.map +1 -1
  13. package/dist/bar-chart/chart-bars.js +80 -89
  14. package/dist/bar-chart/chart-bars.js.map +1 -1
  15. package/dist/bar-chart/index.d.ts +4 -4
  16. package/dist/bar-chart/index.d.ts.map +1 -1
  17. package/dist/bar-chart/index.js +2 -2
  18. package/dist/bar-chart/index.js.map +1 -1
  19. package/dist/bar-chart/shared.d.ts +36 -65
  20. package/dist/bar-chart/shared.d.ts.map +1 -1
  21. package/dist/bar-chart/shared.js +68 -117
  22. package/dist/bar-chart/shared.js.map +1 -1
  23. package/dist/browser/chunks/chunk-R3Q5EE6E.js +2 -0
  24. package/dist/browser/chunks/chunk-R3Q5EE6E.js.map +7 -0
  25. package/dist/browser/index.js +1 -1
  26. package/dist/browser/index.js.map +4 -4
  27. package/dist/browser/kit.js +1 -1
  28. package/dist/browser/manifest.json +1 -1
  29. package/dist/engine.d.ts +5 -2
  30. package/dist/engine.d.ts.map +1 -1
  31. package/dist/engine.js +5 -2
  32. package/dist/engine.js.map +1 -1
  33. package/dist/index.d.ts +2 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +2 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/kit/cartesian.d.ts +49 -15
  38. package/dist/kit/cartesian.d.ts.map +1 -1
  39. package/dist/kit/cartesian.js +79 -29
  40. package/dist/kit/cartesian.js.map +1 -1
  41. package/dist/kit/chart-canvas.d.ts +32 -24
  42. package/dist/kit/chart-canvas.d.ts.map +1 -1
  43. package/dist/kit/chart-canvas.js +52 -46
  44. package/dist/kit/chart-canvas.js.map +1 -1
  45. package/dist/kit/chart-legend.d.ts +8 -4
  46. package/dist/kit/chart-legend.d.ts.map +1 -1
  47. package/dist/kit/chart-legend.js +30 -20
  48. package/dist/kit/chart-legend.js.map +1 -1
  49. package/dist/{line-chart → kit}/horizontal-axis.d.ts +31 -6
  50. package/dist/kit/horizontal-axis.d.ts.map +1 -0
  51. package/dist/{line-chart → kit}/horizontal-axis.js +23 -24
  52. package/dist/kit/horizontal-axis.js.map +1 -0
  53. package/dist/kit/motion.d.ts +5 -0
  54. package/dist/kit/motion.d.ts.map +1 -1
  55. package/dist/kit/motion.js +8 -0
  56. package/dist/kit/motion.js.map +1 -1
  57. package/dist/{pie-chart → kit}/pie-legend.d.ts +3 -3
  58. package/dist/kit/pie-legend.d.ts.map +1 -0
  59. package/dist/{pie-chart → kit}/pie-legend.js +11 -10
  60. package/dist/kit/pie-legend.js.map +1 -0
  61. package/dist/kit/polar.d.ts +31 -0
  62. package/dist/kit/polar.d.ts.map +1 -0
  63. package/dist/kit/polar.js +33 -0
  64. package/dist/kit/polar.js.map +1 -0
  65. package/dist/kit/shared.d.ts +11 -50
  66. package/dist/kit/shared.d.ts.map +1 -1
  67. package/dist/kit/shared.js +58 -141
  68. package/dist/kit/shared.js.map +1 -1
  69. package/dist/kit/style.d.ts +254 -0
  70. package/dist/kit/style.d.ts.map +1 -0
  71. package/dist/kit/style.js +197 -0
  72. package/dist/kit/style.js.map +1 -0
  73. package/dist/kit/vertical-axis.d.ts +22 -2
  74. package/dist/kit/vertical-axis.d.ts.map +1 -1
  75. package/dist/kit/vertical-axis.js +56 -43
  76. package/dist/kit/vertical-axis.js.map +1 -1
  77. package/dist/line-chart/chart-line.d.ts +95 -3
  78. package/dist/line-chart/chart-line.d.ts.map +1 -1
  79. package/dist/line-chart/chart-line.js +165 -53
  80. package/dist/line-chart/chart-line.js.map +1 -1
  81. package/dist/line-chart/chart-region.d.ts +1 -1
  82. package/dist/line-chart/chart-region.d.ts.map +1 -1
  83. package/dist/line-chart/chart-region.js +7 -8
  84. package/dist/line-chart/chart-region.js.map +1 -1
  85. package/dist/line-chart/index.d.ts +5 -6
  86. package/dist/line-chart/index.d.ts.map +1 -1
  87. package/dist/line-chart/index.js +3 -4
  88. package/dist/line-chart/index.js.map +1 -1
  89. package/dist/line-chart/line-chart.d.ts +257 -18
  90. package/dist/line-chart/line-chart.d.ts.map +1 -1
  91. package/dist/line-chart/line-chart.js +282 -134
  92. package/dist/line-chart/line-chart.js.map +1 -1
  93. package/dist/line-chart/shared.d.ts +51 -34
  94. package/dist/line-chart/shared.d.ts.map +1 -1
  95. package/dist/line-chart/shared.js +175 -83
  96. package/dist/line-chart/shared.js.map +1 -1
  97. package/dist/line-chart/x-scale.d.ts +2 -0
  98. package/dist/line-chart/x-scale.d.ts.map +1 -1
  99. package/dist/line-chart/x-scale.js +15 -0
  100. package/dist/line-chart/x-scale.js.map +1 -1
  101. package/dist/nodes.d.ts +3 -1
  102. package/dist/nodes.d.ts.map +1 -1
  103. package/dist/nodes.js +9 -1
  104. package/dist/nodes.js.map +1 -1
  105. package/dist/pie-chart/index.d.ts +2 -3
  106. package/dist/pie-chart/index.d.ts.map +1 -1
  107. package/dist/pie-chart/index.js +1 -2
  108. package/dist/pie-chart/index.js.map +1 -1
  109. package/dist/pie-chart/pie-chart.d.ts +114 -18
  110. package/dist/pie-chart/pie-chart.d.ts.map +1 -1
  111. package/dist/pie-chart/pie-chart.js +37 -24
  112. package/dist/pie-chart/pie-chart.js.map +1 -1
  113. package/dist/pie-chart/pie-ring.d.ts +16 -5
  114. package/dist/pie-chart/pie-ring.d.ts.map +1 -1
  115. package/dist/pie-chart/pie-ring.js +89 -55
  116. package/dist/pie-chart/pie-ring.js.map +1 -1
  117. package/dist/pie-chart/shared.d.ts +53 -61
  118. package/dist/pie-chart/shared.d.ts.map +1 -1
  119. package/dist/pie-chart/shared.js +41 -121
  120. package/dist/pie-chart/shared.js.map +1 -1
  121. package/dist/radar-chart/index.d.ts +5 -0
  122. package/dist/radar-chart/index.d.ts.map +1 -0
  123. package/dist/radar-chart/index.js +5 -0
  124. package/dist/radar-chart/index.js.map +1 -0
  125. package/dist/radar-chart/radar-chart.d.ts +218 -0
  126. package/dist/radar-chart/radar-chart.d.ts.map +1 -0
  127. package/dist/radar-chart/radar-chart.js +224 -0
  128. package/dist/radar-chart/radar-chart.js.map +1 -0
  129. package/dist/radar-chart/radar-grid.d.ts +43 -0
  130. package/dist/radar-chart/radar-grid.d.ts.map +1 -0
  131. package/dist/radar-chart/radar-grid.js +61 -0
  132. package/dist/radar-chart/radar-grid.js.map +1 -0
  133. package/dist/radar-chart/radar-series.d.ts +59 -0
  134. package/dist/radar-chart/radar-series.d.ts.map +1 -0
  135. package/dist/radar-chart/radar-series.js +71 -0
  136. package/dist/radar-chart/radar-series.js.map +1 -0
  137. package/dist/radar-chart/shared.d.ts +73 -0
  138. package/dist/radar-chart/shared.d.ts.map +1 -0
  139. package/dist/radar-chart/shared.js +123 -0
  140. package/dist/radar-chart/shared.js.map +1 -0
  141. package/dist/radial-chart/index.d.ts +6 -0
  142. package/dist/radial-chart/index.d.ts.map +1 -0
  143. package/dist/radial-chart/index.js +4 -0
  144. package/dist/radial-chart/index.js.map +1 -0
  145. package/dist/radial-chart/radial-chart.d.ts +216 -0
  146. package/dist/radial-chart/radial-chart.d.ts.map +1 -0
  147. package/dist/radial-chart/radial-chart.js +174 -0
  148. package/dist/radial-chart/radial-chart.js.map +1 -0
  149. package/dist/radial-chart/radial-rings.d.ts +121 -0
  150. package/dist/radial-chart/radial-rings.d.ts.map +1 -0
  151. package/dist/radial-chart/radial-rings.js +273 -0
  152. package/dist/radial-chart/radial-rings.js.map +1 -0
  153. package/dist/radial-chart/shared.d.ts +73 -0
  154. package/dist/radial-chart/shared.d.ts.map +1 -0
  155. package/dist/radial-chart/shared.js +79 -0
  156. package/dist/radial-chart/shared.js.map +1 -0
  157. package/package.json +4 -4
  158. package/registry.json +21 -6
  159. package/src/bar-chart/bar-chart.ts +252 -179
  160. package/src/bar-chart/category-axis.ts +46 -40
  161. package/src/bar-chart/chart-bars.ts +97 -117
  162. package/src/bar-chart/index.ts +7 -10
  163. package/src/bar-chart/shared.ts +78 -238
  164. package/src/engine.ts +5 -2
  165. package/src/index.ts +2 -0
  166. package/src/kit/cartesian.ts +118 -40
  167. package/src/kit/chart-canvas.ts +49 -54
  168. package/src/kit/chart-legend.ts +28 -20
  169. package/src/kit/horizontal-axis.ts +114 -0
  170. package/src/kit/motion.ts +7 -0
  171. package/src/{pie-chart → kit}/pie-legend.ts +12 -11
  172. package/src/kit/polar.ts +54 -0
  173. package/src/kit/shared.ts +55 -277
  174. package/src/kit/style.ts +257 -0
  175. package/src/kit/vertical-axis.ts +67 -48
  176. package/src/line-chart/chart-line.ts +176 -54
  177. package/src/line-chart/chart-region.ts +6 -10
  178. package/src/line-chart/index.ts +14 -10
  179. package/src/line-chart/line-chart.ts +347 -151
  180. package/src/line-chart/shared.ts +193 -174
  181. package/src/line-chart/x-scale.ts +13 -0
  182. package/src/nodes.ts +9 -1
  183. package/src/pie-chart/index.ts +2 -23
  184. package/src/pie-chart/pie-chart.ts +52 -35
  185. package/src/pie-chart/pie-ring.ts +92 -71
  186. package/src/pie-chart/shared.ts +68 -266
  187. package/src/radar-chart/index.ts +4 -0
  188. package/src/radar-chart/radar-chart.ts +287 -0
  189. package/src/radar-chart/radar-grid.ts +78 -0
  190. package/src/radar-chart/radar-series.ts +88 -0
  191. package/src/radar-chart/shared.ts +146 -0
  192. package/src/radial-chart/index.ts +5 -0
  193. package/src/radial-chart/radial-chart.ts +210 -0
  194. package/src/radial-chart/radial-rings.ts +328 -0
  195. package/src/radial-chart/shared.ts +114 -0
  196. package/dist/browser/chunks/chunk-4SMRCU24.js +0 -2
  197. package/dist/browser/chunks/chunk-4SMRCU24.js.map +0 -7
  198. package/dist/kit/chart-border.d.ts +0 -18
  199. package/dist/kit/chart-border.d.ts.map +0 -1
  200. package/dist/kit/chart-border.js +0 -23
  201. package/dist/kit/chart-border.js.map +0 -1
  202. package/dist/line-chart/horizontal-axis.d.ts.map +0 -1
  203. package/dist/line-chart/horizontal-axis.js.map +0 -1
  204. package/dist/pie-chart/pie-legend.d.ts.map +0 -1
  205. package/dist/pie-chart/pie-legend.js.map +0 -1
  206. package/src/kit/chart-border.ts +0 -36
  207. package/src/line-chart/horizontal-axis.ts +0 -122
@@ -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 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
+ {"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 strokeOps,\n textOps,\n type Fill,\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 { resolvedFill, ringFills } from \"../kit/polar\"\nimport { formatPercent } from \"../kit/shared\"\n\nimport {\n PIE_SPOTLIGHT_DIM,\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 DEFAULT_RING: RingConfig = { gap: 3, holeRadius: 0, startAngle: 0, selectedGrow: 1.08, cornerRadius: 4 }\nconst DEFAULT_LABEL: LabelConfig = {\n textStyle: { fontSize: 28, fontWeight: 500, textAlign: \"center\", fill: \"#a1a1aa\" },\n percentStyle: { fontSize: 28, fontWeight: 700, textAlign: \"center\", fill: \"#f4f4f5\" },\n insideStyle: { fontSize: 52, fontWeight: 700, textAlign: \"center\", fill: \"#111113\" },\n leaderStroke: { weight: 2, fill: \"#a1a1aa\" },\n}\nconst DEFAULT_CENTER: CenterConfig = {\n labelStyle: { fontSize: 50, fontWeight: 800, textAlign: \"center\", fill: \"#f4f4f5\" },\n captionStyle: { fontSize: 22, fontWeight: 500, textAlign: \"center\", fill: \"#a1a1aa\" },\n}\n\n/** Black or white, whichever reads better on a solid `fill`; black for any other paint. */\nexport function onFill(fill: Fill): string {\n const layers = resolvedFill(fill)\n const solid = layers.find((layer) => layer.type === \"solid\") as { color: [number, number, number, number] } | undefined\n if (!solid) return \"#111113\"\n const [r, g, b] = solid.color\n return 0.2126 * r + 0.7152 * g + 0.0722 * b > 0.45 ? \"#111113\" : \"#ffffff\"\n}\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 at an apex pulled\n * off the centre by the gap. `halfGap` is half the px gap to the neighbour,\n * converted to an angle per radius so the channel keeps one width across the\n * band; the inset is capped at the wedge's half-span so a sliver narrows to\n * nothing rather than turning inside out. Corners are rounded by `corner` px\n * (clamped to what the wedge can hold), except a pie's apex.\n */\nexport function wedgePath(a0: number, a1: number, rInner: number, rOuter: number, halfGap: number, corner: number, cx: number): PathBuilder {\n const path = new PathBuilder()\n const span = a1 - a0\n const steps = Math.max(2, Math.ceil((Math.abs(span) / (Math.PI * 2)) * ARC_STEPS))\n const insetAt = (r: number): number => (r <= 0 ? 0 : Math.min(halfGap / r, span / 2.2))\n const at = (r: number, a: number): Vector2 => {\n const p = ringPoint(r, a)\n return { x: p.x + cx, y: p.y }\n }\n const hasHole = rInner > 0\n const oa0 = a0 + insetAt(rOuter)\n const oa1 = a1 - insetAt(rOuter)\n const ia0 = a0 + insetAt(rInner)\n const ia1 = a1 - insetAt(rInner)\n const O0 = at(rOuter, oa0)\n const O1 = at(rOuter, oa1)\n const half = Math.max(1e-3, Math.min(span / 2, Math.PI / 2))\n const apex = at(halfGap > 0 ? Math.min(halfGap / Math.sin(half), rOuter * 0.8) : 0, (a0 + a1) / 2)\n const I0 = hasHole ? at(rInner, ia0) : apex\n const I1 = hasHole ? at(rInner, ia1) : apex\n\n const band = hasHole ? rOuter - rInner : rOuter\n const rho = Math.max(0, Math.min(corner, band / 2.2, ((oa1 - oa0) * rOuter) / 2.2, hasHole ? ((ia1 - ia0) * rInner) / 2.2 : Infinity))\n const rounded = rho >= 0.5\n const toward = (from: Vector2, to: Vector2, d: number): Vector2 => {\n const len = Math.hypot(to.x - from.x, to.y - from.y) || 1\n const k = Math.min(0.5, d / len)\n return { x: from.x + (to.x - from.x) * k, y: from.y + (to.y - from.y) * k }\n }\n const dOuter = rounded ? rho / Math.max(1, rOuter) : 0\n const dInner = rounded && hasHole ? rho / rInner : 0\n\n const arc = (r: number, from: number, to: number) => {\n for (let i = 0; i <= steps; i++) {\n const p = at(r, from + ((to - from) * i) / steps)\n path.lineTo(p.x, p.y)\n }\n }\n const round = (corner: Vector2, next: Vector2) => {\n if (rounded) path.quadraticCurveTo(corner.x, corner.y, next.x, next.y)\n else path.lineTo(corner.x, corner.y)\n }\n\n const first = at(rOuter, oa0 + dOuter)\n path.moveTo(first.x, first.y)\n arc(rOuter, oa0 + dOuter, oa1 - dOuter)\n round(O1, toward(O1, I1, rho))\n if (hasHole) {\n const beforeI1 = toward(I1, O1, rho)\n path.lineTo(beforeI1.x, beforeI1.y)\n round(I1, at(rInner, ia1 - dInner))\n arc(rInner, ia1 - dInner, ia0 + dInner)\n round(I0, toward(I0, O0, rho))\n } else {\n path.lineTo(apex.x, apex.y)\n }\n const beforeO0 = toward(O0, I0, rounded ? rho : 0)\n path.lineTo(beforeO0.x, beforeO0.y)\n round(O0, first)\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 === \"outside\" && 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. */\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 fill: () => onFill(s.slices[arc.index]?.fill ?? \"white\"),\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 fill: () => onFill(s.slices[arc.index]?.fill ?? \"white\"),\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) * clamp(geometry().holeRadius / 20, 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_RING),\n label: Types.custom<LabelConfig>(DEFAULT_LABEL),\n // Not `center`: every node already has one, the anchor its position is measured from.\n centerStyle: Types.custom<CenterConfig>(DEFAULT_CENTER),\n labelMode: Types.custom<PieLabelMode>(\"percent\"),\n labelPlacement: Types.custom<PieLabelPlacement>(\"outside\"),\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: PIE_SPOTLIGHT_DIM,\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 strokes: [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, Math.max(0, state.ring.cornerRadius), cx)\n const wedge = new Graphics2D().path(path.toPathState({ centerBounds, width: span, height: span }))\n wedge.fill(fills[arc.index] ?? [])\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,41 +1,26 @@
1
- import { type DataRecord, type Fill, type Shadow, type Stroke, type TextStyle, type Vector2 } from "@motionscript/sdk";
2
- import { type LegendConfig, type LegendTheme } from "../kit/shared.js";
3
- /** One resolved slice, which the ring and legend consume; the chart resolves it from `data` and two field names. */
4
- export interface PieSlice {
5
- /** Label and legend caption. */
6
- category: string;
7
- /** The wedge covers `value / (sum of all values)`. */
8
- value: number;
9
- /** Wedge and swatch paint. */
10
- fill: Fill;
11
- }
1
+ import { type Fill, type TextStyle, type Stroke, type FillResolved as _FillResolved } from "@motionscript/sdk";
2
+ import { type ChartStyleBase } from "../kit/style.js";
3
+ import { type LegendConfig } from "../kit/shared.js";
4
+ import { DEG, PIE_SPOTLIGHT_DIM, ringPoint, selectionFade, type CenterConfig, type PieSlice } from "../kit/polar.js";
5
+ export { DEG, PIE_SPOTLIGHT_DIM, ringPoint, selectionFade, type CenterConfig, type PieSlice };
12
6
  /**
13
7
  * One slice per row, painted from `palette` by row order (cycling). Paint comes
14
8
  * from the palette, not the rows, because a pie's mark is a row where a line's
15
9
  * colour belongs to a column; that lets a pie be fed a CSV of plain numbers.
16
10
  */
17
- export declare function resolvePieSlices(data: DataRecord[], category: string, value: string, palette: Fill[]): PieSlice[];
11
+ export declare function resolvePieSlices(data: readonly Record<string, unknown>[], category: string, value: string, palette: readonly Fill[]): PieSlice[];
18
12
  /** What a {@link PieChart}'s labels say. */
19
13
  export type PieLabelMode =
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. */
14
+ /** Two lines, whose order flips with placement: an outside label reads category over percentage, an inside label reads the percentage big over a small category. */
21
15
  "both" | "category" | "percent"
22
16
  /** No labels and no leader lines. */
23
17
  | "none";
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. */
25
- export type PieLabelPlacement = "inside" | "leader" | "none";
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;
18
+ /** `"inside"` centres the label in the wedge's band with no leader or gutter, so the ring draws bigger; `"outside"` sets it on a leader, which a sliver too narrow for text needs. */
19
+ export type PieLabelPlacement = "inside" | "outside" | "none";
33
20
  /** A slice's plotted value: negatives and non-finite values count as 0. */
34
21
  export declare function sliceValue(slice: PieSlice): number;
35
22
  /** Sum of every slice's plotted value, the denominator of every share. */
36
23
  export declare function sliceTotal(slices: PieSlice[]): number;
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. */
38
- export declare function ringPoint(r: number, a: number): Vector2;
39
24
  /** One slice's resolved angular span on the ring. */
40
25
  export interface PieArc {
41
26
  /** Index of the slice in the source list. */
@@ -69,7 +54,7 @@ interface LabelSlot {
69
54
  * Mutates each `y` and returns `slots` ordered top to bottom.
70
55
  */
71
56
  export declare function relaxLabels<T extends LabelSlot>(slots: T[], minGap: number, top: number, bottom: number): T[];
72
- /** The ring's geometry and paint: everything about the wedges but their colour. */
57
+ /** The ring's geometry: everything about the wedges but their colour. */
73
58
  export interface RingConfig {
74
59
  /** Channel between adjacent slices in px, constant across the band (an angular gap would splay open toward the rim). */
75
60
  gap: number;
@@ -79,52 +64,59 @@ export interface RingConfig {
79
64
  startAngle: number;
80
65
  /** 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]`. */
81
66
  selectedGrow: number;
82
- stroke: Stroke;
83
- shadow: Shadow;
67
+ /** Rounding of each wedge corner, px. */
68
+ cornerRadius: number;
84
69
  }
85
70
  /** How the ring's labels are set, and the leader lines that point at them. */
86
71
  export interface LabelConfig {
87
- /** The category caption. */
72
+ /** The category caption outside the ring. */
88
73
  textStyle: TextStyle;
89
- /** The percentage. */
74
+ /** The percentage outside the ring. */
90
75
  percentStyle: TextStyle;
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. */
76
+ /** Both lines of a label inside its wedge; its fill is set per wedge, for contrast against the paint. */
92
77
  insideStyle: TextStyle;
93
78
  /** Runs from a wedge out to its label. */
94
79
  leaderStroke: Stroke;
95
80
  }
96
- /** The summary set in the ring's hole. */
97
- export interface CenterConfig {
98
- labelStyle: TextStyle;
99
- captionStyle: TextStyle;
81
+ /** What a pie's `style` resolves to. */
82
+ export interface PieStyle extends ChartStyleBase {
83
+ readonly innerRadius: number;
84
+ readonly sliceGap: number;
85
+ readonly sliceRadius: number;
86
+ readonly labelPlacement: PieLabelPlacement;
100
87
  }
101
- /** A {@link PieChart}'s full, resolved visual theme. */
102
- export interface PieChartConfig {
103
- /** Wedge and swatch paint, cycled by **row** index (`i % length`). */
104
- sliceFills: Fill[];
105
- ring: RingConfig;
106
- label: LabelConfig;
107
- center: CenterConfig;
108
- legend: LegendConfig;
109
- /** How far everything outside the selection fades while any slice is selected. */
110
- spotlight: {
111
- dimOpacity: number;
88
+ /** The groups of a pie's `style`: no grid, as nothing is ruled. */
89
+ export declare const PIE_STYLE_GROUPS: {
90
+ colors: {
91
+ palette: import("@motionscript/sdk").Type<Fill[], _FillResolved[][], false>;
92
+ foreground: import("@motionscript/sdk").Type<Fill, _FillResolved[], false>;
93
+ muted: import("@motionscript/sdk").Type<Fill, _FillResolved[], false>;
94
+ background: import("@motionscript/sdk").Type<Fill, _FillResolved[], false>;
95
+ };
96
+ text: {
97
+ fontFamily: import("@motionscript/sdk").Type<string, string, false>;
98
+ fontSize: import("@motionscript/sdk").Type<number, number, false>;
99
+ fontWeight: import("@motionscript/sdk").Type<number, number, false>;
100
+ };
101
+ marks: {
102
+ /** Hole radius as a fraction of the outer radius: 0 is a pie, about 0.6 a donut. */
103
+ innerRadius: import("@motionscript/sdk").Type<number, number, false>;
104
+ /** Channel between neighbouring wedges, px. */
105
+ sliceGap: import("@motionscript/sdk").Type<number, number, false>;
106
+ /** Rounding of each wedge corner, px. */
107
+ sliceRadius: import("@motionscript/sdk").Type<number, number, false>;
108
+ };
109
+ labels: {
110
+ /** Read as the chart is built: inside the wedge, outside on a leader, or none. */
111
+ labelPlacement: import("@motionscript/sdk").Type<"inside" | "outside" | "none", "inside" | "outside" | "none", false>;
112
+ };
113
+ legend: {
114
+ legend: import("@motionscript/sdk").Type<"right" | "top" | "bottom" | "none", "right" | "top" | "bottom" | "none", false>;
115
+ swatch: import("@motionscript/sdk").Type<"square" | "circle" | "line", "square" | "circle" | "line", false>;
112
116
  };
113
- }
114
- /** The author's partial theme, deep-merged onto {@link DEFAULT_PIE_CHART_THEME}. */
115
- export type PieChartTheme = {
116
- sliceFills?: Fill[];
117
- ring?: Partial<RingConfig>;
118
- label?: Partial<LabelConfig>;
119
- center?: Partial<CenterConfig>;
120
- legend?: LegendTheme;
121
- spotlight?: Partial<PieChartConfig["spotlight"]>;
122
117
  };
123
- /** Fainter than `SPOTLIGHT_DIM`: a ring's slices touch, so at that a selected slice barely separates. */
124
- export declare const PIE_SPOTLIGHT_DIM = 0.1;
125
- export declare const DEFAULT_PIE_CHART_THEME: PieChartConfig;
126
- /** The `theme` entry's resolve: merges a partial {@link PieChartTheme} onto `previous` (first resolution: the default). */
127
- export declare function resolvePieChartTheme(theme: PieChartTheme | undefined, previous?: PieChartConfig): PieChartConfig;
128
- export declare function lerpPieChartTheme(from: PieChartConfig, to: PieChartConfig, t: number): PieChartConfig;
129
- export {};
118
+ export declare function legendOf(style: PieStyle): LegendConfig;
119
+ export declare function ringConfigOf(style: PieStyle): RingConfig;
120
+ export declare function labelConfigOf(style: PieStyle): LabelConfig;
121
+ export declare function centerConfigOf(style: PieStyle): CenterConfig;
130
122
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/pie-chart/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/pie-chart/shared.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,8 @@
1
- import { clamp, lerpNumber, shadowOps, strokeOps, textOps, } from "@motionscript/sdk";
2
- import { CHART_PALETTE, DEFAULT_LEGEND, DEFAULT_SERIES_FILLS, lerpLegendConfig, lerpSeriesFills, num, resolveLegendConfig, resolveSeriesFills, text, } from "../kit/shared.js";
1
+ import { Types } from "@motionscript/sdk";
2
+ import { CHART_COLORS, CHART_LEGEND, CHART_TEXT, legendConfigOf, } from "../kit/style.js";
3
+ import { num, text } from "../kit/shared.js";
4
+ import { DEG, PIE_SPOTLIGHT_DIM, ringPoint, selectionFade } from "../kit/polar.js";
5
+ export { DEG, PIE_SPOTLIGHT_DIM, ringPoint, selectionFade };
3
6
  /**
4
7
  * One slice per row, painted from `palette` by row order (cycling). Paint comes
5
8
  * from the palette, not the rows, because a pie's mark is a row where a line's
@@ -12,17 +15,6 @@ export function resolvePieSlices(data, category, value, palette) {
12
15
  fill: palette.length > 0 ? palette[i % palette.length] : "white",
13
16
  }));
14
17
  }
15
- export const DEG = Math.PI / 180;
16
- /**
17
- * Opacity of a slice under the selection: 1 while nothing is out (`focus` is the
18
- * most-grown pop) and for the selected slice itself, falling toward `dimOpacity`
19
- * for the rest as the selection grows.
20
- */
21
- export function selectionFade(focus, dimOpacity, pop) {
22
- if (focus <= 0)
23
- return 1;
24
- return 1 - (1 - clamp(dimOpacity, 0, 1)) * focus * (1 - pop);
25
- }
26
18
  /** A slice's plotted value: negatives and non-finite values count as 0. */
27
19
  export function sliceValue(slice) {
28
20
  return slice.value > 0 && Number.isFinite(slice.value) ? slice.value : 0;
@@ -34,10 +26,6 @@ export function sliceTotal(slices) {
34
26
  sum += sliceValue(slice);
35
27
  return sum;
36
28
  }
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. */
38
- export function ringPoint(r, a) {
39
- return { x: r * Math.sin(a), y: r * Math.cos(a) };
40
- }
41
29
  /**
42
30
  * One arc per positive slice, walking clockwise from `startDegrees` and abutting.
43
31
  * Arcs are the undivided shares: a fixed angular gap would pinch shut at the
@@ -83,121 +71,53 @@ export function relaxLabels(slots, minGap, top, bottom) {
83
71
  }
84
72
  return slots;
85
73
  }
86
- const LABEL_TEXT_STYLE = {
87
- fontSize: 26,
88
- fontWeight: 600,
89
- textAlign: "center",
90
- fill: CHART_PALETTE.markerColor,
91
- };
92
- /** Fainter than `SPOTLIGHT_DIM`: a ring's slices touch, so at that a selected slice barely separates. */
93
- export const PIE_SPOTLIGHT_DIM = 0.1;
94
- export const DEFAULT_PIE_CHART_THEME = {
95
- sliceFills: DEFAULT_SERIES_FILLS,
96
- ring: {
97
- gap: 6,
98
- // A donut by default: the hole is the one place a conclusion can be set.
99
- holeRadius: 0.6,
100
- startAngle: 0,
101
- selectedGrow: 1.08,
102
- stroke: [],
103
- shadow: [],
74
+ /** The groups of a pie's `style`: no grid, as nothing is ruled. */
75
+ export const PIE_STYLE_GROUPS = {
76
+ colors: CHART_COLORS,
77
+ text: CHART_TEXT,
78
+ marks: {
79
+ /** Hole radius as a fraction of the outer radius: 0 is a pie, about 0.6 a donut. */
80
+ innerRadius: Types.number(0, { min: 0, max: 0.9, step: 0.05 }),
81
+ /** Channel between neighbouring wedges, px. */
82
+ sliceGap: Types.number(3, { min: 0, max: 40, step: 1, unit: "px" }),
83
+ /** Rounding of each wedge corner, px. */
84
+ sliceRadius: Types.number(4, { min: 0, max: 60, step: 1, unit: "px" }),
104
85
  },
105
- label: {
106
- textStyle: LABEL_TEXT_STYLE,
107
- percentStyle: { ...LABEL_TEXT_STYLE, fontWeight: 700 },
108
- // On a mid-tone wedge, so the panel colour rather than the axis ink.
109
- insideStyle: { ...LABEL_TEXT_STYLE, fontWeight: 800, fill: "#15130e" },
110
- leaderStroke: { weight: 2, fill: CHART_PALETTE.markerColor },
86
+ labels: {
87
+ /** Read as the chart is built: inside the wedge, outside on a leader, or none. */
88
+ labelPlacement: Types.oneOf(["inside", "outside", "none"], { animatable: false }),
111
89
  },
112
- center: {
113
- labelStyle: {
114
- fontSize: 46,
115
- fontWeight: 800,
116
- textAlign: "center",
117
- fill: CHART_PALETTE.markerColor,
118
- },
119
- captionStyle: {
120
- fontSize: 22,
121
- fontWeight: 500,
122
- textAlign: "center",
123
- fill: CHART_PALETTE.markerColor,
124
- },
125
- },
126
- legend: DEFAULT_LEGEND,
127
- spotlight: { dimOpacity: PIE_SPOTLIGHT_DIM },
90
+ legend: CHART_LEGEND,
128
91
  };
129
- function resolveRingConfig(ring, previous) {
130
- return {
131
- gap: ring?.gap ?? previous.gap,
132
- holeRadius: ring?.holeRadius ?? previous.holeRadius,
133
- startAngle: ring?.startAngle ?? previous.startAngle,
134
- selectedGrow: ring?.selectedGrow ?? previous.selectedGrow,
135
- stroke: strokeOps.resolve(ring?.stroke ?? previous.stroke),
136
- shadow: shadowOps.resolve(ring?.shadow ?? previous.shadow),
137
- };
92
+ export function legendOf(style) {
93
+ return legendConfigOf(style);
138
94
  }
139
- function lerpRingConfig(from, to, t) {
140
- return {
141
- gap: lerpNumber(from.gap, to.gap, t),
142
- holeRadius: lerpNumber(from.holeRadius, to.holeRadius, t),
143
- startAngle: lerpNumber(from.startAngle, to.startAngle, t),
144
- selectedGrow: lerpNumber(from.selectedGrow, to.selectedGrow, t),
145
- stroke: strokeOps.lerp(from.stroke, to.stroke, t),
146
- shadow: shadowOps.lerp(from.shadow, to.shadow, t),
147
- };
95
+ function face(style) {
96
+ return style.fontFamily ? { fontFamily: style.fontFamily } : {};
148
97
  }
149
- function resolveLabelConfig(label, previous) {
150
- return {
151
- textStyle: textOps.resolveStyle(label?.textStyle, previous.textStyle),
152
- percentStyle: textOps.resolveStyle(label?.percentStyle, previous.percentStyle),
153
- insideStyle: textOps.resolveStyle(label?.insideStyle, previous.insideStyle),
154
- leaderStroke: strokeOps.resolve(label?.leaderStroke ?? previous.leaderStroke),
155
- };
156
- }
157
- function lerpLabelConfig(from, to, t) {
158
- return {
159
- textStyle: textOps.lerpStyle(from.textStyle, to.textStyle, t),
160
- percentStyle: textOps.lerpStyle(from.percentStyle, to.percentStyle, t),
161
- insideStyle: textOps.lerpStyle(from.insideStyle, to.insideStyle, t),
162
- leaderStroke: strokeOps.lerp(from.leaderStroke, to.leaderStroke, t),
163
- };
164
- }
165
- function resolveCenterConfig(center, previous) {
166
- return {
167
- labelStyle: textOps.resolveStyle(center?.labelStyle, previous.labelStyle),
168
- captionStyle: textOps.resolveStyle(center?.captionStyle, previous.captionStyle),
169
- };
98
+ export function ringConfigOf(style) {
99
+ return { gap: style.sliceGap, holeRadius: style.innerRadius, startAngle: 0, selectedGrow: 1.08, cornerRadius: style.sliceRadius };
170
100
  }
171
- function lerpCenterConfig(from, to, t) {
101
+ export function labelConfigOf(style) {
102
+ const base = { ...face(style), fontSize: style.fontSize, fontWeight: style.fontWeight, textAlign: "center", fill: style.muted };
103
+ const bold = Math.min(900, style.fontWeight + 200);
172
104
  return {
173
- labelStyle: textOps.lerpStyle(from.labelStyle, to.labelStyle, t),
174
- captionStyle: textOps.lerpStyle(from.captionStyle, to.captionStyle, t),
105
+ textStyle: base,
106
+ percentStyle: { ...base, fontWeight: bold, fill: style.foreground },
107
+ insideStyle: { ...base, fontSize: Math.round(style.fontSize * 1.9), fontWeight: bold, fill: "#111113" },
108
+ leaderStroke: { weight: 2, fill: style.muted },
175
109
  };
176
110
  }
177
- /** The `theme` entry's resolve: merges a partial {@link PieChartTheme} onto `previous` (first resolution: the default). */
178
- export function resolvePieChartTheme(theme, previous) {
179
- const base = previous ?? DEFAULT_PIE_CHART_THEME;
111
+ export function centerConfigOf(style) {
180
112
  return {
181
- sliceFills: resolveSeriesFills(theme?.sliceFills, base.sliceFills),
182
- ring: resolveRingConfig(theme?.ring, base.ring),
183
- label: resolveLabelConfig(theme?.label, base.label),
184
- center: resolveCenterConfig(theme?.center, base.center),
185
- legend: resolveLegendConfig(theme?.legend, base.legend),
186
- spotlight: {
187
- dimOpacity: theme?.spotlight?.dimOpacity ?? base.spotlight.dimOpacity,
188
- },
189
- };
190
- }
191
- export function lerpPieChartTheme(from, to, t) {
192
- return {
193
- sliceFills: lerpSeriesFills(from.sliceFills, to.sliceFills, t),
194
- ring: lerpRingConfig(from.ring, to.ring, t),
195
- label: lerpLabelConfig(from.label, to.label, t),
196
- center: lerpCenterConfig(from.center, to.center, t),
197
- legend: lerpLegendConfig(from.legend, to.legend, t),
198
- spotlight: {
199
- dimOpacity: lerpNumber(from.spotlight.dimOpacity, to.spotlight.dimOpacity, t),
113
+ labelStyle: {
114
+ ...face(style),
115
+ fontSize: Math.round(style.fontSize * 1.8),
116
+ fontWeight: Math.min(900, style.fontWeight + 300),
117
+ textAlign: "center",
118
+ fill: style.foreground,
200
119
  },
120
+ captionStyle: { ...face(style), fontSize: Math.round(style.fontSize * 0.8), fontWeight: style.fontWeight, textAlign: "center", fill: style.muted },
201
121
  };
202
122
  }
203
123
  //# sourceMappingURL=shared.js.map