@bicharts/chart-host 0.6.108 → 0.6.110

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.
Files changed (37) hide show
  1. package/dist/adapters.mjs +3 -3
  2. package/dist/card.mjs +2 -2
  3. package/dist/{chunk-ABGDJ3NJ.mjs → chunk-3JCWTEEH.mjs} +11 -1
  4. package/dist/{chunk-MO2GR56D.mjs → chunk-5VQ3IQF7.mjs} +426 -20
  5. package/dist/{chunk-OSREEGBN.mjs → chunk-7XT5OJ6M.mjs} +1 -1
  6. package/dist/{chunk-UKXGOQMS.mjs → chunk-AEO5SFEQ.mjs} +1 -1
  7. package/dist/{chunk-JU2PQ22J.mjs → chunk-FT75ONSB.mjs} +17 -1
  8. package/dist/{chunk-ESBH2L6E.mjs → chunk-IL5M7K6Z.mjs} +2 -2
  9. package/dist/{chunk-LGWTV5PB.mjs → chunk-KGVNZR23.mjs} +1 -1
  10. package/dist/{chunk-PHUUFCJY.mjs → chunk-KY4FI2HA.mjs} +3 -1
  11. package/dist/{chunk-SYUJ4TPX.mjs → chunk-NJWR3DFK.mjs} +133 -132
  12. package/dist/{chunk-FCLPMC6Q.mjs → chunk-PELRAFYZ.mjs} +1 -1
  13. package/dist/{chunk-MU4BWWO6.mjs → chunk-Q43WOKSV.mjs} +1 -1
  14. package/dist/{chunk-5WTQN5DL.mjs → chunk-S564YXNE.mjs} +1 -1
  15. package/dist/geo-world.mjs +1 -1
  16. package/dist/geo.mjs +1 -1
  17. package/dist/{geoWorld110m.generated-TD2TA7S7.mjs → geoWorld110m-3PRV3V4G.mjs} +1 -1
  18. package/dist/index.mjs +32 -12
  19. package/dist/legend-fit.mjs +3 -3
  20. package/dist/page.mjs +6 -4
  21. package/dist/provinces.mjs +2 -2
  22. package/dist/react.mjs +38 -12
  23. package/dist/testing.mjs +1 -1
  24. package/dist/types/annotations.d.ts +3 -1
  25. package/dist/types/contract.d.ts +19 -1
  26. package/dist/types/defaults.d.ts +2 -1
  27. package/dist/types/filterScope.d.ts +8 -0
  28. package/dist/types/focusKeep.d.ts +12 -0
  29. package/dist/types/geo-world.d.ts +1 -1
  30. package/dist/types/geoWorld110m.d.ts +1 -0
  31. package/dist/types/host.d.ts +10 -0
  32. package/dist/types/index.d.ts +4 -2
  33. package/dist/types/keyboardMarks.d.ts +44 -0
  34. package/dist/types/page.d.ts +1 -1
  35. package/dist/types/react.d.ts +10 -1
  36. package/dist/zoom-memory.mjs +1 -1
  37. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  /*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */
2
2
  import {
3
3
  SNAPSHOT_SVG_ATTR
4
- } from "./chunk-PHUUFCJY.mjs";
4
+ } from "./chunk-KY4FI2HA.mjs";
5
5
 
6
6
  // src/snapshot.ts
7
7
  var DEFAULT_TIMEOUT_MS = 2e3;
@@ -6,7 +6,7 @@ import {
6
6
  Ti,
7
7
  j,
8
8
  u
9
- } from "./chunk-SYUJ4TPX.mjs";
9
+ } from "./chunk-NJWR3DFK.mjs";
10
10
 
11
11
  // src/sourceDateFormat.ts
12
12
  function formatSourceDate(raw, opts = {}) {
@@ -59,7 +59,7 @@ async function loadGeo(geoKind) {
59
59
  } else if (asset === "us-zip3") {
60
60
  byAsset.set(asset, (await import("./geoUsZip3.generated-VSWL7D6F.mjs")).US_ZIP3);
61
61
  } else {
62
- byAsset.set(asset, (await import("./geoWorld110m.generated-TD2TA7S7.mjs")).WORLD_110M);
62
+ byAsset.set(asset, (await import("./geoWorld110m-3PRV3V4G.mjs")).WORLD_110M);
63
63
  }
64
64
  return fromAssets(key);
65
65
  }
@@ -1,7 +1,7 @@
1
1
  /*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */
2
2
  import {
3
3
  WORLD_110M
4
- } from "./chunk-ABGDJ3NJ.mjs";
4
+ } from "./chunk-3JCWTEEH.mjs";
5
5
  import "./chunk-GHODWOAL.mjs";
6
6
  export {
7
7
  WORLD_110M
package/dist/geo.mjs CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-A2GMXZP7.mjs";
7
7
  import {
8
8
  WORLD_110M
9
- } from "./chunk-ABGDJ3NJ.mjs";
9
+ } from "./chunk-3JCWTEEH.mjs";
10
10
  import {
11
11
  US_STATES
12
12
  } from "./chunk-75ZJSYIF.mjs";
@@ -1,7 +1,7 @@
1
1
  /*! @bicharts/chart-host — Apache-2.0. Bundled reference data: GeoNames (https://www.geonames.org/) CC BY 4.0; Natural Earth and US Census/TIGER (public domain). Full text: NOTICE in this package. */
