@xh/hoist 83.1.0 → 84.0.1

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 (250) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/admin/tabs/cluster/instances/logs/levels/LogLevelDialogModel.ts +106 -10
  3. package/admin/tabs/cluster/metrics/MetricsModel.ts +3 -3
  4. package/appcontainer/AppContainerModel.ts +1 -1
  5. package/appcontainer/README.md +20 -0
  6. package/assets.d.ts +34 -0
  7. package/build/types/cmp/ag-grid/AgGrid.d.ts +8 -19
  8. package/build/types/cmp/ag-grid/AgGridModel.d.ts +18 -5
  9. package/build/types/cmp/card/Card.d.ts +9 -4
  10. package/build/types/cmp/card/CardModel.d.ts +15 -2
  11. package/build/types/cmp/chart/Chart.d.ts +2 -2
  12. package/build/types/cmp/chart/ChartModel.d.ts +11 -1
  13. package/build/types/cmp/dataview/DataView.d.ts +4 -2
  14. package/build/types/cmp/dataview/DataViewModel.d.ts +16 -4
  15. package/build/types/cmp/filter/FilterChooserModel.d.ts +7 -1
  16. package/build/types/cmp/form/Form.d.ts +2 -1
  17. package/build/types/cmp/form/FormModel.d.ts +12 -0
  18. package/build/types/cmp/form/field/BaseFieldModel.d.ts +7 -0
  19. package/build/types/cmp/form/formfieldset/FormFieldSetModel.d.ts +7 -1
  20. package/build/types/cmp/grid/GridModel.d.ts +16 -1
  21. package/build/types/cmp/grid/GridSorter.d.ts +14 -0
  22. package/build/types/cmp/grid/Types.d.ts +18 -0
  23. package/build/types/cmp/grid/columns/Column.d.ts +40 -2
  24. package/build/types/cmp/grid/columns/ColumnGroup.d.ts +10 -0
  25. package/build/types/cmp/grouping/GroupingChooserModel.d.ts +9 -2
  26. package/build/types/cmp/layout/Box.d.ts +19 -7
  27. package/build/types/cmp/layout/Frame.d.ts +17 -5
  28. package/build/types/cmp/loadingindicator/LoadingIndicator.d.ts +6 -4
  29. package/build/types/cmp/pinpad/PinPadModel.d.ts +6 -1
  30. package/build/types/cmp/spinner/Spinner.d.ts +31 -10
  31. package/build/types/cmp/tab/TabContainerModel.d.ts +11 -0
  32. package/build/types/cmp/tab/TabModel.d.ts +7 -0
  33. package/build/types/cmp/tab/Types.d.ts +4 -0
  34. package/build/types/cmp/treemap/TreeMapModel.d.ts +3 -3
  35. package/build/types/cmp/viewmanager/ViewManagerModel.d.ts +9 -0
  36. package/build/types/cmp/zoneGrid/ZoneGridModel.d.ts +22 -3
  37. package/build/types/cmp/zoneGrid/impl/ZoneMapperModel.d.ts +6 -0
  38. package/build/types/core/HoistComponent.d.ts +29 -8
  39. package/build/types/core/HoistProps.d.ts +9 -3
  40. package/build/types/core/load/LoadSpec.d.ts +1 -1
  41. package/build/types/core/persist/provider/ViewManagerProvider.d.ts +7 -0
  42. package/build/types/data/Store.d.ts +35 -1
  43. package/build/types/data/StoreSelectionModel.d.ts +18 -2
  44. package/build/types/data/cube/Cube.d.ts +26 -6
  45. package/build/types/data/cube/Query.d.ts +10 -0
  46. package/build/types/data/cube/View.d.ts +21 -2
  47. package/build/types/data/cube/aggregate/Aggregator.d.ts +13 -0
  48. package/build/types/data/cube/aggregate/AverageAggregator.d.ts +1 -0
  49. package/build/types/data/cube/aggregate/AverageStrictAggregator.d.ts +1 -0
  50. package/build/types/data/cube/aggregate/ChildCountAggregator.d.ts +1 -0
  51. package/build/types/data/cube/aggregate/LeafCountAggregator.d.ts +1 -0
  52. package/build/types/data/cube/aggregate/MaxAggregator.d.ts +1 -0
  53. package/build/types/data/cube/aggregate/MinAggregator.d.ts +1 -0
  54. package/build/types/data/cube/aggregate/NullAggregator.d.ts +1 -0
  55. package/build/types/data/cube/aggregate/SingleAggregator.d.ts +1 -0
  56. package/build/types/data/cube/aggregate/SumAggregator.d.ts +1 -0
  57. package/build/types/data/cube/aggregate/SumStrictAggregator.d.ts +1 -0
  58. package/build/types/data/cube/aggregate/UniqueAggregator.d.ts +1 -0
  59. package/build/types/data/filter/BaseFilterFieldSpec.d.ts +9 -0
  60. package/build/types/data/filter/Types.d.ts +12 -0
  61. package/build/types/desktop/cmp/button/AppMenuButton.d.ts +5 -0
  62. package/build/types/desktop/cmp/button/Button.d.ts +5 -1
  63. package/build/types/desktop/cmp/dash/canvas/DashCanvasModel.d.ts +12 -3
  64. package/build/types/desktop/cmp/dash/container/DashContainerModel.d.ts +9 -0
  65. package/build/types/desktop/cmp/dock/DockViewModel.d.ts +7 -0
  66. package/build/types/desktop/cmp/filechooser/FileChooserModel.d.ts +8 -0
  67. package/build/types/desktop/cmp/grid/editors/BooleanEditor.d.ts +1 -0
  68. package/build/types/desktop/cmp/grid/editors/DateEditor.d.ts +1 -0
  69. package/build/types/desktop/cmp/grid/editors/NumberEditor.d.ts +1 -0
  70. package/build/types/desktop/cmp/grid/editors/SelectEditor.d.ts +1 -0
  71. package/build/types/desktop/cmp/grid/editors/TextAreaEditor.d.ts +1 -0
  72. package/build/types/desktop/cmp/grid/editors/TextEditor.d.ts +1 -0
  73. package/build/types/desktop/cmp/input/Picker.d.ts +1 -1
  74. package/build/types/desktop/cmp/input/SegmentedControl.d.ts +16 -2
  75. package/build/types/desktop/cmp/leftrightchooser/LeftRightChooserModel.d.ts +7 -0
  76. package/build/types/desktop/cmp/modalsupport/ModalSupportModel.d.ts +28 -2
  77. package/build/types/desktop/cmp/panel/Panel.d.ts +5 -2
  78. package/build/types/desktop/cmp/panel/PanelModel.d.ts +12 -2
  79. package/build/types/desktop/cmp/rest/RestGrid.d.ts +10 -0
  80. package/build/types/desktop/cmp/rest/RestGridModel.d.ts +9 -1
  81. package/build/types/desktop/cmp/toolbar/Toolbar.d.ts +4 -1
  82. package/build/types/format/FormatDate.d.ts +4 -4
  83. package/build/types/icon/Icon.d.ts +3 -0
  84. package/build/types/kit/blueprint/Wrappers.d.ts +12 -1
  85. package/build/types/mobile/cmp/navigator/NavigatorModel.d.ts +8 -0
  86. package/build/types/mobile/cmp/navigator/PageModel.d.ts +7 -0
  87. package/build/types/mobile/cmp/panel/DialogPanel.d.ts +0 -2
  88. package/build/types/security/BaseOAuthClient.d.ts +9 -0
  89. package/build/types/security/authzero/AuthZeroClient.d.ts +6 -0
  90. package/build/types/security/msal/MsalClient.d.ts +6 -0
  91. package/build/types/svc/FetchService.d.ts +10 -7
  92. package/build/types/svc/TraceService.d.ts +17 -2
  93. package/build/types/utils/async/Timer.d.ts +6 -0
  94. package/build/types/utils/js/LangUtils.d.ts +1 -1
  95. package/build/types/utils/js/TestUtils.d.ts +1 -1
  96. package/build/types/utils/react/index.d.ts +0 -1
  97. package/build/types/utils/telemetry/Span.d.ts +12 -2
  98. package/cmp/ag-grid/AgGrid.ts +8 -19
  99. package/cmp/ag-grid/AgGridModel.ts +18 -5
  100. package/cmp/card/Card.ts +9 -4
  101. package/cmp/card/CardModel.ts +15 -2
  102. package/cmp/chart/Chart.ts +2 -2
  103. package/cmp/chart/ChartModel.ts +11 -1
  104. package/cmp/dataview/DataView.ts +4 -2
  105. package/cmp/dataview/DataViewModel.ts +16 -4
  106. package/cmp/filter/FilterChooserModel.ts +7 -1
  107. package/cmp/form/Form.ts +2 -1
  108. package/cmp/form/FormModel.ts +12 -0
  109. package/cmp/form/README.md +13 -0
  110. package/cmp/form/field/BaseFieldModel.ts +7 -0
  111. package/cmp/form/formfieldset/FormFieldSetModel.ts +7 -1
  112. package/cmp/grid/Grid.scss +14 -8
  113. package/cmp/grid/GridModel.ts +16 -1
  114. package/cmp/grid/GridSorter.ts +14 -0
  115. package/cmp/grid/README.md +12 -0
  116. package/cmp/grid/Types.ts +18 -0
  117. package/cmp/grid/columns/Column.ts +40 -2
  118. package/cmp/grid/columns/ColumnGroup.ts +10 -0
  119. package/cmp/grouping/GroupingChooserModel.ts +9 -2
  120. package/cmp/layout/Box.ts +19 -7
  121. package/cmp/layout/Frame.ts +17 -5
  122. package/cmp/layout/README.md +16 -21
  123. package/cmp/loadingindicator/LoadingIndicator.scss +1 -1
  124. package/cmp/loadingindicator/LoadingIndicator.ts +11 -9
  125. package/cmp/pinpad/PinPadModel.ts +6 -1
  126. package/cmp/spinner/Spinner.scss +13 -0
  127. package/cmp/spinner/Spinner.ts +58 -20
  128. package/cmp/tab/TabContainerModel.ts +11 -0
  129. package/cmp/tab/TabModel.ts +7 -0
  130. package/cmp/tab/Types.ts +4 -0
  131. package/cmp/treemap/TreeMapModel.ts +3 -3
  132. package/cmp/viewmanager/ViewManagerModel.ts +9 -0
  133. package/cmp/zoneGrid/ZoneGridModel.ts +22 -3
  134. package/cmp/zoneGrid/impl/ZoneMapperModel.ts +6 -0
  135. package/core/ExceptionHandler.ts +1 -1
  136. package/core/HoistComponent.ts +36 -11
  137. package/core/HoistProps.ts +9 -3
  138. package/core/README.md +68 -6
  139. package/core/impl/InstanceManager.ts +1 -0
  140. package/core/load/LoadSpec.ts +1 -1
  141. package/core/persist/provider/ViewManagerProvider.ts +7 -0
  142. package/data/README.md +48 -124
  143. package/data/Store.ts +35 -1
  144. package/data/StoreSelectionModel.ts +18 -2
  145. package/data/cube/Cube.ts +26 -6
  146. package/data/cube/Query.ts +10 -0
  147. package/data/cube/README.md +236 -0
  148. package/data/cube/View.ts +21 -2
  149. package/data/cube/aggregate/Aggregator.ts +13 -0
  150. package/data/cube/aggregate/AverageAggregator.ts +1 -0
  151. package/data/cube/aggregate/AverageStrictAggregator.ts +1 -0
  152. package/data/cube/aggregate/ChildCountAggregator.ts +1 -0
  153. package/data/cube/aggregate/LeafCountAggregator.ts +1 -0
  154. package/data/cube/aggregate/MaxAggregator.ts +1 -0
  155. package/data/cube/aggregate/MinAggregator.ts +1 -0
  156. package/data/cube/aggregate/NullAggregator.ts +1 -0
  157. package/data/cube/aggregate/SingleAggregator.ts +1 -0
  158. package/data/cube/aggregate/SumAggregator.ts +1 -0
  159. package/data/cube/aggregate/SumStrictAggregator.ts +1 -0
  160. package/data/cube/aggregate/UniqueAggregator.ts +1 -0
  161. package/data/filter/BaseFilterFieldSpec.ts +9 -0
  162. package/data/filter/Types.ts +12 -0
  163. package/desktop/README.md +131 -9
  164. package/desktop/appcontainer/AboutDialog.ts +2 -0
  165. package/desktop/appcontainer/Banner.ts +5 -2
  166. package/desktop/appcontainer/ChangelogDialog.ts +1 -0
  167. package/desktop/appcontainer/ExceptionDialog.ts +4 -0
  168. package/desktop/appcontainer/ExceptionDialogDetails.ts +4 -1
  169. package/desktop/appcontainer/FeedbackDialog.ts +4 -1
  170. package/desktop/appcontainer/ImpersonationBar.ts +4 -0
  171. package/desktop/appcontainer/LockoutPanel.ts +4 -1
  172. package/desktop/appcontainer/LoginPanel.ts +7 -3
  173. package/desktop/appcontainer/Message.ts +9 -3
  174. package/desktop/appcontainer/OptionsDialog.ts +3 -1
  175. package/desktop/appcontainer/VersionBar.ts +1 -0
  176. package/desktop/appcontainer/suspend/IdlePanel.ts +4 -4
  177. package/desktop/appcontainer/suspend/SuspendPanel.ts +3 -0
  178. package/desktop/cmp/button/AppMenuButton.ts +5 -0
  179. package/desktop/cmp/button/Button.ts +14 -4
  180. package/desktop/cmp/dash/README.md +14 -0
  181. package/desktop/cmp/dash/canvas/DashCanvasModel.ts +12 -3
  182. package/desktop/cmp/dash/container/DashContainerModel.ts +9 -0
  183. package/desktop/cmp/dock/DockViewModel.ts +7 -0
  184. package/desktop/cmp/filechooser/FileChooserModel.ts +9 -2
  185. package/desktop/cmp/grid/editors/BooleanEditor.ts +1 -0
  186. package/desktop/cmp/grid/editors/DateEditor.ts +1 -0
  187. package/desktop/cmp/grid/editors/NumberEditor.ts +1 -0
  188. package/desktop/cmp/grid/editors/SelectEditor.ts +1 -0
  189. package/desktop/cmp/grid/editors/TextAreaEditor.ts +1 -0
  190. package/desktop/cmp/grid/editors/TextEditor.ts +1 -0
  191. package/desktop/cmp/input/Picker.ts +2 -2
  192. package/desktop/cmp/input/SegmentedControl.ts +20 -2
  193. package/desktop/cmp/leftrightchooser/LeftRightChooserModel.ts +7 -0
  194. package/desktop/cmp/modalsupport/ModalSupportModel.ts +31 -2
  195. package/desktop/cmp/panel/Panel.ts +29 -21
  196. package/desktop/cmp/panel/PanelModel.ts +12 -2
  197. package/desktop/cmp/panel/README.md +20 -0
  198. package/desktop/cmp/rest/RestGrid.ts +10 -0
  199. package/desktop/cmp/rest/RestGridModel.ts +9 -1
  200. package/desktop/cmp/toolbar/Toolbar.ts +9 -2
  201. package/desktop/cmp/viewmanager/ViewManager.ts +1 -1
  202. package/docs/README.md +9 -4
  203. package/docs/coding-conventions.md +29 -21
  204. package/docs/doc-registry.json +31 -15
  205. package/docs/planning/docs-roadmap-log.md +11 -0
  206. package/docs/planning/docs-roadmap.md +1 -0
  207. package/docs/upgrade-notes/v84-upgrade-notes.md +136 -0
  208. package/docs/version-compatibility.md +2 -0
  209. package/format/FormatDate.ts +4 -4
  210. package/icon/Icon.ts +9 -0
  211. package/icon/README.md +62 -22
  212. package/icon/index.ts +24 -0
  213. package/kit/README.md +8 -2
  214. package/kit/blueprint/Wrappers.ts +12 -1
  215. package/mcp/README.md +47 -26
  216. package/mcp/cli/ts.ts +39 -4
  217. package/mcp/data/ts-registry.ts +57 -17
  218. package/mcp/tools/typescript.ts +32 -4
  219. package/mobile/appcontainer/AboutDialog.ts +3 -0
  220. package/mobile/appcontainer/Banner.ts +2 -0
  221. package/mobile/appcontainer/ExceptionDialog.ts +4 -0
  222. package/mobile/appcontainer/ExceptionDialogDetails.ts +1 -0
  223. package/mobile/appcontainer/FeedbackDialog.ts +4 -1
  224. package/mobile/appcontainer/ImpersonationBar.ts +2 -0
  225. package/mobile/appcontainer/LockoutPanel.ts +2 -0
  226. package/mobile/appcontainer/LoginPanel.ts +7 -3
  227. package/mobile/appcontainer/Message.ts +9 -3
  228. package/mobile/appcontainer/OptionsDialog.ts +5 -1
  229. package/mobile/appcontainer/VersionBar.ts +1 -0
  230. package/mobile/appcontainer/suspend/IdlePanel.ts +5 -6
  231. package/mobile/appcontainer/suspend/SuspendPanel.ts +3 -0
  232. package/mobile/cmp/navigator/NavigatorModel.ts +8 -0
  233. package/mobile/cmp/navigator/PageModel.ts +7 -0
  234. package/mobile/cmp/panel/DialogPanel.ts +0 -2
  235. package/package.json +11 -11
  236. package/security/BaseOAuthClient.ts +9 -0
  237. package/security/authzero/AuthZeroClient.ts +6 -0
  238. package/security/msal/MsalClient.ts +6 -0
  239. package/styles/vars.scss +14 -0
  240. package/svc/FetchService.ts +25 -15
  241. package/svc/README.md +39 -9
  242. package/svc/TraceService.ts +69 -11
  243. package/utils/README.md +0 -1
  244. package/utils/async/Timer.ts +6 -0
  245. package/utils/js/LangUtils.ts +1 -1
  246. package/utils/js/TestUtils.ts +1 -1
  247. package/utils/react/index.ts +0 -1
  248. package/utils/telemetry/Span.ts +21 -4
  249. package/build/types/utils/react/ClassName.d.ts +0 -14
  250. package/utils/react/ClassName.ts +0 -24
