@bicharts/chart-host 0.5.119 → 0.5.121

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.
@@ -435,7 +435,7 @@ var require_papaparse_min = __commonJS({
435
435
  });
436
436
 
437
437
  // src/contract.ts
438
- var HOST_CONTRACT_VERSION = "1.10.0";
438
+ var HOST_CONTRACT_VERSION = "1.11.0";
439
439
  var GEO_POINT_PRECISIONS = ["latlon", "city", "zip3", "state", "country"];
440
440
  var MARK_CLASS = "d3-mark";
441
441
  var LEGEND_MARK_CLASS = "d3-legend-mark";
@@ -447,6 +447,14 @@ var CONTAINER_SLOT_ANIM_STOP = "__llmAnimStop";
447
447
  var CONTAINER_SLOT_XF_CLEAR = "__llmXfClear";
448
448
  var CONTAINER_SLOT_INITIAL_XF_MARK = "__llmInitialXfMark";
449
449
  var CONTAINER_SLOT_UI_STATE = "__lchUiState";
450
+ var VIEW_ONLY_UI_STATE_KEYS = Object.freeze(["camera", "llmZoom"]);
451
+ function withoutViewOnlyKeys(bag) {
452
+ if (!bag || typeof bag !== "object") return bag;
453
+ if (!VIEW_ONLY_UI_STATE_KEYS.some((k3) => Object.prototype.hasOwnProperty.call(bag, k3))) return bag;
454
+ const out = { ...bag };
455
+ for (const k3 of VIEW_ONLY_UI_STATE_KEYS) delete out[k3];
456
+ return out;
457
+ }
450
458
  var HOST_CONTAINER_CLASS = "bic-chart-host";
451
459
  var SELECTION_ACTIVE_CLASS = "lch-has-selection";
452
460
  var MARK_SELECTED_CLASS = "lch-mark-selected";
@@ -839,7 +847,7 @@ function resolveOptions(p2) {
839
847
  allowTooltips: p2.allowTooltips,
840
848
  noDataText: p2.noDataText,
841
849
  onSelect: p2.onSelect,
842
- // Item 639. Passed straight through like onSelect: the host owns what a gesture MEANS,
850
+ // Control gestures (1.10.0). Passed straight through like onSelect: the host owns what a gesture MEANS,
843
851
  // and a host that supplies nothing leaves every control behaving exactly as before.
844
852
  onControlChange: p2.onControlChange,
845
853
  // ---- live-restyle knobs: `raw || undefined` / `.toString() || undefined` ----
@@ -1443,7 +1451,7 @@ function Wt(n, s) {
1443
1451
  return { iso: i, unmatched: M2, matchedRows: h3, totalRows: n.length };
1444
1452
  }
1445
1453
 
1446
- // ../shape-core/dist/chunk-NY26PXWD.mjs
1454
+ // ../shape-core/dist/chunk-TDTXRIHS.mjs
1447
1455
  var import_papaparse = __toESM(require_papaparse_min(), 1);
1448
1456
  /*! @bicharts/shape-core — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; US Census/TIGER (public domain). Full text: NOTICE in this package. */
1449
1457
  var Se = { "north-america": "AG AI AW BB BL BM BQ BS BZ CA CR CU CW DM DO GD GL GP GT HN HT JM KN KY LC MF MQ MS MX NI PA PM PR SV SX TC TT US VC VG VI", "south-america": "AR BO BR CL CO EC FK GF GY PE PY SR UY VE", europe: "AD AL AT AX BA BE BG BY CH CY CZ DE DK EE ES FI FO FR GB GG GI GR HR HU IE IM IS IT JE LI LT LU LV MC MD ME MK MT NL NO PL PT RO RS RU SE SI SJ SK SM UA VA", africa: "AO BF BI BJ BW CD CF CG CI CM CV DJ DZ EG EH ER ET GA GH GM GN GQ GW KE KM LR LS LY MA MG ML MR MU MW MZ NA NE NG RE RW SC SD SH SL SN SO SS ST SZ TD TG TN TZ UG YT ZA ZM ZW", asia: "AE AF AM AZ BD BH BN BT CC CN CX GE HK ID IL IN IO IQ IR JO JP KG KH KP KR KW KZ LA LB LK MM MN MO MV MY NP OM PH PK PS QA SA SG SY TH TJ TL TM TR TW UZ VN YE", oceania: "AS AU CK FJ FM GU KI MH MP NC NF NR NU NZ PF PG PN PW SB TK TO TV UM VU WF WS", antarctica: "AQ BV GS HM TF" };
@@ -1537,10 +1545,10 @@ function Le(n) {
1537
1545
  return ["sum", "average", "median", "min", "max", "count", "distinctcount", "first"];
1538
1546
  }
1539
1547
  }
