@nucleus-suite-pe/core 1.0.0 → 2.0.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": "1.0.0",
3
+ "version": "2.0.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",
@@ -26,11 +26,17 @@
26
26
  "@primeuix/themes": "^3.0.0",
27
27
  "@angular/router": "^21.2.0",
28
28
  "@angular/forms": "^21.2.0",
29
- "primeicons": "^8.0.0"
29
+ "primeicons": "^8.0.0",
30
+ "chart.js": "^4.4.0"
30
31
  },
31
32
  "dependencies": {
32
33
  "tslib": "^2.3.0"
33
34
  },
35
+ "peerDependenciesMeta": {
36
+ "chart.js": {
37
+ "optional": true
38
+ }
39
+ },
34
40
  "module": "fesm2022/nucleus-suite-pe-core.mjs",
35
41
  "typings": "types/nucleus-suite-pe-core.d.ts",
36
42
  "exports": {
@@ -40,6 +46,10 @@
40
46
  ".": {
41
47
  "types": "./types/nucleus-suite-pe-core.d.ts",
42
48
  "default": "./fesm2022/nucleus-suite-pe-core.mjs"
49
+ },
50
+ "./charts": {
51
+ "types": "./types/nucleus-suite-pe-core-charts.d.ts",
52
+ "default": "./fesm2022/nucleus-suite-pe-core-charts.mjs"
43
53
  }
44
54
  },
45
55
  "type": "module"
package/styles/tokens.css CHANGED
@@ -33,7 +33,7 @@
33
33
  --ns-form-gap-y: calc(18px * var(--ns-density));
34
34
  --ns-control-y: calc(0.55rem * var(--ns-density));
35
35
 
36
- --ac-font: 'Space Grotesk', sans-serif;
36
+ --ac-font: 'IBM Plex Sans', 'Segoe UI', system-ui, sans-serif;
37
37
  --ac-radius-pill: 999px;
38
38
  --ac-radius-box: 4px;
39
39
  }
@@ -231,7 +231,7 @@ input {
231
231
  }
232
232
 