2
2
  import {
3
3
  WORLD_110M
4
- } from "./chunk-ABGDJ3NJ.mjs";
4
+ } from "./chunk-3JCWTEEH.mjs";
5
5
  import "./chunk-GHODWOAL.mjs";
6
6
  export {
7
7
  WORLD_110M
package/dist/index.mjs CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  formatSourceDateFor,
6
6
  isExcelDateFormat,
7
7
  normaliseAggregation
8
- } from "./chunk-MU4BWWO6.mjs";
8
+ } from "./chunk-Q43WOKSV.mjs";
9
9
  import {
10
10
  captureSvgSnapshot,
11
11
  chartSvgOf,
@@ -15,7 +15,7 @@ import {
15
15
  svgNaturalSize,
16
16
  svgToDataUrl,
17
17
  tableHostOf
18
- } from "./chunk-FCLPMC6Q.mjs";
18
+ } from "./chunk-PELRAFYZ.mjs";
19
19
  import {
20
20
  ANNOTATION_CLASS,
21
21
  ANNOTATION_LAYER_CLASS,
@@ -29,6 +29,8 @@ import {
29
29
  DARK_TEXT,
30
30
  EXPORT_FORMATS,
31
31
  GLYPH_SAMPLE_N,
32
+ KEYBOARD_CLASS,
33
+ KEYBOARD_STAMP,
32
34
  LABEL_CONTRAST_CAP,
33
35
  LABEL_CONTRAST_DONE_ATTR,
34
36
  LABEL_PILL_CLASS,
@@ -47,6 +49,7 @@ import {
47
49
  STRADDLE_TARGET_CONTRAST,
48
50
  VALUE_AXIS_MIN_FIT,
49
51
  WHITE_TEXT_BG_LUM,
52
+ WIRED_ATTR,
50
53
  XLSX_MIME,
51
54
  applyLabelContrast,
52
55
  assembleD3,
@@ -63,8 +66,10 @@ import {
63
66
  censusColourSpread,
64
67
  censusMarks,
65
68
  censusValuePlacement,
69
+ cleanFilterScope,
66
70
  cleanHostSelection,
67
71
  clippedTextFlag,
72
+ codeHasKeyboardStamp,
68
73
  colourSpreadFlag,
69
74
  compileRenderFn,
70
75
  compositeOver,
@@ -80,6 +85,7 @@ import {
80
85
  exportFormatsFor,
81
86
  exportTableService,
82
87
  glyphSampleGrid,
88
+ installKeyboard,
83
89
  invalidSentinelReason,
84
90
  isBlankRender,
85
91
  isInvalidSentinelError,
@@ -90,9 +96,12 @@ import {
90
96
  pickColorOver,
91
97
  pillBacksGlyph,
92
98
  relativeLuminance,
99
+ rememberFocus,
93
100
  requiredD3Plugins,
94
101
  resolveAutoColorScale,
95
102
  resolveOptions,
103
+ restoreFocus,
104
+ rowNameOf,
96
105
  scopeChartIds,
97
106
  sessionViewStateProvider,
98
107
  sheetName,
@@ -106,7 +115,7 @@ import {
106
115
  toRGBA,
107
116
  toSourceRows,
108
117
  valuePlacementFlag
109
- } from "./chunk-MO2GR56D.mjs";
118
+ } from "./chunk-5VQ3IQF7.mjs";
110
119
  import {
111
120
  LASSO_AXES_SLOT,
112
121
  LASSO_COUNT_CLASS,
@@ -133,13 +142,13 @@ import {
133
142
  lassoVerdict,
134
143
  pointInShape,
135
144
  registerLassoAction
136
- } from "./chunk-ESBH2L6E.mjs";
145
+ } from "./chunk-IL5M7K6Z.mjs";
137
146
  import {
138
147
  MIN_HIT_BAND_PX,
139
148
  censusHitBands,
140
149
  ensureCrossfilterHitTargets,
141
150
  hitBandFlag
142
- } from "./chunk-UKXGOQMS.mjs";
151
+ } from "./chunk-AEO5SFEQ.mjs";
143
152
  import {
144
153
  CONTAINER_SLOT_PRESS_AT,
145
154
  DRAG_NOT_CLICK_PX,
@@ -164,7 +173,7 @@ import {
164
173
  selectionRuleOf,
165
174
  trackPress,
166
175
  validRowSet
167
- } from "./chunk-LGWTV5PB.mjs";
176
+ } from "./chunk-KGVNZR23.mjs";
168
177
  import {
169
178
  AXIS_PIN_BAND_PAD_PX,
170
179
  AXIS_PIN_MAX_BAND_FRACTION,
@@ -193,7 +202,7 @@ import {
193
202
  svgInkReach,
194
203
  takeScroll,
195
204
  unpinScrolledAxis
196
- } from "./chunk-OSREEGBN.mjs";
205
+ } from "./chunk-7XT5OJ6M.mjs";
197
206
  import {
198
207
  clearGeoCache,
199
208
  geoAssetFor,
@@ -201,12 +210,12 @@ import {
201
210
  loadGeo,
202
211
  registerGeo,
203
212
  registerGeoAsset
204
- } from "./chunk-5WTQN5DL.mjs";
213
+ } from "./chunk-S564YXNE.mjs";
205
214
  import {
206
- Kt,
215
+ Ot,
207
216
  l,
208
217
  o
209
- } from "./chunk-SYUJ4TPX.mjs";
218
+ } from "./chunk-NJWR3DFK.mjs";
210
219
  import "./chunk-A2GMXZP7.mjs";
211
220
  import {
212
221
  ACTIVE_TICK_CLASS,
@@ -244,6 +253,7 @@ import {
244
253
  HOST_CONTRACT_VERSION,
245
254
  LEGEND_MARK_CLASS,
246
255
  LIFT_SELECTED_CLASS,
256
+ MARKS_INERT_CLASS,
247
257
  MARK_CLASS,
248
258
  MARK_KEY_ATTR,
249
259
  MARK_SELECTED_CLASS,
@@ -262,7 +272,7 @@ import {
262
272
  chartOwnsTimeline,
263
273
  periodTickSuppressesFeedback,
264
274
  withoutViewOnlyKeys
265
- } from "./chunk-PHUUFCJY.mjs";
275
+ } from "./chunk-KY4FI2HA.mjs";
266
276
  import "./chunk-GHODWOAL.mjs";
267
277
 
268
278
  // src/hostLinks.ts
@@ -2299,7 +2309,7 @@ function fingerprintComponentDigest(components) {
2299
2309
 
2300
2310
  // src/index.ts
2301
2311
  function registerCityTable(packed) {
2302
- Kt(packed);
2312
+ Ot(packed);
2303
2313
  }
2304
2314
  export {
2305
2315
  ACTIVE_TICK_CLASS,
@@ -2368,6 +2378,9 @@ export {
2368
2378
  HOST_CONTAINER_CLASS,
2369
2379
  HOST_CONTRACT_VERSION,
2370
2380
  INLINE_FILTER_MIN_ROWS,
2381
+ KEYBOARD_CLASS,
2382
+ KEYBOARD_STAMP,
2383
+ WIRED_ATTR as KEYBOARD_WIRED_ATTR,
2371
2384
  LABEL_CONTRAST_CAP,
2372
2385
  LABEL_CONTRAST_DONE_ATTR,
2373
2386
  LABEL_PILL_CLASS,
@@ -2394,6 +2407,7 @@ export {
2394
2407
  LIGHT_TEXT,
2395
2408
  LIMIT_COUNT_MAX,
2396
2409
  LIVE_OPTION_KEYS,
2410
+ MARKS_INERT_CLASS,
2397
2411
  MARK_CLASS,
2398
2412
  MARK_KEY_ATTR,
2399
2413
  MARK_SELECTED_CLASS,
@@ -2480,6 +2494,7 @@ export {
2480
2494
  chartOwnsTimeline,
2481
2495
  chartSvgOf,
2482
2496
  chooserFitsViewport,
2497
+ cleanFilterScope,
2483
2498
  cleanHostSelection,
2484
2499
  clearGeoCache,
2485
2500
  clearLasso,
@@ -2487,6 +2502,7 @@ export {
2487
2502
  clearSelectionGlyphs,
2488
2503
  clickWasDrag,
2489
2504
  clippedTextFlag,
2505
+ codeHasKeyboardStamp,
2490
2506
  codeReadsDatesInLocalTime,
2491
2507
  codeReadsOption,
2492
2508
  collectD3GlyphCenters,
@@ -2537,6 +2553,7 @@ export {
2537
2553
  htmlNaturalSize,
2538
2554
  htmlToSvgDataUrl,
2539
2555
  inlineFilterGate,
2556
+ installKeyboard,
2540
2557
  installLasso,
2541
2558
  invalidSentinelReason,
2542
2559
  isBlankRender,
@@ -2630,11 +2647,14 @@ export {
2630
2647
  registerGeoAsset,
2631
2648
  registerLassoAction,
2632
2649
  relativeLuminance,
2650
+ rememberFocus,
2633
2651
  rememberScroll,
2634
2652
  requiredD3Plugins,
2635
2653
  resolveAutoColorScale,
2636
2654
  resolveOptions,
2655
+ restoreFocus,
2637
2656
  rowIdxsFromMark,
2657
+ rowNameOf,
2638
2658
  sameMarker,
2639
2659
  sameRowSet,
2640
2660
  scopeChartIds,
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  chartSvgOf,
4
4
  tableHostOf
5
- } from "./chunk-FCLPMC6Q.mjs";
5
+ } from "./chunk-PELRAFYZ.mjs";
6
6
  import {
7
7
  FIT_CONTENT_SELECTOR,
8
8
  ctmScaleOf,
9
9
  isPhantomBox
10
- } from "./chunk-OSREEGBN.mjs";
11
- import "./chunk-PHUUFCJY.mjs";
10
+ } from "./chunk-7XT5OJ6M.mjs";
11
+ import "./chunk-KY4FI2HA.mjs";
12
12
  import "./chunk-GHODWOAL.mjs";
13
13
 
14
14
  // src/legendFit/legendReconcile.ts
package/dist/page.mjs CHANGED
@@ -7,6 +7,7 @@ import {
7
7
  createControls,
8
8
  createFilter,
9
9
  createFilterScope,
10
+ filterScopeOf,
10
11
  fromVegaInteraction,
11
12
  noteBadges,
12
13
  notesFor,
@@ -14,10 +15,10 @@ import {
14
15
  readControls,
15
16
  viewFromToken,
16
17
  viewToken
17
- } from "./chunk-JU2PQ22J.mjs";
18
- import "./chunk-ESBH2L6E.mjs";
19
- import "./chunk-LGWTV5PB.mjs";
20
- import "./chunk-PHUUFCJY.mjs";
18
+ } from "./chunk-FT75ONSB.mjs";
19
+ import "./chunk-IL5M7K6Z.mjs";
20
+ import "./chunk-KGVNZR23.mjs";
21
+ import "./chunk-KY4FI2HA.mjs";
21
22
  import "./chunk-GHODWOAL.mjs";
22
23
  export {
23
24
  LINKED_HOVER_CLASS,
@@ -27,6 +28,7 @@ export {
27
28
  createControls,
28
29
  createFilter,
29
30
  createFilterScope,
31
+ filterScopeOf,
30
32
  fromVegaInteraction,
31
33
  noteBadges,
32
34
  notesFor,
@@ -2,12 +2,12 @@
2
2
  import {
3
3
  geoFromCache,
4
4
  registerGeo
5
- } from "./chunk-5WTQN5DL.mjs";
5
+ } from "./chunk-S564YXNE.mjs";
6
6
  import {
7
7
  Si,
8
8
  W,
9
9
  bt
10
- } from "./chunk-SYUJ4TPX.mjs";
10
+ } from "./chunk-NJWR3DFK.mjs";
11
11
  import "./chunk-A2GMXZP7.mjs";
12
12
  import "./chunk-GHODWOAL.mjs";
13
13
 
package/dist/react.mjs CHANGED
@@ -7,35 +7,36 @@ import {
7
7
  createControls,
8
8
  createFilter,
9
9
  createFilterScope,
10
+ filterScopeOf,
10
11
  fromVegaInteraction,
11
12
  noteBadges,
12
13
  notesFor,
13
14
  payloadRowReader,
14
15
  viewFromToken,
15
16
  viewToken
16
- } from "./chunk-JU2PQ22J.mjs";
17
+ } from "./chunk-FT75ONSB.mjs";
17
18
  import {
18
19
  assembleD3,
19
20
  createChartGroup,
20
21
  createChartHost,
21
22
  syncMemberSelection,
22
23
  toSourceRows
23
- } from "./chunk-MO2GR56D.mjs";
24
- import "./chunk-ESBH2L6E.mjs";
25
- import "./chunk-UKXGOQMS.mjs";
26
- import "./chunk-LGWTV5PB.mjs";
27
- import "./chunk-OSREEGBN.mjs";
24
+ } from "./chunk-5VQ3IQF7.mjs";
25
+ import "./chunk-IL5M7K6Z.mjs";
26
+ import "./chunk-AEO5SFEQ.mjs";
27
+ import "./chunk-KGVNZR23.mjs";
28
+ import "./chunk-7XT5OJ6M.mjs";
28
29
  import {
29
30
  geoFromCache,
30
31
  loadGeo
31
- } from "./chunk-5WTQN5DL.mjs";
32
- import "./chunk-SYUJ4TPX.mjs";
32
+ } from "./chunk-S564YXNE.mjs";
33
+ import "./chunk-NJWR3DFK.mjs";
33
34
  import "./chunk-A2GMXZP7.mjs";
34
- import "./chunk-PHUUFCJY.mjs";
35
+ import "./chunk-KY4FI2HA.mjs";
35
36
  import "./chunk-GHODWOAL.mjs";
36
37
 
37
38
  // src/react.tsx
38
- import { createContext, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
39
+ import { createContext, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from "react";
39
40
  import { jsx, jsxs } from "react/jsx-runtime";
40
41
  var Ctx = createContext(null);
41
42
  function useBicSelection() {
@@ -65,7 +66,7 @@ function BicChart(props) {
65
66
  const {
66
67
  code,
67
68
  renderFn,
68
- options,
69
+ options: pageOptions,
69
70
  d3,
70
71
  geoKind,
71
72
  viewState,
@@ -85,9 +86,29 @@ function BicChart(props) {
85
86
  className,
86
87
  style,
87
88
  selects,
89
+ scopedBy,
88
90
  controls,
89
91
  ariaLabel
90
92
  } = props;
93
+ const scopeList = scopedBy == null ? [] : Array.isArray(scopedBy) ? scopedBy : [scopedBy];
94
+ const scopeIds = scopeList.map((f) => f?.id).join("");
95
+ const subscribeScope = useCallback((cb) => {
96
+ const offs = scopeList.map((f) => f?.onChange?.(() => cb()));
97
+ return () => {
98
+ for (const off of offs) off?.();
99
+ };
100
+ }, [scopeIds]);
101
+ const scopeSnapshot = () => scopeList.map((f) => f?.version).join(",");
102
+ useSyncExternalStore(subscribeScope, scopeSnapshot, scopeSnapshot);
103
+ const [scopeEver, setScopeEver] = useState(scopedBy !== void 0);
104
+ if (scopedBy !== void 0 && !scopeEver) setScopeEver(true);
105
+ const scopeFact = scopedBy === void 0 ? void 0 : filterScopeOf(scopeList);
106
+ const scopeKey = scopeFact ? JSON.stringify(scopeFact) : "";
107
+ const options = useMemo(
108
+ () => scopeEver ? { ...pageOptions ?? {}, filterScope: scopeFact ?? pageOptions?.filterScope } : pageOptions,
109
+ // eslint-disable-next-line react-hooks/exhaustive-deps
110
+ [pageOptions, scopeEver, scopeKey]
111
+ );
91
112
  const ref = useRef(null);
92
113
  const hostRef = useRef(null);
93
114
  const rowMapRef = useRef(null);
@@ -185,7 +206,11 @@ function BicChart(props) {
185
206
  // siblings of a chart that has an id in a group. This binding always
186
207
  // subscribes to the selection (for onSelect), so the host cannot count
187
208
  // subscribers here; an onSelect callback alone is not the page's filter.
188
- selectionReachesPage: () => !!reachRef.current.selects || !!(reachRef.current.group && reachRef.current.id)
209
+ selectionReachesPage: () => !!reachRef.current.selects || !!(reachRef.current.group && reachRef.current.id),
210
+ // Whether a click on a mark does anything at all: the same two,
211
+ // or an onSelect the page passed. A chart with none of them draws its marks
212
+ // inert rather than dimming the others for a click that filters nothing.
213
+ marksSelect: () => !!reachRef.current.selects || !!(reachRef.current.group && reachRef.current.id) || typeof onSelectRef.current === "function"
189
214
  });
190
215
  hostRef.current = host;
191
216
  builtAnnKeyRef.current = annKey;
@@ -499,6 +524,7 @@ export {
499
524
  createControls,
500
525
  createFilter,
501
526
  createFilterScope,
527
+ filterScopeOf,
502
528
  fromVegaInteraction,
503
529
  noteBadges,
504
530
  notesFor,
package/dist/testing.mjs CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  MARK_CLASS,
5
5
  MARK_SELECTED_CLASS,
6
6
  ROW_IDX_ATTR
7
- } from "./chunk-PHUUFCJY.mjs";
7
+ } from "./chunk-KY4FI2HA.mjs";
8
8
  import "./chunk-GHODWOAL.mjs";
9
9
 
10
10
  // src/testing/interact.ts
@@ -40,4 +40,6 @@ export interface AnnotationLayer {
40
40
  readonly report: AnnotationReport;
41
41
  destroy(): void;
42
42
  }
43
- export declare function createAnnotationLayer(container: HTMLElement, onClick?: (a: MarkAnnotation) => void): AnnotationLayer;
43
+ export declare function createAnnotationLayer(container: HTMLElement, onClick?: (a: MarkAnnotation) => void, opts?: {
44
+ keyboard?: () => boolean;
45
+ }): AnnotationLayer;
@@ -1,5 +1,5 @@
1
1
  import type { ExportFormat, ExportTableService, SaveFileService } from "./exportTable";
2
- export declare const HOST_CONTRACT_VERSION = "1.21.0";
2
+ export declare const HOST_CONTRACT_VERSION = "1.23.0";
3
3
  export type GeoPointPrecision = "latlon" | "city" | "zip3" | "state" | "country";
4
4
  /** Every valid tier, ordered most precise → coarsest. Runtime form of GeoPointPrecision. */
5
5
  export declare const GEO_POINT_PRECISIONS: readonly GeoPointPrecision[];
@@ -51,6 +51,18 @@ export interface HostSelectionFact {
51
51
  };
52
52
  }
53
53
  export declare const CONTAINER_SLOT_HOST_SELECTION = "__lchHostSelection";
54
+ /**
55
+ * THE PAGE FILTER THAT NARROWED THIS CHART'S ROWS BEFORE THEY ARRIVED (1.23.0), as RenderOptions.filterScope. Untrusted
56
+ * on the chart side like every option: resolveOptions keeps values to non-blank text, each once.
57
+ */
58
+ export interface FilterScopeFact {
59
+ /** The field the filter is on, as the reader knows it ("Country"); "" when the host can't name it. */
60
+ field: string;
61
+ /** The values it keeps, as the reader reads them ("United States"); never empty. */
62
+ values: string[];
63
+ /** The host's own phrase for the whole filter ("the two neighbours"), used instead of one made from the values. */
64
+ label?: string;
65
+ }
54
66
  export declare const CONTAINER_SLOT_ANIM_STOP = "__llmAnimStop";
55
67
  export declare const CONTAINER_SLOT_XF_CLEAR = "__llmXfClear";
56
68
  export declare const CONTAINER_SLOT_INITIAL_XF_MARK = "__llmInitialXfMark";
@@ -90,6 +102,7 @@ export interface ViewStateProvider {
90
102
  export declare const HOST_CONTAINER_CLASS = "bic-chart-host";
91
103
  export declare const SELECTION_ACTIVE_CLASS = "lch-has-selection";
92
104
  export declare const MARK_SELECTED_CLASS = "lch-mark-selected";
105
+ export declare const MARKS_INERT_CLASS = "lch-marks-inert";
93
106
  export declare const ACTIVE_TICK_CLASS = "lch-tick-active";
94
107
  export declare const DIM_OPACITY_VAR = "--lch-dim-opacity";
95
108
  export declare const DIM_OPACITY_DEFAULT = 0.25;
@@ -148,6 +161,7 @@ export interface RenderOptions {
148
161
  rowsWithheld?: number;
149
162
  rowsFilteredOut?: number;
150
163
  hostSelection?: HostSelectionFact;
164
+ filterScope?: FilterScopeFact;
151
165
  openUrl?: (url: string) => void;
152
166
  copyText?: (text: string) => boolean | void | Promise<boolean | void>;
153
167
  saveFile?: SaveFileService;
@@ -196,6 +210,10 @@ export interface RenderOptions {
196
210
  selectionGlyph?: "none" | "dot" | "check";
197
211
  /** A host FACT from the generate answer: this chart's family never takes a selection glyph. */
198
212
  suppressSelectionGlyph?: boolean;
213
+ /** A host FACT: this chart works from the keyboard (its code carries the keyboard stamp), so the host has made its
214
+ * selectable marks focusable. A chart or helper drawing its own controls (a flip arrow, a sort header) gives them
215
+ * a tabindex, a role and an Enter / Space press when this is true. */
216
+ keyboardMarks?: boolean;
199
217
  animAutoPlay?: boolean;
200
218
  animPlaySpeedMs?: number;
201
219
  animLoopDelaySec?: number;
@@ -1,5 +1,6 @@
1
- import { type RenderOptions, type HostSelectionFact } from "./contract";
1
+ import { type RenderOptions, type HostSelectionFact, type FilterScopeFact } from "./contract";
2
2
  export declare function cleanHostSelection(v: unknown): HostSelectionFact | undefined;
3
+ export declare function cleanFilterScope(v: unknown): FilterScopeFact | undefined;
3
4
  export type ResolveOptionsInput = {
4
5
  [K in keyof RenderOptions]?: any;
5
6
  };
@@ -1,5 +1,6 @@
1
1
  import type { ChartHost } from "./host";
2
2
  import type { Controls } from "./controls";
3
+ import type { FilterScopeFact } from "./contract";
3
4
  /** Why a filter changed. */
4
5
  export type FilterChangeReason = "click" | "clear" | "page" | "data";
5
6
  /** One selected key: a value per key column, in the filter's column order. */
@@ -118,6 +119,13 @@ export declare function viewFromToken(token: string | null | undefined): PageVie
118
119
  export declare function createFilter(columns: string | readonly string[], opts?: FilterOptions): Filter;
119
120
  /** Make a page's filter scope. */
120
121
  export declare function createFilterScope(): FilterScope;
122
+ /**
123
+ * THE PAGE FILTERS THAT NARROWED A CHART'S ROWS, as the fact the chart is told (RenderOptions.filterScope, contract
124
+ * 1.23.0). For filters applied to the chart's QUERY, so its rows arrive already narrowed and it can't see the filter.
125
+ * Only the active ones count. The field is each one's label (its key columns when it has none), joined ", "; the values
126
+ * are what its chip shows for each key, in order, each once. Nothing active, nothing to say: undefined.
127
+ */
128
+ export declare function filterScopeOf(filters: Filter | readonly Filter[] | null | undefined): FilterScopeFact | undefined;
121
129
  export interface FilterBinding {
122
130
  /**
123
131
  * Call after the chart is handed new data. The selection is repainted where its keys are drawn now, and a key the new
@@ -0,0 +1,12 @@
1
+ export interface FocusMemory {
2
+ sig: string;
3
+ nth: number;
4
+ start: number | null;
5
+ end: number | null;
6
+ dir: "forward" | "backward" | "none" | null;
7
+ }
8
+ /** The focused element inside the container and its caret, or null when focus is elsewhere (or on the container). */
9
+ export declare function rememberFocus(container: HTMLElement): FocusMemory | null;
10
+ /** Give focus back to the same element of the new draw, with its caret. Nothing when the chart already moved focus into
11
+ * itself, or when the new draw has no such element. Returns whether focus was restored. */
12
+ export declare function restoreFocus(container: HTMLElement, memory: FocusMemory | null): boolean;
@@ -1 +1 @@
1
- export { WORLD_110M } from "./geoWorld110m.generated";
1
+ export { WORLD_110M } from "./geoWorld110m";
@@ -0,0 +1 @@
1
+ export declare const WORLD_110M: any;
@@ -280,6 +280,16 @@ export interface ChartHostConfig {
280
280
  * `selects` and the group itself. Never throws through: an answer that throws counts as reached.
281
281
  */
282
282
  selectionReachesPage?: () => boolean;
283
+ /**
284
+ * WHETHER A CLICK ON A MARK SELECTS ANYTHING. False: nothing listens to this chart's selection - no
285
+ * page filter, no group sibling, no callback - so its marks are drawn inert: no pointer cursor (over the chart's own
286
+ * inline one), no hover dimming of the others, and the reader's click, or a selection the chart dispatches itself,
287
+ * lights and dims nothing. A selection the page hands in (selection.highlight) still paints. Read at every click and
288
+ * every paint, so a binding added later counts at once. Absent: true, which every host but React relies on (a Power
289
+ * BI click always reaches its selection manager; an Excel click always opens a selection card). An answer that
290
+ * throws counts as true.
291
+ */
292
+ marksSelect?: () => boolean;
283
293
  }
284
294
  export interface ChartHost {
285
295
  /** Replace the notes drawn on marks (see ChartHostConfig.annotations); redraws them at once. */
@@ -1,5 +1,5 @@
1
- export { HOST_CONTRACT_VERSION, GEO_POINT_PRECISIONS, MARK_CLASS, LEGEND_MARK_CLASS, AXIS_FILTER_CLASS, ROW_IDX_ATTR, LIFT_SELECTED_CLASS, CONTROL_CLASS, NO_ROW_MARKS_ATTR, NOTE_STYLE_ATTR, SELECTION_RULE_ATTR, SELECTION_RULE_CLICKED_MARKS, MARK_KEY_ATTR, CONTAINER_SLOT_CLICKED_MARKS, SNAPSHOT_SVG_ATTR, XFILTER_REFRESH_EVENT, CONTAINER_SLOT_ANIM_STOP, CONTAINER_SLOT_XF_CLEAR, CONTAINER_SLOT_INITIAL_XF_MARK, CONTAINER_SLOT_UI_STATE, CONTAINER_SLOT_SCROLL, CONTAINER_SLOT_HOST_SELECTION, VIEW_ONLY_UI_STATE_KEYS, withoutViewOnlyKeys, HOST_CONTAINER_CLASS, SELECTION_ACTIVE_CLASS, MARK_SELECTED_CLASS, ACTIVE_TICK_CLASS, DIM_OPACITY_VAR, DIM_OPACITY_DEFAULT, DIM_OPACITY_MIN, 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, FLIP_INTERVAL_MIN_MS, FLIP_INTERVAL_MAX_MS, FLIP_DIRECTION_DEFAULT, APPROXIMATE_POSITIONS_DEFAULT, VALUE_AXIS_BASELINE_DEFAULT, SEASONAL_MARKERS_DEFAULT, MAX_MAP_POINTS_DEFAULT, type GeoPointPrecision, type GeoMapKind, type TimelineStyle, type FlipMode, type FlipDirection, type ApproximatePositions, type ValueAxisBaseline, type SeasonalMarkers, type ColorScaleScope, type RenderOptions, type ViewStateProvider, type ChartControlChange, type XfilterRefreshDetail, type HostSelectionFact, } from "./contract";
2
- export { resolveOptions, cleanHostSelection, type ResolveOptionsInput } from "./defaults";
1
+ export { HOST_CONTRACT_VERSION, GEO_POINT_PRECISIONS, MARK_CLASS, LEGEND_MARK_CLASS, AXIS_FILTER_CLASS, ROW_IDX_ATTR, LIFT_SELECTED_CLASS, CONTROL_CLASS, NO_ROW_MARKS_ATTR, NOTE_STYLE_ATTR, SELECTION_RULE_ATTR, SELECTION_RULE_CLICKED_MARKS, MARK_KEY_ATTR, CONTAINER_SLOT_CLICKED_MARKS, SNAPSHOT_SVG_ATTR, XFILTER_REFRESH_EVENT, CONTAINER_SLOT_ANIM_STOP, CONTAINER_SLOT_XF_CLEAR, CONTAINER_SLOT_INITIAL_XF_MARK, CONTAINER_SLOT_UI_STATE, CONTAINER_SLOT_SCROLL, CONTAINER_SLOT_HOST_SELECTION, VIEW_ONLY_UI_STATE_KEYS, withoutViewOnlyKeys, HOST_CONTAINER_CLASS, SELECTION_ACTIVE_CLASS, MARK_SELECTED_CLASS, MARKS_INERT_CLASS, ACTIVE_TICK_CLASS, DIM_OPACITY_VAR, DIM_OPACITY_DEFAULT, DIM_OPACITY_MIN, 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, FLIP_INTERVAL_MIN_MS, FLIP_INTERVAL_MAX_MS, FLIP_DIRECTION_DEFAULT, APPROXIMATE_POSITIONS_DEFAULT, VALUE_AXIS_BASELINE_DEFAULT, SEASONAL_MARKERS_DEFAULT, MAX_MAP_POINTS_DEFAULT, type GeoPointPrecision, type GeoMapKind, type TimelineStyle, type FlipMode, type FlipDirection, type ApproximatePositions, type ValueAxisBaseline, type SeasonalMarkers, type ColorScaleScope, type RenderOptions, type ViewStateProvider, type ChartControlChange, type XfilterRefreshDetail, type HostSelectionFact, type FilterScopeFact, } from "./contract";
2
+ export { resolveOptions, cleanHostSelection, cleanFilterScope, type ResolveOptionsInput } from "./defaults";
3
3
  export { hostLinkServices, type HostLinkServices, type ClipboardLike } from "./hostLinks";
4
4
  export { tableToCsv, tableToXlsx, buildExportFile, exportFileName, sheetName as exportSheetName, excelNumberFormat, excelSerial, bytesToBase64, exportFormatsFor, exportTableService, browserSaveFile, EXPORT_FORMATS, XLSX_MIME, CSV_MIME, type ExportTable, type ExportColumn, type ExportColumnType, type ExportCell, type ExportFormat, type ExportFile, type SaveFileService, type ExportTableService, } from "./exportTable";
5
5
  export { OPTIONS_VOCABULARY, LIVE_OPTION_KEYS, MAX_MAP_POINTS_MIN, MAX_MAP_POINTS_MAX, LIMIT_COUNT_MAX, wireLimitCount, codeReadsOption, type OptionVocabularyEntry, type OptionTiming, type OptionWire, type OptionKey, } from "./optionsVocabulary";
@@ -11,6 +11,8 @@ export { buildRenderPayload, type RenderPayload, type GeoPointBinding, type GeoB
11
11
  export { codeReadsDatesInLocalTime, vegaSpecReadsDatesInLocalTime } from "./dateCells";
12
12
  export { createChartHost, compileRenderFn, stripEsmExports, requiredD3Plugins, explainRenderFailure, sessionViewStateProvider, noopViewStateProvider, assembleD3, D3_PLUGIN_PACKAGES, type ChartHost, type ChartHostConfig, type RenderFn, type SelectionPaintReport, type SelectionChangeMeta } from "./host";
13
13
  export { ANNOTATION_CLASS, ANNOTATION_LAYER_CLASS, type MarkAnnotation, type AnnotationReport } from "./annotations";
14
+ export { KEYBOARD_STAMP, KEYBOARD_CLASS, WIRED_ATTR as KEYBOARD_WIRED_ATTR, codeHasKeyboardStamp, installKeyboard, rowNameOf, type KeyboardEnv, type KeyboardHandle } from "./keyboardMarks";
15
+ export { rememberFocus, restoreFocus, type FocusMemory } from "./focusKeep";
14
16
  export type { MarkNoteLike, NoteBadgeOptions } from "./markNotes";
15
17
  export type { Controls, ControlInfo, ControlsAttachment } from "./controls";
16
18
  export { createChartGroup, toSourceRows, syncMemberSelection, type ChartGroup, type ChartGroupMember, type ChartGroupSelection, type ChartGroupChange, type ChartGroupMemberOptions, type ChartGroupSourceOptions, type ChartGroupPayload } from "./group";
@@ -0,0 +1,44 @@
1
+ export declare const KEYBOARD_STAMP = "// bic:keyboard-marks";
2
+ /** Whether the code carries the keyboard stamp in its header. */
3
+ export declare function codeHasKeyboardStamp(code: unknown): boolean;
4
+ /** On the container while its chart works from the keyboard. */
5
+ export declare const KEYBOARD_CLASS = "lch-keyboard";
6
+ /** On each element the host made focusable, so it never touches one the chart made focusable itself. */
7
+ export declare const WIRED_ATTR = "data-lch-kb";
8
+ export interface KeyboardEnv {
9
+ container: HTMLElement;
10
+ /** The elements a click selects (the host's click selector). */
11
+ markSelector: string;
12
+ /** Elements pressed with Enter: the chart's declared controls and the host's badges. */
13
+ pressSelector: string;
14
+ /** Elements never to treat as marks (the host's own layers). */
15
+ skipSelector: string;
16
+ /** True while a click on a mark selects nothing (the marks are then not made focusable). */
17
+ inert(): boolean;
18
+ /** Select a mark as a click on it would. */
19
+ select(mark: Element, mods: {
20
+ ctrl: boolean;
21
+ shift: boolean;
22
+ }): void;
23
+ /** The reader's clear: Ctrl+Shift+C on every host (Power BI's own clear-selection key), and Escape where the host
24
+ * lets it (escapeClears). */
25
+ clear(): void;
26
+ /** Whether Escape clears. False for a host whose frame uses Escape to move focus out of the chart (Power BI), so
27
+ * leaving the chart never wipes the reader's selection there. Default true. */
28
+ escapeClears?: boolean;
29
+ isSelected(mark: Element): boolean;
30
+ /** What a screen reader calls a mark that names nothing itself. */
31
+ labelOf(mark: Element): string | null;
32
+ /** A stable key for a mark across redraws (its rows). */
33
+ keyOf(mark: Element): string;
34
+ }
35
+ export interface KeyboardHandle {
36
+ /** Re-apply tab stops, roles, names and pressed state after a draw or a selection change. */
37
+ refresh(): void;
38
+ destroy(): void;
39
+ }
40
+ /** What a screen reader calls a row: its first few values, numbers and dates in the reader's culture, internal columns
41
+ * left out. A Date is read as the reader's date, never as its String() (weekday, time and time zone); one that names
42
+ * no day is skipped like a blank. Text is kept as it is. Shared so every host names a mark the same way. */
43
+ export declare function rowNameOf(columns: ReadonlyArray<unknown>, row: ReadonlyArray<unknown> | null | undefined, culture?: string): string | null;
44
+ export declare function installKeyboard(env: KeyboardEnv): KeyboardHandle;
@@ -1,4 +1,4 @@
1
1
  export { viewToken, viewFromToken, LINKED_HOVER_CLASS, type PageView } from "./filterScope";
2
- export { createFilter, createFilterScope, bindFilter, payloadRowReader, fromVegaInteraction, type Filter, type FilterScope, type FilterOptions, type FilterKey, type FilterChangeReason, type FilterBinding, type BindFilterOptions, type VegaInteractionEvent } from "./filterScope";
2
+ export { createFilter, createFilterScope, bindFilter, payloadRowReader, fromVegaInteraction, filterScopeOf, type Filter, type FilterScope, type FilterOptions, type FilterKey, type FilterChangeReason, type FilterBinding, type BindFilterOptions, type VegaInteractionEvent } from "./filterScope";
3
3
  export { createControls, attachControls, readControls, type Controls, type ControlInfo, type ControlsAttachment } from "./controls";
4
4
  export { noteBadges, badgeKey, notesFor, type MarkNoteLike, type NoteBadgeOptions } from "./markNotes";