1540
- function Xt(n) {
1548
+ function Qt(n) {
1541
1549
  return Le(n)[0];
1542
1550
  }
1543
- function qt(n, e) {
1551
+ function Jt(n, e) {
1544
1552
  if (e !== "sum" && e !== "count") return false;
1545
1553
  if (e === "count") return true;
1546
1554
  let t = Oe(n);
@@ -3319,9 +3327,15 @@ var D3_PLUGIN_PACKAGES = {
3319
3327
  };
3320
3328
  function requiredD3Plugins(code) {
3321
3329
  const out = /* @__PURE__ */ new Set();
3322
- for (const m2 of stripJsComments(String(code || "")).matchAll(/\bd3\s*\.\s*(\w+)\s*[.(]/g)) {
3323
- const pkg = D3_PLUGIN_PACKAGES[m2[1]];
3330
+ const body = stripJsComments(String(code || ""));
3331
+ const add = (name) => {
3332
+ const pkg = D3_PLUGIN_PACKAGES[name];
3324
3333
  if (pkg) out.add(pkg);
3334
+ };
3335
+ for (const m2 of body.matchAll(/\bd3\s*\.\s*(\w+)/g)) add(m2[1]);
3336
+ for (const m2 of body.matchAll(/\bd3\s*\[\s*['"](\w+)['"]\s*\]/g)) add(m2[1]);
3337
+ for (const m2 of body.matchAll(/\{([^{}]*)\}\s*=\s*d3\b/g)) {
3338
+ for (const part of m2[1].split(",")) add(part.split(":")[0].trim());
3325
3339
  }
3326
3340
  return [...out].sort();
3327
3341
  }
@@ -3804,6 +3818,8 @@ export {
3804
3818
  CONTAINER_SLOT_XF_CLEAR,
3805
3819
  CONTAINER_SLOT_INITIAL_XF_MARK,
3806
3820
  CONTAINER_SLOT_UI_STATE,
3821
+ VIEW_ONLY_UI_STATE_KEYS,
3822
+ withoutViewOnlyKeys,
3807
3823
  HOST_CONTAINER_CLASS,
3808
3824
  SELECTION_ACTIVE_CLASS,
3809
3825
  MARK_SELECTED_CLASS,
@@ -3852,8 +3868,8 @@ export {
3852
3868
  a2 as a,
3853
3869
  Oe,
3854
3870
  Le,
3855
- Xt,
3856
- qt,
3871
+ Qt,
3872
+ Jt,
3857
3873
  buildRenderPayload,
3858
3874
  stripJsComments,
3859
3875
  createMarkResolver,
package/dist/index.mjs CHANGED
@@ -36,6 +36,7 @@ import {
36
36
  GLYPH_SAMPLE_N,
37
37
  HOST_CONTAINER_CLASS,
38
38
  HOST_CONTRACT_VERSION,
39
+ Jt,
39
40
  L3,
40
41
  LABEL_CONTRAST_CAP,
41
42
  LABEL_CONTRAST_DONE_ATTR,
@@ -57,6 +58,7 @@ import {
57
58
  PILL_MIN_ALPHA,
58
59
  PILL_MIN_COVERAGE,
59
60
  PILL_OPAQUE_ALPHA,
61
+ Qt,
60
62
  ROW_IDX_ATTR,
61
63
  SAME_SHADE_DELTA_E,
62
64
  SCROLL_SLACK_PX,
@@ -64,9 +66,9 @@ import {
64
66
  SELECTION_ACTIVE_CLASS,
65
67
  VALUE_AXIS_BASELINE_DEFAULT,
66
68
  VALUE_AXIS_MIN_FIT,
69
+ VIEW_ONLY_UI_STATE_KEYS,
67
70
  WHITE_TEXT_BG_LUM,
68
71
  XFILTER_REFRESH_EVENT,
69
- Xt,
70
72
  a,
71
73
  applyLabelContrast,
72
74
  autoRampCanvas,
@@ -116,7 +118,6 @@ import {
116
118
  pinScrolledAxis,
117
119
  planAxisPin,
118
120
  planFrameGrow,
119
- qt,
120
121
  registerGeo,
121
122
  registerGeoAsset,
122
123
  relativeLuminance,
@@ -130,8 +131,9 @@ import {
130
131
  svgInkReach,
131
132
  toRGBA,
132
133
  unpinScrolledAxis,
133
- valuePlacementFlag
134
- } from "./chunk-7ELYQSF5.mjs";
134
+ valuePlacementFlag,
135
+ withoutViewOnlyKeys
136
+ } from "./chunk-7RLI3VOM.mjs";
135
137
  import "./chunk-A2GMXZP7.mjs";
136
138
  import "./chunk-GHODWOAL.mjs";
137
139
 
@@ -1392,6 +1394,11 @@ function aggLabel(agg) {
1392
1394
  return "Sum";
1393
1395
  }
1394
1396
  }
1397
+ function measureLineLabel(agg, name2) {
1398
+ const col = String(name2 ?? "");
1399
+ const prefix = aggLabel(agg) + " of ";
1400
+ return col.trim().toLowerCase().startsWith(prefix.toLowerCase()) ? col.trim() : prefix + col;
1401
+ }
1395
1402
  function isSynthetic(name2) {
1396
1403
  return String(name2 ?? "").startsWith(SYNTHETIC_PREFIX);
1397
1404
  }
@@ -1423,7 +1430,7 @@ function isSuppressed(col) {
1423
1430
  }
1424
1431
  function resolveAgg(col, requested, auto) {
1425
1432
  const fallback = () => {
1426
- const d2 = Xt(col);
1433
+ const d2 = Qt(col);
1427
1434
  return d2 === "first" ? "count" : d2;
1428
1435
  };
1429
1436
  if (auto) return fallback();
@@ -1530,7 +1537,7 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
1530
1537
  }
1531
1538
  const value = reduce(selVals, colAgg, selRaw);
1532
1539
  let sharePct = null;
1533
- if (qt(col, colAgg) && value != null) {
1540
+ if (Jt(col, colAgg) && value != null) {
1534
1541
  const allVals = [];
1535
1542
  const allRaw = [];
1536
1543
  for (let r2 = 0; r2 < rows.length; r2++) {
@@ -1543,7 +1550,7 @@ function computeSelectionCard(payload, selectedRowIdxs, opts = {}) {
1543
1550
  }
1544
1551
  lines.push({
1545
1552
  column: String(col?.name ?? ""),
1546
- label: `${aggLabel(colAgg)} of ${col?.name ?? ""}`,
1553
+ label: measureLineLabel(colAgg, String(col?.name ?? "")),
1547
1554
  value,
1548
1555
  valueText: value == null ? "\u2014" : fmtNumber(value, opts.cultureCode),
1549
1556
  sharePct,
@@ -2455,6 +2462,7 @@ export {
2455
2462
  TRANSPORT_LOST_CHECKING_MESSAGE,
2456
2463
  VALUE_AXIS_BASELINE_DEFAULT,
2457
2464
  VALUE_AXIS_MIN_FIT,
2465
+ VIEW_ONLY_UI_STATE_KEYS,
2458
2466
  WHITE_TEXT_BG_LUM,
2459
2467
  XFILTER_REFRESH_EVENT,
2460
2468
  actionFor,
@@ -2593,5 +2601,6 @@ export {
2593
2601
  transportFailureShouldRecover,
2594
2602
  unpinScrolledAxis,
2595
2603
  valuePlacementFlag,
2596
- vegaSpecReadsDatesInLocalTime
2604
+ vegaSpecReadsDatesInLocalTime,
2605
+ withoutViewOnlyKeys
2597
2606
  };
package/dist/react.mjs CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  createChartHost,
5
5
  geoFromCache,
6
6
  loadGeo
7
- } from "./chunk-7ELYQSF5.mjs";
7
+ } from "./chunk-7RLI3VOM.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.10.0";
1
+ export declare const HOST_CONTRACT_VERSION = "1.11.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[];
@@ -17,6 +17,10 @@ export declare const CONTAINER_SLOT_ANIM_STOP = "__llmAnimStop";
17
17
  export declare const CONTAINER_SLOT_XF_CLEAR = "__llmXfClear";
18
18
  export declare const CONTAINER_SLOT_INITIAL_XF_MARK = "__llmInitialXfMark";
19
19
  export declare const CONTAINER_SLOT_UI_STATE = "__lchUiState";
20
+ export declare const VIEW_ONLY_UI_STATE_KEYS: readonly string[];
21
+ /** The bag with every view-only key removed: what a host persists when the reader has not asked
22
+ * for their view to be remembered. Returns the SAME object when there was nothing to remove. */
23
+ export declare function withoutViewOnlyKeys<T extends Record<string, unknown>>(bag: T): T;
20
24
  /**
21
25
  * WHERE A CHART'S RESTING VIEW-STATE LIVES between draws (contract 1.6.0).
22
26
  *
@@ -1,4 +1,4 @@
1
- export { HOST_CONTRACT_VERSION, GEO_POINT_PRECISIONS, MARK_CLASS, LEGEND_MARK_CLASS, AXIS_FILTER_CLASS, ROW_IDX_ATTR, LIFT_SELECTED_CLASS, XFILTER_REFRESH_EVENT, CONTAINER_SLOT_ANIM_STOP, CONTAINER_SLOT_XF_CLEAR, CONTAINER_SLOT_INITIAL_XF_MARK, CONTAINER_SLOT_UI_STATE, HOST_CONTAINER_CLASS, SELECTION_ACTIVE_CLASS, MARK_SELECTED_CLASS, ACTIVE_TICK_CLASS, DIM_OPACITY_VAR, DIM_OPACITY_DEFAULT, chartOwnsTimeline, periodTickSuppressesFeedback, ANIM_PLAY_SPEED_DEFAULT, ANIM_PLAY_SPEED_MIN, ANIM_PLAY_SPEED_MAX, ANIM_LOOP_DELAY_DEFAULT, ANIM_LOOP_DELAY_MIN, ANIM_MAX_IDEAL_FRAMES_DEFAULT, ANIM_MAX_IDEAL_FRAMES_MIN, ANIM_MAX_IDEAL_FRAMES_MAX, ANIMATION_OPTION_KEYS, COLOR_SCALE_SELF_CLAMP_PCT_DEFAULT, COLOR_SCALE_SELF_CLAMP_PCT_MIN, COLOR_SCALE_SELF_CLAMP_PCT_MAX, FLIP_MODE_DEFAULT, APPROXIMATE_POSITIONS_DEFAULT, VALUE_AXIS_BASELINE_DEFAULT, SEASONAL_MARKERS_DEFAULT, MAX_MAP_POINTS_DEFAULT, type GeoPointPrecision, type GeoMapKind, type TimelineStyle, type FlipMode, type ApproximatePositions, type ValueAxisBaseline, type SeasonalMarkers, type ColorScaleScope, type RenderOptions, type ViewStateProvider, type ChartControlChange, } from "./contract";
1
+ export { HOST_CONTRACT_VERSION, GEO_POINT_PRECISIONS, MARK_CLASS, LEGEND_MARK_CLASS, AXIS_FILTER_CLASS, ROW_IDX_ATTR, LIFT_SELECTED_CLASS, XFILTER_REFRESH_EVENT, CONTAINER_SLOT_ANIM_STOP, CONTAINER_SLOT_XF_CLEAR, CONTAINER_SLOT_INITIAL_XF_MARK, CONTAINER_SLOT_UI_STATE, VIEW_ONLY_UI_STATE_KEYS, withoutViewOnlyKeys, HOST_CONTAINER_CLASS, SELECTION_ACTIVE_CLASS, MARK_SELECTED_CLASS, ACTIVE_TICK_CLASS, DIM_OPACITY_VAR, DIM_OPACITY_DEFAULT, chartOwnsTimeline, periodTickSuppressesFeedback, ANIM_PLAY_SPEED_DEFAULT, ANIM_PLAY_SPEED_MIN, ANIM_PLAY_SPEED_MAX, ANIM_LOOP_DELAY_DEFAULT, ANIM_LOOP_DELAY_MIN, ANIM_MAX_IDEAL_FRAMES_DEFAULT, ANIM_MAX_IDEAL_FRAMES_MIN, ANIM_MAX_IDEAL_FRAMES_MAX, ANIMATION_OPTION_KEYS, COLOR_SCALE_SELF_CLAMP_PCT_DEFAULT, COLOR_SCALE_SELF_CLAMP_PCT_MIN, COLOR_SCALE_SELF_CLAMP_PCT_MAX, FLIP_MODE_DEFAULT, APPROXIMATE_POSITIONS_DEFAULT, VALUE_AXIS_BASELINE_DEFAULT, SEASONAL_MARKERS_DEFAULT, MAX_MAP_POINTS_DEFAULT, type GeoPointPrecision, type GeoMapKind, type TimelineStyle, type FlipMode, type ApproximatePositions, type ValueAxisBaseline, type SeasonalMarkers, type ColorScaleScope, type RenderOptions, type ViewStateProvider, type ChartControlChange, } from "./contract";
2
2
  export { resolveOptions, type ResolveOptionsInput } from "./defaults";
3
3
  export { loadGeo, geoFromCache, registerGeo, registerGeoAsset, geoAssetFor, clearGeoCache, type GeoAssetName, } from "./geoLazy";
4
4
  /** REPLACE the bundled city gazetteer with another packed table. Rarely needed — see the
@@ -84,6 +84,13 @@ type Agg = "sum" | "average" | "min" | "max" | "count" | "median" | "distinctcou
84
84
  * spellings fall back to sum rather than throwing: a card is a courtesy, and refusing to draw
85
85
  * one because a host wrote "Total" is a worse outcome than summing. */
86
86
  export declare function normaliseAggregation(raw: string | undefined | null): Agg;
87
+ /** THE LINE'S LABEL: "<aggregation> of <column>", unless the column's name already says it.
88
+ * An Excel table copied from a pivot, or a Power BI implicit measure, arrives with a column
89
+ * named "Sum of Orders"; composing onto that printed "Sum of Sum of Orders" (dev, Excel add-in
90
+ * 1.0.0.47, a click on the order-fulfilment chart). Only the SAME aggregation's words are
91
+ * dropped: "Average of Sum of Orders" is a true statement - it averages per-row sums - and
92
+ * stays composed. */
93
+ export declare function measureLineLabel(agg: Agg, name: string): string;
87
94
  /**
88
95
  * The card for a selection, or NULL when there is nothing to say.
89
96
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bicharts/chart-host",
3
- "version": "0.5.119",
3
+ "version": "0.5.121",
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",