@silverpoint/core 0.2.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/catalog.d.ts +97 -0
- package/dist/catalog.js +8002 -0
- package/dist/catalog.js.map +1 -0
- package/dist/chunk-KFBSQH5G.js +34 -0
- package/dist/chunk-KFBSQH5G.js.map +1 -0
- package/dist/chunk-OLYKR5PS.js +632 -0
- package/dist/chunk-OLYKR5PS.js.map +1 -0
- package/dist/chunk-PD4MD7JU.js +170 -0
- package/dist/chunk-PD4MD7JU.js.map +1 -0
- package/dist/dashboard-demos.d.ts +2 -1
- package/dist/index.d.ts +10 -55
- package/dist/index.js +36 -793
- package/dist/index.js.map +1 -1
- package/dist/model-CLhtoG75.d.ts +53 -0
- package/dist/{types-D1hjElfL.d.ts → props-Dq8FC8GG.d.ts} +369 -143
- package/dist/types-B81k-s9_.d.ts +148 -0
- package/dist/ui-demos.d.ts +17 -0
- package/dist/ui-demos.js +129 -0
- package/dist/ui-demos.js.map +1 -0
- package/dist/ui.d.ts +545 -0
- package/dist/ui.js +716 -0
- package/dist/ui.js.map +1 -0
- package/package.json +19 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// src/config/resolve.ts
|
|
2
|
+
var DEFAULTS = Object.freeze({
|
|
3
|
+
ground: "silverpoint",
|
|
4
|
+
substrate: "cream",
|
|
5
|
+
mode: "ink",
|
|
6
|
+
chrome: "card",
|
|
7
|
+
hatchFill: "tile",
|
|
8
|
+
height: 160,
|
|
9
|
+
dataTable: "hidden",
|
|
10
|
+
locale: "en"
|
|
11
|
+
});
|
|
12
|
+
function resolveConfig(props, provider = {}, environment = {}) {
|
|
13
|
+
const mode = environment.forcedPrecision ? "precision" : props.mode ?? provider.mode ?? DEFAULTS.mode;
|
|
14
|
+
return {
|
|
15
|
+
ground: props.ground ?? provider.ground ?? DEFAULTS.ground,
|
|
16
|
+
substrate: props.substrate ?? provider.substrate ?? DEFAULTS.substrate,
|
|
17
|
+
mode,
|
|
18
|
+
chrome: props.chrome ?? DEFAULTS.chrome,
|
|
19
|
+
hatchFill: props.hatchFill ?? DEFAULTS.hatchFill,
|
|
20
|
+
height: props.height ?? DEFAULTS.height,
|
|
21
|
+
dataTable: props.dataTable ?? DEFAULTS.dataTable,
|
|
22
|
+
locale: props.locale ?? provider.locale ?? environment.locale ?? DEFAULTS.locale
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
var FORCED_PRECISION_QUERY = "(prefers-contrast: more), (forced-colors: active)";
|
|
26
|
+
function instanceId(chart, token) {
|
|
27
|
+
const slug = chart.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
28
|
+
const safe = String(token).replace(/[^A-Za-z0-9_-]/g, "");
|
|
29
|
+
return `sp-${slug}-${safe}`;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { DEFAULTS, FORCED_PRECISION_QUERY, instanceId, resolveConfig };
|
|
33
|
+
//# sourceMappingURL=chunk-KFBSQH5G.js.map
|
|
34
|
+
//# sourceMappingURL=chunk-KFBSQH5G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/resolve.ts"],"names":[],"mappings":";AAcO,IAAM,QAAA,GAAW,OAAO,MAAA,CAAO;AAAA,EACpC,MAAA,EAAQ,aAAA;AAAA,EACR,SAAA,EAAW,OAAA;AAAA,EACX,IAAA,EAAM,KAAA;AAAA,EACN,MAAA,EAAQ,MAAA;AAAA,EACR,SAAA,EAAW,MAAA;AAAA,EACX,MAAA,EAAQ,GAAA;AAAA,EACR,SAAA,EAAW,QAAA;AAAA,EACX,MAAA,EAAQ;AACV,CAAU;AAOH,SAAS,cACd,KAAA,EACA,QAAA,GAA2B,EAAC,EAC5B,WAAA,GAAgF,EAAC,EACjE;AAChB,EAAA,MAAM,IAAA,GAAgB,YAAY,eAAA,GAC9B,WAAA,GACC,MAAM,IAAA,IAAQ,QAAA,CAAS,QAAQ,QAAA,CAAS,IAAA;AAC7C,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,QAAA,CAAS,UAAU,QAAA,CAAS,MAAA;AAAA,IACpD,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,QAAA,CAAS,aAAa,QAAA,CAAS,SAAA;AAAA,IAC7D,IAAA;AAAA,IACA,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,QAAA,CAAS,MAAA;AAAA,IACjC,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,QAAA,CAAS,SAAA;AAAA,IACvC,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,QAAA,CAAS,MAAA;AAAA,IACjC,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,QAAA,CAAS,SAAA;AAAA,IACvC,QAAQ,KAAA,CAAM,MAAA,IAAU,SAAS,MAAA,IAAU,WAAA,CAAY,UAAU,QAAA,CAAS;AAAA,GAC5E;AACF;AAGO,IAAM,sBAAA,GAAyB;AAM/B,SAAS,UAAA,CAAW,OAAe,KAAA,EAAgC;AACxE,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,oBAAA,EAAsB,OAAO,EAAE,WAAA,EAAY;AACtE,EAAA,MAAM,OAAO,MAAA,CAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,mBAAmB,EAAE,CAAA;AACxD,EAAA,OAAO,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAC3B","file":"chunk-KFBSQH5G.js","sourcesContent":["import type { CommonChartProps, GroundRef, InkMode, ProviderConfig, SubstrateName } from '../types';\n\nexport interface ResolvedConfig {\n readonly ground: GroundRef;\n readonly substrate: SubstrateName;\n readonly mode: InkMode;\n readonly chrome: 'card' | 'bare';\n readonly hatchFill: 'tile' | 'per-shape';\n readonly height: number;\n readonly dataTable: 'visible' | 'hidden' | 'none';\n readonly locale: string;\n}\n\n/** Default values, part of the contract (API Spec §5.1). */\nexport const DEFAULTS = Object.freeze({\n ground: 'silverpoint',\n substrate: 'cream',\n mode: 'ink',\n chrome: 'card',\n hatchFill: 'tile',\n height: 160,\n dataTable: 'hidden',\n locale: 'en',\n} as const);\n\n/**\n * Resolves `ground`, `substrate` and `mode` with the precedence of API Spec §5.1: chart prop,\n * then provider, then library default — except that a media query forcing precision wins\n * over everything, because it is an accessibility requirement (REQ-123).\n */\nexport function resolveConfig(\n props: CommonChartProps,\n provider: ProviderConfig = {},\n environment: { readonly forcedPrecision?: boolean; readonly locale?: string } = {},\n): ResolvedConfig {\n const mode: InkMode = environment.forcedPrecision\n ? 'precision'\n : (props.mode ?? provider.mode ?? DEFAULTS.mode);\n return {\n ground: props.ground ?? provider.ground ?? DEFAULTS.ground,\n substrate: props.substrate ?? provider.substrate ?? DEFAULTS.substrate,\n mode,\n chrome: props.chrome ?? DEFAULTS.chrome,\n hatchFill: props.hatchFill ?? DEFAULTS.hatchFill,\n height: props.height ?? DEFAULTS.height,\n dataTable: props.dataTable ?? DEFAULTS.dataTable,\n locale: props.locale ?? provider.locale ?? environment.locale ?? DEFAULTS.locale,\n };\n}\n\n/** Media query under which the environment forces `precision` mode (REQ-123). */\nexport const FORCED_PRECISION_QUERY = '(prefers-contrast: more), (forced-colors: active)';\n\n/**\n * Builds a deterministic instance id from the chart name and a token the adapter owns, such\n * as React's `useId()` or Angular's creation order. The result is safe inside `id` and `url()`.\n */\nexport function instanceId(chart: string, token: string | number): string {\n const slug = chart.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();\n const safe = String(token).replace(/[^A-Za-z0-9_-]/g, '');\n return `sp-${slug}-${safe}`;\n}\n"]}
|
|
@@ -0,0 +1,632 @@
|
|
|
1
|
+
import { scaleLinear, scaleBand } from 'd3-scale';
|
|
2
|
+
|
|
3
|
+
// src/render/round.ts
|
|
4
|
+
function round2(value) {
|
|
5
|
+
const rounded = Math.round(value * 100) / 100;
|
|
6
|
+
return Object.is(rounded, -0) ? 0 : rounded;
|
|
7
|
+
}
|
|
8
|
+
var NUMBER = /-?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?/g;
|
|
9
|
+
function roundPathData(d) {
|
|
10
|
+
return d.replace(NUMBER, (token) => String(round2(Number(token))));
|
|
11
|
+
}
|
|
12
|
+
function roundRect(rect) {
|
|
13
|
+
return {
|
|
14
|
+
x: round2(rect.x),
|
|
15
|
+
y: round2(rect.y),
|
|
16
|
+
width: round2(rect.width),
|
|
17
|
+
height: round2(rect.height)
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function roundStroke(stroke) {
|
|
21
|
+
return { ...stroke, d: roundPathData(stroke.d) };
|
|
22
|
+
}
|
|
23
|
+
function roundTile(tile) {
|
|
24
|
+
return {
|
|
25
|
+
...tile,
|
|
26
|
+
width: round2(tile.width),
|
|
27
|
+
height: round2(tile.height),
|
|
28
|
+
angle: round2(tile.angle),
|
|
29
|
+
strokes: tile.strokes.map(roundStroke)
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function roundGeometry(geometry) {
|
|
33
|
+
return {
|
|
34
|
+
viewBox: roundRect(geometry.viewBox),
|
|
35
|
+
plot: roundRect(geometry.plot),
|
|
36
|
+
strokes: geometry.strokes.map(roundStroke),
|
|
37
|
+
labels: geometry.labels.map((label) => ({ ...label, x: round2(label.x), y: round2(label.y) })),
|
|
38
|
+
hitAreas: geometry.hitAreas.map((hit) => ({
|
|
39
|
+
...hit,
|
|
40
|
+
x: round2(hit.x),
|
|
41
|
+
y: round2(hit.y),
|
|
42
|
+
...hit.box ? { box: roundRect(hit.box) } : {}
|
|
43
|
+
})),
|
|
44
|
+
defs: geometry.defs.map(roundTile)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// src/render/seed.ts
|
|
49
|
+
var FNV_OFFSET_BASIS = 2166136261;
|
|
50
|
+
var FNV_PRIME = 16777619;
|
|
51
|
+
function utf8Bytes(input) {
|
|
52
|
+
const bytes = [];
|
|
53
|
+
for (const char of input) {
|
|
54
|
+
const code = char.codePointAt(0) ?? 0;
|
|
55
|
+
if (code < 128) {
|
|
56
|
+
bytes.push(code);
|
|
57
|
+
} else if (code < 2048) {
|
|
58
|
+
bytes.push(192 | code >> 6, 128 | code & 63);
|
|
59
|
+
} else if (code < 65536) {
|
|
60
|
+
bytes.push(224 | code >> 12, 128 | code >> 6 & 63, 128 | code & 63);
|
|
61
|
+
} else {
|
|
62
|
+
bytes.push(
|
|
63
|
+
240 | code >> 18,
|
|
64
|
+
128 | code >> 12 & 63,
|
|
65
|
+
128 | code >> 6 & 63,
|
|
66
|
+
128 | code & 63
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return bytes;
|
|
71
|
+
}
|
|
72
|
+
function fnv1a32(input) {
|
|
73
|
+
let hash = FNV_OFFSET_BASIS;
|
|
74
|
+
for (const byte of utf8Bytes(input)) {
|
|
75
|
+
hash ^= byte;
|
|
76
|
+
hash = Math.imul(hash, FNV_PRIME);
|
|
77
|
+
}
|
|
78
|
+
return hash >>> 0;
|
|
79
|
+
}
|
|
80
|
+
function deriveSeed(id) {
|
|
81
|
+
return fnv1a32(id);
|
|
82
|
+
}
|
|
83
|
+
function resolveSeed(seed, id) {
|
|
84
|
+
if (seed === void 0) return deriveSeed(id);
|
|
85
|
+
if (typeof seed === "string") return fnv1a32(seed);
|
|
86
|
+
return Number.isFinite(seed) ? Math.trunc(seed) >>> 0 : 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// src/diagnostics/diagnose.ts
|
|
90
|
+
var SilverpointError = class extends Error {
|
|
91
|
+
code;
|
|
92
|
+
constructor(code, message) {
|
|
93
|
+
super(message);
|
|
94
|
+
this.name = "SilverpointError";
|
|
95
|
+
this.code = code;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
var consoleSink = (_code, message) => {
|
|
99
|
+
console.warn(message);
|
|
100
|
+
};
|
|
101
|
+
var sink = consoleSink;
|
|
102
|
+
var reported = /* @__PURE__ */ new Set();
|
|
103
|
+
function __setDiagnosticSink(next) {
|
|
104
|
+
sink = next ?? consoleSink;
|
|
105
|
+
reported.clear();
|
|
106
|
+
return () => {
|
|
107
|
+
sink = consoleSink;
|
|
108
|
+
reported.clear();
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
function format(code, chart, detail, template) {
|
|
112
|
+
const specifics = detail.message ? ` ${detail.message}` : "";
|
|
113
|
+
return `[${code}] ${chart}: ${template.what} (\`${detail.property}\`).${specifics} ${template.todo}. (${template.req})`;
|
|
114
|
+
}
|
|
115
|
+
var ERRORS = {
|
|
116
|
+
SP009: {
|
|
117
|
+
req: "REQ-097",
|
|
118
|
+
what: "a scale bound cannot be derived from the data and was not supplied",
|
|
119
|
+
todo: "Pass the named property explicitly"
|
|
120
|
+
},
|
|
121
|
+
SP012: {
|
|
122
|
+
req: "REQ-127",
|
|
123
|
+
what: "the ground does not reach the minimum contrast",
|
|
124
|
+
todo: "Recompute the palette; colours are not chosen by eye"
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
function diagnose(code, chart, detail) {
|
|
128
|
+
const error = ERRORS[code];
|
|
129
|
+
if (error) {
|
|
130
|
+
throw new SilverpointError(code, format(code, chart, detail, error));
|
|
131
|
+
}
|
|
132
|
+
if (process.env.NODE_ENV !== "production") {
|
|
133
|
+
developmentDiagnose(code, chart, detail);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function developmentDiagnose(code, chart, detail) {
|
|
137
|
+
const template = WARNINGS[code];
|
|
138
|
+
if (!template) return;
|
|
139
|
+
const message = format(code, chart, detail, template);
|
|
140
|
+
if (code === "SP005") {
|
|
141
|
+
throw new SilverpointError(code, message);
|
|
142
|
+
}
|
|
143
|
+
if (reported.has(message)) return;
|
|
144
|
+
reported.add(message);
|
|
145
|
+
sink(code, message);
|
|
146
|
+
}
|
|
147
|
+
var WARNINGS = {
|
|
148
|
+
SP001: {
|
|
149
|
+
req: "REQ-007",
|
|
150
|
+
what: "the dataset is empty; the ground's empty state is drawn",
|
|
151
|
+
todo: "Pass at least one row, or omit `data` to see the demo dataset"
|
|
152
|
+
},
|
|
153
|
+
SP002: {
|
|
154
|
+
req: "REQ-008",
|
|
155
|
+
what: "a value cannot be drawn as given (null, not finite, or outside the data contract); it is corrected or omitted",
|
|
156
|
+
todo: "Check the value against the chart's data contract (Data Model \xA72)"
|
|
157
|
+
},
|
|
158
|
+
SP003: {
|
|
159
|
+
req: "REQ-009",
|
|
160
|
+
what: "the container measures 0 px; the render is deferred",
|
|
161
|
+
todo: "Give the container a size, or pin `width` and `height`"
|
|
162
|
+
},
|
|
163
|
+
SP004: {
|
|
164
|
+
req: "REQ-010",
|
|
165
|
+
what: "the scale domain has zero length; it is expanded with the ground's domainPadding",
|
|
166
|
+
todo: "Nothing to do if the data is constant; otherwise check the accessor"
|
|
167
|
+
},
|
|
168
|
+
SP005: {
|
|
169
|
+
req: "REQ-025",
|
|
170
|
+
what: "more than one element is marked with white heightening; only the first is applied",
|
|
171
|
+
todo: "Heighten a single element per chart"
|
|
172
|
+
},
|
|
173
|
+
SP006: {
|
|
174
|
+
req: "REQ-026",
|
|
175
|
+
what: "the inker is not registered; falling back to NullInker",
|
|
176
|
+
todo: "Register the inker or fix the ground's `inker` token"
|
|
177
|
+
},
|
|
178
|
+
SP007: {
|
|
179
|
+
req: "REQ-045",
|
|
180
|
+
what: "the ground is not registered; falling back to silverpoint",
|
|
181
|
+
todo: "Call registerGround() before rendering, or fix the name"
|
|
182
|
+
},
|
|
183
|
+
SP008: {
|
|
184
|
+
req: "REQ-096",
|
|
185
|
+
what: "the data volume is above the family's threshold",
|
|
186
|
+
todo: "Aggregate the data before charting it"
|
|
187
|
+
},
|
|
188
|
+
SP010: {
|
|
189
|
+
req: "REQ-091",
|
|
190
|
+
what: "the chord ring has more than 12 categories",
|
|
191
|
+
todo: "Group the smaller categories"
|
|
192
|
+
},
|
|
193
|
+
SP011: {
|
|
194
|
+
req: "NFR \xA77",
|
|
195
|
+
what: "the path byte budget of 40 KB is exceeded",
|
|
196
|
+
todo: "Use `hatchFill: 'tile'` or a larger hatch gap"
|
|
197
|
+
},
|
|
198
|
+
SP014: {
|
|
199
|
+
req: "REQ-204",
|
|
200
|
+
what: "a dashboard cell spans more columns than the breakpoint has; it is clamped",
|
|
201
|
+
todo: "Lower the span, or give that breakpoint more columns"
|
|
202
|
+
},
|
|
203
|
+
SP015: {
|
|
204
|
+
req: "REQ-205",
|
|
205
|
+
what: "the dashboard layout and its children disagree; unmatched children are placed in source order, span 1",
|
|
206
|
+
todo: "Give every child a `cell` the layout declares, once"
|
|
207
|
+
},
|
|
208
|
+
SP016: {
|
|
209
|
+
req: "REQ-217",
|
|
210
|
+
what: "a chart in a linked dashboard has no field named by `link.key`; it shows no linked mark",
|
|
211
|
+
todo: "Link on a field every linked chart carries, or leave this chart out of the link"
|
|
212
|
+
},
|
|
213
|
+
SP017: {
|
|
214
|
+
req: "REQ-324",
|
|
215
|
+
what: "a value or a range cannot be drawn as given; it is clamped, rounded to its step or defaulted",
|
|
216
|
+
todo: "Keep the value within `min`..`max` and on `step`, with `min < max` and `step > 0`"
|
|
217
|
+
},
|
|
218
|
+
SP018: {
|
|
219
|
+
req: "REQ-319",
|
|
220
|
+
what: "the component has no accessible name: no text content and no `label`",
|
|
221
|
+
todo: "Give it visible text, or a `label` for an icon-only control"
|
|
222
|
+
},
|
|
223
|
+
SP019: {
|
|
224
|
+
req: "REQ-325",
|
|
225
|
+
what: "items share a key, or have none; the first is kept and the later ones are skipped",
|
|
226
|
+
todo: "Give every item a unique, non-empty `key`"
|
|
227
|
+
},
|
|
228
|
+
SP020: {
|
|
229
|
+
req: "REQ-437",
|
|
230
|
+
what: "the hierarchy is invalid (a duplicate or empty `id`, a missing `parent`, a cycle, or several roots); the offending rows are dropped",
|
|
231
|
+
todo: "Give every row a unique `id` and an existing `parent`, under a single root"
|
|
232
|
+
},
|
|
233
|
+
SP021: {
|
|
234
|
+
req: "REQ-433",
|
|
235
|
+
what: "a statistic parameter is invalid; its default is used",
|
|
236
|
+
todo: "Keep the parameter in its documented range"
|
|
237
|
+
},
|
|
238
|
+
SP022: {
|
|
239
|
+
req: "REQ-434",
|
|
240
|
+
what: "a group has too few observations for its statistic; they are drawn as points",
|
|
241
|
+
todo: "Give the group more observations, or expect it drawn as points"
|
|
242
|
+
},
|
|
243
|
+
SP013: {
|
|
244
|
+
req: "REQ-032",
|
|
245
|
+
what: "the @silverpoint/fonts face failed to load; rendering fell back to the system stack",
|
|
246
|
+
todo: "Install @silverpoint/fonts and import its stylesheet; golden images will not match until then"
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
// src/scales/util.ts
|
|
251
|
+
function min(values) {
|
|
252
|
+
let result;
|
|
253
|
+
for (const value of values) {
|
|
254
|
+
if (Number.isFinite(value) && (result === void 0 || value < result)) result = value;
|
|
255
|
+
}
|
|
256
|
+
return result;
|
|
257
|
+
}
|
|
258
|
+
function max(values) {
|
|
259
|
+
let result;
|
|
260
|
+
for (const value of values) {
|
|
261
|
+
if (Number.isFinite(value) && (result === void 0 || value > result)) result = value;
|
|
262
|
+
}
|
|
263
|
+
return result;
|
|
264
|
+
}
|
|
265
|
+
function extent(values) {
|
|
266
|
+
const low = min(values);
|
|
267
|
+
const high = max(values);
|
|
268
|
+
return low === void 0 || high === void 0 ? void 0 : [low, high];
|
|
269
|
+
}
|
|
270
|
+
function expandDomain(domain, padding, site, fromZero = false) {
|
|
271
|
+
const [low, high] = domain;
|
|
272
|
+
if (low !== high) return [low, high];
|
|
273
|
+
const spread = low === 0 ? padding : Math.abs(low) * padding;
|
|
274
|
+
if (fromZero && low === 0) {
|
|
275
|
+
if (process.env.NODE_ENV !== "production") {
|
|
276
|
+
diagnose("SP004", site.chart, { property: site.property, message: `Domain [0, 0] became [0, ${2 * spread}].` });
|
|
277
|
+
}
|
|
278
|
+
return [0, 2 * spread];
|
|
279
|
+
}
|
|
280
|
+
if (process.env.NODE_ENV !== "production") {
|
|
281
|
+
diagnose("SP004", site.chart, {
|
|
282
|
+
property: site.property,
|
|
283
|
+
message: `Domain [${low}, ${high}] became [${low - spread}, ${high + spread}].`
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
return [low - spread, high + spread];
|
|
287
|
+
}
|
|
288
|
+
function linearScale(domain, range, options) {
|
|
289
|
+
const expanded = expandDomain(domain, options.padding, options, options.fromZero);
|
|
290
|
+
const scale = scaleLinear().domain(expanded).range(range);
|
|
291
|
+
if (options.nice) scale.nice(4);
|
|
292
|
+
const [low, high] = scale.domain();
|
|
293
|
+
const result = ((value) => scale(value));
|
|
294
|
+
Object.defineProperty(result, "domain", { value: [low, high] });
|
|
295
|
+
result.ticks = (count) => scale.ticks(count);
|
|
296
|
+
return result;
|
|
297
|
+
}
|
|
298
|
+
function bandScale(domain, range, options = {}) {
|
|
299
|
+
const scale = scaleBand().domain(domain).range(range).paddingInner(options.paddingInner ?? 0).paddingOuter(options.paddingOuter ?? 0);
|
|
300
|
+
const bandwidth = scale.bandwidth();
|
|
301
|
+
const result = ((value) => scale(value));
|
|
302
|
+
Object.defineProperty(result, "bandwidth", { value: bandwidth });
|
|
303
|
+
result.center = (value) => {
|
|
304
|
+
const start = scale(value);
|
|
305
|
+
return start === void 0 ? void 0 : start + bandwidth / 2;
|
|
306
|
+
};
|
|
307
|
+
return result;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// src/charts/shared/format.ts
|
|
311
|
+
function read(accessor, datum, index) {
|
|
312
|
+
return typeof accessor === "function" ? accessor(datum, index) : datum[accessor];
|
|
313
|
+
}
|
|
314
|
+
function accessorName(accessor, fallback) {
|
|
315
|
+
return typeof accessor === "string" ? accessor : fallback;
|
|
316
|
+
}
|
|
317
|
+
var FORMATTERS = /* @__PURE__ */ new Map();
|
|
318
|
+
var MAX_FORMATTERS = 64;
|
|
319
|
+
function formatNumber(value, locale, options) {
|
|
320
|
+
const resolved = options ?? { maximumFractionDigits: 2 };
|
|
321
|
+
const read2 = [];
|
|
322
|
+
for (const name in resolved) read2.push(`${name}=${JSON.stringify(resolved[name])}`);
|
|
323
|
+
const key = `${locale}|${read2.sort().join("&")}`;
|
|
324
|
+
let formatter = FORMATTERS.get(key);
|
|
325
|
+
if (!formatter) {
|
|
326
|
+
if (FORMATTERS.size >= MAX_FORMATTERS) FORMATTERS.clear();
|
|
327
|
+
formatter = new Intl.NumberFormat(locale, resolved);
|
|
328
|
+
FORMATTERS.set(key, formatter);
|
|
329
|
+
}
|
|
330
|
+
return formatter.format(value);
|
|
331
|
+
}
|
|
332
|
+
function numberFormatter(locale, options) {
|
|
333
|
+
const formatter = new Intl.NumberFormat(locale, options ?? { maximumFractionDigits: 2 });
|
|
334
|
+
return (value) => formatter.format(value);
|
|
335
|
+
}
|
|
336
|
+
function formatValue(value, locale, options) {
|
|
337
|
+
if (typeof value === "number") {
|
|
338
|
+
return Number.isFinite(value) ? formatNumber(value, locale, options) : "\u2014";
|
|
339
|
+
}
|
|
340
|
+
return value === null || value === void 0 ? "\u2014" : String(value);
|
|
341
|
+
}
|
|
342
|
+
function formatCategory(value, locale) {
|
|
343
|
+
return formatValue(value, locale, typeof value === "number" ? { useGrouping: false, maximumFractionDigits: 2 } : void 0);
|
|
344
|
+
}
|
|
345
|
+
function circlePath(cx, cy, r) {
|
|
346
|
+
return `M${cx - r},${cy}A${r},${r},0,1,0,${cx + r},${cy}A${r},${r},0,1,0,${cx - r},${cy}Z`;
|
|
347
|
+
}
|
|
348
|
+
function signedChange(change, format2) {
|
|
349
|
+
if (change > 0) return `+${format2(change)}`;
|
|
350
|
+
if (change < 0) return `\u2212${format2(-change)}`;
|
|
351
|
+
return format2(0);
|
|
352
|
+
}
|
|
353
|
+
var CHAR = 5.2;
|
|
354
|
+
function fitText(text, width) {
|
|
355
|
+
const fits = Math.max(Math.floor(width / CHAR), 2);
|
|
356
|
+
return text.length > fits ? `${text.slice(0, fits - 1)}\u2026` : text;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// src/charts/shared/cells.ts
|
|
360
|
+
function rectPath(rect) {
|
|
361
|
+
const { x, y, width, height } = rect;
|
|
362
|
+
return `M${x},${y}H${x + width}V${y + height}H${x}Z`;
|
|
363
|
+
}
|
|
364
|
+
function inset(rect, by) {
|
|
365
|
+
return {
|
|
366
|
+
x: rect.x + by,
|
|
367
|
+
y: rect.y + by,
|
|
368
|
+
width: Math.max(rect.width - 2 * by, 0),
|
|
369
|
+
height: Math.max(rect.height - 2 * by, 0)
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
function finite(raw) {
|
|
373
|
+
return typeof raw === "number" && Number.isFinite(raw) ? raw : void 0;
|
|
374
|
+
}
|
|
375
|
+
function toneOf(ratio) {
|
|
376
|
+
if (!(ratio > 0)) return 0;
|
|
377
|
+
if (ratio <= 0.25) return 1;
|
|
378
|
+
if (ratio <= 0.5) return 2;
|
|
379
|
+
if (ratio <= 0.75) return 3;
|
|
380
|
+
return 4;
|
|
381
|
+
}
|
|
382
|
+
var TONE_SCALE = { 0: 0.4, 1: 0.55, 2: 0.7, 3: 0.85, 4: 1 };
|
|
383
|
+
function toneLevel(raw) {
|
|
384
|
+
return Math.min(Math.max(Math.round(raw), 0), 4);
|
|
385
|
+
}
|
|
386
|
+
function warnValue(chart, property, message) {
|
|
387
|
+
if (process.env.NODE_ENV !== "production") diagnose("SP002", chart, { property, message });
|
|
388
|
+
}
|
|
389
|
+
var RING_TONES = [1, 2, 3, 4];
|
|
390
|
+
function ringTone(index, count) {
|
|
391
|
+
const tone = RING_TONES[index % RING_TONES.length];
|
|
392
|
+
if (count > 1 && index === count - 1 && tone === RING_TONES[0]) return RING_TONES[2];
|
|
393
|
+
return tone;
|
|
394
|
+
}
|
|
395
|
+
function ringTones(values) {
|
|
396
|
+
const drawn = values.filter((v) => v > 0).length;
|
|
397
|
+
let k = 0;
|
|
398
|
+
return values.map((v) => v > 0 ? ringTone(k++, drawn) : ringTone(Math.min(k, Math.max(drawn - 1, 0)), drawn));
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// src/charts/shared/cartesian.ts
|
|
402
|
+
var AXIS_BAND = 20;
|
|
403
|
+
var PLOT_INSET = 6;
|
|
404
|
+
var LABEL_SPACING = 48;
|
|
405
|
+
function cartesianPlot(area) {
|
|
406
|
+
return {
|
|
407
|
+
x: area.x + PLOT_INSET,
|
|
408
|
+
y: area.y + PLOT_INSET,
|
|
409
|
+
width: Math.max(area.width - 2 * PLOT_INSET, 1),
|
|
410
|
+
height: Math.max(area.height - AXIS_BAND - PLOT_INSET, 1)
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
function readSeries(data, accessor, fallbackName) {
|
|
414
|
+
let missing = 0;
|
|
415
|
+
const points = data.map((datum, index) => {
|
|
416
|
+
const raw = read(accessor, datum, index);
|
|
417
|
+
const value = typeof raw === "number" && Number.isFinite(raw) ? raw : void 0;
|
|
418
|
+
if (value === void 0) missing += 1;
|
|
419
|
+
return { index, datum, value };
|
|
420
|
+
});
|
|
421
|
+
return { key: accessorName(accessor, fallbackName), points, missing };
|
|
422
|
+
}
|
|
423
|
+
var POINTS_PER_SERIES = 500;
|
|
424
|
+
function checkVolume(chart, series) {
|
|
425
|
+
for (const s of series) checkCount(chart, s.key, s.points.length);
|
|
426
|
+
}
|
|
427
|
+
function checkCount(chart, property, count) {
|
|
428
|
+
if (process.env.NODE_ENV === "production" || count <= POINTS_PER_SERIES) return;
|
|
429
|
+
diagnose("SP008", chart, { property, message: `${count} points; the ceiling is ${POINTS_PER_SERIES} per series.` });
|
|
430
|
+
}
|
|
431
|
+
function seriesValues(series) {
|
|
432
|
+
return series.flatMap((s) => s.points.flatMap((p) => p.value === void 0 ? [] : [p.value]));
|
|
433
|
+
}
|
|
434
|
+
function valueAxis(plot, domain, options) {
|
|
435
|
+
const bottom = plot.y + plot.height;
|
|
436
|
+
const low = options.zero === false ? domain[0] : Math.min(0, domain[0]);
|
|
437
|
+
const high = options.zero === false ? domain[1] : Math.max(0, domain[1]);
|
|
438
|
+
const scale = linearScale([low, high], [bottom, plot.y], {
|
|
439
|
+
chart: options.chart,
|
|
440
|
+
property: options.property,
|
|
441
|
+
padding: options.padding,
|
|
442
|
+
nice: options.nice !== false,
|
|
443
|
+
fromZero: options.zero !== false
|
|
444
|
+
});
|
|
445
|
+
const strokes = [];
|
|
446
|
+
const labels = [];
|
|
447
|
+
for (const tick of scale.ticks(4)) {
|
|
448
|
+
const ty = scale(tick);
|
|
449
|
+
if (tick === scale.domain[0]) continue;
|
|
450
|
+
strokes.push({ d: `M${plot.x},${ty}H${plot.x + plot.width}`, role: "ornament", part: "grid" });
|
|
451
|
+
labels.push({ x: plot.x, y: ty - 3, text: formatNumber(tick, options.locale, options.numberFormat), kind: "tick", part: "axis", anchor: "start" });
|
|
452
|
+
}
|
|
453
|
+
strokes.push({ d: `M${plot.x},${bottom}H${plot.x + plot.width}`, role: "ornament", part: "rule" });
|
|
454
|
+
return { scale, strokes, labels };
|
|
455
|
+
}
|
|
456
|
+
function categoryAxis(xValues, plot, options) {
|
|
457
|
+
const numeric = options.numeric !== false && xValues.length > 0 && xValues.every((v) => typeof v === "number" && Number.isFinite(v));
|
|
458
|
+
if (numeric) {
|
|
459
|
+
const numbers = xValues;
|
|
460
|
+
const x = linearScale(extent(numbers) ?? [0, 0], [plot.x, plot.x + plot.width], {
|
|
461
|
+
chart: options.chart,
|
|
462
|
+
property: options.property,
|
|
463
|
+
padding: options.padding
|
|
464
|
+
});
|
|
465
|
+
return { at: (index) => x(numbers[index] ?? 0), bandwidth: 0 };
|
|
466
|
+
}
|
|
467
|
+
const keys = xValues.map((_, index) => String(index));
|
|
468
|
+
const band = bandScale(keys, [plot.x, plot.x + plot.width], { paddingInner: options.paddingInner, paddingOuter: options.paddingOuter });
|
|
469
|
+
return { at: (index) => band.center(String(index)) ?? plot.x, bandwidth: band.bandwidth };
|
|
470
|
+
}
|
|
471
|
+
function categoryLabels(texts, at2, area, plot) {
|
|
472
|
+
const count = texts.length;
|
|
473
|
+
const step = Math.max(1, Math.ceil(count / Math.max(2, Math.floor(plot.width / LABEL_SPACING))));
|
|
474
|
+
const labels = [];
|
|
475
|
+
for (let index = 0; index < count; index += step) {
|
|
476
|
+
labels.push({
|
|
477
|
+
x: at2(index),
|
|
478
|
+
y: area.y + area.height - 5,
|
|
479
|
+
text: texts[index] ?? "",
|
|
480
|
+
kind: "tick",
|
|
481
|
+
part: "axis",
|
|
482
|
+
anchor: index === 0 ? "start" : "middle"
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
return labels;
|
|
486
|
+
}
|
|
487
|
+
var LEGEND_BAND = 22;
|
|
488
|
+
var TICK_CHAR = 5.2;
|
|
489
|
+
var LEGEND_CHAR = TICK_CHAR;
|
|
490
|
+
function legend(area, entries) {
|
|
491
|
+
const strokes = [];
|
|
492
|
+
const labels = [];
|
|
493
|
+
let x = area.x + PLOT_INSET;
|
|
494
|
+
for (const entry of entries) {
|
|
495
|
+
const swatch = { x, y: area.y + 4, width: 12, height: 7 };
|
|
496
|
+
strokes.push({ d: rectPath(swatch), role: "ornament", part: entry.part, ...entry.tone ? { tone: entry.tone } : {}, ...entry.dash ? { dash: entry.dash } : {} });
|
|
497
|
+
labels.push({ x: x + 16, y: area.y + 11, text: entry.name, kind: "tick", part: "axis", anchor: "start" });
|
|
498
|
+
x += 16 + entry.name.length * LEGEND_CHAR + 12;
|
|
499
|
+
}
|
|
500
|
+
return { area: { x: area.x, y: area.y + LEGEND_BAND, width: area.width, height: Math.max(area.height - LEGEND_BAND, 1) }, strokes, labels };
|
|
501
|
+
}
|
|
502
|
+
function pillPath(rect) {
|
|
503
|
+
const { x, y, width, height } = rect;
|
|
504
|
+
const r = Math.min(width, height) / 2;
|
|
505
|
+
if (r <= 0) return `M${x},${y}H${x + width}V${y + height}H${x}Z`;
|
|
506
|
+
return `M${x},${y + r}A${r},${r},0,0,1,${x + r},${y}H${x + width - r}A${r},${r},0,0,1,${x + width},${y + r}V${y + height - r}A${r},${r},0,0,1,${x + width - r},${y + height}H${x + r}A${r},${r},0,0,1,${x},${y + height - r}Z`;
|
|
507
|
+
}
|
|
508
|
+
function horizontalValueAxis(plot, area, domain, options) {
|
|
509
|
+
const scale = linearScale([Math.min(0, domain[0]), Math.max(0, domain[1])], [plot.x, plot.x + plot.width], {
|
|
510
|
+
chart: options.chart,
|
|
511
|
+
property: options.property,
|
|
512
|
+
padding: options.padding,
|
|
513
|
+
nice: true,
|
|
514
|
+
fromZero: true
|
|
515
|
+
});
|
|
516
|
+
const strokes = [];
|
|
517
|
+
const labels = [];
|
|
518
|
+
for (const tick of scale.ticks(4)) {
|
|
519
|
+
const tx = scale(tick);
|
|
520
|
+
if (tick !== 0) strokes.push({ d: `M${tx},${plot.y}V${plot.y + plot.height}`, role: "ornament", part: "grid" });
|
|
521
|
+
labels.push({ x: tx, y: area.y + area.height - 5, text: formatNumber(tick, options.locale, options.numberFormat), kind: "tick", part: "axis", anchor: "middle" });
|
|
522
|
+
}
|
|
523
|
+
strokes.push({ d: `M${scale(0)},${plot.y}V${plot.y + plot.height}`, role: "ornament", part: "rule" });
|
|
524
|
+
return { scale, strokes, labels };
|
|
525
|
+
}
|
|
526
|
+
function spreadLabels(ys, gap, top, bottom) {
|
|
527
|
+
const order = ys.map((y, i) => [y, i]).sort((a, b) => a[0] - b[0] || a[1] - b[1]);
|
|
528
|
+
const placed = order.map(([y]) => y);
|
|
529
|
+
for (let k = 0; k < placed.length; k += 1) placed[k] = Math.max(placed[k], k === 0 ? top : placed[k - 1] + gap);
|
|
530
|
+
for (let k = placed.length - 1; k >= 0; k -= 1) placed[k] = Math.min(placed[k], k === placed.length - 1 ? bottom : placed[k + 1] - gap);
|
|
531
|
+
const result = new Array(ys.length);
|
|
532
|
+
order.forEach(([, i], k) => {
|
|
533
|
+
result[i] = placed[k];
|
|
534
|
+
});
|
|
535
|
+
return result;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
// src/charts/shared/polar.ts
|
|
539
|
+
function polarFrame(area, labelRoom = 0) {
|
|
540
|
+
return {
|
|
541
|
+
cx: area.x + area.width / 2,
|
|
542
|
+
cy: area.y + area.height / 2,
|
|
543
|
+
radius: Math.max(Math.min(area.width, area.height) / 2 - PLOT_INSET - labelRoom, 1)
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
var RIM_LABELS = 14;
|
|
547
|
+
function rimLabels(frame, entries, most = 24) {
|
|
548
|
+
const step = Math.max(1, Math.ceil(entries.length / most));
|
|
549
|
+
return entries.filter((_, i) => i % step === 0).map((e) => polarLabel(frame, e.angle, frame.radius + 8, e.text));
|
|
550
|
+
}
|
|
551
|
+
function pointAt(frame, angle, r) {
|
|
552
|
+
return { x: frame.cx + r * Math.sin(angle), y: frame.cy - r * Math.cos(angle) };
|
|
553
|
+
}
|
|
554
|
+
var EPSILON = 1e-9;
|
|
555
|
+
var at = (frame, angle, r) => {
|
|
556
|
+
const p = pointAt(frame, angle, r);
|
|
557
|
+
return `${p.x},${p.y}`;
|
|
558
|
+
};
|
|
559
|
+
function arcTo(frame, r, end, clockwise) {
|
|
560
|
+
return `A${r},${r},0,0,${clockwise ? 1 : 0},${at(frame, end, r)}`;
|
|
561
|
+
}
|
|
562
|
+
function sweep(frame, r, start, end, clockwise) {
|
|
563
|
+
if (Math.abs(end - start) <= Math.PI) return arcTo(frame, r, end, clockwise);
|
|
564
|
+
const middle = (start + end) / 2;
|
|
565
|
+
return arcTo(frame, r, middle, clockwise) + arcTo(frame, r, end, clockwise);
|
|
566
|
+
}
|
|
567
|
+
function arcPath(frame, r, start, end) {
|
|
568
|
+
if (Math.abs(end - start) < EPSILON || r <= 0) return "";
|
|
569
|
+
return `M${at(frame, start, r)}${sweep(frame, r, start, end, end > start)}`;
|
|
570
|
+
}
|
|
571
|
+
function sectorPath(frame, shape) {
|
|
572
|
+
const { inner, outer, start, end } = shape;
|
|
573
|
+
if (Math.abs(end - start) < EPSILON || outer <= 0) return "";
|
|
574
|
+
const clockwise = end > start;
|
|
575
|
+
const outerArc = `M${at(frame, start, outer)}${sweep(frame, outer, start, end, clockwise)}`;
|
|
576
|
+
if (inner <= 0) return `${outerArc}L${frame.cx},${frame.cy}Z`;
|
|
577
|
+
return `${outerArc}L${at(frame, end, inner)}${sweep(frame, inner, end, start, !clockwise)}Z`;
|
|
578
|
+
}
|
|
579
|
+
var POLE = 0.1;
|
|
580
|
+
function polarLabel(frame, angle, r, text, kind = "tick") {
|
|
581
|
+
const p = pointAt(frame, angle, r);
|
|
582
|
+
const side = Math.sin(angle);
|
|
583
|
+
const anchor = side > POLE ? "start" : side < -POLE ? "end" : "middle";
|
|
584
|
+
return { x: p.x, y: p.y + 3, text, kind, part: "axis", anchor };
|
|
585
|
+
}
|
|
586
|
+
function readSectors(data, nameKey, valueKey, chart, locale) {
|
|
587
|
+
const valueName = accessorName(valueKey, "value");
|
|
588
|
+
const seen = /* @__PURE__ */ new Map();
|
|
589
|
+
const sectors = [];
|
|
590
|
+
data.forEach((datum, index) => {
|
|
591
|
+
const value = finite(read(valueKey, datum, index));
|
|
592
|
+
if (value === void 0 || value < 0) {
|
|
593
|
+
warnValue(chart, valueName, `Row ${index} has a ${valueName} of ${String(read(valueKey, datum, index))}; a sector needs a finite value \u2265 0, so it is omitted.`);
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
const given = read(nameKey, datum, index);
|
|
597
|
+
if (given === void 0 || given === null || given === "") warnValue(chart, accessorName(nameKey, "name"), `Row ${index} has no name; it is shown as "\u2014".`);
|
|
598
|
+
const raw = formatCategory(given, locale);
|
|
599
|
+
const count = (seen.get(raw) ?? 0) + 1;
|
|
600
|
+
seen.set(raw, count);
|
|
601
|
+
if (count > 1) warnValue(chart, accessorName(nameKey, "name"), `The name "${raw}" repeats; row ${index} is shown as "${raw} (${count})".`);
|
|
602
|
+
sectors.push({ index, datum, name: count > 1 ? `${raw} (${count})` : raw, value });
|
|
603
|
+
});
|
|
604
|
+
return sectors;
|
|
605
|
+
}
|
|
606
|
+
var SECTORS_PER_CHART = 60;
|
|
607
|
+
function checkSectors(chart, property, count) {
|
|
608
|
+
if (process.env.NODE_ENV === "production" || count <= SECTORS_PER_CHART) return;
|
|
609
|
+
diagnose("SP008", chart, { property, message: `${count} sectors; the ceiling is ${SECTORS_PER_CHART}.` });
|
|
610
|
+
}
|
|
611
|
+
var LEGEND_ROW = 14;
|
|
612
|
+
function sectorLegend(area, entries) {
|
|
613
|
+
const strokes = [];
|
|
614
|
+
const labels = [];
|
|
615
|
+
const fits = Math.max(Math.floor(area.height / LEGEND_ROW), 1);
|
|
616
|
+
const shown = entries.length > fits ? fits - 1 : entries.length;
|
|
617
|
+
const top = area.y + (area.height - Math.min(entries.length, fits) * LEGEND_ROW) / 2;
|
|
618
|
+
entries.slice(0, shown).forEach((entry, row) => {
|
|
619
|
+
const y = top + row * LEGEND_ROW;
|
|
620
|
+
strokes.push({ d: rectPath({ x: area.x, y: y + 3, width: 9, height: 7 }), role: "ornament", part: "ink", tone: entry.tone });
|
|
621
|
+
labels.push({ x: area.x + 14, y: y + 10, text: entry.name, kind: "tick", part: "text", anchor: "start" });
|
|
622
|
+
labels.push({ x: area.x + area.width, y: y + 10, text: entry.share, kind: "tick", part: "axis", anchor: "end" });
|
|
623
|
+
});
|
|
624
|
+
if (shown < entries.length) {
|
|
625
|
+
labels.push({ x: area.x + 14, y: top + shown * LEGEND_ROW + 10, text: `+${entries.length - shown} more`, kind: "tick", part: "axis", anchor: "start" });
|
|
626
|
+
}
|
|
627
|
+
return { strokes, labels };
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
export { AXIS_BAND, LEGEND_BAND, PLOT_INSET, RIM_LABELS, SilverpointError, TICK_CHAR, TONE_SCALE, __setDiagnosticSink, accessorName, arcPath, bandScale, cartesianPlot, categoryAxis, categoryLabels, checkCount, checkSectors, checkVolume, circlePath, deriveSeed, diagnose, expandDomain, extent, finite, fitText, fnv1a32, formatCategory, formatNumber, formatValue, horizontalValueAxis, inset, legend, linearScale, max, min, numberFormatter, pillPath, pointAt, polarFrame, polarLabel, read, readSectors, readSeries, rectPath, resolveSeed, rimLabels, ringTone, ringTones, round2, roundGeometry, roundPathData, sectorLegend, sectorPath, seriesValues, signedChange, spreadLabels, toneLevel, toneOf, valueAxis, warnValue };
|
|
631
|
+
//# sourceMappingURL=chunk-OLYKR5PS.js.map
|
|
632
|
+
//# sourceMappingURL=chunk-OLYKR5PS.js.map
|