@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.
- package/CHANGELOG.md +76 -0
- package/admin/tabs/cluster/instances/logs/levels/LogLevelDialogModel.ts +106 -10
- package/admin/tabs/cluster/metrics/MetricsModel.ts +3 -3
- package/appcontainer/AppContainerModel.ts +1 -1
- package/appcontainer/README.md +20 -0
- package/assets.d.ts +34 -0
- package/build/types/cmp/ag-grid/AgGrid.d.ts +8 -19
- package/build/types/cmp/ag-grid/AgGridModel.d.ts +18 -5
- package/build/types/cmp/card/Card.d.ts +9 -4
- package/build/types/cmp/card/CardModel.d.ts +15 -2
- package/build/types/cmp/chart/Chart.d.ts +2 -2
- package/build/types/cmp/chart/ChartModel.d.ts +11 -1
- package/build/types/cmp/dataview/DataView.d.ts +4 -2
- package/build/types/cmp/dataview/DataViewModel.d.ts +16 -4
- package/build/types/cmp/filter/FilterChooserModel.d.ts +7 -1
- package/build/types/cmp/form/Form.d.ts +2 -1
- package/build/types/cmp/form/FormModel.d.ts +12 -0
- package/build/types/cmp/form/field/BaseFieldModel.d.ts +7 -0
- package/build/types/cmp/form/formfieldset/FormFieldSetModel.d.ts +7 -1
- package/build/types/cmp/grid/GridModel.d.ts +16 -1
- package/build/types/cmp/grid/GridSorter.d.ts +14 -0
- package/build/types/cmp/grid/Types.d.ts +18 -0
- package/build/types/cmp/grid/columns/Column.d.ts +40 -2
- package/build/types/cmp/grid/columns/ColumnGroup.d.ts +10 -0
- package/build/types/cmp/grouping/GroupingChooserModel.d.ts +9 -2
- package/build/types/cmp/layout/Box.d.ts +19 -7
- package/build/types/cmp/layout/Frame.d.ts +17 -5
- package/build/types/cmp/loadingindicator/LoadingIndicator.d.ts +6 -4
- package/build/types/cmp/pinpad/PinPadModel.d.ts +6 -1
- package/build/types/cmp/spinner/Spinner.d.ts +31 -10
- package/build/types/cmp/tab/TabContainerModel.d.ts +11 -0
- package/build/types/cmp/tab/TabModel.d.ts +7 -0
- package/build/types/cmp/tab/Types.d.ts +4 -0
- package/build/types/cmp/treemap/TreeMapModel.d.ts +3 -3
- package/build/types/cmp/viewmanager/ViewManagerModel.d.ts +9 -0
- package/build/types/cmp/zoneGrid/ZoneGridModel.d.ts +22 -3
- package/build/types/cmp/zoneGrid/impl/ZoneMapperModel.d.ts +6 -0
- package/build/types/core/HoistComponent.d.ts +29 -8
- package/build/types/core/HoistProps.d.ts +9 -3
- package/build/types/core/load/LoadSpec.d.ts +1 -1
- package/build/types/core/persist/provider/ViewManagerProvider.d.ts +7 -0
- package/build/types/data/Store.d.ts +35 -1
- package/build/types/data/StoreSelectionModel.d.ts +18 -2
- package/build/types/data/cube/Cube.d.ts +26 -6
- package/build/types/data/cube/Query.d.ts +10 -0
- package/build/types/data/cube/View.d.ts +21 -2
- package/build/types/data/cube/aggregate/Aggregator.d.ts +13 -0
- package/build/types/data/cube/aggregate/AverageAggregator.d.ts +1 -0
- package/build/types/data/cube/aggregate/AverageStrictAggregator.d.ts +1 -0
- package/build/types/data/cube/aggregate/ChildCountAggregator.d.ts +1 -0
- package/build/types/data/cube/aggregate/LeafCountAggregator.d.ts +1 -0
- package/build/types/data/cube/aggregate/MaxAggregator.d.ts +1 -0
- package/build/types/data/cube/aggregate/MinAggregator.d.ts +1 -0
- package/build/types/data/cube/aggregate/NullAggregator.d.ts +1 -0
- package/build/types/data/cube/aggregate/SingleAggregator.d.ts +1 -0
- package/build/types/data/cube/aggregate/SumAggregator.d.ts +1 -0
- package/build/types/data/cube/aggregate/SumStrictAggregator.d.ts +1 -0
- package/build/types/data/cube/aggregate/UniqueAggregator.d.ts +1 -0
- package/build/types/data/filter/BaseFilterFieldSpec.d.ts +9 -0
- package/build/types/data/filter/Types.d.ts +12 -0
- package/build/types/desktop/cmp/button/AppMenuButton.d.ts +5 -0
- package/build/types/desktop/cmp/button/Button.d.ts +5 -1
- package/build/types/desktop/cmp/dash/canvas/DashCanvasModel.d.ts +12 -3
- package/build/types/desktop/cmp/dash/container/DashContainerModel.d.ts +9 -0
- package/build/types/desktop/cmp/dock/DockViewModel.d.ts +7 -0
- package/build/types/desktop/cmp/filechooser/FileChooserModel.d.ts +8 -0
- package/build/types/desktop/cmp/grid/editors/BooleanEditor.d.ts +1 -0
- package/build/types/desktop/cmp/grid/editors/DateEditor.d.ts +1 -0
- package/build/types/desktop/cmp/grid/editors/NumberEditor.d.ts +1 -0
- package/build/types/desktop/cmp/grid/editors/SelectEditor.d.ts +1 -0
- package/build/types/desktop/cmp/grid/editors/TextAreaEditor.d.ts +1 -0
- package/build/types/desktop/cmp/grid/editors/TextEditor.d.ts +1 -0
- package/build/types/desktop/cmp/input/Picker.d.ts +1 -1
- package/build/types/desktop/cmp/input/SegmentedControl.d.ts +16 -2
- package/build/types/desktop/cmp/leftrightchooser/LeftRightChooserModel.d.ts +7 -0
- package/build/types/desktop/cmp/modalsupport/ModalSupportModel.d.ts +28 -2
- package/build/types/desktop/cmp/panel/Panel.d.ts +5 -2
- package/build/types/desktop/cmp/panel/PanelModel.d.ts +12 -2
- package/build/types/desktop/cmp/rest/RestGrid.d.ts +10 -0
- package/build/types/desktop/cmp/rest/RestGridModel.d.ts +9 -1
- package/build/types/desktop/cmp/toolbar/Toolbar.d.ts +4 -1
- package/build/types/format/FormatDate.d.ts +4 -4
- package/build/types/icon/Icon.d.ts +3 -0
- package/build/types/kit/blueprint/Wrappers.d.ts +12 -1
- package/build/types/mobile/cmp/navigator/NavigatorModel.d.ts +8 -0
- package/build/types/mobile/cmp/navigator/PageModel.d.ts +7 -0
- package/build/types/mobile/cmp/panel/DialogPanel.d.ts +0 -2
- package/build/types/security/BaseOAuthClient.d.ts +9 -0
- package/build/types/security/authzero/AuthZeroClient.d.ts +6 -0
- package/build/types/security/msal/MsalClient.d.ts +6 -0
- package/build/types/svc/FetchService.d.ts +10 -7
- package/build/types/svc/TraceService.d.ts +17 -2
- package/build/types/utils/async/Timer.d.ts +6 -0
- package/build/types/utils/js/LangUtils.d.ts +1 -1
- package/build/types/utils/js/TestUtils.d.ts +1 -1
- package/build/types/utils/react/index.d.ts +0 -1
- package/build/types/utils/telemetry/Span.d.ts +12 -2
- package/cmp/ag-grid/AgGrid.ts +8 -19
- package/cmp/ag-grid/AgGridModel.ts +18 -5
- package/cmp/card/Card.ts +9 -4
- package/cmp/card/CardModel.ts +15 -2
- package/cmp/chart/Chart.ts +2 -2
- package/cmp/chart/ChartModel.ts +11 -1
- package/cmp/dataview/DataView.ts +4 -2
- package/cmp/dataview/DataViewModel.ts +16 -4
- package/cmp/filter/FilterChooserModel.ts +7 -1
- package/cmp/form/Form.ts +2 -1
- package/cmp/form/FormModel.ts +12 -0
- package/cmp/form/README.md +13 -0
- package/cmp/form/field/BaseFieldModel.ts +7 -0
- package/cmp/form/formfieldset/FormFieldSetModel.ts +7 -1
- package/cmp/grid/Grid.scss +14 -8
- package/cmp/grid/GridModel.ts +16 -1
- package/cmp/grid/GridSorter.ts +14 -0
- package/cmp/grid/README.md +12 -0
- package/cmp/grid/Types.ts +18 -0
- package/cmp/grid/columns/Column.ts +40 -2
- package/cmp/grid/columns/ColumnGroup.ts +10 -0
- package/cmp/grouping/GroupingChooserModel.ts +9 -2
- package/cmp/layout/Box.ts +19 -7
- package/cmp/layout/Frame.ts +17 -5
- package/cmp/layout/README.md +16 -21
- package/cmp/loadingindicator/LoadingIndicator.scss +1 -1
- package/cmp/loadingindicator/LoadingIndicator.ts +11 -9
- package/cmp/pinpad/PinPadModel.ts +6 -1
- package/cmp/spinner/Spinner.scss +13 -0
- package/cmp/spinner/Spinner.ts +58 -20
- package/cmp/tab/TabContainerModel.ts +11 -0
- package/cmp/tab/TabModel.ts +7 -0
- package/cmp/tab/Types.ts +4 -0
- package/cmp/treemap/TreeMapModel.ts +3 -3
- package/cmp/viewmanager/ViewManagerModel.ts +9 -0
- package/cmp/zoneGrid/ZoneGridModel.ts +22 -3
- package/cmp/zoneGrid/impl/ZoneMapperModel.ts +6 -0
- package/core/ExceptionHandler.ts +1 -1
- package/core/HoistComponent.ts +36 -11
- package/core/HoistProps.ts +9 -3
- package/core/README.md +68 -6
- package/core/impl/InstanceManager.ts +1 -0
- package/core/load/LoadSpec.ts +1 -1
- package/core/persist/provider/ViewManagerProvider.ts +7 -0
- package/data/README.md +48 -124
- package/data/Store.ts +35 -1
- package/data/StoreSelectionModel.ts +18 -2
- package/data/cube/Cube.ts +26 -6
- package/data/cube/Query.ts +10 -0
- package/data/cube/README.md +236 -0
- package/data/cube/View.ts +21 -2
- package/data/cube/aggregate/Aggregator.ts +13 -0
- package/data/cube/aggregate/AverageAggregator.ts +1 -0
- package/data/cube/aggregate/AverageStrictAggregator.ts +1 -0
- package/data/cube/aggregate/ChildCountAggregator.ts +1 -0
- package/data/cube/aggregate/LeafCountAggregator.ts +1 -0
- package/data/cube/aggregate/MaxAggregator.ts +1 -0
- package/data/cube/aggregate/MinAggregator.ts +1 -0
- package/data/cube/aggregate/NullAggregator.ts +1 -0
- package/data/cube/aggregate/SingleAggregator.ts +1 -0
- package/data/cube/aggregate/SumAggregator.ts +1 -0
- package/data/cube/aggregate/SumStrictAggregator.ts +1 -0
- package/data/cube/aggregate/UniqueAggregator.ts +1 -0
- package/data/filter/BaseFilterFieldSpec.ts +9 -0
- package/data/filter/Types.ts +12 -0
- package/desktop/README.md +131 -9
- package/desktop/appcontainer/AboutDialog.ts +2 -0
- package/desktop/appcontainer/Banner.ts +5 -2
- package/desktop/appcontainer/ChangelogDialog.ts +1 -0
- package/desktop/appcontainer/ExceptionDialog.ts +4 -0
- package/desktop/appcontainer/ExceptionDialogDetails.ts +4 -1
- package/desktop/appcontainer/FeedbackDialog.ts +4 -1
- package/desktop/appcontainer/ImpersonationBar.ts +4 -0
- package/desktop/appcontainer/LockoutPanel.ts +4 -1
- package/desktop/appcontainer/LoginPanel.ts +7 -3
- package/desktop/appcontainer/Message.ts +9 -3
- package/desktop/appcontainer/OptionsDialog.ts +3 -1
- package/desktop/appcontainer/VersionBar.ts +1 -0
- package/desktop/appcontainer/suspend/IdlePanel.ts +4 -4
- package/desktop/appcontainer/suspend/SuspendPanel.ts +3 -0
- package/desktop/cmp/button/AppMenuButton.ts +5 -0
- package/desktop/cmp/button/Button.ts +14 -4
- package/desktop/cmp/dash/README.md +14 -0
- package/desktop/cmp/dash/canvas/DashCanvasModel.ts +12 -3
- package/desktop/cmp/dash/container/DashContainerModel.ts +9 -0
- package/desktop/cmp/dock/DockViewModel.ts +7 -0
- package/desktop/cmp/filechooser/FileChooserModel.ts +9 -2
- package/desktop/cmp/grid/editors/BooleanEditor.ts +1 -0
- package/desktop/cmp/grid/editors/DateEditor.ts +1 -0
- package/desktop/cmp/grid/editors/NumberEditor.ts +1 -0
- package/desktop/cmp/grid/editors/SelectEditor.ts +1 -0
- package/desktop/cmp/grid/editors/TextAreaEditor.ts +1 -0
- package/desktop/cmp/grid/editors/TextEditor.ts +1 -0
- package/desktop/cmp/input/Picker.ts +2 -2
- package/desktop/cmp/input/SegmentedControl.ts +20 -2
- package/desktop/cmp/leftrightchooser/LeftRightChooserModel.ts +7 -0
- package/desktop/cmp/modalsupport/ModalSupportModel.ts +31 -2
- package/desktop/cmp/panel/Panel.ts +29 -21
- package/desktop/cmp/panel/PanelModel.ts +12 -2
- package/desktop/cmp/panel/README.md +20 -0
- package/desktop/cmp/rest/RestGrid.ts +10 -0
- package/desktop/cmp/rest/RestGridModel.ts +9 -1
- package/desktop/cmp/toolbar/Toolbar.ts +9 -2
- package/desktop/cmp/viewmanager/ViewManager.ts +1 -1
- package/docs/README.md +9 -4
- package/docs/coding-conventions.md +29 -21
- package/docs/doc-registry.json +31 -15
- package/docs/planning/docs-roadmap-log.md +11 -0
- package/docs/planning/docs-roadmap.md +1 -0
- package/docs/upgrade-notes/v84-upgrade-notes.md +136 -0
- package/docs/version-compatibility.md +2 -0
- package/format/FormatDate.ts +4 -4
- package/icon/Icon.ts +9 -0
- package/icon/README.md +62 -22
- package/icon/index.ts +24 -0
- package/kit/README.md +8 -2
- package/kit/blueprint/Wrappers.ts +12 -1
- package/mcp/README.md +47 -26
- package/mcp/cli/ts.ts +39 -4
- package/mcp/data/ts-registry.ts +57 -17
- package/mcp/tools/typescript.ts +32 -4
- package/mobile/appcontainer/AboutDialog.ts +3 -0
- package/mobile/appcontainer/Banner.ts +2 -0
- package/mobile/appcontainer/ExceptionDialog.ts +4 -0
- package/mobile/appcontainer/ExceptionDialogDetails.ts +1 -0
- package/mobile/appcontainer/FeedbackDialog.ts +4 -1
- package/mobile/appcontainer/ImpersonationBar.ts +2 -0
- package/mobile/appcontainer/LockoutPanel.ts +2 -0
- package/mobile/appcontainer/LoginPanel.ts +7 -3
- package/mobile/appcontainer/Message.ts +9 -3
- package/mobile/appcontainer/OptionsDialog.ts +5 -1
- package/mobile/appcontainer/VersionBar.ts +1 -0
- package/mobile/appcontainer/suspend/IdlePanel.ts +5 -6
- package/mobile/appcontainer/suspend/SuspendPanel.ts +3 -0
- package/mobile/cmp/navigator/NavigatorModel.ts +8 -0
- package/mobile/cmp/navigator/PageModel.ts +7 -0
- package/mobile/cmp/panel/DialogPanel.ts +0 -2
- package/package.json +11 -11
- package/security/BaseOAuthClient.ts +9 -0
- package/security/authzero/AuthZeroClient.ts +6 -0
- package/security/msal/MsalClient.ts +6 -0
- package/styles/vars.scss +14 -0
- package/svc/FetchService.ts +25 -15
- package/svc/README.md +39 -9
- package/svc/TraceService.ts +69 -11
- package/utils/README.md +0 -1
- package/utils/async/Timer.ts +6 -0
- package/utils/js/LangUtils.ts +1 -1
- package/utils/js/TestUtils.ts +1 -1
- package/utils/react/index.ts +0 -1
- package/utils/telemetry/Span.ts +21 -4
- package/build/types/utils/react/ClassName.d.ts +0 -14
- 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 [
|
|
398
|
-
displayName: '
|
|
399
|
-
model: uses(
|
|
400
|
-
className: 'xh-
|
|
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
|
-
|
|
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
|
|
421
|
-
const
|
|
422
|
-
displayName: '
|
|
423
|
-
model: uses(
|
|
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
|
-
|
|
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:
|
package/docs/doc-registry.json
CHANGED
|
@@ -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
|
|
52
|
-
"keywords": ["Store", "StoreRecord", "Field", "Filter", "FilterChooserModel", "FilterFieldSpec", "
|
|
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
|
|
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"
|
|
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"
|
|
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", "
|
|
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", "
|
|
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", "
|
|
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"
|
|
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"
|
|
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", "
|
|
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"
|
|
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", "
|
|
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", "
|
|
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 |
|
package/format/FormatDate.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
4
|
-
Pro icons throughout an application. Rather than
|
|
5
|
-
file that uses them, applications use the `Icon`
|
|
6
|
-
icon factories and ~40 semantic aliases, all
|
|
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
|
|
195
|
-
|
|
196
|
-
| `iconName`
|
|
197
|
-
| `prefix`
|
|
198
|
-
| `intent`
|
|
199
|
-
| `title`
|
|
200
|
-
| `size`
|
|
201
|
-
| `asHtml`
|
|
202
|
-
| `className` | `string`
|
|
203
|
-
| `omit`
|
|
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
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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 (
|
|
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
|