233
233
  .ns-crumbs.p-breadcrumb {
234
- margin-bottom: 14px;
234
+ margin: 0;
235
235
  padding: 0;
236
236
  border: 0;
237
237
  background: transparent;
@@ -452,3 +452,12 @@ input {
452
452
  flex: none;
453
453
  width: 18px;
454
454
  }
455
+
456
+ /* Cifras tabulares donde los numeros se leen en columna: una tabla de montos
457
+ con cifras proporcionales no alinea las unidades y obliga a leer dos veces. */
458
+ .ns-list td,
459
+ .ns-list th,
460
+ nucleus-metric .value,
461
+ nucleus-chart {
462
+ font-variant-numeric: tabular-nums;
463
+ }
@@ -0,0 +1,129 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ type ChartKind = 'line' | 'area' | 'bar' | 'stackedBar' | 'doughnut';
4
+ type ChartValueKind = 'number' | 'bytes' | 'currency';
5
+ interface ChartSeries {
6
+ readonly key: string;
7
+ readonly label: string;
8
+ readonly values: readonly (number | null)[];
9
+ readonly color?: string;
10
+ }
11
+ interface ChartPalette {
12
+ readonly series: readonly string[];
13
+ readonly ink: string;
14
+ readonly muted: string;
15
+ readonly line: string;
16
+ readonly accent: string;
17
+ }
18
+
19
+ declare function chartPalette(host: Element, dark: boolean, accent: string): ChartPalette;
20
+
21
+ declare class NucleusChart {
22
+ private readonly host;
23
+ private readonly theme;
24
+ private readonly language;
25
+ readonly kind: _angular_core.InputSignal<ChartKind>;
26
+ readonly series: _angular_core.InputSignal<readonly ChartSeries[]>;
27
+ readonly labels: _angular_core.InputSignal<readonly string[]>;
28
+ readonly height: _angular_core.InputSignal<number>;
29
+ readonly valueKind: _angular_core.InputSignal<ChartValueKind>;
30
+ readonly currency: _angular_core.InputSignal<string>;
31
+ readonly empty: _angular_core.InputSignal<string>;
32
+ readonly caption: _angular_core.InputSignal<string>;
33
+ readonly axisLabel: _angular_core.InputSignal<string>;
34
+ readonly beginAtZero: _angular_core.InputSignal<boolean>;
35
+ protected readonly heightPx: _angular_core.Signal<string>;
36
+ protected readonly hasData: _angular_core.Signal<boolean>;
37
+ protected readonly primeType: _angular_core.Signal<"line" | "bar" | "doughnut">;
38
+ private readonly palette;
39
+ protected readonly data: _angular_core.Signal<{
40
+ labels: string[];
41
+ datasets: {
42
+ data: (number | null)[];
43
+ backgroundColor: string[];
44
+ borderWidth: number;
45
+ }[];
46
+ } | {
47
+ labels: string[];
48
+ datasets: {
49
+ label: string;
50
+ data: (number | null)[];
51
+ borderColor: string;
52
+ backgroundColor: string;
53
+ fill: boolean;
54
+ tension: number;
55
+ borderWidth: number;
56
+ pointRadius: number;
57
+ pointHoverRadius: number;
58
+ borderRadius: number;
59
+ }[];
60
+ }>;
61
+ protected readonly options: _angular_core.Signal<{
62
+ maintainAspectRatio: boolean;
63
+ animation: {
64
+ duration: number;
65
+ };
66
+ interaction: {
67
+ mode: string;
68
+ intersect: boolean;
69
+ };
70
+ plugins: {
71
+ legend: {
72
+ display: boolean;
73
+ position: string;
74
+ labels: {
75
+ color: string;
76
+ usePointStyle: boolean;
77
+ boxWidth: number;
78
+ };
79
+ };
80
+ tooltip: {
81
+ callbacks: {
82
+ label(context: {
83
+ dataset: {
84
+ label?: string;
85
+ };
86
+ parsed: {
87
+ y?: number;
88
+ } | number;
89
+ }): string;
90
+ };
91
+ };
92
+ };
93
+ scales: {
94
+ x?: undefined;
95
+ y?: undefined;
96
+ } | {
97
+ x: {
98
+ stacked: boolean;
99
+ ticks: {
100
+ color: string;
101
+ maxRotation: number;
102
+ autoSkipPadding: number;
103
+ };
104
+ grid: {
105
+ display: boolean;
106
+ };
107
+ };
108
+ y: {
109
+ stacked: boolean;
110
+ beginAtZero: boolean;
111
+ ticks: {
112
+ color: string;
113
+ callback: (value: number) => string;
114
+ };
115
+ grid: {
116
+ color: string;
117
+ drawBorder: boolean;
118
+ };
119
+ };
120
+ };
121
+ }>;
122
+ protected format(value: number | null | undefined): string;
123
+ private bytes;
124
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusChart, never>;
125
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusChart, "nucleus-chart", never, { "kind": { "alias": "kind"; "required": false; "isSignal": true; }; "series": { "alias": "series"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "valueKind": { "alias": "valueKind"; "required": false; "isSignal": true; }; "currency": { "alias": "currency"; "required": false; "isSignal": true; }; "empty": { "alias": "empty"; "required": false; "isSignal": true; }; "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "axisLabel": { "alias": "axisLabel"; "required": false; "isSignal": true; }; "beginAtZero": { "alias": "beginAtZero"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
126
+ }
127
+
128
+ export { NucleusChart, chartPalette };
129
+ export type { ChartKind, ChartPalette, ChartSeries, ChartValueKind };
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken, EnvironmentProviders, Signal, ElementRef, TemplateRef } from '@angular/core';
2
+ import { InjectionToken, EnvironmentProviders, Signal, TemplateRef, OnDestroy, ElementRef } from '@angular/core';
3
3
  import { HttpContextToken, HttpInterceptorFn } from '@angular/common/http';
4
4
  import * as _nucleus_suite_pe_core from '@nucleus-suite-pe/core';
5
5
  import * as _primeuix_themes from '@primeuix/themes';
@@ -53,10 +53,13 @@ declare class NucleusSessionAuth {
53
53
  private readonly injector;
54
54
  private readonly _ticket;
55
55
  private readonly _failed;
56
+ private readonly _usable;
56
57
  private pending;
57
58
  readonly ticket: _angular_core.Signal<SessionTicket | null>;
58
59
  readonly failed: _angular_core.Signal<boolean>;
59
60
  readonly established: _angular_core.Signal<boolean>;
61
+ readonly usable: _angular_core.Signal<boolean>;
62
+ disable(): void;
60
63
  establish(force?: boolean): Promise<boolean>;
61
64
  clear(): Promise<void>;
62
65
  private request;
@@ -687,13 +690,22 @@ interface Crumb {
687
690
  }
688
691
  declare class NucleusPage {
689
692
  readonly heading: _angular_core.WritableSignal<string>;
690
- readonly lead: _angular_core.WritableSignal<string>;
691
693
  readonly crumbs: _angular_core.WritableSignal<readonly Crumb[]>;
692
- set(heading: string, lead?: string, crumbs?: readonly Crumb[]): void;
694
+ readonly actions: _angular_core.WritableSignal<TemplateRef<unknown> | null>;
695
+ set(heading: string, crumbs?: readonly Crumb[]): void;
693
696
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusPage, never>;
694
697
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<NucleusPage>;
695
698
  }
696
699
 
700
+ declare class NucleusPageActions implements OnDestroy {
701
+ private readonly page;
702
+ private readonly template;
703
+ constructor();
704
+ ngOnDestroy(): void;
705
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusPageActions, never>;
706
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NucleusPageActions, "[nucleusPageActions]", never, {}, {}, never, never, true, never>;
707
+ }
708
+
697
709
  interface ConfirmRequest {
698
710
  readonly header: string;
699
711
  readonly message: string;
@@ -864,9 +876,12 @@ declare class NucleusList<T extends object = Record<string, unknown>> {
864
876
  readonly minWidth: _angular_core.InputSignal<string>;
865
877
  readonly skeletonRows: _angular_core.InputSignal<number>;
866
878
  readonly rowClass: _angular_core.InputSignal<(row: T) => string>;
879
+ readonly pageSize: _angular_core.InputSignal<number>;
880
+ readonly pageSizes: _angular_core.InputSignal<number[]>;
867
881
  readonly action: _angular_core.OutputEmitterRef<ListActionEvent<T>>;
868
882
  readonly toggle: _angular_core.OutputEmitterRef<ListToggleEvent<T>>;
869
883
  private readonly cells;
884
+ protected readonly paginate: _angular_core.Signal<boolean>;
870
885
  protected readonly tableStyle: _angular_core.Signal<{
871
886
  'min-width': string;
872
887
  }>;
@@ -885,7 +900,7 @@ declare class NucleusList<T extends object = Record<string, unknown>> {
885
900
  protected hintOf(column: ListColumn<T>, row: T): string;
886
901
  protected flip(column: ListColumn<T>, row: T): void;
887
902
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusList<any>, never>;
888
- 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; }; }, { "action": "action"; "toggle": "toggle"; }, ["cells"], ["[nucleusListTitle]", "[nucleusListActions]"], true, never>;
903
+ 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>;
889
904
  }
890
905
 
891
906
  interface TreeRow {
@@ -1100,7 +1115,6 @@ declare class NucleusShell {
1100
1115
  private readonly router;
1101
1116
  readonly brand: _angular_core.InputSignal<string>;
1102
1117
  readonly heading: _angular_core.InputSignal<string>;
1103
- readonly lead: _angular_core.InputSignal<string>;
1104
1118
  readonly navItems: _angular_core.InputSignal<readonly ShellNavItem[]>;
1105
1119
  readonly activeNavId: _angular_core.InputSignal<string | null>;
1106
1120
  readonly selectedMenuId: _angular_core.InputSignal<string | null>;
@@ -1117,7 +1131,7 @@ declare class NucleusShell {
1117
1131
  };
1118
1132
  protected readonly menuPlaceholders: string[];
1119
1133
  protected readonly title: _angular_core.Signal<string>;
1120
- protected readonly subtitle: _angular_core.Signal<string>;
1134
+ protected readonly pageActions: _angular_core.WritableSignal<_angular_core.TemplateRef<unknown> | null>;
1121
1135
  protected readonly home: _angular_core.Signal<MenuItem>;
1122
1136
  protected readonly crumbs: _angular_core.Signal<MenuItem[]>;
1123
1137
  protected readonly copy: _angular_core.Signal<_nucleus_suite_pe_core.ShellCopy>;
@@ -1177,8 +1191,8 @@ declare class NucleusShell {
1177
1191
  protected signOut(): Promise<void>;
1178
1192
  private loadSites;
1179
1193
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NucleusShell, never>;
1180
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NucleusShell, "nucleus-shell", never, { "brand": { "alias": "brand"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "lead": { "alias": "lead"; "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>;
1194
+ 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>;
1181
1195
  }
1182
1196
 
1183
- 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_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, 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, isNucleusConfigured, isOnOrBeforeToday, isReachable, isToday, isTypingTarget, isoDay, levelLabel, loadLordicon, loadNucleusConfig, matchesRow, meetsContrast, menuGlyph, menuTile, minutesAsClock, mixHex, money, moveTo, normalizeKeys, nucleusAuthInterceptor, nucleusErrorMessage, nucleusLang, nucleusLogoutUrl, nucleusParseDate, ownsUrl, percent, permissionsOf, provideNucleus, provideNucleusFeedback, provideNucleusTheme, qty, readableOn, relativeLuminance, resolveAccent, resolveFieldSize, searchIcons, selectableRows, shiftDay, shortcutHint, signedMoney, stamp, startOfDayUtc, themeCopyOf, toNumber, toggleCollapsed, visibleTreeRows };
1197
+ 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_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, isNucleusConfigured, isOnOrBeforeToday, isReachable, isToday, isTypingTarget, isoDay, levelLabel, loadLordicon, loadNucleusConfig, matchesRow, meetsContrast, menuGlyph, menuTile, minutesAsClock, mixHex, money, moveTo, normalizeKeys, nucleusAuthInterceptor, nucleusErrorMessage, nucleusLang, nucleusLogoutUrl, nucleusParseDate, ownsUrl, percent, permissionsOf, provideNucleus, provideNucleusFeedback, provideNucleusTheme, qty, readableOn, relativeLuminance, resolveAccent, resolveFieldSize, searchIcons, selectableRows, shiftDay, shortcutHint, signedMoney, stamp, startOfDayUtc, themeCopyOf, toNumber, toggleCollapsed, visibleTreeRows };
1184
1198
  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 };