@nexterajs/ui 0.0.2 → 0.1.0

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 (59) hide show
  1. package/README.md +279 -34
  2. package/fesm2022/nexterajs-ui-charts.mjs +1096 -0
  3. package/fesm2022/nexterajs-ui-charts.mjs.map +1 -0
  4. package/fesm2022/nexterajs-ui-core.mjs +652 -12
  5. package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
  6. package/fesm2022/nexterajs-ui-display.mjs +1142 -0
  7. package/fesm2022/nexterajs-ui-display.mjs.map +1 -0
  8. package/fesm2022/nexterajs-ui-dropdowns.mjs +321 -33
  9. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
  10. package/fesm2022/nexterajs-ui-file-uploader.mjs +572 -10
  11. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
  12. package/fesm2022/nexterajs-ui-forms.mjs +2027 -136
  13. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
  14. package/fesm2022/nexterajs-ui-grid.mjs +1222 -188
  15. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
  16. package/fesm2022/nexterajs-ui-intl.mjs +103 -11
  17. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
  18. package/fesm2022/nexterajs-ui-navigation.mjs +1054 -0
  19. package/fesm2022/nexterajs-ui-navigation.mjs.map +1 -0
  20. package/fesm2022/nexterajs-ui-notify.mjs +46 -44
  21. package/fesm2022/nexterajs-ui-notify.mjs.map +1 -1
  22. package/fesm2022/nexterajs-ui-overlay.mjs +1671 -0
  23. package/fesm2022/nexterajs-ui-overlay.mjs.map +1 -0
  24. package/fesm2022/nexterajs-ui-pivot.mjs +51 -26
  25. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
  26. package/fesm2022/nexterajs-ui-shell.mjs +542 -0
  27. package/fesm2022/nexterajs-ui-shell.mjs.map +1 -0
  28. package/fesm2022/nexterajs-ui-tree-view.mjs +5 -2
  29. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
  30. package/fesm2022/nexterajs-ui-validation.mjs +42 -11
  31. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
  32. package/fesm2022/nexterajs-ui.mjs +5 -0
  33. package/fesm2022/nexterajs-ui.mjs.map +1 -1
  34. package/package.json +33 -2
  35. package/styles/_dropdown.scss +5 -5
  36. package/styles/_editor.scss +52 -17
  37. package/styles/_mixins.scss +1 -1
  38. package/styles/_scrollbar.scss +5 -5
  39. package/styles/_status.scss +21 -0
  40. package/styles/_toast.scss +14 -14
  41. package/styles/_tokens.scss +420 -3
  42. package/styles/_widget.scss +14 -3
  43. package/styles/index.scss +6 -4
  44. package/types/nexterajs-ui-charts.d.ts +446 -0
  45. package/types/nexterajs-ui-core.d.ts +387 -22
  46. package/types/nexterajs-ui-display.d.ts +720 -0
  47. package/types/nexterajs-ui-dropdowns.d.ts +191 -48
  48. package/types/nexterajs-ui-file-uploader.d.ts +236 -7
  49. package/types/nexterajs-ui-forms.d.ts +675 -30
  50. package/types/nexterajs-ui-grid.d.ts +448 -93
  51. package/types/nexterajs-ui-intl.d.ts +39 -4
  52. package/types/nexterajs-ui-navigation.d.ts +531 -0
  53. package/types/nexterajs-ui-notify.d.ts +4 -2
  54. package/types/nexterajs-ui-overlay.d.ts +703 -0
  55. package/types/nexterajs-ui-pivot.d.ts +56 -48
  56. package/types/nexterajs-ui-shell.d.ts +294 -0
  57. package/types/nexterajs-ui-tree-view.d.ts +6 -3
  58. package/types/nexterajs-ui-validation.d.ts +20 -11
  59. package/types/nexterajs-ui.d.ts +5 -0
