@bicharts/chart-host 0.5.119 → 0.5.120

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";
@@ -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,
package/dist/index.mjs CHANGED
@@ -64,6 +64,7 @@ import {
64
64
  SELECTION_ACTIVE_CLASS,
65
65
  VALUE_AXIS_BASELINE_DEFAULT,
66
66
  VALUE_AXIS_MIN_FIT,
67
+ VIEW_ONLY_UI_STATE_KEYS,
67
68
  WHITE_TEXT_BG_LUM,
68
69
  XFILTER_REFRESH_EVENT,
69
70
  Xt,
@@ -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-CNFVXCOY.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
  }
@@ -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-CNFVXCOY.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.120",
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",