@bicharts/chart-host 0.5.86 → 0.5.88
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/{chunk-R4STRHXO.mjs → chunk-NWMMNXH2.mjs} +452 -436
- package/dist/index.mjs +1163 -181
- package/dist/react.mjs +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/palette.d.ts +52 -0
- package/dist/types/selectionCard.d.ts +11 -0
- package/dist/types/sourceDateFormat.d.ts +30 -0
- package/package.json +2 -1
package/dist/index.mjs
CHANGED
|
@@ -15,7 +15,6 @@ import {
|
|
|
15
15
|
AXIS_PIN_MAX_BAND_FRACTION,
|
|
16
16
|
AXIS_PIN_MIN_LABELS,
|
|
17
17
|
AXIS_PIN_TRACK_REACH_PX,
|
|
18
|
-
Ae,
|
|
19
18
|
BACKING_MAJORITY,
|
|
20
19
|
COLOR_SCALE_SELF_CLAMP_PCT_DEFAULT,
|
|
21
20
|
COLOR_SCALE_SELF_CLAMP_PCT_MAX,
|
|
@@ -24,7 +23,6 @@ import {
|
|
|
24
23
|
CONTAINER_SLOT_INITIAL_XF_MARK,
|
|
25
24
|
CONTAINER_SLOT_UI_STATE,
|
|
26
25
|
CONTAINER_SLOT_XF_CLEAR,
|
|
27
|
-
Ce,
|
|
28
26
|
DARK_TEXT,
|
|
29
27
|
DIM_OPACITY_DEFAULT,
|
|
30
28
|
DIM_OPACITY_VAR,
|
|
@@ -34,6 +32,7 @@ import {
|
|
|
34
32
|
GLYPH_SAMPLE_N,
|
|
35
33
|
HOST_CONTAINER_CLASS,
|
|
36
34
|
HOST_CONTRACT_VERSION,
|
|
35
|
+
It,
|
|
37
36
|
L3,
|
|
38
37
|
LABEL_CONTRAST_CAP,
|
|
39
38
|
LABEL_CONTRAST_DONE_ATTR,
|
|
@@ -45,16 +44,17 @@ import {
|
|
|
45
44
|
MAX_FRAME_GROW_FACTOR,
|
|
46
45
|
MIN_CONTRAST,
|
|
47
46
|
MIN_HIT_BAND_PX,
|
|
47
|
+
Me,
|
|
48
48
|
PAGE_MATCH_TOLERANCE,
|
|
49
49
|
PHANTOM_FRACTION,
|
|
50
50
|
PILL_MIN_ALPHA,
|
|
51
51
|
PILL_MIN_COVERAGE,
|
|
52
52
|
PILL_OPAQUE_ALPHA,
|
|
53
53
|
ROW_IDX_ATTR,
|
|
54
|
-
Rt,
|
|
55
54
|
SCROLL_SLACK_PX,
|
|
56
55
|
SEASONAL_MARKERS_DEFAULT,
|
|
57
56
|
SELECTION_ACTIVE_CLASS,
|
|
57
|
+
Te,
|
|
58
58
|
VALUE_AXIS_BASELINE_DEFAULT,
|
|
59
59
|
WHITE_TEXT_BG_LUM,
|
|
60
60
|
XFILTER_REFRESH_EVENT,
|
|
@@ -93,6 +93,7 @@ import {
|
|
|
93
93
|
measureContainerBoxes,
|
|
94
94
|
needsScroll,
|
|
95
95
|
noopViewStateProvider,
|
|
96
|
+
p,
|
|
96
97
|
periodTickSuppressesFeedback,
|
|
97
98
|
pillBacksGlyph,
|
|
98
99
|
pinScrolledAxis,
|
|
@@ -108,9 +109,10 @@ import {
|
|
|
108
109
|
stripEsmExports,
|
|
109
110
|
svgInkReach,
|
|
110
111
|
toRGBA,
|
|
112
|
+
u,
|
|
111
113
|
unpinScrolledAxis,
|
|
112
114
|
vt
|
|
113
|
-
} from "./chunk-
|
|
115
|
+
} from "./chunk-NWMMNXH2.mjs";
|
|
114
116
|
import "./chunk-A2GMXZP7.mjs";
|
|
115
117
|
import "./chunk-GHODWOAL.mjs";
|
|
116
118
|
|
|
@@ -118,37 +120,37 @@ import "./chunk-GHODWOAL.mjs";
|
|
|
118
120
|
var META_COLUMNS = /* @__PURE__ */ new Set(["__rowIdx__", "__geoIso__", "__geoLat__", "__geoLon__", "__geoPrecision__"]);
|
|
119
121
|
var MAX_FREQUENCY_CATEGORIES = 30;
|
|
120
122
|
var MIN_HISTOGRAM_ROWS = 8;
|
|
121
|
-
function columnName(
|
|
122
|
-
return typeof
|
|
123
|
+
function columnName(c2) {
|
|
124
|
+
return typeof c2 === "string" ? c2 : String(c2?.name ?? "");
|
|
123
125
|
}
|
|
124
126
|
function isNumericColumn(rows, idx) {
|
|
125
127
|
let seen = 0;
|
|
126
|
-
for (let
|
|
127
|
-
const
|
|
128
|
-
if (
|
|
128
|
+
for (let r2 = 0; r2 < rows.length && seen < 50; r2++) {
|
|
129
|
+
const v2 = rows[r2]?.[idx];
|
|
130
|
+
if (v2 === null || v2 === void 0 || v2 === "") continue;
|
|
129
131
|
seen++;
|
|
130
|
-
if (typeof
|
|
131
|
-
if (!isFinite(
|
|
132
|
+
if (typeof v2 === "number") {
|
|
133
|
+
if (!isFinite(v2)) return false;
|
|
132
134
|
continue;
|
|
133
135
|
}
|
|
134
|
-
if (String(
|
|
136
|
+
if (String(v2).trim() === "" || !isFinite(Number(v2))) return false;
|
|
135
137
|
}
|
|
136
138
|
return seen > 0;
|
|
137
139
|
}
|
|
138
|
-
function lit(
|
|
139
|
-
return JSON.stringify(String(
|
|
140
|
+
function lit(s2) {
|
|
141
|
+
return JSON.stringify(String(s2));
|
|
140
142
|
}
|
|
141
143
|
function planTrivialChart(data) {
|
|
142
144
|
const allCols = Array.isArray(data?.columns) ? data.columns : [];
|
|
143
145
|
const rows = Array.isArray(data?.rows) ? data.rows : [];
|
|
144
146
|
if (!allCols.length || !rows.length) return null;
|
|
145
147
|
const dataCols = [];
|
|
146
|
-
for (let
|
|
147
|
-
if (!META_COLUMNS.has(columnName(allCols[
|
|
148
|
+
for (let i2 = 0; i2 < allCols.length; i2++) {
|
|
149
|
+
if (!META_COLUMNS.has(columnName(allCols[i2]))) dataCols.push(i2);
|
|
148
150
|
}
|
|
149
151
|
if (dataCols.length !== 1) return null;
|
|
150
152
|
const idx = dataCols[0];
|
|
151
|
-
const
|
|
153
|
+
const name2 = columnName(allCols[idx]) || "Value";
|
|
152
154
|
const finish = (kind, reason, source) => ({
|
|
153
155
|
kind,
|
|
154
156
|
reason,
|
|
@@ -160,7 +162,7 @@ function planTrivialChart(data) {
|
|
|
160
162
|
return finish(
|
|
161
163
|
"card",
|
|
162
164
|
"One row of one column holds a single value, so this is a card. No generation was needed and none was used.",
|
|
163
|
-
cardSource(idx,
|
|
165
|
+
cardSource(idx, name2)
|
|
164
166
|
);
|
|
165
167
|
}
|
|
166
168
|
if (isNumericColumn(rows, idx)) {
|
|
@@ -168,12 +170,12 @@ function planTrivialChart(data) {
|
|
|
168
170
|
return finish(
|
|
169
171
|
"histogram",
|
|
170
172
|
"A single numeric column has one defensible chart: the distribution of its values. No generation was needed and none was used.",
|
|
171
|
-
histogramSource(idx,
|
|
173
|
+
histogramSource(idx, name2)
|
|
172
174
|
);
|
|
173
175
|
}
|
|
174
176
|
const distinct = /* @__PURE__ */ new Set();
|
|
175
|
-
for (let
|
|
176
|
-
const raw = rows[
|
|
177
|
+
for (let r2 = 0; r2 < rows.length; r2++) {
|
|
178
|
+
const raw = rows[r2]?.[idx];
|
|
177
179
|
distinct.add(raw === null || raw === void 0 || raw === "" ? "(blank)" : String(raw));
|
|
178
180
|
}
|
|
179
181
|
if (distinct.size < 2 || distinct.size >= rows.length) return null;
|
|
@@ -181,7 +183,7 @@ function planTrivialChart(data) {
|
|
|
181
183
|
return finish(
|
|
182
184
|
"frequency-bar",
|
|
183
185
|
"A single categorical column has one defensible chart: how often each value occurs. No generation was needed and none was used.",
|
|
184
|
-
frequencySource(idx,
|
|
186
|
+
frequencySource(idx, name2)
|
|
185
187
|
);
|
|
186
188
|
}
|
|
187
189
|
function compileTrivialSource(source) {
|
|
@@ -222,7 +224,7 @@ var PRELUDE = `
|
|
|
222
224
|
}
|
|
223
225
|
container.replaceChildren();
|
|
224
226
|
`;
|
|
225
|
-
function cardSource(idx,
|
|
227
|
+
function cardSource(idx, name2) {
|
|
226
228
|
return `function render(container, data, options) {${PRELUDE}
|
|
227
229
|
var raw = rows[0] ? rows[0][${idx}] : null;
|
|
228
230
|
var blank = (raw === null || raw === undefined || raw === '');
|
|
@@ -254,13 +256,13 @@ function cardSource(idx, name) {
|
|
|
254
256
|
label.style.marginTop = '6px'; label.style.textAlign = 'center';
|
|
255
257
|
label.style.maxWidth = '100%'; label.style.overflow = 'hidden';
|
|
256
258
|
label.style.textOverflow = 'ellipsis'; label.style.whiteSpace = 'nowrap';
|
|
257
|
-
label.textContent = ${lit(
|
|
259
|
+
label.textContent = ${lit(name2)};
|
|
258
260
|
|
|
259
261
|
root.appendChild(value); root.appendChild(label);
|
|
260
262
|
container.appendChild(root);
|
|
261
263
|
}`;
|
|
262
264
|
}
|
|
263
|
-
function frequencySource(idx,
|
|
265
|
+
function frequencySource(idx, name2) {
|
|
264
266
|
return `function render(container, data, options) {${PRELUDE}
|
|
265
267
|
var counts = new Map();
|
|
266
268
|
for (var r = 0; r < rows.length; r++) {
|
|
@@ -280,7 +282,7 @@ function frequencySource(idx, name) {
|
|
|
280
282
|
var barH = Math.min(bandH - 3, 26);
|
|
281
283
|
|
|
282
284
|
var title = svgEl('text', { x: 8, y: CF + 2, 'font-size': CF, 'font-weight': '700', fill: FG });
|
|
283
|
-
title.textContent = ${lit(
|
|
285
|
+
title.textContent = ${lit(name2)} + ' \\u2014 count of ' + fmt(rows.length) + ' rows';
|
|
284
286
|
svg.appendChild(title);
|
|
285
287
|
|
|
286
288
|
entries.forEach(function (e, i) {
|
|
@@ -319,7 +321,7 @@ function frequencySource(idx, name) {
|
|
|
319
321
|
container.appendChild(svg);
|
|
320
322
|
}`;
|
|
321
323
|
}
|
|
322
|
-
function histogramSource(idx,
|
|
324
|
+
function histogramSource(idx, name2) {
|
|
323
325
|
return `function render(container, data, options) {${PRELUDE}
|
|
324
326
|
var vals = [];
|
|
325
327
|
for (var r = 0; r < rows.length; r++) {
|
|
@@ -355,7 +357,7 @@ function histogramSource(idx, name) {
|
|
|
355
357
|
var bw = plotW / binCount;
|
|
356
358
|
|
|
357
359
|
var title = svgEl('text', { x: padL, y: CF + 2, 'font-size': CF, 'font-weight': '700', fill: FG });
|
|
358
|
-
title.textContent = ${lit(
|
|
360
|
+
title.textContent = ${lit(name2)} + ' \\u2014 distribution of ' + fmt(vals.length) + ' values';
|
|
359
361
|
svg.appendChild(title);
|
|
360
362
|
|
|
361
363
|
bins.forEach(function (idxs, i) {
|
|
@@ -390,21 +392,21 @@ function histogramSource(idx, name) {
|
|
|
390
392
|
var DEFAULT_TIMEOUT_MS = 2e3;
|
|
391
393
|
function svgToDataUrl(svg) {
|
|
392
394
|
const cloned = svg.cloneNode(true);
|
|
393
|
-
const
|
|
394
|
-
const
|
|
395
|
-
cloned.setAttribute("width", String(Math.round(
|
|
396
|
-
cloned.setAttribute("height", String(Math.round(
|
|
395
|
+
const w2 = svg.clientWidth || svg.getBoundingClientRect && svg.getBoundingClientRect().width || 600;
|
|
396
|
+
const h2 = svg.clientHeight || svg.getBoundingClientRect && svg.getBoundingClientRect().height || 400;
|
|
397
|
+
cloned.setAttribute("width", String(Math.round(w2)));
|
|
398
|
+
cloned.setAttribute("height", String(Math.round(h2)));
|
|
397
399
|
if (!cloned.getAttribute("xmlns")) cloned.setAttribute("xmlns", "http://www.w3.org/2000/svg");
|
|
398
400
|
const svgStr = new XMLSerializer().serializeToString(cloned);
|
|
399
401
|
const bytes = new TextEncoder().encode(svgStr);
|
|
400
402
|
let binary = "";
|
|
401
|
-
for (let
|
|
403
|
+
for (let i2 = 0; i2 < bytes.length; i2++) binary += String.fromCharCode(bytes[i2]);
|
|
402
404
|
return "data:image/svg+xml;base64," + btoa(binary);
|
|
403
405
|
}
|
|
404
406
|
function svgNaturalSize(svg) {
|
|
405
|
-
const
|
|
406
|
-
const
|
|
407
|
-
return { width: Math.round(
|
|
407
|
+
const w2 = svg.clientWidth || svg.getBoundingClientRect && svg.getBoundingClientRect().width || 600;
|
|
408
|
+
const h2 = svg.clientHeight || svg.getBoundingClientRect && svg.getBoundingClientRect().height || 400;
|
|
409
|
+
return { width: Math.round(w2), height: Math.round(h2) };
|
|
408
410
|
}
|
|
409
411
|
function rasterizeSvgToPngDataUrl(svgDataUrl, width, height, opts = {}) {
|
|
410
412
|
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
@@ -412,8 +414,8 @@ function rasterizeSvgToPngDataUrl(svgDataUrl, width, height, opts = {}) {
|
|
|
412
414
|
let img;
|
|
413
415
|
try {
|
|
414
416
|
img = new Image();
|
|
415
|
-
} catch (
|
|
416
|
-
opts.onWarn?.("snapshot-no-image",
|
|
417
|
+
} catch (e2) {
|
|
418
|
+
opts.onWarn?.("snapshot-no-image", e2 instanceof Error ? e2.message : String(e2));
|
|
417
419
|
resolve(null);
|
|
418
420
|
return;
|
|
419
421
|
}
|
|
@@ -440,8 +442,8 @@ function rasterizeSvgToPngDataUrl(svgDataUrl, width, height, opts = {}) {
|
|
|
440
442
|
c2d.fillRect(0, 0, cw, ch);
|
|
441
443
|
c2d.drawImage(img, 0, 0, cw, ch);
|
|
442
444
|
resolve(canvas.toDataURL("image/png"));
|
|
443
|
-
} catch (
|
|
444
|
-
opts.onWarn?.("snapshot-raster-draw",
|
|
445
|
+
} catch (e2) {
|
|
446
|
+
opts.onWarn?.("snapshot-raster-draw", e2 instanceof Error ? e2.message : String(e2));
|
|
445
447
|
resolve(null);
|
|
446
448
|
}
|
|
447
449
|
};
|
|
@@ -460,33 +462,33 @@ async function captureSvgSnapshot(root, opts = {}) {
|
|
|
460
462
|
let svgUrl;
|
|
461
463
|
try {
|
|
462
464
|
svgUrl = svgToDataUrl(svg);
|
|
463
|
-
} catch (
|
|
464
|
-
opts.onWarn?.("snapshot-serialize",
|
|
465
|
+
} catch (e2) {
|
|
466
|
+
opts.onWarn?.("snapshot-serialize", e2 instanceof Error ? e2.message : String(e2));
|
|
465
467
|
return null;
|
|
466
468
|
}
|
|
467
469
|
const { width, height } = svgNaturalSize(svg);
|
|
468
470
|
try {
|
|
469
471
|
const png = await rasterizeSvgToPngDataUrl(svgUrl, width, height, opts);
|
|
470
472
|
return png || svgUrl;
|
|
471
|
-
} catch (
|
|
472
|
-
opts.onWarn?.("snapshot-raster-unexpected",
|
|
473
|
+
} catch (e2) {
|
|
474
|
+
opts.onWarn?.("snapshot-raster-unexpected", e2 instanceof Error ? e2.message : String(e2));
|
|
473
475
|
return svgUrl;
|
|
474
476
|
}
|
|
475
477
|
}
|
|
476
478
|
|
|
477
479
|
// src/review.ts
|
|
478
|
-
function shouldReview(
|
|
479
|
-
if (!
|
|
480
|
-
if (!
|
|
481
|
-
if (!
|
|
482
|
-
if (!
|
|
483
|
-
if (
|
|
484
|
-
if (
|
|
480
|
+
function shouldReview(g2) {
|
|
481
|
+
if (!g2.enabled) return false;
|
|
482
|
+
if (!g2.modeLicensed) return false;
|
|
483
|
+
if (!g2.firstRenderAfterGenerate) return false;
|
|
484
|
+
if (!g2.codeVersion || g2.codeVersion <= 0) return false;
|
|
485
|
+
if (g2.inFlight) return false;
|
|
486
|
+
if (g2.reviewedVersions.has(g2.codeVersion)) return false;
|
|
485
487
|
return true;
|
|
486
488
|
}
|
|
487
489
|
function bareBase64(dataUrlOrB64) {
|
|
488
|
-
const
|
|
489
|
-
if (
|
|
490
|
+
const m2 = /^data:([^;,]+);base64,(.*)$/s.exec(dataUrlOrB64 || "");
|
|
491
|
+
if (m2) return { b64: m2[2], mediaType: m2[1] };
|
|
490
492
|
return { b64: dataUrlOrB64 || "", mediaType: "image/png" };
|
|
491
493
|
}
|
|
492
494
|
function buildReviewWire(input) {
|
|
@@ -502,17 +504,17 @@ function buildReviewWire(input) {
|
|
|
502
504
|
correlationId: (input.correlationId ?? "").toString()
|
|
503
505
|
};
|
|
504
506
|
}
|
|
505
|
-
function actionFor(
|
|
506
|
-
if (!
|
|
507
|
-
if (
|
|
508
|
-
const instr = (
|
|
507
|
+
function actionFor(v2) {
|
|
508
|
+
if (!v2) return { kind: "keep", reason: "no verdict returned", userVisible: false };
|
|
509
|
+
if (v2.status === "PROPOSED") {
|
|
510
|
+
const instr = (v2.instruction ?? "").toString().trim();
|
|
509
511
|
if (instr === "") return { kind: "keep", reason: "reviewer proposed no actionable change", userVisible: false };
|
|
510
|
-
return { kind: "propose", instruction: instr, reason: (
|
|
512
|
+
return { kind: "propose", instruction: instr, reason: (v2.verdictReason ?? "").toString().trim() };
|
|
511
513
|
}
|
|
512
|
-
if (
|
|
513
|
-
if (
|
|
514
|
-
if (
|
|
515
|
-
return { kind: "keep", reason:
|
|
514
|
+
if (v2.status === "OK" && v2.fix) return { kind: "apply-fix", fix: v2.fix, reason: v2.verdictReason ?? "" };
|
|
515
|
+
if (v2.status === "NOCHANGE") return { kind: "keep", reason: v2.verdictReason ?? "the chart renders as asked", userVisible: false };
|
|
516
|
+
if (v2.status === "REFUSED") return { kind: "keep", reason: v2.errorMessage ?? "review not available", userVisible: false };
|
|
517
|
+
return { kind: "keep", reason: v2.errorMessage ?? v2.verdictReason ?? "review failed", userVisible: false };
|
|
516
518
|
}
|
|
517
519
|
|
|
518
520
|
// src/reviewDialog.ts
|
|
@@ -528,9 +530,9 @@ function askApplyImprovements(container, reason, opts = {}) {
|
|
|
528
530
|
try {
|
|
529
531
|
const minW = opts.minWidth ?? 260;
|
|
530
532
|
const minH = opts.minHeight ?? 170;
|
|
531
|
-
const
|
|
532
|
-
const
|
|
533
|
-
if (
|
|
533
|
+
const w2 = container.clientWidth || container.offsetWidth || 0;
|
|
534
|
+
const h2 = container.clientHeight || container.offsetHeight || 0;
|
|
535
|
+
if (w2 < minW || h2 < minH) {
|
|
534
536
|
resolve(false);
|
|
535
537
|
return;
|
|
536
538
|
}
|
|
@@ -575,7 +577,7 @@ function askApplyImprovements(container, reason, opts = {}) {
|
|
|
575
577
|
yes.textContent = text.accept;
|
|
576
578
|
yes.style.cssText = "font-weight:600;";
|
|
577
579
|
let done = false;
|
|
578
|
-
const finish = (
|
|
580
|
+
const finish = (v2) => {
|
|
579
581
|
if (done) return;
|
|
580
582
|
done = true;
|
|
581
583
|
try {
|
|
@@ -583,17 +585,17 @@ function askApplyImprovements(container, reason, opts = {}) {
|
|
|
583
585
|
} catch {
|
|
584
586
|
}
|
|
585
587
|
doc.removeEventListener("keydown", onKey, true);
|
|
586
|
-
resolve(
|
|
588
|
+
resolve(v2);
|
|
587
589
|
};
|
|
588
|
-
const onKey = (
|
|
589
|
-
if (
|
|
590
|
-
|
|
590
|
+
const onKey = (e2) => {
|
|
591
|
+
if (e2.key === "Escape") {
|
|
592
|
+
e2.stopPropagation();
|
|
591
593
|
finish(false);
|
|
592
594
|
}
|
|
593
595
|
};
|
|
594
596
|
no.addEventListener("click", () => finish(false));
|
|
595
597
|
yes.addEventListener("click", () => finish(true));
|
|
596
|
-
ov.addEventListener("click", (
|
|
598
|
+
ov.addEventListener("click", (e2) => e2.stopPropagation());
|
|
597
599
|
doc.addEventListener("keydown", onKey, true);
|
|
598
600
|
row.append(no, yes);
|
|
599
601
|
card.append(head, why, cost, row);
|
|
@@ -643,8 +645,8 @@ function refusalIsSelectable(row) {
|
|
|
643
645
|
}
|
|
644
646
|
function orderRefusalsForDisplay(rows) {
|
|
645
647
|
if (!Array.isArray(rows)) return [];
|
|
646
|
-
const named = rows.filter((
|
|
647
|
-
return [...named.filter(refusalIsSelectable), ...named.filter((
|
|
648
|
+
const named = rows.filter((r2) => !!r2 && typeof r2.name === "string" && r2.name.trim() !== "");
|
|
649
|
+
return [...named.filter(refusalIsSelectable), ...named.filter((r2) => !refusalIsSelectable(r2))];
|
|
648
650
|
}
|
|
649
651
|
function qualifyRefusalHeadingFor(row, state) {
|
|
650
652
|
if (refusalIsSelectable(row)) {
|
|
@@ -665,8 +667,8 @@ function hasRefusalsToShow(rows) {
|
|
|
665
667
|
}
|
|
666
668
|
var QUALIFY_REFUSAL_UNSPECIFIED = "refused for the fields as bound - no single requirement to name";
|
|
667
669
|
function qualifyRefusalReason(reason, fallback = QUALIFY_REFUSAL_UNSPECIFIED) {
|
|
668
|
-
const
|
|
669
|
-
return
|
|
670
|
+
const s2 = (reason ?? "").trim();
|
|
671
|
+
return s2 !== "" ? s2 : fallback;
|
|
670
672
|
}
|
|
671
673
|
|
|
672
674
|
// src/qualifyLaunch.ts
|
|
@@ -685,13 +687,13 @@ function chooserFitsViewport(width, height) {
|
|
|
685
687
|
if (!isFinite(width) || !isFinite(height)) return false;
|
|
686
688
|
return width >= CHOOSER_MIN_WIDTH_PX && height >= CHOOSER_MIN_HEIGHT_PX;
|
|
687
689
|
}
|
|
688
|
-
function shouldOpenChooserOnGenerate(
|
|
689
|
-
if (!
|
|
690
|
-
if (!
|
|
691
|
-
return chooserFitsViewport(
|
|
690
|
+
function shouldOpenChooserOnGenerate(i2) {
|
|
691
|
+
if (!i2.enabled) return false;
|
|
692
|
+
if (!i2.hasData) return false;
|
|
693
|
+
return chooserFitsViewport(i2.width, i2.height);
|
|
692
694
|
}
|
|
693
|
-
function shouldOpenInlineChooserOnGenerate(
|
|
694
|
-
return
|
|
695
|
+
function shouldOpenInlineChooserOnGenerate(i2) {
|
|
696
|
+
return i2.enabled === true && i2.hasData === true;
|
|
695
697
|
}
|
|
696
698
|
function canConfirmLaunch(selected) {
|
|
697
699
|
return typeof selected === "string" && selected.trim() !== "";
|
|
@@ -709,10 +711,10 @@ function normalizeFilterTerm(raw) {
|
|
|
709
711
|
return raw.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/\s+/g, " ").trim();
|
|
710
712
|
}
|
|
711
713
|
var FILTER_MIN_TERM_CHARS = 2;
|
|
712
|
-
function startsAWord(
|
|
713
|
-
for (let
|
|
714
|
-
if (
|
|
715
|
-
const prev =
|
|
714
|
+
function startsAWord(name2, t2) {
|
|
715
|
+
for (let i2 = name2.indexOf(t2); i2 >= 0; i2 = name2.indexOf(t2, i2 + 1)) {
|
|
716
|
+
if (i2 === 0) return true;
|
|
717
|
+
const prev = name2.charCodeAt(i2 - 1);
|
|
716
718
|
const alnum = prev >= 97 && prev <= 122 || prev >= 48 && prev <= 57;
|
|
717
719
|
if (!alnum) return true;
|
|
718
720
|
}
|
|
@@ -720,31 +722,31 @@ function startsAWord(name, t) {
|
|
|
720
722
|
}
|
|
721
723
|
function filterQualifyRows(rows, term, read) {
|
|
722
724
|
const all = Array.isArray(rows) ? rows.slice() : [];
|
|
723
|
-
const
|
|
724
|
-
if (
|
|
725
|
+
const t2 = normalizeFilterTerm(term);
|
|
726
|
+
if (t2.length < FILTER_MIN_TERM_CHARS) return { rows: all, tier: "all", term: "" };
|
|
725
727
|
const atWordStart = [];
|
|
726
728
|
const midWord = [];
|
|
727
729
|
const byDesc = [];
|
|
728
730
|
for (const row of all) {
|
|
729
|
-
const
|
|
730
|
-
const
|
|
731
|
-
if (
|
|
732
|
-
if (
|
|
733
|
-
(startsAWord(
|
|
731
|
+
const f2 = read(row);
|
|
732
|
+
const name2 = normalizeFilterTerm(f2.name);
|
|
733
|
+
if (name2 === "") continue;
|
|
734
|
+
if (name2.indexOf(t2) >= 0) {
|
|
735
|
+
(startsAWord(name2, t2) ? atWordStart : midWord).push(row);
|
|
734
736
|
continue;
|
|
735
737
|
}
|
|
736
|
-
if (normalizeFilterTerm(
|
|
738
|
+
if (normalizeFilterTerm(f2.description).indexOf(t2) >= 0) byDesc.push(row);
|
|
737
739
|
}
|
|
738
|
-
if (atWordStart.length > 0) return { rows: atWordStart, tier: "name", term:
|
|
739
|
-
if (midWord.length > 0) return { rows: midWord, tier: "namePart", term:
|
|
740
|
-
if (byDesc.length > 0) return { rows: byDesc, tier: "desc", term:
|
|
741
|
-
return { rows: [], tier: "none", term:
|
|
740
|
+
if (atWordStart.length > 0) return { rows: atWordStart, tier: "name", term: t2 };
|
|
741
|
+
if (midWord.length > 0) return { rows: midWord, tier: "namePart", term: t2 };
|
|
742
|
+
if (byDesc.length > 0) return { rows: byDesc, tier: "desc", term: t2 };
|
|
743
|
+
return { rows: [], tier: "none", term: t2 };
|
|
742
744
|
}
|
|
743
|
-
function readQualifyChartRow(
|
|
744
|
-
return { name:
|
|
745
|
+
function readQualifyChartRow(r2) {
|
|
746
|
+
return { name: r2.name, description: r2.description };
|
|
745
747
|
}
|
|
746
|
-
function readQualifyRefusalRow(
|
|
747
|
-
return { name:
|
|
748
|
+
function readQualifyRefusalRow(r2) {
|
|
749
|
+
return { name: r2.name, description: r2.reason };
|
|
748
750
|
}
|
|
749
751
|
var FILTER_ROW_PX = 32;
|
|
750
752
|
var FILTER_MIN_WIDTH_PX = 420;
|
|
@@ -756,34 +758,34 @@ function listNeedsFilter(scrollHeight, clientHeight) {
|
|
|
756
758
|
if (!Number.isFinite(scrollHeight) || !Number.isFinite(clientHeight)) return false;
|
|
757
759
|
return scrollHeight > clientHeight - FILTER_ROW_PX;
|
|
758
760
|
}
|
|
759
|
-
function qualifyFilterGate(
|
|
760
|
-
if (!filterFitsChooser(
|
|
761
|
-
if (!listNeedsFilter(
|
|
761
|
+
function qualifyFilterGate(i2) {
|
|
762
|
+
if (!filterFitsChooser(i2.cardWidth, i2.cardHeight)) return { show: false, why: "too-small" };
|
|
763
|
+
if (!listNeedsFilter(i2.scrollHeight, i2.clientHeight)) return { show: false, why: "no-overflow" };
|
|
762
764
|
return { show: true, why: "shown" };
|
|
763
765
|
}
|
|
764
766
|
function computeQualifyFilterView(groups, term) {
|
|
765
|
-
const
|
|
766
|
-
const read = (
|
|
767
|
+
const g2 = Array.isArray(groups) ? groups : [];
|
|
768
|
+
const read = (r2) => ({ name: r2.name, description: r2.description });
|
|
767
769
|
const collect = (section) => {
|
|
768
770
|
const out = [];
|
|
769
|
-
for (const grp of
|
|
771
|
+
for (const grp of g2) if (grp.section === section) for (const r2 of grp.rows) out.push(r2);
|
|
770
772
|
return out;
|
|
771
773
|
};
|
|
772
774
|
const fitRows = collect("fits");
|
|
773
775
|
const fit = filterQualifyRows(fitRows, term, read);
|
|
774
776
|
const ref = filterQualifyRows(collect("refused"), term, read);
|
|
775
777
|
const visible = /* @__PURE__ */ new Set();
|
|
776
|
-
for (const
|
|
777
|
-
for (const
|
|
778
|
+
for (const r2 of fit.rows) visible.add(r2.el);
|
|
779
|
+
for (const r2 of ref.rows) visible.add(r2.el);
|
|
778
780
|
const show = [], hide = [], showHeadings = [], hideHeadings = [];
|
|
779
|
-
for (const grp of
|
|
781
|
+
for (const grp of g2) {
|
|
780
782
|
let any = false;
|
|
781
|
-
for (const
|
|
782
|
-
if (visible.has(
|
|
783
|
-
show.push(
|
|
783
|
+
for (const r2 of grp.rows) {
|
|
784
|
+
if (visible.has(r2.el)) {
|
|
785
|
+
show.push(r2.el);
|
|
784
786
|
any = true;
|
|
785
787
|
} else {
|
|
786
|
-
hide.push(
|
|
788
|
+
hide.push(r2.el);
|
|
787
789
|
}
|
|
788
790
|
}
|
|
789
791
|
if (grp.heading !== null) (any ? showHeadings : hideHeadings).push(grp.heading);
|
|
@@ -820,18 +822,369 @@ function inlineFilterGate(rowCount) {
|
|
|
820
822
|
}
|
|
821
823
|
var INLINE_FILTER_MIN_ROWS = 8;
|
|
822
824
|
|
|
825
|
+
// src/sourceDateFormat.ts
|
|
826
|
+
function formatSourceDate(raw, opts = {}) {
|
|
827
|
+
const d2 = toDate(raw);
|
|
828
|
+
if (!d2) return null;
|
|
829
|
+
const dayFrame = u(d2);
|
|
830
|
+
const frame = dayFrame ?? (opts.dialect === "dotnet" ? "local" : "utc");
|
|
831
|
+
const p4 = partsIn(d2, frame);
|
|
832
|
+
const format = cleanFormat(opts.format, opts.dialect);
|
|
833
|
+
if (format && opts.dialect) {
|
|
834
|
+
const rendered = renderFormat(format, p4, opts.dialect, opts.culture);
|
|
835
|
+
if (rendered) return rendered;
|
|
836
|
+
}
|
|
837
|
+
return localeDate(p4, !!dayFrame, opts.culture);
|
|
838
|
+
}
|
|
839
|
+
function formatSourceDateFor(raw, columnName2, formats, culture) {
|
|
840
|
+
return formatSourceDate(raw, {
|
|
841
|
+
format: formats?.byColumn?.[columnName2] ?? null,
|
|
842
|
+
dialect: formats?.dialect,
|
|
843
|
+
culture
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
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*$/;
|
|
847
|
+
function toDate(raw) {
|
|
848
|
+
if (raw instanceof Date) return isNaN(raw.getTime()) ? null : raw;
|
|
849
|
+
if (typeof raw !== "string" || !ISO_LIKE_RE.test(raw)) return null;
|
|
850
|
+
const d2 = p(raw.trim());
|
|
851
|
+
return d2 && !isNaN(d2.getTime()) ? d2 : null;
|
|
852
|
+
}
|
|
853
|
+
function partsIn(d2, frame) {
|
|
854
|
+
return frame === "utc" ? {
|
|
855
|
+
year: d2.getUTCFullYear(),
|
|
856
|
+
month: d2.getUTCMonth() + 1,
|
|
857
|
+
day: d2.getUTCDate(),
|
|
858
|
+
hours: d2.getUTCHours(),
|
|
859
|
+
minutes: d2.getUTCMinutes(),
|
|
860
|
+
seconds: d2.getUTCSeconds(),
|
|
861
|
+
ms: d2.getUTCMilliseconds(),
|
|
862
|
+
weekday: d2.getUTCDay()
|
|
863
|
+
} : {
|
|
864
|
+
year: d2.getFullYear(),
|
|
865
|
+
month: d2.getMonth() + 1,
|
|
866
|
+
day: d2.getDate(),
|
|
867
|
+
hours: d2.getHours(),
|
|
868
|
+
minutes: d2.getMinutes(),
|
|
869
|
+
seconds: d2.getSeconds(),
|
|
870
|
+
ms: d2.getMilliseconds(),
|
|
871
|
+
weekday: d2.getDay()
|
|
872
|
+
};
|
|
873
|
+
}
|
|
874
|
+
function utcAnchor(p4) {
|
|
875
|
+
const d2 = new Date(Date.UTC(p4.year, p4.month - 1, p4.day, p4.hours, p4.minutes, p4.seconds, p4.ms));
|
|
876
|
+
if (p4.year >= 0 && p4.year < 100) d2.setUTCFullYear(p4.year);
|
|
877
|
+
return d2;
|
|
878
|
+
}
|
|
879
|
+
function localeDate(p4, wholeDay, culture) {
|
|
880
|
+
const anchor = utcAnchor(p4);
|
|
881
|
+
try {
|
|
882
|
+
const o2 = { dateStyle: "medium", timeZone: "UTC" };
|
|
883
|
+
if (!wholeDay) o2.timeStyle = p4.seconds || p4.ms ? "medium" : "short";
|
|
884
|
+
return new Intl.DateTimeFormat(culture || void 0, o2).format(anchor);
|
|
885
|
+
} catch {
|
|
886
|
+
const iso = anchor.toISOString();
|
|
887
|
+
return wholeDay ? iso.slice(0, 10) : `${iso.slice(0, 10)} ${iso.slice(11, 19)}`;
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
function cleanFormat(raw, dialect) {
|
|
891
|
+
if (!raw || !dialect) return null;
|
|
892
|
+
let s2 = firstSection(String(raw), dialect);
|
|
893
|
+
if (dialect === "excel") {
|
|
894
|
+
s2 = s2.replace(/\[(h{1,2}|m{1,2}|s{1,2})\]/gi, "$1").replace(/\[[^\]]*\]/g, "");
|
|
895
|
+
}
|
|
896
|
+
if (!s2.trim() || /^general$/i.test(s2.trim())) return null;
|
|
897
|
+
return hasDateToken(s2, dialect) ? s2 : null;
|
|
898
|
+
}
|
|
899
|
+
function firstSection(s2, dialect) {
|
|
900
|
+
let out = "";
|
|
901
|
+
let quote = "";
|
|
902
|
+
for (let i2 = 0; i2 < s2.length; i2++) {
|
|
903
|
+
const ch = s2[i2];
|
|
904
|
+
if (quote) {
|
|
905
|
+
out += ch;
|
|
906
|
+
if (ch === quote) quote = "";
|
|
907
|
+
continue;
|
|
908
|
+
}
|
|
909
|
+
if (ch === '"' || dialect === "dotnet" && ch === "'") {
|
|
910
|
+
quote = ch;
|
|
911
|
+
out += ch;
|
|
912
|
+
continue;
|
|
913
|
+
}
|
|
914
|
+
if (ch === "\\") {
|
|
915
|
+
out += ch + (s2[i2 + 1] ?? "");
|
|
916
|
+
i2++;
|
|
917
|
+
continue;
|
|
918
|
+
}
|
|
919
|
+
if (ch === ";") break;
|
|
920
|
+
out += ch;
|
|
921
|
+
}
|
|
922
|
+
return out;
|
|
923
|
+
}
|
|
924
|
+
function hasDateToken(s2, dialect) {
|
|
925
|
+
const stripped = stripLiterals(s2, dialect);
|
|
926
|
+
return dialect === "excel" ? /[ymdhs]/i.test(stripped) : /[yMdHhmsft]/.test(stripped);
|
|
927
|
+
}
|
|
928
|
+
function stripLiterals(s2, dialect) {
|
|
929
|
+
let out = "";
|
|
930
|
+
for (let i2 = 0; i2 < s2.length; i2++) {
|
|
931
|
+
const ch = s2[i2];
|
|
932
|
+
if (ch === "\\" || dialect === "dotnet" && ch === "%") {
|
|
933
|
+
i2++;
|
|
934
|
+
continue;
|
|
935
|
+
}
|
|
936
|
+
if (ch === '"' || dialect === "dotnet" && ch === "'") {
|
|
937
|
+
const end = s2.indexOf(ch, i2 + 1);
|
|
938
|
+
i2 = end < 0 ? s2.length : end;
|
|
939
|
+
continue;
|
|
940
|
+
}
|
|
941
|
+
out += ch;
|
|
942
|
+
}
|
|
943
|
+
return out;
|
|
944
|
+
}
|
|
945
|
+
var EXCEL_TOKENS = [
|
|
946
|
+
[/^am\/pm/i, "meridiemLong"],
|
|
947
|
+
[/^a\/p/i, "meridiemShort"],
|
|
948
|
+
[/^y{3,}/i, "year4"],
|
|
949
|
+
[/^y{1,2}/i, "year2"],
|
|
950
|
+
[/^m{5,}/i, "monthNarrow"],
|
|
951
|
+
[/^m{4}/i, "monthLong"],
|
|
952
|
+
[/^m{3}/i, "monthShort"],
|
|
953
|
+
[/^m{2}/i, "mAmbiguous2"],
|
|
954
|
+
[/^m/i, "mAmbiguous1"],
|
|
955
|
+
[/^d{4,}/i, "weekdayLong"],
|
|
956
|
+
[/^d{3}/i, "weekdayShort"],
|
|
957
|
+
[/^d{2}/i, "day2"],
|
|
958
|
+
[/^d/i, "day1"],
|
|
959
|
+
[/^h{2,}/i, "hour2"],
|
|
960
|
+
[/^h/i, "hour1"],
|
|
961
|
+
[/^s{2,}/i, "second2"],
|
|
962
|
+
[/^s/i, "second1"]
|
|
963
|
+
];
|
|
964
|
+
var DOTNET_TOKENS = [
|
|
965
|
+
[/^y{3,}/, "year4"],
|
|
966
|
+
[/^y{1,2}/, "year2"],
|
|
967
|
+
[/^M{4,}/, "monthLong"],
|
|
968
|
+
[/^M{3}/, "monthShort"],
|
|
969
|
+
[/^M{2}/, "month2"],
|
|
970
|
+
[/^M/, "month1"],
|
|
971
|
+
[/^d{4,}/, "weekdayLong"],
|
|
972
|
+
[/^d{3}/, "weekdayShort"],
|
|
973
|
+
[/^d{2}/, "day2"],
|
|
974
|
+
[/^d/, "day1"],
|
|
975
|
+
[/^H{2,}/, "hour2"],
|
|
976
|
+
[/^H/, "hour1"],
|
|
977
|
+
[/^h{2,}/, "hour2"],
|
|
978
|
+
[/^h/, "hour1"],
|
|
979
|
+
[/^m{2,}/, "minute2"],
|
|
980
|
+
[/^m/, "minute1"],
|
|
981
|
+
[/^s{2,}/, "second2"],
|
|
982
|
+
[/^s/, "second1"],
|
|
983
|
+
[/^f+/, "fraction"],
|
|
984
|
+
[/^tt/, "meridiemLong"],
|
|
985
|
+
[/^t/, "meridiemShort"]
|
|
986
|
+
];
|
|
987
|
+
function tokenize(s2, dialect) {
|
|
988
|
+
const table = dialect === "excel" ? EXCEL_TOKENS : DOTNET_TOKENS;
|
|
989
|
+
const out = [];
|
|
990
|
+
let i2 = 0;
|
|
991
|
+
while (i2 < s2.length) {
|
|
992
|
+
const ch = s2[i2];
|
|
993
|
+
if (ch === "\\" || dialect === "dotnet" && ch === "%") {
|
|
994
|
+
if (i2 + 1 < s2.length) out.push({ kind: "literal", text: s2[i2 + 1] });
|
|
995
|
+
i2 += 2;
|
|
996
|
+
continue;
|
|
997
|
+
}
|
|
998
|
+
if (ch === '"' || dialect === "dotnet" && ch === "'") {
|
|
999
|
+
const end = s2.indexOf(ch, i2 + 1);
|
|
1000
|
+
out.push({ kind: "literal", text: end < 0 ? s2.slice(i2 + 1) : s2.slice(i2 + 1, end) });
|
|
1001
|
+
i2 = end < 0 ? s2.length : end + 1;
|
|
1002
|
+
continue;
|
|
1003
|
+
}
|
|
1004
|
+
const rest = s2.slice(i2);
|
|
1005
|
+
let matched = false;
|
|
1006
|
+
for (const [re, kind] of table) {
|
|
1007
|
+
const m2 = re.exec(rest);
|
|
1008
|
+
if (m2) {
|
|
1009
|
+
out.push({ kind });
|
|
1010
|
+
i2 += m2[0].length;
|
|
1011
|
+
matched = true;
|
|
1012
|
+
break;
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
if (!matched) {
|
|
1016
|
+
out.push({ kind: "literal", text: ch });
|
|
1017
|
+
i2++;
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
return out;
|
|
1021
|
+
}
|
|
1022
|
+
function resolveAmbiguousM(tokens) {
|
|
1023
|
+
const isHour = (t2) => t2.kind === "hour1" || t2.kind === "hour2";
|
|
1024
|
+
const isSecond = (t2) => t2.kind === "second1" || t2.kind === "second2";
|
|
1025
|
+
for (let i2 = 0; i2 < tokens.length; i2++) {
|
|
1026
|
+
const t2 = tokens[i2];
|
|
1027
|
+
if (t2.kind !== "mAmbiguous1" && t2.kind !== "mAmbiguous2") continue;
|
|
1028
|
+
const two = t2.kind === "mAmbiguous2";
|
|
1029
|
+
let minute = false;
|
|
1030
|
+
for (let j2 = i2 - 1; j2 >= 0; j2--) {
|
|
1031
|
+
if (tokens[j2].kind === "literal") continue;
|
|
1032
|
+
minute = isHour(tokens[j2]);
|
|
1033
|
+
break;
|
|
1034
|
+
}
|
|
1035
|
+
if (!minute) {
|
|
1036
|
+
for (let j2 = i2 + 1; j2 < tokens.length; j2++) {
|
|
1037
|
+
if (tokens[j2].kind === "literal") continue;
|
|
1038
|
+
minute = isSecond(tokens[j2]);
|
|
1039
|
+
break;
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
t2.kind = minute ? two ? "minute2" : "minute1" : two ? "month2" : "month1";
|
|
1043
|
+
}
|
|
1044
|
+
}
|
|
1045
|
+
var EN_MONTHS_LONG = [
|
|
1046
|
+
"January",
|
|
1047
|
+
"February",
|
|
1048
|
+
"March",
|
|
1049
|
+
"April",
|
|
1050
|
+
"May",
|
|
1051
|
+
"June",
|
|
1052
|
+
"July",
|
|
1053
|
+
"August",
|
|
1054
|
+
"September",
|
|
1055
|
+
"October",
|
|
1056
|
+
"November",
|
|
1057
|
+
"December"
|
|
1058
|
+
];
|
|
1059
|
+
var EN_MONTHS_SHORT = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
1060
|
+
var EN_DAYS_LONG = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
|
1061
|
+
var EN_DAYS_SHORT = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
1062
|
+
function name(p4, kind, width, culture) {
|
|
1063
|
+
try {
|
|
1064
|
+
const opts = kind === "month" ? { month: width, timeZone: "UTC" } : { weekday: width === "narrow" ? "short" : width, timeZone: "UTC" };
|
|
1065
|
+
return new Intl.DateTimeFormat(culture || void 0, opts).format(utcAnchor(p4));
|
|
1066
|
+
} catch {
|
|
1067
|
+
if (kind === "month") {
|
|
1068
|
+
const long = EN_MONTHS_LONG[p4.month - 1] ?? "";
|
|
1069
|
+
if (width === "long") return long;
|
|
1070
|
+
return width === "narrow" ? long.slice(0, 1) : EN_MONTHS_SHORT[p4.month - 1] ?? "";
|
|
1071
|
+
}
|
|
1072
|
+
return (width === "long" ? EN_DAYS_LONG[p4.weekday] : EN_DAYS_SHORT[p4.weekday]) ?? "";
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
var p2 = (n2) => (n2 < 10 ? "0" : "") + n2;
|
|
1076
|
+
function renderFormat(format, p4, dialect, culture) {
|
|
1077
|
+
const tokens = tokenize(format, dialect);
|
|
1078
|
+
if (dialect === "excel") resolveAmbiguousM(tokens);
|
|
1079
|
+
const twelve = tokens.some((t2) => t2.kind === "meridiemLong" || t2.kind === "meridiemShort");
|
|
1080
|
+
const hour12 = () => {
|
|
1081
|
+
const h2 = p4.hours % 12;
|
|
1082
|
+
return h2 === 0 ? 12 : h2;
|
|
1083
|
+
};
|
|
1084
|
+
let out = "";
|
|
1085
|
+
let sawField = false;
|
|
1086
|
+
for (const t2 of tokens) {
|
|
1087
|
+
switch (t2.kind) {
|
|
1088
|
+
case "literal":
|
|
1089
|
+
out += t2.text ?? "";
|
|
1090
|
+
break;
|
|
1091
|
+
case "year4":
|
|
1092
|
+
out += String(p4.year);
|
|
1093
|
+
sawField = true;
|
|
1094
|
+
break;
|
|
1095
|
+
case "year2":
|
|
1096
|
+
out += p2((p4.year % 100 + 100) % 100);
|
|
1097
|
+
sawField = true;
|
|
1098
|
+
break;
|
|
1099
|
+
case "monthLong":
|
|
1100
|
+
out += name(p4, "month", "long", culture);
|
|
1101
|
+
sawField = true;
|
|
1102
|
+
break;
|
|
1103
|
+
case "monthShort":
|
|
1104
|
+
out += name(p4, "month", "short", culture);
|
|
1105
|
+
sawField = true;
|
|
1106
|
+
break;
|
|
1107
|
+
case "monthNarrow":
|
|
1108
|
+
out += name(p4, "month", "long", culture).slice(0, 1);
|
|
1109
|
+
sawField = true;
|
|
1110
|
+
break;
|
|
1111
|
+
case "month2":
|
|
1112
|
+
out += p2(p4.month);
|
|
1113
|
+
sawField = true;
|
|
1114
|
+
break;
|
|
1115
|
+
case "month1":
|
|
1116
|
+
out += String(p4.month);
|
|
1117
|
+
sawField = true;
|
|
1118
|
+
break;
|
|
1119
|
+
case "weekdayLong":
|
|
1120
|
+
out += name(p4, "weekday", "long", culture);
|
|
1121
|
+
sawField = true;
|
|
1122
|
+
break;
|
|
1123
|
+
case "weekdayShort":
|
|
1124
|
+
out += name(p4, "weekday", "short", culture);
|
|
1125
|
+
sawField = true;
|
|
1126
|
+
break;
|
|
1127
|
+
case "day2":
|
|
1128
|
+
out += p2(p4.day);
|
|
1129
|
+
sawField = true;
|
|
1130
|
+
break;
|
|
1131
|
+
case "day1":
|
|
1132
|
+
out += String(p4.day);
|
|
1133
|
+
sawField = true;
|
|
1134
|
+
break;
|
|
1135
|
+
case "hour2":
|
|
1136
|
+
out += p2(twelve ? hour12() : p4.hours);
|
|
1137
|
+
sawField = true;
|
|
1138
|
+
break;
|
|
1139
|
+
case "hour1":
|
|
1140
|
+
out += String(twelve ? hour12() : p4.hours);
|
|
1141
|
+
sawField = true;
|
|
1142
|
+
break;
|
|
1143
|
+
case "minute2":
|
|
1144
|
+
out += p2(p4.minutes);
|
|
1145
|
+
sawField = true;
|
|
1146
|
+
break;
|
|
1147
|
+
case "minute1":
|
|
1148
|
+
out += String(p4.minutes);
|
|
1149
|
+
sawField = true;
|
|
1150
|
+
break;
|
|
1151
|
+
case "second2":
|
|
1152
|
+
out += p2(p4.seconds);
|
|
1153
|
+
sawField = true;
|
|
1154
|
+
break;
|
|
1155
|
+
case "second1":
|
|
1156
|
+
out += String(p4.seconds);
|
|
1157
|
+
sawField = true;
|
|
1158
|
+
break;
|
|
1159
|
+
case "fraction":
|
|
1160
|
+
out += String(p4.ms).padStart(3, "0");
|
|
1161
|
+
sawField = true;
|
|
1162
|
+
break;
|
|
1163
|
+
case "meridiemLong":
|
|
1164
|
+
out += p4.hours < 12 ? "AM" : "PM";
|
|
1165
|
+
sawField = true;
|
|
1166
|
+
break;
|
|
1167
|
+
case "meridiemShort":
|
|
1168
|
+
out += p4.hours < 12 ? "A" : "P";
|
|
1169
|
+
sawField = true;
|
|
1170
|
+
break;
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
return sawField && out.trim() ? out : null;
|
|
1174
|
+
}
|
|
1175
|
+
|
|
823
1176
|
// src/selectionCard.ts
|
|
824
1177
|
var SYNTHETIC_PREFIX = "__";
|
|
825
1178
|
var NUMERIC_DATATYPE = /int|double|decimal|single|float|number|currency|money/i;
|
|
826
1179
|
function normaliseAggregation(raw) {
|
|
827
|
-
const
|
|
828
|
-
if (!
|
|
829
|
-
if (/^(avg|average|mean)$/.test(
|
|
830
|
-
if (/^(min|minimum)$/.test(
|
|
831
|
-
if (/^(max|maximum)$/.test(
|
|
832
|
-
if (/^(count|countrows)$/.test(
|
|
833
|
-
if (/^(median|med)$/.test(
|
|
834
|
-
if (/^(distinctcount|dcount|countdistinct|uniques?)$/.test(
|
|
1180
|
+
const s2 = String(raw ?? "").trim().toLowerCase();
|
|
1181
|
+
if (!s2) return "sum";
|
|
1182
|
+
if (/^(avg|average|mean)$/.test(s2)) return "average";
|
|
1183
|
+
if (/^(min|minimum)$/.test(s2)) return "min";
|
|
1184
|
+
if (/^(max|maximum)$/.test(s2)) return "max";
|
|
1185
|
+
if (/^(count|countrows)$/.test(s2)) return "count";
|
|
1186
|
+
if (/^(median|med)$/.test(s2)) return "median";
|
|
1187
|
+
if (/^(distinctcount|dcount|countdistinct|uniques?)$/.test(s2)) return "distinctcount";
|
|
835
1188
|
return "sum";
|
|
836
1189
|
}
|
|
837
1190
|
function aggLabel(agg) {
|
|
@@ -852,8 +1205,8 @@ function aggLabel(agg) {
|
|
|
852
1205
|
return "Sum";
|
|
853
1206
|
}
|
|
854
1207
|
}
|
|
855
|
-
function isSynthetic(
|
|
856
|
-
return String(
|
|
1208
|
+
function isSynthetic(name2) {
|
|
1209
|
+
return String(name2 ?? "").startsWith(SYNTHETIC_PREFIX);
|
|
857
1210
|
}
|
|
858
1211
|
function isMeasureColumn(col) {
|
|
859
1212
|
if (!col || isSynthetic(col.name)) return false;
|
|
@@ -863,64 +1216,79 @@ function isMeasureColumn(col) {
|
|
|
863
1216
|
function isRealColumn(col) {
|
|
864
1217
|
return !!col && !isSynthetic(col.name);
|
|
865
1218
|
}
|
|
1219
|
+
function isSerialisedDateColumn(col) {
|
|
1220
|
+
return /^datetime/i.test(String(col?.dataType ?? ""));
|
|
1221
|
+
}
|
|
1222
|
+
function displayText(col, raw, opts) {
|
|
1223
|
+
if (raw == null || raw === "") return "(blank)";
|
|
1224
|
+
if (isSerialisedDateColumn(col)) {
|
|
1225
|
+
const shown = formatSourceDate(raw, {
|
|
1226
|
+
format: opts.sourceFormats?.byColumn?.[String(col?.name ?? "")] ?? null,
|
|
1227
|
+
dialect: opts.sourceFormats?.dialect,
|
|
1228
|
+
culture: opts.cultureCode
|
|
1229
|
+
});
|
|
1230
|
+
if (shown) return shown;
|
|
1231
|
+
}
|
|
1232
|
+
return String(raw);
|
|
1233
|
+
}
|
|
866
1234
|
function isSuppressed(col) {
|
|
867
|
-
return
|
|
1235
|
+
return vt(col).suppressed;
|
|
868
1236
|
}
|
|
869
1237
|
function resolveAgg(col, requested, auto) {
|
|
870
1238
|
const fallback = () => {
|
|
871
|
-
const
|
|
872
|
-
return
|
|
1239
|
+
const d2 = Me(col);
|
|
1240
|
+
return d2 === "first" ? "count" : d2;
|
|
873
1241
|
};
|
|
874
1242
|
if (auto) return fallback();
|
|
875
|
-
return
|
|
1243
|
+
return It(col).indexOf(requested) >= 0 ? requested : fallback();
|
|
876
1244
|
}
|
|
877
|
-
function toNumber(
|
|
878
|
-
if (
|
|
879
|
-
const
|
|
880
|
-
return Number.isFinite(
|
|
1245
|
+
function toNumber(v2) {
|
|
1246
|
+
if (v2 == null || v2 === "") return null;
|
|
1247
|
+
const n2 = typeof v2 === "number" ? v2 : Number(v2);
|
|
1248
|
+
return Number.isFinite(n2) ? n2 : null;
|
|
881
1249
|
}
|
|
882
1250
|
function reduce(values, agg, distinctRaw) {
|
|
883
1251
|
if (agg === "count") return values.length;
|
|
884
|
-
if (agg === "distinctcount") return new Set(distinctRaw.map((
|
|
1252
|
+
if (agg === "distinctcount") return new Set(distinctRaw.map((v2) => v2 == null ? "\0" : String(v2))).size;
|
|
885
1253
|
if (!values.length) return null;
|
|
886
1254
|
switch (agg) {
|
|
887
1255
|
case "average":
|
|
888
|
-
return values.reduce((
|
|
1256
|
+
return values.reduce((a2, b2) => a2 + b2, 0) / values.length;
|
|
889
1257
|
case "min":
|
|
890
1258
|
return Math.min(...values);
|
|
891
1259
|
case "max":
|
|
892
1260
|
return Math.max(...values);
|
|
893
1261
|
case "median": {
|
|
894
|
-
const
|
|
895
|
-
const
|
|
896
|
-
return
|
|
1262
|
+
const s2 = [...values].sort((a2, b2) => a2 - b2);
|
|
1263
|
+
const m2 = s2.length >> 1;
|
|
1264
|
+
return s2.length % 2 ? s2[m2] : (s2[m2 - 1] + s2[m2]) / 2;
|
|
897
1265
|
}
|
|
898
1266
|
default:
|
|
899
|
-
return values.reduce((
|
|
1267
|
+
return values.reduce((a2, b2) => a2 + b2, 0);
|
|
900
1268
|
}
|
|
901
1269
|
}
|
|
902
|
-
function fmtNumber(
|
|
1270
|
+
function fmtNumber(v2, culture) {
|
|
903
1271
|
try {
|
|
904
|
-
const abs = Math.abs(
|
|
1272
|
+
const abs = Math.abs(v2);
|
|
905
1273
|
const opts = abs >= 1e6 ? { notation: "compact", maximumFractionDigits: 1 } : { maximumFractionDigits: abs < 10 ? 2 : 0 };
|
|
906
|
-
return new Intl.NumberFormat(culture || void 0, opts).format(
|
|
1274
|
+
return new Intl.NumberFormat(culture || void 0, opts).format(v2);
|
|
907
1275
|
} catch {
|
|
908
|
-
return String(Math.round(
|
|
1276
|
+
return String(Math.round(v2 * 100) / 100);
|
|
909
1277
|
}
|
|
910
1278
|
}
|
|
911
1279
|
function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
|
|
912
1280
|
const columns = payload?.columns ?? [];
|
|
913
1281
|
const rows = payload?.rows ?? [];
|
|
914
1282
|
if (!columns.length || !rows.length) return null;
|
|
915
|
-
const wanted = Array.from(new Set((selectedRowIdxs ?? []).filter((
|
|
1283
|
+
const wanted = Array.from(new Set((selectedRowIdxs ?? []).filter((n2) => Number.isInteger(n2))));
|
|
916
1284
|
if (!wanted.length) return null;
|
|
917
|
-
const rowIdxCol = columns.findIndex((
|
|
1285
|
+
const rowIdxCol = columns.findIndex((c2) => c2?.name === "__rowIdx__");
|
|
918
1286
|
let byIdx = null;
|
|
919
1287
|
if (rowIdxCol >= 0) {
|
|
920
1288
|
byIdx = /* @__PURE__ */ new Map();
|
|
921
|
-
for (let
|
|
922
|
-
const
|
|
923
|
-
if (
|
|
1289
|
+
for (let r2 = 0; r2 < rows.length; r2++) {
|
|
1290
|
+
const v2 = toNumber(rows[r2]?.[rowIdxCol]);
|
|
1291
|
+
if (v2 != null) byIdx.set(v2, r2);
|
|
924
1292
|
}
|
|
925
1293
|
}
|
|
926
1294
|
const positions = [];
|
|
@@ -934,17 +1302,16 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
|
|
|
934
1302
|
const maxMeasures = opts.maxMeasures ?? 4;
|
|
935
1303
|
const maxHeaderValues = opts.maxHeaderValues ?? 3;
|
|
936
1304
|
const maxDimensions = opts.maxDimensions ?? 2;
|
|
937
|
-
const dimIdx = columns.findIndex((
|
|
1305
|
+
const dimIdx = columns.findIndex((c2) => c2 && !isSynthetic(c2.name) && !isMeasureColumn(c2));
|
|
938
1306
|
let header;
|
|
939
1307
|
if (dimIdx >= 0) {
|
|
940
1308
|
const seen = [];
|
|
941
1309
|
const set = /* @__PURE__ */ new Set();
|
|
942
|
-
for (const
|
|
943
|
-
const
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
seen.push(s);
|
|
1310
|
+
for (const p4 of positions) {
|
|
1311
|
+
const s2 = displayText(columns[dimIdx], rows[p4]?.[dimIdx], opts);
|
|
1312
|
+
if (!set.has(s2)) {
|
|
1313
|
+
set.add(s2);
|
|
1314
|
+
seen.push(s2);
|
|
948
1315
|
}
|
|
949
1316
|
if (seen.length > maxHeaderValues) break;
|
|
950
1317
|
}
|
|
@@ -954,35 +1321,35 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
|
|
|
954
1321
|
}
|
|
955
1322
|
const measureCols = [];
|
|
956
1323
|
const suppressedColumns = [];
|
|
957
|
-
for (let
|
|
958
|
-
if (!isMeasureColumn(columns[
|
|
959
|
-
if (isSuppressed(columns[
|
|
960
|
-
suppressedColumns.push(String(columns[
|
|
1324
|
+
for (let c2 = 0; c2 < columns.length; c2++) {
|
|
1325
|
+
if (!isMeasureColumn(columns[c2])) continue;
|
|
1326
|
+
if (isSuppressed(columns[c2])) {
|
|
1327
|
+
suppressedColumns.push(String(columns[c2]?.name ?? ""));
|
|
961
1328
|
continue;
|
|
962
1329
|
}
|
|
963
|
-
measureCols.push(
|
|
1330
|
+
measureCols.push(c2);
|
|
964
1331
|
}
|
|
965
1332
|
const shown = measureCols.slice(0, maxMeasures);
|
|
966
1333
|
const lines = [];
|
|
967
|
-
for (const
|
|
968
|
-
const col = columns[
|
|
1334
|
+
for (const c2 of shown) {
|
|
1335
|
+
const col = columns[c2];
|
|
969
1336
|
const colAgg = resolveAgg(col, agg, auto);
|
|
970
1337
|
const selVals = [];
|
|
971
1338
|
const selRaw = [];
|
|
972
|
-
for (const
|
|
973
|
-
const
|
|
974
|
-
selRaw.push(rows[
|
|
975
|
-
if (
|
|
1339
|
+
for (const p4 of positions) {
|
|
1340
|
+
const n2 = toNumber(rows[p4]?.[c2]);
|
|
1341
|
+
selRaw.push(rows[p4]?.[c2]);
|
|
1342
|
+
if (n2 != null) selVals.push(n2);
|
|
976
1343
|
}
|
|
977
1344
|
const value = reduce(selVals, colAgg, selRaw);
|
|
978
1345
|
let sharePct = null;
|
|
979
|
-
if (
|
|
1346
|
+
if (Te(col, colAgg) && value != null) {
|
|
980
1347
|
const allVals = [];
|
|
981
1348
|
const allRaw = [];
|
|
982
|
-
for (let
|
|
983
|
-
const
|
|
984
|
-
allRaw.push(rows[
|
|
985
|
-
if (
|
|
1349
|
+
for (let r2 = 0; r2 < rows.length; r2++) {
|
|
1350
|
+
const n2 = toNumber(rows[r2]?.[c2]);
|
|
1351
|
+
allRaw.push(rows[r2]?.[c2]);
|
|
1352
|
+
if (n2 != null) allVals.push(n2);
|
|
986
1353
|
}
|
|
987
1354
|
const total = reduce(allVals, colAgg, allRaw);
|
|
988
1355
|
if (total != null && total > 0) sharePct = value / total * 100;
|
|
@@ -998,23 +1365,23 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
|
|
|
998
1365
|
});
|
|
999
1366
|
}
|
|
1000
1367
|
const dimensionLines = [];
|
|
1001
|
-
for (let
|
|
1002
|
-
if (
|
|
1003
|
-
if (!isRealColumn(columns[
|
|
1004
|
-
const
|
|
1368
|
+
for (let c2 = 0; c2 < columns.length && dimensionLines.length < maxDimensions; c2++) {
|
|
1369
|
+
if (c2 === dimIdx) continue;
|
|
1370
|
+
if (!isRealColumn(columns[c2]) || isMeasureColumn(columns[c2])) continue;
|
|
1371
|
+
const name2 = String(columns[c2]?.name ?? "");
|
|
1005
1372
|
const distinct = /* @__PURE__ */ new Set();
|
|
1006
1373
|
let firstText = "";
|
|
1007
|
-
for (const
|
|
1008
|
-
const raw = rows[
|
|
1009
|
-
const
|
|
1010
|
-
if (!distinct.size) firstText =
|
|
1011
|
-
distinct.add(
|
|
1374
|
+
for (const p4 of positions) {
|
|
1375
|
+
const raw = rows[p4]?.[c2];
|
|
1376
|
+
const key = raw == null || raw === "" ? "(blank)" : String(raw);
|
|
1377
|
+
if (!distinct.size) firstText = displayText(columns[c2], raw, opts);
|
|
1378
|
+
distinct.add(key);
|
|
1012
1379
|
}
|
|
1013
1380
|
if (!distinct.size) continue;
|
|
1014
1381
|
const single = distinct.size === 1;
|
|
1015
1382
|
dimensionLines.push({
|
|
1016
|
-
column:
|
|
1017
|
-
label: single ?
|
|
1383
|
+
column: name2,
|
|
1384
|
+
label: single ? name2 : `Distinct ${name2}`,
|
|
1018
1385
|
value: single ? null : distinct.size,
|
|
1019
1386
|
valueText: single ? firstText : fmtNumber(distinct.size, opts.cultureCode),
|
|
1020
1387
|
sharePct: null,
|
|
@@ -1035,6 +1402,616 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
|
|
|
1035
1402
|
};
|
|
1036
1403
|
}
|
|
1037
1404
|
|
|
1405
|
+
// ../../node_modules/colorsea/dist/index.esm.js
|
|
1406
|
+
function t(t2, r2, n2, e2) {
|
|
1407
|
+
var o2, i2 = arguments.length, a2 = i2 < 3 ? r2 : null === e2 ? e2 = Object.getOwnPropertyDescriptor(r2, n2) : e2;
|
|
1408
|
+
if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) a2 = Reflect.decorate(t2, r2, n2, e2);
|
|
1409
|
+
else for (var u3 = t2.length - 1; u3 >= 0; u3--) (o2 = t2[u3]) && (a2 = (i2 < 3 ? o2(a2) : i2 > 3 ? o2(r2, n2, a2) : o2(r2, n2)) || a2);
|
|
1410
|
+
return i2 > 3 && a2 && Object.defineProperty(r2, n2, a2), a2;
|
|
1411
|
+
}
|
|
1412
|
+
function r(t2, r2, n2) {
|
|
1413
|
+
if (n2 || 2 === arguments.length) for (var e2, o2 = 0, i2 = r2.length; o2 < i2; o2++) !e2 && o2 in r2 || (e2 || (e2 = Array.prototype.slice.call(r2, 0, o2)), e2[o2] = r2[o2]);
|
|
1414
|
+
return t2.concat(e2 || Array.prototype.slice.call(r2));
|
|
1415
|
+
}
|
|
1416
|
+
var n = function(t2, r2, n2) {
|
|
1417
|
+
return [t2, r2, n2].map((function(t3) {
|
|
1418
|
+
return (t3 /= 255) > 0.04045 ? Math.pow((t3 + 0.055) / 1.055, 2.4) : t3 / 12.92;
|
|
1419
|
+
}));
|
|
1420
|
+
};
|
|
1421
|
+
var e = function(t2, r2, n2) {
|
|
1422
|
+
return [t2, r2, n2].map((function(t3) {
|
|
1423
|
+
return 255 * (t3 <= 304e-5 ? 12.92 * t3 : 1.055 * Math.pow(t3, 1 / 2.4) - 0.055);
|
|
1424
|
+
}));
|
|
1425
|
+
};
|
|
1426
|
+
var o = function(t2, r2, n2) {
|
|
1427
|
+
return Math.min(Math.max(t2, r2), n2);
|
|
1428
|
+
};
|
|
1429
|
+
var i = function(t2, r2) {
|
|
1430
|
+
return Math.round((t2 + Number.EPSILON) * Math.pow(10, r2)) / Math.pow(10, r2);
|
|
1431
|
+
};
|
|
1432
|
+
var a = function(t2, r2) {
|
|
1433
|
+
return Math.floor(Math.random() * (r2 - t2 + 1) - t2);
|
|
1434
|
+
};
|
|
1435
|
+
var u2 = function(t2, r2, n2, e2) {
|
|
1436
|
+
for (var i2, a2 = [t2, r2, n2], u3 = "#", h2 = 0; h2 < a2.length; h2++) u3 += (i2 = a2[h2], Math.round(o(i2, 0, 255)).toString(16).padStart(2, "0"));
|
|
1437
|
+
return null != e2 && (u3 += Math.round(o(e2, 0, 100) / 100 * 255).toString(16).padStart(2, "0")), u3;
|
|
1438
|
+
};
|
|
1439
|
+
var h = function(t2) {
|
|
1440
|
+
var n2 = t2.length, e2 = (t2 = (function(t3) {
|
|
1441
|
+
var r2 = (t3 = /^#/.test(t3) ? t3.slice(1) : t3).length;
|
|
1442
|
+
if (![3, 4, 6, 8].includes(r2)) return "000000";
|
|
1443
|
+
if (6 === r2 || 8 === r2) return t3;
|
|
1444
|
+
if (3 === r2 || 4 === r2) {
|
|
1445
|
+
for (var n3 = "", e3 = 0; e3 < r2; e3++) {
|
|
1446
|
+
var o3 = t3[e3];
|
|
1447
|
+
n3 += "" + o3 + o3;
|
|
1448
|
+
}
|
|
1449
|
+
return n3;
|
|
1450
|
+
}
|
|
1451
|
+
return "000000";
|
|
1452
|
+
})(t2).padEnd(8, "ff")).match(/.{2}/g);
|
|
1453
|
+
if (!e2) return [0, 0, 0, 1];
|
|
1454
|
+
var o2 = [0, 0, 0], i2 = false;
|
|
1455
|
+
return e2.forEach((function(t3, r2) {
|
|
1456
|
+
r2 < 3 ? o2[r2] = parseInt(t3, 16) : i2 = 100 * parseInt(t3, 16) / 255;
|
|
1457
|
+
})), false === i2 || n2 < 8 ? o2 : r(r([], o2, true), [i2], false);
|
|
1458
|
+
};
|
|
1459
|
+
var c = function(t2, r2, n2) {
|
|
1460
|
+
var e2;
|
|
1461
|
+
e2 = [t2, r2, n2].map((function(t3) {
|
|
1462
|
+
return t3 / 255;
|
|
1463
|
+
})), t2 = e2[0], r2 = e2[1], n2 = e2[2];
|
|
1464
|
+
var o2 = 1 - Math.max(t2, r2, n2), i2 = o2 < 1 ? 1 / (1 - o2) : 0;
|
|
1465
|
+
return [(1 - t2 - o2) * i2 * 100, (1 - r2 - o2) * i2 * 100, (1 - n2 - o2) * i2 * 100, 100 * o2];
|
|
1466
|
+
};
|
|
1467
|
+
var l = function(t2, r2, n2, e2) {
|
|
1468
|
+
return 100 === e2 ? [0, 0, 0] : (e2 /= 100, [t2, r2, n2].map((function(t3) {
|
|
1469
|
+
return (t3 /= 100) >= 1 ? 0 : 255 * (1 - t3) * (1 - e2);
|
|
1470
|
+
})));
|
|
1471
|
+
};
|
|
1472
|
+
function p3(t2, r2, n2, e2) {
|
|
1473
|
+
var o2;
|
|
1474
|
+
void 0 === e2 && (e2 = "l"), o2 = [t2, r2, n2].map((function(t3) {
|
|
1475
|
+
return t3 / 255;
|
|
1476
|
+
})), t2 = o2[0], r2 = o2[1], n2 = o2[2];
|
|
1477
|
+
var i2 = Math.max(t2, r2, n2), a2 = Math.min(t2, r2, n2), u3 = (function(t3, r3, n3, e3) {
|
|
1478
|
+
var o3;
|
|
1479
|
+
void 0 === e3 && (e3 = false), o3 = [t3, r3, n3].map((function(t4) {
|
|
1480
|
+
return t4 / 255;
|
|
1481
|
+
})), t3 = o3[0], r3 = o3[1], n3 = o3[2];
|
|
1482
|
+
var i3 = Math.max(t3, r3, n3), a3 = Math.min(t3, r3, n3), u4 = 0;
|
|
1483
|
+
if (i3 !== a3) if (e3) u4 = (t3 - r3 + (t3 - n3)) / 2, u4 /= Math.sqrt((t3 - r3) * (t3 - r3) + (t3 - n3) * (r3 - n3)), u4 = Math.acos(u4), n3 > r3 && (u4 = 2 * Math.PI - u4), u4 /= 2 * Math.PI;
|
|
1484
|
+
else {
|
|
1485
|
+
var h3 = i3 - a3;
|
|
1486
|
+
u4 = i3 === t3 ? (r3 - n3) / h3 + (r3 < n3 ? 6 : 0) : i3 === r3 ? (n3 - t3) / h3 + 2 : (t3 - r3) / h3 + 4, u4 /= 6;
|
|
1487
|
+
}
|
|
1488
|
+
else u4 = NaN;
|
|
1489
|
+
return 360 * u4;
|
|
1490
|
+
})(t2, r2, n2, "i" === e2), h2 = 0, c2 = (i2 + a2) / 2, l2 = i2 - a2, p4 = i2, f2 = (t2 + r2 + n2) / 3;
|
|
1491
|
+
return "v" === e2 && (h2 = 0 === i2 ? 0 : l2 / i2), i2 !== a2 && "l" === e2 && (h2 = c2 > 0.5 ? l2 / (2 - i2 - a2) : l2 / (i2 + a2)), "i" === e2 && (h2 = f2 > 0 ? 1 - a2 / f2 : 0), h2 *= 100, c2 *= 100, f2 *= 100, "l" === e2 ? [u3, h2, c2] : "v" === e2 ? [u3, h2, p4 *= 100] : [u3, h2, f2];
|
|
1492
|
+
}
|
|
1493
|
+
var f = function(t2, r2, n2) {
|
|
1494
|
+
return p3(t2, r2, n2, "l");
|
|
1495
|
+
};
|
|
1496
|
+
var s = function(t2, r2, n2) {
|
|
1497
|
+
var e2, i2, a2 = function(t3) {
|
|
1498
|
+
return 6 * (t3 = t3 < 0 ? t3 + 1 : t3 > 1 ? t3 - 1 : t3) < 1 ? e2 + (i2 - e2) * t3 * 6 : 2 * t3 < 1 ? i2 : 3 * t3 < 2 ? e2 + (i2 - e2) * (2 / 3 - t3) * 6 : e2;
|
|
1499
|
+
};
|
|
1500
|
+
return t2 = t2 % 360 / 360, r2 = o(r2 / 100, 0, 1), n2 = o(n2 / 100, 0, 1), e2 = 2 * n2 - (i2 = n2 <= 0.5 ? n2 * (r2 + 1) : n2 + r2 - n2 * r2), [255 * a2(t2 + 1 / 3), 255 * a2(t2), 255 * a2(t2 - 1 / 3)];
|
|
1501
|
+
};
|
|
1502
|
+
var v = function(t2, r2, n2) {
|
|
1503
|
+
return p3(t2, r2, n2, "v");
|
|
1504
|
+
};
|
|
1505
|
+
var b = function(t2, r2, n2) {
|
|
1506
|
+
var e2, o2, i2 = [n2 /= 100, n2 * (1 - (r2 /= 100)), n2 * (1 - (o2 = (t2 = t2 % 360 / 360 * 360) / 60 - (e2 = Math.floor(t2 / 60 % 6))) * r2), n2 * (1 - (1 - o2) * r2)], a2 = [[0, 3, 1], [2, 0, 1], [1, 0, 3], [1, 2, 0], [3, 1, 0], [0, 1, 2]];
|
|
1507
|
+
return [255 * i2[a2[e2][0]], 255 * i2[a2[e2][1]], 255 * i2[a2[e2][2]]];
|
|
1508
|
+
};
|
|
1509
|
+
var y = function(t2, r2, n2) {
|
|
1510
|
+
return p3(t2, r2, n2, "i");
|
|
1511
|
+
};
|
|
1512
|
+
var d = function(t2, r2, n2) {
|
|
1513
|
+
var e2, i2, a2, u3;
|
|
1514
|
+
r2 /= 100, n2 /= 100, isNaN(t2) && (t2 = 0), isNaN(r2) && (r2 = 0);
|
|
1515
|
+
var h2 = function(t3) {
|
|
1516
|
+
return (1 + r2 * Math.cos(2 * Math.PI * t3) / Math.cos(Math.PI / 3 - 2 * Math.PI * t3)) / 3;
|
|
1517
|
+
};
|
|
1518
|
+
return (t2 = (360 + t2) % 360 / 360) < 1 / 3 ? a2 = 1 - ((u3 = (1 - r2) / 3) + (i2 = h2(t2))) : t2 < 2 / 3 ? u3 = 1 - ((i2 = (1 - r2) / 3) + (a2 = h2(t2 -= 1 / 3))) : i2 = 1 - ((a2 = (1 - r2) / 3) + (u3 = h2(t2 -= 2 / 3))), e2 = [i2, a2, u3].map((function(t3) {
|
|
1519
|
+
return 255 * o(n2 * t3 * 3, 0, 1);
|
|
1520
|
+
})), [i2 = e2[0], a2 = e2[1], u3 = e2[2]];
|
|
1521
|
+
};
|
|
1522
|
+
var g = function(t2, r2, n2) {
|
|
1523
|
+
return [f(t2, r2, n2)[0], 100 * (Math.min(t2, r2, n2) / 255), 100 * (1 - Math.max(t2, r2, n2) / 255)];
|
|
1524
|
+
};
|
|
1525
|
+
function w(t2, r2, n2) {
|
|
1526
|
+
return r2 /= 100, n2 /= 100, s(t2, 100, 50).map((function(t3) {
|
|
1527
|
+
return 255 * (t3 / 255 * (1 - r2 - n2) + r2);
|
|
1528
|
+
}));
|
|
1529
|
+
}
|
|
1530
|
+
var m = { x: [0.4124564, 0.3575761, 0.1804375], y: [0.2126729, 0.7151522, 0.072175], z: [0.0193339, 0.119192, 0.9503041] };
|
|
1531
|
+
var M = { r: [3.2404542, -1.5371385, -0.4985314], g: [-0.969266, 1.8760108, 0.041556], b: [0.0556434, -0.2040259, 1.0572252] };
|
|
1532
|
+
var x = 0.95047;
|
|
1533
|
+
var _ = 1;
|
|
1534
|
+
var C = 1.08883;
|
|
1535
|
+
var I = 0.206896552;
|
|
1536
|
+
var k = 8856452e-9;
|
|
1537
|
+
var E = 24389 / 27;
|
|
1538
|
+
var z = function(t2, r2, e2) {
|
|
1539
|
+
var o2 = n(t2, r2, e2);
|
|
1540
|
+
return [100 * m.x.reduce((function(t3, r3, n2) {
|
|
1541
|
+
return t3 + r3 * o2[n2];
|
|
1542
|
+
}), 0), 100 * m.y.reduce((function(t3, r3, n2) {
|
|
1543
|
+
return t3 + r3 * o2[n2];
|
|
1544
|
+
}), 0), 100 * m.z.reduce((function(t3, r3, n2) {
|
|
1545
|
+
return t3 + r3 * o2[n2];
|
|
1546
|
+
}), 0)];
|
|
1547
|
+
};
|
|
1548
|
+
var N = function(t2, r2, n2) {
|
|
1549
|
+
var o2 = [t2, r2, n2], i2 = M.r.reduce((function(t3, r3, n3) {
|
|
1550
|
+
return t3 + r3 * o2[n3];
|
|
1551
|
+
}), 0) / 100, a2 = M.g.reduce((function(t3, r3, n3) {
|
|
1552
|
+
return t3 + r3 * o2[n3];
|
|
1553
|
+
}), 0) / 100, u3 = M.b.reduce((function(t3, r3, n3) {
|
|
1554
|
+
return t3 + r3 * o2[n3];
|
|
1555
|
+
}), 0) / 100;
|
|
1556
|
+
return e(i2, a2, u3);
|
|
1557
|
+
};
|
|
1558
|
+
var O = function(t2, r2, n2) {
|
|
1559
|
+
var e2;
|
|
1560
|
+
return e2 = [t2 = t2 / x / 100, r2 = r2 / _ / 100, n2 = n2 / C / 100].map((function(t3) {
|
|
1561
|
+
return t3 > k ? Math.pow(t3, 1 / 3) : (E * t3 + 16) / 116;
|
|
1562
|
+
})), t2 = e2[0], r2 = e2[1], n2 = e2[2], [Math.max(0, 116 * r2 - 16), 500 * (t2 - r2), 200 * (r2 - n2)];
|
|
1563
|
+
};
|
|
1564
|
+
var P = function(t2, r2, n2) {
|
|
1565
|
+
var e2, o2 = (t2 + 16) / 116, i2 = isNaN(r2) ? o2 : o2 + r2 / 500, a2 = isNaN(n2) ? o2 : o2 - n2 / 200;
|
|
1566
|
+
return e2 = [i2, o2, a2].map((function(t3) {
|
|
1567
|
+
return t3 > I ? Math.pow(t3, 3) : (116 * t3 - 16) / E;
|
|
1568
|
+
})), i2 = e2[0], o2 = e2[1], a2 = e2[2], [i2 * x * 100, o2 * _ * 100, a2 * C * 100];
|
|
1569
|
+
};
|
|
1570
|
+
var j = function(t2, r2, n2) {
|
|
1571
|
+
return N.apply(void 0, P(t2, r2, n2));
|
|
1572
|
+
};
|
|
1573
|
+
var S = function(t2, r2, n2) {
|
|
1574
|
+
r2 = o(r2, -100, 100), n2 = o(n2, -100, 100);
|
|
1575
|
+
var e2 = Math.sqrt(r2 * r2 + n2 * n2), i2 = (180 * Math.atan2(n2, r2) / Math.PI + 360) % 360;
|
|
1576
|
+
return 0 === Math.round(1e4 * e2) && (i2 = Number.NaN), [t2, e2, i2];
|
|
1577
|
+
};
|
|
1578
|
+
var A = function(t2, r2, n2) {
|
|
1579
|
+
return isNaN(n2) && (n2 = 0), n2 *= Math.PI / 180, [t2, Math.cos(n2) * r2, Math.sin(n2) * r2];
|
|
1580
|
+
};
|
|
1581
|
+
var L = function(t2, r2, n2) {
|
|
1582
|
+
return P.apply(void 0, A(t2, r2, n2));
|
|
1583
|
+
};
|
|
1584
|
+
var H = function(t2, r2, n2) {
|
|
1585
|
+
var e2 = t2 + r2 + n2, o2 = 0, i2 = 0;
|
|
1586
|
+
return e2 > 0 && (o2 = t2 / e2, i2 = r2 / e2), [o2, i2, r2];
|
|
1587
|
+
};
|
|
1588
|
+
var Y = Object.freeze({ __proto__: null, linear2rgb: e, rgb2linear: n, rgb2hex: u2, hex2rgb: h, rgb2cmyk: c, cmyk2rgb: l, rgb2hsl: f, hsl2rgb: s, rgb2hsv: v, hsv2rgb: b, rgb2hsi: y, hsi2rgb: d, rgb2hwb: g, hwb2rgb: w, rgb2xyz: z, xyz2rgb: N, xyz2lab: O, lab2xyz: P, rgb2lab: function(t2, r2, n2) {
|
|
1589
|
+
return O.apply(void 0, z(t2, r2, n2));
|
|
1590
|
+
}, lab2rgb: j, lch2lab: A, lab2lch: S, xyz2lch: function(t2, r2, n2) {
|
|
1591
|
+
return S.apply(void 0, O(t2, r2, n2));
|
|
1592
|
+
}, lch2xyz: L, xyY2xyz: function(t2, r2, n2) {
|
|
1593
|
+
return 0 === r2 ? [0, 0, 0] : [t2 * (n2 / r2), n2, n2 / r2 * (1 - t2 - r2)];
|
|
1594
|
+
}, xyz2xyY: H });
|
|
1595
|
+
function R(t2, n2) {
|
|
1596
|
+
return void 0 === n2 && (n2 = false), function(e2, o2, i2) {
|
|
1597
|
+
var a2 = i2.value;
|
|
1598
|
+
i2.value = function() {
|
|
1599
|
+
for (var e3 = [], o3 = 0; o3 < arguments.length; o3++) e3[o3] = arguments[o3];
|
|
1600
|
+
if (e3.length > 0 && n2) {
|
|
1601
|
+
var i3 = JSON.stringify(e3);
|
|
1602
|
+
t2 += i3;
|
|
1603
|
+
}
|
|
1604
|
+
if (this.cache.has(t2)) return this.cache.get(t2);
|
|
1605
|
+
var u3 = a2.call.apply(a2, r([this], e3, false));
|
|
1606
|
+
return this.cache.set(t2, u3), u3;
|
|
1607
|
+
};
|
|
1608
|
+
};
|
|
1609
|
+
}
|
|
1610
|
+
function q(t2, n2, e2, o2) {
|
|
1611
|
+
return void 0 === t2 && (t2 = [0, 2, 2]), void 0 === n2 && (n2 = 0), void 0 === e2 && (e2 = true), void 0 === o2 && (o2 = 0), function(a2, u3, h2) {
|
|
1612
|
+
var c2 = h2.value;
|
|
1613
|
+
h2.value = function() {
|
|
1614
|
+
for (var a3 = [], u4 = 0; u4 < arguments.length; u4++) a3[u4] = arguments[u4];
|
|
1615
|
+
var h3 = void 0 === a3[o2] ? e2 : a3[o2], l2 = c2.call.apply(c2, r([this], a3, false));
|
|
1616
|
+
if (false === h3) return l2;
|
|
1617
|
+
var p4 = "number" == typeof h3 ? Math.round(h3) : 0, f2 = "number" == typeof t2 ? new Array(l2.length).fill(t2) : t2, s2 = f2.map((function(t3) {
|
|
1618
|
+
return 1 === n2 ? "number" == typeof h3 ? p4 : t3 : t3 + p4;
|
|
1619
|
+
}));
|
|
1620
|
+
return l2.map((function(t3, r2) {
|
|
1621
|
+
return i(t3, s2[r2]);
|
|
1622
|
+
}));
|
|
1623
|
+
};
|
|
1624
|
+
};
|
|
1625
|
+
}
|
|
1626
|
+
var D = function(t2, r2, n2) {
|
|
1627
|
+
var e2 = t2 instanceof ft ? t2 : new ft(t2), i2 = r2 instanceof ft ? r2 : new ft(r2), a2 = o(n2, 0, 100) / 100, u3 = 2 * a2 - 1, h2 = e2.alpha() - i2.alpha(), c2 = ((u3 * h2 == -1 ? u3 : (u3 + h2) / (1 + u3 * h2)) + 1) / 2, l2 = 1 - c2, p4 = [Math.round(o(e2.red() * c2 + i2.red() * l2, 0, 255)), Math.round(o(e2.green() * c2 + i2.green() * l2, 0, 255)), Math.round(o(e2.blue() * c2 + i2.blue() * l2, 0, 255))], f2 = e2.alpha() * a2 + i2.alpha() * (1 - a2);
|
|
1628
|
+
return new ft(p4, f2);
|
|
1629
|
+
};
|
|
1630
|
+
var F = Math.sqrt;
|
|
1631
|
+
var U = Math.pow;
|
|
1632
|
+
var $ = Math.cos;
|
|
1633
|
+
var J = Math.abs;
|
|
1634
|
+
var Z = Math.sin;
|
|
1635
|
+
var B = Math.exp;
|
|
1636
|
+
var G = Math.atan2;
|
|
1637
|
+
var K = Math.PI;
|
|
1638
|
+
var Q = function(t2) {
|
|
1639
|
+
return K * t2 / 180;
|
|
1640
|
+
};
|
|
1641
|
+
var T = function(t2, r2, n2) {
|
|
1642
|
+
void 0 === n2 && (n2 = true);
|
|
1643
|
+
var e2 = G(r2, t2);
|
|
1644
|
+
return n2 && (e2 = (e2 = (e2 = 180 * e2 / K) > 0 ? e2 : e2 + 360) > 360 ? e2 - 360 : e2), e2;
|
|
1645
|
+
};
|
|
1646
|
+
var V = function(t2, r2) {
|
|
1647
|
+
void 0 === r2 && (r2 = true);
|
|
1648
|
+
var n2 = t2.lab(false), e2 = n2[0], o2 = n2[1], i2 = n2[2];
|
|
1649
|
+
return [e2, F(U(o2, 2) + U(i2, 2)), T(o2, i2, r2), o2, i2];
|
|
1650
|
+
};
|
|
1651
|
+
var W = ["CMC", "CIE", "CIE2000", "CIE1994", "CIE1976"];
|
|
1652
|
+
var X = "CMC";
|
|
1653
|
+
var tt = "CIE2000";
|
|
1654
|
+
var rt = "CIE1994";
|
|
1655
|
+
var nt = "CIE1976";
|
|
1656
|
+
var et = function(t2, r2, n2, e2) {
|
|
1657
|
+
void 0 === n2 && (n2 = "CIE");
|
|
1658
|
+
var o2 = (function(t3) {
|
|
1659
|
+
var r3 = t3.toUpperCase();
|
|
1660
|
+
return W.includes(r3) && "CIE" !== r3 ? r3 : tt;
|
|
1661
|
+
})(n2);
|
|
1662
|
+
if (e2 = e2 || {}, o2 === X) {
|
|
1663
|
+
var i2 = Object.assign({}, { l: 1, c: 1 }, e2);
|
|
1664
|
+
return (function(t3, r3, n3, e3) {
|
|
1665
|
+
void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1);
|
|
1666
|
+
var o3 = V(t3, true), i3 = o3[0], a3 = o3[1], u4 = o3[2], h3 = o3[3], c3 = o3[4], l2 = V(r3), p4 = l2[0], f2 = l2[1], s2 = l2[3], v2 = a3 - f2, b2 = i3 - p4, y2 = c3 - l2[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 <= u4 && u4 <= 345 ? 0.56 + J(0.2 * $(Q(u4 + 168))) : 0.36 + J(0.4 * $(Q(u4 + 35))), M2 = F(U(a3, 4) / (U(a3, 4) + 1900)), x2 = w2 * (M2 * m2 + 1 - M2);
|
|
1667
|
+
return F(U(b2 / (n3 * g2), 2) + U(v2 / (e3 * w2), 2) + U(d2 / x2, 2));
|
|
1668
|
+
})(t2, r2, i2.l, i2.c);
|
|
1669
|
+
}
|
|
1670
|
+
if (o2 === rt) {
|
|
1671
|
+
var a2 = { kL: 1, kC: 1, kH: 1, cate: "graphic" }, u3 = Object.assign({}, a2, e2);
|
|
1672
|
+
return (function(t3, r3, n3, e3, o3, i3) {
|
|
1673
|
+
void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1), void 0 === o3 && (o3 = 1), void 0 === i3 && (i3 = "graphic");
|
|
1674
|
+
var a3 = "textiles" === i3 ? 0.048 : 0.045, u4 = "textiles" === i3 ? 0.014 : 0.015;
|
|
1675
|
+
n3 = "textiles" === i3 ? 2 : n3;
|
|
1676
|
+
var h3 = V(t3), c3 = h3[0], l2 = h3[1], p4 = h3[3], f2 = h3[4], s2 = V(r3), v2 = s2[0], b2 = s2[1], y2 = s2[3], d2 = c3 - v2, g2 = l2 - b2, w2 = f2 - s2[4], m2 = 1 + a3 * l2, M2 = 1 + u4 * l2, x2 = F(U(p4 - y2, 2) + U(w2, 2) - U(g2, 2));
|
|
1677
|
+
return F(U(d2 / (1 * n3), 2) + U(g2 / (e3 * m2), 2) + U(x2 / (o3 * M2), 2));
|
|
1678
|
+
})(t2, r2, u3.kL, u3.kC, u3.kH, u3.cate);
|
|
1679
|
+
}
|
|
1680
|
+
if (o2 === nt) return (function(t3, r3) {
|
|
1681
|
+
var n3 = t3.lab(false), e3 = n3[0], o3 = n3[1], i3 = n3[2], a3 = r3.lab(false), u4 = a3[0], h3 = a3[1], c3 = a3[2];
|
|
1682
|
+
return F(U(e3 - u4, 2) + U(o3 - h3, 2) + U(i3 - c3, 2));
|
|
1683
|
+
})(t2, r2);
|
|
1684
|
+
var h2 = { kL: 1, kC: 1, kH: 1 }, c2 = Object.assign({}, h2, e2);
|
|
1685
|
+
return (function(t3, r3, n3, e3, o3) {
|
|
1686
|
+
void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1), void 0 === o3 && (o3 = 1);
|
|
1687
|
+
var i3 = V(t3), a3 = i3[0], u4 = i3[1], h3 = i3[3], c3 = i3[4], l2 = V(r3), p4 = l2[0], f2 = l2[1], s2 = l2[3], v2 = l2[4], b2 = (a3 + p4) / 2, y2 = (u4 + 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 = p4 - a3, N2 = f2 - u4, 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));
|
|
1688
|
+
return F(U(z2 / (n3 * P2), 2) + U(N2 / (e3 * j2), 2) + U(O2 / (o3 * S2), 2) + L2 * (N2 / (e3 * j2)) * (O2 / (o3 * S2)));
|
|
1689
|
+
})(t2, r2, c2.kL, c2.kC, c2.kH);
|
|
1690
|
+
};
|
|
1691
|
+
var ot = function(t2, r2, n2) {
|
|
1692
|
+
var e2 = Math.abs, o2 = Math.max, i2 = Math.min, a2 = t2 instanceof ft ? t2 : new ft(t2), u3 = r2 instanceof ft ? r2 : new ft(r2), h2 = Object.assign({}, { b: 125, c: 500 }, n2);
|
|
1693
|
+
return !(e2(255 * a2.brightness() / 100 - 255 * u3.brightness() / 100) <= h2.b) && !(o2(a2.red(), u3.red()) - i2(a2.red(), u3.red()) + (o2(a2.green(), u3.green()) - i2(a2.green(), u3.green())) + (o2(a2.blue(), u3.blue()) - i2(a2.blue(), u3.blue())) <= h2.c);
|
|
1694
|
+
};
|
|
1695
|
+
var it = function(t2, r2, n2) {
|
|
1696
|
+
var e2, i2 = function(t3) {
|
|
1697
|
+
return o(t3, 0, 100);
|
|
1698
|
+
}, a2 = function(t3) {
|
|
1699
|
+
return o(t3, 0, 255);
|
|
1700
|
+
}, u3 = { h: [0, function(t3) {
|
|
1701
|
+
return t3 % 360;
|
|
1702
|
+
}], s: [1, i2], l: [2, i2], r: [0, a2], g: [1, a2], b: [2, a2] }, h2 = u3[r2][0];
|
|
1703
|
+
if (["h", "s", "l"].includes(r2)) {
|
|
1704
|
+
var c2 = t2.hsl();
|
|
1705
|
+
if (void 0 === n2) return c2[h2];
|
|
1706
|
+
n2 = u3[r2][1](n2), c2[h2] = n2, e2 = s.apply(void 0, c2);
|
|
1707
|
+
} else {
|
|
1708
|
+
if (e2 = t2.rgb(), void 0 === n2) return e2[h2];
|
|
1709
|
+
n2 = u3[r2][1](n2), e2[h2] = n2;
|
|
1710
|
+
}
|
|
1711
|
+
return new ft(e2, t2.alpha());
|
|
1712
|
+
};
|
|
1713
|
+
var at = {};
|
|
1714
|
+
var ut = /* @__PURE__ */ new Set(["rgb", "rgba", "cmyk", "lab", "hsl", "hsla", "hsv", "hsva", "hsi", "hsia", "xyz", "lch", "hwb", "hwba"]);
|
|
1715
|
+
var ht = /^([a-zA-Z]+)\(([\s\S]+)\)$/;
|
|
1716
|
+
var ct = function(t2) {
|
|
1717
|
+
return "string" == typeof t2 ? -1 === t2.indexOf("%") ? ct(Number(t2.trim())) : (t2 = t2.split("%")[0], (t2 = Number(t2.trim())) || 0) : Math.abs(t2) < 1 ? 100 * t2 : t2;
|
|
1718
|
+
};
|
|
1719
|
+
var lt = function(t2, r2) {
|
|
1720
|
+
void 0 === r2 && (r2 = /* @__PURE__ */ new Set());
|
|
1721
|
+
var n2 = "string" == typeof t2 ? t2 : t2.join(",");
|
|
1722
|
+
if (r2.has(n2)) throw new Error("Invalid Color");
|
|
1723
|
+
r2.add(n2);
|
|
1724
|
+
var e2 = "rgb", o2 = [0, 0, 0], i2 = 100;
|
|
1725
|
+
if (Array.isArray(t2)) {
|
|
1726
|
+
if (t2.length < 3) throw new Error("Invalid Color");
|
|
1727
|
+
for (var a2 = 0; a2 < t2.length; a2++) if (a2 < 3) o2[a2] = t2[a2];
|
|
1728
|
+
else {
|
|
1729
|
+
if (3 !== a2 || void 0 === t2[3]) break;
|
|
1730
|
+
i2 = t2[3];
|
|
1731
|
+
}
|
|
1732
|
+
} else {
|
|
1733
|
+
var u3 = false, c2 = t2.trim().match(ht);
|
|
1734
|
+
if (c2 || (u3 = true), c2) {
|
|
1735
|
+
var l2 = c2[1].toLocaleLowerCase();
|
|
1736
|
+
if (e2 = l2, ut.has(l2) || (u3 = true), c2[2] && !u3) {
|
|
1737
|
+
var p4 = c2[2], f2 = -1 !== p4.indexOf(",") ? "," : " ", s2 = p4.split(f2);
|
|
1738
|
+
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 ? o2[a2] = ct(s2[a2]) : o2[a2] = Number(s2[a2].trim()));
|
|
1739
|
+
["rgba", "hsla", "hsva", "hwba", "hsia"].includes(e2) ? (e2 = e2.slice(0, -1), void 0 !== s2[3] && (i2 = ct(s2[3]))) : "cmyk" === e2 && o2.push(void 0 !== s2[3] ? ct(s2[3]) : 0);
|
|
1740
|
+
}
|
|
1741
|
+
}
|
|
1742
|
+
if (u3) {
|
|
1743
|
+
if (!/^#(([a-fA-F\d]{3}){1,2}|[a-fA-F\d]{8})$/.test(t2)) try {
|
|
1744
|
+
return t2 = (function(t3, r3) {
|
|
1745
|
+
if (void 0 === r3 && (r3 = false), t3 = t3.toLowerCase(), void 0 === at[t3]) {
|
|
1746
|
+
if (r3) throw new Error("Unknown color name: ".concat(t3, ")"));
|
|
1747
|
+
return t3;
|
|
1748
|
+
}
|
|
1749
|
+
return at[t3];
|
|
1750
|
+
})(t2, true), lt(t2, r2);
|
|
1751
|
+
} catch (t3) {
|
|
1752
|
+
throw new Error("Invalid Color");
|
|
1753
|
+
}
|
|
1754
|
+
o2 = h(t2);
|
|
1755
|
+
}
|
|
1756
|
+
}
|
|
1757
|
+
return [e2, o2, i2];
|
|
1758
|
+
};
|
|
1759
|
+
var pt = { thowParseError: false };
|
|
1760
|
+
var ft = (function() {
|
|
1761
|
+
function n2(t2, r2, n3) {
|
|
1762
|
+
this.cache = /* @__PURE__ */ new Map(), this._rgb = [0, 0, 0], this._alpha = 100;
|
|
1763
|
+
var e2 = { thowParseError: pt.thowParseError }, i2 = Object.assign({}, e2, null != n3 ? n3 : {});
|
|
1764
|
+
try {
|
|
1765
|
+
var a2 = (function(t3) {
|
|
1766
|
+
var r3, n4 = { lab2rgb: j, hsl2rgb: s, hsv2rgb: b, xyz2rgb: N, hwb2rgb: w, hsi2rgb: d }, e3 = lt(t3), i3 = e3[0], a3 = e3[1], u4 = e3[2];
|
|
1767
|
+
if ("rgb" === i3) return [a3, u4];
|
|
1768
|
+
"lch" === i3 && (i3 = (r3 = ["xyz", L(a3[0], a3[1], a3[2])])[0], a3 = r3[1]);
|
|
1769
|
+
var h3 = a3[0], c2 = a3[1], p4 = a3[2], f2 = a3[3];
|
|
1770
|
+
if ("cmyk" === i3) return [l(h3, c2, p4, f2).map((function(t4) {
|
|
1771
|
+
return o(t4, 0, 255);
|
|
1772
|
+
})), u4];
|
|
1773
|
+
var v2 = "".concat(i3, "2rgb");
|
|
1774
|
+
if ("function" == typeof n4[v2]) return [n4[v2](h3, c2, p4).map((function(t4) {
|
|
1775
|
+
return o(t4, 0, 255);
|
|
1776
|
+
})), u4];
|
|
1777
|
+
throw new Error("Invalid color");
|
|
1778
|
+
})(t2), u3 = a2[0], h2 = a2[1];
|
|
1779
|
+
this._alpha = h2, this._rgb = u3;
|
|
1780
|
+
} catch (t3) {
|
|
1781
|
+
if (i2.thowParseError) throw t3;
|
|
1782
|
+
}
|
|
1783
|
+
void 0 !== r2 && (this._alpha = o(r2, 0, 100));
|
|
1784
|
+
}
|
|
1785
|
+
return n2.prototype.red = function(t2) {
|
|
1786
|
+
return it(this, "r", t2);
|
|
1787
|
+
}, n2.prototype.green = function(t2) {
|
|
1788
|
+
return it(this, "g", t2);
|
|
1789
|
+
}, n2.prototype.blue = function(t2) {
|
|
1790
|
+
return it(this, "b", t2);
|
|
1791
|
+
}, n2.prototype.alpha = function(t2) {
|
|
1792
|
+
return void 0 === t2 ? this._alpha : (t2 = o(t2, 0, 100), new n2(this.rgb(), t2));
|
|
1793
|
+
}, n2.prototype.fadeIn = function(t2, r2) {
|
|
1794
|
+
return void 0 === t2 && (t2 = 10), t2 = r2 && "relative" === r2 ? this._alpha * t2 / 100 : t2, new n2(this.rgb(), o(this._alpha + t2, 0, 100));
|
|
1795
|
+
}, n2.prototype.fadeOut = function(t2, r2) {
|
|
1796
|
+
return void 0 === t2 && (t2 = 10), t2 = r2 && "relative" === r2 ? this._alpha * t2 / 100 : t2, new n2(this.rgb(), o(this._alpha - t2, 0, 100));
|
|
1797
|
+
}, n2.prototype.opacify = function(t2, r2) {
|
|
1798
|
+
return void 0 === t2 && (t2 = 10), this.fadeIn(t2, r2);
|
|
1799
|
+
}, n2.prototype.transparentize = function(t2, r2) {
|
|
1800
|
+
return void 0 === t2 && (t2 = 10), this.fadeOut(t2, r2);
|
|
1801
|
+
}, n2.prototype.hue = function(t2) {
|
|
1802
|
+
return it(this, "h", t2);
|
|
1803
|
+
}, n2.prototype.saturation = function(t2) {
|
|
1804
|
+
return it(this, "s", t2);
|
|
1805
|
+
}, n2.prototype.lightness = function(t2) {
|
|
1806
|
+
return it(this, "l", t2);
|
|
1807
|
+
}, n2.prototype.rgb = function(t2) {
|
|
1808
|
+
return r([], this._rgb, true);
|
|
1809
|
+
}, n2.prototype.rgba = function(t2) {
|
|
1810
|
+
return r(r([], this.rgb(false), true), [this._alpha], false);
|
|
1811
|
+
}, n2.prototype.cmyk = function(t2) {
|
|
1812
|
+
return c.apply(void 0, this._rgb);
|
|
1813
|
+
}, n2.prototype.hsl = function(t2) {
|
|
1814
|
+
return f.apply(void 0, this._rgb);
|
|
1815
|
+
}, n2.prototype.hsla = function(t2) {
|
|
1816
|
+
return r(r([], this.hsl(false), true), [this._alpha], false);
|
|
1817
|
+
}, n2.prototype.hsv = function(t2) {
|
|
1818
|
+
return v.apply(void 0, this._rgb);
|
|
1819
|
+
}, n2.prototype.hsi = function(t2) {
|
|
1820
|
+
return y.apply(void 0, this._rgb);
|
|
1821
|
+
}, n2.prototype.hwb = function(t2) {
|
|
1822
|
+
return g.apply(void 0, this._rgb);
|
|
1823
|
+
}, n2.prototype.xyz = function(t2) {
|
|
1824
|
+
return z.apply(void 0, this._rgb);
|
|
1825
|
+
}, n2.prototype.lab = function(t2) {
|
|
1826
|
+
return O.apply(void 0, this.xyz(false));
|
|
1827
|
+
}, n2.prototype.lch = function(t2) {
|
|
1828
|
+
return S.apply(void 0, this.lab(false));
|
|
1829
|
+
}, n2.prototype.xyY = function(t2) {
|
|
1830
|
+
return H.apply(void 0, this.xyz(false));
|
|
1831
|
+
}, n2.prototype.hex = function(t2) {
|
|
1832
|
+
void 0 === t2 && (t2 = 2);
|
|
1833
|
+
var n3 = 0 === t2 ? void 0 : 1 === t2 ? this._alpha : 100 === this._alpha ? void 0 : this._alpha, e2 = "color:hex:param_".concat(t2);
|
|
1834
|
+
if (this.cache.has(e2)) return this.cache.get(e2);
|
|
1835
|
+
var o2 = u2.apply(void 0, r(r([], this._rgb, false), [n3], false));
|
|
1836
|
+
return this.cache.set(e2, o2), o2;
|
|
1837
|
+
}, n2.prototype.lighten = function(t2, r2) {
|
|
1838
|
+
void 0 === t2 && (t2 = 5);
|
|
1839
|
+
var e2 = this.hsl(false), i2 = e2[0], a2 = e2[1], u3 = e2[2];
|
|
1840
|
+
return u3 = o(u3 += void 0 !== r2 && "relative" === r2 ? u3 * (t2 / 100) : t2, 0, 100), new n2(s(i2, a2, u3), this._alpha);
|
|
1841
|
+
}, n2.prototype.darken = function(t2, r2) {
|
|
1842
|
+
return void 0 === t2 && (t2 = 5), this.lighten(-t2, r2);
|
|
1843
|
+
}, n2.prototype.saturate = function(t2, r2) {
|
|
1844
|
+
void 0 === t2 && (t2 = 5);
|
|
1845
|
+
var e2 = this.hsl(false), i2 = e2[0], a2 = e2[1], u3 = e2[2];
|
|
1846
|
+
return a2 = o(a2 += void 0 !== r2 && "relative" === r2 ? a2 * (t2 / 100) : t2, 0, 100), new n2(s(i2, a2, u3), this._alpha);
|
|
1847
|
+
}, n2.prototype.desaturate = function(t2, r2) {
|
|
1848
|
+
return void 0 === t2 && (t2 = 5), this.saturate(-t2, r2);
|
|
1849
|
+
}, n2.prototype.spin = function(t2) {
|
|
1850
|
+
var r2 = this.hsl(false), e2 = r2[0], o2 = r2[1], i2 = r2[2];
|
|
1851
|
+
return new n2(s(e2 = (e2 + t2 % 360 + 360) % 360, o2, i2), this._alpha);
|
|
1852
|
+
}, n2.prototype.adjustHue = function(t2) {
|
|
1853
|
+
return this.spin(t2);
|
|
1854
|
+
}, n2.prototype.complement = function() {
|
|
1855
|
+
return this.spin(180);
|
|
1856
|
+
}, n2.prototype.invert = function() {
|
|
1857
|
+
var t2 = this._rgb.map((function(t3) {
|
|
1858
|
+
return 255 - t3;
|
|
1859
|
+
}));
|
|
1860
|
+
return new n2([t2[0], t2[1], t2[2]], this._alpha);
|
|
1861
|
+
}, n2.prototype.mix = function(t2, r2) {
|
|
1862
|
+
return void 0 === r2 && (r2 = 50), D(this, t2, 100 - o(r2, 0, 100));
|
|
1863
|
+
}, n2.prototype.luma = function() {
|
|
1864
|
+
var t2 = this._rgb.map((function(t3) {
|
|
1865
|
+
return (t3 /= 255) <= 0.03928 ? t3 / 12.92 : Math.pow((t3 + 0.055) / 1.055, 2.4);
|
|
1866
|
+
}));
|
|
1867
|
+
return 0.2126 * t2[0] + 0.7152 * t2[1] + 0.0722 * t2[2];
|
|
1868
|
+
}, n2.prototype.brightness = function() {
|
|
1869
|
+
var t2 = this._rgb;
|
|
1870
|
+
return (function(t3, r2, n3) {
|
|
1871
|
+
return (299 * t3 + 587 * r2 + 114 * n3) / 1e3 / 255 * 100;
|
|
1872
|
+
})(t2[0], t2[1], t2[2]);
|
|
1873
|
+
}, n2.prototype.deltaE = function(t2, r2, n3) {
|
|
1874
|
+
return void 0 === r2 && (r2 = "CMC"), et(this, t2, r2, n3);
|
|
1875
|
+
}, n2.prototype.visibility = function(t2, r2) {
|
|
1876
|
+
return ot(this, t2, r2);
|
|
1877
|
+
}, t([q(0, 1, true, 0), R("color:rgb")], n2.prototype, "rgb", null), t([q(0, 1, true, 0)], n2.prototype, "rgba", null), t([q(0, 1, true, 0), R("color:cmyk")], n2.prototype, "cmyk", null), t([q(0, 1, true, 0), R("color:hsl")], n2.prototype, "hsl", null), t([q(0, 1, true, 0)], n2.prototype, "hsla", null), t([q(0, 1, true, 0), R("color:hsv")], n2.prototype, "hsv", null), t([q(0, 1, true, 0), R("color:hsi")], n2.prototype, "hsi", null), t([q(0, 1, true, 0), R("color: hwb")], n2.prototype, "hwb", null), t([q(2, 1, true, 0), R("color:xyz")], n2.prototype, "xyz", null), t([q(2, 1, true, 0), R("color:lab")], n2.prototype, "lab", null), t([q(2, 1, true, 0), R("color:lch")], n2.prototype, "lch", null), t([q(2, 1, true, 0), R("color:xyY")], n2.prototype, "xyY", null), t([R("color:luma")], n2.prototype, "luma", null), n2;
|
|
1878
|
+
})();
|
|
1879
|
+
var st = function(t2, r2, n2, e2) {
|
|
1880
|
+
return new ft([t2, r2, n2], e2);
|
|
1881
|
+
};
|
|
1882
|
+
var vt2 = function(t2, r2, n2, e2) {
|
|
1883
|
+
return new ft(s(t2, r2, n2), e2);
|
|
1884
|
+
};
|
|
1885
|
+
var bt = function(t2, r2, n2, e2) {
|
|
1886
|
+
return new ft(b(t2, r2, n2), e2);
|
|
1887
|
+
};
|
|
1888
|
+
var yt = function(t2, r2, n2, e2) {
|
|
1889
|
+
return new ft(d(t2, r2, n2), e2);
|
|
1890
|
+
};
|
|
1891
|
+
var dt = function(t2, r2, n2, e2) {
|
|
1892
|
+
return new ft(w(t2, r2, n2), e2);
|
|
1893
|
+
};
|
|
1894
|
+
var gt = function(t2, r2, n2, e2) {
|
|
1895
|
+
return new ft(N(t2, r2, n2), e2);
|
|
1896
|
+
};
|
|
1897
|
+
var wt = function(t2, r2, n2, e2) {
|
|
1898
|
+
return new ft(j(t2, r2, n2), e2);
|
|
1899
|
+
};
|
|
1900
|
+
var mt = function(t2, r2, n2, e2) {
|
|
1901
|
+
return new ft(N.apply(void 0, L(t2, r2, n2)), e2);
|
|
1902
|
+
};
|
|
1903
|
+
function Mt(t2, r2, n2) {
|
|
1904
|
+
return new ft(t2, r2, n2);
|
|
1905
|
+
}
|
|
1906
|
+
Mt.config = function(t2) {
|
|
1907
|
+
Object.assign(pt, t2);
|
|
1908
|
+
}, Mt.random = function() {
|
|
1909
|
+
var t2 = a(0, 255), r2 = a(0, 255), n2 = a(0, 255);
|
|
1910
|
+
return new ft([t2, r2, n2]);
|
|
1911
|
+
}, Mt.convertor = Y, Mt.Color = ft, Mt.rgb = st, Mt.hsl = vt2, Mt.hsv = bt, Mt.hsi = yt, Mt.hwb = dt, Mt.xyz = gt, Mt.lab = wt, Mt.lch = mt, Mt.mix = D, Mt.deltaE = et, Mt.utils = { roundDecimal: i, randomRange: a }, Mt.useNames = function(t2, r2) {
|
|
1912
|
+
return (function(t3, r3) {
|
|
1913
|
+
if (void 0 !== r3 && "function" == typeof r3) {
|
|
1914
|
+
var n2 = {};
|
|
1915
|
+
for (var e2 in t3) {
|
|
1916
|
+
var o2 = r3(e2, t3[e2]), i2 = o2[0], a2 = o2[1];
|
|
1917
|
+
n2[i2] = a2;
|
|
1918
|
+
}
|
|
1919
|
+
Object.assign(at, n2);
|
|
1920
|
+
} else Object.assign(at, t3);
|
|
1921
|
+
})(t2, r2), Mt;
|
|
1922
|
+
};
|
|
1923
|
+
|
|
1924
|
+
// src/palette.ts
|
|
1925
|
+
var MIN_DELTA_E = 10;
|
|
1926
|
+
function pickDistinctColorFromSeed(seedHex, existing, minDistance = MIN_DELTA_E) {
|
|
1927
|
+
const existingCs = [...existing].map((c2) => Mt(c2));
|
|
1928
|
+
const seed = Mt(seedHex);
|
|
1929
|
+
const minDeltaE = (c2) => existingCs.length === 0 ? Number.POSITIVE_INFINITY : Math.min(...existingCs.map((c22) => c2.deltaE(c22, "CIE2000")));
|
|
1930
|
+
if (minDeltaE(seed) >= minDistance) {
|
|
1931
|
+
const hex = seed.hex();
|
|
1932
|
+
return { hex, registerHex: hex };
|
|
1933
|
+
}
|
|
1934
|
+
let bestCandidate = seed;
|
|
1935
|
+
let bestMinDist = minDeltaE(seed);
|
|
1936
|
+
const tryVariant = (c2) => {
|
|
1937
|
+
const d2 = minDeltaE(c2);
|
|
1938
|
+
if (d2 >= minDistance) {
|
|
1939
|
+
const hex = c2.hex();
|
|
1940
|
+
return { hex, registerHex: hex };
|
|
1941
|
+
}
|
|
1942
|
+
if (d2 > bestMinDist) {
|
|
1943
|
+
bestMinDist = d2;
|
|
1944
|
+
bestCandidate = c2;
|
|
1945
|
+
}
|
|
1946
|
+
return null;
|
|
1947
|
+
};
|
|
1948
|
+
for (const dSat of [25, -25, 50, -50, 75]) {
|
|
1949
|
+
const hit = tryVariant(dSat >= 0 ? seed.saturate(dSat) : seed.desaturate(-dSat));
|
|
1950
|
+
if (hit) return hit;
|
|
1951
|
+
}
|
|
1952
|
+
for (const dLight of [15, -15, 30, -30, 45]) {
|
|
1953
|
+
const hit = tryVariant(dLight >= 0 ? seed.lighten(dLight) : seed.darken(-dLight));
|
|
1954
|
+
if (hit) return hit;
|
|
1955
|
+
}
|
|
1956
|
+
for (const dHue of [30, -30, 60, -60, 90, -90, 120, -120]) {
|
|
1957
|
+
const hit = tryVariant(seed.spin(dHue));
|
|
1958
|
+
if (hit) return hit;
|
|
1959
|
+
}
|
|
1960
|
+
return { hex: seed.hex(), registerHex: bestCandidate.hex() };
|
|
1961
|
+
}
|
|
1962
|
+
function buildPaletteFromSeed(seedHex, count, minDistance = MIN_DELTA_E) {
|
|
1963
|
+
const out = [];
|
|
1964
|
+
if (!seedHex || !(count > 0)) return out;
|
|
1965
|
+
const issued = /* @__PURE__ */ new Set();
|
|
1966
|
+
const issuedCs = [];
|
|
1967
|
+
const distance = (hex) => issuedCs.length === 0 ? Number.POSITIVE_INFINITY : Math.min(...issuedCs.map((c2) => Mt(hex).deltaE(c2, "CIE2000")));
|
|
1968
|
+
let sweep = null;
|
|
1969
|
+
let sweepAt = 0;
|
|
1970
|
+
for (let i2 = 0; i2 < count; i2++) {
|
|
1971
|
+
const { hex, registerHex } = pickDistinctColorFromSeed(seedHex, issued, minDistance);
|
|
1972
|
+
let chosen = hex;
|
|
1973
|
+
let register = registerHex;
|
|
1974
|
+
if (distance(chosen) < minDistance) {
|
|
1975
|
+
if (!sweep) sweep = sweepCandidates(seedHex);
|
|
1976
|
+
let best = chosen;
|
|
1977
|
+
let bestD = distance(chosen);
|
|
1978
|
+
while (sweepAt < sweep.length) {
|
|
1979
|
+
const cand = sweep[sweepAt++];
|
|
1980
|
+
const d2 = distance(cand);
|
|
1981
|
+
if (d2 >= minDistance) {
|
|
1982
|
+
best = cand;
|
|
1983
|
+
bestD = d2;
|
|
1984
|
+
break;
|
|
1985
|
+
}
|
|
1986
|
+
if (d2 > bestD) {
|
|
1987
|
+
best = cand;
|
|
1988
|
+
bestD = d2;
|
|
1989
|
+
}
|
|
1990
|
+
}
|
|
1991
|
+
chosen = best;
|
|
1992
|
+
register = best;
|
|
1993
|
+
}
|
|
1994
|
+
issued.add(register);
|
|
1995
|
+
issuedCs.push(Mt(register));
|
|
1996
|
+
out.push(chosen);
|
|
1997
|
+
}
|
|
1998
|
+
return out;
|
|
1999
|
+
}
|
|
2000
|
+
function sweepCandidates(seedHex) {
|
|
2001
|
+
const [h2, s2, l2] = Mt(seedHex).hsl();
|
|
2002
|
+
const baseHue = Number.isFinite(h2) ? h2 : 210;
|
|
2003
|
+
const baseSat = s2 < 25 ? 62 : Math.min(90, s2);
|
|
2004
|
+
const baseLight = l2 < 25 || l2 > 78 ? 52 : l2;
|
|
2005
|
+
const out = [];
|
|
2006
|
+
for (const dl of [0, -16, 16, -30, 30]) {
|
|
2007
|
+
const li = Math.min(78, Math.max(26, baseLight + dl));
|
|
2008
|
+
for (let k2 = 1; k2 <= 12; k2++) {
|
|
2009
|
+
out.push(Mt.hsl((baseHue + k2 * 30) % 360, baseSat, li).hex());
|
|
2010
|
+
}
|
|
2011
|
+
}
|
|
2012
|
+
return out;
|
|
2013
|
+
}
|
|
2014
|
+
|
|
1038
2015
|
// src/index.ts
|
|
1039
2016
|
function registerCityTable(packed) {
|
|
1040
2017
|
L3(packed);
|
|
@@ -1088,6 +2065,7 @@ export {
|
|
|
1088
2065
|
MARK_SELECTED_CLASS,
|
|
1089
2066
|
MAX_FRAME_GROW_FACTOR,
|
|
1090
2067
|
MIN_CONTRAST,
|
|
2068
|
+
MIN_DELTA_E,
|
|
1091
2069
|
MIN_HIT_BAND_PX,
|
|
1092
2070
|
PAGE_MATCH_TOLERANCE,
|
|
1093
2071
|
PHANTOM_FRACTION,
|
|
@@ -1109,6 +2087,7 @@ export {
|
|
|
1109
2087
|
backingHoldsGlyph,
|
|
1110
2088
|
bareBase64,
|
|
1111
2089
|
blankRenderFlag,
|
|
2090
|
+
buildPaletteFromSeed,
|
|
1112
2091
|
buildRenderPayload,
|
|
1113
2092
|
buildReviewWire,
|
|
1114
2093
|
canConfirmLaunch,
|
|
@@ -1137,6 +2116,8 @@ export {
|
|
|
1137
2116
|
filterQualifyRows,
|
|
1138
2117
|
fitReadingFor,
|
|
1139
2118
|
fitRenderedChart,
|
|
2119
|
+
formatSourceDate,
|
|
2120
|
+
formatSourceDateFor,
|
|
1140
2121
|
geoAssetFor,
|
|
1141
2122
|
geoFromCache,
|
|
1142
2123
|
glyphSampleGrid,
|
|
@@ -1161,6 +2142,7 @@ export {
|
|
|
1161
2142
|
normalizeFilterTerm,
|
|
1162
2143
|
orderRefusalsForDisplay,
|
|
1163
2144
|
periodTickSuppressesFeedback,
|
|
2145
|
+
pickDistinctColorFromSeed,
|
|
1164
2146
|
pillBacksGlyph,
|
|
1165
2147
|
pinScrolledAxis,
|
|
1166
2148
|
planAxisPin,
|