@nucleus-suite-pe/core 2.1.0 → 2.3.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nucleus-suite-pe/core",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "description": "Capa compartida de la suite Nucleus: sesión única, permisos, tema y marco de aplicación para Angular.",
5
5
  "keywords": [
6
6
  "angular",
@@ -27,7 +27,8 @@
27
27
  "@angular/router": "^21.2.0",
28
28
  "@angular/forms": "^21.2.0",
29
29
  "primeicons": "^8.0.0",
30
- "chart.js": "^4.4.0"
30
+ "chart.js": "^4.4.0",
31
+ "@angular/cdk": "^21.2.0"
31
32
  },
32
33
  "dependencies": {
33
34
  "tslib": "^2.3.0"
package/styles/tokens.css CHANGED
@@ -1,3 +1,5 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Figtree:wght@400;500;600;700&display=swap');
2
+
1
3
  :root {
2
4
  --ac-bg: #050508;
3
5
  --ac-surface: #0d0d15;
@@ -8,14 +10,18 @@
8
10
  --ac-accent: #7c6cf5;
9
11
  --ac-on-accent: #ffffff;
10
12
 
11
- --ns-frame-bg: #16132b;
12
- --ns-frame-raised: #241f42;
13
+ --ns-frame-bg: #1f1646;
14
+ --ns-frame-raised: #2c2160;
13
15
  --ns-frame-ink: #ece9fb;
14
- --ns-frame-muted: #9d95c6;
15
- --ns-frame-line: #302a54;
16
- --ns-frame-glow: #8c7ff0;
16
+ --ns-frame-muted: #9690af;
17
+ --ns-frame-line: #403863;
18
+ --ns-frame-glow: #a78bfa;
17
19
  --ns-frame-on-glow: #101014;
18
20
 
21
+ --ns-success: #5bd98a;
22
+ --ns-danger: #f87171;
23
+ --ns-warning: #e0a33a;
24
+
19
25
  --ns-shadow-1: 0 1px 2px rgb(0 0 0 / 28%);
20
26
  --ns-shadow-2: 0 10px 34px rgb(0 0 0 / 45%);
21
27
  --ns-accent-wash: #1d1a2b;
@@ -33,7 +39,10 @@
33
39
  --ns-form-gap-y: calc(18px * var(--ns-density));
34
40
  --ns-control-y: calc(0.55rem * var(--ns-density));
35
41
 
36
- --ac-font: 'IBM Plex Sans', 'Segoe UI', system-ui, sans-serif;
42
+ --ac-font: 'Figtree', 'Segoe UI', system-ui, sans-serif;
43
+ --ns-weight-text: 400;
44
+ --ns-weight-emphasis: 500;
45
+ --ns-weight-heading: 600;
37
46
  --ac-radius-pill: 999px;
38
47
  --ac-radius-box: 4px;
39
48
  }
@@ -193,7 +202,7 @@ input {
193
202
  background: var(--ns-header-bg);
194
203
  color: var(--ns-header-ink);
195
204
  font-size: 11px;
196
- font-weight: 600;
205
+ font-weight: var(--ns-weight-heading);
197
206
  letter-spacing: 0.07em;
198
207
  text-transform: uppercase;
199
208
  }
@@ -249,7 +258,7 @@ input {
249
258
  .ns-crumbs .p-breadcrumb-item:last-child .p-breadcrumb-item-label {
250
259
  color: var(--ac-text);
251
260
  font-size: 15px;
252
- font-weight: 600;
261
+ font-weight: var(--ns-weight-emphasis);
253
262
  }
254
263
 
255
264
  .ns-crumbs .p-breadcrumb-separator {
@@ -461,3 +470,84 @@ nucleus-metric .value,
461
470
  nucleus-chart {
462
471
  font-variant-numeric: tabular-nums;
463
472
  }
473
+
474
+ :root .p-tag {
475
+ --ns-status: color-mix(in srgb, var(--ac-text) 58%, transparent);
476
+
477
+ display: inline-flex;
478
+ align-items: center;
479
+ gap: 7px;
480
+ padding: 3px 11px 3px 9px;
481
+ border: 1px solid color-mix(in srgb, var(--ns-status) 38%, transparent);
482
+ border-radius: var(--ac-radius-pill);
483
+ background: color-mix(in srgb, var(--ns-status) 13%, transparent);
484
+ color: var(--ns-status);
485
+ font-size: 12px;
486
+ font-weight: var(--ns-weight-emphasis);
487
+ line-height: 1.5;
488
+ white-space: nowrap;
489
+ }
490
+
491
+ :root .p-tag::before {
492
+ width: 6px;
493
+ height: 6px;
494
+ flex: none;
495
+ border-radius: 50%;
496
+ background: var(--ns-status);
497
+ content: '';
498
+ }
499
+
500
+ :root .p-tag-success {
501
+ --ns-status: var(--ns-success);
502
+ }
503
+
504
+ :root .p-tag-danger {
505
+ --ns-status: var(--ns-danger);
506
+ }
507
+
508
+ :root .p-tag-warn {
509
+ --ns-status: var(--ns-warning);
510
+ }
511
+
512
+ :root .p-tag-info {
513
+ --ns-status: var(--ac-accent);
514
+ }
515
+
516
+ .cdk-drag-preview {
517
+ border: 1px solid var(--ac-accent);
518
+ border-radius: 12px;
519
+ background: var(--ac-surface);
520
+ box-shadow: var(--ns-shadow-2);
521
+ opacity: 0.96;
522
+ }
523
+
524
+ .cdk-drag-preview .grip {
525
+ color: var(--ac-accent);
526
+ }
527
+
528
+ :root .card-actions .p-button-text.p-button-secondary,
529
+ :root .actions .p-button-text.p-button-secondary {
530
+ color: var(--ac-text-muted);
531
+ }
532
+
533
+ :root .card-actions .p-button-text.p-button-secondary:not(:disabled):hover,
534
+ :root .actions .p-button-text.p-button-secondary:not(:disabled):hover {
535
+ background: color-mix(in srgb, var(--ac-text) 10%, transparent);
536
+ color: var(--ac-text);
537
+ }
538
+
539
+ :root .card-actions .p-button-text.p-button-danger,
540
+ :root .actions .p-button-text.p-button-danger {
541
+ color: var(--ns-danger);
542
+ }
543
+
544
+ :root .card-actions .p-button-text.p-button-danger:not(:disabled):hover,
545
+ :root .actions .p-button-text.p-button-danger:not(:disabled):hover {
546
+ background: color-mix(in srgb, var(--ns-danger) 14%, transparent);
547
+ color: var(--ns-danger);
548
+ }
549
+
550
+ :root .card-actions .p-button:disabled,
551
+ :root .actions .p-button:disabled {
552
+ opacity: 0.38;
553
+ }
@@ -1,11 +1,12 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, EnvironmentProviders, Signal, TemplateRef, OnDestroy, ElementRef } from '@angular/core';
2
+ import { InjectionToken, EnvironmentProviders, Signal, PipeTransform, TemplateRef, OnDestroy, ElementRef } from '@angular/core';
3
3
  import { HttpContextToken, HttpInterceptorFn } from '@angular/common/http';
4
4
  import { CanActivateFn } from '@angular/router';
5
5
  import * as _nucleus_suite_pe_core from '@nucleus-suite-pe/core';
6
6
  import * as _primeuix_themes from '@primeuix/themes';
7
7
  import * as _primeuix_themes_types_base from '@primeuix/themes/types/base';
8
8
  import { Popover } from 'primeng/popover';
9
+ import { CdkDrag, CdkDragDrop } from '@angular/cdk/drag-drop';
9
10
  import { MenuItem } from 'primeng/api';
10
11
 
11
12
  interface NucleusConfig {
@@ -132,6 +133,7 @@ interface CompanySummary {
132
133
  readonly countryName: string | null;
133
134
  readonly logoPath: string | null;
134
135
  readonly status: number;
136
+ readonly isActive: boolean;
135
137
  readonly isOwner: boolean;
136
138
  readonly ownerUserId: string;
137
139
  readonly siteCount: number;
@@ -308,6 +310,10 @@ interface CommonCopy {
308
310
  readonly noColor: string;
309
311
  readonly searchIcon: string;
310
312
  readonly noMatches: string;
313
+ readonly reorderHandle: string;
314
+ readonly noResults: string;
315
+ readonly viewGrid: string;
316
+ readonly viewRows: string;
311
317
  readonly sessionExpired: string;
312
318
  readonly errorNetwork: string;
313
319
  readonly errorTimeout: string;
@@ -344,6 +350,25 @@ declare function isOnOrBeforeToday(value: string | null | undefined): boolean;
344
350
  declare function startOfDayUtc(value: string): string;
345
351
  declare function endOfDayUtc(value: string): string;
346
352
 
353
+ declare function compactNumber(value: number): string;
354
+ declare function compactBytes(value: number): string;
355
+ declare function compactMegabytes(value: number): string;
356
+ declare class NucleusCompact implements PipeTransform {
357
+ transform(value: number | string | null | undefined, fallback?: string): string;
358
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusCompact, never>;
359
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<NucleusCompact, "nucleusCompact", true>;
360
+ }
361
+ declare class NucleusBytes implements PipeTransform {
362
+ transform(value: number | string | null | undefined, fallback?: string): string;
363
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusBytes, never>;
364
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<NucleusBytes, "nucleusBytes", true>;
365
+ }
366
+ declare class NucleusMegabytes implements PipeTransform {
367
+ transform(value: number | string | null | undefined, fallback?: string): string;
368
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusMegabytes, never>;
369
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<NucleusMegabytes, "nucleusMegabytes", true>;
370
+ }
371
+
347
372
  declare const FIELD_TARGETS: string;
348
373
  declare function isReachable(element: HTMLElement): boolean;
349
374
  declare function fieldsIn(root: HTMLElement): HTMLElement[];
@@ -498,10 +523,10 @@ declare function mixHex(foreground: string, background: string, ratio: number):
498
523
  declare function meetsContrast(foreground: string, background: string, required: number): boolean;
499
524
  declare function contrastIssue(scope: string, pair: string, foreground: string, background: string, required: number): ContrastIssue | null;
500
525
 
501
- type FrameId = 'nucleus' | 'ember' | 'forest' | 'plum' | 'midnight' | 'slate' | 'ocean' | 'sand' | 'ink' | 'graphite' | 'paper' | 'mist';
502
- type CanvasId = 'light' | 'dim' | 'dark';
526
+ type FrameId = 'nucleus' | 'ember' | 'forest' | 'plum' | 'midnight' | 'slate' | 'ocean' | 'sand' | 'ink' | 'graphite' | 'paper' | 'mist' | 'studio' | 'sage' | 'sky' | 'lavender';
527
+ type CanvasId = 'light' | 'soft' | 'dim' | 'dark';
503
528
  type CanvasPreference = CanvasId | 'system';
504
- type AccentId = 'violet' | 'blue' | 'cyan' | 'green' | 'lime' | 'amber' | 'orange' | 'rose' | 'red';
529
+ type AccentId = 'violet' | 'blue' | 'cyan' | 'green' | 'lime' | 'amber' | 'orange' | 'rose' | 'red' | 'indigo' | 'teal' | 'plum' | 'slate' | 'graphite';
505
530
  type AccentPreference = AccentId | 'auto';
506
531
  type DensityId = 'comfortable' | 'compact';
507
532
  interface FrameTokens {
@@ -679,10 +704,12 @@ declare class NucleusMetric {
679
704
  readonly hint: _angular_core.InputSignal<string>;
680
705
  readonly link: _angular_core.InputSignal<string | unknown[]>;
681
706
  readonly tone: _angular_core.InputSignal<MetricTone>;
707
+ readonly progress: _angular_core.InputSignal<number | null>;
708
+ protected readonly bar: _angular_core.Signal<number | null>;
682
709
  readonly loading: _angular_core.InputSignal<boolean | null>;
683
710
  protected readonly busy: _angular_core.Signal<boolean>;
684
711
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusMetric, never>;
685
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusMetric, "nucleus-metric", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
712
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusMetric, "nucleus-metric", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "link": { "alias": "link"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "progress": { "alias": "progress"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
686
713
  }
687
714
 
688
715
  interface TabItem {
@@ -837,8 +864,23 @@ declare class NucleusForm {
837
864
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusForm, "nucleus-form", never, { "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, [{ directive: typeof NucleusEnterAdvance; inputs: {}; outputs: {}; }]>;
838
865
  }
839
866
 
867
+ interface NucleusLinkTarget {
868
+ readonly route: readonly unknown[];
869
+ readonly queryParams?: Record<string, unknown>;
870
+ }
871
+ declare class NucleusLink {
872
+ readonly route: _angular_core.InputSignal<readonly unknown[] | null>;
873
+ readonly queryParams: _angular_core.InputSignal<Record<string, unknown> | null>;
874
+ readonly href: _angular_core.InputSignal<string | null>;
875
+ readonly hint: _angular_core.InputSignal<string>;
876
+ readonly muted: _angular_core.InputSignal<boolean>;
877
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusLink, never>;
878
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusLink, "nucleus-link", never, { "route": { "alias": "route"; "required": false; "isSignal": true; }; "queryParams": { "alias": "queryParams"; "required": false; "isSignal": true; }; "href": { "alias": "href"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "muted": { "alias": "muted"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
879
+ }
880
+
840
881
  type ListAlign = 'left' | 'center' | 'right';
841
882
  type ListColumnKind = 'text' | 'switch';
883
+ type ListColumnRole = 'identity' | 'status' | 'attribute' | 'hidden';
842
884
  interface ListTag {
843
885
  readonly label: string;
844
886
  readonly severity?: 'success' | 'info' | 'warn' | 'danger' | 'secondary';
@@ -847,6 +889,7 @@ interface ListColumn<T = Record<string, unknown>> {
847
889
  readonly key: string;
848
890
  readonly header: string;
849
891
  readonly kind?: ListColumnKind;
892
+ readonly role?: ListColumnRole;
850
893
  readonly align?: ListAlign;
851
894
  readonly strong?: boolean;
852
895
  readonly width?: string;
@@ -855,6 +898,7 @@ interface ListColumn<T = Record<string, unknown>> {
855
898
  readonly checked?: (row: T) => boolean;
856
899
  readonly disabled?: (row: T) => boolean;
857
900
  readonly hint?: (row: T) => string;
901
+ readonly link?: (row: T) => NucleusLinkTarget | null;
858
902
  }
859
903
  interface ListAction<T = Record<string, unknown>> {
860
904
  readonly id: string;
@@ -892,9 +936,48 @@ declare class NucleusList<T extends object = Record<string, unknown>> {
892
936
  readonly rowClass: _angular_core.InputSignal<(row: T) => string>;
893
937
  readonly pageSize: _angular_core.InputSignal<number>;
894
938
  readonly pageSizes: _angular_core.InputSignal<number[]>;
939
+ readonly cards: _angular_core.InputSignal<boolean>;
940
+ readonly reorderable: _angular_core.InputSignal<boolean>;
941
+ readonly searchable: _angular_core.InputSignal<boolean>;
942
+ readonly reorderGroup: _angular_core.InputSignal<((row: T) => string | null) | null>;
895
943
  readonly action: _angular_core.OutputEmitterRef<ListActionEvent<T>>;
944
+ readonly reorder: _angular_core.OutputEmitterRef<T[]>;
945
+ readonly dragStart: _angular_core.OutputEmitterRef<T>;
896
946
  readonly toggle: _angular_core.OutputEmitterRef<ListToggleEvent<T>>;
897
947
  private readonly cells;
948
+ private readonly language;
949
+ private readonly viewport;
950
+ protected readonly copy: _angular_core.Signal<_nucleus_suite_pe_core.CommonCopy>;
951
+ protected readonly term: _angular_core.WritableSignal<string>;
952
+ private readonly chosenView;
953
+ protected readonly canChooseView: _angular_core.Signal<boolean>;
954
+ protected readonly view: _angular_core.Signal<"grid" | "rows">;
955
+ protected chooseView(value: 'grid' | 'rows'): void;
956
+ protected readonly filtered: _angular_core.Signal<T[]>;
957
+ protected readonly dragLocked: _angular_core.Signal<boolean>;
958
+ protected readonly showNoResults: _angular_core.Signal<boolean>;
959
+ protected onSearch(event: Event): void;
960
+ private readonly firstRow;
961
+ private readonly rowsOverride;
962
+ protected readonly compact: _angular_core.Signal<boolean>;
963
+ protected readonly rowsPerPage: _angular_core.Signal<number>;
964
+ protected readonly identityColumn: _angular_core.Signal<ListColumn<T> | null>;
965
+ protected readonly statusColumn: _angular_core.Signal<ListColumn<T> | null>;
966
+ protected readonly attributeColumns: _angular_core.Signal<readonly ListColumn<T>[]>;
967
+ protected readonly pagedRows: _angular_core.Signal<T[]>;
968
+ private readonly resetPage;
969
+ protected readonly page: _angular_core.Signal<number>;
970
+ protected readonly sortAllowed: (index: number, drag: CdkDrag<T>) => boolean;
971
+ protected onRowReorder(event: {
972
+ dragIndex?: number;
973
+ dropIndex?: number;
974
+ }): void;
975
+ protected onCardDrop(event: CdkDragDrop<unknown>): void;
976
+ private applyMove;
977
+ protected onPage(event: {
978
+ first?: number;
979
+ rows?: number;
980
+ }): void;
898
981
  protected readonly paginate: _angular_core.Signal<boolean>;
899
982
  protected readonly tableStyle: _angular_core.Signal<{
900
983
  'min-width': string;
@@ -905,6 +988,7 @@ declare class NucleusList<T extends object = Record<string, unknown>> {
905
988
  protected skeletonWidth(column: ListColumn<T>): string;
906
989
  protected cellTemplate(key: string): TemplateRef<unknown> | null;
907
990
  protected text(column: ListColumn<T>, row: T): string;
991
+ protected linkOf(column: ListColumn<T>, row: T): NucleusLinkTarget | null;
908
992
  protected tagOf(column: ListColumn<T>, row: T): ListTag | null;
909
993
  protected visibleActions(row: T): readonly ListAction<T>[];
910
994
  protected isActionLocked(entry: ListAction<T>, row: T): boolean;
@@ -914,7 +998,7 @@ declare class NucleusList<T extends object = Record<string, unknown>> {
914
998
  protected hintOf(column: ListColumn<T>, row: T): string;
915
999
  protected flip(column: ListColumn<T>, row: T): void;
916
1000
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusList<any>, never>;
917
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusList<any>, "nucleus-list", never, { "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "empty": { "alias": "empty"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "skeletonRows": { "alias": "skeletonRows"; "required": false; "isSignal": true; }; "rowClass": { "alias": "rowClass"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "pageSizes": { "alias": "pageSizes"; "required": false; "isSignal": true; }; }, { "action": "action"; "toggle": "toggle"; }, ["cells"], ["[nucleusListTitle]", "[nucleusListActions]"], true, never>;
1001
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusList<any>, "nucleus-list", never, { "rows": { "alias": "rows"; "required": true; "isSignal": true; }; "columns": { "alias": "columns"; "required": true; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "empty": { "alias": "empty"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "skeletonRows": { "alias": "skeletonRows"; "required": false; "isSignal": true; }; "rowClass": { "alias": "rowClass"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "pageSizes": { "alias": "pageSizes"; "required": false; "isSignal": true; }; "cards": { "alias": "cards"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "reorderGroup": { "alias": "reorderGroup"; "required": false; "isSignal": true; }; }, { "action": "action"; "reorder": "reorder"; "dragStart": "dragStart"; "toggle": "toggle"; }, ["cells"], ["[nucleusListTitle]", "[nucleusListActions]"], true, never>;
918
1002
  }
919
1003
 
920
1004
  interface TreeRow {
@@ -979,6 +1063,17 @@ declare class NucleusAppearance {
979
1063
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusAppearance, "nucleus-appearance", never, {}, {}, never, never, true, never>;
980
1064
  }
981
1065
 
1066
+ declare const NUCLEUS_NARROW_QUERY = "(max-width: 720px)";
1067
+ declare class NucleusViewport {
1068
+ private readonly query;
1069
+ private readonly _narrow;
1070
+ readonly narrow: _angular_core.Signal<boolean>;
1071
+ constructor();
1072
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusViewport, never>;
1073
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<NucleusViewport>;
1074
+ }
1075
+
1076
+ type MenuLayout = 'list' | 'grid';
982
1077
  interface MenuTile {
983
1078
  readonly label: string;
984
1079
  readonly icon: string | null;
@@ -1015,9 +1110,14 @@ declare class NucleusMenu {
1015
1110
  readonly emptyText: _angular_core.InputSignal<string>;
1016
1111
  readonly keyboardHint: _angular_core.InputSignal<string>;
1017
1112
  readonly width: _angular_core.InputSignal<number>;
1113
+ readonly layout: _angular_core.InputSignal<MenuLayout>;
1114
+ readonly columns: _angular_core.InputSignal<number>;
1018
1115
  readonly select: _angular_core.OutputEmitterRef<MenuRow>;
1019
1116
  readonly dismiss: _angular_core.OutputEmitterRef<void>;
1020
1117
  protected readonly term: _angular_core.WritableSignal<string>;
1118
+ protected readonly grid: _angular_core.Signal<boolean>;
1119
+ private readonly keyed;
1120
+ private readonly pointed;
1021
1121
  private readonly searchBox;
1022
1122
  private readonly root;
1023
1123
  protected readonly visible: _angular_core.Signal<readonly MenuSection[]>;
@@ -1031,11 +1131,13 @@ declare class NucleusMenu {
1031
1131
  protected onTerm(value: string): void;
1032
1132
  protected choose(row: MenuRow): void;
1033
1133
  protected onKeydown(event: KeyboardEvent): void;
1134
+ private moveOf;
1034
1135
  private step;
1136
+ private landing;
1035
1137
  private scrollIntoView;
1036
1138
  private focusEntry;
1037
1139
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusMenu, never>;
1038
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusMenu, "nucleus-menu", never, { "sections": { "alias": "sections"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "keyboardHint": { "alias": "keyboardHint"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, { "select": "select"; "dismiss": "dismiss"; }, never, never, true, never>;
1140
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusMenu, "nucleus-menu", never, { "sections": { "alias": "sections"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "badge": { "alias": "badge"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyText": { "alias": "emptyText"; "required": false; "isSignal": true; }; "keyboardHint": { "alias": "keyboardHint"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; }, { "select": "select"; "dismiss": "dismiss"; }, never, never, true, never>;
1039
1141
  }
1040
1142
 
1041
1143
  declare class NucleusRecentApps {
@@ -1074,9 +1176,8 @@ interface ShellCopy {
1074
1176
  readonly appsSwitch: string;
1075
1177
  readonly appsSearch: string;
1076
1178
  readonly appsNoMatch: string;
1077
- readonly appsRecent: string;
1078
- readonly appsAll: string;
1079
1179
  readonly appsAvailable: string;
1180
+ readonly appsUpcoming: string;
1080
1181
  readonly appsHere: string;
1081
1182
  readonly keyboardHint: string;
1082
1183
  readonly accountSwitchHint: string;
@@ -1178,7 +1279,6 @@ declare class NucleusShell {
1178
1279
  protected readonly words: _angular_core.Signal<_nucleus_suite_pe_core.CommonCopy>;
1179
1280
  protected readonly hasSiteContext: _angular_core.Signal<boolean>;
1180
1281
  protected readonly launcherRich: _angular_core.Signal<boolean>;
1181
- protected readonly launcherCount: _angular_core.Signal<string | null>;
1182
1282
  protected readonly launcherSections: _angular_core.Signal<MenuSection[]>;
1183
1283
  protected readonly accountSections: _angular_core.Signal<MenuSection[]>;
1184
1284
  protected readonly accountContext: _angular_core.Signal<string>;
@@ -1214,5 +1314,5 @@ declare class NucleusShell {
1214
1314
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusShell, "nucleus-shell", never, { "brand": { "alias": "brand"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "navItems": { "alias": "navItems"; "required": false; "isSignal": true; }; "activeNavId": { "alias": "activeNavId"; "required": false; "isSignal": true; }; "selectedMenuId": { "alias": "selectedMenuId"; "required": false; "isSignal": true; }; }, { "navSelect": "navSelect"; "menuSelect": "menuSelect"; }, never, ["[nucleusTop]", "*"], true, never>;
1215
1315
  }
1216
1316
 
1217
- export { ACCENTS, CANVASES, COMMON_COPY, CONTROL_CONTRAST, DEFAULT_APPEARANCE, DENSITIES, EMPTY_GEO_VALUE, FIELD_TARGETS, FRAMES, GEO_COPY, LEGACY_THEMES, NO_PERMISSIONS, NUCLEUS_ACCENTS, NUCLEUS_CONFIG, NUCLEUS_DARK_SELECTOR, NUCLEUS_FORCE_BEARER, NUCLEUS_HOME, NUCLEUS_ICONS, NUCLEUS_ICON_CATALOG, NUCLEUS_LANGS, NUCLEUS_LOGOUT_PARAM, NUCLEUS_SKIP_AUTH, NucleusAppearance, NucleusAuth, NucleusCache, NucleusCard, NucleusCell, NucleusColorPicker, NucleusEnterAdvance, NucleusFeedback, NucleusForm, NucleusGeo, NucleusGeoSelect, NucleusIconPicker, NucleusLanguage, NucleusList, NucleusLordicon, NucleusMark, NucleusMenu, NucleusMetric, NucleusMetrics, NucleusPage, NucleusPageActions, NucleusPreset, NucleusRecentApps, NucleusSessionAuth, NucleusShell, NucleusShortcut, NucleusShortcuts, NucleusStarfield, NucleusTabs, SHELL_COPY, SessionService, TEXT_CONTRAST, THEME_COPY, ThemeService, UserSyncService, accentById, accentLabelOf, accentOn, ariaKeysOf, auditAppearance, canvasById, clock, comboOf, commonCopyOf, consumeNucleusLogout, contrastIssue, contrastRatio, day, densityById, endOfDayUtc, fieldsIn, findMenuByRoute, flagOf, foldText, frameById, geoCopyOf, hasChildren, hasModifier, iconClassOf, iconNameOf, integer, isAccentPreference, isApplePlatform, isBeforeToday, isCanvasPreference, isDarkCanvas, isDensityId, isFieldSearchable, isFrameId, isHomeRoute, isNucleusConfigured, isOnOrBeforeToday, isReachable, isToday, isTypingTarget, isUnderRoute, isoDay, levelLabel, loadLordicon, loadNucleusConfig, matchMenuByRoute, matchesRow, meetsContrast, menuGlyph, menuTile, minutesAsClock, mixHex, money, moveTo, normalizeHomeRoute, normalizeKeys, nucleusAccessGuard, nucleusAuthInterceptor, nucleusErrorMessage, nucleusLang, nucleusLogoutUrl, nucleusParseDate, ownsUrl, percent, permissionsOf, provideNucleus, provideNucleusFeedback, provideNucleusHome, provideNucleusTheme, qty, readableOn, relativeLuminance, resolveAccent, resolveFieldSize, routePath, searchIcons, selectableRows, shiftDay, shortcutHint, signedMoney, stamp, startOfDayUtc, themeCopyOf, toNumber, toggleCollapsed, visibleTreeRows };
1218
- export type { Accent, AccentId, AccentOption, AccentPreference, AccessScope, AppSummary, AppUser, Appearance, AuthSyncRequest, Canvas, CanvasEffects, CanvasId, CanvasPreference, CanvasTokens, CardSize, CommonCopy, CommonCopySet, CompanyOption, CompanyRelation, CompanySummary, ConfirmRequest, ContrastIssue, Crumb, Density, DensityId, FieldKind, FieldOption, FieldSize, FieldSpan, FormField, FormValue, Frame, FrameId, FrameTokens, GeoCopy, GeoCopySet, GeoCountry, GeoDivision, GeoLevel, GeoPlace, GeoValue, GlobalAccess, LauncherApp, ListAction, ListActionEvent, ListAlign, ListColumn, ListColumnKind, ListTag, ListToggleEvent, MeResponse, MenuNode, MenuPermissions, MenuRow, MenuSection, MenuTile, MetricTone, NucleusConfig, NucleusIdentity, NucleusLang, SessionTicket, ShellCopy, ShellNavItem, ShortcutBinding, Site, SiteAccess, Subscription, TabItem, ThemeCopy, TreeRow, UserProfile };
1317
+ export { ACCENTS, CANVASES, COMMON_COPY, CONTROL_CONTRAST, DEFAULT_APPEARANCE, DENSITIES, EMPTY_GEO_VALUE, FIELD_TARGETS, FRAMES, GEO_COPY, LEGACY_THEMES, NO_PERMISSIONS, NUCLEUS_ACCENTS, NUCLEUS_CONFIG, NUCLEUS_DARK_SELECTOR, NUCLEUS_FORCE_BEARER, NUCLEUS_HOME, NUCLEUS_ICONS, NUCLEUS_ICON_CATALOG, NUCLEUS_LANGS, NUCLEUS_LOGOUT_PARAM, NUCLEUS_NARROW_QUERY, NUCLEUS_SKIP_AUTH, NucleusAppearance, NucleusAuth, NucleusBytes, NucleusCache, NucleusCard, NucleusCell, NucleusColorPicker, NucleusCompact, NucleusEnterAdvance, NucleusFeedback, NucleusForm, NucleusGeo, NucleusGeoSelect, NucleusIconPicker, NucleusLanguage, NucleusLink, NucleusList, NucleusLordicon, NucleusMark, NucleusMegabytes, NucleusMenu, NucleusMetric, NucleusMetrics, NucleusPage, NucleusPageActions, NucleusPreset, NucleusRecentApps, NucleusSessionAuth, NucleusShell, NucleusShortcut, NucleusShortcuts, NucleusStarfield, NucleusTabs, NucleusViewport, SHELL_COPY, SessionService, TEXT_CONTRAST, THEME_COPY, ThemeService, UserSyncService, accentById, accentLabelOf, accentOn, ariaKeysOf, auditAppearance, canvasById, clock, comboOf, commonCopyOf, compactBytes, compactMegabytes, compactNumber, consumeNucleusLogout, contrastIssue, contrastRatio, day, densityById, endOfDayUtc, fieldsIn, findMenuByRoute, flagOf, foldText, frameById, geoCopyOf, hasChildren, hasModifier, iconClassOf, iconNameOf, integer, isAccentPreference, isApplePlatform, isBeforeToday, isCanvasPreference, isDarkCanvas, isDensityId, isFieldSearchable, isFrameId, isHomeRoute, isNucleusConfigured, isOnOrBeforeToday, isReachable, isToday, isTypingTarget, isUnderRoute, isoDay, levelLabel, loadLordicon, loadNucleusConfig, matchMenuByRoute, matchesRow, meetsContrast, menuGlyph, menuTile, minutesAsClock, mixHex, money, moveTo, normalizeHomeRoute, normalizeKeys, nucleusAccessGuard, nucleusAuthInterceptor, nucleusErrorMessage, nucleusLang, nucleusLogoutUrl, nucleusParseDate, ownsUrl, percent, permissionsOf, provideNucleus, provideNucleusFeedback, provideNucleusHome, provideNucleusTheme, qty, readableOn, relativeLuminance, resolveAccent, resolveFieldSize, routePath, searchIcons, selectableRows, shiftDay, shortcutHint, signedMoney, stamp, startOfDayUtc, themeCopyOf, toNumber, toggleCollapsed, visibleTreeRows };
1318
+ export type { Accent, AccentId, AccentOption, AccentPreference, AccessScope, AppSummary, AppUser, Appearance, AuthSyncRequest, Canvas, CanvasEffects, CanvasId, CanvasPreference, CanvasTokens, CardSize, CommonCopy, CommonCopySet, CompanyOption, CompanyRelation, CompanySummary, ConfirmRequest, ContrastIssue, Crumb, Density, DensityId, FieldKind, FieldOption, FieldSize, FieldSpan, FormField, FormValue, Frame, FrameId, FrameTokens, GeoCopy, GeoCopySet, GeoCountry, GeoDivision, GeoLevel, GeoPlace, GeoValue, GlobalAccess, LauncherApp, ListAction, ListActionEvent, ListAlign, ListColumn, ListColumnKind, ListColumnRole, ListTag, ListToggleEvent, MeResponse, MenuLayout, MenuNode, MenuPermissions, MenuRow, MenuSection, MenuTile, MetricTone, NucleusConfig, NucleusIdentity, NucleusLang, NucleusLinkTarget, SessionTicket, ShellCopy, ShellNavItem, ShortcutBinding, Site, SiteAccess, Subscription, TabItem, ThemeCopy, TreeRow, UserProfile };