@bicharts/chart-host 0.5.87 → 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/index.mjs CHANGED
@@ -120,33 +120,33 @@ import "./chunk-GHODWOAL.mjs";
120
120
  var META_COLUMNS = /* @__PURE__ */ new Set(["__rowIdx__", "__geoIso__", "__geoLat__", "__geoLon__", "__geoPrecision__"]);
121
121
  var MAX_FREQUENCY_CATEGORIES = 30;
122
122
  var MIN_HISTOGRAM_ROWS = 8;
123
- function columnName(c) {
124
- return typeof c === "string" ? c : String(c?.name ?? "");
123
+ function columnName(c2) {
124
+ return typeof c2 === "string" ? c2 : String(c2?.name ?? "");
125
125
  }
126
126
  function isNumericColumn(rows, idx) {
127
127
  let seen = 0;
128
- for (let r = 0; r < rows.length && seen < 50; r++) {
129
- const v = rows[r]?.[idx];
130
- if (v === null || v === void 0 || v === "") continue;
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;
131
131
  seen++;
132
- if (typeof v === "number") {
133
- if (!isFinite(v)) return false;
132
+ if (typeof v2 === "number") {
133
+ if (!isFinite(v2)) return false;
134
134
  continue;
135
135
  }
136
- if (String(v).trim() === "" || !isFinite(Number(v))) return false;
136
+ if (String(v2).trim() === "" || !isFinite(Number(v2))) return false;
137
137
  }
138
138
  return seen > 0;
139
139
  }
140
- function lit(s) {
141
- return JSON.stringify(String(s));
140
+ function lit(s2) {
141
+ return JSON.stringify(String(s2));
142
142
  }
143
143
  function planTrivialChart(data) {
144
144
  const allCols = Array.isArray(data?.columns) ? data.columns : [];
145
145
  const rows = Array.isArray(data?.rows) ? data.rows : [];
146
146
  if (!allCols.length || !rows.length) return null;
147
147
  const dataCols = [];
148
- for (let i = 0; i < allCols.length; i++) {
149
- if (!META_COLUMNS.has(columnName(allCols[i]))) dataCols.push(i);
148
+ for (let i2 = 0; i2 < allCols.length; i2++) {
149
+ if (!META_COLUMNS.has(columnName(allCols[i2]))) dataCols.push(i2);
150
150
  }
151
151
  if (dataCols.length !== 1) return null;
152
152
  const idx = dataCols[0];
@@ -174,8 +174,8 @@ function planTrivialChart(data) {
174
174
  );
175
175
  }
176
176
  const distinct = /* @__PURE__ */ new Set();
177
- for (let r = 0; r < rows.length; r++) {
178
- const raw = rows[r]?.[idx];
177
+ for (let r2 = 0; r2 < rows.length; r2++) {
178
+ const raw = rows[r2]?.[idx];
179
179
  distinct.add(raw === null || raw === void 0 || raw === "" ? "(blank)" : String(raw));
180
180
  }
181
181
  if (distinct.size < 2 || distinct.size >= rows.length) return null;
@@ -392,21 +392,21 @@ function histogramSource(idx, name2) {
392
392
  var DEFAULT_TIMEOUT_MS = 2e3;
393
393
  function svgToDataUrl(svg) {
394
394
  const cloned = svg.cloneNode(true);
395
- const w = svg.clientWidth || svg.getBoundingClientRect && svg.getBoundingClientRect().width || 600;
396
- const h = svg.clientHeight || svg.getBoundingClientRect && svg.getBoundingClientRect().height || 400;
397
- cloned.setAttribute("width", String(Math.round(w)));
398
- cloned.setAttribute("height", String(Math.round(h)));
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)));
399
399
  if (!cloned.getAttribute("xmlns")) cloned.setAttribute("xmlns", "http://www.w3.org/2000/svg");
400
400
  const svgStr = new XMLSerializer().serializeToString(cloned);
401
401
  const bytes = new TextEncoder().encode(svgStr);
402
402
  let binary = "";
403
- for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);
403
+ for (let i2 = 0; i2 < bytes.length; i2++) binary += String.fromCharCode(bytes[i2]);
404
404
  return "data:image/svg+xml;base64," + btoa(binary);
405
405
  }
406
406
  function svgNaturalSize(svg) {
407
- const w = svg.clientWidth || svg.getBoundingClientRect && svg.getBoundingClientRect().width || 600;
408
- const h = svg.clientHeight || svg.getBoundingClientRect && svg.getBoundingClientRect().height || 400;
409
- return { width: Math.round(w), height: Math.round(h) };
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) };
410
410
  }