@@ -2,6 +2,7 @@ import { NxeColumnFormat, NxeGridInstance, NxeExcelExportOptions, NxeScrollingCo
2
2
  import { NxeNumberSeparators } from '@nexterajs/ui/intl';
3
3
  import * as _angular_core from '@angular/core';
4
4
  import { OnDestroy, TemplateRef, Signal, EventEmitter } from '@angular/core';
5
+ import { NxeMessageService } from '@nexterajs/ui/core';
5
6
 
6
7
  type NxePivotArea = 'row' | 'column' | 'data' | 'filter';
7
8
  type NxePivotSummaryType = 'sum' | 'count' | 'min' | 'max' | 'avg' | 'custom';
@@ -743,9 +744,9 @@ declare class NxePivotDataSource {
743
744
  declare class NxeStateStoringComponent {
744
745
  readonly enabled: _angular_core.InputSignal<boolean>;
745
746
  readonly type: _angular_core.InputSignal<"custom" | "localStorage" | "sessionStorage">;
746
- readonly storageKey: _angular_core.InputSignal<string>;
747
- readonly customSave: _angular_core.InputSignal<(state: any) => void>;
748
- readonly customLoad: _angular_core.InputSignal<() => any>;
747
+ readonly storageKey: _angular_core.InputSignal<string | undefined>;
748
+ readonly customSave: _angular_core.InputSignal<((state: any) => void) | undefined>;
749
+ readonly customLoad: _angular_core.InputSignal<(() => any) | undefined>;
749
750
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeStateStoringComponent, never>;
750
751
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeStateStoringComponent, "nxe-state-storing", never, { "enabled": { "alias": "enabled"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "storageKey": { "alias": "storageKey"; "required": false; "isSignal": true; }; "customSave": { "alias": "customSave"; "required": false; "isSignal": true; }; "customLoad": { "alias": "customLoad"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
751
752
  }
@@ -817,7 +818,7 @@ interface NxePivotFieldMoveEvent {
817
818
  }
818
819
  declare class NxePivotFieldPanelComponent implements OnDestroy {
819
820
  /** The pivot's CURRENT engine — overrides already merged, so chips track every mutation. */
820
- readonly engine: _angular_core.InputSignal<NxePivotDataSource>;
821
+ readonly engine: _angular_core.InputSignal<NxePivotDataSource | null>;
821
822
  readonly showFilterFields: _angular_core.InputSignal<boolean>;
822
823
  readonly showDataFields: _angular_core.InputSignal<boolean>;
823
824
  readonly showColumnFields: _angular_core.InputSignal<boolean>;
@@ -835,14 +836,14 @@ declare class NxePivotFieldPanelComponent implements OnDestroy {
835
836
  readonly showBorders: _angular_core.InputSignal<boolean>;
836
837
  /** P3-C3: the pivot's `.nxe-pivotgrid-toolbar` template (field-chooser button) — rendered
837
838
  * where dx prepends its toolbar container (m_widget.js `_renderDescriptionArea`). */
838
- readonly toolbarTemplate: _angular_core.InputSignal<TemplateRef<unknown>>;
839
+ readonly toolbarTemplate: _angular_core.InputSignal<TemplateRef<unknown> | null>;
839
840
  /** Which panel band hosts the toolbar (the pivot resolves dx's placement branches):
840
841
  * 'filter' = the filter-header cell; 'column' = the column-header cell (dx's middle
841
842
  * branch — showFilterFields off but data/column bands shown; the cell renders for the
842
843
  * toolbar even when showColumnFields is off, exactly as dx's always-present
843
844
  * $columnHeader does); null = the toolbar lives in the cross-tab corner (or no
844
845
  * chooser) — nothing renders here. */
845
- readonly toolbarArea: _angular_core.InputSignal<"column" | "filter">;
846
+ readonly toolbarArea: _angular_core.InputSignal<"column" | "filter" | null>;
846
847
  /** A chip was dropped — the pivot recomputes areaIndexes and writes its override map. */
847
848
  readonly fieldMove: _angular_core.OutputEmitterRef<NxePivotFieldMoveEvent>;
848
849
  /** A sortable chip was clicked — the pivot flips the field's effective sortOrder. */
@@ -853,8 +854,9 @@ declare class NxePivotFieldPanelComponent implements OnDestroy {
853
854
  readonly filterOpen: _angular_core.OutputEmitterRef<NxePivotFilterOpenEvent>;
854
855
  /** The ROW fields area — NxePivotGridComponent outlets this into its corner cell (dx hosts
855
856
  * the row chips inside `.nxe-area-description-cell`, never in a band of their own). */
856
- readonly rowAreaTemplate: _angular_core.Signal<TemplateRef<unknown>>;
857
+ readonly rowAreaTemplate: _angular_core.Signal<TemplateRef<unknown> | undefined>;
857
858
  private readonly elementRef;
859
+ private readonly messages;
858
860
  private readonly zone;
859
861
  protected readonly filterArea: _angular_core.Signal<PanelArea>;
860
862
  protected readonly dataArea: _angular_core.Signal<PanelArea>;
@@ -892,14 +894,14 @@ declare class NxePivotFieldPanelComponent implements OnDestroy {
892
894
  * applyChangesMode 'instantly' (no OK/Cancel — changes hit the pivot live). */
893
895
  declare class NxeFieldChooserComponent {
894
896
  readonly enabled: _angular_core.InputSignal<boolean>;
895
- readonly height: _angular_core.InputSignal<number>;
896
- readonly width: _angular_core.InputSignal<number>;
897
+ readonly height: _angular_core.InputSignal<number | undefined>;
898
+ readonly width: _angular_core.InputSignal<number | undefined>;
897
899
  readonly allowSearch: _angular_core.InputSignal<boolean>;
898
900
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeFieldChooserComponent, never>;
899
901
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeFieldChooserComponent, "nxe-field-chooser", never, { "enabled": { "alias": "enabled"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "allowSearch": { "alias": "allowSearch"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
900
902
  }
901
903
  declare class NxePivotGridComponent implements OnDestroy {
902
- readonly dataSource: _angular_core.InputSignal<NxePivotDataSourceOptions | NxePivotDataSource>;
904
+ readonly dataSource: _angular_core.InputSignal<NxePivotDataSourceOptions | NxePivotDataSource | null | undefined>;
903
905
  /** dx `allowFiltering` (default false) — LIVE since P3-C4: filterable dimension chips
904
906
  * (panel AND chooser) render the `.nxe-header-filter` funnel and open the shared
905
907
  * header-filter panel; per-field `field.allowFiltering` overrides the widget flag
@@ -920,8 +922,8 @@ declare class NxePivotGridComponent implements OnDestroy {
920
922
  readonly rowHeaderLayout: _angular_core.InputSignal<NxePivotRowHeaderLayout>;
921
923
  /** dx `height`: number (px) or CSS string, applied to the widget root — the internal
922
924
  * scroll container tracks it at 100%. */
923
- readonly height: _angular_core.InputSignal<string | number>;
924
- readonly texts: _angular_core.InputSignal<NxePivotTexts>;
925
+ readonly height: _angular_core.InputSignal<string | number | undefined>;
926
+ readonly texts: _angular_core.InputSignal<NxePivotTexts | undefined>;
925
927
  readonly showColumnTotals: _angular_core.InputSignal<boolean>;
926
928
  readonly showRowTotals: _angular_core.InputSignal<boolean>;
927
929
  readonly showColumnGrandTotals: _angular_core.InputSignal<boolean>;
@@ -931,7 +933,7 @@ declare class NxePivotGridComponent implements OnDestroy {
931
933
  /** dx `dataFieldArea` (default 'column'): 'row' renders the measures as the innermost ROW
932
934
  * level when two or more exist (with one, dx omits the metric level on either axis).
933
935
  * Left undefined the engine falls back to the dataSource options' own `dataFieldArea`. */
934
- readonly dataFieldArea: _angular_core.InputSignal<"row" | "column">;
936
+ readonly dataFieldArea: _angular_core.InputSignal<"row" | "column" | undefined>;
935
937
  /** dx `allowSorting` (default false, P3-C2): field-panel chips toggle their field's
936
938
  * sortOrder on click and carry the `.nxe-sort` arrow in `.nxe-column-indicators`. */
937
939
  readonly allowSorting: _angular_core.InputSignal<boolean>;
@@ -950,14 +952,14 @@ declare class NxePivotGridComponent implements OnDestroy {
950
952
  protected readonly showBordersEff: Signal<boolean>;
951
953
  protected readonly wordWrapEnabledEff: Signal<boolean>;
952
954
  protected readonly rowHeaderLayoutEff: Signal<NxePivotRowHeaderLayout>;
953
- protected readonly heightEff: Signal<string | number>;
954
- protected readonly textsEff: Signal<NxePivotTexts>;
955
+ protected readonly heightEff: Signal<string | number | undefined>;
956
+ protected readonly textsEff: Signal<NxePivotTexts | undefined>;
955
957
  protected readonly showColumnTotalsEff: Signal<boolean>;
956
958
  protected readonly showRowTotalsEff: Signal<boolean>;
957
959
  protected readonly showColumnGrandTotalsEff: Signal<boolean>;
958
960
  protected readonly showRowGrandTotalsEff: Signal<boolean>;
959
961
  protected readonly showTotalsPriorEff: Signal<NxePivotTotalsPrior>;
960
- protected readonly dataFieldAreaEff: Signal<"row" | "column">;
962
+ protected readonly dataFieldAreaEff: Signal<"row" | "column" | undefined>;
961
963
  /** The documented option names `option()` gets/sets (DEFAULTS.md lists the exclusions). */
962
964
  private readonly effOptions;
963
965
  /**
@@ -977,12 +979,12 @@ declare class NxePivotGridComponent implements OnDestroy {
977
979
  * the same diff — never twice). `dataSource` rides along, get-only.
978
980
  */
979
981
  private readonly optionSnapshot;
980
- protected readonly fieldChooser: Signal<NxeFieldChooserComponent>;
982
+ protected readonly fieldChooser: Signal<NxeFieldChooserComponent | undefined>;
981
983
  /** The projected `nxe-field-panel` config (P3-C2) — the panel renders when it is visible. */
982
- protected readonly fieldPanel: Signal<NxeFieldPanelComponent>;
984
+ protected readonly fieldPanel: Signal<NxeFieldPanelComponent | undefined>;
983
985
  /** The projected `nxe-state-storing` config — LIVE since P3-C4 for `type: 'custom'`:
984
986
  * every layout mutation fires `customSave(state)` and `customLoad` is honored on init. */
985
- protected readonly stateStoring: Signal<NxeStateStoringComponent>;
987
+ protected readonly stateStoring: Signal<NxeStateStoringComponent | undefined>;
986
988
  /** dx `fieldPanel.visible` (default false): gates the panel, the corner's chips-vs-caption
987
989
  * switch, and the dx marker classes on the host. */
988
990
  protected readonly panelVisible: Signal<boolean>;
@@ -990,7 +992,7 @@ declare class NxePivotGridComponent implements OnDestroy {
990
992
  private readonly panelCmp;
991
993
  /** The ROW fields area, outletted into the corner cell (dx hosts the row chips inside
992
994
  * `.nxe-area-description-cell` — oracle §c; the corner shows NO caption text then). */
993
- protected readonly panelRowAreaTpl: Signal<_angular_core.TemplateRef<unknown>>;
995
+ protected readonly panelRowAreaTpl: Signal<_angular_core.TemplateRef<unknown> | null>;
994
996
  /** The `.nxe-pivotgrid-field-chooser-button` renders only when an `nxe-field-chooser` is
995
997
  * projected with `enabled` not false (the DA page passes [enabled]="true"). */
996
998
  protected readonly chooserEnabled: Signal<boolean>;
@@ -1001,9 +1003,9 @@ declare class NxePivotGridComponent implements OnDestroy {
1001
1003
  * (c) else -> the cross-tab corner `.nxe-area-description-cell`, where the button is
1002
1004
  * transparent until hover and the corner drops its caption (the library's own rules,
1003
1005
  * nxe-pivot-grid.component.scss — dx.light's description-cell toolbar rules). */
1004
- protected readonly chooserToolbarHost: Signal<"column" | "filter" | "corner">;
1006
+ protected readonly chooserToolbarHost: Signal<"column" | "filter" | "corner" | null>;
1005
1007
  /** The panel-hosted placements, bound into the panel's `toolbarArea` input. */
1006
- protected readonly panelToolbarArea: Signal<"column" | "filter">;
1008
+ protected readonly panelToolbarArea: Signal<"column" | "filter" | null>;
1007
1009
  protected readonly chooserInCorner: Signal<boolean>;
1008
1010
  private chooserOverlayRef;
1009
1011
  private readonly overlay;
@@ -1011,6 +1013,8 @@ declare class NxePivotGridComponent implements OnDestroy {
1011
1013
  private readonly elementRef;
1012
1014
  /** Locale separators for every number the pivot renders; threaded into the data source. */
1013
1015
  private readonly separators;
1016
+ /** The library's runtime-switchable messages. */
1017
+ protected readonly messages: NxeMessageService;
1014
1018
  /** Bumped by `getDataSource().reload()` to force a re-aggregate. */
1015
1019
  private readonly reloadTick;
1016
1020
  /**
@@ -1038,7 +1042,7 @@ declare class NxePivotGridComponent implements OnDestroy {
1038
1042
  * `expandAll()`/`collapseAll()`, so expand-all no longer wipes a dragged layout.)
1039
1043
  */
1040
1044
  private readonly fieldOverrides;
1041
- protected readonly engine: Signal<NxePivotDataSource>;
1045
+ protected readonly engine: Signal<NxePivotDataSource | null>;
1042
1046
  /**
1043
1047
  * The "layout changed" hook (P3-C2, consumed since P3-C4): the caller's fields with the
1044
1048
  * panel's overrides merged — a NEW array identity after every mutation (drag move, sort
@@ -1059,11 +1063,11 @@ declare class NxePivotGridComponent implements OnDestroy {
1059
1063
  * simply stop matching any node — harmless, dx-alike.
1060
1064
  */
1061
1065
  private readonly manualExpanded;
1062
- protected readonly model: Signal<NxePivotModel>;
1066
+ protected readonly model: Signal<NxePivotModel | null>;
1063
1067
  /** Host height style — dx `height`: numbers are px, strings pass through, unset removes it. */
1064
- protected readonly hostHeight: Signal<string>;
1068
+ protected readonly hostHeight: Signal<string | null>;
1065
1069
  /** The projected `nxe-scrolling` config — `mode: 'virtual'` opts into row windowing. */
1066
- protected readonly scrolling: Signal<NxeScrollingComponent>;
1070
+ protected readonly scrolling: Signal<NxeScrollingComponent | undefined>;
1067
1071
  /** Scroll offset of `.nxe-pivotgrid-scroll` (its own scroll handler feeds it). */
1068
1072
  private readonly scrollTop;
1069
1073
  /** The scroll container's clientHeight, measured in the render effect (0 = unmeasured). */
@@ -1335,6 +1339,15 @@ declare class NxePivotFieldChipComponent {
1335
1339
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxePivotFieldChipComponent, "div[nxePivotFieldChip]", never, { "chip": { "alias": "chip"; "required": true; "isSignal": true; }; "floatIndicators": { "alias": "floatIndicators"; "required": false; "isSignal": true; }; }, { "chipPointerDown": "chipPointerDown"; "chipClick": "chipClick"; "chipFilterClick": "chipFilterClick"; }, never, never, true, never>;
1336
1340
  }
1337
1341
 
1342
+ /** dx fieldChooser texts (m_field_chooser.js `_getDefaultOptions` messages), as library message keys. */
1343
+ declare const CHOOSER_TEXT_KEYS: {
1344
+ readonly allFields: "pivot.chooser.allFields";
1345
+ readonly rowFields: "pivot.chooser.rowFields";
1346
+ readonly columnFields: "pivot.chooser.columnFields";
1347
+ readonly filterFields: "pivot.chooser.filterFields";
1348
+ readonly dataFields: "pivot.chooser.dataFields";
1349
+ readonly title: "pivot.chooser.title";
1350
+ };
1338
1351
  /** One All-Fields tree row (the fixture's flat leaf list — local fields have no groups). */
1339
1352
  interface ChooserTreeItem {
1340
1353
  fieldIndex: number;
@@ -1350,11 +1363,11 @@ interface ChooserArea {
1350
1363
  }
1351
1364
  declare class NxePivotFieldChooserComponent implements OnDestroy {
1352
1365
  /** The pivot's LIVE engine signal (overrides merged) — instant applies re-read it here. */
1353
- readonly engine: _angular_core.InputSignal<Signal<NxePivotDataSource>>;
1366
+ readonly engine: _angular_core.InputSignal<Signal<NxePivotDataSource | null>>;
1354
1367
  /** dx `fieldChooser.width`/`height` — applied to the popup box; dxPivotGrid defaults 600
1355
1368
  * (m_widget.js `fieldChooser` defaults; the DA page passes height 400). */
1356
- readonly width: _angular_core.InputSignal<number>;
1357
- readonly height: _angular_core.InputSignal<number>;
1369
+ readonly width: _angular_core.InputSignal<number | undefined>;
1370
+ readonly height: _angular_core.InputSignal<number | undefined>;
1358
1371
  /** dx `fieldChooser.allowSearch` (default false — the capture has NO search box). */
1359
1372
  readonly allowSearch: _angular_core.InputSignal<boolean>;
1360
1373
  /** Widget `allowSorting`: dimension chips inside the chooser sort on click, same as the
@@ -1375,14 +1388,9 @@ declare class NxePivotFieldChooserComponent implements OnDestroy {
1375
1388
  readonly filterOpen: _angular_core.OutputEmitterRef<NxePivotFilterOpenEvent>;
1376
1389
  /** The title-bar X — the pivot disposes the overlay (Escape/backdrop close there too). */
1377
1390
  readonly closed: _angular_core.OutputEmitterRef<void>;
1378
- protected readonly texts: {
1379
- allFields: string;
1380
- rowFields: string;
1381
- columnFields: string;
1382
- filterFields: string;
1383
- dataFields: string;
1384
- title: string;
1385
- };
1391
+ protected readonly messages: NxeMessageService;
1392
+ /** The chooser's captions in the active language; read in the template, so a switch re-renders. */
1393
+ protected get texts(): Record<keyof typeof CHOOSER_TEXT_KEYS, string>;
1386
1394
  protected readonly allIcon: string;
1387
1395
  protected readonly searchText: _angular_core.WritableSignal<string>;
1388
1396
  private readonly elementRef;
@@ -1426,22 +1434,22 @@ declare class NxePivotFieldChooserComponent implements OnDestroy {
1426
1434
  /** `dxo-common-series-settings` — the series type (only `bar` is used). */
1427
1435
  declare class NxeCommonSeriesSettingsComponent {
1428
1436
  readonly type: _angular_core.InputSignal<"area" | "line" | "bar" | "spline">;
1429
- readonly argumentField: _angular_core.InputSignal<string>;
1430
- readonly valueField: _angular_core.InputSignal<string>;
1437
+ readonly argumentField: _angular_core.InputSignal<string | undefined>;
1438
+ readonly valueField: _angular_core.InputSignal<string | undefined>;
1431
1439
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeCommonSeriesSettingsComponent, never>;
1432
1440
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeCommonSeriesSettingsComponent, "nxe-common-series-settings", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "argumentField": { "alias": "argumentField"; "required": false; "isSignal": true; }; "valueField": { "alias": "valueField"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1433
1441
  }
1434
1442
  /** `dxo-size` — fixed chart height. */
1435
1443
  declare class NxeSizeComponent {
1436
- readonly width: _angular_core.InputSignal<number>;
1437
- readonly height: _angular_core.InputSignal<number>;
1444
+ readonly width: _angular_core.InputSignal<number | undefined>;
1445
+ readonly height: _angular_core.InputSignal<number | undefined>;
1438
1446
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeSizeComponent, never>;
1439
1447
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeSizeComponent, "nxe-size", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1440
1448
  }
1441
1449
  /** `dxo-adaptive-layout` — responsive breakpoint width (the chart fills its container above it). */
1442
1450
  declare class NxeAdaptiveLayoutComponent {
1443
- readonly width: _angular_core.InputSignal<number>;
1444
- readonly height: _angular_core.InputSignal<number>;
1451
+ readonly width: _angular_core.InputSignal<number | undefined>;
1452
+ readonly height: _angular_core.InputSignal<number | undefined>;
1445
1453
  readonly keepLabels: _angular_core.InputSignal<boolean>;
1446
1454
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeAdaptiveLayoutComponent, never>;
1447
1455
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeAdaptiveLayoutComponent, "nxe-adaptive-layout", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "keepLabels": { "alias": "keepLabels"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -1454,13 +1462,13 @@ interface BarRect {
1454
1462
  fill: string;
1455
1463
  }
1456
1464
  declare class NxeChartComponent {
1457
- readonly dataSource: _angular_core.InputSignal<NxeChartSeries>;
1458
- protected readonly commonSeries: _angular_core.Signal<NxeCommonSeriesSettingsComponent>;
1459
- protected readonly size: _angular_core.Signal<NxeSizeComponent>;
1460
- protected readonly adaptiveLayout: _angular_core.Signal<NxeAdaptiveLayoutComponent>;
1465
+ readonly dataSource: _angular_core.InputSignal<NxeChartSeries | null | undefined>;
1466
+ protected readonly commonSeries: _angular_core.Signal<NxeCommonSeriesSettingsComponent | undefined>;
1467
+ protected readonly size: _angular_core.Signal<NxeSizeComponent | undefined>;
1468
+ protected readonly adaptiveLayout: _angular_core.Signal<NxeAdaptiveLayoutComponent | undefined>;
1461
1469
  /** Series pushed by `pivotGrid.bindChart(...)`; falls back to the `[dataSource]` input. */
1462
1470
  private readonly pushed;
1463
- protected readonly series: _angular_core.Signal<NxeChartSeries>;
1471
+ protected readonly series: _angular_core.Signal<NxeChartSeries | null>;
1464
1472
  protected readonly chartHeight: _angular_core.Signal<number>;
1465
1473
  protected readonly chartWidth: _angular_core.Signal<number>;
1466
1474
  protected readonly hasData: _angular_core.Signal<boolean>;
@@ -0,0 +1,294 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken, Signal, TemplateRef } from '@angular/core';
3
+ import { Params } from '@angular/router';
4
+ import { NxeStatusFamily } from '@nexterajs/ui/display';
5
+ import { NxeMessageKey } from '@nexterajs/ui/core';
6
+
7
+ /**
8
+ * One entry of the side navigation.
9
+ *
10
+ * - A **link** has `route` (router) or `href` (plain anchor).
11
+ * - A **parent** has `children`: it is a disclosure button, not a link. Its children appear under it
12
+ * when it is open, and it opens by itself when one of them is the current page.
13
+ * - A **group** has `heading: true` and `children`: a non-interactive heading, with its items in a
14
+ * labelled list under it. Groups sit at the top level; items inside them nest as deep as needed.
15
+ * - An entry with none of those is a plain button; `itemClick` reports it.
16
+ */
17
+ interface NxeNavItem {
18
+ /** Unique within the tree. Keys the open state and the DOM ids. */
19
+ readonly id: string;
20
+ /** What the entry says. Translate it. */
21
+ readonly label: string;
22
+ /**
23
+ * The icon, named for `<i class="nxe-icon nxe-icon-NAME">`, or, when the app supplies an
24
+ * `ng-template[nxeSidenavIcon]`, any key that template maps to an icon. An entry without one
25
+ * shows the first letter of its label so a collapsed rail is still usable.
26
+ */
27
+ readonly icon?: string;
28
+ /** Router link: a URL (`'/buyer/inbox'`) or commands (`['/buyer/price-lists', id]`). */
29
+ readonly route?: string | unknown[];
30
+ /** Query parameters for `route`. When set they take part in the active match. */
31
+ readonly queryParams?: Params;
32
+ /** A plain `href`, for a link that leaves the app. Never shown as the current page. */
33
+ readonly href?: string;
34
+ /** A count, or a signal of one (read in the template, so it updates without a new tree). */
35
+ readonly badge?: number | Signal<number | null | undefined>;
36
+ /** Colour of the badge; `danger` by default. */
37
+ readonly badgeFamily?: NxeStatusFamily;
38
+ /** Spoken name of the badge ("5 items need action"); defaults to the number. */
39
+ readonly badgeLabel?: string;
40
+ /** Children of a parent entry, or the items of a group. */
41
+ readonly children?: readonly NxeNavItem[];
42
+ /** Make this a group heading; its `children` are the group's items. */
43
+ readonly heading?: boolean;
44
+ /** Not interactive, not focusable, announced as disabled. */
45
+ readonly disabled?: boolean;
46
+ /**
47
+ * Match the URL exactly. Without it an entry is the current page for its URL and everything
48
+ * below it (`/buyer/purchase-orders` for `/buyer/purchase-orders/42`). Give the home entry
49
+ * (`/buyer`) `exact: true`, or it is current everywhere.
50
+ */
51
+ readonly exact?: boolean;
52
+ }
53
+ /** `docked`: beside the content, expanded or a rail. `drawer`: off-canvas, over the content. */
54
+ type NxeShellMode = 'docked' | 'drawer';
55
+ /**
56
+ * What `nxe-topbar` and `nxe-sidenav` need from the `nxe-shell` around them, through
57
+ * {@link NXE_SHELL}. Both also work without a shell; they then do not toggle anything.
58
+ */
59
+ interface NxeShellState {
60
+ readonly mode: Signal<NxeShellMode>;
61
+ /** The sidenav is a narrow icon rail (docked and collapsed). */
62
+ readonly rail: Signal<boolean>;
63
+ /** Docked: the user's collapsed choice. */
64
+ readonly collapsed: Signal<boolean>;
65
+ /** The drawer is on screen (drawer mode and open). */
66
+ readonly drawerShown: Signal<boolean>;
67
+ /** DOM id of the projected `nxe-sidenav`, for `aria-controls`. */
68
+ readonly sidenavId: Signal<string | null>;
69
+ setCollapsed(collapsed: boolean): void;
70
+ /** Hamburger: open or close the drawer, or collapse or expand the dock. */
71
+ toggleNavigation(): void;
72
+ closeDrawer(): void;
73
+ }
74
+ /** Provided by `nxe-shell` to the topbar and sidenav projected into it. */
75
+ declare const NXE_SHELL: InjectionToken<NxeShellState>;
76
+ /**
77
+ * `<ng-template nxeSidenavIcon let-item>` inside `nxe-sidenav` draws the icon of every entry that
78
+ * has an `icon`, given the entry. Use it to map `icon` keys to your own SVGs:
79
+ *
80
+ * ```html
81
+ * <nxe-sidenav [items]="items">
82
+ * <ng-template nxeSidenavIcon let-item>
83
+ * <svg viewBox="0 0 24 24"><path [attr.d]="paths[item.icon]" /></svg>
84
+ * </ng-template>
85
+ * </nxe-sidenav>
86
+ * ```
87
+ */
88
+ declare class NxeSidenavIconDirective {
89
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeSidenavIconDirective, never>;
90
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NxeSidenavIconDirective, "ng-template[nxeSidenavIcon]", never, {}, {}, never, never, true, never>;
91
+ }
92
+
93
+ /**
94
+ * `nxe-shell` is the page frame of an application: an optional banner, the topbar, the sidenav and
95
+ * the main content.
96
+ *
97
+ * ```html
98
+ * <nxe-shell [(collapsed)]="collapsed">
99
+ * <sb-impersonation-banner nxeShellBanner />
100
+ * <nxe-topbar>...</nxe-topbar>
101
+ * <nxe-sidenav [items]="items" />
102
+ * <router-outlet />
103
+ * </nxe-shell>
104
+ * ```
105
+ *
106
+ * **Slots.** `[nxeShellBanner]` (full width above the topbar, for a banner that must stay on screen),
107
+ * an `nxe-topbar`, an `nxe-sidenav`, and everything else, which goes in the `<main>` landmark. A
108
+ * "Skip to content" link, the first tab stop, jumps to that `<main>`.
109
+ *
110
+ * **Responsive.** The shell measures its own width. At or above `breakpoint` (960px by default, the
111
+ * design system's `md`) the sidenav is docked beside the content, expanded or, when `collapsed`, an
112
+ * icon rail. Below it the sidenav is an off-canvas drawer over the content with a scrim: the
113
+ * topbar's toggle button opens it, focus is trapped inside while it is open, Esc and a click on the
114
+ * scrim close it, a navigation closes it, and focus returns to the control that opened it.
115
+ * Widening the shell past the breakpoint closes the drawer.
116
+ *
117
+ * The shell is as tall as `--nxe-shell-height` (default `100dvh`): give it the height of the space
118
+ * it fills, and the content scrolls inside `<main>`.
119
+ */
120
+ declare class NxeShellComponent implements NxeShellState {
121
+ private readonly host;
122
+ private readonly messages;
123
+ private readonly router;
124
+ private readonly injector;
125
+ private readonly focusTrapFactory;
126
+ /** Docked sidenav shows only icons. Two-way: `[(collapsed)]`. */
127
+ readonly collapsed: _angular_core.ModelSignal<boolean>;
128
+ /** The off-canvas drawer is open (only meaningful below the breakpoint). Two-way: `[(drawerOpen)]`. */
129
+ readonly drawerOpen: _angular_core.ModelSignal<boolean>;
130
+ /** Shell width, in CSS px, from which the sidenav is docked rather than a drawer. */
131
+ readonly breakpoint: _angular_core.InputSignalWithTransform<number, unknown>;
132
+ /** Skip-link target id; unique per shell. */
133
+ protected readonly mainId: string;
134
+ private readonly sidenav;
135
+ /** Own width, kept by a ResizeObserver; the window's until the first measurement. */
136
+ private readonly width;
137
+ readonly mode: _angular_core.Signal<NxeShellMode>;
138
+ readonly rail: _angular_core.Signal<boolean>;
139
+ readonly drawerShown: _angular_core.Signal<boolean>;
140
+ readonly sidenavId: _angular_core.Signal<string | null>;
141
+ private trap;
142
+ private returnFocusTo;
143
+ constructor();
144
+ setCollapsed(collapsed: boolean): void;
145
+ /** The hamburger: the drawer below the breakpoint, the dock's collapsed state above it. */
146
+ toggleNavigation(): void;
147
+ closeDrawer(): void;
148
+ protected t(key: 'shell.skipToContent'): string;
149
+ protected skipToContent(event: Event): void;
150
+ protected onEscape(event: Event): void;
151
+ private onDrawerShown;
152
+ private onDrawerHidden;
153
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeShellComponent, never>;
154
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeShellComponent, "nxe-shell", never, { "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "drawerOpen": { "alias": "drawerOpen"; "required": false; "isSignal": true; }; "breakpoint": { "alias": "breakpoint"; "required": false; "isSignal": true; }; }, { "collapsed": "collapsedChange"; "drawerOpen": "drawerOpenChange"; }, ["sidenav"], ["[nxeShellBanner]", "nxe-topbar", "nxe-sidenav", "*"], true, never>;
155
+ }
156
+
157
+ /**
158
+ * `nxe-sidenav` is the application's primary navigation, drawn from a tree of {@link NxeNavItem}.
159
+ *
160
+ * ```html
161
+ * <nxe-sidenav [items]="items" (itemClick)="track($event)">
162
+ * <img nxeSidenavHeader src="logo.svg" alt="Nextera" />
163
+ * </nxe-sidenav>
164
+ * ```
165
+ *
166
+ * **Structure and ARIA.** A `<nav>` landmark holding nested lists, in the pattern the ARIA Authoring
167
+ * Practices call a *disclosure navigation menu*: a link is `<a aria-current="page">` when it is the
168
+ * current page; a parent is a `<button aria-expanded aria-controls>` that shows or hides the list
169
+ * under it; a group heading labels its list (`aria-labelledby`). It is deliberately not
170
+ * `role="tree"`: a tree makes one node focusable and needs the full tree keyboard contract, where
171
+ * every link here is an ordinary tab stop and the arrow keys are a shortcut on top of Tab.
172
+ *
173
+ * **Keyboard.** Tab and Shift+Tab visit every link and parent. On a link or parent, Arrow Down/Up
174
+ * move to the next/previous visible entry, Home/End to the first/last. Arrow Right opens a closed
175
+ * parent, or moves into an open one's first child; Arrow Left closes an open parent, or moves from
176
+ * a child to its parent (Right and Left swap in a right-to-left document). Enter and Space activate.
177
+ *
178
+ * **Current page.** From the router: an entry is current when its URL matches (a prefix, or the
179
+ * whole URL with `exact`), and when several do, the most specific one alone is `aria-current`
180
+ * (`/payments/aging` over `/payments`). The parents of the current page open themselves on
181
+ * navigation; what the user opened or closed by hand holds until the next navigation into it.
182
+ *
183
+ * **Collapsed rail.** With the sidenav collapsed (through `nxe-shell` or the `collapsed` model) only
184
+ * the icons show, each with its label as a native `title` and as visually-hidden text, and a badge
185
+ * pins to the icon. There is no flyout for children (that waits for the menu): activating a parent
186
+ * in the rail expands the rail with that parent open.
187
+ *
188
+ * Inside an `nxe-shell` the shell owns the collapsed state and the off-canvas drawer; on its own the
189
+ * sidenav is a plain docked column.
190
+ */
191
+ declare class NxeSidenavComponent {
192
+ private readonly router;
193
+ private readonly messages;
194
+ private readonly shell;
195
+ /** The sidenav's own element; `nxe-shell` traps focus in it while the drawer is open. */
196
+ readonly element: HTMLElement;
197
+ private readonly navElement;
198
+ /** DOM id, which the topbar's toggle button names in `aria-controls`. */
199
+ readonly id: string;
200
+ /** The navigation tree. */
201
+ readonly items: _angular_core.InputSignal<readonly NxeNavItem[]>;
202
+ /** Accessible name of the `<nav>` landmark; "Main navigation" in the active language by default. */
203
+ readonly label: _angular_core.InputSignal<string>;
204
+ /**
205
+ * Collapsed to the icon rail. Inside an `nxe-shell` the shell's `collapsed` wins and this is
206
+ * left alone; the sidenav writes the user's choice through the shell instead.
207
+ */
208
+ readonly collapsed: _angular_core.ModelSignal<boolean>;
209
+ /** Show the collapse/expand button at the foot of a docked sidenav. Default true. */
210
+ readonly collapsible: _angular_core.InputSignalWithTransform<boolean, unknown>;
211
+ /** An entry was activated: a link followed, a plain button pressed. Parents do not emit. */
212
+ readonly itemClick: _angular_core.OutputEmitterRef<NxeNavItem>;
213
+ /** Draws the icon of every entry that has an `icon`. */
214
+ protected readonly iconTemplate: _angular_core.Signal<TemplateRef<any> | undefined>;
215
+ protected readonly navLabel: _angular_core.Signal<string>;
216
+ protected readonly rail: _angular_core.Signal<boolean>;
217
+ protected readonly drawer: _angular_core.Signal<boolean>;
218
+ protected readonly drawerOpen: _angular_core.Signal<boolean>;
219
+ /** Every entry by id, with its place in the tree and the URL it points at. */
220
+ private readonly nodes;
221
+ /** The router's URL, re-read at every navigation so what is current is a signal. */
222
+ private readonly url;
223
+ /** Id of the one entry that is the current page. */
224
+ private readonly currentId;
225
+ /** Ids of the parents above the current page. They open by themselves. */
226
+ private readonly currentAncestors;
227
+ /**
228
+ * What the user opened or closed by hand. Navigating to a new page forgets the choices about
229
+ * its ancestors, so they open for it, and keeps the rest.
230
+ */
231
+ private readonly manual;
232
+ protected t(key: NxeMessageKey): string;
233
+ protected isCurrent(id: string): boolean;
234
+ /** The current page is somewhere under this parent. */
235
+ protected holdsCurrent(id: string): boolean;
236
+ protected isOpen(id: string): boolean;
237
+ protected hasChildren(item: NxeNavItem): boolean;
238
+ protected badgeValue(item: NxeNavItem): number | null | undefined;
239
+ protected badgeName(item: NxeNavItem): string;
240
+ protected initial(item: NxeNavItem): string;
241
+ /** Toggle a parent; in the rail, expand the rail with the parent open instead. */
242
+ protected onParent(item: NxeNavItem): void;
243
+ protected onActivate(item: NxeNavItem): void;
244
+ protected toggleCollapsed(): void;
245
+ protected closeDrawer(): void;
246
+ protected onKeydown(event: KeyboardEvent, item: NxeNavItem): void;
247
+ /** Links and parent buttons in document order; the ones inside a closed parent are not rendered. */
248
+ private focusables;
249
+ private setOpen;
250
+ private setCollapsed;
251
+ private treeOf;
252
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeSidenavComponent, never>;
253
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeSidenavComponent, "nxe-sidenav", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; }, { "collapsed": "collapsedChange"; "itemClick": "itemClick"; }, ["iconTemplate"], ["[nxeSidenavHeader]", "[nxeSidenavFooter]"], true, never>;
254
+ }
255
+
256
+ /**
257
+ * `nxe-topbar` is the bar across the top of an `nxe-shell`: a start, a centre and an end slot.
258
+ *
259
+ * ```html
260
+ * <nxe-topbar>
261
+ * <img nxeTopbarStart src="logo.svg" alt="Nextera" />
262
+ * <sb-search nxeTopbarCenter />
263
+ * <ng-container nxeTopbarEnd>
264
+ * <sb-company-switcher />
265
+ * <sb-notifications />
266
+ * </ng-container>
267
+ * </nxe-topbar>
268
+ * ```
269
+ *
270
+ * The start slot is preceded by a hamburger button: an icon-only `nxe-button` named "Toggle
271
+ * navigation" with `aria-controls` the sidenav and `aria-expanded` the sidenav's state. Inside an
272
+ * `nxe-shell` it opens and closes the drawer below the breakpoint and collapses and expands the dock
273
+ * above it. `menuToggle` also fires, so a topbar used without a shell can drive its own sidenav.
274
+ * `[nxeTopbarEnd]` elements sit at the inline end of the bar, where a company switcher, language
275
+ * toggle, notification bell and user menu go.
276
+ */
277
+ declare class NxeTopbarComponent {
278
+ private readonly messages;
279
+ private readonly shell;
280
+ /** Show the hamburger button. Default true. */
281
+ readonly menuButton: _angular_core.InputSignalWithTransform<boolean, unknown>;
282
+ /** The hamburger was pressed. */
283
+ readonly menuToggle: _angular_core.OutputEmitterRef<void>;
284
+ protected readonly label: _angular_core.Signal<string>;
285
+ protected readonly controls: _angular_core.Signal<string | null>;
286
+ /** Drawer: open. Dock: not collapsed. Without a shell the button says nothing about it. */
287
+ protected readonly expanded: _angular_core.Signal<boolean | null>;
288
+ protected toggle(): void;
289
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeTopbarComponent, never>;
290
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeTopbarComponent, "nxe-topbar", never, { "menuButton": { "alias": "menuButton"; "required": false; "isSignal": true; }; }, { "menuToggle": "menuToggle"; }, never, ["[nxeTopbarStart]", "[nxeTopbarCenter]", "[nxeTopbarEnd]"], true, never>;
291
+ }
292
+
293
+ export { NXE_SHELL, NxeShellComponent, NxeSidenavComponent, NxeSidenavIconDirective, NxeTopbarComponent };
294
+ export type { NxeNavItem, NxeShellMode, NxeShellState };
@@ -1,4 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { NxeMessageService } from '@nexterajs/ui/core';
2
3
 
3
4
  /** A node in the assembled tree (children built from the flat `parentIdExpr` list). */
4
5
  interface NxeTreeNode {
@@ -36,7 +37,9 @@ interface NxeTreeItemClickEvent {
36
37
  */
37
38
  declare class NxeTreeViewComponent {
38
39
  private readonly elementRef;
39
- readonly dataSource: _angular_core.InputSignal<readonly unknown[]>;
40
+ /** The library's runtime-switchable messages. */
41
+ protected readonly messages: NxeMessageService;
42
+ readonly dataSource: _angular_core.InputSignal<readonly unknown[] | null | undefined>;
40
43
  /** Accepted for parity; this component always assembles a tree from the flat list. */
41
44
  readonly dataStructure: _angular_core.InputSignal<"plain" | "tree">;
42
45
  readonly keyExpr: _angular_core.InputSignal<string>;
@@ -51,7 +54,7 @@ declare class NxeTreeViewComponent {
51
54
  readonly searchMode: _angular_core.InputSignal<"contains" | "startswith" | "equals">;
52
55
  /** Accepted for parity (native scrolling is the default here anyway). */
53
56
  readonly useNativeScrolling: _angular_core.InputSignal<boolean>;
54
- readonly width: _angular_core.InputSignal<string | number>;
57
+ readonly width: _angular_core.InputSignal<string | number | undefined>;
55
58
  readonly onItemClick: _angular_core.OutputEmitterRef<NxeTreeItemClickEvent>;
56
59
  readonly expanded: _angular_core.WritableSignal<ReadonlySet<unknown>>;
57
60
  readonly selectedKey: _angular_core.WritableSignal<unknown>;
@@ -59,7 +62,7 @@ declare class NxeTreeViewComponent {
59
62
  private readonly searchInput;
60
63
  /** DevExtreme `.instance` facade — `expandAll()` is the only method used. */
61
64
  get instance(): this;
62
- protected readonly widthStyle: _angular_core.Signal<string>;
65
+ protected readonly widthStyle: _angular_core.Signal<string | undefined>;
63
66
  private readonly tree;
64
67
  /**
65
68
  * The visible nodes, each with its position among its siblings.