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.
- package/README.md +555 -0
- package/fesm2022/dynamic-ds.mjs +332 -0
- package/fesm2022/dynamic-ds.mjs.map +1 -0
- package/fesm2022/fis-ds.mjs +332 -0
- package/fesm2022/fis-ds.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/fis-ds.component.d.ts +5 -0
- package/lib/fis-ds.config.d.ts +9 -0
- package/lib/fis-ds.service.d.ts +106 -0
- package/package.json +40 -0
- package/public-api.d.ts +3 -0
- package/src/lib/styles/system-design.scss +396 -0
|
@@ -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=dynamic-ds.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-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/dynamic-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":"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"}
|