411
411
  function rasterizeSvgToPngDataUrl(svgDataUrl, width, height, opts = {}) {
412
412
  const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
@@ -414,8 +414,8 @@ function rasterizeSvgToPngDataUrl(svgDataUrl, width, height, opts = {}) {
414
414
  let img;
415
415
  try {
416
416
  img = new Image();
417
- } catch (e) {
418
- opts.onWarn?.("snapshot-no-image", e instanceof Error ? e.message : String(e));
417
+ } catch (e2) {
418
+ opts.onWarn?.("snapshot-no-image", e2 instanceof Error ? e2.message : String(e2));
419
419
  resolve(null);
420
420
  return;
421
421
  }
@@ -442,8 +442,8 @@ function rasterizeSvgToPngDataUrl(svgDataUrl, width, height, opts = {}) {
442
442
  c2d.fillRect(0, 0, cw, ch);
443
443
  c2d.drawImage(img, 0, 0, cw, ch);
444
444
  resolve(canvas.toDataURL("image/png"));
445
- } catch (e) {
446
- opts.onWarn?.("snapshot-raster-draw", e instanceof Error ? e.message : String(e));
445
+ } catch (e2) {
446
+ opts.onWarn?.("snapshot-raster-draw", e2 instanceof Error ? e2.message : String(e2));
447
447
  resolve(null);
448
448
  }
449
449
  };
@@ -462,33 +462,33 @@ async function captureSvgSnapshot(root, opts = {}) {
462
462
  let svgUrl;
463
463
  try {
464
464
  svgUrl = svgToDataUrl(svg);
465
- } catch (e) {
466
- opts.onWarn?.("snapshot-serialize", e instanceof Error ? e.message : String(e));
465
+ } catch (e2) {
466
+ opts.onWarn?.("snapshot-serialize", e2 instanceof Error ? e2.message : String(e2));
467
467
  return null;
468
468
  }
469
469
  const { width, height } = svgNaturalSize(svg);
470
470
  try {
471
471
  const png = await rasterizeSvgToPngDataUrl(svgUrl, width, height, opts);
472
472
  return png || svgUrl;
473
- } catch (e) {
474
- opts.onWarn?.("snapshot-raster-unexpected", e instanceof Error ? e.message : String(e));
473
+ } catch (e2) {
474
+ opts.onWarn?.("snapshot-raster-unexpected", e2 instanceof Error ? e2.message : String(e2));
475
475
  return svgUrl;
476
476
  }
477
477
  }
478
478
 
479
479
  // src/review.ts
480
- function shouldReview(g) {
481
- if (!g.enabled) return false;
482
- if (!g.modeLicensed) return false;
483
- if (!g.firstRenderAfterGenerate) return false;
484
- if (!g.codeVersion || g.codeVersion <= 0) return false;
485
- if (g.inFlight) return false;
486
- if (g.reviewedVersions.has(g.codeVersion)) return false;
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;
487
487
  return true;
488
488
  }
489
489
  function bareBase64(dataUrlOrB64) {
490
- const m = /^data:([^;,]+);base64,(.*)$/s.exec(dataUrlOrB64 || "");
491
- if (m) return { b64: m[2], mediaType: m[1] };
490
+ const m2 = /^data:([^;,]+);base64,(.*)$/s.exec(dataUrlOrB64 || "");
491
+ if (m2) return { b64: m2[2], mediaType: m2[1] };
492
492
  return { b64: dataUrlOrB64 || "", mediaType: "image/png" };
493
493
  }
494
494
  function buildReviewWire(input) {
@@ -504,17 +504,17 @@ function buildReviewWire(input) {
504
504
  correlationId: (input.correlationId ?? "").toString()
505
505
  };
506
506
  }
507
- function actionFor(v) {
508
- if (!v) return { kind: "keep", reason: "no verdict returned", userVisible: false };
509
- if (v.status === "PROPOSED") {
510
- const instr = (v.instruction ?? "").toString().trim();
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();
511
511
  if (instr === "") return { kind: "keep", reason: "reviewer proposed no actionable change", userVisible: false };
512
- return { kind: "propose", instruction: instr, reason: (v.verdictReason ?? "").toString().trim() };
512
+ return { kind: "propose", instruction: instr, reason: (v2.verdictReason ?? "").toString().trim() };
513
513
  }
514
- if (v.status === "OK" && v.fix) return { kind: "apply-fix", fix: v.fix, reason: v.verdictReason ?? "" };
515
- if (v.status === "NOCHANGE") return { kind: "keep", reason: v.verdictReason ?? "the chart renders as asked", userVisible: false };
516
- if (v.status === "REFUSED") return { kind: "keep", reason: v.errorMessage ?? "review not available", userVisible: false };
517
- return { kind: "keep", reason: v.errorMessage ?? v.verdictReason ?? "review failed", userVisible: false };
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 };
518
518
  }
519
519
 
520
520
  // src/reviewDialog.ts
