dynamic-ds 1.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,332 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, Optional, Inject, Injectable, Component } from '@angular/core';
3
+ import { of } from 'rxjs';
4
+
5
+ // Token để inject config (Cầu nối giữa App và Lib)
6
+ const SYSTEM_DESIGN_CONFIG = new InjectionToken('SYSTEM_DESIGN_CONFIG');
7
+
8
+ class FisDsService {
9
+ config;
10
+ // Default colors
11
+ DEFAULT_BRAND = '#006BDF';
12
+ DEFAULT_PRIMARY = '#006BDF';
13
+ DEFAULT_SECONDARY = '#9F5100';
14
+ DEFAULT_FUNCTIONAL = '#006BDF';
15
+ DEFAULT_UTILITY = '#CF0026';
16
+ constructor(config) {
17
+ this.config = config;
18
+ }
19
+ /**
20
+ * Initialize theme colors from system config
21
+ * Call this method during app initialization (e.g., in APP_INITIALIZER)
22
+ * Each color is processed independently - uses fetched value if available, otherwise uses default
23
+ * @returns Observable that completes when theme initialization is done
24
+ */
25
+ initializeTheme() {
26
+ console.log('[SystemDesignService] Initializing theme...');
27
+ try {
28
+ const brandColor = this.config?.brand;
29
+ const primaryColor = this.config?.primary;
30
+ const secondaryColor = this.config?.secondary;
31
+ const functionalColor = this.config?.functional;
32
+ const utilityColor = this.config?.utility;
33
+ // Process each color individually - use fetched value OR default
34
+ this.applyColorOrDefault(brandColor, 'brand', this.DEFAULT_BRAND);
35
+ this.applyColorOrDefault(primaryColor, 'primary', this.DEFAULT_PRIMARY);
36
+ this.applyColorOrDefault(secondaryColor, 'secondary', this.DEFAULT_SECONDARY);
37
+ this.applyColorOrDefault(functionalColor, 'functional', this.DEFAULT_FUNCTIONAL);
38
+ this.applyColorOrDefault(utilityColor, 'utility', this.DEFAULT_UTILITY);
39
+ console.log('[SystemDesignService] Theme initialization completed');
40
+ return of(true);
41
+ }
42
+ catch (error) {
43
+ // If entire fetch fails, fallback to all defaults
44
+ console.warn('[SystemDesignService] Failed to fetch theme config, using all defaults', error);
45
+ this.resetToDefaults();
46
+ return of(false);
47
+ }
48
+ }
49
+ /**
50
+ * Reload theme colors from latest system config
51
+ * This is a convenience method that's equivalent to initializeTheme()
52
+ * but with a more descriptive name for runtime reloading
53
+ *
54
+ * Usage: After updating theme config, call this to apply new colors
55
+ * @returns Observable that completes when theme is reloaded
56
+ */
57
+ reloadThemeFromConfig() {
58
+ console.log('[SystemDesignService] Reloading theme from current config...');
59
+ return this.initializeTheme();
60
+ }
61
+ /**
62
+ * Apply color if valid, otherwise use default
63
+ * @param fetchedColor Color fetched from config (may be null/undefined/invalid)
64
+ * @param type Color type
65
+ * @param defaultColor Default color to use as fallback
66
+ */
67
+ applyColorOrDefault(fetchedColor, type, defaultColor) {
68
+ // Check if fetched color exists and is valid
69
+ if (fetchedColor && this.isValidHexColor(fetchedColor)) {
70
+ this.setColorPalette(fetchedColor, type);
71
+ console.log(`[SystemDesignService] Applied ${type}: ${fetchedColor} (from config)`);
72
+ }
73
+ else {
74
+ this.setColorPalette(defaultColor, type);
75
+ const reason = !fetchedColor ? 'not found' : 'invalid format';
76
+ console.log(`[SystemDesignService] Applied ${type}: ${defaultColor} (default - ${reason})`);
77
+ }
78
+ }
79
+ /**
80
+ * Set color and generate full palette (900 -> 50)
81
+ * @param color Hex color value (e.g., '#006BDF')
82
+ * @param type Type of color ('primary' | 'secondary' | 'brand')
83
+ */
84
+ setColorPalette(color, type) {
85
+ if (!this.isValidHexColor(color)) {
86
+ console.error(`[SystemDesignService] Invalid color format: ${color}`);
87
+ return;
88
+ }
89
+ // Set base color (600)
90
+ document.documentElement.style.setProperty(`--${type}-color`, color);
91
+ document.documentElement.style.setProperty(`--${type}-600`, color);
92
+ // Set RGB for base color
93
+ const rgb = this.hexToRgb(color);
94
+ if (rgb) {
95
+ const rgbValue = `${rgb.r}, ${rgb.g}, ${rgb.b}`;
96
+ document.documentElement.style.setProperty(`--${type}-color-rgb`, rgbValue);
97
+ document.documentElement.style.setProperty(`--${type}-600-rgb`, rgbValue);
98
+ }
99
+ // Generate and set full palette
100
+ const palette = this.generateColorPalette(color);
101
+ Object.entries(palette).forEach(([shade, hexColor]) => {
102
+ document.documentElement.style.setProperty(`--${type}-${shade}`, hexColor);
103
+ // Set RGB variant for each shade
104
+ const shadeRgb = this.hexToRgb(hexColor);
105
+ if (shadeRgb) {
106
+ document.documentElement.style.setProperty(`--${type}-${shade}-rgb`, `${shadeRgb.r}, ${shadeRgb.g}, ${shadeRgb.b}`);
107
+ }
108
+ });
109
+ console.log(`[SystemDesignService] ${type} color palette generated from: ${color}`);
110
+ }
111
+ /**
112
+ * Generate color palette from base color
113
+ * Creates all shades matching system-design.scss $shade-offsets
114
+ * Uses RGB mix algorithm (mix with white/black) for accurate colors
115
+ * @param baseColor Hex color string
116
+ * @returns Object with shade keys and hex color values
117
+ */
118
+ generateColorPalette(baseColor) {
119
+ const rgb = this.hexToRgb(baseColor);
120
+ if (!rgb) {
121
+ console.error('[SystemDesignService] Failed to convert color to RGB');
122
+ return {};
123
+ }
124
+ // Shade offsets matching system-design.scss
125
+ // Negative values = mix with black (darken)
126
+ // Positive values = mix with white (lighten)
127
+ const shadeOffsets = {
128
+ '900': -73.5, // Darkest
129
+ '875': -62.5,
130
+ '850': -47.0,
131
+ '800': -34.5,
132
+ '700': -18.5,
133
+ // '600' is the base color (0%), set separately
134
+ '500': 17.5,
135
+ '400': 33.0,
136
+ '300': 53.0,
137
+ '200': 72.0,
138
+ '100': 85.0,
139
+ '50': 89.5,
140
+ '25': 93.5,
141
+ '10': 97.0, // Lightest
142
+ };
143
+ const palette = {};
144
+ Object.entries(shadeOffsets).forEach(([shade, offset]) => {
145
+ palette[shade] = this.mixColor(rgb, offset);
146
+ });
147
+ return palette;
148
+ }
149
+ /**
150
+ * Mix base color with white or black
151
+ * @param baseRgb Base color RGB
152
+ * @param weight Percentage to mix (-100 to 100)
153
+ * Negative = mix with black (darken)
154
+ * Positive = mix with white (lighten)
155
+ * @returns Hex color string
156
+ */
157
+ mixColor(baseRgb, weight) {
158
+ const white = { r: 255, g: 255, b: 255 };
159
+ const black = { r: 0, g: 0, b: 0 };
160
+ let mixWith;
161
+ let mixWeight;
162
+ if (weight > 0) {
163
+ // Positive weight = mix with white (lighten)
164
+ mixWith = white;
165
+ mixWeight = weight / 100;
166
+ }
167
+ else {
168
+ // Negative weight = mix with black (darken)
169
+ mixWith = black;
170
+ mixWeight = Math.abs(weight) / 100;
171
+ }
172
+ // Mix formula: result = base * (1 - weight) + mixWith * weight
173
+ const r = Math.round(baseRgb.r * (1 - mixWeight) + mixWith.r * mixWeight);
174
+ const g = Math.round(baseRgb.g * (1 - mixWeight) + mixWith.g * mixWeight);
175
+ const b = Math.round(baseRgb.b * (1 - mixWeight) + mixWith.b * mixWeight);
176
+ return this.rgbToHex({ r, g, b });
177
+ }
178
+ /**
179
+ * Convert RGB to HEX
180
+ * @param rgb RGB object
181
+ * @returns Hex color string
182
+ */
183
+ rgbToHex(rgb) {
184
+ const toHex = (n) => {
185
+ const hex = Math.max(0, Math.min(255, n)).toString(16);
186
+ return hex.length === 1 ? '0' + hex : hex;
187
+ };
188
+ return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`;
189
+ }
190
+ /**
191
+ * Update system design colors dynamically
192
+ * Call this when user changes theme colors in settings
193
+ * Only updates colors that are provided and valid
194
+ * @param colors Object containing colors to update (optional properties)
195
+ */
196
+ updateSystemDesignColor(colors) {
197
+ console.log('[SystemDesignService] Updating colors:', colors);
198
+ // Update each color if provided and valid
199
+ if (colors.brandColor) {
200
+ if (this.isValidHexColor(colors.brandColor)) {
201
+ this.setColorPalette(colors.brandColor, 'brand');
202
+ }
203
+ else {
204
+ console.warn('[SystemDesignService] Invalid brand color format:', colors.brandColor);
205
+ }
206
+ }
207
+ if (colors.primaryColor) {
208
+ if (this.isValidHexColor(colors.primaryColor)) {
209
+ this.setColorPalette(colors.primaryColor, 'primary');
210
+ }
211
+ else {
212
+ console.warn('[SystemDesignService] Invalid primary color format:', colors.primaryColor);
213
+ }
214
+ }
215
+ if (colors.secondaryColor) {
216
+ if (this.isValidHexColor(colors.secondaryColor)) {
217
+ this.setColorPalette(colors.secondaryColor, 'secondary');
218
+ }
219
+ else {
220
+ console.warn('[SystemDesignService] Invalid secondary color format:', colors.secondaryColor);
221
+ }
222
+ }
223
+ if (colors.functionalColor) {
224
+ if (this.isValidHexColor(colors.functionalColor)) {
225
+ this.setColorPalette(colors.functionalColor, 'functional');
226
+ }
227
+ else {
228
+ console.warn('[SystemDesignService] Invalid functional color format:', colors.functionalColor);
229
+ }
230
+ }
231
+ if (colors.utilityColor) {
232
+ if (this.isValidHexColor(colors.utilityColor)) {
233
+ this.setColorPalette(colors.utilityColor, 'utility');
234
+ }
235
+ else {
236
+ console.warn('[SystemDesignService] Invalid utility color format:', colors.utilityColor);
237
+ }
238
+ }
239
+ }
240
+ /**
241
+ * Get current theme colors
242
+ * @returns Object with current brand, primary, secondary, functional, and utility colors
243
+ */
244
+ getCurrentColors() {
245
+ const style = getComputedStyle(document.documentElement);
246
+ return {
247
+ brand: style.getPropertyValue('--brand-color').trim(),
248
+ primary: style.getPropertyValue('--primary-color').trim(),
249
+ secondary: style.getPropertyValue('--secondary-color').trim(),
250
+ functional: style.getPropertyValue('--functional-color').trim(),
251
+ utility: style.getPropertyValue('--utility-color').trim(),
252
+ };
253
+ }
254
+ /**
255
+ * Reset to default colors
256
+ */
257
+ resetToDefaults() {
258
+ console.log('[SystemDesignService] Resetting to default colors');
259
+ this.setColorPalette(this.DEFAULT_BRAND, 'brand');
260
+ this.setColorPalette(this.DEFAULT_PRIMARY, 'primary');
261
+ this.setColorPalette(this.DEFAULT_SECONDARY, 'secondary');
262
+ this.setColorPalette(this.DEFAULT_FUNCTIONAL, 'functional');
263
+ this.setColorPalette(this.DEFAULT_UTILITY, 'utility');
264
+ }
265
+ // ============================================================================
266
+ // COLOR CONVERSION UTILITIES
267
+ // ============================================================================
268
+ /**
269
+ * Validate hex color format
270
+ * @param hex Color string to validate
271
+ * @returns true if valid hex color
272
+ */
273
+ isValidHexColor(hex) {
274
+ return /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.test(hex);
275
+ }
276
+ /**
277
+ * Convert HEX to RGB
278
+ * @param hex Hex color string (e.g., '#006BDF')
279
+ * @returns RGB object or null if invalid
280
+ */
281
+ hexToRgb(hex) {
282
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
283
+ return result
284
+ ? {
285
+ r: parseInt(result[1], 16),
286
+ g: parseInt(result[2], 16),
287
+ b: parseInt(result[3], 16),
288
+ }
289
+ : null;
290
+ }
291
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FisDsService, deps: [{ token: SYSTEM_DESIGN_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
292
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FisDsService, providedIn: 'root' });
293
+ }
294
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FisDsService, decorators: [{
295
+ type: Injectable,
296
+ args: [{
297
+ providedIn: 'root',
298
+ }]
299
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
300
+ type: Optional
301
+ }, {
302
+ type: Inject,
303
+ args: [SYSTEM_DESIGN_CONFIG]
304
+ }] }] });
305
+
306
+ class FisDsComponent {
307
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FisDsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
308
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: FisDsComponent, isStandalone: true, selector: "lib-fis-ds", ngImport: i0, template: `
309
+ <p>
310
+ fis-ds works!
311
+ </p>
312
+ `, isInline: true, styles: [""] });
313
+ }
314
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FisDsComponent, decorators: [{
315
+ type: Component,
316
+ args: [{ selector: 'lib-fis-ds', imports: [], template: `
317
+ <p>
318
+ fis-ds works!
319
+ </p>
320
+ ` }]
321
+ }] });
322
+
323
+ /*
324
+ * Public API Surface of fis-ds
325
+ */
326
+
327
+ /**
328
+ * Generated bundle index. Do not edit.
329
+ */
330
+
331
+ export { FisDsComponent, FisDsService, SYSTEM_DESIGN_CONFIG };
332
+ //# sourceMappingURL=fis-ds.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fis-ds.mjs","sources":["../../../projects/fis-ds/src/lib/fis-ds.config.ts","../../../projects/fis-ds/src/lib/fis-ds.service.ts","../../../projects/fis-ds/src/lib/fis-ds.component.ts","../../../projects/fis-ds/src/public-api.ts","../../../projects/fis-ds/src/fis-ds.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n// Interface định nghĩa các màu cần thiết\r\nexport interface SystemDesignConfig {\r\n brand?: string;\r\n primary?: string;\r\n secondary?: string;\r\n functional?: string;\r\n utility?: string;\r\n}\r\n\r\n// Token để inject config (Cầu nối giữa App và Lib)\r\nexport const SYSTEM_DESIGN_CONFIG = new InjectionToken<SystemDesignConfig>(\r\n 'SYSTEM_DESIGN_CONFIG',\r\n);\r\n","import { Inject, Injectable, Optional } from '@angular/core';\r\nimport { SYSTEM_DESIGN_CONFIG, SystemDesignConfig } from './fis-ds.config';\r\nimport { Observable, of } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class FisDsService {\r\n // Default colors\r\n private readonly DEFAULT_BRAND = '#006BDF';\r\n private readonly DEFAULT_PRIMARY = '#006BDF';\r\n private readonly DEFAULT_SECONDARY = '#9F5100';\r\n private readonly DEFAULT_FUNCTIONAL = '#006BDF';\r\n private readonly DEFAULT_UTILITY = '#CF0026';\r\n\r\n constructor(\r\n @Optional()\r\n @Inject(SYSTEM_DESIGN_CONFIG)\r\n private readonly config: SystemDesignConfig,\r\n ) {}\r\n\r\n /**\r\n * Initialize theme colors from system config\r\n * Call this method during app initialization (e.g., in APP_INITIALIZER)\r\n * Each color is processed independently - uses fetched value if available, otherwise uses default\r\n * @returns Observable that completes when theme initialization is done\r\n */\r\n initializeTheme(): Observable<any> {\r\n console.log('[SystemDesignService] Initializing theme...');\r\n\r\n try {\r\n const brandColor = this.config?.brand;\r\n const primaryColor = this.config?.primary;\r\n const secondaryColor = this.config?.secondary;\r\n const functionalColor = this.config?.functional;\r\n const utilityColor = this.config?.utility;\r\n\r\n // Process each color individually - use fetched value OR default\r\n this.applyColorOrDefault(brandColor, 'brand', this.DEFAULT_BRAND);\r\n this.applyColorOrDefault(primaryColor, 'primary', this.DEFAULT_PRIMARY);\r\n this.applyColorOrDefault(\r\n secondaryColor,\r\n 'secondary',\r\n this.DEFAULT_SECONDARY,\r\n );\r\n this.applyColorOrDefault(\r\n functionalColor,\r\n 'functional',\r\n this.DEFAULT_FUNCTIONAL,\r\n );\r\n this.applyColorOrDefault(utilityColor, 'utility', this.DEFAULT_UTILITY);\r\n\r\n console.log('[SystemDesignService] Theme initialization completed');\r\n return of(true);\r\n } catch (error) {\r\n // If entire fetch fails, fallback to all defaults\r\n console.warn(\r\n '[SystemDesignService] Failed to fetch theme config, using all defaults',\r\n error,\r\n );\r\n this.resetToDefaults();\r\n return of(false);\r\n }\r\n }\r\n\r\n /**\r\n * Reload theme colors from latest system config\r\n * This is a convenience method that's equivalent to initializeTheme()\r\n * but with a more descriptive name for runtime reloading\r\n *\r\n * Usage: After updating theme config, call this to apply new colors\r\n * @returns Observable that completes when theme is reloaded\r\n */\r\n reloadThemeFromConfig(): Observable<any> {\r\n console.log('[SystemDesignService] Reloading theme from current config...');\r\n return this.initializeTheme();\r\n }\r\n\r\n /**\r\n * Apply color if valid, otherwise use default\r\n * @param fetchedColor Color fetched from config (may be null/undefined/invalid)\r\n * @param type Color type\r\n * @param defaultColor Default color to use as fallback\r\n */\r\n private applyColorOrDefault(\r\n fetchedColor: string | null | undefined,\r\n type: 'primary' | 'secondary' | 'brand' | 'functional' | 'utility',\r\n defaultColor: string,\r\n ): void {\r\n // Check if fetched color exists and is valid\r\n if (fetchedColor && this.isValidHexColor(fetchedColor)) {\r\n this.setColorPalette(fetchedColor, type);\r\n console.log(\r\n `[SystemDesignService] Applied ${type}: ${fetchedColor} (from config)`,\r\n );\r\n } else {\r\n this.setColorPalette(defaultColor, type);\r\n const reason = !fetchedColor ? 'not found' : 'invalid format';\r\n console.log(\r\n `[SystemDesignService] Applied ${type}: ${defaultColor} (default - ${reason})`,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Set color and generate full palette (900 -> 50)\r\n * @param color Hex color value (e.g., '#006BDF')\r\n * @param type Type of color ('primary' | 'secondary' | 'brand')\r\n */\r\n private setColorPalette(\r\n color: string,\r\n type: 'primary' | 'secondary' | 'brand' | 'functional' | 'utility',\r\n ): void {\r\n if (!this.isValidHexColor(color)) {\r\n console.error(`[SystemDesignService] Invalid color format: ${color}`);\r\n return;\r\n }\r\n\r\n // Set base color (600)\r\n document.documentElement.style.setProperty(`--${type}-color`, color);\r\n document.documentElement.style.setProperty(`--${type}-600`, color);\r\n\r\n // Set RGB for base color\r\n const rgb = this.hexToRgb(color);\r\n if (rgb) {\r\n const rgbValue = `${rgb.r}, ${rgb.g}, ${rgb.b}`;\r\n document.documentElement.style.setProperty(\r\n `--${type}-color-rgb`,\r\n rgbValue,\r\n );\r\n document.documentElement.style.setProperty(`--${type}-600-rgb`, rgbValue);\r\n }\r\n\r\n // Generate and set full palette\r\n const palette = this.generateColorPalette(color);\r\n\r\n Object.entries(palette).forEach(([shade, hexColor]) => {\r\n document.documentElement.style.setProperty(\r\n `--${type}-${shade}`,\r\n hexColor,\r\n );\r\n\r\n // Set RGB variant for each shade\r\n const shadeRgb = this.hexToRgb(hexColor);\r\n if (shadeRgb) {\r\n document.documentElement.style.setProperty(\r\n `--${type}-${shade}-rgb`,\r\n `${shadeRgb.r}, ${shadeRgb.g}, ${shadeRgb.b}`,\r\n );\r\n }\r\n });\r\n\r\n console.log(\r\n `[SystemDesignService] ${type} color palette generated from: ${color}`,\r\n );\r\n }\r\n\r\n /**\r\n * Generate color palette from base color\r\n * Creates all shades matching system-design.scss $shade-offsets\r\n * Uses RGB mix algorithm (mix with white/black) for accurate colors\r\n * @param baseColor Hex color string\r\n * @returns Object with shade keys and hex color values\r\n */\r\n private generateColorPalette(baseColor: string): Record<string, string> {\r\n const rgb = this.hexToRgb(baseColor);\r\n if (!rgb) {\r\n console.error('[SystemDesignService] Failed to convert color to RGB');\r\n return {};\r\n }\r\n\r\n // Shade offsets matching system-design.scss\r\n // Negative values = mix with black (darken)\r\n // Positive values = mix with white (lighten)\r\n const shadeOffsets: Record<string, number> = {\r\n '900': -73.5, // Darkest\r\n '875': -62.5,\r\n '850': -47.0,\r\n '800': -34.5,\r\n '700': -18.5,\r\n // '600' is the base color (0%), set separately\r\n '500': 17.5,\r\n '400': 33.0,\r\n '300': 53.0,\r\n '200': 72.0,\r\n '100': 85.0,\r\n '50': 89.5,\r\n '25': 93.5,\r\n '10': 97.0, // Lightest\r\n };\r\n\r\n const palette: Record<string, string> = {};\r\n\r\n Object.entries(shadeOffsets).forEach(([shade, offset]) => {\r\n palette[shade] = this.mixColor(rgb, offset);\r\n });\r\n\r\n return palette;\r\n }\r\n\r\n /**\r\n * Mix base color with white or black\r\n * @param baseRgb Base color RGB\r\n * @param weight Percentage to mix (-100 to 100)\r\n * Negative = mix with black (darken)\r\n * Positive = mix with white (lighten)\r\n * @returns Hex color string\r\n */\r\n private mixColor(\r\n baseRgb: { r: number; g: number; b: number },\r\n weight: number,\r\n ): string {\r\n const white = { r: 255, g: 255, b: 255 };\r\n const black = { r: 0, g: 0, b: 0 };\r\n\r\n let mixWith: { r: number; g: number; b: number };\r\n let mixWeight: number;\r\n\r\n if (weight > 0) {\r\n // Positive weight = mix with white (lighten)\r\n mixWith = white;\r\n mixWeight = weight / 100;\r\n } else {\r\n // Negative weight = mix with black (darken)\r\n mixWith = black;\r\n mixWeight = Math.abs(weight) / 100;\r\n }\r\n\r\n // Mix formula: result = base * (1 - weight) + mixWith * weight\r\n const r = Math.round(baseRgb.r * (1 - mixWeight) + mixWith.r * mixWeight);\r\n const g = Math.round(baseRgb.g * (1 - mixWeight) + mixWith.g * mixWeight);\r\n const b = Math.round(baseRgb.b * (1 - mixWeight) + mixWith.b * mixWeight);\r\n\r\n return this.rgbToHex({ r, g, b });\r\n }\r\n\r\n /**\r\n * Convert RGB to HEX\r\n * @param rgb RGB object\r\n * @returns Hex color string\r\n */\r\n private rgbToHex(rgb: { r: number; g: number; b: number }): string {\r\n const toHex = (n: number): string => {\r\n const hex = Math.max(0, Math.min(255, n)).toString(16);\r\n return hex.length === 1 ? '0' + hex : hex;\r\n };\r\n return `#${toHex(rgb.r)}${toHex(rgb.g)}${toHex(rgb.b)}`;\r\n }\r\n\r\n /**\r\n * Update system design colors dynamically\r\n * Call this when user changes theme colors in settings\r\n * Only updates colors that are provided and valid\r\n * @param colors Object containing colors to update (optional properties)\r\n */\r\n updateSystemDesignColor(colors: {\r\n primaryColor?: string;\r\n secondaryColor?: string;\r\n brandColor?: string;\r\n functionalColor?: string;\r\n utilityColor?: string;\r\n }): void {\r\n console.log('[SystemDesignService] Updating colors:', colors);\r\n\r\n // Update each color if provided and valid\r\n if (colors.brandColor) {\r\n if (this.isValidHexColor(colors.brandColor)) {\r\n this.setColorPalette(colors.brandColor, 'brand');\r\n } else {\r\n console.warn(\r\n '[SystemDesignService] Invalid brand color format:',\r\n colors.brandColor,\r\n );\r\n }\r\n }\r\n\r\n if (colors.primaryColor) {\r\n if (this.isValidHexColor(colors.primaryColor)) {\r\n this.setColorPalette(colors.primaryColor, 'primary');\r\n } else {\r\n console.warn(\r\n '[SystemDesignService] Invalid primary color format:',\r\n colors.primaryColor,\r\n );\r\n }\r\n }\r\n\r\n if (colors.secondaryColor) {\r\n if (this.isValidHexColor(colors.secondaryColor)) {\r\n this.setColorPalette(colors.secondaryColor, 'secondary');\r\n } else {\r\n console.warn(\r\n '[SystemDesignService] Invalid secondary color format:',\r\n colors.secondaryColor,\r\n );\r\n }\r\n }\r\n\r\n if (colors.functionalColor) {\r\n if (this.isValidHexColor(colors.functionalColor)) {\r\n this.setColorPalette(colors.functionalColor, 'functional');\r\n } else {\r\n console.warn(\r\n '[SystemDesignService] Invalid functional color format:',\r\n colors.functionalColor,\r\n );\r\n }\r\n }\r\n\r\n if (colors.utilityColor) {\r\n if (this.isValidHexColor(colors.utilityColor)) {\r\n this.setColorPalette(colors.utilityColor, 'utility');\r\n } else {\r\n console.warn(\r\n '[SystemDesignService] Invalid utility color format:',\r\n colors.utilityColor,\r\n );\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get current theme colors\r\n * @returns Object with current brand, primary, secondary, functional, and utility colors\r\n */\r\n getCurrentColors(): {\r\n brand: string;\r\n primary: string;\r\n secondary: string;\r\n functional: string;\r\n utility: string;\r\n } {\r\n const style = getComputedStyle(document.documentElement);\r\n return {\r\n brand: style.getPropertyValue('--brand-color').trim(),\r\n primary: style.getPropertyValue('--primary-color').trim(),\r\n secondary: style.getPropertyValue('--secondary-color').trim(),\r\n functional: style.getPropertyValue('--functional-color').trim(),\r\n utility: style.getPropertyValue('--utility-color').trim(),\r\n };\r\n }\r\n\r\n /**\r\n * Reset to default colors\r\n */\r\n resetToDefaults(): void {\r\n console.log('[SystemDesignService] Resetting to default colors');\r\n this.setColorPalette(this.DEFAULT_BRAND, 'brand');\r\n this.setColorPalette(this.DEFAULT_PRIMARY, 'primary');\r\n this.setColorPalette(this.DEFAULT_SECONDARY, 'secondary');\r\n this.setColorPalette(this.DEFAULT_FUNCTIONAL, 'functional');\r\n this.setColorPalette(this.DEFAULT_UTILITY, 'utility');\r\n }\r\n\r\n // ============================================================================\r\n // COLOR CONVERSION UTILITIES\r\n // ============================================================================\r\n\r\n /**\r\n * Validate hex color format\r\n * @param hex Color string to validate\r\n * @returns true if valid hex color\r\n */\r\n private isValidHexColor(hex: string): boolean {\r\n return /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.test(hex);\r\n }\r\n\r\n /**\r\n * Convert HEX to RGB\r\n * @param hex Hex color string (e.g., '#006BDF')\r\n * @returns RGB object or null if invalid\r\n */\r\n private hexToRgb(hex: string): { r: number; g: number; b: number } | null {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result\r\n ? {\r\n r: parseInt(result[1], 16),\r\n g: parseInt(result[2], 16),\r\n b: parseInt(result[3], 16),\r\n }\r\n : null;\r\n }\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-fis-ds',\r\n imports: [],\r\n template: `\r\n <p>\r\n fis-ds works!\r\n </p>\r\n `,\r\n styles: ``\r\n})\r\nexport class FisDsComponent {\r\n\r\n}\r\n","/*\r\n * Public API Surface of fis-ds\r\n */\r\n\r\nexport * from './lib/fis-ds.service';\r\nexport * from './lib/fis-ds.component';\r\nexport * from './lib/fis-ds.config';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;AAWA;MACa,oBAAoB,GAAG,IAAI,cAAc,CACpD,sBAAsB;;MCNX,YAAY,CAAA;AAWJ,IAAA,MAAA;;IATF,aAAa,GAAG,SAAS;IACzB,eAAe,GAAG,SAAS;IAC3B,iBAAiB,GAAG,SAAS;IAC7B,kBAAkB,GAAG,SAAS;IAC9B,eAAe,GAAG,SAAS;AAE5C,IAAA,WAAA,CAGmB,MAA0B,EAAA;QAA1B,IAAM,CAAA,MAAA,GAAN,MAAM;;AAGzB;;;;;AAKG;IACH,eAAe,GAAA;AACb,QAAA,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC;AAE1D,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK;AACrC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO;AACzC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS;AAC7C,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU;AAC/C,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO;;YAGzC,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;YACjE,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;YACvE,IAAI,CAAC,mBAAmB,CACtB,cAAc,EACd,WAAW,EACX,IAAI,CAAC,iBAAiB,CACvB;YACD,IAAI,CAAC,mBAAmB,CACtB,eAAe,EACf,YAAY,EACZ,IAAI,CAAC,kBAAkB,CACxB;YACD,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;AAEvE,YAAA,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC;AACnE,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;;QACf,OAAO,KAAK,EAAE;;AAEd,YAAA,OAAO,CAAC,IAAI,CACV,wEAAwE,EACxE,KAAK,CACN;YACD,IAAI,CAAC,eAAe,EAAE;AACtB,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC;;;AAIpB;;;;;;;AAOG;IACH,qBAAqB,GAAA;AACnB,QAAA,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC;AAC3E,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE;;AAG/B;;;;;AAKG;AACK,IAAA,mBAAmB,CACzB,YAAuC,EACvC,IAAkE,EAClE,YAAoB,EAAA;;QAGpB,IAAI,YAAY,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE;AACtD,YAAA,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC;YACxC,OAAO,CAAC,GAAG,CACT,CAAA,8BAAA,EAAiC,IAAI,CAAK,EAAA,EAAA,YAAY,CAAgB,cAAA,CAAA,CACvE;;aACI;AACL,YAAA,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC;AACxC,YAAA,MAAM,MAAM,GAAG,CAAC,YAAY,GAAG,WAAW,GAAG,gBAAgB;YAC7D,OAAO,CAAC,GAAG,CACT,CAAiC,8BAAA,EAAA,IAAI,CAAK,EAAA,EAAA,YAAY,CAAe,YAAA,EAAA,MAAM,CAAG,CAAA,CAAA,CAC/E;;;AAIL;;;;AAIG;IACK,eAAe,CACrB,KAAa,EACb,IAAkE,EAAA;QAElE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;AAChC,YAAA,OAAO,CAAC,KAAK,CAAC,+CAA+C,KAAK,CAAA,CAAE,CAAC;YACrE;;;AAIF,QAAA,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,MAAA,CAAQ,EAAE,KAAK,CAAC;AACpE,QAAA,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,IAAA,CAAM,EAAE,KAAK,CAAC;;QAGlE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChC,IAAI,GAAG,EAAE;AACP,YAAA,MAAM,QAAQ,GAAG,CAAG,EAAA,GAAG,CAAC,CAAC,CAAA,EAAA,EAAK,GAAG,CAAC,CAAC,CAAK,EAAA,EAAA,GAAG,CAAC,CAAC,EAAE;AAC/C,YAAA,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CACxC,CAAA,EAAA,EAAK,IAAI,CAAA,UAAA,CAAY,EACrB,QAAQ,CACT;AACD,YAAA,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,QAAA,CAAU,EAAE,QAAQ,CAAC;;;QAI3E,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;AAEhD,QAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAI;AACpD,YAAA,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CACxC,CAAK,EAAA,EAAA,IAAI,IAAI,KAAK,CAAA,CAAE,EACpB,QAAQ,CACT;;YAGD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACxC,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CACxC,CAAK,EAAA,EAAA,IAAI,CAAI,CAAA,EAAA,KAAK,CAAM,IAAA,CAAA,EACxB,CAAG,EAAA,QAAQ,CAAC,CAAC,CAAK,EAAA,EAAA,QAAQ,CAAC,CAAC,CAAK,EAAA,EAAA,QAAQ,CAAC,CAAC,CAAE,CAAA,CAC9C;;AAEL,SAAC,CAAC;QAEF,OAAO,CAAC,GAAG,CACT,CAAA,sBAAA,EAAyB,IAAI,CAAkC,+BAAA,EAAA,KAAK,CAAE,CAAA,CACvE;;AAGH;;;;;;AAMG;AACK,IAAA,oBAAoB,CAAC,SAAiB,EAAA;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC;AACrE,YAAA,OAAO,EAAE;;;;;AAMX,QAAA,MAAM,YAAY,GAA2B;AAC3C,YAAA,KAAK,EAAE,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,IAAI;;AAEZ,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,IAAI,EAAE,IAAI;AACV,YAAA,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,IAAI;SACX;QAED,MAAM,OAAO,GAA2B,EAAE;AAE1C,QAAA,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAI;AACvD,YAAA,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;AAC7C,SAAC,CAAC;AAEF,QAAA,OAAO,OAAO;;AAGhB;;;;;;;AAOG;IACK,QAAQ,CACd,OAA4C,EAC5C,MAAc,EAAA;AAEd,QAAA,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;AACxC,QAAA,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;AAElC,QAAA,IAAI,OAA4C;AAChD,QAAA,IAAI,SAAiB;AAErB,QAAA,IAAI,MAAM,GAAG,CAAC,EAAE;;YAEd,OAAO,GAAG,KAAK;AACf,YAAA,SAAS,GAAG,MAAM,GAAG,GAAG;;aACnB;;YAEL,OAAO,GAAG,KAAK;YACf,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG;;;QAIpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;QACzE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;QACzE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;AAEzE,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;;AAGnC;;;;AAIG;AACK,IAAA,QAAQ,CAAC,GAAwC,EAAA;AACvD,QAAA,MAAM,KAAK,GAAG,CAAC,CAAS,KAAY;YAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;AACtD,YAAA,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAC3C,SAAC;QACD,OAAO,CAAA,CAAA,EAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAG,EAAA,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE;;AAGzD;;;;;AAKG;AACH,IAAA,uBAAuB,CAAC,MAMvB,EAAA;AACC,QAAA,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,MAAM,CAAC;;AAG7D,QAAA,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;gBAC3C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC;;iBAC3C;gBACL,OAAO,CAAC,IAAI,CACV,mDAAmD,EACnD,MAAM,CAAC,UAAU,CAClB;;;AAIL,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;gBAC7C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC;;iBAC/C;gBACL,OAAO,CAAC,IAAI,CACV,qDAAqD,EACrD,MAAM,CAAC,YAAY,CACpB;;;AAIL,QAAA,IAAI,MAAM,CAAC,cAAc,EAAE;YACzB,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;gBAC/C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC;;iBACnD;gBACL,OAAO,CAAC,IAAI,CACV,uDAAuD,EACvD,MAAM,CAAC,cAAc,CACtB;;;AAIL,QAAA,IAAI,MAAM,CAAC,eAAe,EAAE;YAC1B,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE;gBAChD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC;;iBACrD;gBACL,OAAO,CAAC,IAAI,CACV,wDAAwD,EACxD,MAAM,CAAC,eAAe,CACvB;;;AAIL,QAAA,IAAI,MAAM,CAAC,YAAY,EAAE;YACvB,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;gBAC7C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC;;iBAC/C;gBACL,OAAO,CAAC,IAAI,CACV,qDAAqD,EACrD,MAAM,CAAC,YAAY,CACpB;;;;AAKP;;;AAGG;IACH,gBAAgB,GAAA;QAOd,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC;QACxD,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE;YACrD,OAAO,EAAE,KAAK,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE;YACzD,SAAS,EAAE,KAAK,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE;YAC7D,UAAU,EAAE,KAAK,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE;YAC/D,OAAO,EAAE,KAAK,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE;SAC1D;;AAGH;;AAEG;IACH,eAAe,GAAA;AACb,QAAA,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC;QAChE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC;QACjD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC;QACrD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC;QACzD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC;QAC3D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC;;;;;AAOvD;;;;AAIG;AACK,IAAA,eAAe,CAAC,GAAW,EAAA;AACjC,QAAA,OAAO,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC;;AAG9D;;;;AAIG;AACK,IAAA,QAAQ,CAAC,GAAW,EAAA;QAC1B,MAAM,MAAM,GAAG,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC;AACpE,QAAA,OAAO;AACL,cAAE;gBACE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC1B,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC1B,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC3B;cACD,IAAI;;AArXC,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,kBAUb,oBAAoB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAVnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA;;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;0BAUI;;0BACA,MAAM;2BAAC,oBAAoB;;;MCLnB,cAAc,CAAA;wGAAd,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,cAAc,EAPf,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;AAIT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;4FAGU,cAAc,EAAA,UAAA,EAAA,CAAA;kBAV1B,SAAS;+BACE,YAAY,EAAA,OAAA,EACb,EAAE,EACD,QAAA,EAAA,CAAA;;;;AAIT,EAAA,CAAA,EAAA;;;ACTH;;AAEG;;ACFH;;AAEG;;;;"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="dynamic-ds" />
5
+ export * from './public-api';
@@ -0,0 +1,5 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class FisDsComponent {
3
+ static ɵfac: i0.ɵɵFactoryDeclaration<FisDsComponent, never>;
4
+ static ɵcmp: i0.ɵɵComponentDeclaration<FisDsComponent, "lib-fis-ds", never, {}, {}, never, never, true, never>;
5
+ }
@@ -0,0 +1,9 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ export interface SystemDesignConfig {
3
+ brand?: string;
4
+ primary?: string;
5
+ secondary?: string;
6
+ functional?: string;
7
+ utility?: string;
8
+ }
9
+ export declare const SYSTEM_DESIGN_CONFIG: InjectionToken<SystemDesignConfig>;
@@ -0,0 +1,106 @@
1
+ import { SystemDesignConfig } from './fis-ds.config';
2
+ import { Observable } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export declare class FisDsService {
5
+ private readonly config;
6
+ private readonly DEFAULT_BRAND;
7
+ private readonly DEFAULT_PRIMARY;
8
+ private readonly DEFAULT_SECONDARY;
9
+ private readonly DEFAULT_FUNCTIONAL;
10
+ private readonly DEFAULT_UTILITY;
11
+ constructor(config: SystemDesignConfig);
12
+ /**
13
+ * Initialize theme colors from system config
14
+ * Call this method during app initialization (e.g., in APP_INITIALIZER)
15
+ * Each color is processed independently - uses fetched value if available, otherwise uses default
16
+ * @returns Observable that completes when theme initialization is done
17
+ */
18
+ initializeTheme(): Observable<any>;
19
+ /**
20
+ * Reload theme colors from latest system config
21
+ * This is a convenience method that's equivalent to initializeTheme()
22
+ * but with a more descriptive name for runtime reloading
23
+ *
24
+ * Usage: After updating theme config, call this to apply new colors
25
+ * @returns Observable that completes when theme is reloaded
26
+ */
27
+ reloadThemeFromConfig(): Observable<any>;
28
+ /**
29
+ * Apply color if valid, otherwise use default
30
+ * @param fetchedColor Color fetched from config (may be null/undefined/invalid)
31
+ * @param type Color type
32
+ * @param defaultColor Default color to use as fallback
33
+ */
34
+ private applyColorOrDefault;
35
+ /**
36
+ * Set color and generate full palette (900 -> 50)
37
+ * @param color Hex color value (e.g., '#006BDF')
38
+ * @param type Type of color ('primary' | 'secondary' | 'brand')
39
+ */
40
+ private setColorPalette;
41
+ /**
42
+ * Generate color palette from base color
43
+ * Creates all shades matching system-design.scss $shade-offsets
44
+ * Uses RGB mix algorithm (mix with white/black) for accurate colors
45
+ * @param baseColor Hex color string
46
+ * @returns Object with shade keys and hex color values
47
+ */
48
+ private generateColorPalette;
49
+ /**
50
+ * Mix base color with white or black
51
+ * @param baseRgb Base color RGB
52
+ * @param weight Percentage to mix (-100 to 100)
53
+ * Negative = mix with black (darken)
54
+ * Positive = mix with white (lighten)
55
+ * @returns Hex color string
56
+ */
57
+ private mixColor;
58
+ /**
59
+ * Convert RGB to HEX
60
+ * @param rgb RGB object
61
+ * @returns Hex color string
62
+ */
63
+ private rgbToHex;
64
+ /**
65
+ * Update system design colors dynamically
66
+ * Call this when user changes theme colors in settings
67
+ * Only updates colors that are provided and valid
68
+ * @param colors Object containing colors to update (optional properties)
69
+ */
70
+ updateSystemDesignColor(colors: {
71
+ primaryColor?: string;
72
+ secondaryColor?: string;
73
+ brandColor?: string;
74
+ functionalColor?: string;
75
+ utilityColor?: string;
76
+ }): void;
77
+ /**
78
+ * Get current theme colors
79
+ * @returns Object with current brand, primary, secondary, functional, and utility colors
80
+ */
81
+ getCurrentColors(): {
82
+ brand: string;
83
+ primary: string;
84
+ secondary: string;
85
+ functional: string;
86
+ utility: string;
87
+ };
88
+ /**
89
+ * Reset to default colors
90
+ */
91
+ resetToDefaults(): void;
92
+ /**
93
+ * Validate hex color format
94
+ * @param hex Color string to validate
95
+ * @returns true if valid hex color
96
+ */
97
+ private isValidHexColor;
98
+ /**
99
+ * Convert HEX to RGB
100
+ * @param hex Hex color string (e.g., '#006BDF')
101
+ * @returns RGB object or null if invalid
102
+ */
103
+ private hexToRgb;
104
+ static ɵfac: i0.ɵɵFactoryDeclaration<FisDsService, [{ optional: true; }]>;
105
+ static ɵprov: i0.ɵɵInjectableDeclaration<FisDsService>;
106
+ }
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "dynamic-ds",
3
+ "version": "1.0.0",
4
+ "description": "A fully dynamic Design System Core Library for Angular",
5
+ "author": "Lê Minh Bảo <leminhbao.work@gmail.com>",
6
+ "contributors": [
7
+ {
8
+ "name": "Hoàng Phi Hùng",
9
+ "email": "hoangphihung4403@gmail.com"
10
+ }
11
+ ],
12
+ "keywords": [
13
+ "angular",
14
+ "design-system",
15
+ "theme",
16
+ "scss",
17
+ "dynamic",
18
+ "ui-kit"
19
+ ],
20
+ "license": "MIT",
21
+ "peerDependencies": {
22
+ "@angular/common": "^14.0.0",
23
+ "@angular/core": "^14.0.0"
24
+ },
25
+ "dependencies": {
26
+ "tslib": "^2.3.0"
27
+ },
28
+ "sideEffects": false,
29
+ "module": "fesm2022/dynamic-ds.mjs",
30
+ "typings": "index.d.ts",
31
+ "exports": {
32
+ "./package.json": {
33
+ "default": "./package.json"
34
+ },
35
+ ".": {
36
+ "types": "./index.d.ts",
37
+ "default": "./fesm2022/dynamic-ds.mjs"
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,3 @@
1
+ export * from './lib/fis-ds.service';
2
+ export * from './lib/fis-ds.component';
3
+ export * from './lib/fis-ds.config';