@xh/hoist 86.4.0 → 87.0.0-SNAPSHOT.1785528296623

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 (53) hide show
  1. package/CHANGELOG.md +270 -199
  2. package/build/types/cmp/layout/Tags.d.ts +1 -3
  3. package/build/types/core/XH.d.ts +6 -1
  4. package/build/types/core/types/Types.d.ts +2 -0
  5. package/build/types/data/Store.d.ts +54 -4
  6. package/build/types/data/StoreRecord.d.ts +17 -2
  7. package/build/types/data/cube/Cube.d.ts +10 -4
  8. package/build/types/data/cube/View.d.ts +14 -2
  9. package/build/types/data/cube/row/AggregateRow.d.ts +2 -0
  10. package/build/types/data/cube/row/BaseRow.d.ts +1 -1
  11. package/build/types/data/cube/row/BucketRow.d.ts +2 -0
  12. package/build/types/data/cube/row/LeafRow.d.ts +31 -3
  13. package/build/types/desktop/cmp/appOption/AutoRefreshAppOption.d.ts +24 -10
  14. package/build/types/desktop/cmp/appOption/ThemeAppOption.d.ts +24 -10
  15. package/build/types/desktop/cmp/grid/impl/filter/ColumnHeaderFilterModel.d.ts +1 -1
  16. package/build/types/desktop/hooks/UseContextMenu.d.ts +1 -1
  17. package/build/types/desktop/hooks/UseHotkeys.d.ts +1 -1
  18. package/build/types/kit/swiper/index.d.ts +2 -2
  19. package/build/types/mobile/cmp/popover/Popover.d.ts +3 -5
  20. package/build/types/svc/FetchService.d.ts +139 -1
  21. package/build/types/svc/impl/NdjsonResultImpl.d.ts +57 -0
  22. package/build/types/svc/impl/StringInterner.d.ts +54 -0
  23. package/cmp/grid/columns/Column.ts +2 -1
  24. package/cmp/input/HoistInputModel.ts +4 -7
  25. package/core/XH.ts +10 -0
  26. package/core/types/Types.ts +3 -0
  27. package/data/Field.ts +15 -3
  28. package/data/README.md +15 -0
  29. package/data/Store.ts +135 -36
  30. package/data/StoreRecord.ts +32 -11
  31. package/data/cube/Cube.ts +21 -5
  32. package/data/cube/README.md +5 -0
  33. package/data/cube/View.ts +31 -5
  34. package/data/cube/row/AggregateRow.ts +5 -0
  35. package/data/cube/row/BaseRow.ts +4 -4
  36. package/data/cube/row/BucketRow.ts +5 -0
  37. package/data/cube/row/LeafRow.ts +76 -14
  38. package/data/impl/RecordSet.ts +4 -1
  39. package/desktop/cmp/dash/canvas/widgetchooser/DashCanvasWidgetChooser.ts +6 -1
  40. package/desktop/cmp/filter/FilterChooser.scss +2 -2
  41. package/desktop/cmp/input/CodeInput.ts +4 -1
  42. package/desktop/cmp/tab/dynamic/DynamicTabSwitcher.ts +1 -1
  43. package/desktop/cmp/tab/dynamic/scroller/Scroller.ts +2 -2
  44. package/desktop/hooks/UseContextMenu.ts +1 -1
  45. package/desktop/hooks/UseHotkeys.ts +1 -1
  46. package/kit/blueprint/Wrappers.ts +6 -2
  47. package/kit/onsen/index.ts +32 -13
  48. package/mcp/README.md +4 -1
  49. package/mobile/cmp/popover/Popover.ts +31 -47
  50. package/package.json +12 -12
  51. package/svc/FetchService.ts +236 -11
  52. package/svc/impl/NdjsonResultImpl.ts +165 -0
  53. package/svc/impl/StringInterner.ts +141 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,78 @@
1
1
  # Changelog
2
2
 
3
+ ## 87.0.0-SNAPSHOT - unreleased
4
+
5
+ ### 💥 Breaking Changes (upgrade difficulty: 🟠 MEDIUM - React 19 upgrade.)
6
+
7
+ * Hoist v87 updates to React 19. Apps may require minor adjustments and should be tested carefully.
8
+ * Apply any type adjustments needed to meet React 19's stricter typing. See
9
+ https://react.dev/blog/2024/04/25/react-19-upgrade-guide#typescript-changes for more info.
10
+ * Both desktop and mobile `Popover` implementations now render on Floating UI, rather than
11
+ Popper.js, which is not React-19 compatible. This changes the underlying DOM and CSS classes
12
+ for popovers. Test popover-based UI (menus, selects, date inputs, filter choosers) and adjust
13
+ any custom styling that targeted Blueprint or Popper CSS classes (e.g. `bp6-minimal`).
14
+ * The `popperOptions` escape-hatch prop has been removed from the mobile `Popover`.
15
+ * `View.result.leafMap` is now null unless the `Query` sets `includeLeaves` or `provideLeaves`. Set
16
+ either flag if an aggregate-only view needs leaf access, or read source records from `Cube.store`.
17
+
18
+ ### 🎁 New Features
19
+
20
+ * Added `Store.retainRaw` config (default `true`). Set to `false` to drop each record's reference to
21
+ its raw source data object after parsing, reducing memory usage on large stores where
22
+ `StoreRecord.raw` is not needed. Not compatible with `reuseRecords`.
23
+ * Added `Store.loadDataAsync()` to load a complete dataset from a streaming source - a sync or
24
+ async iterable yielding raw records. Creates records incrementally without buffering
25
+ the complete raw dataset in memory, then installs them in a single transaction once the source
26
+ completes. `Cube.loadDataAsync()` likewise accepts a streaming source.
27
+ * Added `XH.fetchNdjson()` to consume an NDJSON (newline-delimited JSON) response incrementally.
28
+ Returns a `lines` async iterable of parsed records - the natural streaming source for
29
+ `Store.loadDataAsync()` - plus a `meta` promise for an optional leading metadata record.
30
+ Optionally pairs with hoist-core v41's `BaseController.renderNdjson()`.
31
+ * Added `FetchOptions.internStrings` to intern (deduplicate) repeated string values within large
32
+ JSON and NDJSON responses, reducing retained memory for high-volume tabular datasets. Interned
33
+ values may also be shared across successive fetches of the same logical dataset, as identified
34
+ by a required app-provided key, per a configurable `retainMode`.
35
+ * Cube `View`s no longer copy leaf row data when leaves are not exposed on their results (neither
36
+ `includeLeaves` nor `provideLeaves` set) - leaf rows read directly from cube records, eliminating
37
+ per-View leaf data objects and speeding up view builds for aggregate-only views over large
38
+ datasets. Such views no longer publish a `View.result.leafMap` - see Breaking Changes.
39
+ * Added an opt-in `Store.useRawAsData` config for projections of already-parsed data - most notably
40
+ a connected Cube `View` feeding a (tree) grid, or an endpoint returning data in its final
41
+ client-side form. Records use the provider's row object as their `data` by reference rather than
42
+ re-parsing and copying it, collapsing the usual two per-row objects to one and skipping the
43
+ per-row parse on every load and update. Requires that raw data already match the Store's Field
44
+ definitions - see the `useRawAsData` config docs for the full contract.
45
+
46
+ ### 🐞 Bug Fixes
47
+
48
+ * Fixed `View.getDimensionValues()` returning sets of `undefined` rather than the actual unique
49
+ values for each dimension.
50
+
51
+ ### ⚙️ Technical
52
+
53
+ * Moved both desktop and mobile popover implementations off the deprecated, React-18-capped
54
+ Popper.js onto Floating UI for React 19 compatibility. The Hoist `Popover` components (mobile and
55
+ desktop) have been updated so no app call-site changes are required.
56
+ * Applied type adjustments to meet React 19's stricter `@types/react` typing.
57
+ * Field XSS protection now preserves the reference identity of string values that sanitization
58
+ does not modify (the common case). Previously every parsed string value was replaced with a
59
+ freshly-allocated copy, doubling string memory on stores retaining raw data and defeating any
60
+ upstream deduplication of repeated values.
61
+
62
+ ### ⚙️ Typescript API Adjustments
63
+
64
+ * Retyped `BaseRow.data` from `ViewRowData` to `PlainObject`, reflecting that custom `Aggregator`
65
+ implementations may only rely on queried field values - not `ViewRowData` metadata - when reading
66
+ row data. Use row-level getters such as `BaseRow.isLeaf` in place of `data.cubeRowType`.
67
+ * Corrected `ChildRawData.rawData` type from `PlainObject[]` to `PlainObject` - the runtime has
68
+ always expected a single raw record per object, and an array would throw on load.
69
+
70
+ ### 📚 Libraries
71
+
72
+ * @auth0/auth0-spa-js `2.23 → 2.24`
73
+ * react `18.2 → 19.2`
74
+ * react-window `2.2 → 2.3`
75
+
3
76
  ## 86.4.0 - 2026-07-15
4
77
 
