@matthieumordrel/chart-studio 0.1.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/LICENSE +21 -0
- package/README.md +371 -0
- package/dist/core/chart-capabilities.d.ts +60 -0
- package/dist/core/chart-capabilities.d.ts.map +1 -0
- package/dist/core/chart-capabilities.js +55 -0
- package/dist/core/chart-capabilities.js.map +1 -0
- package/dist/core/colors.d.ts +25 -0
- package/dist/core/colors.d.ts.map +1 -0
- package/dist/core/colors.js +55 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/config-utils.d.ts +43 -0
- package/dist/core/config-utils.d.ts.map +1 -0
- package/dist/core/config-utils.js +81 -0
- package/dist/core/config-utils.js.map +1 -0
- package/dist/core/date-utils.d.ts +29 -0
- package/dist/core/date-utils.d.ts.map +1 -0
- package/dist/core/date-utils.js +59 -0
- package/dist/core/date-utils.js.map +1 -0
- package/dist/core/define-chart-schema.d.ts +105 -0
- package/dist/core/define-chart-schema.d.ts.map +1 -0
- package/dist/core/define-chart-schema.js +45 -0
- package/dist/core/define-chart-schema.js.map +1 -0
- package/dist/core/formatting.d.ts +47 -0
- package/dist/core/formatting.d.ts.map +1 -0
- package/dist/core/formatting.js +397 -0
- package/dist/core/formatting.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/infer-columns.d.ts +6 -0
- package/dist/core/infer-columns.d.ts.map +1 -0
- package/dist/core/infer-columns.js +513 -0
- package/dist/core/infer-columns.js.map +1 -0
- package/dist/core/metric-utils.d.ts +43 -0
- package/dist/core/metric-utils.d.ts.map +1 -0
- package/dist/core/metric-utils.js +142 -0
- package/dist/core/metric-utils.js.map +1 -0
- package/dist/core/pipeline-data-points.d.ts +23 -0
- package/dist/core/pipeline-data-points.d.ts.map +1 -0
- package/dist/core/pipeline-data-points.js +236 -0
- package/dist/core/pipeline-data-points.js.map +1 -0
- package/dist/core/pipeline-helpers.d.ts +38 -0
- package/dist/core/pipeline-helpers.d.ts.map +1 -0
- package/dist/core/pipeline-helpers.js +98 -0
- package/dist/core/pipeline-helpers.js.map +1 -0
- package/dist/core/pipeline.d.ts +70 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +157 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/types.d.ts +1109 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +15 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/use-chart-options.d.ts +66 -0
- package/dist/core/use-chart-options.d.ts.map +1 -0
- package/dist/core/use-chart-options.js +5 -0
- package/dist/core/use-chart-options.js.map +1 -0
- package/dist/core/use-chart-resolvers.d.ts +14 -0
- package/dist/core/use-chart-resolvers.d.ts.map +1 -0
- package/dist/core/use-chart-resolvers.js +42 -0
- package/dist/core/use-chart-resolvers.js.map +1 -0
- package/dist/core/use-chart.d.ts +47 -0
- package/dist/core/use-chart.d.ts.map +1 -0
- package/dist/core/use-chart.js +266 -0
- package/dist/core/use-chart.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/chart-axis-ticks.d.ts +35 -0
- package/dist/ui/chart-axis-ticks.d.ts.map +1 -0
- package/dist/ui/chart-axis-ticks.js +80 -0
- package/dist/ui/chart-axis-ticks.js.map +1 -0
- package/dist/ui/chart-canvas.d.ts +22 -0
- package/dist/ui/chart-canvas.d.ts.map +1 -0
- package/dist/ui/chart-canvas.js +338 -0
- package/dist/ui/chart-canvas.js.map +1 -0
- package/dist/ui/chart-context.d.ts +89 -0
- package/dist/ui/chart-context.d.ts.map +1 -0
- package/dist/ui/chart-context.js +129 -0
- package/dist/ui/chart-context.js.map +1 -0
- package/dist/ui/chart-date-range-badge.d.ts +14 -0
- package/dist/ui/chart-date-range-badge.d.ts.map +1 -0
- package/dist/ui/chart-date-range-badge.js +31 -0
- package/dist/ui/chart-date-range-badge.js.map +1 -0
- package/dist/ui/chart-date-range-panel.d.ts +25 -0
- package/dist/ui/chart-date-range-panel.d.ts.map +1 -0
- package/dist/ui/chart-date-range-panel.js +126 -0
- package/dist/ui/chart-date-range-panel.js.map +1 -0
- package/dist/ui/chart-date-range.d.ts +14 -0
- package/dist/ui/chart-date-range.d.ts.map +1 -0
- package/dist/ui/chart-date-range.js +38 -0
- package/dist/ui/chart-date-range.js.map +1 -0
- package/dist/ui/chart-debug.d.ts +10 -0
- package/dist/ui/chart-debug.d.ts.map +1 -0
- package/dist/ui/chart-debug.js +127 -0
- package/dist/ui/chart-debug.js.map +1 -0
- package/dist/ui/chart-dropdown.d.ts +35 -0
- package/dist/ui/chart-dropdown.d.ts.map +1 -0
- package/dist/ui/chart-dropdown.js +77 -0
- package/dist/ui/chart-dropdown.js.map +1 -0
- package/dist/ui/chart-filters-panel.d.ts +19 -0
- package/dist/ui/chart-filters-panel.d.ts.map +1 -0
- package/dist/ui/chart-filters-panel.js +47 -0
- package/dist/ui/chart-filters-panel.js.map +1 -0
- package/dist/ui/chart-filters.d.ts +12 -0
- package/dist/ui/chart-filters.d.ts.map +1 -0
- package/dist/ui/chart-filters.js +27 -0
- package/dist/ui/chart-filters.js.map +1 -0
- package/dist/ui/chart-group-by-selector.d.ts +8 -0
- package/dist/ui/chart-group-by-selector.d.ts.map +1 -0
- package/dist/ui/chart-group-by-selector.js +20 -0
- package/dist/ui/chart-group-by-selector.js.map +1 -0
- package/dist/ui/chart-metric-panel.d.ts +18 -0
- package/dist/ui/chart-metric-panel.d.ts.map +1 -0
- package/dist/ui/chart-metric-panel.js +119 -0
- package/dist/ui/chart-metric-panel.js.map +1 -0
- package/dist/ui/chart-metric-selector.d.ts +10 -0
- package/dist/ui/chart-metric-selector.d.ts.map +1 -0
- package/dist/ui/chart-metric-selector.js +28 -0
- package/dist/ui/chart-metric-selector.js.map +1 -0
- package/dist/ui/chart-select.d.ts +25 -0
- package/dist/ui/chart-select.d.ts.map +1 -0
- package/dist/ui/chart-select.js +36 -0
- package/dist/ui/chart-select.js.map +1 -0
- package/dist/ui/chart-source-switcher.d.ts +16 -0
- package/dist/ui/chart-source-switcher.d.ts.map +1 -0
- package/dist/ui/chart-source-switcher.js +32 -0
- package/dist/ui/chart-source-switcher.js.map +1 -0
- package/dist/ui/chart-time-bucket-selector.d.ts +9 -0
- package/dist/ui/chart-time-bucket-selector.d.ts.map +1 -0
- package/dist/ui/chart-time-bucket-selector.js +26 -0
- package/dist/ui/chart-time-bucket-selector.js.map +1 -0
- package/dist/ui/chart-toolbar-overflow.d.ts +29 -0
- package/dist/ui/chart-toolbar-overflow.d.ts.map +1 -0
- package/dist/ui/chart-toolbar-overflow.js +110 -0
- package/dist/ui/chart-toolbar-overflow.js.map +1 -0
- package/dist/ui/chart-toolbar.d.ts +45 -0
- package/dist/ui/chart-toolbar.d.ts.map +1 -0
- package/dist/ui/chart-toolbar.js +45 -0
- package/dist/ui/chart-toolbar.js.map +1 -0
- package/dist/ui/chart-type-selector.d.ts +8 -0
- package/dist/ui/chart-type-selector.d.ts.map +1 -0
- package/dist/ui/chart-type-selector.js +23 -0
- package/dist/ui/chart-type-selector.js.map +1 -0
- package/dist/ui/chart-x-axis-selector.d.ts +8 -0
- package/dist/ui/chart-x-axis-selector.d.ts.map +1 -0
- package/dist/ui/chart-x-axis-selector.js +15 -0
- package/dist/ui/chart-x-axis-selector.js.map +1 -0
- package/dist/ui/index.d.ts +25 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +24 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/theme.css +62 -0
- package/dist/ui/toolbar-types.d.ts +43 -0
- package/dist/ui/toolbar-types.d.ts.map +1 -0
- package/dist/ui/toolbar-types.js +51 -0
- package/dist/ui/toolbar-types.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
const DURATION_UNIT_TO_SECONDS = {
|
|
2
|
+
seconds: 1,
|
|
3
|
+
minutes: 60,
|
|
4
|
+
hours: 60 * 60,
|
|
5
|
+
days: 24 * 60 * 60,
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Build a numeric range from chart values.
|
|
9
|
+
*/
|
|
10
|
+
export function createNumericRange(values) {
|
|
11
|
+
const finiteValues = values.filter((value) => Number.isFinite(value));
|
|
12
|
+
if (finiteValues.length === 0) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
let min = finiteValues[0];
|
|
16
|
+
let max = finiteValues[0];
|
|
17
|
+
for (const value of finiteValues) {
|
|
18
|
+
if (value < min)
|
|
19
|
+
min = value;
|
|
20
|
+
if (value > max)
|
|
21
|
+
max = value;
|
|
22
|
+
}
|
|
23
|
+
return { min, max };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Decide whether an axis should keep decimal ticks for the current visible
|
|
27
|
+
* numeric values.
|
|
28
|
+
*/
|
|
29
|
+
export function shouldAllowDecimalTicks(values) {
|
|
30
|
+
const finiteValues = values.filter((value) => Number.isFinite(value));
|
|
31
|
+
if (finiteValues.length === 0) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const numericRange = createNumericRange(finiteValues);
|
|
35
|
+
if (shouldUsePercentByDefault(numericRange)) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return finiteValues.some((value) => !isEffectivelyInteger(value));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Format one chart value for a specific UI surface.
|
|
42
|
+
*/
|
|
43
|
+
export function formatChartValue(value, options) {
|
|
44
|
+
const { column, surface, timeBucket, numericRange, locale = 'en-US', item } = options;
|
|
45
|
+
if (column.formatter) {
|
|
46
|
+
return column.formatter(value, item);
|
|
47
|
+
}
|
|
48
|
+
if (value == null) {
|
|
49
|
+
return 'Unknown';
|
|
50
|
+
}
|
|
51
|
+
switch (column.type) {
|
|
52
|
+
case 'boolean':
|
|
53
|
+
return formatBooleanValue(value, column);
|
|
54
|
+
case 'category':
|
|
55
|
+
return String(value);
|
|
56
|
+
case 'date':
|
|
57
|
+
return value instanceof Date || typeof value === 'string' || typeof value === 'number'
|
|
58
|
+
? formatDateValue(value, column.format, surface, timeBucket, locale)
|
|
59
|
+
: String(value);
|
|
60
|
+
case 'number':
|
|
61
|
+
return typeof value === 'number'
|
|
62
|
+
? formatNumberValue(value, column.format, surface, numericRange, locale)
|
|
63
|
+
: String(value);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Format a date bucket label from the machine-friendly pipeline key.
|
|
68
|
+
*/
|
|
69
|
+
export function formatTimeBucketLabel(key, bucket, surface, locale = 'en-US') {
|
|
70
|
+
switch (bucket) {
|
|
71
|
+
case 'day':
|
|
72
|
+
return formatDateWithOptions(parseBucketDate(key), locale, getBucketDayOptions(surface));
|
|
73
|
+
case 'week': {
|
|
74
|
+
const date = parseBucketDate(key);
|
|
75
|
+
const prefix = surface === 'tooltip' ? 'Week of ' : 'Wk of ';
|
|
76
|
+
return `${prefix}${formatDateWithOptions(date, locale, getBucketWeekOptions(surface))}`;
|
|
77
|
+
}
|
|
78
|
+
case 'month':
|
|
79
|
+
return formatDateWithOptions(parseBucketMonth(key), locale, { month: 'short', year: '2-digit' });
|
|
80
|
+
case 'quarter': {
|
|
81
|
+
const { year, quarter } = parseQuarterKey(key);
|
|
82
|
+
return `Q${quarter} ${year.slice(-2)}`;
|
|
83
|
+
}
|
|
84
|
+
case 'year':
|
|
85
|
+
return key;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Format the Y-axis or label width estimate with the same surface rules used in
|
|
90
|
+
* the visible chart.
|
|
91
|
+
*/
|
|
92
|
+
export function formatNumericSurfaceValue(value, surface, numericRange, format, formatter, locale = 'en-US') {
|
|
93
|
+
return formatChartValue(value, {
|
|
94
|
+
column: {
|
|
95
|
+
type: 'number',
|
|
96
|
+
format,
|
|
97
|
+
formatter,
|
|
98
|
+
},
|
|
99
|
+
surface,
|
|
100
|
+
numericRange,
|
|
101
|
+
locale,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Resolve the boolean labels while keeping null handling in the shared entry
|
|
106
|
+
* point above.
|
|
107
|
+
*/
|
|
108
|
+
function formatBooleanValue(value, column) {
|
|
109
|
+
if (value === true) {
|
|
110
|
+
return column.trueLabel ?? 'True';
|
|
111
|
+
}
|
|
112
|
+
if (value === false) {
|
|
113
|
+
return column.falseLabel ?? 'False';
|
|
114
|
+
}
|
|
115
|
+
return String(value);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Format numeric values with surface-aware defaults and optional overrides.
|
|
119
|
+
*/
|
|
120
|
+
function formatNumberValue(value, format, surface, numericRange, locale) {
|
|
121
|
+
if (!Number.isFinite(value)) {
|
|
122
|
+
return String(value);
|
|
123
|
+
}
|
|
124
|
+
if (typeof format === 'object' && format.kind === 'duration') {
|
|
125
|
+
return formatDurationValue(value, format);
|
|
126
|
+
}
|
|
127
|
+
if (typeof format === 'object' && format.kind === 'number') {
|
|
128
|
+
return new Intl.NumberFormat(format.locale ?? locale, format.options).format(value);
|
|
129
|
+
}
|
|
130
|
+
const mode = resolveNumberFormatMode(format, surface, numericRange, value);
|
|
131
|
+
return new Intl.NumberFormat(locale, getNumberFormatOptions(mode, surface, numericRange, value)).format(value);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Format one numeric duration into a compact, surface-agnostic label such as
|
|
135
|
+
* `36s`, `1h36m`, or `1d5h`.
|
|
136
|
+
*/
|
|
137
|
+
function formatDurationValue(value, format) {
|
|
138
|
+
const sign = value < 0 ? '-' : '';
|
|
139
|
+
const totalSeconds = Math.round(Math.abs(value) * DURATION_UNIT_TO_SECONDS[format.unit]);
|
|
140
|
+
if (totalSeconds === 0) {
|
|
141
|
+
return `${sign}0${getDurationZeroSuffix(format.unit)}`;
|
|
142
|
+
}
|
|
143
|
+
const parts = buildDurationParts(totalSeconds);
|
|
144
|
+
return `${sign}${parts.slice(0, 2).map((part) => `${part.value}${part.suffix}`).join('')}`;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Build the ordered duration parts used by the compact formatter.
|
|
148
|
+
*/
|
|
149
|
+
function buildDurationParts(totalSeconds) {
|
|
150
|
+
const parts = [];
|
|
151
|
+
let remainingSeconds = totalSeconds;
|
|
152
|
+
const units = [
|
|
153
|
+
{ seconds: DURATION_UNIT_TO_SECONDS.days, suffix: 'd' },
|
|
154
|
+
{ seconds: DURATION_UNIT_TO_SECONDS.hours, suffix: 'h' },
|
|
155
|
+
{ seconds: DURATION_UNIT_TO_SECONDS.minutes, suffix: 'm' },
|
|
156
|
+
{ seconds: DURATION_UNIT_TO_SECONDS.seconds, suffix: 's' },
|
|
157
|
+
];
|
|
158
|
+
for (const unit of units) {
|
|
159
|
+
if (remainingSeconds < unit.seconds) {
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
const unitValue = Math.floor(remainingSeconds / unit.seconds);
|
|
163
|
+
remainingSeconds -= unitValue * unit.seconds;
|
|
164
|
+
parts.push({ value: unitValue, suffix: unit.suffix });
|
|
165
|
+
}
|
|
166
|
+
return parts.length > 0 ? parts : [{ value: 0, suffix: 's' }];
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Keep zero durations aligned with the unit declared by the schema author.
|
|
170
|
+
*/
|
|
171
|
+
function getDurationZeroSuffix(unit) {
|
|
172
|
+
switch (unit) {
|
|
173
|
+
case 'seconds':
|
|
174
|
+
return 's';
|
|
175
|
+
case 'minutes':
|
|
176
|
+
return 'm';
|
|
177
|
+
case 'hours':
|
|
178
|
+
return 'h';
|
|
179
|
+
case 'days':
|
|
180
|
+
return 'd';
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Format date values with either a caller-specified `Intl` config or the shared
|
|
185
|
+
* time-bucket-aware defaults.
|
|
186
|
+
*/
|
|
187
|
+
function formatDateValue(value, format, surface, timeBucket, locale) {
|
|
188
|
+
if (typeof format === 'object' && format.kind === 'date') {
|
|
189
|
+
return formatDateWithOptions(value, format.locale ?? locale, format.options ?? {});
|
|
190
|
+
}
|
|
191
|
+
if (timeBucket) {
|
|
192
|
+
const date = toDate(value);
|
|
193
|
+
if (date) {
|
|
194
|
+
return formatDateWithOptions(date, locale, getBucketDateOptions(timeBucket, surface));
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const mode = resolveDateFormatMode(format);
|
|
198
|
+
return formatDateWithOptions(value, locale, getDateValueOptions(mode, surface));
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Convert a broad value into a valid Date when possible.
|
|
202
|
+
*/
|
|
203
|
+
function toDate(value) {
|
|
204
|
+
const date = value instanceof Date ? new Date(value) : new Date(value);
|
|
205
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Safely format a parsed date, falling back to the raw string when parsing
|
|
209
|
+
* fails.
|
|
210
|
+
*/
|
|
211
|
+
function formatDateWithOptions(value, locale, options) {
|
|
212
|
+
const date = value == null ? null : toDate(value);
|
|
213
|
+
if (!date) {
|
|
214
|
+
return value == null ? 'Unknown' : String(value);
|
|
215
|
+
}
|
|
216
|
+
return new Intl.DateTimeFormat(locale, options).format(date);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Decide which number family should power the current surface.
|
|
220
|
+
*/
|
|
221
|
+
function resolveNumberFormatMode(format, surface, numericRange, value) {
|
|
222
|
+
if (typeof format === 'string') {
|
|
223
|
+
switch (format) {
|
|
224
|
+
case 'currency':
|
|
225
|
+
return surface === 'tooltip' ? 'currency' : 'compact-currency';
|
|
226
|
+
case 'compact-number':
|
|
227
|
+
return 'compact-number';
|
|
228
|
+
case 'percent':
|
|
229
|
+
return 'percent';
|
|
230
|
+
case 'number':
|
|
231
|
+
case 'date':
|
|
232
|
+
case 'datetime':
|
|
233
|
+
return surface === 'tooltip'
|
|
234
|
+
? 'number'
|
|
235
|
+
: shouldUseCompactNumber(numericRange, value) ? 'compact-number' : 'number';
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (shouldUsePercentByDefault(numericRange)) {
|
|
239
|
+
return 'percent';
|
|
240
|
+
}
|
|
241
|
+
if (surface !== 'tooltip' && shouldUseCompactNumber(numericRange, value)) {
|
|
242
|
+
return 'compact-number';
|
|
243
|
+
}
|
|
244
|
+
return 'number';
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Decide which date family should power the current surface.
|
|
248
|
+
*/
|
|
249
|
+
function resolveDateFormatMode(format) {
|
|
250
|
+
return format === 'datetime' ? 'datetime' : 'date';
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Use percentage defaults only when the visible values all live in the
|
|
254
|
+
* percentage-like range.
|
|
255
|
+
*/
|
|
256
|
+
function shouldUsePercentByDefault(numericRange) {
|
|
257
|
+
if (!numericRange) {
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
const maxAbs = Math.max(Math.abs(numericRange.min), Math.abs(numericRange.max));
|
|
261
|
+
return maxAbs > 0 && maxAbs <= 1;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Compact large values on short surfaces while leaving small ranges readable.
|
|
265
|
+
*/
|
|
266
|
+
function shouldUseCompactNumber(numericRange, value) {
|
|
267
|
+
const maxAbs = numericRange
|
|
268
|
+
? Math.max(Math.abs(numericRange.min), Math.abs(numericRange.max))
|
|
269
|
+
: Math.abs(value);
|
|
270
|
+
return maxAbs >= 1000;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Treat floating-point noise around whole numbers as integers so axis policy
|
|
274
|
+
* follows the actual metric shape rather than binary rounding artifacts.
|
|
275
|
+
*/
|
|
276
|
+
function isEffectivelyInteger(value) {
|
|
277
|
+
return Math.abs(value - Math.round(value)) < 1e-9;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Produce the final `Intl.NumberFormat` options for one numeric mode.
|
|
281
|
+
*/
|
|
282
|
+
function getNumberFormatOptions(mode, surface, numericRange, value) {
|
|
283
|
+
switch (mode) {
|
|
284
|
+
case 'compact-currency':
|
|
285
|
+
return {
|
|
286
|
+
style: 'currency',
|
|
287
|
+
currency: 'USD',
|
|
288
|
+
notation: 'compact',
|
|
289
|
+
maximumFractionDigits: 1,
|
|
290
|
+
};
|
|
291
|
+
case 'currency':
|
|
292
|
+
return {
|
|
293
|
+
style: 'currency',
|
|
294
|
+
currency: 'USD',
|
|
295
|
+
maximumFractionDigits: getStandardFractionDigits(surface, numericRange, value),
|
|
296
|
+
};
|
|
297
|
+
case 'compact-number':
|
|
298
|
+
return {
|
|
299
|
+
notation: 'compact',
|
|
300
|
+
maximumFractionDigits: 1,
|
|
301
|
+
};
|
|
302
|
+
case 'percent':
|
|
303
|
+
return {
|
|
304
|
+
style: 'percent',
|
|
305
|
+
maximumFractionDigits: surface === 'tooltip' ? 2 : 1,
|
|
306
|
+
};
|
|
307
|
+
case 'number':
|
|
308
|
+
return {
|
|
309
|
+
maximumFractionDigits: getStandardFractionDigits(surface, numericRange, value),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Keep tooltip values more precise than axis and data-label surfaces.
|
|
315
|
+
*/
|
|
316
|
+
function getStandardFractionDigits(surface, numericRange, value) {
|
|
317
|
+
const span = numericRange ? Math.abs(numericRange.max - numericRange.min) : Math.abs(value);
|
|
318
|
+
if (surface === 'tooltip') {
|
|
319
|
+
if (span < 1)
|
|
320
|
+
return 3;
|
|
321
|
+
if (span < 10)
|
|
322
|
+
return 2;
|
|
323
|
+
if (span < 100)
|
|
324
|
+
return 1;
|
|
325
|
+
return 0;
|
|
326
|
+
}
|
|
327
|
+
if (span < 1)
|
|
328
|
+
return 2;
|
|
329
|
+
if (span < 10)
|
|
330
|
+
return 1;
|
|
331
|
+
return 0;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Match raw date values to a clear default display.
|
|
335
|
+
*/
|
|
336
|
+
function getDateValueOptions(mode, surface) {
|
|
337
|
+
if (mode === 'datetime') {
|
|
338
|
+
return surface === 'tooltip'
|
|
339
|
+
? { dateStyle: 'medium', timeStyle: 'short' }
|
|
340
|
+
: { month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' };
|
|
341
|
+
}
|
|
342
|
+
return { month: 'short', day: 'numeric', year: '2-digit' };
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Match bucketed dates to the active time bucket.
|
|
346
|
+
*/
|
|
347
|
+
function getBucketDateOptions(bucket, surface) {
|
|
348
|
+
switch (bucket) {
|
|
349
|
+
case 'day':
|
|
350
|
+
return getBucketDayOptions(surface);
|
|
351
|
+
case 'week':
|
|
352
|
+
return getBucketWeekOptions(surface);
|
|
353
|
+
case 'month':
|
|
354
|
+
return { month: 'short', year: '2-digit' };
|
|
355
|
+
case 'quarter':
|
|
356
|
+
return { month: 'short', year: '2-digit' };
|
|
357
|
+
case 'year':
|
|
358
|
+
return { year: 'numeric' };
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Keep day buckets short on axes and clearer in tooltips.
|
|
363
|
+
*/
|
|
364
|
+
function getBucketDayOptions(surface) {
|
|
365
|
+
return surface === 'tooltip'
|
|
366
|
+
? { month: 'short', day: 'numeric', year: '2-digit' }
|
|
367
|
+
: { month: 'short', day: 'numeric' };
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Keep week buckets short on axes and clearer in tooltips.
|
|
371
|
+
*/
|
|
372
|
+
function getBucketWeekOptions(surface) {
|
|
373
|
+
return surface === 'tooltip'
|
|
374
|
+
? { month: 'short', day: 'numeric', year: '2-digit' }
|
|
375
|
+
: { month: 'short', day: 'numeric' };
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Parse a `YYYY-MM-DD` bucket key.
|
|
379
|
+
*/
|
|
380
|
+
function parseBucketDate(key) {
|
|
381
|
+
return new Date(`${key}T00:00:00`);
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Parse a `YYYY-MM` bucket key.
|
|
385
|
+
*/
|
|
386
|
+
function parseBucketMonth(key) {
|
|
387
|
+
const [year, month] = key.split('-');
|
|
388
|
+
return new Date(Number(year), Number(month) - 1, 1);
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Parse a `YYYY-QN` quarter key.
|
|
392
|
+
*/
|
|
393
|
+
function parseQuarterKey(key) {
|
|
394
|
+
const [year, quarter] = key.split('-Q');
|
|
395
|
+
return { year: year ?? key, quarter: quarter ?? '1' };
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=formatting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../src/core/formatting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core exports for chart-studio.
|
|
3
|
+
*
|
|
4
|
+
* The headless layer: types, inference, pipeline, and the useChart hook.
|
|
5
|
+
*/
|
|
6
|
+
export { CHART_TYPE_CONFIG } from './chart-capabilities.js';
|
|
7
|
+
export { getSeriesColor, buildColorMap } from './colors.js';
|
|
8
|
+
export { defineChartSchema } from './define-chart-schema.js';
|
|
9
|
+
export { inferColumnsFromData } from './infer-columns.js';
|
|
10
|
+
export { buildAvailableMetrics, getMetricLabel } from './metric-utils.js';
|
|
11
|
+
export { runPipeline, applyFilters, extractAvailableFilters } from './pipeline.js';
|
|
12
|
+
export type { PipelineInput, PipelineOutput } from './pipeline.js';
|
|
13
|
+
export { useChart } from './use-chart.js';
|
|
14
|
+
export type { UseChartOptions } from './use-chart-options.js';
|
|
15
|
+
export type { ChartAxisType, ChartTypeCapabilities } from './chart-capabilities.js';
|
|
16
|
+
export type { ChartSourceOptions, ChartColumn, ChartColumnType, ColumnFormat, ColumnFormatPreset, DurationInputUnit, NumberColumnFormat, DateColumnFormat, DurationColumnFormat, RawColumnSchemaFor, RawColumnSchemaMap, DerivedColumnSchema, DerivedDateColumnSchema, DerivedCategoryColumnSchema, DerivedBooleanColumnSchema, DerivedNumberColumnSchema, ChartSchema, DefinedChartSchema, ValidatedChartSchema, InferableFieldKey, ResolvedColumnIdFromSchema, ResolvedXAxisColumnIdFromSchema, ResolvedGroupByColumnIdFromSchema, ResolvedFilterColumnIdFromSchema, ResolvedMetricColumnIdFromSchema, ResolvedDateColumnIdFromSchema, SelectableControlConfig, XAxisConfig, GroupByConfig, FiltersConfig, MetricConfig, ChartTypeConfig, TimeBucketConfig, RestrictedXAxisColumnIdFromSchema, RestrictedGroupByColumnIdFromSchema, RestrictedFilterColumnIdFromSchema, RestrictedMetricFromSchema, RestrictedChartTypeFromSchema, RestrictedTimeBucketFromSchema, DateColumn, CategoryColumn, BooleanColumn, NumberColumn, ChartType, TimeSeriesChartType, CategoricalChartType, TimeBucket, AggregateFunction, NumericAggregateFunction, NumericAggregateSelection, CountMetric, AggregateMetric, AggregateMetricAllowance, Metric, MetricAllowance, FilterState, SortDirection, SortConfig, DateRange, DateRangeFilter, MultiSourceChartInstance, ChartSeries, TransformedDataPoint, AvailableFilter, ChartInstance, ChartInstanceFromSchema, } from './types.js';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAC,cAAc,EAAE,aAAa,EAAC,MAAM,aAAa,CAAA;AACzD,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,oBAAoB,EAAC,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAC,qBAAqB,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAA;AACvE,OAAO,EAAC,WAAW,EAAE,YAAY,EAAE,uBAAuB,EAAC,MAAM,eAAe,CAAA;AAChF,YAAY,EAAC,aAAa,EAAE,cAAc,EAAC,MAAM,eAAe,CAAA;AAChE,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAA;AACvC,YAAY,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAA;AAC3D,YAAY,EAAC,aAAa,EAAE,qBAAqB,EAAC,MAAM,yBAAyB,CAAA;AAEjF,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,2BAA2B,EAC3B,0BAA0B,EAC1B,yBAAyB,EACzB,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,0BAA0B,EAC1B,+BAA+B,EAC/B,iCAAiC,EACjC,gCAAgC,EAChC,gCAAgC,EAChC,8BAA8B,EAC9B,uBAAuB,EACvB,WAAW,EACX,aAAa,EACb,aAAa,EACb,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,iCAAiC,EACjC,mCAAmC,EACnC,kCAAkC,EAClC,0BAA0B,EAC1B,6BAA6B,EAC7B,8BAA8B,EAC9B,UAAU,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EACjB,wBAAwB,EACxB,yBAAyB,EACzB,WAAW,EACX,eAAe,EACf,wBAAwB,EACxB,MAAM,EACN,eAAe,EACf,WAAW,EACX,aAAa,EACb,UAAU,EACV,SAAS,EACT,eAAe,EACf,wBAAwB,EACxB,WAAW,EACX,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,uBAAuB,GACxB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core exports for chart-studio.
|
|
3
|
+
*
|
|
4
|
+
* The headless layer: types, inference, pipeline, and the useChart hook.
|
|
5
|
+
*/
|
|
6
|
+
export { CHART_TYPE_CONFIG } from './chart-capabilities.js';
|
|
7
|
+
export { getSeriesColor, buildColorMap } from './colors.js';
|
|
8
|
+
export { defineChartSchema } from './define-chart-schema.js';
|
|
9
|
+
export { inferColumnsFromData } from './infer-columns.js';
|
|
10
|
+
export { buildAvailableMetrics, getMetricLabel } from './metric-utils.js';
|
|
11
|
+
export { runPipeline, applyFilters, extractAvailableFilters } from './pipeline.js';
|
|
12
|
+
export { useChart } from './use-chart.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAC,cAAc,EAAE,aAAa,EAAC,MAAM,aAAa,CAAA;AACzD,OAAO,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAC,oBAAoB,EAAC,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAC,qBAAqB,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAA;AACvE,OAAO,EAAC,WAAW,EAAE,YAAY,EAAE,uBAAuB,EAAC,MAAM,eAAe,CAAA;AAEhF,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ChartColumn, ChartSchema, ResolvedColumnIdFromSchema } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve chart columns directly from raw data and an optional explicit schema.
|
|
4
|
+
*/
|
|
5
|
+
export declare function inferColumnsFromData<T, const TSchema extends ChartSchema<T, any> | undefined = undefined>(data: readonly T[], schema?: TSchema): readonly ChartColumn<T, ResolvedColumnIdFromSchema<T, TSchema>>[];
|
|
6
|
+
//# sourceMappingURL=infer-columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infer-columns.d.ts","sourceRoot":"","sources":["../../src/core/infer-columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAEX,WAAW,EAaX,0BAA0B,EAC3B,MAAM,YAAY,CAAA;AA0nBnB;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,SAAS,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,SAAS,EACvG,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,MAAM,CAAC,EAAE,OAAO,GACf,SAAS,WAAW,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAwBnE"}
|