@@ -394,20 +394,13 @@ element factory for functional-style rendering:
394
394
 
395
395
  ```typescript
396
396
  // Library/public component — exports both Component and factory
397
- export const [MyPanel, myPanel] = hoistCmp.withFactory<MyPanelProps>({
398
- displayName: 'MyPanel',
399
- model: uses(MyPanelModel),
400
- className: 'xh-my-panel',
397
+ export const [Grid, grid] = hoistCmp.withFactory<GridProps>({
398
+ displayName: 'Grid',
399
+ model: uses(GridModel),
400
+ className: 'xh-grid',
401
401
 
402
402
  render({model, className, ...props}, ref) {
403
- return frame({
404
- className,
405
- ref,
406
- item: grid({model: model.gridModel}),
407
- bbar: toolbar(
408
- button({text: 'Refresh', onClick: () => model.refreshAsync()})
409
- )
410
- });
403
+ // ... component render implementation
411
404
  }
412
405
  });
413
406
  ```
@@ -417,16 +410,14 @@ which returns only the element factory. Since these components are rendered via
417
410
  JSX), the PascalCase React component is not needed:
418
411
 
419
412
  ```typescript
420
- // App or impl component — only the factory is used
421
- const myDetail = hoistCmp.factory<MyDetailProps>({
422
- displayName: 'MyDetail',
423
- model: uses(MyDetailModel),
413
+ // App component — only the factory is used.
414
+ const tradeDetail = hoistCmp.factory<TradeDetailProps>({
415
+ displayName: 'TradeDetail',
416
+ model: uses(TradeDetailModel),
417
+ className: 'myapp-trade-detail',
424
418
 
425
- render({model}) {
426
- return vbox(
427
- label(model.title),
428
- grid({model: model.gridModel})
429
- );
419
+ render({model, className}) {
420
+ // ... component render implementation
430
421
  }
431
422
  });
432
423
  ```