5
78
  ### 🎁 New Features
@@ -26,13 +99,13 @@
26
99
  ensuring such values render with their proper label rather than falling back to the raw value.
27
100
  * `SegmentedControl` options (desktop and mobile) now accept a `testId`, emitted on the option's
28
101
  rendered button as `data-testid` for E2E targeting. If an option omits its own `testId` but the
29
- control has one, an id is auto-derived as `${controlTestId}-${value}` - restoring parity with
30
- the legacy `ButtonGroupInput` test-hook pattern for apps migrating between the two.
102
+ control has one, an id is auto-derived as `${controlTestId}-${value}` - restoring parity with the
103
+ legacy `ButtonGroupInput` test-hook pattern for apps migrating between the two.
31
104
 
32
105
  ### 🐞 Bug Fixes
33
106
 
34
- * Fixed grid columns configured as `hidden` becoming visible after being grouped and then
35
- ungrouped. `GridModel` now re-asserts each column's configured visibility whenever `groupBy`
107
+ * Fixed grid columns configured as `hidden` becoming visible after being grouped and then ungrouped.
108
+ `GridModel` now re-asserts each column's configured visibility whenever `groupBy`
36
109
  changes, keeping AG Grid's column state in sync with `columnState`.
37
110
  * Fixed `StoreFilterField` and grid Find so an active quick-filter or find query no longer returns
38
111
  different results when the grid's `groupBy` changes.
@@ -48,9 +121,9 @@
48
121
  * Fixed `FilterChooser` popover mode (formerly `PopoverFilterChooser`) so its collapsed control no
49
122
  longer disappears when opened - it now always occupies its place in the layout, so surrounding
50
123
  elements no longer shift. Its clear and favorites controls also respond to a single click rather
51
- than requiring the popover to be opened first. This mode is now enabled more naturally via
52
- a new option `filterChooser({popover: true})`, deprecating `PopoverFilterChooser`, which remains
53
- as a thin alias.
124
+ than requiring the popover to be opened first. This mode is now enabled more naturally via a new
125
+ option `filterChooser({popover: true})`, deprecating `PopoverFilterChooser`, which remains as a
126
+ thin alias.
54
127
  * Fixed "not a valid MIME type" console warnings from `FileChooser`. Accepted extensions are now
55
128
  passed under a dummy MIME type key, silencing the warnings while continuing to filter selected
56
129
  files by extension.
@@ -66,8 +139,8 @@
66
139
  ### 🤖 AI Docs + Tooling
67
140
 
68
141
  * Fixed the MCP server and `hoist-ts` CLI TypeScript symbol tools (`search`, `symbol`, `members`)
69
- returning no results on Windows, where a path-separator mismatch left the symbol index empty.
70
- Path handling is now normalized so the developer tools work on Windows as well as macOS/Linux.
142
+ returning no results on Windows, where a path-separator mismatch left the symbol index empty. Path
143
+ handling is now normalized so the developer tools work on Windows as well as macOS/Linux.
71
144
 
72
145
  ### 📚 Libraries
73
146
 
@@ -85,8 +158,8 @@
85
158
  button. For `readonly` inputs it defaults to true, so applications can bind directly to raw source
86
159
  values and drop their pre-formatting logic, simplifying call sites substantially.
87
160
  * Grid column filter specs now support a `sortValue` config, letting the Values tab of the filter
88
- dialog sort its entries the same way the underlying grid column sorts them. When not provided,
89
- the column's own `sortValue` is used.
161
+ dialog sort its entries the same way the underlying grid column sorts them. When not provided, the
162
+ column's own `sortValue` is used.
90
163
  * `GridModel.levelLabels` now accepts a partial array covering only the top levels of a tree or
91
164
  grouped grid. The "Expand to..." menu and `ExpandToLevelButton` offer one entry per labelled
92
165
  level, so deeper, unlabelled levels (e.g. system-managed) are no longer required and are omitted
@@ -147,11 +220,11 @@
147
220
  horizontal scrolling when both `enableFullWidthScroll` and `useVirtualColumns` were enabled.
148
221
  * Updated `DynamicTabSwitcher` to properly apply `testId` passed down by `TabContainer`.
149
222
  * Ensure publication of `router5-plugin-browser` TS module augmentation.
150
- * Set an explicit `%` unit on the `flex-basis: 0` of `TabContainer`'s flex shorthand to ensure
151
- that the `0` is not interpreted as a `0px` basis and that the container sizes as expected.
223
+ * Set an explicit `%` unit on the `flex-basis: 0` of `TabContainer`'s flex shorthand to ensure that
224
+ the `0` is not interpreted as a `0px` basis and that the container sizes as expected.
152
225
  * ⚠️Apps that upgrade to `hoist-dev-utils v13.x` and use `flex: 1 1 0` or `flex-basis: 0` should
153
- verify that their flex layouts continue to work as expected and add an explicit unit if
154
- not (e.g. `flex: 1 1 0%` or `flex-basis: 0%`).
226
+ verify that their flex layouts continue to work as expected and add an explicit unit if not
227
+ (e.g. `flex: 1 1 0%` or `flex-basis: 0%`).
155
228
 
156
229
  ### ⚙️ Technical
157
230
 
@@ -201,9 +274,9 @@
201
274
  See [`docs/upgrade-notes/v86-upgrade-notes.md`](docs/upgrade-notes/v86-upgrade-notes.md) for
202
275
  detailed, step-by-step upgrade instructions with before/after code examples.
203
276
 
204
- * Deprecated `HoistBase.withSpan()` and the `FetchOptions.span` / `loadSpec` fields, in favor of
205
- the `Runner` chain (`runner().span()`) and the new `CallContext` argument to fetch methods (see
206
- below for more details). Both log a warning and are scheduled for removal in v88.
277
+ * Deprecated `HoistBase.withSpan()` and the `FetchOptions.span` / `loadSpec` fields, in favor of the
278
+ `Runner` chain (`runner().span()`) and the new `CallContext` argument to fetch methods (see below
279
+ for more details). Both log a warning and are scheduled for removal in v88.
207
280
  * Upgraded `CodeInput` to CodeMirror v6 (upgraded from v5).
208
281
  * Removed `editorProps` prop - most use cases now supported via first-class `CodeInput` props
209
282
  such as `readonly`, `language`, `lineNumbers`, and `lineWrapping`.
@@ -225,16 +298,16 @@ detailed, step-by-step upgrade instructions with before/after code examples.
225
298
  * `DashContainerModel` no longer persists per-view `icon` in its layout state, aligning with
226
299
  `DashCanvasModel`. Icons now always come from the `DashViewSpec`. Apps that set
227
300
  `DashViewModel.icon` at runtime still see it render, but the override is no longer saved.
228
- * Removed the `serializeIcon()` / `deserializeIcon()` helpers from `@xh/hoist/icon`, which
229
- existed only to support the above.
230
- * Replaced the mobile `DateInput`'s picker with the browser's native `<input type="date">`,
231
- dropping the abandoned `react-dates` dependency. Removed the obsolete `formatString`,
301
+ * Removed the `serializeIcon()` / `deserializeIcon()` helpers from `@xh/hoist/icon`, which existed
302
+ only to support the above.
303
+ * Replaced the mobile `DateInput`'s picker with the browser's native `<input type="date">`, dropping
304
+ the abandoned `react-dates` dependency. Removed the obsolete `formatString`,
232
305
  `initialMonth`, `placeholder`, and `singleDatePickerProps` props from `DateInputProps`.
233
306
 
234
307
  ### 🎁 New Features
235
308
 
236
- * `FileChooser` gained extensive new capabilities as part of its redesign: a `maxFiles` limit,
237
- fully customizable `emptyDisplay` / `fileDisplay` content, `onFileAccepted` / `onFileRejected`
309
+ * `FileChooser` gained extensive new capabilities as part of its redesign: a `maxFiles` limit, fully
310
+ customizable `emptyDisplay` / `fileDisplay` content, `onFileAccepted` / `onFileRejected`
238
311
  callbacks, configurable rejection toasts, `maskOnDrag` / `maskOnDisabled` options, and a
239
312
  programmatic `openFileBrowser()` method. In multi-file mode a persistent drop target sits