@@ -530,9 +530,9 @@ function askApplyImprovements(container, reason, opts = {}) {
530
530
  try {
531
531
  const minW = opts.minWidth ?? 260;
532
532
  const minH = opts.minHeight ?? 170;
533
- const w = container.clientWidth || container.offsetWidth || 0;
534
- const h = container.clientHeight || container.offsetHeight || 0;
535
- if (w < minW || h < minH) {
533
+ const w2 = container.clientWidth || container.offsetWidth || 0;
534
+ const h2 = container.clientHeight || container.offsetHeight || 0;
535
+ if (w2 < minW || h2 < minH) {
536
536
  resolve(false);
537
537
  return;
538
538
  }
@@ -577,7 +577,7 @@ function askApplyImprovements(container, reason, opts = {}) {
577
577
  yes.textContent = text.accept;
578
578
  yes.style.cssText = "font-weight:600;";
579
579
  let done = false;
580
- const finish = (v) => {
580
+ const finish = (v2) => {
581
581
  if (done) return;
582
582
  done = true;
583
583
  try {
@@ -585,17 +585,17 @@ function askApplyImprovements(container, reason, opts = {}) {
585
585
  } catch {
586
586
  }
587
587
  doc.removeEventListener("keydown", onKey, true);
588
- resolve(v);
588
+ resolve(v2);
589
589
  };
590
- const onKey = (e) => {
591
- if (e.key === "Escape") {
592
- e.stopPropagation();
590
+ const onKey = (e2) => {
591
+ if (e2.key === "Escape") {
592
+ e2.stopPropagation();
593
593
  finish(false);
594
594
  }
595
595
  };
596
596
  no.addEventListener("click", () => finish(false));
597
597
  yes.addEventListener("click", () => finish(true));
598
- ov.addEventListener("click", (e) => e.stopPropagation());
598
+ ov.addEventListener("click", (e2) => e2.stopPropagation());
599
599
  doc.addEventListener("keydown", onKey, true);
600
600
  row.append(no, yes);
601
601
  card.append(head, why, cost, row);
@@ -645,8 +645,8 @@ function refusalIsSelectable(row) {
645
645
  }
646
646
  function orderRefusalsForDisplay(rows) {
647
647
  if (!Array.isArray(rows)) return [];
648
- const named = rows.filter((r) => !!r && typeof r.name === "string" && r.name.trim() !== "");
649
- return [...named.filter(refusalIsSelectable), ...named.filter((r) => !refusalIsSelectable(r))];
648
+ const named = rows.filter((r2) => !!r2 && typeof r2.name === "string" && r2.name.trim() !== "");
649
+ return [...named.filter(refusalIsSelectable), ...named.filter((r2) => !refusalIsSelectable(r2))];
650
650
  }
651
651
  function qualifyRefusalHeadingFor(row, state) {
652
652
  if (refusalIsSelectable(row)) {
@@ -667,8 +667,8 @@ function hasRefusalsToShow(rows) {
667
667
  }
668
668
  var QUALIFY_REFUSAL_UNSPECIFIED = "refused for the fields as bound - no single requirement to name";
669
669
  function qualifyRefusalReason(reason, fallback = QUALIFY_REFUSAL_UNSPECIFIED) {
670
- const s = (reason ?? "").trim();
671
- return s !== "" ? s : fallback;
670
+ const s2 = (reason ?? "").trim();
671
+ return s2 !== "" ? s2 : fallback;
672
672
  }
673
673
 
674
674
  // src/qualifyLaunch.ts
@@ -687,13 +687,13 @@ function chooserFitsViewport(width, height) {
687
687
  if (!isFinite(width) || !isFinite(height)) return false;
688
688
  return width >= CHOOSER_MIN_WIDTH_PX && height >= CHOOSER_MIN_HEIGHT_PX;
689
689
  }
690
- function shouldOpenChooserOnGenerate(i) {
691
- if (!i.enabled) return false;
692
- if (!i.hasData) return false;
693
- return chooserFitsViewport(i.width, i.height);
690
+ function shouldOpenChooserOnGenerate(i2) {
691
+ if (!i2.enabled) return false;
692
+ if (!i2.hasData) return false;
693
+ return chooserFitsViewport(i2.width, i2.height);
694
694
  }
695
- function shouldOpenInlineChooserOnGenerate(i) {
696
- return i.enabled === true && i.hasData === true;
695
+ function shouldOpenInlineChooserOnGenerate(i2) {
696
+ return i2.enabled === true && i2.hasData === true;
697
697
  }
698
698
  function canConfirmLaunch(selected) {
699
699
  return typeof selected === "string" && selected.trim() !== "";
@@ -711,10 +711,10 @@ function normalizeFilterTerm(raw) {
711
711
  return raw.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/\s+/g, " ").trim();
712
712
  }
713
713
  var FILTER_MIN_TERM_CHARS = 2;
714
- function startsAWord(name2, t) {
715
- for (let i = name2.indexOf(t); i >= 0; i = name2.indexOf(t, i + 1)) {
716
- if (i === 0) return true;
717
- const prev = name2.charCodeAt(i - 1);
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);
718
718
  const alnum = prev >= 97 && prev <= 122 || prev >= 48 && prev <= 57;
719
719
  if (!alnum) return true;
720
720
  }
@@ -722,31 +722,31 @@ function startsAWord(name2, t) {
722
722
  }
723
723
  function filterQualifyRows(rows, term, read) {
724
724
  const all = Array.isArray(rows) ? rows.slice() : [];
725
- const t = normalizeFilterTerm(term);
726
- if (t.length < FILTER_MIN_TERM_CHARS) return { rows: all, tier: "all", term: "" };
725
+ const t2 = normalizeFilterTerm(term);
726
+ if (t2.length < FILTER_MIN_TERM_CHARS) return { rows: all, tier: "all", term: "" };
727
727
  const atWordStart = [];
728
728
  const midWord = [];
729
729
  const byDesc = [];
730
730
  for (const row of all) {
731
- const f = read(row);
732
- const name2 = normalizeFilterTerm(f.name);
731
+ const f2 = read(row);
732
+ const name2 = normalizeFilterTerm(f2.name);
733
733
  if (name2 === "") continue;
734
- if (name2.indexOf(t) >= 0) {
735
- (startsAWord(name2, t) ? atWordStart : midWord).push(row);
734
+ if (name2.indexOf(t2) >= 0) {
735
+ (startsAWord(name2, t2) ? atWordStart : midWord).push(row);
736
736
  continue;
737
737
  }
738
- if (normalizeFilterTerm(f.description).indexOf(t) >= 0) byDesc.push(row);
738
+ if (normalizeFilterTerm(f2.description).indexOf(t2) >= 0) byDesc.push(row);
739
739
  }
740
- if (atWordStart.length > 0) return { rows: atWordStart, tier: "name", term: t };
741
- if (midWord.length > 0) return { rows: midWord, tier: "namePart", term: t };
742
- if (byDesc.length > 0) return { rows: byDesc, tier: "desc", term: t };
743
- return { rows: [], tier: "none", term: t };
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 };
744
744
  }
745
- function readQualifyChartRow(r) {
746
- return { name: r.name, description: r.description };
745
+ function readQualifyChartRow(r2) {
746
+ return { name: r2.name, description: r2.description };
747
747
  }
748
- function readQualifyRefusalRow(r) {
749
- return { name: r.name, description: r.reason };
748
+ function readQualifyRefusalRow(r2) {
749
+ return { name: r2.name, description: r2.reason };
750
750
  }
751
751
  var FILTER_ROW_PX = 32;
752
752
  var FILTER_MIN_WIDTH_PX = 420;
@@ -758,34 +758,34 @@ function listNeedsFilter(scrollHeight, clientHeight) {
758
758
  if (!Number.isFinite(scrollHeight) || !Number.isFinite(clientHeight)) return false;
759
759
  return scrollHeight > clientHeight - FILTER_ROW_PX;
760
760
  }
761
- function qualifyFilterGate(i) {
762
- if (!filterFitsChooser(i.cardWidth, i.cardHeight)) return { show: false, why: "too-small" };
763
- if (!listNeedsFilter(i.scrollHeight, i.clientHeight)) return { show: false, why: "no-overflow" };
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" };
764
764
  return { show: true, why: "shown" };
765
765
  }
766
766
  function computeQualifyFilterView(groups, term) {
767
- const g = Array.isArray(groups) ? groups : [];
768
- const read = (r) => ({ name: r.name, description: r.description });
767
+ const g2 = Array.isArray(groups) ? groups : [];
768
+ const read = (r2) => ({ name: r2.name, description: r2.description });
769
769
  const collect = (section) => {
770
770
  const out = [];
771
- for (const grp of g) if (grp.section === section) for (const r of grp.rows) out.push(r);
771
+ for (const grp of g2) if (grp.section === section) for (const r2 of grp.rows) out.push(r2);
772
772
  return out;
773
773
  };
774
774
  const fitRows = collect("fits");
775
775
  const fit = filterQualifyRows(fitRows, term, read);
776
776
  const ref = filterQualifyRows(collect("refused"), term, read);
777
777
  const visible = /* @__PURE__ */ new Set();
778
- for (const r of fit.rows) visible.add(r.el);
779
- for (const r of ref.rows) visible.add(r.el);
778
+ for (const r2 of fit.rows) visible.add(r2.el);
779
+ for (const r2 of ref.rows) visible.add(r2.el);
780
780
  const show = [], hide = [], showHeadings = [], hideHeadings = [];
781
- for (const grp of g) {
781
+ for (const grp of g2) {
782
782
  let any = false;
783
- for (const r of grp.rows) {
784
- if (visible.has(r.el)) {
785
- show.push(r.el);
783
+ for (const r2 of grp.rows) {
784
+ if (visible.has(r2.el)) {
785
+ show.push(r2.el);
786
786
  any = true;
787
787
  } else {
788
- hide.push(r.el);
788
+ hide.push(r2.el);
789
789
  }
790
790
  }
791
791
  if (grp.heading !== null) (any ? showHeadings : hideHeadings).push(grp.heading);
@@ -824,17 +824,17 @@ var INLINE_FILTER_MIN_ROWS = 8;
824
824
 
825
825
  // src/sourceDateFormat.ts
826
826
  function formatSourceDate(raw, opts = {}) {
827
- const d = toDate(raw);
828
- if (!d) return null;
829
- const dayFrame = u(d);
827
+ const d2 = toDate(raw);
828
+ if (!d2) return null;
829
+ const dayFrame = u(d2);
830
830
  const frame = dayFrame ?? (opts.dialect === "dotnet" ? "local" : "utc");
831
- const p3 = partsIn(d, frame);
831
+ const p4 = partsIn(d2, frame);
832
832
  const format = cleanFormat(opts.format, opts.dialect);
833
833
  if (format && opts.dialect) {
834
- const rendered = renderFormat(format, p3, opts.dialect, opts.culture);
834
+ const rendered = renderFormat(format, p4, opts.dialect, opts.culture);
835
835
  if (rendered) return rendered;
836
836
  }
837
- return localeDate(p3, !!dayFrame, opts.culture);
837
+ return localeDate(p4, !!dayFrame, opts.culture);
838
838
  }
839
839
  function formatSourceDateFor(raw, columnName2, formats, culture) {
840
840
  return formatSourceDate(raw, {
@@ -847,41 +847,41 @@ var ISO_LIKE_RE = /^\s*\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(
847
847
  function toDate(raw) {
848
848
  if (raw instanceof Date) return isNaN(raw.getTime()) ? null : raw;
849
849
  if (typeof raw !== "string" || !ISO_LIKE_RE.test(raw)) return null;
850
- const d = p(raw.trim());
851
- return d && !isNaN(d.getTime()) ? d : null;
850
+ const d2 = p(raw.trim());
851
+ return d2 && !isNaN(d2.getTime()) ? d2 : null;
852
852
  }
853
- function partsIn(d, frame) {
853
+ function partsIn(d2, frame) {
854
854
  return frame === "utc" ? {
855
- year: d.getUTCFullYear(),
856
- month: d.getUTCMonth() + 1,
857
- day: d.getUTCDate(),
858
- hours: d.getUTCHours(),
859
- minutes: d.getUTCMinutes(),
860
- seconds: d.getUTCSeconds(),
861
- ms: d.getUTCMilliseconds(),
862
- weekday: d.getUTCDay()
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
863
  } : {
864
- year: d.getFullYear(),
865
- month: d.getMonth() + 1,
866
- day: d.getDate(),
867
- hours: d.getHours(),
868
- minutes: d.getMinutes(),
869
- seconds: d.getSeconds(),
870
- ms: d.getMilliseconds(),
871
- weekday: d.getDay()
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
872
  };
873
873
  }
874
- function utcAnchor(p3) {
875
- const d = new Date(Date.UTC(p3.year, p3.month - 1, p3.day, p3.hours, p3.minutes, p3.seconds, p3.ms));
876
- if (p3.year >= 0 && p3.year < 100) d.setUTCFullYear(p3.year);
877
- return d;
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
878
  }
879
- function localeDate(p3, wholeDay, culture) {
880
- const anchor = utcAnchor(p3);
879
+ function localeDate(p4, wholeDay, culture) {
880
+ const anchor = utcAnchor(p4);
881
881
  try {
882
- const o = { dateStyle: "medium", timeZone: "UTC" };
883
- if (!wholeDay) o.timeStyle = p3.seconds || p3.ms ? "medium" : "short";
884
- return new Intl.DateTimeFormat(culture || void 0, o).format(anchor);
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
885
  } catch {
886
886
  const iso = anchor.toISOString();
887
887
  return wholeDay ? iso.slice(0, 10) : `${iso.slice(0, 10)} ${iso.slice(11, 19)}`;
@@ -889,18 +889,18 @@ function localeDate(p3, wholeDay, culture) {
889
889
  }
890
890
  function cleanFormat(raw, dialect) {
891
891
  if (!raw || !dialect) return null;
892
- let s = firstSection(String(raw), dialect);
892
+ let s2 = firstSection(String(raw), dialect);
893
893
  if (dialect === "excel") {
894
- s = s.replace(/\[(h{1,2}|m{1,2}|s{1,2})\]/gi, "$1").replace(/\[[^\]]*\]/g, "");
894
+ s2 = s2.replace(/\[(h{1,2}|m{1,2}|s{1,2})\]/gi, "$1").replace(/\[[^\]]*\]/g, "");
895
895
  }
896
- if (!s.trim() || /^general$/i.test(s.trim())) return null;
897
- return hasDateToken(s, dialect) ? s : null;
896
+ if (!s2.trim() || /^general$/i.test(s2.trim())) return null;
897
+ return hasDateToken(s2, dialect) ? s2 : null;
898
898
  }
899
- function firstSection(s, dialect) {
899
+ function firstSection(s2, dialect) {
900
900
  let out = "";
901
901
  let quote = "";
902
- for (let i = 0; i < s.length; i++) {
903
- const ch = s[i];
902
+ for (let i2 = 0; i2 < s2.length; i2++) {
903
+ const ch = s2[i2];
904
904
  if (quote) {
905
905
  out += ch;
906
906
  if (ch === quote) quote = "";
@@ -912,8 +912,8 @@ function firstSection(s, dialect) {
912
912
  continue;
913
913
  }
914
914
  if (ch === "\\") {
915
- out += ch + (s[i + 1] ?? "");
916
- i++;
915
+ out += ch + (s2[i2 + 1] ?? "");
916
+ i2++;
917
917
  continue;
918
918
  }
919
919
  if (ch === ";") break;
@@ -921,21 +921,21 @@ function firstSection(s, dialect) {
921
921
  }
922
922
  return out;
923
923
  }
924
- function hasDateToken(s, dialect) {
925
- const stripped = stripLiterals(s, dialect);
924
+ function hasDateToken(s2, dialect) {
925
+ const stripped = stripLiterals(s2, dialect);
926
926
  return dialect === "excel" ? /[ymdhs]/i.test(stripped) : /[yMdHhmsft]/.test(stripped);
927
927
  }
928
- function stripLiterals(s, dialect) {
928
+ function stripLiterals(s2, dialect) {
929
929
  let out = "";
930
- for (let i = 0; i < s.length; i++) {
931
- const ch = s[i];
930
+ for (let i2 = 0; i2 < s2.length; i2++) {
931
+ const ch = s2[i2];
932
932
  if (ch === "\\" || dialect === "dotnet" && ch === "%") {
933
- i++;
933
+ i2++;
934
934
  continue;
935
935
  }
936
936
  if (ch === '"' || dialect === "dotnet" && ch === "'") {
937
- const end = s.indexOf(ch, i + 1);
938
- i = end < 0 ? s.length : end;
937
+ const end = s2.indexOf(ch, i2 + 1);
938
+ i2 = end < 0 ? s2.length : end;
939
939
  continue;
940
940
  }
941
941
  out += ch;
@@ -984,62 +984,62 @@ var DOTNET_TOKENS = [
984
984
  [/^tt/, "meridiemLong"],
985
985
  [/^t/, "meridiemShort"]
986
986
  ];
987
- function tokenize(s, dialect) {
987
+ function tokenize(s2, dialect) {
988
988
  const table = dialect === "excel" ? EXCEL_TOKENS : DOTNET_TOKENS;
989
989
  const out = [];
990
- let i = 0;
991
- while (i < s.length) {
992
- const ch = s[i];
990
+ let i2 = 0;
991
+ while (i2 < s2.length) {
992
+ const ch = s2[i2];
993
993
  if (ch === "\\" || dialect === "dotnet" && ch === "%") {
994
- if (i + 1 < s.length) out.push({ kind: "literal", text: s[i + 1] });
995
- i += 2;
994
+ if (i2 + 1 < s2.length) out.push({ kind: "literal", text: s2[i2 + 1] });
995
+ i2 += 2;
996
996
  continue;
997
997
  }
998
998
  if (ch === '"' || dialect === "dotnet" && ch === "'") {
999
- const end = s.indexOf(ch, i + 1);
1000
- out.push({ kind: "literal", text: end < 0 ? s.slice(i + 1) : s.slice(i + 1, end) });
1001
- i = end < 0 ? s.length : end + 1;
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
1002
  continue;
1003
1003
  }
1004
- const rest = s.slice(i);
1004
+ const rest = s2.slice(i2);
1005
1005
  let matched = false;
1006
1006
  for (const [re, kind] of table) {
1007
- const m = re.exec(rest);
1008
- if (m) {
1007
+ const m2 = re.exec(rest);
1008
+ if (m2) {
1009
1009
  out.push({ kind });
1010
- i += m[0].length;
1010
+ i2 += m2[0].length;
1011
1011
  matched = true;
1012
1012
  break;
1013
1013
  }
1014
1014
  }
1015
1015
  if (!matched) {
1016
1016
  out.push({ kind: "literal", text: ch });
1017
- i++;
1017
+ i2++;
1018
1018
  }
1019
1019
  }
1020
1020
  return out;
1021
1021
  }
1022
1022
  function resolveAmbiguousM(tokens) {
1023
- const isHour = (t) => t.kind === "hour1" || t.kind === "hour2";
1024
- const isSecond = (t) => t.kind === "second1" || t.kind === "second2";
1025
- for (let i = 0; i < tokens.length; i++) {
1026
- const t = tokens[i];
1027
- if (t.kind !== "mAmbiguous1" && t.kind !== "mAmbiguous2") continue;
1028
- const two = t.kind === "mAmbiguous2";
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
1029
  let minute = false;
1030
- for (let j = i - 1; j >= 0; j--) {
1031
- if (tokens[j].kind === "literal") continue;
1032
- minute = isHour(tokens[j]);
1030
+ for (let j2 = i2 - 1; j2 >= 0; j2--) {
1031
+ if (tokens[j2].kind === "literal") continue;
1032
+ minute = isHour(tokens[j2]);
1033
1033
  break;
1034
1034
  }
1035
1035
  if (!minute) {
1036
- for (let j = i + 1; j < tokens.length; j++) {
1037
- if (tokens[j].kind === "literal") continue;
1038
- minute = isSecond(tokens[j]);
1036
+ for (let j2 = i2 + 1; j2 < tokens.length; j2++) {
1037
+ if (tokens[j2].kind === "literal") continue;
1038
+ minute = isSecond(tokens[j2]);
1039
1039
  break;
1040
1040
  }
1041
1041
  }
1042
- t.kind = minute ? two ? "minute2" : "minute1" : two ? "month2" : "month1";
1042
+ t2.kind = minute ? two ? "minute2" : "minute1" : two ? "month2" : "month1";
1043
1043
  }
1044
1044
  }
1045
1045
  var EN_MONTHS_LONG = [
@@ -1059,113 +1059,113 @@ var EN_MONTHS_LONG = [
1059
1059
  var EN_MONTHS_SHORT = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
1060
1060
  var EN_DAYS_LONG = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
1061
1061
  var EN_DAYS_SHORT = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
1062
- function name(p3, kind, width, culture) {
1062
+ function name(p4, kind, width, culture) {
1063
1063
  try {
1064
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(p3));
1065
+ return new Intl.DateTimeFormat(culture || void 0, opts).format(utcAnchor(p4));
1066
1066
  } catch {
1067
1067
  if (kind === "month") {
1068
- const long = EN_MONTHS_LONG[p3.month - 1] ?? "";
1068
+ const long = EN_MONTHS_LONG[p4.month - 1] ?? "";
1069
1069
  if (width === "long") return long;
1070
- return width === "narrow" ? long.slice(0, 1) : EN_MONTHS_SHORT[p3.month - 1] ?? "";
1070
+ return width === "narrow" ? long.slice(0, 1) : EN_MONTHS_SHORT[p4.month - 1] ?? "";
1071
1071
  }
1072
- return (width === "long" ? EN_DAYS_LONG[p3.weekday] : EN_DAYS_SHORT[p3.weekday]) ?? "";
1072
+ return (width === "long" ? EN_DAYS_LONG[p4.weekday] : EN_DAYS_SHORT[p4.weekday]) ?? "";
1073
1073
  }
1074
1074
  }
1075
- var p2 = (n) => (n < 10 ? "0" : "") + n;
1076
- function renderFormat(format, p3, dialect, culture) {
1075
+ var p2 = (n2) => (n2 < 10 ? "0" : "") + n2;
1076
+ function renderFormat(format, p4, dialect, culture) {
1077
1077
  const tokens = tokenize(format, dialect);
1078
1078
  if (dialect === "excel") resolveAmbiguousM(tokens);
1079
- const twelve = tokens.some((t) => t.kind === "meridiemLong" || t.kind === "meridiemShort");
1079
+ const twelve = tokens.some((t2) => t2.kind === "meridiemLong" || t2.kind === "meridiemShort");
1080
1080
  const hour12 = () => {
1081
- const h = p3.hours % 12;
1082
- return h === 0 ? 12 : h;
1081
+ const h2 = p4.hours % 12;
1082
+ return h2 === 0 ? 12 : h2;
1083
1083
  };
1084
1084
  let out = "";
1085
1085
  let sawField = false;
1086
- for (const t of tokens) {
1087
- switch (t.kind) {
1086
+ for (const t2 of tokens) {
1087
+ switch (t2.kind) {
1088
1088
  case "literal":
1089
- out += t.text ?? "";
1089
+ out += t2.text ?? "";
1090
1090
  break;
1091
1091
  case "year4":
1092
- out += String(p3.year);
1092
+ out += String(p4.year);
1093
1093
  sawField = true;
1094
1094
  break;
1095
1095
  case "year2":
1096
- out += p2((p3.year % 100 + 100) % 100);
1096
+ out += p2((p4.year % 100 + 100) % 100);
1097
1097
  sawField = true;
1098
1098
  break;
1099
1099
  case "monthLong":
1100
- out += name(p3, "month", "long", culture);
1100
+ out += name(p4, "month", "long", culture);
1101
1101
  sawField = true;
1102
1102
  break;
1103
1103
  case "monthShort":
1104
- out += name(p3, "month", "short", culture);
1104
+ out += name(p4, "month", "short", culture);
1105
1105
  sawField = true;
1106
1106
  break;
1107
1107
  case "monthNarrow":
1108
- out += name(p3, "month", "long", culture).slice(0, 1);
1108
+ out += name(p4, "month", "long", culture).slice(0, 1);
1109
1109
  sawField = true;
1110
1110
  break;
1111
1111
  case "month2":
1112
- out += p2(p3.month);
1112
+ out += p2(p4.month);
1113
1113
  sawField = true;
1114
1114
  break;
1115
1115
  case "month1":
1116
- out += String(p3.month);
1116
+ out += String(p4.month);
1117
1117
  sawField = true;
1118
1118
  break;
1119
1119
  case "weekdayLong":
1120
- out += name(p3, "weekday", "long", culture);
1120
+ out += name(p4, "weekday", "long", culture);
1121
1121
  sawField = true;
1122
1122
  break;
1123
1123
  case "weekdayShort":
1124
- out += name(p3, "weekday", "short", culture);
1124
+ out += name(p4, "weekday", "short", culture);
1125
1125
  sawField = true;
1126
1126
  break;
1127
1127
  case "day2":
1128
- out += p2(p3.day);
1128
+ out += p2(p4.day);
1129
1129
  sawField = true;
1130
1130
  break;
1131
1131
  case "day1":
1132
- out += String(p3.day);
1132
+ out += String(p4.day);
1133
1133
  sawField = true;
1134
1134
  break;
1135
1135
  case "hour2":
1136
- out += p2(twelve ? hour12() : p3.hours);
1136
+ out += p2(twelve ? hour12() : p4.hours);
1137
1137
  sawField = true;
1138
1138
  break;
1139
1139
  case "hour1":
1140
- out += String(twelve ? hour12() : p3.hours);
1140
+ out += String(twelve ? hour12() : p4.hours);
1141
1141
  sawField = true;
1142
1142
  break;
1143
1143
  case "minute2":
1144
- out += p2(p3.minutes);
1144
+ out += p2(p4.minutes);
1145
1145
  sawField = true;
1146
1146
  break;
1147
1147
  case "minute1":
1148
- out += String(p3.minutes);
1148
+ out += String(p4.minutes);
1149
1149
  sawField = true;
1150
1150
  break;
1151
1151
  case "second2":
1152
- out += p2(p3.seconds);
1152
+ out += p2(p4.seconds);
1153
1153
  sawField = true;
1154
1154
  break;
1155
1155
  case "second1":
1156
- out += String(p3.seconds);
1156
+ out += String(p4.seconds);
1157
1157
  sawField = true;
1158
1158
  break;
1159
1159
  case "fraction":
1160
- out += String(p3.ms).padStart(3, "0");
1160
+ out += String(p4.ms).padStart(3, "0");
1161
1161
  sawField = true;
1162
1162
  break;
1163
1163
  case "meridiemLong":
1164
- out += p3.hours < 12 ? "AM" : "PM";
1164
+ out += p4.hours < 12 ? "AM" : "PM";
1165
1165
  sawField = true;
1166
1166
  break;
1167
1167
  case "meridiemShort":
1168
- out += p3.hours < 12 ? "A" : "P";
1168
+ out += p4.hours < 12 ? "A" : "P";
1169
1169
  sawField = true;
1170
1170
  break;
1171
1171
  }
@@ -1177,14 +1177,14 @@ function renderFormat(format, p3, dialect, culture) {
1177
1177
  var SYNTHETIC_PREFIX = "__";
1178
1178
  var NUMERIC_DATATYPE = /int|double|decimal|single|float|number|currency|money/i;
1179
1179
  function normaliseAggregation(raw) {
1180
- const s = String(raw ?? "").trim().toLowerCase();
1181
- if (!s) return "sum";
1182
- if (/^(avg|average|mean)$/.test(s)) return "average";
1183
- if (/^(min|minimum)$/.test(s)) return "min";
1184
- if (/^(max|maximum)$/.test(s)) return "max";
1185
- if (/^(count|countrows)$/.test(s)) return "count";
1186
- if (/^(median|med)$/.test(s)) return "median";
1187
- if (/^(distinctcount|dcount|countdistinct|uniques?)$/.test(s)) return "distinctcount";
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";
1188
1188
  return "sum";
1189
1189
  }
1190
1190
  function aggLabel(agg) {
@@ -1236,59 +1236,59 @@ function isSuppressed(col) {
1236
1236
  }
1237
1237
  function resolveAgg(col, requested, auto) {
1238
1238
  const fallback = () => {
1239
- const d = Me(col);
1240
- return d === "first" ? "count" : d;
1239
+ const d2 = Me(col);
1240
+ return d2 === "first" ? "count" : d2;
1241
1241
  };
1242
1242
  if (auto) return fallback();
1243
1243
  return It(col).indexOf(requested) >= 0 ? requested : fallback();
1244
1244
  }
1245
- function toNumber(v) {
1246
- if (v == null || v === "") return null;
1247
- const n = typeof v === "number" ? v : Number(v);
1248
- return Number.isFinite(n) ? n : null;
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;
1249
1249
  }
1250
1250
  function reduce(values, agg, distinctRaw) {
1251
1251
  if (agg === "count") return values.length;
1252
- if (agg === "distinctcount") return new Set(distinctRaw.map((v) => v == null ? "\0" : String(v))).size;
1252
+ if (agg === "distinctcount") return new Set(distinctRaw.map((v2) => v2 == null ? "\0" : String(v2))).size;
1253
1253
  if (!values.length) return null;
1254
1254
  switch (agg) {
1255
1255
  case "average":
1256
- return values.reduce((a, b) => a + b, 0) / values.length;
1256
+ return values.reduce((a2, b2) => a2 + b2, 0) / values.length;
1257
1257
  case "min":
1258
1258
  return Math.min(...values);
1259
1259
  case "max":
1260
1260
  return Math.max(...values);
1261
1261
  case "median": {
1262
- const s = [...values].sort((a, b) => a - b);
1263
- const m = s.length >> 1;
1264
- return s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2;
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;
1265
1265
  }
1266
1266
  default:
1267
- return values.reduce((a, b) => a + b, 0);
1267
+ return values.reduce((a2, b2) => a2 + b2, 0);
1268
1268
  }
1269
1269
  }
1270
- function fmtNumber(v, culture) {
1270
+ function fmtNumber(v2, culture) {
1271
1271
  try {
1272
- const abs = Math.abs(v);
1272
+ const abs = Math.abs(v2);
1273
1273
  const opts = abs >= 1e6 ? { notation: "compact", maximumFractionDigits: 1 } : { maximumFractionDigits: abs < 10 ? 2 : 0 };
1274
- return new Intl.NumberFormat(culture || void 0, opts).format(v);
1274
+ return new Intl.NumberFormat(culture || void 0, opts).format(v2);
1275
1275
  } catch {
1276
- return String(Math.round(v * 100) / 100);
1276
+ return String(Math.round(v2 * 100) / 100);
1277
1277
  }
1278
1278
  }
1279
1279
  function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
1280
1280
  const columns = payload?.columns ?? [];
1281
1281
  const rows = payload?.rows ?? [];
1282
1282
  if (!columns.length || !rows.length) return null;
1283
- const wanted = Array.from(new Set((selectedRowIdxs ?? []).filter((n) => Number.isInteger(n))));
1283
+ const wanted = Array.from(new Set((selectedRowIdxs ?? []).filter((n2) => Number.isInteger(n2))));
1284
1284
  if (!wanted.length) return null;
1285
- const rowIdxCol = columns.findIndex((c) => c?.name === "__rowIdx__");
1285
+ const rowIdxCol = columns.findIndex((c2) => c2?.name === "__rowIdx__");
1286
1286
  let byIdx = null;
1287
1287
  if (rowIdxCol >= 0) {
1288
1288
  byIdx = /* @__PURE__ */ new Map();
1289
- for (let r = 0; r < rows.length; r++) {
1290
- const v = toNumber(rows[r]?.[rowIdxCol]);
1291
- if (v != null) byIdx.set(v, r);
1289
+ for (let r2 = 0; r2 < rows.length; r2++) {
1290
+ const v2 = toNumber(rows[r2]?.[rowIdxCol]);
1291
+ if (v2 != null) byIdx.set(v2, r2);
1292
1292
  }
1293
1293
  }
1294
1294
  const positions = [];
@@ -1302,16 +1302,16 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
1302
1302
  const maxMeasures = opts.maxMeasures ?? 4;
1303
1303
  const maxHeaderValues = opts.maxHeaderValues ?? 3;
1304
1304
  const maxDimensions = opts.maxDimensions ?? 2;
1305
- const dimIdx = columns.findIndex((c) => c && !isSynthetic(c.name) && !isMeasureColumn(c));
1305
+ const dimIdx = columns.findIndex((c2) => c2 && !isSynthetic(c2.name) && !isMeasureColumn(c2));
1306
1306
  let header;
1307
1307
  if (dimIdx >= 0) {
1308
1308
  const seen = [];
1309
1309
  const set = /* @__PURE__ */ new Set();
1310
- for (const p3 of positions) {
1311
- const s = displayText(columns[dimIdx], rows[p3]?.[dimIdx], opts);
1312
- if (!set.has(s)) {
1313
- set.add(s);
1314
- 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);
1315
1315
  }
1316
1316
  if (seen.length > maxHeaderValues) break;
1317
1317
  }
@@ -1321,35 +1321,35 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
1321
1321
  }
1322
1322
  const measureCols = [];
1323
1323
  const suppressedColumns = [];
1324
- for (let c = 0; c < columns.length; c++) {
1325
- if (!isMeasureColumn(columns[c])) continue;
1326
- if (isSuppressed(columns[c])) {
1327
- suppressedColumns.push(String(columns[c]?.name ?? ""));
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 ?? ""));
1328
1328
  continue;
1329
1329
  }
1330
- measureCols.push(c);
1330
+ measureCols.push(c2);
1331
1331
  }
1332
1332
  const shown = measureCols.slice(0, maxMeasures);
1333
1333
  const lines = [];
1334
- for (const c of shown) {
1335
- const col = columns[c];
1334
+ for (const c2 of shown) {
1335
+ const col = columns[c2];
1336
1336
  const colAgg = resolveAgg(col, agg, auto);
1337
1337
  const selVals = [];
1338
1338
  const selRaw = [];
1339
- for (const p3 of positions) {
1340
- const n = toNumber(rows[p3]?.[c]);
1341
- selRaw.push(rows[p3]?.[c]);
1342
- if (n != null) selVals.push(n);
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);
1343
1343
  }
1344
1344
  const value = reduce(selVals, colAgg, selRaw);
1345
1345
  let sharePct = null;
1346
1346
  if (Te(col, colAgg) && value != null) {
1347
1347
  const allVals = [];
1348
1348
  const allRaw = [];
1349
- for (let r = 0; r < rows.length; r++) {
1350
- const n = toNumber(rows[r]?.[c]);
1351
- allRaw.push(rows[r]?.[c]);
1352
- if (n != null) allVals.push(n);
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);
1353
1353
  }
1354
1354
  const total = reduce(allVals, colAgg, allRaw);
1355
1355
  if (total != null && total > 0) sharePct = value / total * 100;
@@ -1365,16 +1365,16 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
1365
1365
  });
1366
1366
  }
1367
1367
  const dimensionLines = [];
1368
- for (let c = 0; c < columns.length && dimensionLines.length < maxDimensions; c++) {
1369
- if (c === dimIdx) continue;
1370
- if (!isRealColumn(columns[c]) || isMeasureColumn(columns[c])) continue;
1371
- const name2 = String(columns[c]?.name ?? "");
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 ?? "");
1372
1372
  const distinct = /* @__PURE__ */ new Set();
1373
1373
  let firstText = "";
1374
- for (const p3 of positions) {
1375
- const raw = rows[p3]?.[c];
1374
+ for (const p4 of positions) {
1375
+ const raw = rows[p4]?.[c2];
1376
1376
  const key = raw == null || raw === "" ? "(blank)" : String(raw);
1377
- if (!distinct.size) firstText = displayText(columns[c], raw, opts);
1377
+ if (!distinct.size) firstText = displayText(columns[c2], raw, opts);
1378
1378
  distinct.add(key);
1379
1379
  }
1380
1380
  if (!distinct.size) continue;
@@ -1402,6 +1402,616 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
1402
1402
  };
1403
1403
  }
1404
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
+
1405
2015
  // src/index.ts
1406
2016
  function registerCityTable(packed) {
1407
2017
  L3(packed);
@@ -1455,6 +2065,7 @@ export {
1455
2065
  MARK_SELECTED_CLASS,
1456
2066
  MAX_FRAME_GROW_FACTOR,
1457
2067
  MIN_CONTRAST,
2068
+ MIN_DELTA_E,
1458
2069
  MIN_HIT_BAND_PX,
1459
2070
  PAGE_MATCH_TOLERANCE,
1460
2071
  PHANTOM_FRACTION,
@@ -1476,6 +2087,7 @@ export {
1476
2087
  backingHoldsGlyph,
1477
2088
  bareBase64,
1478
2089
  blankRenderFlag,
2090
+ buildPaletteFromSeed,
1479
2091
  buildRenderPayload,
1480
2092
  buildReviewWire,
1481
2093
  canConfirmLaunch,
@@ -1530,6 +2142,7 @@ export {
1530
2142
  normalizeFilterTerm,
1531
2143
  orderRefusalsForDisplay,
1532
2144
  periodTickSuppressesFeedback,
2145
+ pickDistinctColorFromSeed,
1533
2146
  pillBacksGlyph,
1534
2147
  pinScrolledAxis,
1535
2148
  planAxisPin,