@bicharts/chart-host 0.6.75 → 0.6.77
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/dist/card.mjs +234 -0
- package/dist/{chunk-OEN7WGNS.mjs → chunk-H2P63UMG.mjs} +44 -3834
- package/dist/chunk-IMNZYSIC.mjs +3806 -0
- package/dist/chunk-QOKQUXVV.mjs +614 -0
- package/dist/index.mjs +53 -647
- package/dist/react.mjs +2 -1
- package/dist/types/card.d.ts +1 -0
- package/dist/types/selectionCardChrome.d.ts +29 -0
- package/package.json +6 -1
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
/*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */
|
|
2
|
+
import {
|
|
3
|
+
computeSelectionCard,
|
|
4
|
+
formatSourceDate,
|
|
5
|
+
formatSourceDateFor,
|
|
6
|
+
isExcelDateFormat,
|
|
7
|
+
normaliseAggregation
|
|
8
|
+
} from "./chunk-QOKQUXVV.mjs";
|
|
2
9
|
import {
|
|
3
10
|
ANNOTATION_CLASS,
|
|
4
11
|
ANNOTATION_LAYER_CLASS,
|
|
@@ -15,7 +22,6 @@ import {
|
|
|
15
22
|
DARK_TEXT,
|
|
16
23
|
FIT_CONTENT_SELECTOR,
|
|
17
24
|
GLYPH_SAMPLE_N,
|
|
18
|
-
L,
|
|
19
25
|
LABEL_CONTRAST_CAP,
|
|
20
26
|
LABEL_CONTRAST_DONE_ATTR,
|
|
21
27
|
LABEL_PILL_CLASS,
|
|
@@ -29,8 +35,6 @@ import {
|
|
|
29
35
|
PILL_MIN_ALPHA,
|
|
30
36
|
PILL_MIN_COVERAGE,
|
|
31
37
|
PILL_OPAQUE_ALPHA,
|
|
32
|
-
Qe,
|
|
33
|
-
Qn,
|
|
34
38
|
SAME_SHADE_DELTA_E,
|
|
35
39
|
SCROLL_SLACK_PX,
|
|
36
40
|
SELECTION_GLYPH_CLASS,
|
|
@@ -41,8 +45,6 @@ import {
|
|
|
41
45
|
STRADDLE_TARGET_CONTRAST,
|
|
42
46
|
VALUE_AXIS_MIN_FIT,
|
|
43
47
|
WHITE_TEXT_BG_LUM,
|
|
44
|
-
Zn,
|
|
45
|
-
_3,
|
|
46
48
|
applyLabelContrast,
|
|
47
49
|
assembleD3,
|
|
48
50
|
autoRampCanvas,
|
|
@@ -87,9 +89,7 @@ import {
|
|
|
87
89
|
isInvalidSentinelError,
|
|
88
90
|
isPhantomBox,
|
|
89
91
|
isPillBackdropAlpha,
|
|
90
|
-
l,
|
|
91
92
|
labelBand,
|
|
92
|
-
le,
|
|
93
93
|
loadGeo,
|
|
94
94
|
markKeyOf,
|
|
95
95
|
measureContainerBoxes,
|
|
@@ -99,7 +99,6 @@ import {
|
|
|
99
99
|
nextClickedMarks,
|
|
100
100
|
nextSelection,
|
|
101
101
|
noopViewStateProvider,
|
|
102
|
-
o,
|
|
103
102
|
paintSelectionGlyphs,
|
|
104
103
|
pickColorOver,
|
|
105
104
|
pillBacksGlyph,
|
|
@@ -107,7 +106,6 @@ import {
|
|
|
107
106
|
planAxisPin,
|
|
108
107
|
planFrameGrow,
|
|
109
108
|
planSelectionPaint,
|
|
110
|
-
qe,
|
|
111
109
|
registerGeo,
|
|
112
110
|
registerGeoAsset,
|
|
113
111
|
relativeLuminance,
|
|
@@ -130,7 +128,12 @@ import {
|
|
|
130
128
|
toSourceRows,
|
|
131
129
|
unpinScrolledAxis,
|
|
132
130
|
valuePlacementFlag
|
|
133
|
-
} from "./chunk-
|
|
131
|
+
} from "./chunk-IMNZYSIC.mjs";
|
|
132
|
+
import {
|
|
133
|
+
_3,
|
|
134
|
+
l,
|
|
135
|
+
o
|
|
136
|
+
} from "./chunk-H2P63UMG.mjs";
|
|
134
137
|
import "./chunk-A2GMXZP7.mjs";
|
|
135
138
|
import {
|
|
136
139
|
ACTIVE_TICK_CLASS,
|
|
@@ -317,7 +320,7 @@ function planTrivialChart(data) {
|
|
|
317
320
|
}
|
|
318
321
|
if (dataCols.length !== 1) return null;
|
|
319
322
|
const idx = dataCols[0];
|
|
320
|
-
const
|
|
323
|
+
const name = columnName(allCols[idx]) || "Value";
|
|
321
324
|
const finish = (kind, reason, source) => ({
|
|
322
325
|
kind,
|
|
323
326
|
reason,
|
|
@@ -329,7 +332,7 @@ function planTrivialChart(data) {
|
|
|
329
332
|
return finish(
|
|
330
333
|
"card",
|
|
331
334
|
"One row of one column holds a single value, so this is a card. No generation was needed and none was used.",
|
|
332
|
-
cardSource(idx,
|
|
335
|
+
cardSource(idx, name)
|
|
333
336
|
);
|
|
334
337
|
}
|
|
335
338
|
if (isNumericColumn(rows, idx)) {
|
|
@@ -337,7 +340,7 @@ function planTrivialChart(data) {
|
|
|
337
340
|
return finish(
|
|
338
341
|
"histogram",
|
|
339
342
|
"A single numeric column has one defensible chart: the distribution of its values. No generation was needed and none was used.",
|
|
340
|
-
histogramSource(idx,
|
|
343
|
+
histogramSource(idx, name)
|
|
341
344
|
);
|
|
342
345
|
}
|
|
343
346
|
const distinct = /* @__PURE__ */ new Set();
|
|
@@ -350,7 +353,7 @@ function planTrivialChart(data) {
|
|
|
350
353
|
return finish(
|
|
351
354
|
"frequency-bar",
|
|
352
355
|
"A single categorical column has one defensible chart: how often each value occurs. No generation was needed and none was used.",
|
|
353
|
-
frequencySource(idx,
|
|
356
|
+
frequencySource(idx, name)
|
|
354
357
|
);
|
|
355
358
|
}
|
|
356
359
|
function compileTrivialSource(source) {
|
|
@@ -391,7 +394,7 @@ var PRELUDE = `
|
|
|
391
394
|
}
|
|
392
395
|
container.replaceChildren();
|
|
393
396
|
`;
|
|
394
|
-
function cardSource(idx,
|
|
397
|
+
function cardSource(idx, name) {
|
|
395
398
|
return `function render(container, data, options) {${PRELUDE}
|
|
396
399
|
var raw = rows[0] ? rows[0][${idx}] : null;
|
|
397
400
|
var blank = (raw === null || raw === undefined || raw === '');
|
|
@@ -423,13 +426,13 @@ function cardSource(idx, name2) {
|
|
|
423
426
|
label.style.marginTop = '6px'; label.style.textAlign = 'center';
|
|
424
427
|
label.style.maxWidth = '100%'; label.style.overflow = 'hidden';
|
|
425
428
|
label.style.textOverflow = 'ellipsis'; label.style.whiteSpace = 'nowrap';
|
|
426
|
-
label.textContent = ${lit(
|
|
429
|
+
label.textContent = ${lit(name)};
|
|
427
430
|
|
|
428
431
|
root.appendChild(value); root.appendChild(label);
|
|
429
432
|
container.appendChild(root);
|
|
430
433
|
}`;
|
|
431
434
|
}
|
|
432
|
-
function frequencySource(idx,
|
|
435
|
+
function frequencySource(idx, name) {
|
|
433
436
|
return `function render(container, data, options) {${PRELUDE}
|
|
434
437
|
var counts = new Map();
|
|
435
438
|
for (var r = 0; r < rows.length; r++) {
|
|
@@ -449,7 +452,7 @@ function frequencySource(idx, name2) {
|
|
|
449
452
|
var barH = Math.min(bandH - 3, 26);
|
|
450
453
|
|
|
451
454
|
var title = svgEl('text', { x: 8, y: CF + 2, 'font-size': CF, 'font-weight': '700', fill: FG });
|
|
452
|
-
title.textContent = ${lit(
|
|
455
|
+
title.textContent = ${lit(name)} + ' \\u2014 count of ' + fmt(rows.length) + ' rows';
|
|
453
456
|
svg.appendChild(title);
|
|
454
457
|
|
|
455
458
|
entries.forEach(function (e, i) {
|
|
@@ -488,7 +491,7 @@ function frequencySource(idx, name2) {
|
|
|
488
491
|
container.appendChild(svg);
|
|
489
492
|
}`;
|
|
490
493
|
}
|
|
491
|
-
function histogramSource(idx,
|
|
494
|
+
function histogramSource(idx, name) {
|
|
492
495
|
return `function render(container, data, options) {${PRELUDE}
|
|
493
496
|
var vals = [];
|
|
494
497
|
for (var r = 0; r < rows.length; r++) {
|
|
@@ -524,7 +527,7 @@ function histogramSource(idx, name2) {
|
|
|
524
527
|
var bw = plotW / binCount;
|
|
525
528
|
|
|
526
529
|
var title = svgEl('text', { x: padL, y: CF + 2, 'font-size': CF, 'font-weight': '700', fill: FG });
|
|
527
|
-
title.textContent = ${lit(
|
|
530
|
+
title.textContent = ${lit(name)} + ' \\u2014 distribution of ' + fmt(vals.length) + ' values';
|
|
528
531
|
svg.appendChild(title);
|
|
529
532
|
|
|
530
533
|
bins.forEach(function (idxs, i) {
|
|
@@ -1200,20 +1203,20 @@ function normalizeFilterTerm(raw) {
|
|
|
1200
1203
|
return raw.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/\s+/g, " ").trim();
|
|
1201
1204
|
}
|
|
1202
1205
|
var FILTER_MIN_TERM_CHARS = 2;
|
|
1203
|
-
function startsAWord(
|
|
1204
|
-
for (let i2 =
|
|
1206
|
+
function startsAWord(name, t2) {
|
|
1207
|
+
for (let i2 = name.indexOf(t2); i2 >= 0; i2 = name.indexOf(t2, i2 + 1)) {
|
|
1205
1208
|
if (i2 === 0) return true;
|
|
1206
|
-
const prev =
|
|
1209
|
+
const prev = name.charCodeAt(i2 - 1);
|
|
1207
1210
|
const alnum = prev >= 97 && prev <= 122 || prev >= 48 && prev <= 57;
|
|
1208
1211
|
if (!alnum) return true;
|
|
1209
1212
|
}
|
|
1210
1213
|
return false;
|
|
1211
1214
|
}
|
|
1212
|
-
function looseFormWithWordStarts(
|
|
1215
|
+
function looseFormWithWordStarts(name) {
|
|
1213
1216
|
let form = "";
|
|
1214
1217
|
const starts = /* @__PURE__ */ new Set();
|
|
1215
1218
|
let prevAlnum = false;
|
|
1216
|
-
for (const ch of
|
|
1219
|
+
for (const ch of name) {
|
|
1217
1220
|
const piece = l(ch);
|
|
1218
1221
|
const code = ch.charCodeAt(0);
|
|
1219
1222
|
const alnum = code >= 97 && code <= 122 || code >= 48 && code <= 57;
|
|
@@ -1242,13 +1245,13 @@ function filterQualifyRows(rows, term, read, style = DEFAULT_FILTER_MATCH_STYLE)
|
|
|
1242
1245
|
const byDesc = [];
|
|
1243
1246
|
for (const row of all) {
|
|
1244
1247
|
const f2 = read(row);
|
|
1245
|
-
const
|
|
1246
|
-
if (
|
|
1247
|
-
if (
|
|
1248
|
-
(startsAWord(
|
|
1248
|
+
const name = normalizeFilterTerm(f2.name);
|
|
1249
|
+
if (name === "") continue;
|
|
1250
|
+
if (name.indexOf(t2) >= 0) {
|
|
1251
|
+
(startsAWord(name, t2) ? atWordStart : midWord).push(row);
|
|
1249
1252
|
continue;
|
|
1250
1253
|
}
|
|
1251
|
-
if (loose && startsALooseWord(looseFormWithWordStarts(
|
|
1254
|
+
if (loose && startsALooseWord(looseFormWithWordStarts(name), loose)) {
|
|
1252
1255
|
atWordStart.push(row);
|
|
1253
1256
|
continue;
|
|
1254
1257
|
}
|
|
@@ -1354,603 +1357,6 @@ function qualifyTableRows(rows) {
|
|
|
1354
1357
|
}));
|
|
1355
1358
|
}
|
|
1356
1359
|
|
|
1357
|
-
// src/sourceDateFormat.ts
|
|
1358
|
-
function formatSourceDate(raw, opts = {}) {
|
|
1359
|
-
const d2 = toDate(raw);
|
|
1360
|
-
if (!d2) return null;
|
|
1361
|
-
const dayFrame = L(d2);
|
|
1362
|
-
const frame = dayFrame ?? (opts.dialect === "dotnet" ? "local" : "utc");
|
|
1363
|
-
const p3 = partsIn(d2, frame);
|
|
1364
|
-
const format = cleanFormat(opts.format, opts.dialect);
|
|
1365
|
-
if (format && opts.dialect) {
|
|
1366
|
-
const rendered = renderFormat(format, p3, opts.dialect, opts.culture);
|
|
1367
|
-
if (rendered) return rendered;
|
|
1368
|
-
}
|
|
1369
|
-
return localeDate(p3, !!dayFrame, opts.culture);
|
|
1370
|
-
}
|
|
1371
|
-
function formatSourceDateFor(raw, columnName2, formats, culture) {
|
|
1372
|
-
return formatSourceDate(raw, {
|
|
1373
|
-
format: formats?.byColumn?.[columnName2] ?? null,
|
|
1374
|
-
dialect: formats?.dialect,
|
|
1375
|
-
culture
|
|
1376
|
-
});
|
|
1377
|
-
}
|
|
1378
|
-
var ISO_LIKE_RE = /^\s*\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?\s*$/;
|
|
1379
|
-
function toDate(raw) {
|
|
1380
|
-
if (raw instanceof Date) return isNaN(raw.getTime()) ? null : raw;
|
|
1381
|
-
if (typeof raw !== "string" || !ISO_LIKE_RE.test(raw)) return null;
|
|
1382
|
-
const d2 = le(raw.trim());
|
|
1383
|
-
return d2 && !isNaN(d2.getTime()) ? d2 : null;
|
|
1384
|
-
}
|
|
1385
|
-
function partsIn(d2, frame) {
|
|
1386
|
-
return frame === "utc" ? {
|
|
1387
|
-
year: d2.getUTCFullYear(),
|
|
1388
|
-
month: d2.getUTCMonth() + 1,
|
|
1389
|
-
day: d2.getUTCDate(),
|
|
1390
|
-
hours: d2.getUTCHours(),
|
|
1391
|
-
minutes: d2.getUTCMinutes(),
|
|
1392
|
-
seconds: d2.getUTCSeconds(),
|
|
1393
|
-
ms: d2.getUTCMilliseconds(),
|
|
1394
|
-
weekday: d2.getUTCDay()
|
|
1395
|
-
} : {
|
|
1396
|
-
year: d2.getFullYear(),
|
|
1397
|
-
month: d2.getMonth() + 1,
|
|
1398
|
-
day: d2.getDate(),
|
|
1399
|
-
hours: d2.getHours(),
|
|
1400
|
-
minutes: d2.getMinutes(),
|
|
1401
|
-
seconds: d2.getSeconds(),
|
|
1402
|
-
ms: d2.getMilliseconds(),
|
|
1403
|
-
weekday: d2.getDay()
|
|
1404
|
-
};
|
|
1405
|
-
}
|
|
1406
|
-
function utcAnchor(p3) {
|
|
1407
|
-
const d2 = new Date(Date.UTC(p3.year, p3.month - 1, p3.day, p3.hours, p3.minutes, p3.seconds, p3.ms));
|
|
1408
|
-
if (p3.year >= 0 && p3.year < 100) d2.setUTCFullYear(p3.year);
|
|
1409
|
-
return d2;
|
|
1410
|
-
}
|
|
1411
|
-
function localeDate(p3, wholeDay, culture) {
|
|
1412
|
-
const anchor = utcAnchor(p3);
|
|
1413
|
-
try {
|
|
1414
|
-
const o3 = { dateStyle: "medium", timeZone: "UTC" };
|
|
1415
|
-
if (!wholeDay) o3.timeStyle = p3.seconds || p3.ms ? "medium" : "short";
|
|
1416
|
-
return new Intl.DateTimeFormat(culture || void 0, o3).format(anchor);
|
|
1417
|
-
} catch {
|
|
1418
|
-
const iso = anchor.toISOString();
|
|
1419
|
-
return wholeDay ? iso.slice(0, 10) : `${iso.slice(0, 10)} ${iso.slice(11, 19)}`;
|
|
1420
|
-
}
|
|
1421
|
-
}
|
|
1422
|
-
function cleanFormat(raw, dialect) {
|
|
1423
|
-
if (!raw || !dialect) return null;
|
|
1424
|
-
let s2 = firstSection(String(raw), dialect);
|
|
1425
|
-
if (dialect === "excel") {
|
|
1426
|
-
s2 = s2.replace(/\[(h{1,2}|m{1,2}|s{1,2})\]/gi, "$1").replace(/\[[^\]]*\]/g, "");
|
|
1427
|
-
}
|
|
1428
|
-
if (!s2.trim() || /^general$/i.test(s2.trim())) return null;
|
|
1429
|
-
return hasDateToken(s2, dialect) ? s2 : null;
|
|
1430
|
-
}
|
|
1431
|
-
function isExcelDateFormat(raw) {
|
|
1432
|
-
if (!raw) return false;
|
|
1433
|
-
const bare = stripLiterals(firstSection(String(raw), "excel"), "excel");
|
|
1434
|
-
if (/\[(h+|m+|s+)\]/i.test(bare)) return false;
|
|
1435
|
-
const tokens = bare.replace(/\[[^\]]*\]/g, "").trim();
|
|
1436
|
-
if (!tokens || /^general$/i.test(tokens)) return false;
|
|
1437
|
-
return /[ymdhs]/i.test(tokens);
|
|
1438
|
-
}
|
|
1439
|
-
function firstSection(s2, dialect) {
|
|
1440
|
-
let out = "";
|
|
1441
|
-
let quote = "";
|
|
1442
|
-
for (let i2 = 0; i2 < s2.length; i2++) {
|
|
1443
|
-
const ch = s2[i2];
|
|
1444
|
-
if (quote) {
|
|
1445
|
-
out += ch;
|
|
1446
|
-
if (ch === quote) quote = "";
|
|
1447
|
-
continue;
|
|
1448
|
-
}
|
|
1449
|
-
if (ch === '"' || dialect === "dotnet" && ch === "'") {
|
|
1450
|
-
quote = ch;
|
|
1451
|
-
out += ch;
|
|
1452
|
-
continue;
|
|
1453
|
-
}
|
|
1454
|
-
if (ch === "\\") {
|
|
1455
|
-
out += ch + (s2[i2 + 1] ?? "");
|
|
1456
|
-
i2++;
|
|
1457
|
-
continue;
|
|
1458
|
-
}
|
|
1459
|
-
if (ch === ";") break;
|
|
1460
|
-
out += ch;
|
|
1461
|
-
}
|
|
1462
|
-
return out;
|
|
1463
|
-
}
|
|
1464
|
-
function hasDateToken(s2, dialect) {
|
|
1465
|
-
const stripped = stripLiterals(s2, dialect);
|
|
1466
|
-
return dialect === "excel" ? /[ymdhs]/i.test(stripped) : /[yMdHhmsft]/.test(stripped);
|
|
1467
|
-
}
|
|
1468
|
-
function stripLiterals(s2, dialect) {
|
|
1469
|
-
let out = "";
|
|
1470
|
-
for (let i2 = 0; i2 < s2.length; i2++) {
|
|
1471
|
-
const ch = s2[i2];
|
|
1472
|
-
if (ch === "\\" || dialect === "dotnet" && ch === "%") {
|
|
1473
|
-
i2++;
|
|
1474
|
-
continue;
|
|
1475
|
-
}
|
|
1476
|
-
if (dialect === "excel" && (ch === "_" || ch === "*")) {
|
|
1477
|
-
i2++;
|
|
1478
|
-
continue;
|
|
1479
|
-
}
|
|
1480
|
-
if (ch === '"' || dialect === "dotnet" && ch === "'") {
|
|
1481
|
-
const end = s2.indexOf(ch, i2 + 1);
|
|
1482
|
-
i2 = end < 0 ? s2.length : end;
|
|
1483
|
-
continue;
|
|
1484
|
-
}
|
|
1485
|
-
out += ch;
|
|
1486
|
-
}
|
|
1487
|
-
return out;
|
|
1488
|
-
}
|
|
1489
|
-
var EXCEL_TOKENS = [
|
|
1490
|
-
[/^am\/pm/i, "meridiemLong"],
|
|
1491
|
-
[/^a\/p/i, "meridiemShort"],
|
|
1492
|
-
[/^y{3,}/i, "year4"],
|
|
1493
|
-
[/^y{1,2}/i, "year2"],
|
|
1494
|
-
[/^m{5,}/i, "monthNarrow"],
|
|
1495
|
-
[/^m{4}/i, "monthLong"],
|
|
1496
|
-
[/^m{3}/i, "monthShort"],
|
|
1497
|
-
[/^m{2}/i, "mAmbiguous2"],
|
|
1498
|
-
[/^m/i, "mAmbiguous1"],
|
|
1499
|
-
[/^d{4,}/i, "weekdayLong"],
|
|
1500
|
-
[/^d{3}/i, "weekdayShort"],
|
|
1501
|
-
[/^d{2}/i, "day2"],
|
|
1502
|
-
[/^d/i, "day1"],
|
|
1503
|
-
[/^h{2,}/i, "hour2"],
|
|
1504
|
-
[/^h/i, "hour1"],
|
|
1505
|
-
[/^s{2,}/i, "second2"],
|
|
1506
|
-
[/^s/i, "second1"]
|
|
1507
|
-
];
|
|
1508
|
-
var DOTNET_TOKENS = [
|
|
1509
|
-
[/^y{3,}/, "year4"],
|
|
1510
|
-
[/^y{1,2}/, "year2"],
|
|
1511
|
-
[/^M{4,}/, "monthLong"],
|
|
1512
|
-
[/^M{3}/, "monthShort"],
|
|
1513
|
-
[/^M{2}/, "month2"],
|
|
1514
|
-
[/^M/, "month1"],
|
|
1515
|
-
[/^d{4,}/, "weekdayLong"],
|
|
1516
|
-
[/^d{3}/, "weekdayShort"],
|
|
1517
|
-
[/^d{2}/, "day2"],
|
|
1518
|
-
[/^d/, "day1"],
|
|
1519
|
-
[/^H{2,}/, "hour2"],
|
|
1520
|
-
[/^H/, "hour1"],
|
|
1521
|
-
[/^h{2,}/, "hour2"],
|
|
1522
|
-
[/^h/, "hour1"],
|
|
1523
|
-
[/^m{2,}/, "minute2"],
|
|
1524
|
-
[/^m/, "minute1"],
|
|
1525
|
-
[/^s{2,}/, "second2"],
|
|
1526
|
-
[/^s/, "second1"],
|
|
1527
|
-
[/^f+/, "fraction"],
|
|
1528
|
-
[/^tt/, "meridiemLong"],
|
|
1529
|
-
[/^t/, "meridiemShort"]
|
|
1530
|
-
];
|
|
1531
|
-
function tokenize(s2, dialect) {
|
|
1532
|
-
const table = dialect === "excel" ? EXCEL_TOKENS : DOTNET_TOKENS;
|
|
1533
|
-
const out = [];
|
|
1534
|
-
let i2 = 0;
|
|
1535
|
-
while (i2 < s2.length) {
|
|
1536
|
-
const ch = s2[i2];
|
|
1537
|
-
if (ch === "\\" || dialect === "dotnet" && ch === "%") {
|
|
1538
|
-
if (i2 + 1 < s2.length) out.push({ kind: "literal", text: s2[i2 + 1] });
|
|
1539
|
-
i2 += 2;
|
|
1540
|
-
continue;
|
|
1541
|
-
}
|
|
1542
|
-
if (ch === '"' || dialect === "dotnet" && ch === "'") {
|
|
1543
|
-
const end = s2.indexOf(ch, i2 + 1);
|
|
1544
|
-
out.push({ kind: "literal", text: end < 0 ? s2.slice(i2 + 1) : s2.slice(i2 + 1, end) });
|
|
1545
|
-
i2 = end < 0 ? s2.length : end + 1;
|
|
1546
|
-
continue;
|
|
1547
|
-
}
|
|
1548
|
-
const rest = s2.slice(i2);
|
|
1549
|
-
let matched = false;
|
|
1550
|
-
for (const [re, kind] of table) {
|
|
1551
|
-
const m2 = re.exec(rest);
|
|
1552
|
-
if (m2) {
|
|
1553
|
-
out.push({ kind });
|
|
1554
|
-
i2 += m2[0].length;
|
|
1555
|
-
matched = true;
|
|
1556
|
-
break;
|
|
1557
|
-
}
|
|
1558
|
-
}
|
|
1559
|
-
if (!matched) {
|
|
1560
|
-
out.push({ kind: "literal", text: ch });
|
|
1561
|
-
i2++;
|
|
1562
|
-
}
|
|
1563
|
-
}
|
|
1564
|
-
return out;
|
|
1565
|
-
}
|
|
1566
|
-
function resolveAmbiguousM(tokens) {
|
|
1567
|
-
const isHour = (t2) => t2.kind === "hour1" || t2.kind === "hour2";
|
|
1568
|
-
const isSecond = (t2) => t2.kind === "second1" || t2.kind === "second2";
|
|
1569
|
-
for (let i2 = 0; i2 < tokens.length; i2++) {
|
|
1570
|
-
const t2 = tokens[i2];
|
|
1571
|
-
if (t2.kind !== "mAmbiguous1" && t2.kind !== "mAmbiguous2") continue;
|
|
1572
|
-
const two = t2.kind === "mAmbiguous2";
|
|
1573
|
-
let minute = false;
|
|
1574
|
-
for (let j2 = i2 - 1; j2 >= 0; j2--) {
|
|
1575
|
-
if (tokens[j2].kind === "literal") continue;
|
|
1576
|
-
minute = isHour(tokens[j2]);
|
|
1577
|
-
break;
|
|
1578
|
-
}
|
|
1579
|
-
if (!minute) {
|
|
1580
|
-
for (let j2 = i2 + 1; j2 < tokens.length; j2++) {
|
|
1581
|
-
if (tokens[j2].kind === "literal") continue;
|
|
1582
|
-
minute = isSecond(tokens[j2]);
|
|
1583
|
-
break;
|
|
1584
|
-
}
|
|
1585
|
-
}
|
|
1586
|
-
t2.kind = minute ? two ? "minute2" : "minute1" : two ? "month2" : "month1";
|
|
1587
|
-
}
|
|
1588
|
-
}
|
|
1589
|
-
var EN_MONTHS_LONG = [
|
|
1590
|
-
"January",
|
|
1591
|
-
"February",
|
|
1592
|
-
"March",
|
|
1593
|
-
"April",
|
|
1594
|
-
"May",
|
|
1595
|
-
"June",
|
|
1596
|
-
"July",
|
|
1597
|
-
"August",
|
|
1598
|
-
"September",
|
|
1599
|
-
"October",
|
|
1600
|
-
"November",
|
|
1601
|
-
"December"
|
|
1602
|
-
];
|
|
1603
|
-
var EN_MONTHS_SHORT = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
1604
|
-
var EN_DAYS_LONG = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
|
1605
|
-
var EN_DAYS_SHORT = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
1606
|
-
function name(p3, kind, width, culture) {
|
|
1607
|
-
try {
|
|
1608
|
-
const opts = kind === "month" ? { month: width, timeZone: "UTC" } : { weekday: width === "narrow" ? "short" : width, timeZone: "UTC" };
|
|
1609
|
-
return new Intl.DateTimeFormat(culture || void 0, opts).format(utcAnchor(p3));
|
|
1610
|
-
} catch {
|
|
1611
|
-
if (kind === "month") {
|
|
1612
|
-
const long = EN_MONTHS_LONG[p3.month - 1] ?? "";
|
|
1613
|
-
if (width === "long") return long;
|
|
1614
|
-
return width === "narrow" ? long.slice(0, 1) : EN_MONTHS_SHORT[p3.month - 1] ?? "";
|
|
1615
|
-
}
|
|
1616
|
-
return (width === "long" ? EN_DAYS_LONG[p3.weekday] : EN_DAYS_SHORT[p3.weekday]) ?? "";
|
|
1617
|
-
}
|
|
1618
|
-
}
|
|
1619
|
-
var p2 = (n2) => (n2 < 10 ? "0" : "") + n2;
|
|
1620
|
-
function renderFormat(format, p3, dialect, culture) {
|
|
1621
|
-
const tokens = tokenize(format, dialect);
|
|
1622
|
-
if (dialect === "excel") resolveAmbiguousM(tokens);
|
|
1623
|
-
const twelve = tokens.some((t2) => t2.kind === "meridiemLong" || t2.kind === "meridiemShort");
|
|
1624
|
-
const hour12 = () => {
|
|
1625
|
-
const h2 = p3.hours % 12;
|
|
1626
|
-
return h2 === 0 ? 12 : h2;
|
|
1627
|
-
};
|
|
1628
|
-
let out = "";
|
|
1629
|
-
let sawField = false;
|
|
1630
|
-
for (const t2 of tokens) {
|
|
1631
|
-
switch (t2.kind) {
|
|
1632
|
-
case "literal":
|
|
1633
|
-
out += t2.text ?? "";
|
|
1634
|
-
break;
|
|
1635
|
-
case "year4":
|
|
1636
|
-
out += String(p3.year);
|
|
1637
|
-
sawField = true;
|
|
1638
|
-
break;
|
|
1639
|
-
case "year2":
|
|
1640
|
-
out += p2((p3.year % 100 + 100) % 100);
|
|
1641
|
-
sawField = true;
|
|
1642
|
-
break;
|
|
1643
|
-
case "monthLong":
|
|
1644
|
-
out += name(p3, "month", "long", culture);
|
|
1645
|
-
sawField = true;
|
|
1646
|
-
break;
|
|
1647
|
-
case "monthShort":
|
|
1648
|
-
out += name(p3, "month", "short", culture);
|
|
1649
|
-
sawField = true;
|
|
1650
|
-
break;
|
|
1651
|
-
case "monthNarrow":
|
|
1652
|
-
out += name(p3, "month", "long", culture).slice(0, 1);
|
|
1653
|
-
sawField = true;
|
|
1654
|
-
break;
|
|
1655
|
-
case "month2":
|
|
1656
|
-
out += p2(p3.month);
|
|
1657
|
-
sawField = true;
|
|
1658
|
-
break;
|
|
1659
|
-
case "month1":
|
|
1660
|
-
out += String(p3.month);
|
|
1661
|
-
sawField = true;
|
|
1662
|
-
break;
|
|
1663
|
-
case "weekdayLong":
|
|
1664
|
-
out += name(p3, "weekday", "long", culture);
|
|
1665
|
-
sawField = true;
|
|
1666
|
-
break;
|
|
1667
|
-
case "weekdayShort":
|
|
1668
|
-
out += name(p3, "weekday", "short", culture);
|
|
1669
|
-
sawField = true;
|
|
1670
|
-
break;
|
|
1671
|
-
case "day2":
|
|
1672
|
-
out += p2(p3.day);
|
|
1673
|
-
sawField = true;
|
|
1674
|
-
break;
|
|
1675
|
-
case "day1":
|
|
1676
|
-
out += String(p3.day);
|
|
1677
|
-
sawField = true;
|
|
1678
|
-
break;
|
|
1679
|
-
case "hour2":
|
|
1680
|
-
out += p2(twelve ? hour12() : p3.hours);
|
|
1681
|
-
sawField = true;
|
|
1682
|
-
break;
|
|
1683
|
-
case "hour1":
|
|
1684
|
-
out += String(twelve ? hour12() : p3.hours);
|
|
1685
|
-
sawField = true;
|
|
1686
|
-
break;
|
|
1687
|
-
case "minute2":
|
|
1688
|
-
out += p2(p3.minutes);
|
|
1689
|
-
sawField = true;
|
|
1690
|
-
break;
|
|
1691
|
-
case "minute1":
|
|
1692
|
-
out += String(p3.minutes);
|
|
1693
|
-
sawField = true;
|
|
1694
|
-
break;
|
|
1695
|
-
case "second2":
|
|
1696
|
-
out += p2(p3.seconds);
|
|
1697
|
-
sawField = true;
|
|
1698
|
-
break;
|
|
1699
|
-
case "second1":
|
|
1700
|
-
out += String(p3.seconds);
|
|
1701
|
-
sawField = true;
|
|
1702
|
-
break;
|
|
1703
|
-
case "fraction":
|
|
1704
|
-
out += String(p3.ms).padStart(3, "0");
|
|
1705
|
-
sawField = true;
|
|
1706
|
-
break;
|
|
1707
|
-
case "meridiemLong":
|
|
1708
|
-
out += p3.hours < 12 ? "AM" : "PM";
|
|
1709
|
-
sawField = true;
|
|
1710
|
-
break;
|
|
1711
|
-
case "meridiemShort":
|
|
1712
|
-
out += p3.hours < 12 ? "A" : "P";
|
|
1713
|
-
sawField = true;
|
|
1714
|
-
break;
|
|
1715
|
-
}
|
|
1716
|
-
}
|
|
1717
|
-
return sawField && out.trim() ? out : null;
|
|
1718
|
-
}
|
|
1719
|
-
|
|
1720
|
-
// src/selectionCard.ts
|
|
1721
|
-
var SYNTHETIC_PREFIX = "__";
|
|
1722
|
-
var NUMERIC_DATATYPE = /int|double|decimal|single|float|number|currency|money/i;
|
|
1723
|
-
function normaliseAggregation(raw) {
|
|
1724
|
-
const s2 = String(raw ?? "").trim().toLowerCase();
|
|
1725
|
-
if (!s2) return "sum";
|
|
1726
|
-
if (/^(avg|average|mean)$/.test(s2)) return "average";
|
|
1727
|
-
if (/^(min|minimum)$/.test(s2)) return "min";
|
|
1728
|
-
if (/^(max|maximum)$/.test(s2)) return "max";
|
|
1729
|
-
if (/^(count|countrows)$/.test(s2)) return "count";
|
|
1730
|
-
if (/^(median|med)$/.test(s2)) return "median";
|
|
1731
|
-
if (/^(distinctcount|dcount|countdistinct|uniques?)$/.test(s2)) return "distinctcount";
|
|
1732
|
-
return "sum";
|
|
1733
|
-
}
|
|
1734
|
-
function aggLabel(agg) {
|
|
1735
|
-
switch (agg) {
|
|
1736
|
-
case "average":
|
|
1737
|
-
return "Average";
|
|
1738
|
-
case "min":
|
|
1739
|
-
return "Min";
|
|
1740
|
-
case "max":
|
|
1741
|
-
return "Max";
|
|
1742
|
-
case "count":
|
|
1743
|
-
return "Count";
|
|
1744
|
-
case "median":
|
|
1745
|
-
return "Median";
|
|
1746
|
-
case "distinctcount":
|
|
1747
|
-
return "Distinct";
|
|
1748
|
-
default:
|
|
1749
|
-
return "Sum";
|
|
1750
|
-
}
|
|
1751
|
-
}
|
|
1752
|
-
function measureLineLabel(agg, name2) {
|
|
1753
|
-
const col = String(name2 ?? "");
|
|
1754
|
-
const prefix = aggLabel(agg) + " of ";
|
|
1755
|
-
return col.trim().toLowerCase().startsWith(prefix.toLowerCase()) ? col.trim() : prefix + col;
|
|
1756
|
-
}
|
|
1757
|
-
function isSynthetic(name2) {
|
|
1758
|
-
return String(name2 ?? "").startsWith(SYNTHETIC_PREFIX);
|
|
1759
|
-
}
|
|
1760
|
-
function isMeasureColumn(col) {
|
|
1761
|
-
if (!col || isSynthetic(col.name)) return false;
|
|
1762
|
-
if (col.isMeasure === true) return true;
|
|
1763
|
-
return NUMERIC_DATATYPE.test(String(col.dataType ?? ""));
|
|
1764
|
-
}
|
|
1765
|
-
function isRealColumn(col) {
|
|
1766
|
-
return !!col && !isSynthetic(col.name);
|
|
1767
|
-
}
|
|
1768
|
-
function isSerialisedDateColumn(col) {
|
|
1769
|
-
return /^datetime/i.test(String(col?.dataType ?? ""));
|
|
1770
|
-
}
|
|
1771
|
-
function displayText(col, raw, opts) {
|
|
1772
|
-
if (raw == null || raw === "") return "(blank)";
|
|
1773
|
-
if (isSerialisedDateColumn(col)) {
|
|
1774
|
-
const shown = formatSourceDate(raw, {
|
|
1775
|
-
format: opts.sourceFormats?.byColumn?.[String(col?.name ?? "")] ?? null,
|
|
1776
|
-
dialect: opts.sourceFormats?.dialect,
|
|
1777
|
-
culture: opts.cultureCode
|
|
1778
|
-
});
|
|
1779
|
-
if (shown) return shown;
|
|
1780
|
-
}
|
|
1781
|
-
return String(raw);
|
|
1782
|
-
}
|
|
1783
|
-
function isSuppressed(col) {
|
|
1784
|
-
return qe(col).suppressed;
|
|
1785
|
-
}
|
|
1786
|
-
function resolveAgg(col, requested, auto) {
|
|
1787
|
-
const fallback = () => {
|
|
1788
|
-
const d2 = Zn(col);
|
|
1789
|
-
return d2 === "first" ? "count" : d2;
|
|
1790
|
-
};
|
|
1791
|
-
if (auto) return fallback();
|
|
1792
|
-
return Qe(col).indexOf(requested) >= 0 ? requested : fallback();
|
|
1793
|
-
}
|
|
1794
|
-
function toNumber(v2) {
|
|
1795
|
-
if (v2 == null || v2 === "") return null;
|
|
1796
|
-
const n2 = typeof v2 === "number" ? v2 : Number(v2);
|
|
1797
|
-
return Number.isFinite(n2) ? n2 : null;
|
|
1798
|
-
}
|
|
1799
|
-
function reduce(values, agg, distinctRaw) {
|
|
1800
|
-
if (agg === "count") return values.length;
|
|
1801
|
-
if (agg === "distinctcount") return new Set(distinctRaw.map((v2) => v2 == null ? "\0" : String(v2))).size;
|
|
1802
|
-
if (!values.length) return null;
|
|
1803
|
-
switch (agg) {
|
|
1804
|
-
case "average":
|
|
1805
|
-
return values.reduce((a2, b2) => a2 + b2, 0) / values.length;
|
|
1806
|
-
case "min":
|
|
1807
|
-
return Math.min(...values);
|
|
1808
|
-
case "max":
|
|
1809
|
-
return Math.max(...values);
|
|
1810
|
-
case "median": {
|
|
1811
|
-
const s2 = [...values].sort((a2, b2) => a2 - b2);
|
|
1812
|
-
const m2 = s2.length >> 1;
|
|
1813
|
-
return s2.length % 2 ? s2[m2] : (s2[m2 - 1] + s2[m2]) / 2;
|
|
1814
|
-
}
|
|
1815
|
-
default:
|
|
1816
|
-
return values.reduce((a2, b2) => a2 + b2, 0);
|
|
1817
|
-
}
|
|
1818
|
-
}
|
|
1819
|
-
function fmtNumber(v2, culture) {
|
|
1820
|
-
try {
|
|
1821
|
-
const abs = Math.abs(v2);
|
|
1822
|
-
const opts = abs >= 1e6 ? { notation: "compact", maximumFractionDigits: 1 } : { maximumFractionDigits: abs < 10 ? 2 : 0 };
|
|
1823
|
-
return new Intl.NumberFormat(culture || void 0, opts).format(v2);
|
|
1824
|
-
} catch {
|
|
1825
|
-
return String(Math.round(v2 * 100) / 100);
|
|
1826
|
-
}
|
|
1827
|
-
}
|
|
1828
|
-
function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
|
|
1829
|
-
const columns = payload?.columns ?? [];
|
|
1830
|
-
const rows = payload?.rows ?? [];
|
|
1831
|
-
if (!columns.length || !rows.length) return null;
|
|
1832
|
-
const wanted = Array.from(new Set((selectedRowIdxs ?? []).filter((n2) => Number.isInteger(n2))));
|
|
1833
|
-
if (!wanted.length) return null;
|
|
1834
|
-
const rowIdxCol = columns.findIndex((c2) => c2?.name === "__rowIdx__");
|
|
1835
|
-
let byIdx = null;
|
|
1836
|
-
if (rowIdxCol >= 0) {
|
|
1837
|
-
byIdx = /* @__PURE__ */ new Map();
|
|
1838
|
-
for (let r2 = 0; r2 < rows.length; r2++) {
|
|
1839
|
-
const v2 = toNumber(rows[r2]?.[rowIdxCol]);
|
|
1840
|
-
if (v2 != null) byIdx.set(v2, r2);
|
|
1841
|
-
}
|
|
1842
|
-
}
|
|
1843
|
-
const positions = [];
|
|
1844
|
-
for (const idx of wanted) {
|
|
1845
|
-
const pos = byIdx ? byIdx.get(idx) : idx;
|
|
1846
|
-
if (pos != null && pos >= 0 && pos < rows.length) positions.push(pos);
|
|
1847
|
-
}
|
|
1848
|
-
if (!positions.length) return null;
|
|
1849
|
-
const auto = String(opts.aggregation ?? "").trim().length === 0;
|
|
1850
|
-
const agg = normaliseAggregation(opts.aggregation);
|
|
1851
|
-
const maxMeasures = opts.maxMeasures ?? 4;
|
|
1852
|
-
const maxHeaderValues = opts.maxHeaderValues ?? 3;
|
|
1853
|
-
const maxDimensions = opts.maxDimensions ?? 2;
|
|
1854
|
-
const dimIdx = columns.findIndex((c2) => c2 && !isSynthetic(c2.name) && !isMeasureColumn(c2));
|
|
1855
|
-
let header;
|
|
1856
|
-
if (dimIdx >= 0) {
|
|
1857
|
-
const seen = [];
|
|
1858
|
-
const set = /* @__PURE__ */ new Set();
|
|
1859
|
-
for (const p3 of positions) {
|
|
1860
|
-
const s2 = displayText(columns[dimIdx], rows[p3]?.[dimIdx], opts);
|
|
1861
|
-
if (!set.has(s2)) {
|
|
1862
|
-
set.add(s2);
|
|
1863
|
-
seen.push(s2);
|
|
1864
|
-
}
|
|
1865
|
-
if (seen.length > maxHeaderValues) break;
|
|
1866
|
-
}
|
|
1867
|
-
header = seen.length > maxHeaderValues ? `${positions.length} marks` : seen.join(", ");
|
|
1868
|
-
} else {
|
|
1869
|
-
header = `${positions.length} mark${positions.length === 1 ? "" : "s"}`;
|
|
1870
|
-
}
|
|
1871
|
-
const measureCols = [];
|
|
1872
|
-
const suppressedColumns = [];
|
|
1873
|
-
for (let c2 = 0; c2 < columns.length; c2++) {
|
|
1874
|
-
if (!isMeasureColumn(columns[c2])) continue;
|
|
1875
|
-
if (isSuppressed(columns[c2])) {
|
|
1876
|
-
suppressedColumns.push(String(columns[c2]?.name ?? ""));
|
|
1877
|
-
continue;
|
|
1878
|
-
}
|
|
1879
|
-
measureCols.push(c2);
|
|
1880
|
-
}
|
|
1881
|
-
const shown = measureCols.slice(0, maxMeasures);
|
|
1882
|
-
const lines = [];
|
|
1883
|
-
for (const c2 of shown) {
|
|
1884
|
-
const col = columns[c2];
|
|
1885
|
-
const colAgg = resolveAgg(col, agg, auto);
|
|
1886
|
-
const selVals = [];
|
|
1887
|
-
const selRaw = [];
|
|
1888
|
-
for (const p3 of positions) {
|
|
1889
|
-
const n2 = toNumber(rows[p3]?.[c2]);
|
|
1890
|
-
selRaw.push(rows[p3]?.[c2]);
|
|
1891
|
-
if (n2 != null) selVals.push(n2);
|
|
1892
|
-
}
|
|
1893
|
-
const value = reduce(selVals, colAgg, selRaw);
|
|
1894
|
-
let sharePct = null;
|
|
1895
|
-
if (Qn(col, colAgg) && value != null) {
|
|
1896
|
-
const allVals = [];
|
|
1897
|
-
const allRaw = [];
|
|
1898
|
-
for (let r2 = 0; r2 < rows.length; r2++) {
|
|
1899
|
-
const n2 = toNumber(rows[r2]?.[c2]);
|
|
1900
|
-
allRaw.push(rows[r2]?.[c2]);
|
|
1901
|
-
if (n2 != null) allVals.push(n2);
|
|
1902
|
-
}
|
|
1903
|
-
const total = reduce(allVals, colAgg, allRaw);
|
|
1904
|
-
if (total != null && total > 0) sharePct = value / total * 100;
|
|
1905
|
-
}
|
|
1906
|
-
lines.push({
|
|
1907
|
-
column: String(col?.name ?? ""),
|
|
1908
|
-
label: measureLineLabel(colAgg, String(col?.name ?? "")),
|
|
1909
|
-
value,
|
|
1910
|
-
valueText: value == null ? "\u2014" : fmtNumber(value, opts.cultureCode),
|
|
1911
|
-
sharePct,
|
|
1912
|
-
shareText: sharePct == null ? "" : `${sharePct < 0.1 ? "<0.1" : sharePct.toFixed(1)}% of total`,
|
|
1913
|
-
aggregation: colAgg
|
|
1914
|
-
});
|
|
1915
|
-
}
|
|
1916
|
-
const dimensionLines = [];
|
|
1917
|
-
for (let c2 = 0; c2 < columns.length && dimensionLines.length < maxDimensions; c2++) {
|
|
1918
|
-
if (c2 === dimIdx) continue;
|
|
1919
|
-
if (!isRealColumn(columns[c2]) || isMeasureColumn(columns[c2])) continue;
|
|
1920
|
-
const name2 = String(columns[c2]?.name ?? "");
|
|
1921
|
-
const distinct = /* @__PURE__ */ new Set();
|
|
1922
|
-
let firstText = "";
|
|
1923
|
-
for (const p3 of positions) {
|
|
1924
|
-
const raw = rows[p3]?.[c2];
|
|
1925
|
-
const key = raw == null || raw === "" ? "(blank)" : String(raw);
|
|
1926
|
-
if (!distinct.size) firstText = displayText(columns[c2], raw, opts);
|
|
1927
|
-
distinct.add(key);
|
|
1928
|
-
}
|
|
1929
|
-
if (!distinct.size) continue;
|
|
1930
|
-
const single = distinct.size === 1;
|
|
1931
|
-
dimensionLines.push({
|
|
1932
|
-
column: name2,
|
|
1933
|
-
label: single ? name2 : `Distinct ${name2}`,
|
|
1934
|
-
value: single ? null : distinct.size,
|
|
1935
|
-
valueText: single ? firstText : fmtNumber(distinct.size, opts.cultureCode),
|
|
1936
|
-
sharePct: null,
|
|
1937
|
-
shareText: "",
|
|
1938
|
-
aggregation: single ? "first" : "distinctcount"
|
|
1939
|
-
});
|
|
1940
|
-
}
|
|
1941
|
-
return {
|
|
1942
|
-
header,
|
|
1943
|
-
lines,
|
|
1944
|
-
dimensionLines,
|
|
1945
|
-
suppressedColumns,
|
|
1946
|
-
rowsText: `${positions.length} of ${rows.length} rows`,
|
|
1947
|
-
selectedRows: positions.length,
|
|
1948
|
-
totalRows: rows.length,
|
|
1949
|
-
hiddenMeasures: Math.max(0, measureCols.length - shown.length),
|
|
1950
|
-
aggregation: agg
|
|
1951
|
-
};
|
|
1952
|
-
}
|
|
1953
|
-
|
|
1954
1360
|
// src/summaryText.ts
|
|
1955
1361
|
function composeSummaryText(codeSummary, warningMsg) {
|
|
1956
1362
|
let sumText = String(codeSummary ?? "");
|
|
@@ -2049,8 +1455,8 @@ function p(t2, r2, n2, e2) {
|
|
|
2049
1455
|
}
|
|
2050
1456
|
else u3 = NaN;
|
|
2051
1457
|
return 360 * u3;
|
|
2052
|
-
})(t2, r2, n2, "i" === e2), h2 = 0, c2 = (i2 + a2) / 2, l3 = i2 - a2,
|
|
2053
|
-
return "v" === e2 && (h2 = 0 === i2 ? 0 : l3 / i2), i2 !== a2 && "l" === e2 && (h2 = c2 > 0.5 ? l3 / (2 - i2 - a2) : l3 / (i2 + a2)), "i" === e2 && (h2 = f2 > 0 ? 1 - a2 / f2 : 0), h2 *= 100, c2 *= 100, f2 *= 100, "l" === e2 ? [u2, h2, c2] : "v" === e2 ? [u2, h2,
|
|
1458
|
+
})(t2, r2, n2, "i" === e2), h2 = 0, c2 = (i2 + a2) / 2, l3 = i2 - a2, p2 = i2, f2 = (t2 + r2 + n2) / 3;
|
|
1459
|
+
return "v" === e2 && (h2 = 0 === i2 ? 0 : l3 / i2), i2 !== a2 && "l" === e2 && (h2 = c2 > 0.5 ? l3 / (2 - i2 - a2) : l3 / (i2 + a2)), "i" === e2 && (h2 = f2 > 0 ? 1 - a2 / f2 : 0), h2 *= 100, c2 *= 100, f2 *= 100, "l" === e2 ? [u2, h2, c2] : "v" === e2 ? [u2, h2, p2 *= 100] : [u2, h2, f2];
|
|
2054
1460
|
}
|
|
2055
1461
|
var f = function(t2, r2, n2) {
|
|
2056
1462
|
return p(t2, r2, n2, "l");
|
|
@@ -2140,7 +1546,7 @@ var S = function(t2, r2, n2) {
|
|
|
2140
1546
|
var A = function(t2, r2, n2) {
|
|
2141
1547
|
return isNaN(n2) && (n2 = 0), n2 *= Math.PI / 180, [t2, Math.cos(n2) * r2, Math.sin(n2) * r2];
|
|
2142
1548
|
};
|
|
2143
|
-
var
|
|
1549
|
+
var L = function(t2, r2, n2) {
|
|
2144
1550
|
return P.apply(void 0, A(t2, r2, n2));
|
|
2145
1551
|
};
|
|
2146
1552
|
var H = function(t2, r2, n2) {
|
|
@@ -2151,7 +1557,7 @@ var Y = Object.freeze({ __proto__: null, linear2rgb: e, rgb2linear: n, rgb2hex:
|
|
|
2151
1557
|
return O.apply(void 0, z(t2, r2, n2));
|
|
2152
1558
|
}, lab2rgb: j, lch2lab: A, lab2lch: S, xyz2lch: function(t2, r2, n2) {
|
|
2153
1559
|
return S.apply(void 0, O(t2, r2, n2));
|
|
2154
|
-
}, lch2xyz:
|
|
1560
|
+
}, lch2xyz: L, xyY2xyz: function(t2, r2, n2) {
|
|
2155
1561
|
return 0 === r2 ? [0, 0, 0] : [t2 * (n2 / r2), n2, n2 / r2 * (1 - t2 - r2)];
|
|
2156
1562
|
}, xyz2xyY: H });
|
|
2157
1563
|
function R(t2, n2) {
|
|
@@ -2176,8 +1582,8 @@ function q(t2, n2, e2, o3) {
|
|
|
2176
1582
|
for (var a3 = [], u3 = 0; u3 < arguments.length; u3++) a3[u3] = arguments[u3];
|
|
2177
1583
|
var h3 = void 0 === a3[o3] ? e2 : a3[o3], l3 = c2.call.apply(c2, r([this], a3, false));
|
|
2178
1584
|
if (false === h3) return l3;
|
|
2179
|
-
var
|
|
2180
|
-
return 1 === n2 ? "number" == typeof h3 ?
|
|
1585
|
+
var p2 = "number" == typeof h3 ? Math.round(h3) : 0, f2 = "number" == typeof t2 ? new Array(l3.length).fill(t2) : t2, s2 = f2.map((function(t3) {
|
|
1586
|
+
return 1 === n2 ? "number" == typeof h3 ? p2 : t3 : t3 + p2;
|
|
2181
1587
|
}));
|
|
2182
1588
|
return l3.map((function(t3, r2) {
|
|
2183
1589
|
return i(t3, s2[r2]);
|
|
@@ -2186,8 +1592,8 @@ function q(t2, n2, e2, o3) {
|
|
|
2186
1592
|
};
|
|
2187
1593
|
}
|
|
2188
1594
|
var D = function(t2, r2, n2) {
|
|
2189
|
-
var e2 = t2 instanceof ft ? t2 : new ft(t2), i2 = r2 instanceof ft ? r2 : new ft(r2), a2 = o2(n2, 0, 100) / 100, u2 = 2 * a2 - 1, h2 = e2.alpha() - i2.alpha(), c2 = ((u2 * h2 == -1 ? u2 : (u2 + h2) / (1 + u2 * h2)) + 1) / 2, l3 = 1 - c2,
|
|
2190
|
-
return new ft(
|
|
1595
|
+
var e2 = t2 instanceof ft ? t2 : new ft(t2), i2 = r2 instanceof ft ? r2 : new ft(r2), a2 = o2(n2, 0, 100) / 100, u2 = 2 * a2 - 1, h2 = e2.alpha() - i2.alpha(), c2 = ((u2 * h2 == -1 ? u2 : (u2 + h2) / (1 + u2 * h2)) + 1) / 2, l3 = 1 - c2, p2 = [Math.round(o2(e2.red() * c2 + i2.red() * l3, 0, 255)), Math.round(o2(e2.green() * c2 + i2.green() * l3, 0, 255)), Math.round(o2(e2.blue() * c2 + i2.blue() * l3, 0, 255))], f2 = e2.alpha() * a2 + i2.alpha() * (1 - a2);
|
|
1596
|
+
return new ft(p2, f2);
|
|
2191
1597
|
};
|
|
2192
1598
|
var F = Math.sqrt;
|
|
2193
1599
|
var U = Math.pow;
|
|
@@ -2225,7 +1631,7 @@ var et = function(t2, r2, n2, e2) {
|
|
|
2225
1631
|
var i2 = Object.assign({}, { l: 1, c: 1 }, e2);
|
|
2226
1632
|
return (function(t3, r3, n3, e3) {
|
|
2227
1633
|
void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1);
|
|
2228
|
-
var o4 = V(t3, true), i3 = o4[0], a3 = o4[1], u3 = o4[2], h3 = o4[3], c3 = o4[4], l3 = V(r3),
|
|
1634
|
+
var o4 = V(t3, true), i3 = o4[0], a3 = o4[1], u3 = o4[2], h3 = o4[3], c3 = o4[4], l3 = V(r3), p2 = l3[0], f2 = l3[1], s2 = l3[3], v2 = a3 - f2, b2 = i3 - p2, y2 = c3 - l3[4], d2 = F(U(h3 - s2, 2) + U(y2, 2) - U(v2, 2)), g2 = i3 < 16 ? 0.511 : 0.040975 * i3 / (1 + 0.01765 * i3), w2 = 0.0638 * a3 / (1 + 0.0131 * a3) + 0.638, m2 = 164 <= u3 && u3 <= 345 ? 0.56 + J(0.2 * $(Q(u3 + 168))) : 0.36 + J(0.4 * $(Q(u3 + 35))), M2 = F(U(a3, 4) / (U(a3, 4) + 1900)), x2 = w2 * (M2 * m2 + 1 - M2);
|
|
2229
1635
|
return F(U(b2 / (n3 * g2), 2) + U(v2 / (e3 * w2), 2) + U(d2 / x2, 2));
|
|
2230
1636
|
})(t2, r2, i2.l, i2.c);
|
|
2231
1637
|
}
|
|
@@ -2235,7 +1641,7 @@ var et = function(t2, r2, n2, e2) {
|
|
|
2235
1641
|
void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1), void 0 === o4 && (o4 = 1), void 0 === i3 && (i3 = "graphic");
|
|
2236
1642
|
var a3 = "textiles" === i3 ? 0.048 : 0.045, u3 = "textiles" === i3 ? 0.014 : 0.015;
|
|
2237
1643
|
n3 = "textiles" === i3 ? 2 : n3;
|
|
2238
|
-
var h3 = V(t3), c3 = h3[0], l3 = h3[1],
|
|
1644
|
+
var h3 = V(t3), c3 = h3[0], l3 = h3[1], p2 = h3[3], f2 = h3[4], s2 = V(r3), v2 = s2[0], b2 = s2[1], y2 = s2[3], d2 = c3 - v2, g2 = l3 - b2, w2 = f2 - s2[4], m2 = 1 + a3 * l3, M2 = 1 + u3 * l3, x2 = F(U(p2 - y2, 2) + U(w2, 2) - U(g2, 2));
|
|
2239
1645
|
return F(U(d2 / (1 * n3), 2) + U(g2 / (e3 * m2), 2) + U(x2 / (o4 * M2), 2));
|
|
2240
1646
|
})(t2, r2, u2.kL, u2.kC, u2.kH, u2.cate);
|
|
2241
1647
|
}
|
|
@@ -2246,8 +1652,8 @@ var et = function(t2, r2, n2, e2) {
|
|
|
2246
1652
|
var h2 = { kL: 1, kC: 1, kH: 1 }, c2 = Object.assign({}, h2, e2);
|
|
2247
1653
|
return (function(t3, r3, n3, e3, o4) {
|
|
2248
1654
|
void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1), void 0 === o4 && (o4 = 1);
|
|
2249
|
-
var i3 = V(t3), a3 = i3[0], u3 = i3[1], h3 = i3[3], c3 = i3[4], l3 = V(r3),
|
|
2250
|
-
return F(U(z2 / (n3 * P2), 2) + U(N2 / (e3 * j2), 2) + U(O2 / (o4 * S2), 2) +
|
|
1655
|
+
var i3 = V(t3), a3 = i3[0], u3 = i3[1], h3 = i3[3], c3 = i3[4], l3 = V(r3), p2 = l3[0], f2 = l3[1], s2 = l3[3], v2 = l3[4], b2 = (a3 + p2) / 2, y2 = (u3 + f2) / 2, d2 = (1 - F(U(y2, 7) / (U(y2, 7) + U(25, 7)))) / 2, g2 = h3 * (1 + d2), w2 = s2 * (1 + d2), m2 = F(U(g2, 2) + U(c3, 2)), M2 = F(U(w2, 2) + U(v2, 2)), x2 = T(g2, c3, true), _2 = T(w2, v2, true), C2 = (m2 + M2) / 2, I2 = J(x2 - _2) > 180 ? (x2 + _2 + 360) / 2 : (x2 + _2) / 2, k2 = 1 - 0.17 * $(Q(I2 - 30)) + 0.24 * $(Q(2 * I2)) + 0.32 * $(Q(3 * I2 + 6)) - 0.2 * $(Q(4 * I2 - 63)), E2 = J(_2 - x2) <= 180 ? _2 - x2 : J(_2 - x2) > 180 && _2 <= x2 ? _2 - x2 + 360 : _2 - x2 - 360, z2 = p2 - a3, N2 = f2 - u3, O2 = 2 * F(m2 * M2) * Z(Q(E2) / 2), P2 = 1 + 0.015 * U(b2 - 50, 2) / F(20 + U(b2 - 50, 2)), j2 = 1 + 0.045 * C2, S2 = 1 + 0.015 * C2 * k2, A2 = 30 * B(-U((I2 - 275) / 25, 2)), L2 = -2 * F(U(C2, 7) / (U(C2, 7) + U(25, 7))) * Z(2 * Q(A2));
|
|
1656
|
+
return F(U(z2 / (n3 * P2), 2) + U(N2 / (e3 * j2), 2) + U(O2 / (o4 * S2), 2) + L2 * (N2 / (e3 * j2)) * (O2 / (o4 * S2)));
|
|
2251
1657
|
})(t2, r2, c2.kL, c2.kC, c2.kH);
|
|
2252
1658
|
};
|
|
2253
1659
|
var ot = function(t2, r2, n2) {
|
|
@@ -2296,7 +1702,7 @@ var lt = function(t2, r2) {
|
|
|
2296
1702
|
if (c2 || (u2 = true), c2) {
|
|
2297
1703
|
var l3 = c2[1].toLocaleLowerCase();
|
|
2298
1704
|
if (e2 = l3, ut.has(l3) || (u2 = true), c2[2] && !u2) {
|
|
2299
|
-
var
|
|
1705
|
+
var p2 = c2[2], f2 = -1 !== p2.indexOf(",") ? "," : " ", s2 = p2.split(f2);
|
|
2300
1706
|
for (a2 = 0; a2 < 3; a2++) void 0 !== s2[a2] && (["lch", "lab"].includes(e2) && 0 === a2 || ["hsl", "hsla", "hsv", "hsva", "hwb", "hwba", "hsi", "hsia"].includes(e2) && a2 > 0 ? o3[a2] = ct(s2[a2]) : o3[a2] = Number(s2[a2].trim()));
|
|
2301
1707
|
["rgba", "hsla", "hsva", "hwba", "hsia"].includes(e2) ? (e2 = e2.slice(0, -1), void 0 !== s2[3] && (i2 = ct(s2[3]))) : "cmyk" === e2 && o3.push(void 0 !== s2[3] ? ct(s2[3]) : 0);
|
|
2302
1708
|
}
|
|
@@ -2327,13 +1733,13 @@ var ft = (function() {
|
|
|
2327
1733
|
var a2 = (function(t3) {
|
|
2328
1734
|
var r3, n4 = { lab2rgb: j, hsl2rgb: s, hsv2rgb: b, xyz2rgb: N, hwb2rgb: w, hsi2rgb: d }, e3 = lt(t3), i3 = e3[0], a3 = e3[1], u3 = e3[2];
|
|
2329
1735
|
if ("rgb" === i3) return [a3, u3];
|
|
2330
|
-
"lch" === i3 && (i3 = (r3 = ["xyz",
|
|
2331
|
-
var h3 = a3[0], c2 = a3[1],
|
|
2332
|
-
if ("cmyk" === i3) return [l2(h3, c2,
|
|
1736
|
+
"lch" === i3 && (i3 = (r3 = ["xyz", L(a3[0], a3[1], a3[2])])[0], a3 = r3[1]);
|
|
1737
|
+
var h3 = a3[0], c2 = a3[1], p2 = a3[2], f2 = a3[3];
|
|
1738
|
+
if ("cmyk" === i3) return [l2(h3, c2, p2, f2).map((function(t4) {
|
|
2333
1739
|
return o2(t4, 0, 255);
|
|
2334
1740
|
})), u3];
|
|
2335
1741
|
var v2 = "".concat(i3, "2rgb");
|
|
2336
|
-
if ("function" == typeof n4[v2]) return [n4[v2](h3, c2,
|
|
1742
|
+
if ("function" == typeof n4[v2]) return [n4[v2](h3, c2, p2).map((function(t4) {
|
|
2337
1743
|
return o2(t4, 0, 255);
|
|
2338
1744
|
})), u3];
|
|
2339
1745
|
throw new Error("Invalid color");
|
|
@@ -2460,7 +1866,7 @@ var wt = function(t2, r2, n2, e2) {
|
|
|
2460
1866
|
return new ft(j(t2, r2, n2), e2);
|
|
2461
1867
|
};
|
|
2462
1868
|
var mt = function(t2, r2, n2, e2) {
|
|
2463
|
-
return new ft(N.apply(void 0,
|
|
1869
|
+
return new ft(N.apply(void 0, L(t2, r2, n2)), e2);
|
|
2464
1870
|
};
|
|
2465
1871
|
function Mt(t2, r2, n2) {
|
|
2466
1872
|
return new ft(t2, r2, n2);
|
|
@@ -2857,7 +2263,7 @@ function fnv1a(text) {
|
|
|
2857
2263
|
function fingerprintComponentDigest(components) {
|
|
2858
2264
|
if (!components || typeof components !== "object") return "";
|
|
2859
2265
|
const parts = [];
|
|
2860
|
-
for (const [
|
|
2266
|
+
for (const [name, value] of Object.entries(components)) {
|
|
2861
2267
|
const timedOut = !!value && typeof value === "object" && value.timeout === "true";
|
|
2862
2268
|
let text;
|
|
2863
2269
|
try {
|
|
@@ -2865,7 +2271,7 @@ function fingerprintComponentDigest(components) {
|
|
|
2865
2271
|
} catch {
|
|
2866
2272
|
text = String(value);
|
|
2867
2273
|
}
|
|
2868
|
-
parts.push(`${
|
|
2274
|
+
parts.push(`${name}:${timedOut ? "timeout" : (fnv1a(text) >>> 16).toString(16).padStart(4, "0")}`);
|
|
2869
2275
|
}
|
|
2870
2276
|
return parts.join(",");
|
|
2871
2277
|
}
|