@@ -461,6 +452,16 @@ render({model, className, ...rest}, ref) {
461
452
  Always set `displayName` on components. It appears in React DevTools and error messages. It should
462
453
  match the PascalCase export name.
463
454
 
455
+ ### `className`
456
+
457
+ Define a base CSS class in the component spec rather than hardcoding it inside the render function.
458
+ The framework automatically merges the spec's base class with any `className` passed by callers, so
459
+ every component consistently supports CSS class overrides without manual merging in render. The
460
+ merged value is provided to `render()` via props — apply it to the component's root element.
461
+
462
+ The `xh-` prefix is reserved for Hoist library components; applications should standardize on their
463
+ own app-specific prefix.
464
+
464
465
  ### Element Factories vs JSX
465
466
 
466
467
  Hoist strongly prefers element factory calls over JSX. Factories are functions that take a config
@@ -607,6 +608,13 @@ Public APIs use TSDoc comments (`/** ... */`). TSDoc syntax is checked by ESLint
607
608
  loadData(rawData: PlainObject[], rawSummaryData?: PlainObject) { ... }
608
609
  ```
609
610
 
611
+ ### Avoid Unicode in Code Comments
612
+
613
+ Use plain ASCII in code comments and JSDoc. In particular, use ` - ` (spaced hyphen) rather
614
+ than em dashes (`—`) for parenthetical asides. Unicode characters can cause encoding issues with
615
+ tooling (e.g. grep, MCP tools) and offer no benefit in a monospace code context. Em dashes are
616
+ fine in prose-style `.md` documentation where they render naturally.
617
+
610
618
  ### Observable Annotation Comments
611
619
 
612
620
  When a property's observable behavior is significant to callers, annotate it in a comment:
@@ -48,8 +48,16 @@
48
48
  "title": "Data Layer",
49
49
  "mcpCategory": "package",
50
50
  "viewerCategory": "core",
51
- "description": "Observable data layer with filtering, validation, and aggregation.",
52
- "keywords": ["Store", "StoreRecord", "Field", "Filter", "FilterChooserModel", "FilterFieldSpec", "Cube", "View", "tree data", "loadData", "processRawData"]
51
+ "description": "Observable data layer with Store, Field, filtering, validation, and tree data.",
52
+ "keywords": ["Store", "StoreRecord", "Field", "Filter", "FilterChooserModel", "FilterFieldSpec", "tree data", "loadData", "processRawData"]
53
+ },
54
+ {
55
+ "id": "data/cube/README.md",
56
+ "title": "Cube Aggregation",
57
+ "mcpCategory": "package",
58
+ "viewerCategory": "core",
59
+ "description": "Client-side OLAP-style aggregation with dimensions, measures, Views, and Queries.",
60
+ "keywords": ["Cube", "CubeField", "View", "Query", "QueryConfig", "aggregator", "dimension", "measure", "SUM", "AVG", "includeRoot", "includeLeaves", "createView"]
53
61
  },
54
62
  {
55
63
  "id": "svc/README.md",
@@ -137,7 +145,7 @@
137
145
  "mcpCategory": "package",
138
146
  "viewerCategory": "desktop",
139
147
  "description": "Desktop-specific components and app container.",
140
- "keywords": ["desktop components", "Blueprint wrappers", "Select", "DateInput", "NumberInput", "TextArea", "Picker", "Checkbox", "SwitchInput", "RadioInput", "Slider", "CodeInput", "JsonInput", "LeftRightChooser", "dropdown"]
148
+ "keywords": ["desktop components", "Blueprint wrappers", "dialog", "modal", "toolbar", "Select", "DateInput", "NumberInput", "TextArea", "Picker", "Checkbox", "SwitchInput", "RadioInput", "Slider", "CodeInput", "JsonInput", "LeftRightChooser", "dropdown"]
141
149
  },
142
150
  {
143
151
  "id": "mobile/README.md",
@@ -360,7 +368,7 @@
360
368
  "title": "Changelog Format",
361
369
  "mcpCategory": "devops",
362
370
  "viewerCategory": "devops",
363
- "description": "CHANGELOG entry format conventions and section headers.",
371
+ "description": "Conventions for writing and reviewing CHANGELOG entries in the hoist-react library CHANGELOG — section headers, voice/tense, difficulty ratings, breaking changes, libraries.",
364
372
  "keywords": ["changelog", "CHANGELOG", "format", "conventions", "release notes", "versioning", "breaking changes", "upgrade difficulty", "section headers", "entry structure"]
365
373
  },
366
374
  {
@@ -369,7 +377,7 @@
369
377
  "mcpCategory": "devops",
370
378
  "viewerCategory": "upgrade",
371
379
  "description": "Upgrade guide from v72.x to v73.0.1. Low difficulty — hoist-core >= 31, makeObservable enforcement, ESLint 9.",
372
- "keywords": ["upgrade", "migration", "breaking changes", "v73", "v72", "makeObservable", "eslint", "admin", "commitOnChange"]
380
+ "keywords": ["upgrade", "migration", "breaking changes", "v73", "v72"]
373
381
  },
374
382
  {
375
383
  "id": "docs/upgrade-notes/v74-upgrade-notes.md",
@@ -377,7 +385,7 @@
377
385
  "mcpCategory": "devops",
378
386
  "viewerCategory": "upgrade",
379
387
  "description": "Upgrade guide from v73.x to v74.1.2. Low difficulty — ViewManagerModel.settleTime removal, ChartModel.showContextMenu replaced.",
380
- "keywords": ["upgrade", "migration", "breaking changes", "v74", "v73", "settleTime", "showContextMenu", "contextMenu", "ViewManager", "ChartModel"]
388
+ "keywords": ["upgrade", "migration", "breaking changes", "v74", "v73", "settleTime", "showContextMenu"]
381
389
  },
382
390
  {
383
391
  "id": "docs/upgrade-notes/v75-upgrade-notes.md",
@@ -385,7 +393,7 @@
385
393
  "mcpCategory": "devops",
386
394
  "viewerCategory": "upgrade",
387
395
  "description": "Upgrade guide from v74.x to v75.0.1. Low difficulty — removed deprecated APIs, Cube View row data changes.",
388
- "keywords": ["upgrade", "migration", "breaking changes", "v75", "v74", "deprecation", "ViewRowData", "cube"]
396
+ "keywords": ["upgrade", "migration", "breaking changes", "v75", "v74", "ViewRowData"]
389
397
  },
390
398
  {
391
399
  "id": "docs/upgrade-notes/v76-upgrade-notes.md",
@@ -393,7 +401,7 @@
393
401
  "mcpCategory": "devops",
394
402
  "viewerCategory": "upgrade",
395
403
  "description": "Upgrade guide from v75.x to v76.0.0. Medium difficulty — AG Grid v31→v34, new module registration.",
396
- "keywords": ["upgrade", "migration", "breaking changes", "v76", "v75", "ag-grid", "ag grid", "module registration", "groupRowRenderer"]
404
+ "keywords": ["upgrade", "migration", "breaking changes", "v76", "v75", "groupRowRenderer"]
397
405
  },
398
406
  {
399
407
  "id": "docs/upgrade-notes/v77-upgrade-notes.md",
@@ -401,7 +409,7 @@
401
409
  "mcpCategory": "devops",
402
410
  "viewerCategory": "upgrade",
403
411
  "description": "Upgrade guide from v76.x to v77.1.1. Medium difficulty — Highcharts v12, XSS protection API rename.",
404
- "keywords": ["upgrade", "migration", "breaking changes", "v77", "v76", "highcharts", "xss", "enableXssProtection"]
412
+ "keywords": ["upgrade", "migration", "breaking changes", "v77", "v76", "disableXssProtection"]
405
413
  },
406
414
  {
407
415
  "id": "docs/upgrade-notes/v78-upgrade-notes.md",
@@ -409,7 +417,7 @@
409
417
  "mcpCategory": "devops",
410
418
  "viewerCategory": "upgrade",
411
419
  "description": "Upgrade guide from v77.x to v78.0.0. Trivial difficulty.",
412
- "keywords": ["upgrade", "migration", "breaking changes", "v78", "v77", "setColumnState"]
420
+ "keywords": ["upgrade", "migration", "breaking changes", "v78", "v77"]
413
421
  },
414
422
  {
415
423
  "id": "docs/upgrade-notes/v79-upgrade-notes.md",
@@ -417,7 +425,7 @@
417
425
  "mcpCategory": "devops",
418
426
  "viewerCategory": "upgrade",
419
427
  "description": "Upgrade guide from v78.x to v79.0.0. Medium difficulty.",
420
- "keywords": ["upgrade", "migration", "breaking changes", "v79", "v78", "Blueprint 6", "moduleResolution"]
428
+ "keywords": ["upgrade", "migration", "breaking changes", "v79", "v78"]
421
429
  },
422
430
  {
423
431
  "id": "docs/upgrade-notes/v80-upgrade-notes.md",
@@ -425,7 +433,7 @@
425
433
  "mcpCategory": "devops",
426
434
  "viewerCategory": "upgrade",
427
435
  "description": "Upgrade guide from v79.x to v80.0.0. Low difficulty.",
428
- "keywords": ["upgrade", "migration", "breaking changes", "v80", "v79", "FormField", "appLoadObserver"]
436
+ "keywords": ["upgrade", "migration", "breaking changes", "v80", "v79", "appLoadModel"]
429
437
  },
430
438
  {
431
439
  "id": "docs/upgrade-notes/v81-upgrade-notes.md",
@@ -433,7 +441,7 @@
433
441
  "mcpCategory": "devops",
434
442
  "viewerCategory": "upgrade",
435
443
  "description": "Upgrade guide from v80.x to v81.0.2. Low difficulty.",
436
- "keywords": ["upgrade", "migration", "breaking changes", "v81", "v80", "Panel CSS", "BpCard"]
444
+ "keywords": ["upgrade", "migration", "breaking changes", "v81", "v80"]
437
445
  },
438
446
  {
439
447
  "id": "docs/upgrade-notes/v82-upgrade-notes.md",
@@ -441,7 +449,7 @@
441
449
  "mcpCategory": "devops",
442
450
  "viewerCategory": "upgrade",
443
451
  "description": "Upgrade guide from v81.x to v82.0.0. Low difficulty.",
444
- "keywords": ["upgrade", "migration", "breaking changes", "v82", "v81", "Picker", "DashCanvas", "MCP", "Filter"]
452
+ "keywords": ["upgrade", "migration", "breaking changes", "v82", "v81", "xh-popup--framed"]
445
453
  },
446
454
  {
447
455
  "id": "docs/upgrade-notes/v83-upgrade-notes.md",
@@ -449,7 +457,15 @@
449
457
  "mcpCategory": "devops",
450
458
  "viewerCategory": "upgrade",
451
459
  "description": "Upgrade guide from v82.x to v83.0.0. Low difficulty.",
452
- "keywords": ["upgrade", "migration", "breaking changes", "v83", "v82", "TraceService", "tracing", "OTEL", "static defaults", "GridModel", "downloadBlob", "downloadViaUrl", "downloadjs", "SegmentedControl", "CheckboxButton"]
460
+ "keywords": ["upgrade", "migration", "breaking changes", "v83", "v82", "downloadjs"]
461
+ },
462
+ {
463
+ "id": "docs/upgrade-notes/v84-upgrade-notes.md",
464
+ "title": "v84 Upgrade Notes",
465
+ "mcpCategory": "devops",
466
+ "viewerCategory": "upgrade",
467
+ "description": "Upgrade guide from v83.x to v84.0.0. Low difficulty.",
468
+ "keywords": ["upgrade", "migration", "breaking changes", "v84", "v83", "getClassName"]
453
469
  }
454
470
  ]
455
471
  }
@@ -503,3 +503,14 @@
503
503
  - Added Quick Reference entry for "Customize colors, fonts, spacing, or theme"
504
504
  - Removed `/styles/` from "Other Packages" paragraph (now has a dedicated README)
505
505
  - Added `styles` entry to `mcp/data/doc-registry.ts` with CSS/theme/BEM keywords
506
+
507
+ ### 2026-04-14
508
+ - Split Cube documentation out of `data/README.md` into dedicated `data/cube/README.md`:
509
+ - Expanded querying section with patterns for grand totals (`includeRoot`), leaf drill-down
510
+ (`includeLeaves`), programmatic leaf access (`provideLeaves`), flat aggregation, dynamic
511
+ query updates (`updateQuery`/`setFilter`), and one-shot `executeQuery()` usage
512
+ - Added table of contents, overview with class table, and Related Packages section
513
+ - Data README retains a brief pointer to the Cube doc
514
+ - Updated `docs/README.md` index: added `/data/cube/` to Quick Reference and Core Framework table
515
+ - Added `data/cube/README.md` entry to `docs/doc-registry.json`
516
+ - Added `/data/cube/` entry to `docs/planning/docs-roadmap.md` Priority 1 table
@@ -15,6 +15,7 @@ is essential for working effectively with any part of hoist-react.
15
15
  | `/` (root) | 1 | AGENTS.md provides AI-focused project guidance | [Done](../../AGENTS.md) |
16
16
  | `/core/` | 48 | HoistBase, HoistModel, HoistService, XH singleton, component factory | [Done](../../core/README.md) |
17
17
  | `/data/` | 45 | Store, StoreRecord, Field, Filter, validation - data layer infrastructure | [Done](../../data/README.md) |
18
+ | `/data/cube/` | 10 | Cube aggregation engine - dimensions, measures, Views, Queries | [Done](../../data/cube/README.md) |
18
19
  | `/svc/` | 20 | Services architecture and built-in services (Fetch, Config, Pref, etc.) | [Done](../../svc/README.md) |
19
20
 
20
21
  ## Priority 2 - Component System
@@ -0,0 +1,136 @@
1
+ # Hoist React v84 Upgrade Notes
2
+
3
+ > **From:** v83.x → v84.0.0 | **Released:** 2026-04-15 | **Difficulty:** 🟢 LOW
4
+
5
+ ## Overview
6
+
7
+ Hoist React v84 is a major release paired with hoist-core v38. The headline additions are
8
+ FontAwesome v7, an icon-based `Spinner` replacement, client-side span sampling for `TraceService`,
9
+ and a new typed `defaults` mechanism for `hoistCmp` components.
10
+
11
+ The most significant app-level impacts are:
12
+
13
+ - **`hoist-core >= 38.0` required** — paired major release
14
+ - **`getClassName()` removed** — unlikely to affect apps (no known usage), but check imports
15
+ - **FontAwesome v7** — visual tweaks to icons; no app changes expected
16
+
17
+ ## Prerequisites
18
+
19
+ Before starting, ensure:
20
+
21
+ - [ ] Running hoist-react v83.x
22
+ - [ ] **hoist-core** upgraded to >= v38.0 (**required** — paired major release)
23
+
24
+ ## Upgrade Steps
25
+
26
+ ### 1. Update `hoistCoreVersion` in `gradle.properties`
27
+
28
+ Hoist React v84 **requires** hoist-core >= v38.0.
29
+
30
+ **File:** `gradle.properties`
31
+
32
+ Before:
33
+ ```properties
34
+ hoistCoreVersion=37.0.2
35
+ ```
36
+
37
+ After:
38
+ ```properties
39
+ hoistCoreVersion=38.0.0
40
+ ```
41
+
42
+ ### 2. Update `package.json`
43
+
44
+ Bump hoist-react to v84.
45
+
46
+ **File:** `package.json`
47
+
48
+ Before:
49
+ ```json
50
+ "@xh/hoist": "~83.1.0"
51
+ ```
52
+
53
+ After:
54
+ ```json
55
+ "@xh/hoist": "~84.0.0"
56
+ ```
57
+
58
+ Then run `yarn install` or `npm install` to update dependencies.
59
+
60
+ ### 3. Remove `getClassName` Import (if applicable)
61
+
62
+ The `getClassName()` utility has been removed from `@xh/hoist/utils/react`. This function had no
63
+ remaining usages in the framework, and no known app usages. If your app imported it directly, use
64
+ the `className` spec field on `hoistCmp.factory()` / `hoistCmp.withFactory()` instead — it handles
65
+ base class merging automatically.
66
+
67
+ **Find affected files:**
68
+ ```bash
69
+ grep -rE "getClassName.*from '@xh/hoist" client-app/src/
70
+ ```
71
+
72
+ Note: apps that define their own local `getClassName` helpers (not imported from `@xh/hoist`) are
73
+ not affected.
74
+
75
+ ### 4. Review FontAwesome v7 Icon Changes (visual only)
76
+
77
+ FontAwesome has been updated from v6 to v7. All previously supported icons remain available. The
78
+ upgrade brings subtle visual tweaks and performance optimizations — no API changes are required.
79
+
80
+ Review any areas of your app where precise icon sizing or spacing is critical, as minor visual
81
+ adjustments to individual glyphs are possible across major FA versions.
82
+
83
+ If your app depends on `@fortawesome/free-brands-svg-icons` (for brand icons like GitHub, Slack,
84
+ etc.), consider updating it to v7 as well to keep icon versions consistent:
85
+
86
+ ```json
87
+ "@fortawesome/free-brands-svg-icons": "^7.2.0"
88
+ ```
89
+
90
+ ### 5. Migrate Deprecated Static Properties to `static defaults` (if not done in v83)
91
+
92
+ If you have not yet migrated from the deprecated ad-hoc static properties on `GridModel`,
93
+ `ChartModel`, `ExceptionHandler`, and `FetchService`, do so now. These were deprecated in v83 and
94
+ are scheduled for removal in v85. See the
95
+ [v83 upgrade notes](./v83-upgrade-notes.md#3-migrate-deprecated-static-properties-to-static-defaults-recommended)
96
+ for detailed before/after examples.
97
+
98
+ **Find affected files:**
99
+ ```bash
100
+ grep -rE "GridModel\.(DEFAULT_AUTOSIZE_MODE|DEFAULT_RESTORE_DEFAULTS_WARNING|defaultContextMenu)|ChartModel\.defaultContextMenu|ExceptionHandler\.(REDACT_PATHS|ALERT_TYPE|TOAST_PROPS)|FetchService\.(autoGenCorrelationIds|genCorrelationId|correlationIdHeaderKey)" client-app/src/
101
+ ```
102
+
103
+ ### 6. Migrate Deprecated Filter Utilities (if not done in v83)
104
+
105
+ If you have not yet migrated from the deprecated standalone filter utilities (`withFilterByField`,
106
+ `withFilterByKey`, `replaceFilterByKey`, `withFilterByTypes`), do so now. These were deprecated
107
+ in v82 and are scheduled for removal in v85. See the
108
+ [v82 upgrade notes](./v82-upgrade-notes.md#5-migrate-deprecated-filter-utilities) for detailed
109
+ before/after examples.
110
+
111
+ **Find affected files:**
112
+ ```bash
113
+ grep -rE "withFilterByField|withFilterByKey|replaceFilterByKey|withFilterByTypes" client-app/src/
114
+ ```
115
+
116
+ ## Verification Checklist
117
+
118
+ After completing all steps:
119
+
120
+ - [ ] `hoistCoreVersion` in `gradle.properties` is >= 38.0.0
121
+ - [ ] `yarn install` / `npm install` completes without errors
122
+ - [ ] `yarn lint` / `npm run lint` passes (or only pre-existing warnings remain)
123
+ - [ ] `npx tsc --noEmit` passes
124
+ - [ ] Application loads without console errors
125
+ - [ ] No `getClassName` imports from hoist-react remain:
126
+ `grep -rE "getClassName.*from '@xh/hoist" client-app/src/`
127
+ - [ ] Icons render correctly throughout the app (spot-check grids, toolbars, menus)
128
+ - [ ] Spinner renders correctly on loading screens
129
+ - [ ] No deprecated static property warnings in console:
130
+ `grep -rE "DEFAULT_AUTOSIZE_MODE|DEFAULT_RESTORE_DEFAULTS_WARNING|defaultContextMenu|REDACT_PATHS|ALERT_TYPE|TOAST_PROPS" client-app/src/`
131
+ - [ ] No deprecated filter utilities remain:
132
+ `grep -rE "withFilterByField|withFilterByKey|replaceFilterByKey|withFilterByTypes" client-app/src/`
133
+
134
+ ## Reference
135
+
136
+ - [Toolbox on GitHub](https://github.com/xh/toolbox) — canonical example of a Hoist app
@@ -54,6 +54,7 @@ Verified against both hoist-react and hoist-core changelogs.
54
54
 
55
55
  | hoist-react | Min Core Required | Recommended Core | Max Core Tested | Notes | Upgrade |
56
56
  |---|---|---|---|---|---|
57
+ | 84.0 | 38.0 | | 38.0 | Span sampling, OTEL tag alignment, log level overrides | [Notes](./upgrade-notes/v84-upgrade-notes.md) |
57
58
  | 83.0 | 37.0 | | 37.0 | OTEL tracing, static defaults, metrics publishing | [Notes](./upgrade-notes/v83-upgrade-notes.md) |
58
59
  | 82.0 | -- | 36.3 | 36.3 | Admin Metrics tab | [Notes](./upgrade-notes/v82-upgrade-notes.md) |
59
60
  | 81.0 | 36.1 | | 36.2 | Efficient identity init | [Notes](./upgrade-notes/v81-upgrade-notes.md) |
@@ -108,6 +109,7 @@ to find the minimum hoist-react version for a given core release.
108
109
 
109
110
  | hoist-core | Min hoist-react | Notes |
110
111
  |---|---|---|
112
+ | 38.0 | 84.0 | Span sampling, OTEL tag alignment, log level overrides |
111
113
  | 37.0 | 83.0 | OTEL tracing, metrics publishing |
112
114
  | 36.3 | 82.0 recommended | Admin Metrics tab |
113
115
  | 36.1 | 81.0 | Efficient identity init |
@@ -30,7 +30,7 @@ export interface DateFormatOptions extends FormatOptions<DateLike> {
30
30
 
31
31
  /**
32
32
  * A MomentJs format string. Wrap literal text in square brackets to prevent
33
- * interpretation as format tokens e.g. `'[today at] h:mma'`.
33
+ * interpretation as format tokens - e.g. `'[today at] h:mma'`.
34
34
  */
35
35
  fmt?: string;
36
36
  }
@@ -99,19 +99,19 @@ export function fmtTime(v: DateLike, opts?: DateFormatOptions | string) {
99
99
  export interface CompactDateFormatOptions extends FormatOptions<DateLike> {
100
100
  /**
101
101
  * Format for date matching current day, defaults to 'hh:mma' for dates, 'MMM D' for
102
- * LocalDates. Wrap literal text in square brackets e.g. `'[today]'` or `'[today at] h:mma'`.
102
+ * LocalDates. Wrap literal text in square brackets - e.g. `'[today]'` or `'[today at] h:mma'`.
103
103
  */
104
104
  sameDayFmt?: string;
105
105
 
106
106
  /**
107
107
  * Format for dates within the number of months specified by the distantThreshold, defaults
108
- * to 'MMM D'. Wrap literal text in square brackets e.g. `'[recent]'`.
108
+ * to 'MMM D'. Wrap literal text in square brackets - e.g. `'[recent]'`.
109
109
  */
110
110
  nearFmt?: string;
111
111
 
112
112
  /**
113
113
  * Format for dates beyond number of months specified by the distantThreshold, defaults to
114
- * 'YYYY-MM-DD'. Wrap literal text in square brackets e.g. `'[older]'`.
114
+ * 'YYYY-MM-DD'. Wrap literal text in square brackets - e.g. `'[older]'`.
115
115
  */
116
116
  distantFmt?: string;
117
117
 
package/icon/Icon.ts CHANGED
@@ -278,6 +278,9 @@ export const Icon = {
278
278
  circle(p?: IconProps) {
279
279
  return Icon.icon({...p, iconName: 'circle'});
280
280
  },
281
+ circleNotch(p?: IconProps) {
282
+ return Icon.icon({...p, iconName: 'circle-notch'});
283
+ },
281
284
  clipboard(p?: IconProps) {
282
285
  return Icon.icon({...p, iconName: 'clipboard'});
283
286
  },
@@ -663,6 +666,12 @@ export const Icon = {
663
666
  spinner(p?: IconProps) {
664
667
  return Icon.icon({...p, iconName: 'spinner'});
665
668
  },
669
+ spinnerScale(p?: IconProps) {
670
+ return Icon.icon({...p, iconName: 'spinner-scale'});
671
+ },
672
+ spinnerThird(p?: IconProps) {
673
+ return Icon.icon({...p, iconName: 'spinner-third'});
674
+ },
666
675
  square(p?: IconProps) {
667
676
  return Icon.icon({...p, iconName: 'square'});
668
677
  },
package/icon/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Icon
2
2
 
3
- Hoist's icon system provides a factory-based API for rendering [FontAwesome](https://fontawesome.com/)
4
- Pro icons throughout an application. Rather than importing individual FA icon definitions in each
5
- file that uses them, applications use the `Icon` singleton — a centralized catalog of 150+ direct
6
- icon factories and ~40 semantic aliases, all pre-registered with the FA library in four weight
7
- variants (regular, solid, light, thin).
3
+ Hoist's icon system provides a factory-based API for
4
+ rendering [FontAwesome](https://fontawesome.com/) Pro icons throughout an application. Rather than
5
+ importing individual FA icon definitions in each file that uses them, applications use the `Icon`
6
+ singleton — a centralized catalog of 150+ direct icon factories and ~40 semantic aliases, all
7
+ pre-registered with the FA library in four weight variants (regular, solid, light, thin).
8
8
 
9
9
  ## Overview
10
10
 
@@ -103,6 +103,45 @@ Icon.star({rotation: 90}) // rotated 90 degrees
103
103
  Icon.warning({bounce: true}) // bouncing warning
104
104
  ```
105
105
 
106
+ ### Spinner Component
107
+
108
+ The `Spinner` component (`cmp/spinner/`) renders an animated FA icon for use by `Mask` and
109
+ `LoadingIndicator`. The rotation animation is applied via Hoist-owned CSS (`@keyframes xh-spin`
110
+ on `.xh-spinner`) rather than FA's animation props. This ensures the spinner remains functional
111
+ when the OS-level `prefers-reduced-motion` preference is enabled (FA disables all its animations
112
+ in that case) and keeps performance predictable in remote desktop environments such as Citrix.
113
+
114
+ Spinner ships with several pre-registered icon choices - `faSpinnerThird`, `faCircleNotch`, and
115
+ `faSpinnerScale` - all available in all four weight variants. The default icon and prefix can be
116
+ configured globally via `Spinner.defaults`, typically set in an app's `Bootstrap.ts`:
117
+
118
+ ```typescript
119
+ import {Spinner} from '@xh/hoist/cmp/spinner';
120
+
121
+ // Override icon and/or weight globally
122
+ Spinner.defaults.iconName = 'circle-notch';
123
+ Spinner.defaults.prefix = 'far';
124
+ ```
125
+
126
+ | Default | Type | Default | Description |
127
+ |--------------------------------|-------------------|-------------------|------------------------------|
128
+ | `Spinner.defaults.iconName` | `IconName` | `'spinner-third'` | FA icon name for the spinner |
129
+ | `Spinner.defaults.prefix` | `HoistIconPrefix` | `'fal'` | FA icon weight/prefix |
130
+ | `Spinner.defaults.usePng` | `boolean` | `false` | Fall back to animated PNG |
131
+
132
+ Per-instance overrides can be passed as props to `spinner()` or via `LoadingIndicator`'s `spinner`
133
+ prop, which accepts either `true` (use defaults) or a `SpinnerProps` object:
134
+
135
+ ```typescript
136
+ loadingIndicator({
137
+ bind: myTask,
138
+ spinner: {iconName: 'circle-notch'}
139
+ })
140
+ ```
141
+
142
+ A legacy PNG fallback is retained for environments where even CSS animations may be problematic.
143
+ Set `Spinner.defaults.usePng = true` globally to revert to the original animated PNG behavior.
144
+
106
145
  ### Weight Variants
107
146
 
108
147
  ```typescript
@@ -191,16 +230,16 @@ else that accepts an icon element.
191
230
 
192
231
  ## IconProps Reference
193
232
 
194
- | Prop | Type | Description |
195
- |------|------|-------------|
196
- | `iconName` | `IconName` | FA icon name (e.g. `'check'`, `'gear'`). Required for `Icon.icon()`, provided automatically by named factories |
197
- | `prefix` | `HoistIconPrefix` | Weight variant: `'far'` (regular, default), `'fas'` (solid), `'fal'` (light), `'fat'` (thin), `'fab'` (brands) |
198
- | `intent` | `Intent` | Applies `xh-intent-{intent}` CSS class for semantic coloring |
199
- | `title` | `string` | Tooltip text rendered as SVG `<title>` |
200
- | `size` | `string` | FA size: `'2xs'` through `'10x'` |
201
- | `asHtml` | `boolean` | Return raw SVG string instead of React element |
202
- | `className` | `string` | Additional CSS class(es) |
203
- | `omit` | `Thunkable<boolean>` | Skip rendering this icon when true |
233
+ | Prop | Type | Description |
234
+ |-------------|----------------------|----------------------------------------------------------------------------------------------------------------|
235
+ | `iconName` | `IconName` | FA icon name (e.g. `'check'`, `'gear'`). Required for `Icon.icon()`, provided automatically by named factories |
236
+ | `prefix` | `HoistIconPrefix` | Weight variant: `'far'` (regular, default), `'fas'` (solid), `'fal'` (light), `'fat'` (thin), `'fab'` (brands) |
237
+ | `intent` | `Intent` | Applies `xh-intent-{intent}` CSS class for semantic coloring |
238
+ | `title` | `string` | Tooltip text rendered as SVG `<title>` |
239
+ | `size` | `string` | FA size: `'2xs'` through `'10x'` |
240
+ | `asHtml` | `boolean` | Return raw SVG string instead of React element |
241
+ | `className` | `string` | Additional CSS class(es) |
242
+ | `omit` | `Thunkable<boolean>` | Skip rendering this icon when true |
204
243
 
205
244
  ## Serialization
206
245
 
@@ -258,15 +297,14 @@ packages — don't reach for a different library.
258
297
 
259
298
  ### Referencing Icons From the Wrong FontAwesome Version
260
299
 
261
- FontAwesome updates frequently and adds new icons with each release. When browsing the
262
- FA site to find an icon for your app, use
263
- the version picker to filter results to the version Hoist currently depends on (check
264
- `@fortawesome/pro-regular-svg-icons` in `package.json`). Attempting to import an icon that only
265
- exists in a newer FA version will fail at build time. Hoist endeavors to keep its FA dependency up
266
- to date, but always verify the version before spending time wiring up a new icon.
300
+ FontAwesome updates frequently and adds new icons with each release. When browsing the FA site to
301
+ find an icon for your app, use the version picker to filter results to the version Hoist currently
302
+ depends on (check `@fortawesome/pro-regular-svg-icons` in `package.json`). Attempting to import an
303
+ icon that only exists in a newer FA version will fail at build time. Hoist endeavors to keep its FA
304
+ dependency up to date, but always verify the version before spending time wiring up a new icon.
267
305
 
268
306
  * [FA icon search (latest version)](https://fontawesome.com/search?ip=classic&s=regular)
269
- * [FA icon search (v6)](https://fontawesome.com/v6/search?ip=classic&s=regular)
307
+ * [FA icon search (v7)](https://fontawesome.com/v7/search?ip=classic&s=regular)
270
308
 
271
309
  ### Using Brand Icons Without Registration
272
310
 
@@ -276,6 +314,8 @@ with Hoist by default.
276
314
 
277
315
  ## Related Packages
278
316
 
317
+ - [`/cmp/spinner/`](../cmp/spinner/) — Spinner component renders an animated FA icon, configurable
318
+ via static defaults on the `Spinner` class
279
319
  - [`/desktop/`](../desktop/README.md) — Desktop components use icons extensively in buttons,
280
320
  toolbars, menus, and grid columns
281
321
  - [`/desktop/cmp/dash/`](../desktop/cmp/dash/README.md) — DashContainer uses icon serialization