@motionscript/charts 0.1.0-alpha.5 → 0.1.0-alpha.7
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 +40 -0
- package/README.md +30 -16
- package/dist/bar-chart/bar-chart.d.ts +133 -242
- package/dist/bar-chart/bar-chart.d.ts.map +1 -1
- package/dist/bar-chart/bar-chart.js +378 -569
- package/dist/bar-chart/bar-chart.js.map +1 -1
- package/dist/bar-chart/category-axis.d.ts +35 -41
- package/dist/bar-chart/category-axis.d.ts.map +1 -1
- package/dist/bar-chart/category-axis.js +93 -115
- package/dist/bar-chart/category-axis.js.map +1 -1
- package/dist/bar-chart/chart-bars.d.ts +50 -70
- package/dist/bar-chart/chart-bars.d.ts.map +1 -1
- package/dist/bar-chart/chart-bars.js +156 -210
- package/dist/bar-chart/chart-bars.js.map +1 -1
- package/dist/bar-chart/index.d.ts +2 -2
- package/dist/bar-chart/index.d.ts.map +1 -1
- package/dist/bar-chart/index.js +1 -1
- package/dist/bar-chart/index.js.map +1 -1
- package/dist/bar-chart/shared.d.ts +3 -3
- package/dist/bar-chart/shared.d.ts.map +1 -1
- package/dist/bar-chart/shared.js +3 -3
- package/dist/bar-chart/shared.js.map +1 -1
- package/dist/browser/chunks/chunk-XROBIRQK.js +2 -0
- package/dist/browser/chunks/chunk-XROBIRQK.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 +8 -6
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +8 -6
- package/dist/engine.js.map +1 -1
- package/dist/kit/cartesian.d.ts +44 -0
- package/dist/kit/cartesian.d.ts.map +1 -0
- package/dist/kit/cartesian.js +59 -0
- package/dist/kit/cartesian.js.map +1 -0
- package/dist/kit/chart-border.d.ts +10 -11
- package/dist/kit/chart-border.d.ts.map +1 -1
- package/dist/kit/chart-border.js +15 -32
- package/dist/kit/chart-border.js.map +1 -1
- package/dist/kit/chart-canvas.d.ts +32 -21
- package/dist/kit/chart-canvas.d.ts.map +1 -1
- package/dist/kit/chart-canvas.js +33 -90
- package/dist/kit/chart-canvas.js.map +1 -1
- package/dist/kit/chart-legend.d.ts +123 -64
- package/dist/kit/chart-legend.d.ts.map +1 -1
- package/dist/kit/chart-legend.js +129 -154
- package/dist/kit/chart-legend.js.map +1 -1
- package/dist/kit/entries.d.ts +17 -0
- package/dist/kit/entries.d.ts.map +1 -0
- package/dist/kit/entries.js +19 -0
- package/dist/kit/entries.js.map +1 -0
- package/dist/kit/motion.d.ts +48 -0
- package/dist/kit/motion.d.ts.map +1 -0
- package/dist/kit/motion.js +63 -0
- package/dist/kit/motion.js.map +1 -0
- package/dist/kit/paints.d.ts +10 -0
- package/dist/kit/paints.d.ts.map +1 -0
- package/dist/kit/paints.js +12 -0
- package/dist/kit/paints.js.map +1 -0
- package/dist/kit/shared.d.ts +31 -3
- package/dist/kit/shared.d.ts.map +1 -1
- package/dist/kit/shared.js +42 -3
- package/dist/kit/shared.js.map +1 -1
- package/dist/kit/vertical-axis.d.ts +48 -61
- package/dist/kit/vertical-axis.d.ts.map +1 -1
- package/dist/kit/vertical-axis.js +97 -132
- package/dist/kit/vertical-axis.js.map +1 -1
- package/dist/line-chart/chart-line.d.ts +60 -77
- package/dist/line-chart/chart-line.d.ts.map +1 -1
- package/dist/line-chart/chart-line.js +100 -121
- package/dist/line-chart/chart-line.js.map +1 -1
- package/dist/line-chart/chart-region.d.ts +32 -33
- package/dist/line-chart/chart-region.d.ts.map +1 -1
- package/dist/line-chart/chart-region.js +31 -65
- package/dist/line-chart/chart-region.js.map +1 -1
- package/dist/line-chart/horizontal-axis.d.ts +58 -64
- package/dist/line-chart/horizontal-axis.d.ts.map +1 -1
- package/dist/line-chart/horizontal-axis.js +94 -123
- package/dist/line-chart/horizontal-axis.js.map +1 -1
- package/dist/line-chart/index.d.ts +2 -2
- package/dist/line-chart/index.d.ts.map +1 -1
- package/dist/line-chart/index.js +1 -1
- package/dist/line-chart/index.js.map +1 -1
- package/dist/line-chart/line-chart.d.ts +156 -319
- package/dist/line-chart/line-chart.d.ts.map +1 -1
- package/dist/line-chart/line-chart.js +403 -663
- package/dist/line-chart/line-chart.js.map +1 -1
- package/dist/line-chart/shared.d.ts +3 -3
- package/dist/line-chart/shared.d.ts.map +1 -1
- package/dist/line-chart/shared.js +3 -3
- package/dist/line-chart/shared.js.map +1 -1
- package/dist/nodes.d.ts +6 -9
- package/dist/nodes.d.ts.map +1 -1
- package/dist/nodes.js +7 -9
- package/dist/nodes.js.map +1 -1
- package/dist/pie-chart/index.d.ts +2 -2
- package/dist/pie-chart/index.d.ts.map +1 -1
- package/dist/pie-chart/index.js +1 -1
- package/dist/pie-chart/index.js.map +1 -1
- package/dist/pie-chart/pie-chart.d.ts +108 -132
- package/dist/pie-chart/pie-chart.d.ts.map +1 -1
- package/dist/pie-chart/pie-chart.js +200 -271
- package/dist/pie-chart/pie-chart.js.map +1 -1
- package/dist/pie-chart/pie-legend.d.ts +84 -31
- package/dist/pie-chart/pie-legend.d.ts.map +1 -1
- package/dist/pie-chart/pie-legend.js +93 -107
- package/dist/pie-chart/pie-legend.js.map +1 -1
- package/dist/pie-chart/pie-ring.d.ts +160 -131
- package/dist/pie-chart/pie-ring.d.ts.map +1 -1
- package/dist/pie-chart/pie-ring.js +333 -391
- package/dist/pie-chart/pie-ring.js.map +1 -1
- package/dist/pie-chart/shared.d.ts +2 -2
- package/dist/pie-chart/shared.d.ts.map +1 -1
- package/dist/pie-chart/shared.js +2 -2
- package/dist/pie-chart/shared.js.map +1 -1
- package/package.json +4 -4
- package/src/bar-chart/bar-chart.ts +415 -701
- package/src/bar-chart/category-axis.ts +95 -110
- package/src/bar-chart/chart-bars.ts +178 -200
- package/src/bar-chart/index.ts +2 -2
- package/src/bar-chart/shared.ts +3 -3
- package/src/engine.ts +8 -6
- package/src/kit/cartesian.ts +81 -0
- package/src/kit/chart-border.ts +22 -33
- package/src/kit/chart-canvas.ts +44 -79
- package/src/kit/chart-legend.ts +173 -189
- package/src/kit/entries.ts +20 -0
- package/src/kit/motion.ts +90 -0
- package/src/kit/paints.ts +15 -0
- package/src/kit/shared.ts +52 -3
- package/src/kit/vertical-axis.ts +110 -140
- package/src/line-chart/chart-line.ts +102 -154
- package/src/line-chart/chart-region.ts +35 -80
- package/src/line-chart/horizontal-axis.ts +101 -152
- package/src/line-chart/index.ts +2 -2
- package/src/line-chart/line-chart.ts +449 -825
- package/src/line-chart/shared.ts +3 -3
- package/src/nodes.ts +8 -10
- package/src/pie-chart/index.ts +2 -2
- package/src/pie-chart/pie-chart.ts +221 -311
- package/src/pie-chart/pie-legend.ts +124 -114
- package/src/pie-chart/pie-ring.ts +386 -473
- package/src/pie-chart/shared.ts +2 -2
- package/dist/browser/chunks/chunk-5ZPBV6BU.js +0 -2
- package/dist/browser/chunks/chunk-5ZPBV6BU.js.map +0 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,45 @@
|
|
|
1
1
|
# @motionscript/charts
|
|
2
2
|
|
|
3
|
+
## 0.1.0-alpha.7
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 737f7d0: What was left of the class authoring system is gone. Each piece existed to write or extend a node class, and a node type is a component now; no built-in, kit or host used them.
|
|
8
|
+
|
|
9
|
+
Removed from `@motionscript/core`:
|
|
10
|
+
|
|
11
|
+
- the registration functions `property`, `node`, `command` and `withdraw`, and the thirteen typed property helpers (`fillProperty`, `strokeProperty`, `shadowProperty`, `effectsProperty`, `colorProperty`, `cornerRadiusProperty`, `cornerStyleProperty`, `pathProperty`, `insetsProperty`, `alignmentProperty`, `vector2Property`, `sizeProperty`, `textProperty`) with their `AttributePropOptions` type. A component declares its entries with `Types`. `getPropertyMeta`, `getNodeDescriptor`, `getCommandMeta` and the metadata types stay;
|
|
12
|
+
- `TextSelection`, `TextSelectionHost`, `TextSelectionProps`, `TextRange`, `SelectionOverrides` and `normalizeRanges`: the component `Text` has no selection API, so nothing could make one. Style a range with `runs`;
|
|
13
|
+
- `AudioScope` and the `declareAudio` hook on `Node`: sound plays from commands (`timeline.sound`). `busPathOf` and `busPathTo` take a function answering a node's span instead of an `AudioScope`;
|
|
14
|
+
- the `Node.tick` hook and the `Node2D` hooks `beforeRender`, `afterRender`, `renderStroke`, `clipPathSelf`, `resolveSizeInput` and `constraints`, which only a subclass could reach;
|
|
15
|
+
- `NodeTypeRecord.withdrawn` and `CommandMeta.withdrawn`. `PropertyMeta.withdrawn` stays, deprecated: nothing sets it.
|
|
16
|
+
|
|
17
|
+
Removed from `@motionscript/core/component`, and so from `@motionscript/sdk/component` and `@motionscript/charts/kit`, which re-export it: the seekable composition `at`, `hold`, `sequence` and `together`, with the `Seekable` and `Placed` types. A component command returns timeline pieces.
|
|
18
|
+
|
|
19
|
+
Removed from `@motionscript/sdk`: `TextSelection`, `TextSelectionProps`, `TextRange`, `SelectionOverrides`, `AudioScope` and `AudioClip`.
|
|
20
|
+
|
|
21
|
+
## 0.1.0-alpha.6
|
|
22
|
+
|
|
23
|
+
### Minor Changes
|
|
24
|
+
|
|
25
|
+
- 163b708: Node types are components: one spec object handed to `component2d`, `component3d` or `componentAudio`, with no classes, decorators or JSX.
|
|
26
|
+
|
|
27
|
+
- **Writing a node type.** A component is one object literal: `key`, `state` (literals and `Types`), `defaults`, `commands`, `children`, `allowedChildren`/`allowedParents`, `provide`, `load`, and its tree's own fields (`measure`, `layout`, `render` for 2D). Behaviour comes from modules you spread in and call: `Paint`, `Flow`, `Shapes`, `Typeface`, `TextLayout`, `Aim`, `Material`, `View3D`. ADR 0007 and the custom-node docs cover it.
|
|
28
|
+
- **Building nodes in code** uses calls: `Rect({ fill: 'tomato', children: [Text({ text: 'Hi' })] })`, or `new Rect({...})` for the node itself.
|
|
29
|
+
- **Every built-in and every kit node is a component**, under the same document key. Code that tested `instanceof` a class now uses the component's `.is`, or `instanceof X.node`. Changed members:
|
|
30
|
+
- `SurfacePlot3d.valueAt` and `FunctionPlot.valueAt` are now the functions `surfaceValueAt` and `curveValue`.
|
|
31
|
+
- A system's `coordinates` is replaced by `planeMap`/`axesMap`/`systemMap`.
|
|
32
|
+
- `PieChart.isSelected` is replaced by `isSliceSelected`.
|
|
33
|
+
- `ItemGrid` is a kit module (`ItemGrid.isGrid`, `ItemGrid.define`), not a base class.
|
|
34
|
+
- **The sdk no longer exports the class surface:**
|
|
35
|
+
- the decorators: `node`, `property` and every `*Property`, `command`, `withdraw`, `driveCommand`;
|
|
36
|
+
- the authoring bases: `PaintNode`, `ShapeNode`, `TextBase`, `Mesh3DBase`, `Canvas3DBase` and the `*Base` geometry classes;
|
|
37
|
+
- `asCommand`, `compose`, `drive` and `declarePaints` from `@motionscript/sdk/component`;
|
|
38
|
+
- the `jsx-runtime` and `jsx-dev-runtime` subpaths.
|
|
39
|
+
- `Node`, `Node2D`, `Node3D` and `NodeAudio` remain as types.
|
|
40
|
+
- **Editor metadata leaves the engine.** The kits no longer declare `parentKey`, `forkable`, `layout`, `seed`, `within`, `beside` or `closed`; a host keeps those in its own configs. `describe()` now reports `holds`, the trees a type takes children from, and the placement checks use it, so a 2D viewport of your own that takes 3D children places them.
|
|
41
|
+
- A command called from code with no argument runs, and a refused child is told what its parent takes (`allowedChildren`) or where it goes (`allowedParents`).
|
|
42
|
+
|
|
3
43
|
## 0.1.0-alpha.5
|
|
4
44
|
|
|
5
45
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -30,20 +30,23 @@ npm install @motionscript/charts @motionscript/sdk
|
|
|
30
30
|
Each chart folder (`line-chart/`, `bar-chart/`, `pie-chart/`) has an `index.ts`
|
|
31
31
|
barrel with the node, its parts, its theme (`DEFAULT_*_THEME`, `resolve*Theme`,
|
|
32
32
|
`lerp*Theme`) and its pure helpers (`resolveXScale`, `barSpans`, `pieArcs`, ...).
|
|
33
|
-
The parts (`ChartLine`, `ChartBars`, `PieRing`, `VerticalAxis`, ...)
|
|
34
|
-
|
|
33
|
+
The charts and their parts (`ChartLine`, `ChartBars`, `PieRing`, `VerticalAxis`, ...)
|
|
34
|
+
are components (`component2d`); only the charts are registered node types, so a
|
|
35
|
+
document cannot name a part. A chart tells a host its key, entries and commands;
|
|
36
|
+
where it is shelved and the box it is seeded at are the host's to keep. `lineChartDomains` and `barChartDomain` give the axes as drawn, and
|
|
37
|
+
`isSliceSelected` whether a pie slice is out.
|
|
35
38
|
|
|
36
39
|
## Nodes
|
|
37
40
|
|
|
38
|
-
| Key |
|
|
41
|
+
| Key | Made for (w x h) | Data props | Commands |
|
|
39
42
|
|---|---|---|---|
|
|
40
|
-
| `lineChart` | 760 x 460 | `data`, `xField`, `series`, `xAxis`, `yAxis`, `region` | `enter
|
|
41
|
-
| `barChart` | 760 x 460 | `data`, `categoryField`, `series`, `valueAxis`, `stacked` | `enter
|
|
42
|
-
| `pieChart` | 680 x 480 | `data`, `categoryField`, `valueField` | `enter
|
|
43
|
+
| `lineChart` | 760 x 460 | `data`, `xField`, `series`, `xAxis`, `yAxis`, `region` | `enter`, `spotlightRegion`, `clearRegion`, `zoomTo`, `resetZoom`, `showSeries`/`hideSeries`/`spotlightSeries` |
|
|
44
|
+
| `barChart` | 760 x 460 | `data`, `categoryField`, `series`, `valueAxis`, `stacked` | `enter`, `showSeries`/`hideSeries`/`spotlightSeries`, `spotlightCategory`, `clearCategory` |
|
|
45
|
+
| `pieChart` | 680 x 480 | `data`, `categoryField`, `valueField` | `enter`, `revealCenter`, `selectSlice`/`deselectSlice`/`selectOnlySlice`/`clearSelection` |
|
|
43
46
|
|
|
44
|
-
Every command
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
Every command takes the duration its row (or call) gives, and eases out unless
|
|
48
|
+
given an easing. Arguments: `seriesIndex`, `sliceIndex`, `categoryIndex` (each 0
|
|
49
|
+
when left out), and for `spotlightRegion` and `zoomTo` a `region` of
|
|
47
50
|
`{ x?: [min, max], y?: [min, max] }`.
|
|
48
51
|
|
|
49
52
|
## Rules worth knowing
|
|
@@ -51,9 +54,14 @@ all of them compile from a document. Arguments: `seriesIndex`, `sliceIndex`,
|
|
|
51
54
|
- **The kit stays an import.** `ms add line-chart` copies only `line-chart/*` and
|
|
52
55
|
rewrites its kit imports to `@motionscript/charts` (`registry.json`): a second
|
|
53
56
|
copy of `VerticalAxis` would render as nothing, with no error.
|
|
54
|
-
- **Resting state is the finished chart.** `enter` arms every part
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
- **Resting state is the finished chart.** `enter` arms every part on its first
|
|
58
|
+
frame: every piece of a component command is built run to its end, and a beat
|
|
59
|
+
ahead of the playhead writes nothing, so the first frame writes what each later
|
|
60
|
+
beat moves from. `duration` is the whole entrance: a beat with nothing to do (no
|
|
61
|
+
legend, no series) holds its share.
|
|
62
|
+
- **A part's command has no duration of its own.** The charts pass every part the
|
|
63
|
+
duration and easing it moves with; called directly, a part's command takes the
|
|
64
|
+
duration it is given, and a part's own frames ease out unless given an easing.
|
|
57
65
|
- **Some props are read once, at construction**: the series list (count, labels,
|
|
58
66
|
`enabled`), `showLegend`, `showValues`, `showCenter`, axis captions, text styles and
|
|
59
67
|
paddings, the bar chart's category captions, the pie's label and legend-row counts,
|
|
@@ -67,10 +75,16 @@ all of them compile from a document. Arguments: `seriesIndex`, `sliceIndex`,
|
|
|
67
75
|
are in the x scale's own units: the number (numeric column), UTC epoch
|
|
68
76
|
milliseconds (time column) or the row index (ordinal column), chosen from the
|
|
69
77
|
column by `resolveXScale` (dates via `parseInstant`).
|
|
70
|
-
- **`zoomTo`
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
78
|
+
- **`zoomTo` remembers the resting domain once** (`home`, a private entry its
|
|
79
|
+
frames write) and `resetZoom`'s frames clear it, so the pair is order dependent
|
|
80
|
+
and a seek back before a zoom forgets it again: a `resetZoom` with no earlier
|
|
81
|
+
`zoomTo`, and a `zoomTo` naming neither axis, write nothing for their duration.
|
|
82
|
+
A zoom keeps the tick count so each marker slides.
|
|
83
|
+
- **A `to` of an axis `range` or `ticks` tweens from the domain as drawn**
|
|
84
|
+
(`lerpAxisEntry`): an auto side is held mid-move as an `AxisDomainBlend`, which
|
|
85
|
+
the chart settles against its data, so a rescale from an auto axis is continuous.
|
|
86
|
+
A restated range without ticks spreads explicit ticks across it; one side of an
|
|
87
|
+
auto axis restated alone leaves the other to the data.
|
|
74
88
|
- **Pie angles** are radians clockwise from 12 o'clock; `startAngle` is degrees.
|
|
75
89
|
|
|
76
90
|
## Development
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type AxisDomainConfig } from "../kit/shared.js";
|
|
3
|
-
import { type BarChartTheme, type BarSeries } from "./shared.js";
|
|
1
|
+
import { type DataRecord, type NodeOf, type Node2D, type Node2DProps } from "@motionscript/sdk";
|
|
2
|
+
import { type AxisDomainConfig, type Range } from "../kit/shared.js";
|
|
3
|
+
import { type BarChartConfig, type BarChartTheme, type BarSeries } from "./shared.js";
|
|
4
4
|
export interface BarChartProps extends Node2DProps {
|
|
5
5
|
/** One row per category — a plain record of field name to value. */
|
|
6
6
|
data: DataRecord[];
|
|
@@ -33,268 +33,159 @@ export interface BarChartProps extends Node2DProps {
|
|
|
33
33
|
/** Whether each column prints the figure it plots. */
|
|
34
34
|
showValues?: boolean;
|
|
35
35
|
}
|
|
36
|
-
/**
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
* rather than part of what an author states about it. Same reason the line chart
|
|
48
|
-
* types its `RegionState` separately.
|
|
49
|
-
*/
|
|
50
|
-
type CategorySpotlight = {
|
|
51
|
-
spotlight: number | null;
|
|
52
|
-
spotlightReveal: number;
|
|
36
|
+
/** What a bar chart plots, as its entries hold it. */
|
|
37
|
+
export interface BarChartValues {
|
|
38
|
+
readonly data: DataRecord[];
|
|
39
|
+
readonly series: BarSeries[];
|
|
40
|
+
readonly stacked: boolean;
|
|
41
|
+
readonly valueAxis: AxisDomainConfig;
|
|
42
|
+
}
|
|
43
|
+
/** The value axis's domain with its range and ticks resolved. */
|
|
44
|
+
export type BarChartDomain = AxisDomainConfig & {
|
|
45
|
+
readonly range: Range;
|
|
46
|
+
readonly ticks: number[];
|
|
53
47
|
};
|
|
48
|
+
/** The value axis as a bar chart draws it now, an auto range or tick row read back as itself. */
|
|
49
|
+
export declare function barChartDomain(s: BarChartValues): BarChartDomain;
|
|
54
50
|
/**
|
|
55
|
-
* A grouped or stacked bar chart,
|
|
56
|
-
*
|
|
57
|
-
* same way and out of several of the same pieces:
|
|
51
|
+
* A grouped or stacked bar chart, the sibling of the line chart and built the
|
|
52
|
+
* same way, out of several of the same pieces:
|
|
58
53
|
*
|
|
59
54
|
* - `ChartCanvas` — the plot panel with a horizontal grid, under everything.
|
|
60
55
|
* - `VerticalAxis` — the numeric value markers, staggering in bottom-to-top.
|
|
61
|
-
* - {@link CategoryAxis} — the row of names beneath the baseline, one per row
|
|
62
|
-
* the data, staggering in left-to-right.
|
|
56
|
+
* - {@link CategoryAxis} — the row of names beneath the baseline, one per row.
|
|
63
57
|
* - {@link ChartBars} (one per series) — that series' column in every category,
|
|
64
58
|
* plus the figures printed on them.
|
|
65
59
|
* - `ChartLegend` — a row of entries below the chart, one per series.
|
|
66
60
|
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
* resolved scale the axis does, so a column's end lands exactly on its marker
|
|
72
|
-
* and the chart re-flows if its box changes.
|
|
61
|
+
* Every part reads the chart's entries through bindings, and the columns map
|
|
62
|
+
* across the plot panel's own laid-out box, so a column's end lands exactly on
|
|
63
|
+
* its marker. **Zero is always on the scale**, and the columns grow about it, so
|
|
64
|
+
* a negative value draws downward out of the same `growth` signal.
|
|
73
65
|
*
|
|
74
|
-
* **Resting state is the finished chart
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* **Zero is always on the scale** (see `barValueExtent`), and the columns
|
|
80
|
-
* grow about it rather than about the plot floor, so a negative value draws
|
|
81
|
-
* downward out of the same `growth` signal that draws a positive one up.
|
|
82
|
-
*
|
|
83
|
-
* Past the entrance, two things move the chart:
|
|
84
|
-
* {@link showSeries}/{@link hideSeries}/{@link spotlightSeries} pick out a
|
|
85
|
-
* *series* — and hiding one **reflows the group**, the remaining columns
|
|
86
|
-
* widening into the space as it goes, rather than leaving a hole where it was —
|
|
87
|
-
* while {@link spotlightCategory}/{@link clearCategory} pick out a *column of
|
|
88
|
-
* the table*, dimming every other category and its caption with it.
|
|
66
|
+
* **Resting state is the finished chart**; `enter` arms every part on its first
|
|
67
|
+
* frame. `showSeries`/`hideSeries`/`spotlightSeries` pick out a *series* (hiding
|
|
68
|
+
* one reflows the group), `spotlightCategory`/`clearCategory` a *column of the
|
|
69
|
+
* table*. A `to` of the value axis's `range` or `ticks` tweens from the domain
|
|
70
|
+
* as drawn, so an auto axis rescales the columns continuously.
|
|
89
71
|
*/
|
|
90
|
-
export declare
|
|
91
|
-
data: DataRecord[]
|
|
92
|
-
categoryField:
|
|
93
|
-
series:
|
|
94
|
-
stacked:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
* previous resolved domain and the tween interpolates numerically, so
|
|
99
|
-
* `chart.to({ data: { valueAxis: { range: [0, 10] } }, duration: 1 })` smoothly
|
|
100
|
-
* rescales every column. The axis *label* text is captured once at construction.
|
|
101
|
-
*/
|
|
102
|
-
valueAxis: AxisDomainConfig;
|
|
103
|
-
categoryAxis: AxisDomainConfig;
|
|
104
|
-
theme: BarChartTheme;
|
|
72
|
+
export declare const BarChart: import("@motionscript/sdk").Component<"barChart", import("@motionscript/sdk").Merge<import("@motionscript/sdk").Box2DState, {
|
|
73
|
+
readonly data: import("@motionscript/sdk").Type<DataRecord[], DataRecord[], false>;
|
|
74
|
+
readonly categoryField: "";
|
|
75
|
+
readonly series: import("@motionscript/sdk").Type<import("../index.js").ChartSeries[], import("../index.js").ChartSeries[], false>;
|
|
76
|
+
readonly stacked: false;
|
|
77
|
+
readonly valueAxis: import("@motionscript/sdk").Type<AxisDomainConfig, AxisDomainConfig, false>;
|
|
78
|
+
readonly categoryAxis: import("@motionscript/sdk").Type<AxisDomainConfig, AxisDomainConfig, false>;
|
|
79
|
+
readonly theme: import("@motionscript/sdk").Type<BarChartTheme, BarChartConfig, false>;
|
|
105
80
|
/**
|
|
106
81
|
* Global rise of every column in `[0, 1]`, measured about the baseline: 0
|
|
107
|
-
* collapses them all onto it, 1 draws them at full length.
|
|
108
|
-
* {@link ChartBars}' own `growth` is bound to this, so tweening this one
|
|
109
|
-
* signal raises the whole chart in proportion.
|
|
110
|
-
*/
|
|
111
|
-
growth: number;
|
|
112
|
-
/**
|
|
113
|
-
* How much of the slot each series currently claims, one entry per series.
|
|
114
|
-
*
|
|
115
|
-
* A *weight* rather than a boolean, because that is what makes hiding a series
|
|
116
|
-
* an animation instead of a jump: the grouped columns divide the slot in
|
|
117
|
-
* proportion to these, so tweening one to 0 has the remaining columns widen
|
|
118
|
-
* into the space as it shrinks away, and a stacked segment's contribution to
|
|
119
|
-
* the stack fades out with it. Seeded from each series' `enabled` field.
|
|
82
|
+
* collapses them all onto it, 1 draws them at full length.
|
|
120
83
|
*/
|
|
121
|
-
|
|
84
|
+
readonly growth: 1;
|
|
122
85
|
/**
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
86
|
+
* How much of the slot each series claims, one entry per series: a weight
|
|
87
|
+
* rather than a switch, so hiding one is the others widening into the space.
|
|
88
|
+
* Seeded from each series' `enabled`.
|
|
126
89
|
*/
|
|
127
|
-
|
|
90
|
+
readonly weights: import("@motionscript/sdk").Type<number[], number[], false>;
|
|
91
|
+
/** The category spotlit, or `null` for none. The choice snaps; `spotlightReveal` is the animation. */
|
|
92
|
+
readonly spotlight: import("@motionscript/sdk").Type<number | null, number | null, false>;
|
|
128
93
|
/** How far the category spotlight is drawn in, `[0, 1]`. */
|
|
129
|
-
spotlightReveal:
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
* few percent off the grid line they were supposed to end on. Asking the panel
|
|
160
|
-
* is exact by construction: the grid, the columns and the border all resolve
|
|
161
|
-
* against the one box they are drawn in. Zero until the first layout pass, like
|
|
162
|
-
* any other `layoutBounds` read; the bindings that call this re-run on the
|
|
163
|
-
* next frame.
|
|
164
|
-
*/
|
|
165
|
-
private plotSize;
|
|
166
|
-
/** Map a value onto the plot's **centred** pixel space (origin at its centre, y-up). */
|
|
167
|
-
private valueToY;
|
|
168
|
-
/**
|
|
169
|
-
* Pixel y of the line every column grows from.
|
|
170
|
-
*
|
|
171
|
-
* Zero, clamped onto the scale — so an author who *did* crop the axis to
|
|
172
|
-
* `[40, 100]` gets columns rising from the plot floor rather than from a
|
|
173
|
-
* baseline off the bottom of the panel.
|
|
174
|
-
*/
|
|
175
|
-
private get baselinePx();
|
|
176
|
-
/** Width of one category's slot across the plot. */
|
|
177
|
-
private get slotWidth();
|
|
178
|
-
/** Centre x of category `i`'s slot, in the plot's centred space. */
|
|
179
|
-
private slotCenter;
|
|
180
|
-
/** The part of a slot the columns fill — the rest is the channel between categories. */
|
|
181
|
-
private get slotInner();
|
|
182
|
-
/** Series `i`'s live share of the slot; 0 once it has been hidden. */
|
|
183
|
-
private weightAt;
|
|
184
|
-
/** Total live share across the series — the slot's inner width divides by this. */
|
|
185
|
-
private get totalWeight();
|
|
186
|
-
/** Live share of every series *before* `index`, for the grouped offset. */
|
|
187
|
-
private weightBefore;
|
|
188
|
-
/**
|
|
189
|
-
* Series `index`'s columns, mapped into the plot's centred pixel space.
|
|
190
|
-
*
|
|
191
|
-
* Both modes come out of one walk over the rows: a grouped series divides the
|
|
192
|
-
* slot with its siblings and every column runs from zero, a stacked one takes
|
|
193
|
-
* the whole slot and each column runs from the running total below it. The
|
|
194
|
-
* live {@link weights} scale the grouped widths and the stacked contributions
|
|
195
|
-
* alike, which is what lets `hideSeries` reflow rather than punch a hole.
|
|
196
|
-
*/
|
|
197
|
-
private seriesBars;
|
|
198
|
-
/**
|
|
199
|
-
* `row` with each series' value scaled by that series' live {@link weights}
|
|
200
|
-
* entry — what the stacked spans are measured from.
|
|
201
|
-
*/
|
|
202
|
-
private weightedRow;
|
|
203
|
-
/**
|
|
204
|
-
* How far each category is dimmed by the spotlight, one entry per row —
|
|
205
|
-
* 1 while nothing is spotlit, falling to the theme's `dimOpacity` for every
|
|
206
|
-
* category but the chosen one as the reveal climbs.
|
|
207
|
-
*/
|
|
208
|
-
private categoryDims;
|
|
209
|
-
constructor(props?: NodeConfig<BarChart, BarChartProps>);
|
|
210
|
-
/**
|
|
211
|
-
* Prime every part at its pre-entrance state — axis markers and captions
|
|
212
|
-
* shifted and transparent, columns collapsed onto the baseline, legend dropped
|
|
213
|
-
* and transparent.
|
|
214
|
-
*
|
|
215
|
-
* Called by {@link enter} before its first frame so nothing flashes ahead of
|
|
216
|
-
* its beat. Idempotent, and public so a scene can hide a chart ahead of time
|
|
217
|
-
* without starting the entrance.
|
|
218
|
-
*/
|
|
219
|
-
arm(): void;
|
|
220
|
-
/**
|
|
221
|
-
* Animate the whole chart in: the two axes stagger their markers and captions
|
|
222
|
-
* in, the columns rise from the baseline, and the legend fades up last.
|
|
223
|
-
*
|
|
224
|
-
* `duration` is the **whole** entrance. The phases are shares of it, not
|
|
225
|
-
* multiples — a command that declares 1.4 seconds has to take 1.4 seconds,
|
|
226
|
-
* because that is the slot the timeline lays out for it, the length its
|
|
227
|
-
* parallel siblings are timed against, and its contribution to the scene's own
|
|
228
|
-
* duration.
|
|
229
|
-
*/
|
|
230
|
-
enter(args: CommandArgs<Record<string, never>> & {
|
|
231
|
-
duration: number;
|
|
232
|
-
}): Command<Record<string, never>>;
|
|
94
|
+
readonly spotlightReveal: 0;
|
|
95
|
+
/** Read as the chart is built: the legend is a part the chart builds or doesn't. */
|
|
96
|
+
readonly showLegend: import("@motionscript/sdk").Type<boolean, boolean, false>;
|
|
97
|
+
/** Read as the chart is built: whether each column prints the figure it plots. */
|
|
98
|
+
readonly showValues: import("@motionscript/sdk").Type<boolean, boolean, false>;
|
|
99
|
+
/** Whether each series' columns are drawn: on for every frame a show or hide covers, off once a hide lands. */
|
|
100
|
+
readonly showing: import("@motionscript/sdk").Type<boolean[], boolean[], false>;
|
|
101
|
+
}>, {
|
|
102
|
+
readonly enter: {};
|
|
103
|
+
readonly showSeries: {
|
|
104
|
+
readonly seriesIndex: import("@motionscript/sdk").Type<number, number, false>;
|
|
105
|
+
};
|
|
106
|
+
readonly hideSeries: {
|
|
107
|
+
readonly seriesIndex: import("@motionscript/sdk").Type<number, number, false>;
|
|
108
|
+
};
|
|
109
|
+
readonly spotlightSeries: {
|
|
110
|
+
readonly seriesIndex: import("@motionscript/sdk").Type<number, number, false>;
|
|
111
|
+
};
|
|
112
|
+
readonly spotlightCategory: {
|
|
113
|
+
readonly categoryIndex: import("@motionscript/sdk").Type<number, number, false>;
|
|
114
|
+
};
|
|
115
|
+
readonly clearCategory: {};
|
|
116
|
+
}, null, Node2D<Node2DProps>, import("@motionscript/sdk").CallProps<import("@motionscript/sdk").Merge<import("@motionscript/sdk").Box2DState, {
|
|
117
|
+
readonly data: import("@motionscript/sdk").Type<DataRecord[], DataRecord[], false>;
|
|
118
|
+
readonly categoryField: "";
|
|
119
|
+
readonly series: import("@motionscript/sdk").Type<import("../index.js").ChartSeries[], import("../index.js").ChartSeries[], false>;
|
|
120
|
+
readonly stacked: false;
|
|
121
|
+
readonly valueAxis: import("@motionscript/sdk").Type<AxisDomainConfig, AxisDomainConfig, false>;
|
|
122
|
+
readonly categoryAxis: import("@motionscript/sdk").Type<AxisDomainConfig, AxisDomainConfig, false>;
|
|
123
|
+
readonly theme: import("@motionscript/sdk").Type<BarChartTheme, BarChartConfig, false>;
|
|
233
124
|
/**
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
* continuously instead of cutting at the midpoint of the move.
|
|
237
|
-
*/
|
|
238
|
-
to<D extends Partial<BarChartProps> = Partial<BarChartProps>>(args: CommandArgs<D> & {
|
|
239
|
-
duration: number;
|
|
240
|
-
}): Command<BarChartProps>;
|
|
241
|
-
/** Tween {@link growth} `0 → 1`, raising every column about the baseline. */
|
|
242
|
-
private riseBars;
|
|
243
|
-
/**
|
|
244
|
-
* Show series `index`: bring its columns back, the group reflowing to make
|
|
245
|
-
* room as they arrive, in lockstep with its legend entry growing in.
|
|
246
|
-
*/
|
|
247
|
-
showSeries(args: CommandArgs<{
|
|
248
|
-
seriesIndex: number;
|
|
249
|
-
}>): Command<Record<string, never>>;
|
|
250
|
-
/**
|
|
251
|
-
* Hide series `index`: its columns narrow away (or, stacked, sink out of the
|
|
252
|
-
* stack) while the rest of the group widens into the space, its legend entry
|
|
253
|
-
* shrinking beside them — the mirror of {@link showSeries}.
|
|
254
|
-
*/
|
|
255
|
-
hideSeries(args: CommandArgs<{
|
|
256
|
-
seriesIndex: number;
|
|
257
|
-
}>): Command<Record<string, never>>;
|
|
258
|
-
/**
|
|
259
|
-
* Move series `index`'s slot share to `target`, with its legend entry.
|
|
260
|
-
*
|
|
261
|
-
* One method for both directions, so the pair cannot drift apart. `enabled`
|
|
262
|
-
* rides in the same value as the weight rather than being set before or after,
|
|
263
|
-
* which is what makes arriving at a time backwards show what arriving forwards
|
|
264
|
-
* does.
|
|
125
|
+
* Global rise of every column in `[0, 1]`, measured about the baseline: 0
|
|
126
|
+
* collapses them all onto it, 1 draws them at full length.
|
|
265
127
|
*/
|
|
266
|
-
|
|
128
|
+
readonly growth: 1;
|
|
267
129
|
/**
|
|
268
|
-
*
|
|
269
|
-
*
|
|
270
|
-
*
|
|
130
|
+
* How much of the slot each series claims, one entry per series: a weight
|
|
131
|
+
* rather than a switch, so hiding one is the others widening into the space.
|
|
132
|
+
* Seeded from each series' `enabled`.
|
|
271
133
|
*/
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
|
|
134
|
+
readonly weights: import("@motionscript/sdk").Type<number[], number[], false>;
|
|
135
|
+
/** The category spotlit, or `null` for none. The choice snaps; `spotlightReveal` is the animation. */
|
|
136
|
+
readonly spotlight: import("@motionscript/sdk").Type<number | null, number | null, false>;
|
|
137
|
+
/** How far the category spotlight is drawn in, `[0, 1]`. */
|
|
138
|
+
readonly spotlightReveal: 0;
|
|
139
|
+
/** Read as the chart is built: the legend is a part the chart builds or doesn't. */
|
|
140
|
+
readonly showLegend: import("@motionscript/sdk").Type<boolean, boolean, false>;
|
|
141
|
+
/** Read as the chart is built: whether each column prints the figure it plots. */
|
|
142
|
+
readonly showValues: import("@motionscript/sdk").Type<boolean, boolean, false>;
|
|
143
|
+
/** Whether each series' columns are drawn: on for every frame a show or hide covers, off once a hide lands. */
|
|
144
|
+
readonly showing: import("@motionscript/sdk").Type<boolean[], boolean[], false>;
|
|
145
|
+
}>, null, import("@motionscript/sdk").BuiltNode<import("@motionscript/sdk").Merge<import("@motionscript/sdk").Box2DState, {
|
|
146
|
+
readonly data: import("@motionscript/sdk").Type<DataRecord[], DataRecord[], false>;
|
|
147
|
+
readonly categoryField: "";
|
|
148
|
+
readonly series: import("@motionscript/sdk").Type<import("../index.js").ChartSeries[], import("../index.js").ChartSeries[], false>;
|
|
149
|
+
readonly stacked: false;
|
|
150
|
+
readonly valueAxis: import("@motionscript/sdk").Type<AxisDomainConfig, AxisDomainConfig, false>;
|
|
151
|
+
readonly categoryAxis: import("@motionscript/sdk").Type<AxisDomainConfig, AxisDomainConfig, false>;
|
|
152
|
+
readonly theme: import("@motionscript/sdk").Type<BarChartTheme, BarChartConfig, false>;
|
|
277
153
|
/**
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
* `dimOpacity`, and the chosen one stays full.
|
|
281
|
-
*
|
|
282
|
-
* The counterpart of the line chart's `spotlightRegion`, and the same shape of
|
|
283
|
-
* thing: it picks out a slice of the plot without changing what is drawn.
|
|
284
|
-
* Calling it while another category is already lit moves the focus directly —
|
|
285
|
-
* only the dimming changes, so there is nothing to retract first.
|
|
154
|
+
* Global rise of every column in `[0, 1]`, measured about the baseline: 0
|
|
155
|
+
* collapses them all onto it, 1 draws them at full length.
|
|
286
156
|
*/
|
|
287
|
-
|
|
288
|
-
categoryIndex: number;
|
|
289
|
-
}>): Command<CategorySpotlight>;
|
|
157
|
+
readonly growth: 1;
|
|
290
158
|
/**
|
|
291
|
-
*
|
|
292
|
-
*
|
|
293
|
-
*
|
|
159
|
+
* How much of the slot each series claims, one entry per series: a weight
|
|
160
|
+
* rather than a switch, so hiding one is the others widening into the space.
|
|
161
|
+
* Seeded from each series' `enabled`.
|
|
294
162
|
*/
|
|
295
|
-
|
|
296
|
-
/** The
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
163
|
+
readonly weights: import("@motionscript/sdk").Type<number[], number[], false>;
|
|
164
|
+
/** The category spotlit, or `null` for none. The choice snaps; `spotlightReveal` is the animation. */
|
|
165
|
+
readonly spotlight: import("@motionscript/sdk").Type<number | null, number | null, false>;
|
|
166
|
+
/** How far the category spotlight is drawn in, `[0, 1]`. */
|
|
167
|
+
readonly spotlightReveal: 0;
|
|
168
|
+
/** Read as the chart is built: the legend is a part the chart builds or doesn't. */
|
|
169
|
+
readonly showLegend: import("@motionscript/sdk").Type<boolean, boolean, false>;
|
|
170
|
+
/** Read as the chart is built: whether each column prints the figure it plots. */
|
|
171
|
+
readonly showValues: import("@motionscript/sdk").Type<boolean, boolean, false>;
|
|
172
|
+
/** Whether each series' columns are drawn: on for every frame a show or hide covers, off once a hide lands. */
|
|
173
|
+
readonly showing: import("@motionscript/sdk").Type<boolean[], boolean[], false>;
|
|
174
|
+
}>, {
|
|
175
|
+
readonly enter: {};
|
|
176
|
+
readonly showSeries: {
|
|
177
|
+
readonly seriesIndex: import("@motionscript/sdk").Type<number, number, false>;
|
|
178
|
+
};
|
|
179
|
+
readonly hideSeries: {
|
|
180
|
+
readonly seriesIndex: import("@motionscript/sdk").Type<number, number, false>;
|
|
181
|
+
};
|
|
182
|
+
readonly spotlightSeries: {
|
|
183
|
+
readonly seriesIndex: import("@motionscript/sdk").Type<number, number, false>;
|
|
184
|
+
};
|
|
185
|
+
readonly spotlightCategory: {
|
|
186
|
+
readonly categoryIndex: import("@motionscript/sdk").Type<number, number, false>;
|
|
187
|
+
};
|
|
188
|
+
readonly clearCategory: {};
|
|
189
|
+
}, Node2D<Node2DProps>>>>;
|
|
190
|
+
export type BarChart = NodeOf<typeof BarChart>;
|
|
300
191
|
//# sourceMappingURL=bar-chart.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bar-chart.d.ts","sourceRoot":"","sources":["../../src/bar-chart/bar-chart.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"bar-chart.d.ts","sourceRoot":"","sources":["../../src/bar-chart/bar-chart.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,UAAU,EAEf,KAAK,MAAM,EAEX,KAAK,MAAM,EACX,KAAK,WAAW,EAGjB,MAAM,mBAAmB,CAAA;AAU1B,OAAO,EAUL,KAAK,gBAAgB,EACrB,KAAK,KAAK,EACX,MAAM,eAAe,CAAA;AAGtB,OAAO,EASL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,aAAc,SAAQ,WAAW;IAChD,oEAAoE;IACpE,IAAI,EAAE,UAAU,EAAE,CAAA;IAClB;;;;OAIG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB,gFAAgF;IAChF,MAAM,EAAE,SAAS,EAAE,CAAA;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,yEAAyE;IACzE,SAAS,CAAC,EAAE,gBAAgB,CAAA;IAC5B,qFAAqF;IACrF,YAAY,CAAC,EAAE,gBAAgB,CAAA;IAC/B;;;;OAIG;IACH,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,sDAAsD;IACtD,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,sDAAsD;AACtD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAA;CACrC;AAED,iEAAiE;AACjE,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAmCnG,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,CAAC,EAAE,cAAc,GAAG,cAAc,CAEhE;AA8ID;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,QAAQ;;;;;;;;IAUjB;;;OAGG;;IAEH;;;;OAIG;;IAEH,sGAAsG;;IAEtG,4DAA4D;;IAE5D,oFAAoF;;IAEpF,kFAAkF;;IAElF,+GAA+G;;;;;;;;;;;;;;;;;;;;;;;;;IAnB/G;;;OAGG;;IAEH;;;;OAIG;;IAEH,sGAAsG;;IAEtG,4DAA4D;;IAE5D,oFAAoF;;IAEpF,kFAAkF;;IAElF,+GAA+G;;;;;;;;;;IAnB/G;;;OAGG;;IAEH;;;;OAIG;;IAEH,sGAAsG;;IAEtG,4DAA4D;;IAE5D,oFAAoF;;IAEpF,kFAAkF;;IAElF,+GAA+G;;;;;;;;;;;;;;;;;yBA6MjH,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,QAAQ,CAAC,CAAA"}
|