240
313
  alongside the grid - placement set via the `dropTargetPlacement` prop (`left`, `top`, or
@@ -245,23 +318,23 @@ detailed, step-by-step upgrade instructions with before/after code examples.
245
318
  now accept as an optional argument.
246
319
  * Added a client-side `MetricsService` (`XH.metricsService`) for recording timers and counters,
247
320
  batched to the server's Micrometer registry. Recording requires `hoist-core >= 40.0.1`.
248
- * Trace spans can now chain onto a remote `traceparent` received off-channel (e.g. a WebSocket,
249
- SSE, or queue message), in addition to a local parent span.
250
- * Desktop `DateInput` now supports a `commitOnChange` prop (default `true`). Set to `false` to
251
- defer parsing and value commit until blur, Enter, or picker selection. Useful when configuring
321
+ * Trace spans can now chain onto a remote `traceparent` received off-channel (e.g. a WebSocket, SSE,
322
+ or queue message), in addition to a local parent span.
323
+ * Desktop `DateInput` now supports a `commitOnChange` prop (default `true`). Set to `false` to defer
324
+ parsing and value commit until blur, Enter, or picker selection. Useful when configuring
252
325
  `parseStrings` such that one format is a prefix of another (e.g. `MM/DD/YY` and `MM/DD/YYYY`),
253
326
  where the eager default would reformat the user's text mid-typing.
254
327
  * `SegmentedControl` now supports a per-option `intent`, with an option's own intent taking
255
328
  precedence over the control-level default. Its control-level `intent` prop was widened from
256
- `'none' | 'primary'` to `'none' | Intent`, now accepting `success` / `warning` / `danger` as
257
- well (a backward-compatible widening).
329
+ `'none' | 'primary'` to `'none' | Intent`, now accepting `success` / `warning` / `danger` as well
330
+ (a backward-compatible widening).
258
331
  * Added `pathPrefix` to `PersistOptions` - an inheritable prefix prepended to the resolved `path`,
259
332
  concatenated through `persistOptions()`. Enables hierarchical namespacing of persistence so a
260
333
  parent model can scope all descendants (`@persist` properties, `markPersist` calls, child
261
334
  `GridModel` / `PanelModel` / etc.) under a single shared key in one backing store. See
262
335
  [`docs/persistence.md`](docs/persistence.md#hierarchical-namespacing-with-pathprefix).
263
- * Added exported `persistOptions()` function for merging one or more `PersistOptions` objects,
264
- with later arguments overriding earlier ones. Replaces the now-deprecated
336
+ * Added exported `persistOptions()` function for merging one or more `PersistOptions` objects, with
337
+ later arguments overriding earlier ones. Replaces the now-deprecated
265
338
  `PersistenceProvider.mergePersistOptions`.
266
339
 
267
340
  ### 🐞 Bug Fixes
@@ -270,8 +343,8 @@ detailed, step-by-step upgrade instructions with before/after code examples.
270
343
  modern `chart.zooming.type` Highcharts option, in addition to the legacy `chart.zoomType`.
271
344
  * Improved desktop `Select` to no longer hijack `Home`/`End` keys, allowing native caret movement in
272
345
  the input. See [#3930](https://github.com/xh/hoist-react/issues/3930).
273
- * Fixed `GridFilter` column header values tab crashing with a duplicate-ID error when re-opened
274
- for a `tags`-typed field with an active filter.
346
+ * Fixed `GridFilter` column header values tab crashing with a duplicate-ID error when re-opened for
347
+ a `tags`-typed field with an active filter.
275
348
  * Fixed `RelativeTimestamp` ignoring an explicitly passed `model` prop when resolving its `bind`
276
349
  source - the prop is now honored, falling back to the context model only when unset.
277
350
  * Fixed `UniqueAggregator` permanently caching `null` on grouped cube rows after a diverge →
@@ -360,30 +433,30 @@ detailed, step-by-step upgrade instructions with before/after code examples.
360
433
  Note that `hoist-core >= 39.0` is recommended (not required) to pair with the span-sampling and
361
434
  app-load span changes in this release.
362
435
 
363
- * `XH.installServicesAsync()` no longer accepts the spread-args form. Callers must pass an
364
- array of service classes plus the current phase's `InitContext`:
436
+ * `XH.installServicesAsync()` no longer accepts the spread-args form. Callers must pass an array of
437
+ service classes plus the current phase's `InitContext`:
365
438
  ```ts
366
439
  // before
367
440
  await XH.installServicesAsync(MyServiceA, MyServiceB);
368
441
  // after
369
442
  await XH.installServicesAsync([MyServiceA, MyServiceB], ctx);
370
443
  ```
371
- The `ctx` is the one passed to your `AppModel.initAsync(ctx)` override. Forwarding it
372
- ensures service-init spans nest under the current phase's root span (e.g. `xh.client.appInit`
444
+ The `ctx` is the one passed to your `AppModel.initAsync(ctx)` override. Forwarding it ensures
445
+ service-init spans nest under the current phase's root span (e.g. `xh.client.appInit`
373
446
  for app-level services, `xh.client.hoistInit` for Hoist-internal services).
374
447
  * `HoistService.initAsync()` and `HoistAppModel.initAsync()` signatures now take an
375
- `InitContext` argument. Override signatures must be updated to `initAsync(ctx: InitContext)` -
376
- the upgrade notes cover the mechanical changes and recommended ways to forward `ctx.span`
448
+ `InitContext` argument. Override signatures must be updated to `initAsync(ctx: InitContext)` - the
449
+ upgrade notes cover the mechanical changes and recommended ways to forward `ctx.span`
377
450
  into init-time fetch and async work.
378
451
  * `HoistBase.withSpan()` / `withSpanAsync()` have been removed in favor of the new
379
452
  `HoistBase.span()` builder. Replace `this.withSpanAsync(cfg, fn)` with
380
- `this.span(cfg).run(fn)`. The underlying `XH.traceService.withSpan()` API remains for
381
- advanced use - now a single async method (the prior sync `withSpan` and async
453
+ `this.span(cfg).run(fn)`. The underlying `XH.traceService.withSpan()` API remains for advanced
454
+ use - now a single async method (the prior sync `withSpan` and async
382
455
  `withSpanAsync` on `TraceService` have been merged).
383
456
  * `TraceService` no longer supports the `alwaysSampleErrors` flag, which was deemed inappropriate
384
457
  for head-based sampling. This change is consistent with a similar update in hoist-core v39. Apps
385
- requiring full visibility into error spans for a particular set of errors should ensure they
386
- are sampled via the existing rules.
458
+ requiring full visibility into error spans for a particular set of errors should ensure they are
459
+ sampled via the existing rules.
387
460
  * Removed several APIs that had been deprecated for one or more prior versions - including
388
461
  `loadModel` getters across model/service/store classes, static defaults setters on `GridModel`/
389
462
  `ChartModel`/`ExceptionHandler`/`FetchService`, and the legacy `withFilterByField`/
@@ -392,12 +465,11 @@ app-load span changes in this release.
392
465
 
393
466
  ### 🎁 New Features
394
467
 
395
- * Added `Span.setTag()`/`setTags()`. Span passed to spanned functions is now non-nullable,
396
- matching the server-side API.
397
- * `LoadSpecConfig.span` lets callers seed the parent trace context for a managed load via
398
- loadAsync().
399
- This span will be made available on the LoadSpec and automatically picked up by FetchService for
400
- properly nesting fetch calls.
468
+ * Added `Span.setTag()`/`setTags()`. Span passed to spanned functions is now non-nullable, matching
469
+ the server-side API.
470
+ * `LoadSpecConfig.span` lets callers seed the parent trace context for a managed load via loadAsync
471
+ (). This span will be made available on the LoadSpec and automatically picked up by FetchService
472
+ for properly nesting fetch calls.
401
473
  * `HoistService.initAsync()` and `HoistAppModel.initAsync()` now receive an `InitContext`
402
474
  argument carrying the current phase's `span`, so service init spans can nest under the caller's
403
475
  span. Pass it along to any `loadAsync()` calls via `LoadSpecConfig.span` to continue the chain.
@@ -414,15 +486,15 @@ app-load span changes in this release.
414
486
 
415
487
  ### 🐞 Bug Fixes
416
488
 
417
- * Updated `HoistBase.withSpan` to auto-populate `caller` with `this`, ensuring
418
- emitted spans correctly stamp `code.namespace`.
489
+ * Updated `HoistBase.withSpan` to auto-populate `caller` with `this`, ensuring emitted spans
490
+ correctly stamp `code.namespace`.
419
491
  * Fixes to built-in fetch CLIENT span: install `http.response.status_code` and `url.full` tags.
420
492
  * Fixed downstream app type-check failures on hoist-react asset imports by adding triple-slash
421
- references to `assets.d.ts` from the files that import PNGs. The ambient declarations were
422
- not reachable from consumer tsconfigs with narrower `include` patterns.
423
- * Upgraded Swiper `11 → 12` to resolve CVE-2026-27212, a critical prototype pollution
424
- vulnerability in `Swiper.extendDefaults()`. Apps consuming Swiper's own SCSS should update
425
- imports from `swiper/scss` to `swiper/css` - Swiper 12 ships CSS sources only.
493
+ references to `assets.d.ts` from the files that import PNGs. The ambient declarations were not
494
+ reachable from consumer tsconfigs with narrower `include` patterns.
495
+ * Upgraded Swiper `11 → 12` to resolve CVE-2026-27212, a critical prototype pollution vulnerability
496
+ in `Swiper.extendDefaults()`. Apps consuming Swiper's own SCSS should update imports from
497
+ `swiper/scss` to `swiper/css` - Swiper 12 ships CSS sources only.
426
498
 
427
499
  ### 🤖 AI Docs + Tooling
428
500
 
@@ -430,8 +502,8 @@ app-load span changes in this release.
430
502
  (e.g. `"StoreRecord raw"`).
431
503
  * Expanded member-index coverage to every exported class and every exported `*Config` interface.
432
504
  * Added an `@mcpHint` JSDoc tag for attaching short hints to indexed classes/interfaces.
433
- * All MCP tools now expose structured output via `outputSchema` / `structuredContent`; matching
434
- CLI subcommands gained a `--json` flag.
505
+ * All MCP tools now expose structured output via `outputSchema` / `structuredContent`; matching CLI
506
+ subcommands gained a `--json` flag.
435
507
  * `hoist-get-members` surfaces `@param` and `@returns` JSDoc, including via `implements` fallback.
436
508
  * Added a disk-persisted index cache at `node_modules/.cache/hoist-mcp/`, dropping cold CLI search
437
509
  invocations from multi-second builds to sub-second loads. `HOIST_MCP_NO_CACHE=1` to bypass.
@@ -440,8 +512,8 @@ app-load span changes in this release.
440
512
 
441
513
  ### ⚙️ Technical
442
514
 
443
- * Improvements to the naming and tagging of hoist-created spans for consistency with hoist-core
444
- and easier tag-based sampling.
515
+ * Improvements to the naming and tagging of hoist-created spans for consistency with hoist-core and
516
+ easier tag-based sampling.
445
517
  * Suppressed `Trace ID` display in exception dialogs/toasts for routine or unsampled exceptions.
446
518
 
447
519
  ### 📚 Libraries
@@ -453,8 +525,8 @@ app-load span changes in this release.
453
525
  * resize-observer-polyfill `removed`
454
526
 
455
527
  Removed dependencies were obsolete or no longer used by hoist-react internals. No app impact
456
- expected - none were part of the public API surface. Apps that imported these directly (relying
457
- on them as transitive hoist-react dependencies) must add their own direct dependencies.
528
+ expected - none were part of the public API surface. Apps that imported these directly (relying on
529
+ them as transitive hoist-react dependencies) must add their own direct dependencies.
458
530
 
459
531
  ## 84.0.2 - 2026-05-13
460
532
 
@@ -462,16 +534,16 @@ on them as transitive hoist-react dependencies) must add their own direct depend
462
534
 
463
535
  * Fixed downstream app type-check failures on hoist-react asset imports by adding triple-slash
464
536
  references to `assets.d.ts` from the files that import PNGs. The ambient declarations were not
465
- reachable from consumer tsconfigs with narrower `include` patterns. Backport of the fix
466
- originally shipped in v85.0.0.
537
+ reachable from consumer tsconfigs with narrower `include` patterns. Backport of the fix originally
538
+ shipped in v85.0.0.
467
539
 
468
540
  ## 84.0.1 - 2026-04-20
469
541
 
470
542
  ### 🐞 Bug Fixes
471
543
 
472
544
  * Fixed an unrecoverable crash when calling `XH.prompt()` (and any other `FormField` rendered
473
- without an explicit `model` prop). `InstanceManager.registerModelWithTestId()` dereferenced a
474
- null model when a `testId` was supplied, introduced by the v84 expansion of `testId` coverage on
545
+ without an explicit `model` prop). `InstanceManager.registerModelWithTestId()` dereferenced a null
546
+ model when a `testId` was supplied, introduced by the v84 expansion of `testId` coverage on
475
547
  built-in appcontainer components.
476
548
 
477
549
  ## 84.0.0 - 2026-04-15
@@ -482,8 +554,8 @@ See [`docs/upgrade-notes/v84-upgrade-notes.md`](docs/upgrade-notes/v84-upgrade-n
482
554
  detailed, step-by-step upgrade instructions with before/after code examples.
483
555
 
484
556
  * Requires `hoist-core >= 38.0`.
485
- * Removed the `getClassName()` utility from `@xh/hoist/utils/react`. This function had no
486
- remaining usages in the framework — the `className` spec field on `hoistCmp.factory()` /
557
+ * Removed the `getClassName()` utility from `@xh/hoist/utils/react`. This function had no remaining
558
+ usages in the framework — the `className` spec field on `hoistCmp.factory()` /
487
559
  `hoistCmp.withFactory()` handles base class merging automatically.
488
560
 
489
561
  ### 🎁 New Features
@@ -491,46 +563,46 @@ detailed, step-by-step upgrade instructions with before/after code examples.
491
563
  * Updated FontAwesome to v7, bringing subtle visual tweaks and performance optimizations to Hoist's
492
564
  icon library. All previously supported icons remain and no app changes should be required.
493
565
  * Replaced animated PNG `Spinner` with a FontAwesome icon-based spinner, making it scalable,
494
- themeable, and consistent with the rest of the icon system. The icon and weight can be
495
- configured globally via `Spinner.defaults` or per-instance via props. A `usePng` flag is
496
- available to preserve the original PNG appearance if desired.
566
+ themeable, and consistent with the rest of the icon system. The icon and weight can be configured
567
+ globally via `Spinner.defaults` or per-instance via props. A `usePng` flag is available to
568
+ preserve the original PNG appearance if desired.
497
569
  * Added client-side span sampling to `TraceService`. Evaluates `xhTraceConfig.sampleRules` at span
498
570
  creation, with child spans inheriting their parent's decision. The `traceparent` header now
499
571
  propagates the sampling flag to the server.
500
- * `FetchOptions.span` now accepts a `string` or `SpanConfig` in addition to an existing `Span`.
501
- When a string or config is provided, `FetchService` creates and manages the parent span
502
- internally, simplifying a common tracing pattern for fetch calls.
572
+ * `FetchOptions.span` now accepts a `string` or `SpanConfig` in addition to an existing `Span`. When
573
+ a string or config is provided, `FetchService` creates and manages the parent span internally,
574
+ simplifying a common tracing pattern for fetch calls.
503
575
 
504
576
  ### 🤖 AI Docs + Tooling
505
577
 
506
- * Added JSDoc to ~60 exported Config/Spec interfaces and improved class-level docs on key
507
- framework classes. Added README cross-references, when-to-use guidance, and `@see` navigation
508
- links throughout.
578
+ * Added JSDoc to ~60 exported Config/Spec interfaces and improved class-level docs on key framework
579
+ classes. Added README cross-references, when-to-use guidance, and `@see` navigation links
580
+ throughout.
509
581
  * Split Cube documentation into dedicated `data/cube/README.md` with expanded query patterns
510
582
  covering grand totals, leaf drill-down, dynamic updates, and `executeQuery()`.
511
583
  * Enhanced MCP/CLI symbol search to match JSDoc content with multi-word AND queries (e.g.
512
- `"panel modal"` finds `ModalSupportModel`). Added disambiguation hints for duplicate symbol
513
- names and fixed resolution of symbols shadowed by dynamics stubs.
584
+ `"panel modal"` finds `ModalSupportModel`). Added disambiguation hints for duplicate symbol names
585
+ and fixed resolution of symbols shadowed by dynamics stubs.
514
586
 
515
587
  ### ⚙️ Technical
516
588
 
517
- * Added support for a typed `defaults` object on `hoistCmp` components — static config that apps
518
- can override at bootstrap (e.g. `Button.defaults.minimal = false`). Instance props take
519
- precedence. Added initial defaults to `Button`, `Panel`, `Spinner`, and `Toolbar`.
589
+ * Added support for a typed `defaults` object on `hoistCmp` components — static config that apps can
590
+ override at bootstrap (e.g. `Button.defaults.minimal = false`). Instance props take precedence.
591
+ Added initial defaults to `Button`, `Panel`, `Spinner`, and `Toolbar`.
520
592
  * Added `suppressStackTrace` and `includeStartMessages` fields to the Log Levels admin panel,
521
593
  supporting the new hoist-core per-logger logging behavior overrides.
522
594
  * Added `assets.d.ts` type declarations for image and markdown imports (`*.png`, `*.gif`, `*.jpg`,
523
595
  `*.svg`, `*.md`), removing the need for `@ts-ignore` on asset imports.
524
596
  * Added hardcoded `xh-` prefixed `testId` props to all desktop and mobile appcontainer components
525
597
  for Playwright testing support.
526
- * Namespaced auto-installed `TraceService` span and metric tags with an `xh.` prefix, aligning
527
- with OTEL semantic conventions.
598
+ * Namespaced auto-installed `TraceService` span and metric tags with an `xh.` prefix, aligning with
599
+ OTEL semantic conventions.
528
600
 
529
601
  ### ✨ Styles
530
602
 
531
- * Improved default grid tooltip styling — long strings now wrap at a configurable max-width
532
- (`400px` default) using `pre-wrap`. New `--xh-grid-tooltip-*` CSS variables added for
533
- app-level customization of background, border, border-radius, padding, and max-width.
603
+ * Improved default grid tooltip styling — long strings now wrap at a configurable max-width (`400px`
604
+ default) using `pre-wrap`. New `--xh-grid-tooltip-*` CSS variables added for app-level
605
+ customization of background, border, border-radius, padding, and max-width.
534
606
 
535
607
  ### 📚 Libraries
536
608
 
@@ -551,10 +623,10 @@ detailed, step-by-step upgrade instructions with before/after code examples.
551
623
 
552
624
  ### 🤖 AI Docs + Tooling
553
625
 
554
- * Improved MCP/CLI TypeScript symbol tools to surface full JSDoc documentation in search results
555
- and resolve a discoverability gap around component Props interfaces. `hoist-search-symbols`
556
- now includes JSDoc snippets with each result. Props interfaces (e.g. `PanelProps`) without
557
- their own JSDoc inherit documentation from their companion component via naming convention.
626
+ * Improved MCP/CLI TypeScript symbol tools to surface full JSDoc documentation in search results and
627
+ resolve a discoverability gap around component Props interfaces. `hoist-search-symbols`
628
+ now includes JSDoc snippets with each result. Props interfaces (e.g. `PanelProps`) without their
629
+ own JSDoc inherit documentation from their companion component via naming convention.
558
630
  `hoist-get-symbol` now cross-references between Props interfaces and their components.
559
631
 
560
632
  ## 83.0.2 - 2026-03-30
@@ -578,13 +650,13 @@ detailed, step-by-step upgrade instructions with before/after code examples.
578
650
  See [`docs/upgrade-notes/v83-upgrade-notes.md`](docs/upgrade-notes/v83-upgrade-notes.md) for
579
651
  detailed, step-by-step upgrade instructions with before/after code examples.
580
652
 
581
- * Requires `hoist-core >= 37.0` (paired major release — tracing and metrics features depend on
582
- new server-side infrastructure).
653
+ * Requires `hoist-core >= 37.0` (paired major release — tracing and metrics features depend on new
654
+ server-side infrastructure).
583
655
  * Deprecated ad-hoc static properties on `GridModel`, `ChartModel`, `ExceptionHandler`, and
584
- `FetchService` in favor of the new `static defaults` pattern. Old properties log warnings
585
- and are scheduled for removal in v85.
586
- * Removed `downloadjs` dependency. Apps that imported `downloadjs` directly (relying on it
587
- as a transitive hoist-react dependency) must replace those usages. Use the new
656
+ `FetchService` in favor of the new `static defaults` pattern. Old properties log warnings and are
657
+ scheduled for removal in v85.
658
+ * Removed `downloadjs` dependency. Apps that imported `downloadjs` directly (relying on it as a
659
+ transitive hoist-react dependency) must replace those usages. Use the new
588
660
  `downloadBlob(blob, filename)` or `downloadViaUrl(url, filename?)`
589
661
  utilities from `@xh/hoist/utils/js` instead.
590
662
 
@@ -602,27 +674,27 @@ detailed, step-by-step upgrade instructions with before/after code examples.
602
674
  * Added `CheckboxButton` desktop input component — a button-based boolean toggle matching the
603
675
  existing mobile component. Added `checkedIcon` and `uncheckedIcon` props to both desktop and
604
676
  mobile versions for custom icon support.
605
- * Added publish controls to the Admin Metrics tab, supporting the new opt-in metrics export
606
- feature in `hoist-core >= 37.0`.
607
- * Added `activeFilterIcon` config to `GridFilterModel` to customize the icon displayed in
608
- column headers when a filter is active. Accepts any `Icon` element, enabling use of a
609
- different icon, prefix (e.g. solid), or intent (e.g. warning).
677
+ * Added publish controls to the Admin Metrics tab, supporting the new opt-in metrics export feature
678
+ in `hoist-core >= 37.0`.
679
+ * Added `activeFilterIcon` config to `GridFilterModel` to customize the icon displayed in column
680
+ headers when a filter is active. Accepts any `Icon` element, enabling use of a different icon,
681
+ prefix (e.g. solid), or intent (e.g. warning).
610
682
 
611
683
  ### ⚙️ Technical
612
684
 
613
685
  * Introduced a standard `static defaults` pattern for app configuration overrides across several
614
- core models. `GridModel.defaults` is the prime example — see `GridModelDefaults` for the
615
- full set of visual, behavioral, and structural props now available. Apps should review
616
- available defaults and set them at startup to reduce per-instance boilerplate. Instance-level
617
- config always takes precedence. Previous ad-hoc static properties (e.g.
686
+ core models. `GridModel.defaults` is the prime example — see `GridModelDefaults` for the full set
687
+ of visual, behavioral, and structural props now available. Apps should review available defaults
688
+ and set them at startup to reduce per-instance boilerplate. Instance-level config always takes
689
+ precedence. Previous ad-hoc static properties (e.g.
618
690
  `GridModel.DEFAULT_AUTOSIZE_MODE`) are deprecated — update to the new
619
691
  `ModelClassName.defaults.propName` form.
620
- * Added `TabContainerModel.setActiveTabId()` for programmatic tab activation, suitable for use
621
- as a `bind` target (e.g. with `SegmentedControl`). Previously required calling `activateTab()`.
692
+ * Added `TabContainerModel.setActiveTabId()` for programmatic tab activation, suitable for use as a
693
+ `bind` target (e.g. with `SegmentedControl`). Previously required calling `activateTab()`.
622
694
  * Switched `sizingModeAppOption` and `themeAppOption` app option control presets to use new
623
695
  `SegmentedControl` and set new `refreshRequired: false` flag to avoid data refresh when changed.
624
- * Made `DashCanvasModel.loadState()` public, allowing applications to restore canvas state
625
- directly from a `DashCanvasItemState[]` array without wrapping as `PersistableState`.
696
+ * Made `DashCanvasModel.loadState()` public, allowing applications to restore canvas state directly
697
+ from a `DashCanvasItemState[]` array without wrapping as `PersistableState`.
626
698
  * Updated `FieldFilter` to log console warning for any field not found in linked `Store`.
627
699
 
628
700
  ### 🤖 AI Docs + Tooling
@@ -644,9 +716,8 @@ detailed, step-by-step upgrade instructions with before/after code examples.
644
716
  from offering a [blank] option.
645
717
  * Fixed `FilterChooser` `QueryEngine` to handle null values in suggestion generation without
646
718
  throwing. Added error logging so failures in `queryAsync` surface in the console rather than
647
- silently killing the dropdown. The 'is' pseudo-operator is now listed in the e.g. operator
648
- hints, and 'is blank' / 'is not blank' suggestions are offered when a field contains null
649
- values.
719
+ silently killing the dropdown. The 'is' pseudo-operator is now listed in the e.g. operator hints,
720
+ and 'is blank' / 'is not blank' suggestions are offered when a field contains null values.
650
721
 
651
722
  ## 82.0.3 - 2026-03-02
652
723
 
@@ -689,21 +760,21 @@ detailed, step-by-step upgrade instructions with before/after code examples.
689
760
  `Bootstrap` module to ensure correlation IDs are active from the very first request, including
690
761
  early hoist core init calls. Apps that configure these properties should update references from
691
762
  `XH.fetchService.<prop>` to `FetchService.<prop>`.
692
- * Added additional `div` with `xh-dash-tab__content` class around `DashContainerView` content.
693
- Apps with custom CSS targeting `xh-dash-tab` may need to adjust their selectors.
763
+ * Added additional `div` with `xh-dash-tab__content` class around `DashContainerView` content. Apps
764
+ with custom CSS targeting `xh-dash-tab` may need to adjust their selectors.
694
765
  * Removed the `xh-popup--framed` CSS class. Apps applying this class to popovers should remove it —
695
766
  popover borders are now themed globally via the `--xh-popup-border-color` CSS variable.
696
767
 
697
768
  ### 🎁 New Features
698
769
 
699
770
  * Added `DashCanvasWidgetChooser` component — a draggable widget well for adding views to a
700
- `DashCanvas` via drag-and-drop from an external container. Added `allowsDrop`, `onDropDone`,
701
- and `onDropDragOver` config options to `DashCanvasModel` to support this, along with
771
+ `DashCanvas` via drag-and-drop from an external container. Added `allowsDrop`, `onDropDone`, and
772
+ `onDropDragOver` config options to `DashCanvasModel` to support this, along with
702
773
  `showGridBackground` and `showAddViewButtonWhenEmpty` configs and a `'wrap'` compaction strategy.
703
- * Added `Picker` desktop input component — a popover-based option picker for
704
- space-constrained areas like toolbars. Renders a trigger button that opens a dropdown
705
- checklist, with support for single and multi-select modes, built-in filtering, custom option and
706
- button renderers, and virtualized scrolling for large option lists.
774
+ * Added `Picker` desktop input component — a popover-based option picker for space-constrained areas
775
+ like toolbars. Renders a trigger button that opens a dropdown checklist, with support for single
776
+ and multi-select modes, built-in filtering, custom option and button renderers, and virtualized
777
+ scrolling for large option lists.
707
778
  * Added new Admin Console Cluster > Metrics tab, providing a cluster-wide view of all registered
708
779
  Micrometer meters, part of Hoist's ongoing observability updates.
709
780
  * Feature requires `hoist-core >= 36.3`.
@@ -732,31 +803,31 @@ detailed, step-by-step upgrade instructions with before/after code examples.
732
803
  * Improved `DashCanvas` and `DashContainer` persistence such that individual `ViewModel` state can
733
804
  be updated without reloading the entire dashboard and owned views.
734
805
  * Fixed `GroupingChooser` to support multiple instances sharing the same `GroupingChooserModel`.
735
- Transient UI state (e.g. editor open/closed, pending value) is now held per-component, so
736
- opening one chooser no longer opens all others bound to the same model.
806
+ Transient UI state (e.g. editor open/closed, pending value) is now held per-component, so opening
807
+ one chooser no longer opens all others bound to the same model.
737
808
 
738
809
  ### ⚙️ Technical
739
810
 
740
811
  * Added instance methods to the `Filter` class hierarchy for removing child filters by type or
741
812
  field, plus a new `appendFilter()` utility for composing filters via AND. These replace the
742
- standalone `withFilterByField`, `withFilterByKey`, and `withFilterByTypes` utilities, which
743
- have been deprecated. Internal callers have been migrated to the new API.
744
- * Transitioned the hoist-react build itself to GitHub Actions (from our previous Teamcity build).
745
- No change to library consumers - Hoist continues to be published to npm.
813
+ standalone `withFilterByField`, `withFilterByKey`, and `withFilterByTypes` utilities, which have
814
+ been deprecated. Internal callers have been migrated to the new API.
815
+ * Transitioned the hoist-react build itself to GitHub Actions (from our previous Teamcity build). No
816
+ change to library consumers - Hoist continues to be published to npm.
746
817
  * Catches and logs an occasional, non-fatal race condition error on `DashContainer` state changes.
747
818
 
748
819
  ### 🤖 AI Docs + Tooling
749
820
 
750
821
  * Added an embedded MCP (Model Context Protocol) server that gives AI coding tools structured access
751
822
  to hoist-react documentation and TypeScript type information. Includes tools for keyword search
752
- across docs, symbol lookup, and class/interface member inspection.
753
- See [`mcp/README.md`](mcp/README.md) for setup and usage details.
823
+ across docs, symbol lookup, and class/interface member inspection. See [
824
+ `mcp/README.md`](mcp/README.md) for setup and usage details.
754
825
 
755
826
  ### ✨ Styles
756
827
 
757
828
  * Overrode Blueprint's hardcoded popover border and arrow colors to use Hoist's themed
758
- `--xh-popup-border-color` CSS variable. Popover borders and arrows now match the rest of
759
- the Hoist theme in both light and dark modes.
829
+ `--xh-popup-border-color` CSS variable. Popover borders and arrows now match the rest of the Hoist
830
+ theme in both light and dark modes.
760
831
 
761
832
  ### 📚 Libraries
762
833
 
@@ -778,9 +849,9 @@ detailed, step-by-step upgrade instructions with before/after code examples.
778
849
  `xh-panel__inner`. The `xh-panel__content` class is now used on the new inner frame wrapping
779
850
  content items (the target of `contentBoxProps`). Update any app CSS selectors targeting the old
780
851
  `xh-panel__content` class accordingly.
781
- * Changed the signatures of some `HoistAuthModel` methods to return `IdentityInfo` rather than
782
- a `boolean`. For most apps this will require a trivial change to the signature of the
783
- implementation of `HoistAuthModel.completeAuthAsync`.
852
+ * Changed the signatures of some `HoistAuthModel` methods to return `IdentityInfo` rather than a
853
+ `boolean`. For most apps this will require a trivial change to the signature of the implementation
854
+ of `HoistAuthModel.completeAuthAsync`.
784
855
  * Renamed Blueprint `Card` exports to `BpCard` and `bpCard`.
785
856
 
786
857
  ### 🎁 New Features
@@ -875,8 +946,8 @@ detailed, step-by-step upgrade instructions with before/after code examples.
875
946
  * Applied the app-wide `--xh-font-family` to `input` elements. Previously these had continued to
876
947
  take a default font defined by the browser stylesheet.
877
948
  * Customize for inputs if needed via `--xh-input-font-family`.
878
- * Note that the switch to Hoist's default Inter font w/tabular numbers might require some
879
- inputs w/tight sizing to be made wider to avoid clipping (e.g. `DateInputs` sized to fit).
949
+ * Note that the switch to Hoist's default Inter font w/tabular numbers might require some inputs
950
+ w/tight sizing to be made wider to avoid clipping (e.g. `DateInputs` sized to fit).
880
951
  * Updated + added validation-related `FormField` CSS classes and variables to account for new `info`
881
952
  and `warning` validation levels. Additionally validation messages and the `info` text element no
882
953
  longer clip at a single line - they will wrap as needed.
@@ -917,8 +988,8 @@ this release, but is not strictly required.
917
988
  * Renamed `GridModel.applyColumnStateChanges()` to `updateColumnState()` for clarity and better
918
989
  symmetry with `setColumnState()`.
919
990
  * The prior method remains as an alias but is deprecated and scheduled for removal in v82.
920
- * Moved `TabSwitcherProps` to `cmp/tab/Types.ts` but maintained export from `cmp/tab/index.ts`.
921
- Some apps may need to update their imports.
991
+ * Moved `TabSwitcherProps` to `cmp/tab/Types.ts` but maintained export from `cmp/tab/index.ts`. Some
992
+ apps may need to update their imports.
922
993
  * Repurposed `TabContainerConfig.switcher` to accept a `TabSwitcherConfig`. To pass
923
994
  `TabSwitcherProps` via a parent `TabContainer`, use `TabContainerProps.switcher`.
924
995
  * Tightened the typing of `LocalDate` adjustment methods with new `LocalDateUnit` type. Some less
@@ -1011,8 +1082,8 @@ See [`docs/upgrade-notes/v78-upgrade-notes.md`](docs/upgrade-notes/v78-upgrade-n
1011
1082
  detailed, step-by-step upgrade instructions with before/after code examples.
1012
1083
 
1013
1084
  * `GridModel.setColumnState` no longer patches existing column state, but instead replaces it
1014
- wholesale. Applications that were relying on the prior patching behavior will need to
1015
- call `GridModel.applyColumnStateChanges` instead.
1085
+ wholesale. Applications that were relying on the prior patching behavior will need to call
1086
+ `GridModel.applyColumnStateChanges` instead.
1016
1087
  * `GridModel.cleanColumnState` is now private (not expected to impact applications).
1017
1088
 
1018
1089
  ### 🎁 New Features
@@ -1077,8 +1148,8 @@ detailed, step-by-step upgrade instructions with before/after code examples.
1077
1148
  * Note: AG Grid v34+ no longer supports HTML markup in context menus. Applications setting the
1078
1149
  `text` or `secondaryText` properties of `RecordGridAction` to markup should be sure to use
1079
1150
  React nodes for formatting instead.
1080
- * Fixed `AgGridModel.getExpandState()` not returning a full representation of expanded groups -
1081
- an issue that primarily affected linked tree map visualizations.
1151
+ * Fixed `AgGridModel.getExpandState()` not returning a full representation of expanded groups - an
1152
+ issue that primarily affected linked tree map visualizations.
1082
1153
 
1083
1154
  ### ⚙️ Technical
1084
1155
 
@@ -1122,8 +1193,8 @@ detailed, step-by-step upgrade instructions with before/after code examples.
1122
1193
  very minimal changes, although there are required adjustments to app-level `package.json` to
1123
1194
  install updated grid dependencies and `Bootstrap.ts` to import and register your licensed grid
1124
1195
  modules at their new import paths.
1125
- * Applications implementing `groupRowRenderer` should note that the `value` property passed
1126
- to this function is no longer stringified, but is instead the raw field value for the group.
1196
+ * Applications implementing `groupRowRenderer` should note that the `value` property passed to
1197
+ this function is no longer stringified, but is instead the raw field value for the group.
1127
1198
  * See AG's upgrade guides for more details:
1128
1199
  * [Upgrade to v32](https://www.ag-grid.com/react-data-grid/upgrading-to-ag-grid-32/)
1129
1200
  * [Upgrade to v33](https://www.ag-grid.com/react-data-grid/upgrading-to-ag-grid-33/)
@@ -1162,8 +1233,8 @@ detailed, step-by-step upgrade instructions with before/after code examples.
1162
1233
  its configured `initialViewSpec` function as expected in this case.
1163
1234
  * Updated `XH.restoreDefaultsAsync` to clear basic view state, including the user's last selected
1164
1235
  view. Views themselves will be preserved. Requires `hoist-core >= 32.0`.
1165
- * Fixed bug where `GridModel.persistableColumnState` was not including default column `widths`.
1166
- This led to columns not being set to their expected widths when switching `ViewManager` views.
1236
+ * Fixed bug where `GridModel.persistableColumnState` was not including default column `widths`. This
1237
+ led to columns not being set to their expected widths when switching `ViewManager` views.
1167
1238
  * Fixed bug where a `Grid` with managed autosizing was not triggering an autosize as expected when
1168
1239
  new column state was loaded (e.g. via `ViewManager`).
1169
1240
 
@@ -1199,8 +1270,8 @@ detailed, step-by-step upgrade instructions with before/after code examples.
1199
1270
  * The default grid context menu now supports a new item to allow users to expand/collapse out to
1200
1271
  a specific level/depth. Set `GridModel.levelLabels` to activate this feature.
1201
1272
  * A new `ExpandToLevelButton` menu component is also available for both desktop and mobile.
1202
- Provides easier discoverability on desktop and supports this feature on mobile, where we
1203
- don't have context menus.
1273
+ Provides easier discoverability on desktop and supports this feature on mobile, where we don't
1274
+ have context menus.
1204
1275
  * Enhanced `FilterChooser` to better handle filters with different `op`s on the same field.
1205
1276
  * Multiple "inclusive" ops (e.g. `=`, `like`) will be OR'ed together.
1206
1277
  * Multiple "exclusive" ops (e.g. `!=`, `not like`) will be AND'ed together.
@@ -1256,9 +1327,9 @@ detailed, step-by-step upgrade instructions with before/after code examples.
1256
1327
 
1257
1328
  ### ✨ Styles
1258
1329
 
1259
- * Upgraded the version of Hoist's default Inter UI font to a new major version, now v4.1. Note
1260
- that this brings slight differences to the font's appearance, including tweaks to internal
1261
- spacing and letterforms for tabular numbers. The name of the font face has also changed, from
1330
+ * Upgraded the version of Hoist's default Inter UI font to a new major version, now v4.1. Note that
1331
+ this brings slight differences to the font's appearance, including tweaks to internal spacing and
1332
+ letterforms for tabular numbers. The name of the font face has also changed, from
1262
1333
  `Inter Var` to `InterVariable`. The default value of the `--xh-font-family` CSS variable has been
1263
1334
  updated to match, making this change transparent for most applications.
1264
1335
 
@@ -1360,8 +1431,8 @@ detailed, step-by-step upgrade instructions with before/after code examples.
1360
1431
  applicable. This did not previously have any effect, but is required now for the superclass to
1361
1432
  initialize a new `ViewManagerModel`.
1362
1433
  * [Here is where Toolbox makes that call](https://github.com/xh/toolbox/blob/f15a8018ce36c2ae998b45724b48a16320b88e49/client-app/src/admin/AppModel.ts#L12).
1363
- * Requires call to `makeObservable(this)` in model constructors with `@bindable`. Note that there
1364
- is a new dev-only runtime check on `HoistBase` to warn if this call has not been made.
1434
+ * Requires call to `makeObservable(this)` in model constructors with `@bindable`. Note that there is
1435
+ a new dev-only runtime check on `HoistBase` to warn if this call has not been made.
1365
1436
 
1366
1437
  ### 🎁 New Features
1367
1438
 
@@ -1405,10 +1476,10 @@ detailed, step-by-step upgrade instructions with before/after code examples.
1405
1476
  * The two versions *should* be the same, but in cases where a browser "restores" a tab and
1406
1477
  re-inits an app without reloading the code itself, the upgrade check would miss the fact that
1407
1478
  the client remained on an older version.
1408
- * ⚠️ NOTE that a misconfigured build - where the client version is not set to the same value
1409
- as the server - would result in a false positive for an upgrade. The two should always match.
1410
- * Calls to `Promise.track()` that are rejected with an exception will be tracked with new
1411
- severity level of `TrackSeverity.ERROR`.
1479
+ * ⚠️ NOTE that a misconfigured build - where the client version is not set to the same value as
1480
+ the server - would result in a false positive for an upgrade. The two should always match.
1481
+ * Calls to `Promise.track()` that are rejected with an exception will be tracked with new severity
1482
+ level of `TrackSeverity.ERROR`.
1412
1483
 
1413
1484
  ### ⚙️ Typescript API Adjustments
1414
1485
 
@@ -1504,8 +1575,8 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1504
1575
  ### 🎁 New Features
1505
1576
 
1506
1577
  * Introduced a new "JSON Search" feature to the Hoist Admin Console, accessible from the Config,
1507
- User Preference, and JSON Blob tabs. Supports searching JSON values stored within these objects
1508
- to filter and match data using JSON Path expressions.
1578
+ User Preference, and JSON Blob tabs. Supports searching JSON values stored within these objects to
1579
+ filter and match data using JSON Path expressions.
1509
1580
  * ⚠️Requires `hoist-core >= 28.1` with new APIs for this (optional) feature to function.
1510
1581
  * Added new getters `StoreRecord.isDirty`, `Store.dirtyRecords`, and `Store.isDirty` to provide a
1511
1582
  more consistent API in the data package. The pre-existing `isModified` getters are retained as
@@ -1559,8 +1630,8 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1559
1630
  * `LoadingIndicator` is now cross-platform - update imports from
1560
1631
  `@xh/hoist/desktop/cmp/loadingindicator` or `@xh/hoist/mobile/cmp/loadingindicator` to
1561
1632
  `@xh/hoist/cmp/loadingindicator`.
1562
- * `TreeMap` and `SplitTreeMap` are now cross-platform and can be used in mobile applications.
1563
- Update imports from `@xh/hoist/desktop/cmp/treemap` to `@xh/hoist/cmp/treemap`.
1633
+ * `TreeMap` and `SplitTreeMap` are now cross-platform and can be used in mobile applications. Update
1634
+ imports from `@xh/hoist/desktop/cmp/treemap` to `@xh/hoist/cmp/treemap`.
1564
1635
  * Renamed `RefreshButton.model` prop to `target` for clarity and consistency.
1565
1636
 
1566
1637
  ### 🎁 New Features
@@ -1572,8 +1643,8 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1572
1643
  * Improved handling of delete / update collisions.
1573
1644
  * New `ViewManagerModel.settleTime` config, to allow persisted components such as dashboards to
1574
1645
  fully resolve their rendered state before capturing a baseline for dirty checks.
1575
- * Added `SessionStorageService` and associated persistence provider to support saving tab-local
1576
- data across reloads. Exact analog to `LocalStorageService`, but scoped to lifetime of current tab.
1646
+ * Added `SessionStorageService` and associated persistence provider to support saving tab-local data
1647
+ across reloads. Exact analog to `LocalStorageService`, but scoped to lifetime of current tab.
1577
1648
  * Added `AuthZeroClientConfig.audience` config to support improved flow for Auth0 OAuth clients that
1578
1649
  request access tokens. Specify your access token audience here to allow the client to fetch both
1579
1650
  ID and access tokens in a single request and to use refresh tokens to maintain access without
@@ -1589,8 +1660,8 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1589
1660
  * Fixed sizing and position of mobile `TabContainer` switcher, particularly when the switcher is
1590
1661
  positioned with `top` orientation.
1591
1662
  * Fixed styling of `ButtonGroup` in vertical orientations.
1592
- * Improved handling of calls to `DashContainerModel.loadStateAsync()` when the component has yet
1593
- to be rendered. Requested state updates are no longer dropped, and will be applied as soon as the
1663
+ * Improved handling of calls to `DashContainerModel.loadStateAsync()` when the component has yet to
1664
+ be rendered. Requested state updates are no longer dropped, and will be applied as soon as the
1594
1665
  component is ready to do so.
1595
1666
 
1596
1667
  ### ⚙️ Technical
@@ -1655,10 +1726,10 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1655
1726
  its bound `Persistable` when changes are detected.
1656
1727
  * In its constructor, `PersistenceProvider` also stores the initial state of its bound
1657
1728
  `Persistable` and clears its persisted state when structurally equal to the initial state.
1658
- * Updated persistable components to support specifying distinct `PersistOptions` for individual
1659
- bits of persisted state. E.g. you can now configure a `GroupingChooserModel` used within a
1660
- dashboard widget to persist its value to that particular widget's `DashViewModel` while saving the
1661
- user's favorites to a global preference.
1729
+ * Updated persistable components to support specifying distinct `PersistOptions` for individual bits
1730
+ of persisted state. E.g. you can now configure a `GroupingChooserModel` used within a dashboard
1731
+ widget to persist its value to that particular widget's `DashViewModel` while saving the user's
1732
+ favorites to a global preference.
1662
1733
 
1663
1734
  ### ⚙️ Typescript API Adjustments
1664
1735
 
@@ -1696,8 +1767,8 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1696
1767
 
1697
1768
  ### 💥 Breaking Changes (upgrade difficulty: 🟢 LOW - Hoist core update)
1698
1769
 
1699
- * Requires `hoist-core >= 24` to support batch upload of activity tracking logs to server and
1700
- new memory monitoring persistence.
1770
+ * Requires `hoist-core >= 24` to support batch upload of activity tracking logs to server and new
1771
+ memory monitoring persistence.
1701
1772
  * Replaced `AppState.INITIALIZING` with finer-grained states (not expected to impact most apps).
1702
1773
 
1703
1774
  ### 🎁 New Features
@@ -1731,8 +1802,8 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1731
1802
 
1732
1803
  ### 🎁 New Features
1733
1804
 
1734
- * `Markdown` now supports a `reactMarkdownOptions` prop to allow passing React Markdown
1735
- props to the underlying `reactMarkdown` instance.
1805
+ * `Markdown` now supports a `reactMarkdownOptions` prop to allow passing React Markdown props to the
1806
+ underlying `reactMarkdown` instance.
1736
1807
 
1737
1808
  ### ⚙️ Technical
1738
1809
 
@@ -1779,19 +1850,19 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1779
1850
  * Correlation IDs are assigned via:
1780
1851
  * `FetchOptions.correlationId` - specify an ID to be used on a particular request or `true`
1781
1852
  to use a UUID generated by Hoist (see `FetchService.genCorrelationId()`).
1782
- * `TrackOptions.correlationId` - specify an ID for a tracked activity, if not using the
1783
- new `FetchOptions.track` API (see below).
1853
+ * `TrackOptions.correlationId` - specify an ID for a tracked activity, if not using the new
1854
+ `FetchOptions.track` API (see below).
1784
1855
  * If set on a fetch request, Correlation IDs are passed through to downstream error reporting
1785
1856
  and are available for review in the Admin Console.
1786
1857
  * Added `FetchOptions.track` as streamlined syntax to track a request via Hoist activity tracking.
1787
1858
  Prefer this option (vs. a chained `.track()` call) to relay the request's `correlationId` and
1788
1859
  `loadSpec` automatically.
1789
- * Added `FetchOptions.asJson` to instruct `FetchService` to decode an HTTP response as JSON.
1790
- Note that `FetchService` methods suffixed with `Json` will set this property automatically.
1860
+ * Added `FetchOptions.asJson` to instruct `FetchService` to decode an HTTP response as JSON. Note
1861
+ that `FetchService` methods suffixed with `Json` will set this property automatically.
1791
1862
  * Added global interceptors on `FetchService`. See `FetchService.addInterceptor()`.
1792
1863
  * `GridModel` will now accept `contextMenu: false` to omit context menus.
1793
- * Added bindable `AppContainerModel.intializingLoadMaskMessage` to allow apps to customize the
1794
- load mask message shown during app initialization.
1864
+ * Added bindable `AppContainerModel.intializingLoadMaskMessage` to allow apps to customize the load
1865
+ mask message shown during app initialization.
1795
1866
  * Enhanced `select` component with new `emptyValue` prop, allowing for a custom value to be returned
1796
1867
  when the control is empty (vs `null`). Expected usage is `[]` when `enableMulti:true`.
1797
1868
  * Added `GroupingChooserModel.setDimensions()` API, to support updating available dimensions on an
@@ -1880,8 +1951,8 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1880
1951
  ### 💥 Breaking Changes (upgrade difficulty: 🟢 LOW - minor adjustments to client-side auth)
1881
1952
 
1882
1953
  * New `HoistAuthModel` exposes the client-side authentication lifecycle via a newly consolidated,
1883
- overridable API. This new API provides more easy customization of auth across all client-side
1884
- apps by being easily overrideable and specified via the `AppSpec` passed to `XH.renderApp()`.
1954
+ overridable API. This new API provides more easy customization of auth across all client-side apps
1955
+ by being easily overrideable and specified via the `AppSpec` passed to `XH.renderApp()`.
1885
1956
  * In most cases, upgrading should be a simple matter of moving code from `HoistAppModel` methods
1886
1957
  `preAuthInitAsync()` and `logoutAsync()` (removed by this change) to new `HoistAuthModel`
1887
1958
  methods `completeAuthAsync()` and `logoutAsync()`.
@@ -1894,9 +1965,9 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1894
1965
  ### 🐞 Bug Fixes
1895
1966
 
1896
1967
  * Updated `.xh-viewport` sizing styles and mobile `dialog` sizing to use `dvw/dvh` instead of prior
1897
- `svw/svh` - resolves edge case mobile issue where redirects back from an OAuth flow could leave
1898
- an unexpected gap across the bottom of the screen. Includes fallback for secure client browsers
1899
- that don't support dynamic viewport units.
1968
+ `svw/svh` - resolves edge case mobile issue where redirects back from an OAuth flow could leave an
1969
+ unexpected gap across the bottom of the screen. Includes fallback for secure client browsers that
1970
+ don't support dynamic viewport units.
1900
1971
  * Updated mobile `TabContainer` to flex properly within flexbox containers.
1901
1972
  * Fixed timing issue with missing validation for records added immediately to a new `Store`.
1902
1973
  * Fixed CSS bug in which date picker dates wrapped when `dateEditor` used in a grid in a dialog.
@@ -1905,8 +1976,8 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1905
1976
 
1906
1977
  ### 💥 Breaking Changes (upgrade difficulty: 🟢 TRIVIAL - dependencies only)
1907
1978
 
1908
- * Requires update to `hoist-dev-utils >= v9.0.0` with updated handling of static/public assets.
1909
- This should be a drop-in change for applications.
1979
+ * Requires update to `hoist-dev-utils >= v9.0.0` with updated handling of static/public assets. This
1980
+ should be a drop-in change for applications.
1910
1981
  * iOS < 16.4 is no longer supported, due to the use of complex RegExes in GFM parsing.
1911
1982
 
1912
1983
  ### 🎁 New Features
@@ -1915,8 +1986,8 @@ build. That said, we *strongly* recommend taking these same changes into your ap
1915
1986
 
1916
1987
  ### ✨ Styles
1917
1988
 
1918
- * Refactored CSS classnames applied to the primary application (☰) menu on desktop and mobile.
1919
- On both platforms the button itself now has an `xh-app-menu-button` class, the popover has
1989
+ * Refactored CSS classnames applied to the primary application (☰) menu on desktop and mobile. On
1990
+ both platforms the button itself now has an `xh-app-menu-button` class, the popover has
1920
1991
  `xh-app-menu-popover`, and the menu itself has `xh-app-menu`.
1921
1992
 
1922
1993
  ### ⚙️ Technical
@@ -2024,27 +2095,27 @@ for more details.
2024
2095
 
2025
2096
  * Removed support for passing a plain object to the `model` prop of Hoist Components (previously
2026
2097
  deprecated back in v58). Use the `modelConfig` prop instead.
2027
- * Removed the `multiFieldRenderer` utility function. This has been made internal and renamed
2028
- to `zoneGridRenderer` for exclusive use by the `ZoneGrid` component.
2029
- * Updated CSS variables related to the `ZoneGrid` component - vars formerly prefixed
2030
- by `--xh-grid-multifield` are now prefixed by `--xh-zone-grid`, several vars have been added, and
2098
+ * Removed the `multiFieldRenderer` utility function. This has been made internal and renamed to
2099
+ `zoneGridRenderer` for exclusive use by the `ZoneGrid` component.
2100
+ * Updated CSS variables related to the `ZoneGrid` component - vars formerly prefixed by
2101
+ `--xh-grid-multifield` are now prefixed by `--xh-zone-grid`, several vars have been added, and
2031
2102
  some defaults have changed.
2032
2103
  * Removed obsolete `AppSpec.isSSO` property in favor of two new properties `AppSpec.enableLogout`
2033
2104
  and `AppSpec.enableLoginForm`. This should have no effect on the vast majority of apps which had
2034
- `isSSO` set to `true`. For apps where `isSSO` was set to `false`, the new flags should be
2035
- used to more clearly indicate the desired auth behavior.
2105
+ `isSSO` set to `true`. For apps where `isSSO` was set to `false`, the new flags should be used to
2106
+ more clearly indicate the desired auth behavior.
2036
2107
 
2037
2108
  ### 🎁 New Features
2038
2109
 
2039
2110
  * Improved mobile viewport handling to ensure that both standard pages and full screen dialogs
2040
2111
  respect "safe area" boundaries, avoiding overlap with system UI elements such as the iOS task
2041
- switcher at the bottom of the screen. Also set background letterboxing color (to black) when
2042
- in landscape mode for a more resolved-looking layout.
2112
+ switcher at the bottom of the screen. Also set background letterboxing color (to black) when in
2113
+ landscape mode for a more resolved-looking layout.
2043
2114
  * Improved the inline grid `selectEditor` to commit its value to the backing record as soon as an
2044
2115
  option is selected, rather than waiting for the user to click away from the cell.
2045
2116
  * Improved the display of Role details in the Admin Console. The detail panel for the selected role
2046
- now includes a sub-tab listing all other roles inherited by the selected role, something that
2047
- was previously accessible only via the linked graph visualization.
2117
+ now includes a sub-tab listing all other roles inherited by the selected role, something that was
2118
+ previously accessible only via the linked graph visualization.
2048
2119
  * Added new `checkboxRenderer` for rendering booleans with a checkbox input look and feel.
2049
2120
  * Added new mobile `checkboxButton`, an alternate input component for toggling boolean values.
2050
2121
  * Added beta version of a new Hoist `security` package, providing built-in support for OAuth flows.