@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.
@@ -0,0 +1,256 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, ElementRef, input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import * as i1 from 'primeng/chart';
4
+ import { ChartModule } from 'primeng/chart';
5
+ import { ThemeService, NucleusLanguage } from '@nucleus-suite-pe/core';
6
+
7
+ const LIGHT_FALLBACK = {
8
+ series: ['#4f6bed', '#1f9d76', '#d08700', '#c2410c', '#8b5cf6', '#0891b2'],
9
+ ink: '#27272a',
10
+ muted: '#71717a',
11
+ line: '#e4e4e7',
12
+ accent: '#4f6bed',
13
+ };
14
+ const DARK_FALLBACK = {
15
+ series: ['#8aa0ff', '#4cc79b', '#e8b24a', '#f08a5d', '#b794f6', '#38bdf8'],
16
+ ink: '#e4e4e7',
17
+ muted: '#a1a1aa',
18
+ line: '#3f3f46',
19
+ accent: '#8aa0ff',
20
+ };
21
+ function readToken(host, name) {
22
+ try {
23
+ const value = getComputedStyle(host).getPropertyValue(name).trim();
24
+ return value.length > 0 ? value : '';
25
+ }
26
+ catch {
27
+ return '';
28
+ }
29
+ }
30
+ function rotate(accent, dark) {
31
+ const base = dark ? DARK_FALLBACK.series : LIGHT_FALLBACK.series;
32
+ return [accent, ...base.filter((color) => color.toLowerCase() !== accent.toLowerCase())];
33
+ }
34
+ function chartPalette(host, dark, accent) {
35
+ const fallback = dark ? DARK_FALLBACK : LIGHT_FALLBACK;
36
+ return {
37
+ series: rotate(accent || fallback.accent, dark),
38
+ ink: readToken(host, '--ns-frame-ink') || fallback.ink,
39
+ muted: readToken(host, '--ns-frame-muted') || fallback.muted,
40
+ line: readToken(host, '--ns-frame-line') || fallback.line,
41
+ accent: accent || fallback.accent,
42
+ };
43
+ }
44
+
45
+ class NucleusChart {
46
+ host = inject(ElementRef);
47
+ theme = inject(ThemeService);
48
+ language = inject(NucleusLanguage);
49
+ kind = input('line', ...(ngDevMode ? [{ debugName: "kind" }] : /* istanbul ignore next */ []));
50
+ series = input([], ...(ngDevMode ? [{ debugName: "series" }] : /* istanbul ignore next */ []));
51
+ labels = input([], ...(ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []));
52
+ height = input(260, ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
53
+ valueKind = input('number', ...(ngDevMode ? [{ debugName: "valueKind" }] : /* istanbul ignore next */ []));
54
+ currency = input('', ...(ngDevMode ? [{ debugName: "currency" }] : /* istanbul ignore next */ []));
55
+ empty = input('', ...(ngDevMode ? [{ debugName: "empty" }] : /* istanbul ignore next */ []));
56
+ caption = input('', ...(ngDevMode ? [{ debugName: "caption" }] : /* istanbul ignore next */ []));
57
+ axisLabel = input('', ...(ngDevMode ? [{ debugName: "axisLabel" }] : /* istanbul ignore next */ []));
58
+ beginAtZero = input(true, ...(ngDevMode ? [{ debugName: "beginAtZero" }] : /* istanbul ignore next */ []));
59
+ heightPx = computed(() => `${this.height()}px`, ...(ngDevMode ? [{ debugName: "heightPx" }] : /* istanbul ignore next */ []));
60
+ hasData = computed(() => this.labels().length > 0 && this.series().some((serie) => serie.values.length > 0), ...(ngDevMode ? [{ debugName: "hasData" }] : /* istanbul ignore next */ []));
61
+ primeType = computed(() => {
62
+ const kind = this.kind();
63
+ if (kind === 'area' || kind === 'line')
64
+ return 'line';
65
+ if (kind === 'doughnut')
66
+ return 'doughnut';
67
+ return 'bar';
68
+ }, ...(ngDevMode ? [{ debugName: "primeType" }] : /* istanbul ignore next */ []));
69
+ palette = computed(() => chartPalette(this.host.nativeElement, this.theme.canvasId() === 'dark', this.theme.accentColor()), ...(ngDevMode ? [{ debugName: "palette" }] : /* istanbul ignore next */ []));
70
+ data = computed(() => {
71
+ const palette = this.palette();
72
+ const kind = this.kind();
73
+ if (kind === 'doughnut') {
74
+ const serie = this.series()[0];
75
+ return {
76
+ labels: [...this.labels()],
77
+ datasets: [
78
+ {
79
+ data: serie ? [...serie.values] : [],
80
+ backgroundColor: [...palette.series],
81
+ borderWidth: 0,
82
+ },
83
+ ],
84
+ };
85
+ }
86
+ return {
87
+ labels: [...this.labels()],
88
+ datasets: this.series().map((serie, index) => {
89
+ const color = serie.color ?? palette.series[index % palette.series.length];
90
+ return {
91
+ label: serie.label,
92
+ data: [...serie.values],
93
+ borderColor: color,
94
+ backgroundColor: kind === 'area' ? `${color}26` : color,
95
+ fill: kind === 'area',
96
+ tension: kind === 'line' || kind === 'area' ? 0.3 : 0,
97
+ borderWidth: kind === 'bar' || kind === 'stackedBar' ? 0 : 2,
98
+ pointRadius: 0,
99
+ pointHoverRadius: 4,
100
+ borderRadius: kind === 'bar' || kind === 'stackedBar' ? 4 : 0,
101
+ };
102
+ }),
103
+ };
104
+ }, ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
105
+ options = computed(() => {
106
+ const palette = this.palette();
107
+ const stacked = this.kind() === 'stackedBar';
108
+ const doughnut = this.kind() === 'doughnut';
109
+ const self = this;
110
+ return {
111
+ maintainAspectRatio: false,
112
+ animation: { duration: 400 },
113
+ interaction: { mode: 'index', intersect: false },
114
+ plugins: {
115
+ legend: {
116
+ display: this.series().length > 1 || doughnut,
117
+ position: 'bottom',
118
+ labels: { color: palette.muted, usePointStyle: true, boxWidth: 8 },
119
+ },
120
+ tooltip: {
121
+ callbacks: {
122
+ label(context) {
123
+ const raw = typeof context.parsed === 'number' ? context.parsed : (context.parsed.y ?? 0);
124
+ const name = context.dataset.label ? `${context.dataset.label}: ` : '';
125
+ return name + self.format(raw);
126
+ },
127
+ },
128
+ },
129
+ },
130
+ scales: doughnut
131
+ ? {}
132
+ : {
133
+ x: {
134
+ stacked,
135
+ ticks: { color: palette.muted, maxRotation: 0, autoSkipPadding: 16 },
136
+ grid: { display: false },
137
+ },
138
+ y: {
139
+ stacked,
140
+ beginAtZero: this.beginAtZero(),
141
+ ticks: {
142
+ color: palette.muted,
143
+ callback: (value) => self.format(value),
144
+ },
145
+ grid: { color: palette.line, drawBorder: false },
146
+ },
147
+ },
148
+ };
149
+ }, ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
150
+ format(value) {
151
+ if (value === null || value === undefined)
152
+ return '—';
153
+ const locale = this.language.lang() === 'es' ? 'es-PE' : 'en-US';
154
+ if (this.valueKind() === 'bytes')
155
+ return this.bytes(value, locale);
156
+ if (this.valueKind() === 'currency' && this.currency()) {
157
+ return new Intl.NumberFormat(locale, {
158
+ style: 'currency',
159
+ currency: this.currency(),
160
+ maximumFractionDigits: 0,
161
+ }).format(value);
162
+ }
163
+ return new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(value);
164
+ }
165
+ bytes(value, locale) {
166
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
167
+ let size = value;
168
+ let unit = 0;
169
+ while (size >= 1024 && unit < units.length - 1) {
170
+ size /= 1024;
171
+ unit += 1;
172
+ }
173
+ return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(size)} ${units[unit]}`;
174
+ }
175
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: NucleusChart, deps: [], target: i0.ɵɵFactoryTarget.Component });
176
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.22", type: NucleusChart, isStandalone: true, selector: "nucleus-chart", inputs: { kind: { classPropertyName: "kind", publicName: "kind", isSignal: true, isRequired: false, transformFunction: null }, series: { classPropertyName: "series", publicName: "series", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, valueKind: { classPropertyName: "valueKind", publicName: "valueKind", isSignal: true, isRequired: false, transformFunction: null }, currency: { classPropertyName: "currency", publicName: "currency", isSignal: true, isRequired: false, transformFunction: null }, empty: { classPropertyName: "empty", publicName: "empty", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, axisLabel: { classPropertyName: "axisLabel", publicName: "axisLabel", isSignal: true, isRequired: false, transformFunction: null }, beginAtZero: { classPropertyName: "beginAtZero", publicName: "beginAtZero", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
177
+ @if (hasData()) {
178
+ <p-chart
179
+ [type]="primeType()"
180
+ [data]="data()"
181
+ [options]="options()"
182
+ [height]="heightPx()"
183
+ [responsive]="true"
184
+ />
185
+
186
+ <table class="sr">
187
+ <caption>{{ caption() }}</caption>
188
+ <thead>
189
+ <tr>
190
+ <th scope="col">{{ axisLabel() }}</th>
191
+ @for (serie of series(); track serie.key) {
192
+ <th scope="col">{{ serie.label }}</th>
193
+ }
194
+ </tr>
195
+ </thead>
196
+ <tbody>
197
+ @for (label of labels(); track $index) {
198
+ <tr>
199
+ <th scope="row">{{ label }}</th>
200
+ @for (serie of series(); track serie.key) {
201
+ <td>{{ format(serie.values[$index]) }}</td>
202
+ }
203
+ </tr>
204
+ }
205
+ </tbody>
206
+ </table>
207
+ } @else {
208
+ <div class="empty" [style.height.px]="height()">{{ empty() }}</div>
209
+ }
210
+ `, isInline: true, styles: [":host{display:block;position:relative}.empty{display:grid;place-items:center;height:100%;color:var(--ns-frame-muted, #71717a);font-size:.9rem}table.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: ChartModule }, { kind: "component", type: i1.UIChart, selector: "p-chart", inputs: ["type", "plugins", "width", "height", "responsive", "ariaLabel", "ariaLabelledBy", "data", "options"], outputs: ["onDataSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
211
+ }
212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.22", ngImport: i0, type: NucleusChart, decorators: [{
213
+ type: Component,
214
+ args: [{ selector: 'nucleus-chart', imports: [ChartModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
215
+ @if (hasData()) {
216
+ <p-chart
217
+ [type]="primeType()"
218
+ [data]="data()"
219
+ [options]="options()"
220
+ [height]="heightPx()"
221
+ [responsive]="true"
222
+ />
223
+
224
+ <table class="sr">
225
+ <caption>{{ caption() }}</caption>
226
+ <thead>
227
+ <tr>
228
+ <th scope="col">{{ axisLabel() }}</th>
229
+ @for (serie of series(); track serie.key) {
230
+ <th scope="col">{{ serie.label }}</th>
231
+ }
232
+ </tr>
233
+ </thead>
234
+ <tbody>
235
+ @for (label of labels(); track $index) {
236
+ <tr>
237
+ <th scope="row">{{ label }}</th>
238
+ @for (serie of series(); track serie.key) {
239
+ <td>{{ format(serie.values[$index]) }}</td>
240
+ }
241
+ </tr>
242
+ }
243
+ </tbody>
244
+ </table>
245
+ } @else {
246
+ <div class="empty" [style.height.px]="height()">{{ empty() }}</div>
247
+ }
248
+ `, styles: [":host{display:block;position:relative}.empty{display:grid;place-items:center;height:100%;color:var(--ns-frame-muted, #71717a);font-size:.9rem}table.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\n"] }]
249
+ }], propDecorators: { kind: [{ type: i0.Input, args: [{ isSignal: true, alias: "kind", required: false }] }], series: [{ type: i0.Input, args: [{ isSignal: true, alias: "series", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], valueKind: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueKind", required: false }] }], currency: [{ type: i0.Input, args: [{ isSignal: true, alias: "currency", required: false }] }], empty: [{ type: i0.Input, args: [{ isSignal: true, alias: "empty", required: false }] }], caption: [{ type: i0.Input, args: [{ isSignal: true, alias: "caption", required: false }] }], axisLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "axisLabel", required: false }] }], beginAtZero: [{ type: i0.Input, args: [{ isSignal: true, alias: "beginAtZero", required: false }] }] } });
250
+
251
+ /**
252
+ * Generated bundle index. Do not edit.
253
+ */
254
+
255
+ export { NucleusChart, chartPalette };
256
+ //# sourceMappingURL=nucleus-suite-pe-core-charts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nucleus-suite-pe-core-charts.mjs","sources":["../../../projects/core/charts/src/lib/chart-palette.ts","../../../projects/core/charts/src/lib/nucleus-chart.ts","../../../projects/core/charts/src/nucleus-suite-pe-core-charts.ts"],"sourcesContent":["import { ChartPalette } from './chart.models';\n\nconst LIGHT_FALLBACK: ChartPalette = {\n series: ['#4f6bed', '#1f9d76', '#d08700', '#c2410c', '#8b5cf6', '#0891b2'],\n ink: '#27272a',\n muted: '#71717a',\n line: '#e4e4e7',\n accent: '#4f6bed',\n};\n\nconst DARK_FALLBACK: ChartPalette = {\n series: ['#8aa0ff', '#4cc79b', '#e8b24a', '#f08a5d', '#b794f6', '#38bdf8'],\n ink: '#e4e4e7',\n muted: '#a1a1aa',\n line: '#3f3f46',\n accent: '#8aa0ff',\n};\n\nfunction readToken(host: Element, name: string): string {\n try {\n const value = getComputedStyle(host).getPropertyValue(name).trim();\n\n return value.length > 0 ? value : '';\n } catch {\n return '';\n }\n}\n\nfunction rotate(accent: string, dark: boolean): string[] {\n const base = dark ? DARK_FALLBACK.series : LIGHT_FALLBACK.series;\n\n return [accent, ...base.filter((color) => color.toLowerCase() !== accent.toLowerCase())];\n}\n\nexport function chartPalette(host: Element, dark: boolean, accent: string): ChartPalette {\n const fallback = dark ? DARK_FALLBACK : LIGHT_FALLBACK;\n\n return {\n series: rotate(accent || fallback.accent, dark),\n ink: readToken(host, '--ns-frame-ink') || fallback.ink,\n muted: readToken(host, '--ns-frame-muted') || fallback.muted,\n line: readToken(host, '--ns-frame-line') || fallback.line,\n accent: accent || fallback.accent,\n };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { ChartModule } from 'primeng/chart';\n\nimport { NucleusLanguage, ThemeService } from '@nucleus-suite-pe/core';\nimport { ChartKind, ChartSeries, ChartValueKind } from './chart.models';\nimport { chartPalette } from './chart-palette';\n\n@Component({\n selector: 'nucleus-chart',\n imports: [ChartModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styles: `\n :host {\n display: block;\n position: relative;\n }\n\n .empty {\n display: grid;\n place-items: center;\n height: 100%;\n color: var(--ns-frame-muted, #71717a);\n font-size: 0.9rem;\n }\n\n table.sr {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n }\n `,\n template: `\n @if (hasData()) {\n <p-chart\n [type]=\"primeType()\"\n [data]=\"data()\"\n [options]=\"options()\"\n [height]=\"heightPx()\"\n [responsive]=\"true\"\n />\n\n <table class=\"sr\">\n <caption>{{ caption() }}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{{ axisLabel() }}</th>\n @for (serie of series(); track serie.key) {\n <th scope=\"col\">{{ serie.label }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (label of labels(); track $index) {\n <tr>\n <th scope=\"row\">{{ label }}</th>\n @for (serie of series(); track serie.key) {\n <td>{{ format(serie.values[$index]) }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n } @else {\n <div class=\"empty\" [style.height.px]=\"height()\">{{ empty() }}</div>\n }\n `,\n})\nexport class NucleusChart {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly theme = inject(ThemeService);\n private readonly language = inject(NucleusLanguage);\n\n readonly kind = input<ChartKind>('line');\n readonly series = input<readonly ChartSeries[]>([]);\n readonly labels = input<readonly string[]>([]);\n readonly height = input(260);\n readonly valueKind = input<ChartValueKind>('number');\n readonly currency = input('');\n readonly empty = input('');\n readonly caption = input('');\n readonly axisLabel = input('');\n readonly beginAtZero = input(true);\n\n protected readonly heightPx = computed(() => `${this.height()}px`);\n\n protected readonly hasData = computed(\n () => this.labels().length > 0 && this.series().some((serie) => serie.values.length > 0),\n );\n\n protected readonly primeType = computed(() => {\n const kind = this.kind();\n\n if (kind === 'area' || kind === 'line') return 'line';\n if (kind === 'doughnut') return 'doughnut';\n\n return 'bar';\n });\n\n private readonly palette = computed(() =>\n chartPalette(\n this.host.nativeElement,\n this.theme.canvasId() === 'dark',\n this.theme.accentColor(),\n ),\n );\n\n protected readonly data = computed(() => {\n const palette = this.palette();\n const kind = this.kind();\n\n if (kind === 'doughnut') {\n const serie = this.series()[0];\n\n return {\n labels: [...this.labels()],\n datasets: [\n {\n data: serie ? [...serie.values] : [],\n backgroundColor: [...palette.series],\n borderWidth: 0,\n },\n ],\n };\n }\n\n return {\n labels: [...this.labels()],\n datasets: this.series().map((serie, index) => {\n const color = serie.color ?? palette.series[index % palette.series.length];\n\n return {\n label: serie.label,\n data: [...serie.values],\n borderColor: color,\n backgroundColor: kind === 'area' ? `${color}26` : color,\n fill: kind === 'area',\n tension: kind === 'line' || kind === 'area' ? 0.3 : 0,\n borderWidth: kind === 'bar' || kind === 'stackedBar' ? 0 : 2,\n pointRadius: 0,\n pointHoverRadius: 4,\n borderRadius: kind === 'bar' || kind === 'stackedBar' ? 4 : 0,\n };\n }),\n };\n });\n\n protected readonly options = computed(() => {\n const palette = this.palette();\n const stacked = this.kind() === 'stackedBar';\n const doughnut = this.kind() === 'doughnut';\n const self = this;\n\n return {\n maintainAspectRatio: false,\n animation: { duration: 400 },\n interaction: { mode: 'index', intersect: false },\n plugins: {\n legend: {\n display: this.series().length > 1 || doughnut,\n position: 'bottom',\n labels: { color: palette.muted, usePointStyle: true, boxWidth: 8 },\n },\n tooltip: {\n callbacks: {\n label(context: { dataset: { label?: string }; parsed: { y?: number } | number }) {\n const raw =\n typeof context.parsed === 'number' ? context.parsed : (context.parsed.y ?? 0);\n const name = context.dataset.label ? `${context.dataset.label}: ` : '';\n\n return name + self.format(raw);\n },\n },\n },\n },\n scales: doughnut\n ? {}\n : {\n x: {\n stacked,\n ticks: { color: palette.muted, maxRotation: 0, autoSkipPadding: 16 },\n grid: { display: false },\n },\n y: {\n stacked,\n beginAtZero: this.beginAtZero(),\n ticks: {\n color: palette.muted,\n callback: (value: number) => self.format(value),\n },\n grid: { color: palette.line, drawBorder: false },\n },\n },\n };\n });\n\n protected format(value: number | null | undefined): string {\n if (value === null || value === undefined) return '—';\n\n const locale = this.language.lang() === 'es' ? 'es-PE' : 'en-US';\n\n if (this.valueKind() === 'bytes') return this.bytes(value, locale);\n\n if (this.valueKind() === 'currency' && this.currency()) {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: this.currency(),\n maximumFractionDigits: 0,\n }).format(value);\n }\n\n return new Intl.NumberFormat(locale, { maximumFractionDigits: 2 }).format(value);\n }\n\n private bytes(value: number, locale: string): string {\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let size = value;\n let unit = 0;\n\n while (size >= 1024 && unit < units.length - 1) {\n size /= 1024;\n unit += 1;\n }\n\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(size)} ${units[unit]}`;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}