@bicharts/chart-host 0.5.99 → 0.5.101

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
@@ -108,7 +108,6 @@ import {
108
108
  measureContainerBoxes,
109
109
  needsScroll,
110
110
  noopViewStateProvider,
111
- p,
112
111
  periodTickSuppressesFeedback,
113
112
  pillBacksGlyph,
114
113
  pinScrolledAxis,
@@ -127,11 +126,34 @@ import {
127
126
  toRGBA,
128
127
  u,
129
128
  unpinScrolledAxis,
130
- valuePlacementFlag
131
- } from "./chunk-B2DWID7P.mjs";
129
+ valuePlacementFlag,
130
+ x
131
+ } from "./chunk-LJU47KQS.mjs";
132
132
  import "./chunk-A2GMXZP7.mjs";
133
133
  import "./chunk-GHODWOAL.mjs";
134
134
 
135
+ // src/dateCells.ts
136
+ var LOCAL_DATE_METHOD = /\.(?:getFullYear|getMonth|getDate|getDay|getHours|getMinutes|setFullYear|setMonth|setDate|setHours|setMinutes|setSeconds|setMilliseconds)\s*\(/;
137
+ var D3_LOCAL_TIME = /\bd3\s*\.\s*(?:scaleTime|time[A-Z]\w*)\b/;
138
+ var DATE_FROM_LOCAL_COMPONENTS = /\bnew\s+Date\s*\(\s*[^(),]+,/;
139
+ var FORMATTER = /\bIntl\s*\.\s*DateTimeFormat\b|\.toLocaleDateString\s*\(|\.toLocaleTimeString\s*\(/;
140
+ function codeReadsDatesInLocalTime(code) {
141
+ if (!code) return false;
142
+ if (LOCAL_DATE_METHOD.test(code) || D3_LOCAL_TIME.test(code) || DATE_FROM_LOCAL_COMPONENTS.test(code)) return true;
143
+ return FORMATTER.test(code) && !/timeZone/.test(code);
144
+ }
145
+ var VEGA_LOCAL_FN = /\b(?:year|quarter|month|date|day|dayofyear|week|hours|minutes|seconds|milliseconds|datetime|time|timeFormat|timeParse|timeOffset|timeSequence|timeUnitSpecifier)\s*\(/;
146
+ var VEGA_LOCAL_TIMEUNIT = /"timeUnit"\s*:\s*"(?!utc)[a-z]/i;
147
+ var VEGA_LOCAL_UNIT = /"unit"\s*:\s*"(?!utc)(?:year|quarter|month|week|day|date|dayofyear|hours|minutes|seconds|milliseconds)/i;
148
+ var VEGA_TIME_SCALE = /"type"\s*:\s*"time"/;
149
+ var VEGA_TEMPORAL = /"type"\s*:\s*"temporal"/;
150
+ var VEGA_UTC_SCALE = /"type"\s*:\s*"utc"/;
151
+ function vegaSpecReadsDatesInLocalTime(spec) {
152
+ if (!spec) return false;
153
+ if (VEGA_LOCAL_FN.test(spec) || VEGA_LOCAL_TIMEUNIT.test(spec) || VEGA_LOCAL_UNIT.test(spec) || VEGA_TIME_SCALE.test(spec)) return true;
154
+ return VEGA_TEMPORAL.test(spec) && !VEGA_UTC_SCALE.test(spec);
155
+ }
156
+
135
157
  // src/trivial.ts
136
158
  var META_COLUMNS = /* @__PURE__ */ new Set(["__rowIdx__", "__geoIso__", "__geoLat__", "__geoLon__", "__geoPrecision__"]);
137
159
  var MAX_FREQUENCY_CATEGORIES = 30;
@@ -844,13 +866,13 @@ function formatSourceDate(raw, opts = {}) {
844
866
  if (!d2) return null;
845
867
  const dayFrame = u(d2);
846
868
  const frame = dayFrame ?? (opts.dialect === "dotnet" ? "local" : "utc");
847
- const p4 = partsIn(d2, frame);
869
+ const p3 = partsIn(d2, frame);
848
870
  const format = cleanFormat(opts.format, opts.dialect);
849
871
  if (format && opts.dialect) {
850
- const rendered = renderFormat(format, p4, opts.dialect, opts.culture);
872
+ const rendered = renderFormat(format, p3, opts.dialect, opts.culture);
851
873
  if (rendered) return rendered;
852
874
  }
853
- return localeDate(p4, !!dayFrame, opts.culture);
875
+ return localeDate(p3, !!dayFrame, opts.culture);
854
876
  }
855
877
  function formatSourceDateFor(raw, columnName2, formats, culture) {
856
878
  return formatSourceDate(raw, {
@@ -863,7 +885,7 @@ var ISO_LIKE_RE = /^\s*\d{4}-\d{2}-\d{2}(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(
863
885
  function toDate(raw) {
864
886
  if (raw instanceof Date) return isNaN(raw.getTime()) ? null : raw;
865
887
  if (typeof raw !== "string" || !ISO_LIKE_RE.test(raw)) return null;
866
- const d2 = p(raw.trim());
888
+ const d2 = x(raw.trim());
867
889
  return d2 && !isNaN(d2.getTime()) ? d2 : null;
868
890
  }
869
891
  function partsIn(d2, frame) {
@@ -887,16 +909,16 @@ function partsIn(d2, frame) {
887
909
  weekday: d2.getDay()
888
910
  };
889
911
  }
890
- function utcAnchor(p4) {
891
- const d2 = new Date(Date.UTC(p4.year, p4.month - 1, p4.day, p4.hours, p4.minutes, p4.seconds, p4.ms));
892
- if (p4.year >= 0 && p4.year < 100) d2.setUTCFullYear(p4.year);
912
+ function utcAnchor(p3) {
913
+ const d2 = new Date(Date.UTC(p3.year, p3.month - 1, p3.day, p3.hours, p3.minutes, p3.seconds, p3.ms));
914
+ if (p3.year >= 0 && p3.year < 100) d2.setUTCFullYear(p3.year);
893
915
  return d2;
894
916
  }
895
- function localeDate(p4, wholeDay, culture) {
896
- const anchor = utcAnchor(p4);
917
+ function localeDate(p3, wholeDay, culture) {
918
+ const anchor = utcAnchor(p3);
897
919
  try {
898
920
  const o2 = { dateStyle: "medium", timeZone: "UTC" };
899
- if (!wholeDay) o2.timeStyle = p4.seconds || p4.ms ? "medium" : "short";
921
+ if (!wholeDay) o2.timeStyle = p3.seconds || p3.ms ? "medium" : "short";
900
922
  return new Intl.DateTimeFormat(culture || void 0, o2).format(anchor);
901
923
  } catch {
902
924
  const iso = anchor.toISOString();
@@ -1075,26 +1097,26 @@ var EN_MONTHS_LONG = [
1075
1097
  var EN_MONTHS_SHORT = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
1076
1098
  var EN_DAYS_LONG = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
1077
1099
  var EN_DAYS_SHORT = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
1078
- function name(p4, kind, width, culture) {
1100
+ function name(p3, kind, width, culture) {
1079
1101
  try {
1080
1102
  const opts = kind === "month" ? { month: width, timeZone: "UTC" } : { weekday: width === "narrow" ? "short" : width, timeZone: "UTC" };
1081
- return new Intl.DateTimeFormat(culture || void 0, opts).format(utcAnchor(p4));
1103
+ return new Intl.DateTimeFormat(culture || void 0, opts).format(utcAnchor(p3));
1082
1104
  } catch {
1083
1105
  if (kind === "month") {
1084
- const long = EN_MONTHS_LONG[p4.month - 1] ?? "";
1106
+ const long = EN_MONTHS_LONG[p3.month - 1] ?? "";
1085
1107
  if (width === "long") return long;
1086
- return width === "narrow" ? long.slice(0, 1) : EN_MONTHS_SHORT[p4.month - 1] ?? "";
1108
+ return width === "narrow" ? long.slice(0, 1) : EN_MONTHS_SHORT[p3.month - 1] ?? "";
1087
1109
  }
1088
- return (width === "long" ? EN_DAYS_LONG[p4.weekday] : EN_DAYS_SHORT[p4.weekday]) ?? "";
1110
+ return (width === "long" ? EN_DAYS_LONG[p3.weekday] : EN_DAYS_SHORT[p3.weekday]) ?? "";
1089
1111
  }
1090
1112
  }
1091
1113
  var p2 = (n2) => (n2 < 10 ? "0" : "") + n2;
1092
- function renderFormat(format, p4, dialect, culture) {
1114
+ function renderFormat(format, p3, dialect, culture) {
1093
1115
  const tokens = tokenize(format, dialect);
1094
1116
  if (dialect === "excel") resolveAmbiguousM(tokens);
1095
1117
  const twelve = tokens.some((t2) => t2.kind === "meridiemLong" || t2.kind === "meridiemShort");
1096
1118
  const hour12 = () => {
1097
- const h2 = p4.hours % 12;
1119
+ const h2 = p3.hours % 12;
1098
1120
  return h2 === 0 ? 12 : h2;
1099
1121
  };
1100
1122
  let out = "";
@@ -1105,83 +1127,83 @@ function renderFormat(format, p4, dialect, culture) {
1105
1127
  out += t2.text ?? "";
1106
1128
  break;
1107
1129
  case "year4":
1108
- out += String(p4.year);
1130
+ out += String(p3.year);
1109
1131
  sawField = true;
1110
1132
  break;
1111
1133
  case "year2":
1112
- out += p2((p4.year % 100 + 100) % 100);
1134
+ out += p2((p3.year % 100 + 100) % 100);
1113
1135
  sawField = true;
1114
1136
  break;
1115
1137
  case "monthLong":
1116
- out += name(p4, "month", "long", culture);
1138
+ out += name(p3, "month", "long", culture);
1117
1139
  sawField = true;
1118
1140
  break;
1119
1141
  case "monthShort":
1120
- out += name(p4, "month", "short", culture);
1142
+ out += name(p3, "month", "short", culture);
1121
1143
  sawField = true;
1122
1144
  break;
1123
1145
  case "monthNarrow":
1124
- out += name(p4, "month", "long", culture).slice(0, 1);
1146
+ out += name(p3, "month", "long", culture).slice(0, 1);
1125
1147
  sawField = true;
1126
1148
  break;
1127
1149
  case "month2":
1128
- out += p2(p4.month);
1150
+ out += p2(p3.month);
1129
1151
  sawField = true;
1130
1152
  break;
1131
1153
  case "month1":
1132
- out += String(p4.month);
1154
+ out += String(p3.month);
1133
1155
  sawField = true;
1134
1156
  break;
1135
1157
  case "weekdayLong":
1136
- out += name(p4, "weekday", "long", culture);
1158
+ out += name(p3, "weekday", "long", culture);
1137
1159
  sawField = true;
1138
1160
  break;
1139
1161
  case "weekdayShort":
1140
- out += name(p4, "weekday", "short", culture);
1162
+ out += name(p3, "weekday", "short", culture);
1141
1163
  sawField = true;
1142
1164
  break;
1143
1165
  case "day2":
1144
- out += p2(p4.day);
1166
+ out += p2(p3.day);
1145
1167
  sawField = true;
1146
1168
  break;
1147
1169
  case "day1":
1148
- out += String(p4.day);
1170
+ out += String(p3.day);
1149
1171
  sawField = true;
1150
1172
  break;
1151
1173
  case "hour2":
1152
- out += p2(twelve ? hour12() : p4.hours);
1174
+ out += p2(twelve ? hour12() : p3.hours);
1153
1175
  sawField = true;
1154
1176
  break;
1155
1177
  case "hour1":
1156
- out += String(twelve ? hour12() : p4.hours);
1178
+ out += String(twelve ? hour12() : p3.hours);
1157
1179
  sawField = true;
1158
1180
  break;
1159
1181
  case "minute2":
1160
- out += p2(p4.minutes);
1182
+ out += p2(p3.minutes);
1161
1183
  sawField = true;
1162
1184
  break;
1163
1185
  case "minute1":
1164
- out += String(p4.minutes);
1186
+ out += String(p3.minutes);
1165
1187
  sawField = true;
1166
1188
  break;
1167
1189
  case "second2":
1168
- out += p2(p4.seconds);
1190
+ out += p2(p3.seconds);
1169
1191
  sawField = true;
1170
1192
  break;
1171
1193
  case "second1":
1172
- out += String(p4.seconds);
1194
+ out += String(p3.seconds);
1173
1195
  sawField = true;
1174
1196
  break;
1175
1197
  case "fraction":
1176
- out += String(p4.ms).padStart(3, "0");
1198
+ out += String(p3.ms).padStart(3, "0");
1177
1199
  sawField = true;
1178
1200
  break;
1179
1201
  case "meridiemLong":
1180
- out += p4.hours < 12 ? "AM" : "PM";
1202
+ out += p3.hours < 12 ? "AM" : "PM";
1181
1203
  sawField = true;
1182
1204
  break;
1183
1205
  case "meridiemShort":
1184
- out += p4.hours < 12 ? "A" : "P";
1206
+ out += p3.hours < 12 ? "A" : "P";
1185
1207
  sawField = true;
1186
1208
  break;
1187
1209
  }
@@ -1323,8 +1345,8 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
1323
1345
  if (dimIdx >= 0) {
1324
1346
  const seen = [];
1325
1347
  const set = /* @__PURE__ */ new Set();
1326
- for (const p4 of positions) {
1327
- const s2 = displayText(columns[dimIdx], rows[p4]?.[dimIdx], opts);
1348
+ for (const p3 of positions) {
1349
+ const s2 = displayText(columns[dimIdx], rows[p3]?.[dimIdx], opts);
1328
1350
  if (!set.has(s2)) {
1329
1351
  set.add(s2);
1330
1352
  seen.push(s2);
@@ -1352,9 +1374,9 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
1352
1374
  const colAgg = resolveAgg(col, agg, auto);
1353
1375
  const selVals = [];
1354
1376
  const selRaw = [];
1355
- for (const p4 of positions) {
1356
- const n2 = toNumber(rows[p4]?.[c2]);
1357
- selRaw.push(rows[p4]?.[c2]);
1377
+ for (const p3 of positions) {
1378
+ const n2 = toNumber(rows[p3]?.[c2]);
1379
+ selRaw.push(rows[p3]?.[c2]);
1358
1380
  if (n2 != null) selVals.push(n2);
1359
1381
  }
1360
1382
  const value = reduce(selVals, colAgg, selRaw);
@@ -1387,8 +1409,8 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
1387
1409
  const name2 = String(columns[c2]?.name ?? "");
1388
1410
  const distinct = /* @__PURE__ */ new Set();
1389
1411
  let firstText = "";
1390
- for (const p4 of positions) {
1391
- const raw = rows[p4]?.[c2];
1412
+ for (const p3 of positions) {
1413
+ const raw = rows[p3]?.[c2];
1392
1414
  const key = raw == null || raw === "" ? "(blank)" : String(raw);
1393
1415
  if (!distinct.size) firstText = displayText(columns[c2], raw, opts);
1394
1416
  distinct.add(key);
@@ -1498,7 +1520,7 @@ var l = function(t2, r2, n2, e2) {
1498
1520
  return (t3 /= 100) >= 1 ? 0 : 255 * (1 - t3) * (1 - e2);
1499
1521
  })));
1500
1522
  };
1501
- function p3(t2, r2, n2, e2) {
1523
+ function p(t2, r2, n2, e2) {
1502
1524
  var o2;
1503
1525
  void 0 === e2 && (e2 = "l"), o2 = [t2, r2, n2].map((function(t3) {
1504
1526
  return t3 / 255;
@@ -1516,11 +1538,11 @@ function p3(t2, r2, n2, e2) {
1516
1538
  }
1517
1539
  else u4 = NaN;
1518
1540
  return 360 * u4;
1519
- })(t2, r2, n2, "i" === e2), h2 = 0, c2 = (i2 + a2) / 2, l2 = i2 - a2, p4 = i2, f2 = (t2 + r2 + n2) / 3;
1520
- 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];
1541
+ })(t2, r2, n2, "i" === e2), h2 = 0, c2 = (i2 + a2) / 2, l2 = i2 - a2, p3 = i2, f2 = (t2 + r2 + n2) / 3;
1542
+ 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, p3 *= 100] : [u3, h2, f2];
1521
1543
  }
1522
1544
  var f = function(t2, r2, n2) {
1523
- return p3(t2, r2, n2, "l");
1545
+ return p(t2, r2, n2, "l");
1524
1546
  };
1525
1547
  var s = function(t2, r2, n2) {
1526
1548
  var e2, i2, a2 = function(t3) {
@@ -1529,14 +1551,14 @@ var s = function(t2, r2, n2) {
1529
1551
  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)];
1530
1552
  };
1531
1553
  var v = function(t2, r2, n2) {
1532
- return p3(t2, r2, n2, "v");
1554
+ return p(t2, r2, n2, "v");
1533
1555
  };
1534
1556
  var b = function(t2, r2, n2) {
1535
1557
  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]];
1536
1558
  return [255 * i2[a2[e2][0]], 255 * i2[a2[e2][1]], 255 * i2[a2[e2][2]]];
1537
1559
  };
1538
1560
  var y = function(t2, r2, n2) {
1539
- return p3(t2, r2, n2, "i");
1561
+ return p(t2, r2, n2, "i");
1540
1562
  };
1541
1563
  var d = function(t2, r2, n2) {
1542
1564
  var e2, i2, a2, u3;
@@ -1558,7 +1580,7 @@ function w(t2, r2, n2) {
1558
1580
  }
1559
1581
  var m = { x: [0.4124564, 0.3575761, 0.1804375], y: [0.2126729, 0.7151522, 0.072175], z: [0.0193339, 0.119192, 0.9503041] };
1560
1582
  var M = { r: [3.2404542, -1.5371385, -0.4985314], g: [-0.969266, 1.8760108, 0.041556], b: [0.0556434, -0.2040259, 1.0572252] };
1561
- var x = 0.95047;
1583
+ var x2 = 0.95047;
1562
1584
  var _ = 1;
1563
1585
  var C = 1.08883;
1564
1586
  var I = 0.206896552;
@@ -1586,7 +1608,7 @@ var N = function(t2, r2, n2) {
1586
1608
  };
1587
1609
  var O = function(t2, r2, n2) {
1588
1610
  var e2;
1589
- return e2 = [t2 = t2 / x / 100, r2 = r2 / _ / 100, n2 = n2 / C / 100].map((function(t3) {
1611
+ return e2 = [t2 = t2 / x2 / 100, r2 = r2 / _ / 100, n2 = n2 / C / 100].map((function(t3) {
1590
1612
  return t3 > k ? Math.pow(t3, 1 / 3) : (E * t3 + 16) / 116;
1591
1613
  })), t2 = e2[0], r2 = e2[1], n2 = e2[2], [Math.max(0, 116 * r2 - 16), 500 * (t2 - r2), 200 * (r2 - n2)];
1592
1614
  };
@@ -1594,7 +1616,7 @@ var P = function(t2, r2, n2) {
1594
1616
  var e2, o2 = (t2 + 16) / 116, i2 = isNaN(r2) ? o2 : o2 + r2 / 500, a2 = isNaN(n2) ? o2 : o2 - n2 / 200;
1595
1617
  return e2 = [i2, o2, a2].map((function(t3) {
1596
1618
  return t3 > I ? Math.pow(t3, 3) : (116 * t3 - 16) / E;
1597
- })), i2 = e2[0], o2 = e2[1], a2 = e2[2], [i2 * x * 100, o2 * _ * 100, a2 * C * 100];
1619
+ })), i2 = e2[0], o2 = e2[1], a2 = e2[2], [i2 * x2 * 100, o2 * _ * 100, a2 * C * 100];
1598
1620
  };
1599
1621
  var j = function(t2, r2, n2) {
1600
1622
  return N.apply(void 0, P(t2, r2, n2));
@@ -1643,8 +1665,8 @@ function q(t2, n2, e2, o2) {
1643
1665
  for (var a3 = [], u4 = 0; u4 < arguments.length; u4++) a3[u4] = arguments[u4];
1644
1666
  var h3 = void 0 === a3[o2] ? e2 : a3[o2], l2 = c2.call.apply(c2, r([this], a3, false));
1645
1667
  if (false === h3) return l2;
1646
- 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) {
1647
- return 1 === n2 ? "number" == typeof h3 ? p4 : t3 : t3 + p4;
1668
+ var p3 = "number" == typeof h3 ? Math.round(h3) : 0, f2 = "number" == typeof t2 ? new Array(l2.length).fill(t2) : t2, s2 = f2.map((function(t3) {
1669
+ return 1 === n2 ? "number" == typeof h3 ? p3 : t3 : t3 + p3;
1648
1670
  }));
1649
1671
  return l2.map((function(t3, r2) {
1650
1672
  return i(t3, s2[r2]);
@@ -1653,8 +1675,8 @@ function q(t2, n2, e2, o2) {
1653
1675
  };
1654
1676
  }
1655
1677
  var D = function(t2, r2, n2) {
1656
- 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);
1657
- return new ft(p4, f2);
1678
+ 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, p3 = [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);
1679
+ return new ft(p3, f2);
1658
1680
  };
1659
1681
  var F = Math.sqrt;
1660
1682
  var U = Math.pow;
@@ -1692,8 +1714,8 @@ var et = function(t2, r2, n2, e2) {
1692
1714
  var i2 = Object.assign({}, { l: 1, c: 1 }, e2);
1693
1715
  return (function(t3, r3, n3, e3) {
1694
1716
  void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1);
1695
- 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);
1696
- return F(U(b2 / (n3 * g2), 2) + U(v2 / (e3 * w2), 2) + U(d2 / x2, 2));
1717
+ var o3 = V(t3, true), i3 = o3[0], a3 = o3[1], u4 = o3[2], h3 = o3[3], c3 = o3[4], l2 = V(r3), p3 = l2[0], f2 = l2[1], s2 = l2[3], v2 = a3 - f2, b2 = i3 - p3, 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)), x3 = w2 * (M2 * m2 + 1 - M2);
1718
+ return F(U(b2 / (n3 * g2), 2) + U(v2 / (e3 * w2), 2) + U(d2 / x3, 2));
1697
1719
  })(t2, r2, i2.l, i2.c);
1698
1720
  }
1699
1721
  if (o2 === rt) {
@@ -1702,8 +1724,8 @@ var et = function(t2, r2, n2, e2) {
1702
1724
  void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1), void 0 === o3 && (o3 = 1), void 0 === i3 && (i3 = "graphic");
1703
1725
  var a3 = "textiles" === i3 ? 0.048 : 0.045, u4 = "textiles" === i3 ? 0.014 : 0.015;
1704
1726
  n3 = "textiles" === i3 ? 2 : n3;
1705
- 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));
1706
- return F(U(d2 / (1 * n3), 2) + U(g2 / (e3 * m2), 2) + U(x2 / (o3 * M2), 2));
1727
+ var h3 = V(t3), c3 = h3[0], l2 = h3[1], p3 = 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, x3 = F(U(p3 - y2, 2) + U(w2, 2) - U(g2, 2));
1728
+ return F(U(d2 / (1 * n3), 2) + U(g2 / (e3 * m2), 2) + U(x3 / (o3 * M2), 2));
1707
1729
  })(t2, r2, u3.kL, u3.kC, u3.kH, u3.cate);
1708
1730
  }
1709
1731
  if (o2 === nt) return (function(t3, r3) {
@@ -1713,7 +1735,7 @@ var et = function(t2, r2, n2, e2) {
1713
1735
  var h2 = { kL: 1, kC: 1, kH: 1 }, c2 = Object.assign({}, h2, e2);
1714
1736
  return (function(t3, r3, n3, e3, o3) {
1715
1737
  void 0 === n3 && (n3 = 1), void 0 === e3 && (e3 = 1), void 0 === o3 && (o3 = 1);
1716
- 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));
1738
+ var i3 = V(t3), a3 = i3[0], u4 = i3[1], h3 = i3[3], c3 = i3[4], l2 = V(r3), p3 = l2[0], f2 = l2[1], s2 = l2[3], v2 = l2[4], b2 = (a3 + p3) / 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)), x3 = T(g2, c3, true), _2 = T(w2, v2, true), C2 = (m2 + M2) / 2, I2 = J(x3 - _2) > 180 ? (x3 + _2 + 360) / 2 : (x3 + _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 - x3) <= 180 ? _2 - x3 : J(_2 - x3) > 180 && _2 <= x3 ? _2 - x3 + 360 : _2 - x3 - 360, z2 = p3 - 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));
1717
1739
  return F(U(z2 / (n3 * P2), 2) + U(N2 / (e3 * j2), 2) + U(O2 / (o3 * S2), 2) + L2 * (N2 / (e3 * j2)) * (O2 / (o3 * S2)));
1718
1740
  })(t2, r2, c2.kL, c2.kC, c2.kH);
1719
1741
  };
@@ -1763,7 +1785,7 @@ var lt = function(t2, r2) {
1763
1785
  if (c2 || (u3 = true), c2) {
1764
1786
  var l2 = c2[1].toLocaleLowerCase();
1765
1787
  if (e2 = l2, ut.has(l2) || (u3 = true), c2[2] && !u3) {
1766
- var p4 = c2[2], f2 = -1 !== p4.indexOf(",") ? "," : " ", s2 = p4.split(f2);
1788
+ var p3 = c2[2], f2 = -1 !== p3.indexOf(",") ? "," : " ", s2 = p3.split(f2);
1767
1789
  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()));
1768
1790
  ["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);
1769
1791
  }
@@ -1795,12 +1817,12 @@ var ft = (function() {
1795
1817
  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];
1796
1818
  if ("rgb" === i3) return [a3, u4];
1797
1819
  "lch" === i3 && (i3 = (r3 = ["xyz", L(a3[0], a3[1], a3[2])])[0], a3 = r3[1]);
1798
- var h3 = a3[0], c2 = a3[1], p4 = a3[2], f2 = a3[3];
1799
- if ("cmyk" === i3) return [l(h3, c2, p4, f2).map((function(t4) {
1820
+ var h3 = a3[0], c2 = a3[1], p3 = a3[2], f2 = a3[3];
1821
+ if ("cmyk" === i3) return [l(h3, c2, p3, f2).map((function(t4) {
1800
1822
  return o(t4, 0, 255);
1801
1823
  })), u4];
1802
1824
  var v2 = "".concat(i3, "2rgb");
1803
- if ("function" == typeof n4[v2]) return [n4[v2](h3, c2, p4).map((function(t4) {
1825
+ if ("function" == typeof n4[v2]) return [n4[v2](h3, c2, p3).map((function(t4) {
1804
1826
  return o(t4, 0, 255);
1805
1827
  })), u4];
1806
1828
  throw new Error("Invalid color");
@@ -2192,6 +2214,7 @@ export {
2192
2214
  chartOwnsTimeline,
2193
2215
  chooserFitsViewport,
2194
2216
  clearGeoCache,
2217
+ codeReadsDatesInLocalTime,
2195
2218
  colourSpreadFlag,
2196
2219
  compileRenderFn,
2197
2220
  compileTrivialSource,
@@ -2277,5 +2300,6 @@ export {
2277
2300
  svgToDataUrl,
2278
2301
  toRGBA,
2279
2302
  unpinScrolledAxis,
2280
- valuePlacementFlag
2303
+ valuePlacementFlag,
2304
+ vegaSpecReadsDatesInLocalTime
2281
2305
  };
package/dist/react.mjs CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  createChartHost,
5
5
  geoFromCache,
6
6
  loadGeo
7
- } from "./chunk-B2DWID7P.mjs";
7
+ } from "./chunk-LJU47KQS.mjs";
8
8
  import "./chunk-A2GMXZP7.mjs";
9
9
  import "./chunk-GHODWOAL.mjs";
10
10
 
@@ -1,4 +1,4 @@
1
- export declare const HOST_CONTRACT_VERSION = "1.8.0";
1
+ export declare const HOST_CONTRACT_VERSION = "1.9.0";
2
2
  export type GeoPointPrecision = "latlon" | "city" | "zip3" | "state" | "country";
3
3
  /** Every valid tier, ordered most precise → coarsest. Runtime form of GeoPointPrecision. */
4
4
  export declare const GEO_POINT_PRECISIONS: readonly GeoPointPrecision[];
@@ -93,6 +93,7 @@ export interface RenderOptions {
93
93
  rolesBackfilled?: string[];
94
94
  rolesRefused?: string[];
95
95
  } | null;
96
+ dateCellsAreUtcDays?: boolean;
96
97
  geoPointDest?: {
97
98
  precision: GeoPointPrecision | null;
98
99
  precisionCounts: Record<GeoPointPrecision, number>;
@@ -0,0 +1,5 @@
1
+ /** True when generated JavaScript (a D3 render function) reads or builds a date in LOCAL time anywhere,
2
+ * or formats one with no `timeZone`. A host must not re-anchor date cells for such code. */
3
+ export declare function codeReadsDatesInLocalTime(code: string | null | undefined): boolean;
4
+ /** True when a Vega or Vega-Lite spec reads dates in LOCAL time anywhere. Same "never worse" rule. */
5
+ export declare function vegaSpecReadsDatesInLocalTime(spec: string | null | undefined): boolean;
@@ -42,6 +42,8 @@ export interface ChartHostConfig {
42
42
  * into options exactly like geoPoint, so a host that hands over the whole payload
43
43
  * gets both ends annotated without knowing the field exists. */
44
44
  geoPointDest?: RenderOptions["geoPointDest"];
45
+ /** Set by buildRenderPayload(..., { utcDays: true }) - promoted into options exactly like geoPoint. */
46
+ dateCellsAreUtcDays?: boolean;
45
47
  /** Provenance the MCP stamps into data.sample.json. `hostContract` is checked
46
48
  * against HOST_CONTRACT_VERSION so a major-version drift is LOUD, not silent. */
47
49
  meta?: {
@@ -5,6 +5,7 @@ export { loadGeo, geoFromCache, registerGeo, registerGeoAsset, geoAssetFor, clea
5
5
  * note above registerCityTable in shape-core's geoPoint.ts before using it. */
6
6
  export declare function registerCityTable(packed: string): void;
7
7
  export { buildRenderPayload, type RenderPayload, type GeoPointBinding } from "./payload";
8
+ export { codeReadsDatesInLocalTime, vegaSpecReadsDatesInLocalTime } from "./dateCells";
8
9
  export { createChartHost, compileRenderFn, stripEsmExports, requiredD3Plugins, explainRenderFailure, sessionViewStateProvider, noopViewStateProvider, type ChartHost, type ChartHostConfig, type RenderFn } from "./host";
9
10
  export { createMarkResolver, type MarkResolver, type MarkResolverEnv } from "./selection";
10
11
  export { planTrivialChart, compileTrivialSource, type TrivialPlan, type TrivialShapeKind } from "./trivial";
@@ -60,10 +60,22 @@ export interface RenderPayload {
60
60
  * facts, and a single blended count would hide which end of the route is the coarse one.
61
61
  */
62
62
  geoPointDest?: GeoPointReport;
63
+ /**
64
+ * The host re-anchored date cells to the UTC midnight of their day (opts.utcDays). Promoted into
65
+ * options.dateCellsAreUtcDays, which tells a chart - and the server-shipped date shim inside it -
66
+ * that no cell can still be sitting at the reader's local midnight. Present only when utcDays was
67
+ * requested, so every other payload is unchanged.
68
+ */
69
+ dateCellsAreUtcDays?: boolean;
70
+ /** Which columns the re-anchoring actually moved (diagnostics; empty when every date was already
71
+ * UTC midnight). Present only alongside dateCellsAreUtcDays. */
72
+ utcDayColumns?: string[];
63
73
  }
64
74
  export declare function buildRenderPayload(cols: Array<{
65
75
  name: string;
66
76
  } & Record<string, any>>, rowObjs: Array<Record<string, any>>, geo?: {
67
77
  column: string;
68
78
  kind: string;
69
- } | null, point?: GeoPointBinding | null, destination?: GeoPointBinding | null): RenderPayload;
79
+ } | null, point?: GeoPointBinding | null, destination?: GeoPointBinding | null, opts?: {
80
+ utcDays?: boolean;
81
+ } | null): RenderPayload;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bicharts/chart-host",
3
- "version": "0.5.99",
3
+ "version": "0.5.101",
4
4
  "description": "Run a BIC-generated D3 chart in any web host: compiles the generated render() function, applies the shared option defaults, resolves mark clicks (through tooltip overlays), owns the selection affordance, and translates row indices between cross-filtered charts. The same contract the BIC Power BI visual implements, minus Power BI. React bindings at @bicharts/chart-host/react.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",