valtech-components 2.0.495 → 2.0.497
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/esm2022/lib/services/i18n/config.mjs +50 -0
- package/esm2022/lib/services/i18n/i18n.service.mjs +196 -0
- package/esm2022/lib/services/i18n/index.mjs +9 -0
- package/esm2022/lib/services/i18n/translate.pipe.mjs +50 -0
- package/esm2022/lib/services/i18n/types.mjs +14 -0
- package/esm2022/lib/services/presets/config.mjs +46 -0
- package/esm2022/lib/services/presets/index.mjs +5 -0
- package/esm2022/lib/services/presets/preset.service.mjs +104 -0
- package/esm2022/lib/services/presets/types.mjs +2 -0
- package/esm2022/public-api.mjs +9 -1
- package/fesm2022/valtech-components.mjs +455 -4
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/services/i18n/config.d.ts +29 -0
- package/lib/services/i18n/i18n.service.d.ts +112 -0
- package/lib/services/i18n/index.d.ts +4 -0
- package/lib/services/i18n/translate.pipe.d.ts +36 -0
- package/lib/services/i18n/types.d.ts +59 -0
- package/lib/services/presets/config.d.ts +32 -0
- package/lib/services/presets/index.d.ts +3 -0
- package/lib/services/presets/preset.service.d.ts +69 -0
- package/lib/services/presets/types.d.ts +39 -0
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { makeEnvironmentProviders, APP_INITIALIZER, } from '@angular/core';
|
|
2
|
+
import { DEFAULT_I18N_CONFIG } from './types';
|
|
3
|
+
import { I18nService } from './i18n.service';
|
|
4
|
+
/**
|
|
5
|
+
* Configura el sistema de internacionalización de Valtech Components.
|
|
6
|
+
*
|
|
7
|
+
* @param config Configuración de i18n
|
|
8
|
+
* @returns Providers para agregar en app.config.ts
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // app.config.ts
|
|
12
|
+
* import { provideValtechI18n } from 'valtech-components';
|
|
13
|
+
* import { GLOBAL_CONTENT } from './i18n/_global';
|
|
14
|
+
* import { LOGIN_CONTENT } from './i18n/login.i18n';
|
|
15
|
+
*
|
|
16
|
+
* export const appConfig: ApplicationConfig = {
|
|
17
|
+
* providers: [
|
|
18
|
+
* provideValtechI18n({
|
|
19
|
+
* defaultLanguage: 'es',
|
|
20
|
+
* supportedLanguages: ['es', 'en'],
|
|
21
|
+
* detectBrowserLanguage: true,
|
|
22
|
+
* content: {
|
|
23
|
+
* '_global': GLOBAL_CONTENT,
|
|
24
|
+
* 'Login': LOGIN_CONTENT,
|
|
25
|
+
* }
|
|
26
|
+
* }),
|
|
27
|
+
* ]
|
|
28
|
+
* };
|
|
29
|
+
*/
|
|
30
|
+
export function provideValtechI18n(config = {}) {
|
|
31
|
+
const mergedConfig = { ...DEFAULT_I18N_CONFIG, ...config };
|
|
32
|
+
return makeEnvironmentProviders([
|
|
33
|
+
{
|
|
34
|
+
provide: APP_INITIALIZER,
|
|
35
|
+
useFactory: (i18n) => {
|
|
36
|
+
return () => {
|
|
37
|
+
// Configurar idiomas soportados
|
|
38
|
+
i18n.setI18nLanguages(mergedConfig.supportedLanguages);
|
|
39
|
+
// Registrar contenido inicial
|
|
40
|
+
if (mergedConfig.content && Object.keys(mergedConfig.content).length > 0) {
|
|
41
|
+
i18n.registerContentBulk(mergedConfig.content);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
deps: [I18nService],
|
|
46
|
+
multi: true,
|
|
47
|
+
},
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9pMThuL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLGVBQWUsR0FDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFjLG1CQUFtQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxTQUFxQixFQUFFO0lBQ3hELE1BQU0sWUFBWSxHQUFHLEVBQUUsR0FBRyxtQkFBbUIsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBRTNELE9BQU8sd0JBQXdCLENBQUM7UUFDOUI7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsQ0FBQyxJQUFpQixFQUFFLEVBQUU7Z0JBQ2hDLE9BQU8sR0FBRyxFQUFFO29CQUNWLGdDQUFnQztvQkFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUV2RCw4QkFBOEI7b0JBQzlCLElBQUksWUFBWSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ3pFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ2pELENBQUM7Z0JBQ0gsQ0FBQyxDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUNuQixLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudmlyb25tZW50UHJvdmlkZXJzLFxuICBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIEFQUF9JTklUSUFMSVpFUixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJMThuQ29uZmlnLCBERUZBVUxUX0kxOE5fQ09ORklHIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4vaTE4bi5zZXJ2aWNlJztcblxuLyoqXG4gKiBDb25maWd1cmEgZWwgc2lzdGVtYSBkZSBpbnRlcm5hY2lvbmFsaXphY2nDs24gZGUgVmFsdGVjaCBDb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgQ29uZmlndXJhY2nDs24gZGUgaTE4blxuICogQHJldHVybnMgUHJvdmlkZXJzIHBhcmEgYWdyZWdhciBlbiBhcHAuY29uZmlnLnRzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIGFwcC5jb25maWcudHNcbiAqIGltcG9ydCB7IHByb3ZpZGVWYWx0ZWNoSTE4biB9IGZyb20gJ3ZhbHRlY2gtY29tcG9uZW50cyc7XG4gKiBpbXBvcnQgeyBHTE9CQUxfQ09OVEVOVCB9IGZyb20gJy4vaTE4bi9fZ2xvYmFsJztcbiAqIGltcG9ydCB7IExPR0lOX0NPTlRFTlQgfSBmcm9tICcuL2kxOG4vbG9naW4uaTE4bic7XG4gKlxuICogZXhwb3J0IGNvbnN0IGFwcENvbmZpZzogQXBwbGljYXRpb25Db25maWcgPSB7XG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIHByb3ZpZGVWYWx0ZWNoSTE4bih7XG4gKiAgICAgICBkZWZhdWx0TGFuZ3VhZ2U6ICdlcycsXG4gKiAgICAgICBzdXBwb3J0ZWRMYW5ndWFnZXM6IFsnZXMnLCAnZW4nXSxcbiAqICAgICAgIGRldGVjdEJyb3dzZXJMYW5ndWFnZTogdHJ1ZSxcbiAqICAgICAgIGNvbnRlbnQ6IHtcbiAqICAgICAgICAgJ19nbG9iYWwnOiBHTE9CQUxfQ09OVEVOVCxcbiAqICAgICAgICAgJ0xvZ2luJzogTE9HSU5fQ09OVEVOVCxcbiAqICAgICAgIH1cbiAqICAgICB9KSxcbiAqICAgXVxuICogfTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVWYWx0ZWNoSTE4bihjb25maWc6IEkxOG5Db25maWcgPSB7fSk6IEVudmlyb25tZW50UHJvdmlkZXJzIHtcbiAgY29uc3QgbWVyZ2VkQ29uZmlnID0geyAuLi5ERUZBVUxUX0kxOE5fQ09ORklHLCAuLi5jb25maWcgfTtcblxuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXG4gICAgICB1c2VGYWN0b3J5OiAoaTE4bjogSTE4blNlcnZpY2UpID0+IHtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAvLyBDb25maWd1cmFyIGlkaW9tYXMgc29wb3J0YWRvc1xuICAgICAgICAgIGkxOG4uc2V0STE4bkxhbmd1YWdlcyhtZXJnZWRDb25maWcuc3VwcG9ydGVkTGFuZ3VhZ2VzKTtcblxuICAgICAgICAgIC8vIFJlZ2lzdHJhciBjb250ZW5pZG8gaW5pY2lhbFxuICAgICAgICAgIGlmIChtZXJnZWRDb25maWcuY29udGVudCAmJiBPYmplY3Qua2V5cyhtZXJnZWRDb25maWcuY29udGVudCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaTE4bi5yZWdpc3RlckNvbnRlbnRCdWxrKG1lcmdlZENvbmZpZy5jb250ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgZGVwczogW0kxOG5TZXJ2aWNlXSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { Injectable, signal, computed } from '@angular/core';
|
|
2
|
+
import { LANG_STORAGE_KEY, DEFAULT_I18N_CONFIG, } from './types';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Servicio de internacionalización basado en Angular Signals.
|
|
6
|
+
*
|
|
7
|
+
* Características:
|
|
8
|
+
* - Sin RxJS: usa Signals para evitar memory leaks y congelamiento
|
|
9
|
+
* - Namespace-based: organiza traducciones por contexto
|
|
10
|
+
* - Fallback multi-nivel: namespace → _global → placeholder
|
|
11
|
+
* - Interpolación: soporta {variable} en textos
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // En un componente
|
|
15
|
+
* i18n = inject(I18nService);
|
|
16
|
+
*
|
|
17
|
+
* // Obtener texto
|
|
18
|
+
* const title = this.i18n.t('title', 'Login');
|
|
19
|
+
*
|
|
20
|
+
* // Con interpolación
|
|
21
|
+
* const welcome = this.i18n.t('welcome', 'Login', { name: 'Juan' });
|
|
22
|
+
*
|
|
23
|
+
* // Cambiar idioma
|
|
24
|
+
* this.i18n.setLanguage('en');
|
|
25
|
+
*/
|
|
26
|
+
export class I18nService {
|
|
27
|
+
constructor() {
|
|
28
|
+
// Estado interno con Signals
|
|
29
|
+
this._lang = signal(DEFAULT_I18N_CONFIG.defaultLanguage);
|
|
30
|
+
this._content = signal({});
|
|
31
|
+
this._supportedLanguages = signal(DEFAULT_I18N_CONFIG.supportedLanguages);
|
|
32
|
+
// Públicos readonly
|
|
33
|
+
this.lang = this._lang.asReadonly();
|
|
34
|
+
this.supportedLanguages = this._supportedLanguages.asReadonly();
|
|
35
|
+
// Computed para verificaciones rápidas
|
|
36
|
+
this.isSpanish = computed(() => this._lang() === 'es');
|
|
37
|
+
this.isEnglish = computed(() => this._lang() === 'en');
|
|
38
|
+
this.loadStoredLanguage();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Obtiene texto traducido (alias corto de getText)
|
|
42
|
+
*
|
|
43
|
+
* @param key Clave del texto
|
|
44
|
+
* @param namespace Namespace (default: '_global')
|
|
45
|
+
* @param data Variables para interpolación
|
|
46
|
+
* @returns Texto traducido o placeholder [namespace.key]
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* i18n.t('submit'); // busca en _global
|
|
50
|
+
* i18n.t('title', 'Login'); // busca en Login
|
|
51
|
+
* i18n.t('welcome', 'Login', {name}); // con interpolación
|
|
52
|
+
*/
|
|
53
|
+
t(key, namespace, data) {
|
|
54
|
+
return this.getText(key, namespace, data);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Obtiene texto traducido
|
|
58
|
+
*
|
|
59
|
+
* Fallback order:
|
|
60
|
+
* 1. content[namespace][lang][key]
|
|
61
|
+
* 2. content['_global'][lang][key]
|
|
62
|
+
* 3. "[namespace.key]" (placeholder)
|
|
63
|
+
*/
|
|
64
|
+
getText(key, namespace, data) {
|
|
65
|
+
const content = this._content();
|
|
66
|
+
const lang = this._lang();
|
|
67
|
+
const ns = namespace || '_global';
|
|
68
|
+
// Buscar en namespace específico
|
|
69
|
+
let text = content[ns]?.[lang]?.[key];
|
|
70
|
+
// Fallback a _global
|
|
71
|
+
if (!text && ns !== '_global') {
|
|
72
|
+
text = content['_global']?.[lang]?.[key];
|
|
73
|
+
}
|
|
74
|
+
// Fallback a placeholder
|
|
75
|
+
if (!text) {
|
|
76
|
+
console.warn(`[i18n] Missing translation: ${ns}.${key} (${lang})`);
|
|
77
|
+
return `[${ns}.${key}]`;
|
|
78
|
+
}
|
|
79
|
+
// Aplicar interpolación si hay data
|
|
80
|
+
if (data) {
|
|
81
|
+
return this.interpolate(text, data);
|
|
82
|
+
}
|
|
83
|
+
return text;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Cambia el idioma de la aplicación
|
|
87
|
+
*
|
|
88
|
+
* @param lang Nuevo idioma
|
|
89
|
+
* @param forceReload Si true, recarga la página (fallback si reactividad falla)
|
|
90
|
+
*/
|
|
91
|
+
setLanguage(lang, forceReload = false) {
|
|
92
|
+
if (!this._supportedLanguages().includes(lang)) {
|
|
93
|
+
console.warn(`[i18n] Language '${lang}' not in supported languages`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (lang === this._lang()) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Persistir en localStorage
|
|
100
|
+
localStorage.setItem(LANG_STORAGE_KEY, lang);
|
|
101
|
+
// Actualizar signal
|
|
102
|
+
this._lang.set(lang);
|
|
103
|
+
// Fallback: recargar si se solicita
|
|
104
|
+
if (forceReload) {
|
|
105
|
+
window.location.reload();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Registra contenido de traducciones para un namespace
|
|
110
|
+
*
|
|
111
|
+
* @param namespace Nombre del namespace
|
|
112
|
+
* @param content Contenido de traducciones
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* i18n.registerContent('Login', {
|
|
116
|
+
* es: { title: 'Iniciar sesión' },
|
|
117
|
+
* en: { title: 'Sign in' }
|
|
118
|
+
* });
|
|
119
|
+
*/
|
|
120
|
+
registerContent(namespace, content) {
|
|
121
|
+
this._content.update((store) => ({
|
|
122
|
+
...store,
|
|
123
|
+
[namespace]: content,
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Registra múltiples namespaces de una vez
|
|
128
|
+
*
|
|
129
|
+
* @param contentStore Objeto con namespaces como keys
|
|
130
|
+
*/
|
|
131
|
+
registerContentBulk(contentStore) {
|
|
132
|
+
this._content.update((store) => ({
|
|
133
|
+
...store,
|
|
134
|
+
...contentStore,
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Configura los idiomas soportados
|
|
139
|
+
*/
|
|
140
|
+
setI18nLanguages(languages) {
|
|
141
|
+
this._supportedLanguages.set(languages);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Obtiene todos los namespaces registrados
|
|
145
|
+
*/
|
|
146
|
+
getNamespaces() {
|
|
147
|
+
return Object.keys(this._content());
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Verifica si un namespace tiene traducciones
|
|
151
|
+
*/
|
|
152
|
+
hasNamespace(namespace) {
|
|
153
|
+
return namespace in this._content();
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Carga idioma guardado en localStorage o detecta del navegador
|
|
157
|
+
*/
|
|
158
|
+
loadStoredLanguage() {
|
|
159
|
+
const stored = localStorage.getItem(LANG_STORAGE_KEY);
|
|
160
|
+
if (stored && this.isValidLanguage(stored)) {
|
|
161
|
+
this._lang.set(stored);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
// Detectar idioma del navegador
|
|
165
|
+
const browserLang = navigator.language.split('-')[0];
|
|
166
|
+
if (this.isValidLanguage(browserLang)) {
|
|
167
|
+
this._lang.set(browserLang);
|
|
168
|
+
localStorage.setItem(LANG_STORAGE_KEY, browserLang);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Valida si un idioma está soportado
|
|
173
|
+
*/
|
|
174
|
+
isValidLanguage(lang) {
|
|
175
|
+
return this._supportedLanguages().includes(lang);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Reemplaza {variable} en texto con valores de data
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* interpolate('Hola {name}', { name: 'Juan' }) // 'Hola Juan'
|
|
182
|
+
*/
|
|
183
|
+
interpolate(text, data) {
|
|
184
|
+
return Object.entries(data).reduce((result, [key, value]) => {
|
|
185
|
+
const regex = new RegExp(`\\{${key}\\}`, 'g');
|
|
186
|
+
return result.replace(regex, value);
|
|
187
|
+
}, text);
|
|
188
|
+
}
|
|
189
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: I18nService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
190
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: I18nService, providedIn: 'root' }); }
|
|
191
|
+
}
|
|
192
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: I18nService, decorators: [{
|
|
193
|
+
type: Injectable,
|
|
194
|
+
args: [{ providedIn: 'root' }]
|
|
195
|
+
}], ctorParameters: () => [] });
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaTE4bi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9pMThuL2kxOG4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUlMLGdCQUFnQixFQUNoQixtQkFBbUIsR0FDcEIsTUFBTSxTQUFTLENBQUM7O0FBRWpCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxNQUFNLE9BQU8sV0FBVztJQWdCdEI7UUFmQSw2QkFBNkI7UUFDWixVQUFLLEdBQUcsTUFBTSxDQUFXLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzlELGFBQVEsR0FBRyxNQUFNLENBQWUsRUFBRSxDQUFDLENBQUM7UUFDcEMsd0JBQW1CLEdBQUcsTUFBTSxDQUMzQyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FDdkMsQ0FBQztRQUVGLG9CQUFvQjtRQUNYLFNBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQy9CLHVCQUFrQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVwRSx1Q0FBdUM7UUFDOUIsY0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDbEQsY0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUM7UUFHekQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILENBQUMsQ0FBQyxHQUFXLEVBQUUsU0FBa0IsRUFBRSxJQUE2QjtRQUM5RCxPQUFPLElB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TUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7K0dBN0xVLFdBQVc7bUhBQVgsV0FBVyxjQURFLE1BQU07OzRGQUNuQixXQUFXO2tCQUR2QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIHNpZ25hbCwgY29tcHV0ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEkxOG5MYW5nLFxuICBMYW5ndWFnZXNDb250ZW50LFxuICBDb250ZW50U3RvcmUsXG4gIExBTkdfU1RPUkFHRV9LRVksXG4gIERFRkFVTFRfSTE4Tl9DT05GSUcsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFNlcnZpY2lvIGRlIGludGVybmFjaW9uYWxpemFjacOzbiBiYXNhZG8gZW4gQW5ndWxhciBTaWduYWxzLlxuICpcbiAqIENhcmFjdGVyw61zdGljYXM6XG4gKiAtIFNpbiBSeEpTOiB1c2EgU2lnbmFscyBwYXJhIGV2aXRhciBtZW1vcnkgbGVha3MgeSBjb25nZWxhbWllbnRvXG4gKiAtIE5hbWVzcGFjZS1iYXNlZDogb3JnYW5pemEgdHJhZHVjY2lvbmVzIHBvciBjb250ZXh0b1xuICogLSBGYWxsYmFjayBtdWx0aS1uaXZlbDogbmFtZXNwYWNlIOKGkiBfZ2xvYmFsIOKGkiBwbGFjZWhvbGRlclxuICogLSBJbnRlcnBvbGFjacOzbjogc29wb3J0YSB7dmFyaWFibGV9IGVuIHRleHRvc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFbiB1biBjb21wb25lbnRlXG4gKiBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAqXG4gKiAvLyBPYnRlbmVyIHRleHRvXG4gKiBjb25zdCB0aXRsZSA9IHRoaXMuaTE4bi50KCd0aXRsZScsICdMb2dpbicpO1xuICpcbiAqIC8vIENvbiBpbnRlcnBvbGFjacOzblxuICogY29uc3Qgd2VsY29tZSA9IHRoaXMuaTE4bi50KCd3ZWxjb21lJywgJ0xvZ2luJywgeyBuYW1lOiAnSnVhbicgfSk7XG4gKlxuICogLy8gQ2FtYmlhciBpZGlvbWFcbiAqIHRoaXMuaTE4bi5zZXRMYW5ndWFnZSgnZW4nKTtcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBJMThuU2VydmljZSB7XG4gIC8vIEVzdGFkbyBpbnRlcm5vIGNvbiBTaWduYWxzXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xhbmcgPSBzaWduYWw8STE4bkxhbmc+KERFRkFVTFRfSTE4Tl9DT05GSUcuZGVmYXVsdExhbmd1YWdlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY29udGVudCA9IHNpZ25hbDxDb250ZW50U3RvcmU+KHt9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc3VwcG9ydGVkTGFuZ3VhZ2VzID0gc2lnbmFsPEkxOG5MYW5nW10+KFxuICAgIERFRkFVTFRfSTE4Tl9DT05GSUcuc3VwcG9ydGVkTGFuZ3VhZ2VzXG4gICk7XG5cbiAgLy8gUMO6YmxpY29zIHJlYWRvbmx5XG4gIHJlYWRvbmx5IGxhbmcgPSB0aGlzLl9sYW5nLmFzUmVhZG9ubHkoKTtcbiAgcmVhZG9ubHkgc3VwcG9ydGVkTGFuZ3VhZ2VzID0gdGhpcy5fc3VwcG9ydGVkTGFuZ3VhZ2VzLmFzUmVhZG9ubHkoKTtcblxuICAvLyBDb21wdXRlZCBwYXJhIHZlcmlmaWNhY2lvbmVzIHLDoXBpZGFzXG4gIHJlYWRvbmx5IGlzU3BhbmlzaCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2xhbmcoKSA9PT0gJ2VzJyk7XG4gIHJlYWRvbmx5IGlzRW5nbGlzaCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2xhbmcoKSA9PT0gJ2VuJyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2FkU3RvcmVkTGFuZ3VhZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIHRleHRvIHRyYWR1Y2lkbyAoYWxpYXMgY29ydG8gZGUgZ2V0VGV4dClcbiAgICpcbiAgICogQHBhcmFtIGtleSBDbGF2ZSBkZWwgdGV4dG9cbiAgICogQHBhcmFtIG5hbWVzcGFjZSBOYW1lc3BhY2UgKGRlZmF1bHQ6ICdfZ2xvYmFsJylcbiAgICogQHBhcmFtIGRhdGEgVmFyaWFibGVzIHBhcmEgaW50ZXJwb2xhY2nDs25cbiAgICogQHJldHVybnMgVGV4dG8gdHJhZHVjaWRvIG8gcGxhY2Vob2xkZXIgW25hbWVzcGFjZS5rZXldXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGkxOG4udCgnc3VibWl0Jyk7ICAgICAgICAgICAgICAgICAgICAvLyBidXNjYSBlbiBfZ2xvYmFsXG4gICAqIGkxOG4udCgndGl0bGUnLCAnTG9naW4nKTsgICAgICAgICAgICAvLyBidXNjYSBlbiBMb2dpblxuICAgKiBpMThuLnQoJ3dlbGNvbWUnLCAnTG9naW4nLCB7bmFtZX0pOyAgLy8gY29uIGludGVycG9sYWNpw7NuXG4gICAqL1xuICB0KGtleTogc3RyaW5nLCBuYW1lc3BhY2U/OiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUZXh0KGtleSwgbmFtZXNwYWNlLCBkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIHRleHRvIHRyYWR1Y2lkb1xuICAgKlxuICAgKiBGYWxsYmFjayBvcmRlcjpcbiAgICogMS4gY29udGVudFtuYW1lc3BhY2VdW2xhbmddW2tleV1cbiAgICogMi4gY29udGVudFsnX2dsb2JhbCddW2xhbmddW2tleV1cbiAgICogMy4gXCJbbmFtZXNwYWNlLmtleV1cIiAocGxhY2Vob2xkZXIpXG4gICAqL1xuICBnZXRUZXh0KGtleTogc3RyaW5nLCBuYW1lc3BhY2U/OiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fY29udGVudCgpO1xuICAgIGNvbnN0IGxhbmcgPSB0aGlzLl9sYW5nKCk7XG4gICAgY29uc3QgbnMgPSBuYW1lc3BhY2UgfHwgJ19nbG9iYWwnO1xuXG4gICAgLy8gQnVzY2FyIGVuIG5hbWVzcGFjZSBlc3BlY8OtZmljb1xuICAgIGxldCB0ZXh0ID0gY29udGVudFtuc10/LltsYW5nXT8uW2tleV07XG5cbiAgICAvLyBGYWxsYmFjayBhIF9nbG9iYWxcbiAgICBpZiAoIXRleHQgJiYgbnMgIT09ICdfZ2xvYmFsJykge1xuICAgICAgdGV4dCA9IGNvbnRlbnRbJ19nbG9iYWwnXT8uW2xhbmddPy5ba2V5XTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBhIHBsYWNlaG9sZGVyXG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtpMThuXSBNaXNzaW5nIHRyYW5zbGF0aW9uOiAke25zfS4ke2tleX0gKCR7bGFuZ30pYCk7XG4gICAgICByZXR1cm4gYFske25zfS4ke2tleX1dYDtcbiAgICB9XG5cbiAgICAvLyBBcGxpY2FyIGludGVycG9sYWNpw7NuIHNpIGhheSBkYXRhXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHJldHVybiB0aGlzLmludGVycG9sYXRlKHRleHQsIGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbWJpYSBlbCBpZGlvbWEgZGUgbGEgYXBsaWNhY2nDs25cbiAgICpcbiAgICogQHBhcmFtIGxhbmcgTnVldm8gaWRpb21hXG4gICAqIEBwYXJhbSBmb3JjZVJlbG9hZCBTaSB0cnVlLCByZWNhcmdhIGxhIHDDoWdpbmEgKGZhbGxiYWNrIHNpIHJlYWN0aXZpZGFkIGZhbGxhKVxuICAgKi9cbiAgc2V0TGFuZ3VhZ2UobGFuZzogSTE4bkxhbmcsIGZvcmNlUmVsb2FkID0gZmFsc2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N1cHBvcnRlZExhbmd1YWdlcygpLmluY2x1ZGVzKGxhbmcpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtpMThuXSBMYW5ndWFnZSAnJHtsYW5nfScgbm90IGluIHN1cHBvcnRlZCBsYW5ndWFnZXNgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobGFuZyA9PT0gdGhpcy5fbGFuZygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUGVyc2lzdGlyIGVuIGxvY2FsU3RvcmFnZVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExBTkdfU1RPUkFHRV9LRVksIGxhbmcpO1xuXG4gICAgLy8gQWN0dWFsaXphciBzaWduYWxcbiAgICB0aGlzLl9sYW5nLnNldChsYW5nKTtcblxuICAgIC8vIEZhbGxiYWNrOiByZWNhcmdhciBzaSBzZSBzb2xpY2l0YVxuICAgIGlmIChmb3JjZVJlbG9hZCkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RyYSBjb250ZW5pZG8gZGUgdHJhZHVjY2lvbmVzIHBhcmEgdW4gbmFtZXNwYWNlXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lc3BhY2UgTm9tYnJlIGRlbCBuYW1lc3BhY2VcbiAgICogQHBhcmFtIGNvbnRlbnQgQ29udGVuaWRvIGRlIHRyYWR1Y2Npb25lc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBpMThuLnJlZ2lzdGVyQ29udGVudCgnTG9naW4nLCB7XG4gICAqICAgZXM6IHsgdGl0bGU6ICdJbmljaWFyIHNlc2nDs24nIH0sXG4gICAqICAgZW46IHsgdGl0bGU6ICdTaWduIGluJyB9XG4gICAqIH0pO1xuICAgKi9cbiAgcmVnaXN0ZXJDb250ZW50KG5hbWVzcGFjZTogc3RyaW5nLCBjb250ZW50OiBMYW5ndWFnZXNDb250ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fY29udGVudC51cGRhdGUoKHN0b3JlKSA9PiAoe1xuICAgICAgLi4uc3RvcmUsXG4gICAgICBbbmFtZXNwYWNlXTogY29udGVudCxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgbcO6bHRpcGxlcyBuYW1lc3BhY2VzIGRlIHVuYSB2ZXpcbiAgICpcbiAgICogQHBhcmFtIGNvbnRlbnRTdG9yZSBPYmpldG8gY29uIG5hbWVzcGFjZXMgY29tbyBrZXlzXG4gICAqL1xuICByZWdpc3RlckNvbnRlbnRCdWxrKGNvbnRlbnRTdG9yZTogQ29udGVudFN0b3JlKTogdm9pZCB7XG4gICAgdGhpcy5fY29udGVudC51cGRhdGUoKHN0b3JlKSA9PiAoe1xuICAgICAgLi4uc3RvcmUsXG4gICAgICAuLi5jb250ZW50U3RvcmUsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYSBsb3MgaWRpb21hcyBzb3BvcnRhZG9zXG4gICAqL1xuICBzZXRJMThuTGFuZ3VhZ2VzKGxhbmd1YWdlczogSTE4bkxhbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX3N1cHBvcnRlZExhbmd1YWdlcy5zZXQobGFuZ3VhZ2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIHRvZG9zIGxvcyBuYW1lc3BhY2VzIHJlZ2lzdHJhZG9zXG4gICAqL1xuICBnZXROYW1lc3BhY2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fY29udGVudCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSB1biBuYW1lc3BhY2UgdGllbmUgdHJhZHVjY2lvbmVzXG4gICAqL1xuICBoYXNOYW1lc3BhY2UobmFtZXNwYWNlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gbmFtZXNwYWNlIGluIHRoaXMuX2NvbnRlbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXJnYSBpZGlvbWEgZ3VhcmRhZG8gZW4gbG9jYWxTdG9yYWdlIG8gZGV0ZWN0YSBkZWwgbmF2ZWdhZG9yXG4gICAqL1xuICBwcml2YXRlIGxvYWRTdG9yZWRMYW5ndWFnZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMQU5HX1NUT1JBR0VfS0VZKTtcblxuICAgIGlmIChzdG9yZWQgJiYgdGhpcy5pc1ZhbGlkTGFuZ3VhZ2Uoc3RvcmVkKSkge1xuICAgICAgdGhpcy5fbGFuZy5zZXQoc3RvcmVkIGFzIEkxOG5MYW5nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEZXRlY3RhciBpZGlvbWEgZGVsIG5hdmVnYWRvclxuICAgIGNvbnN0IGJyb3dzZXJMYW5nID0gbmF2aWdhdG9yLmxhbmd1YWdlLnNwbGl0KCctJylbMF0gYXMgSTE4bkxhbmc7XG4gICAgaWYgKHRoaXMuaXNWYWxpZExhbmd1YWdlKGJyb3dzZXJMYW5nKSkge1xuICAgICAgdGhpcy5fbGFuZy5zZXQoYnJvd3NlckxhbmcpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTEFOR19TVE9SQUdFX0tFWSwgYnJvd3NlckxhbmcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGEgc2kgdW4gaWRpb21hIGVzdMOhIHNvcG9ydGFkb1xuICAgKi9cbiAgcHJpdmF0ZSBpc1ZhbGlkTGFuZ3VhZ2UobGFuZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N1cHBvcnRlZExhbmd1YWdlcygpLmluY2x1ZGVzKGxhbmcgYXMgSTE4bkxhbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZW1wbGF6YSB7dmFyaWFibGV9IGVuIHRleHRvIGNvbiB2YWxvcmVzIGRlIGRhdGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogaW50ZXJwb2xhdGUoJ0hvbGEge25hbWV9JywgeyBuYW1lOiAnSnVhbicgfSkgLy8gJ0hvbGEgSnVhbidcbiAgICovXG4gIHByaXZhdGUgaW50ZXJwb2xhdGUodGV4dDogc3RyaW5nLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZGF0YSkucmVkdWNlKChyZXN1bHQsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxceyR7a2V5fVxcXFx9YCwgJ2cnKTtcbiAgICAgIHJldHVybiByZXN1bHQucmVwbGFjZShyZWdleCwgdmFsdWUpO1xuICAgIH0sIHRleHQpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Types
|
|
2
|
+
export { LANG_STORAGE_KEY, } from './types';
|
|
3
|
+
// Service
|
|
4
|
+
export { I18nService } from './i18n.service';
|
|
5
|
+
// Pipe
|
|
6
|
+
export { TranslatePipe } from './translate.pipe';
|
|
7
|
+
// Config
|
|
8
|
+
export { provideValtechI18n } from './config';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2kxOG4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsUUFBUTtBQUNSLE9BQU8sRUFLTCxnQkFBZ0IsR0FDakIsTUFBTSxTQUFTLENBQUM7QUFFakIsVUFBVTtBQUNWLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPO0FBQ1AsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWpELFNBQVM7QUFDVCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUeXBlc1xuZXhwb3J0IHtcbiAgSTE4bkxhbmcsXG4gIExhbmd1YWdlc0NvbnRlbnQsXG4gIENvbnRlbnRTdG9yZSxcbiAgSTE4bkNvbmZpZyxcbiAgTEFOR19TVE9SQUdFX0tFWSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIFNlcnZpY2VcbmV4cG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi9pMThuLnNlcnZpY2UnO1xuXG4vLyBQaXBlXG5leHBvcnQgeyBUcmFuc2xhdGVQaXBlIH0gZnJvbSAnLi90cmFuc2xhdGUucGlwZSc7XG5cbi8vIENvbmZpZ1xuZXhwb3J0IHsgcHJvdmlkZVZhbHRlY2hJMThuIH0gZnJvbSAnLi9jb25maWcnO1xuIl19
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Pipe, inject } from '@angular/core';
|
|
2
|
+
import { I18nService } from './i18n.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Pipe de traducción para templates.
|
|
6
|
+
*
|
|
7
|
+
* NOTA: Es impure para detectar cambios de idioma.
|
|
8
|
+
* El costo es mínimo porque I18nService usa Signals internamente.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* <!-- Busca en _global -->
|
|
12
|
+
* {{ 'submit' | t }}
|
|
13
|
+
*
|
|
14
|
+
* <!-- Busca en namespace específico -->
|
|
15
|
+
* {{ 'title' | t:'Login' }}
|
|
16
|
+
*
|
|
17
|
+
* <!-- Con interpolación -->
|
|
18
|
+
* {{ 'welcome' | t:'Login':{ name: userName } }}
|
|
19
|
+
*
|
|
20
|
+
* <!-- En atributos -->
|
|
21
|
+
* <val-button [label]="'submit' | t"></val-button>
|
|
22
|
+
* <val-input [label]="'email' | t:'Login'"></val-input>
|
|
23
|
+
*/
|
|
24
|
+
export class TranslatePipe {
|
|
25
|
+
constructor() {
|
|
26
|
+
this.i18n = inject(I18nService);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Transforma una key de traducción a su valor
|
|
30
|
+
*
|
|
31
|
+
* @param key Clave del texto
|
|
32
|
+
* @param namespace Namespace opcional (default: '_global')
|
|
33
|
+
* @param data Variables para interpolación opcional
|
|
34
|
+
* @returns Texto traducido
|
|
35
|
+
*/
|
|
36
|
+
transform(key, namespace, data) {
|
|
37
|
+
return this.i18n.t(key, namespace, data);
|
|
38
|
+
}
|
|
39
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TranslatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
40
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: TranslatePipe, isStandalone: true, name: "t", pure: false }); }
|
|
41
|
+
}
|
|
42
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TranslatePipe, decorators: [{
|
|
43
|
+
type: Pipe,
|
|
44
|
+
args: [{
|
|
45
|
+
name: 't',
|
|
46
|
+
standalone: true,
|
|
47
|
+
pure: false, // Impure para detectar cambios de idioma
|
|
48
|
+
}]
|
|
49
|
+
}] });
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2kxOG4vdHJhbnNsYXRlLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFNSCxNQUFNLE9BQU8sYUFBYTtJQUwxQjtRQU1tQixTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBYTdDO0lBWEM7Ozs7Ozs7T0FPRztJQUNILFNBQVMsQ0FBQyxHQUFXLEVBQUUsU0FBa0IsRUFBRSxJQUE2QjtRQUN0RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQzsrR0FiVSxhQUFhOzZHQUFiLGFBQWE7OzRGQUFiLGFBQWE7a0JBTHpCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLEdBQUc7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLElBQUksRUFBRSxLQUFLLEVBQUUseUNBQXlDO2lCQUN2RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuL2kxOG4uc2VydmljZSc7XG5cbi8qKlxuICogUGlwZSBkZSB0cmFkdWNjacOzbiBwYXJhIHRlbXBsYXRlcy5cbiAqXG4gKiBOT1RBOiBFcyBpbXB1cmUgcGFyYSBkZXRlY3RhciBjYW1iaW9zIGRlIGlkaW9tYS5cbiAqIEVsIGNvc3RvIGVzIG3DrW5pbW8gcG9ycXVlIEkxOG5TZXJ2aWNlIHVzYSBTaWduYWxzIGludGVybmFtZW50ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogPCEtLSBCdXNjYSBlbiBfZ2xvYmFsIC0tPlxuICoge3sgJ3N1Ym1pdCcgfCB0IH19XG4gKlxuICogPCEtLSBCdXNjYSBlbiBuYW1lc3BhY2UgZXNwZWPDrWZpY28gLS0+XG4gKiB7eyAndGl0bGUnIHwgdDonTG9naW4nIH19XG4gKlxuICogPCEtLSBDb24gaW50ZXJwb2xhY2nDs24gLS0+XG4gKiB7eyAnd2VsY29tZScgfCB0OidMb2dpbic6eyBuYW1lOiB1c2VyTmFtZSB9IH19XG4gKlxuICogPCEtLSBFbiBhdHJpYnV0b3MgLS0+XG4gKiA8dmFsLWJ1dHRvbiBbbGFiZWxdPVwiJ3N1Ym1pdCcgfCB0XCI+PC92YWwtYnV0dG9uPlxuICogPHZhbC1pbnB1dCBbbGFiZWxdPVwiJ2VtYWlsJyB8IHQ6J0xvZ2luJ1wiPjwvdmFsLWlucHV0PlxuICovXG5AUGlwZSh7XG4gIG5hbWU6ICd0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHVyZTogZmFsc2UsIC8vIEltcHVyZSBwYXJhIGRldGVjdGFyIGNhbWJpb3MgZGUgaWRpb21hXG59KVxuZXhwb3J0IGNsYXNzIFRyYW5zbGF0ZVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgcHJpdmF0ZSByZWFkb25seSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcblxuICAvKipcbiAgICogVHJhbnNmb3JtYSB1bmEga2V5IGRlIHRyYWR1Y2Npw7NuIGEgc3UgdmFsb3JcbiAgICpcbiAgICogQHBhcmFtIGtleSBDbGF2ZSBkZWwgdGV4dG9cbiAgICogQHBhcmFtIG5hbWVzcGFjZSBOYW1lc3BhY2Ugb3BjaW9uYWwgKGRlZmF1bHQ6ICdfZ2xvYmFsJylcbiAgICogQHBhcmFtIGRhdGEgVmFyaWFibGVzIHBhcmEgaW50ZXJwb2xhY2nDs24gb3BjaW9uYWxcbiAgICogQHJldHVybnMgVGV4dG8gdHJhZHVjaWRvXG4gICAqL1xuICB0cmFuc2Zvcm0oa2V5OiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIG5hbWVzcGFjZSwgZGF0YSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Valores por defecto de configuración
|
|
3
|
+
*/
|
|
4
|
+
export const DEFAULT_I18N_CONFIG = {
|
|
5
|
+
defaultLanguage: 'es',
|
|
6
|
+
supportedLanguages: ['es', 'en'],
|
|
7
|
+
detectBrowserLanguage: true,
|
|
8
|
+
content: {},
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Clave para persistir idioma en localStorage
|
|
12
|
+
*/
|
|
13
|
+
export const LANG_STORAGE_KEY = 'app_lang';
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2kxOG4vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMERBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQXlCO0lBQ3ZELGVBQWUsRUFBRSxJQUFJO0lBQ3JCLGtCQUFrQixFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztJQUNoQyxxQkFBcUIsRUFBRSxJQUFJO0lBQzNCLE9BQU8sRUFBRSxFQUFFO0NBQ1osQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJZGlvbWFzIHNvcG9ydGFkb3MgcG9yIGVsIHNpc3RlbWEgaTE4blxuICovXG5leHBvcnQgdHlwZSBJMThuTGFuZyA9ICdlcycgfCAnZW4nIHwgJ3B0JyB8ICdmcicgfCAnZGUnO1xuXG4vKipcbiAqIENvbnRlbmlkbyBkZSB0cmFkdWNjaW9uZXMgcGFyYSB1biBuYW1lc3BhY2VcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgbG9naW5Db250ZW50OiBMYW5ndWFnZXNDb250ZW50ID0ge1xuICogICBlczogeyB0aXRsZTogJ0luaWNpYXIgc2VzacOzbicsIHN1Ym1pdDogJ0VudHJhcicgfSxcbiAqICAgZW46IHsgdGl0bGU6ICdTaWduIGluJywgc3VibWl0OiAnU2lnbiBpbicgfVxuICogfTtcbiAqL1xuZXhwb3J0IHR5cGUgTGFuZ3VhZ2VzQ29udGVudCA9IHtcbiAgW2xhbmcgaW4gSTE4bkxhbmddPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbi8qKlxuICogQWxtYWPDqW4gZGUgY29udGVuaWRvIHBvciBuYW1lc3BhY2VcbiAqXG4gKiBAZXhhbXBsZVxuICoge1xuICogICAnX2dsb2JhbCc6IHsgZXM6IHsuLi59LCBlbjogey4uLn0gfSxcbiAqICAgJ0xvZ2luJzogeyBlczogey4uLn0sIGVuOiB7Li4ufSB9LFxuICogICAnUHJvZmlsZSc6IHsgZXM6IHsuLi59LCBlbjogey4uLn0gfVxuICogfVxuICovXG5leHBvcnQgdHlwZSBDb250ZW50U3RvcmUgPSBSZWNvcmQ8c3RyaW5nLCBMYW5ndWFnZXNDb250ZW50PjtcblxuLyoqXG4gKiBDb25maWd1cmFjacOzbiBwYXJhIHByb3ZpZGVWYWx0ZWNoSTE4bigpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSTE4bkNvbmZpZyB7XG4gIC8qKlxuICAgKiBJZGlvbWEgcG9yIGRlZmVjdG8gc2kgbm8gaGF5IHByZWZlcmVuY2lhIGd1YXJkYWRhXG4gICAqIEBkZWZhdWx0ICdlcydcbiAgICovXG4gIGRlZmF1bHRMYW5ndWFnZT86IEkxOG5MYW5nO1xuXG4gIC8qKlxuICAgKiBMaXN0YSBkZSBpZGlvbWFzIGhhYmlsaXRhZG9zIGVuIGxhIGFwcFxuICAgKiBAZGVmYXVsdCBbJ2VzJywgJ2VuJ11cbiAgICovXG4gIHN1cHBvcnRlZExhbmd1YWdlcz86IEkxOG5MYW5nW107XG5cbiAgLyoqXG4gICAqIERldGVjdGFyIGlkaW9tYSBkZWwgbmF2ZWdhZG9yIGFsIGluaWNpYXJcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZGV0ZWN0QnJvd3Nlckxhbmd1YWdlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udGVuaWRvIGluaWNpYWwgZGUgdHJhZHVjY2lvbmVzIHBvciBuYW1lc3BhY2VcbiAgICovXG4gIGNvbnRlbnQ/OiBDb250ZW50U3RvcmU7XG59XG5cbi8qKlxuICogVmFsb3JlcyBwb3IgZGVmZWN0byBkZSBjb25maWd1cmFjacOzblxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9JMThOX0NPTkZJRzogUmVxdWlyZWQ8STE4bkNvbmZpZz4gPSB7XG4gIGRlZmF1bHRMYW5ndWFnZTogJ2VzJyxcbiAgc3VwcG9ydGVkTGFuZ3VhZ2VzOiBbJ2VzJywgJ2VuJ10sXG4gIGRldGVjdEJyb3dzZXJMYW5ndWFnZTogdHJ1ZSxcbiAgY29udGVudDoge30sXG59O1xuXG4vKipcbiAqIENsYXZlIHBhcmEgcGVyc2lzdGlyIGlkaW9tYSBlbiBsb2NhbFN0b3JhZ2VcbiAqL1xuZXhwb3J0IGNvbnN0IExBTkdfU1RPUkFHRV9LRVkgPSAnYXBwX2xhbmcnO1xuIl19
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { makeEnvironmentProviders, APP_INITIALIZER, } from '@angular/core';
|
|
2
|
+
import { PresetService } from './preset.service';
|
|
3
|
+
/**
|
|
4
|
+
* Configura el sistema de presets de Valtech Components.
|
|
5
|
+
*
|
|
6
|
+
* @param presets Configuración de presets por componente
|
|
7
|
+
* @returns Providers para agregar en app.config.ts
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // app.config.ts
|
|
11
|
+
* import { provideValtechPresets } from 'valtech-components';
|
|
12
|
+
*
|
|
13
|
+
* export const appConfig: ApplicationConfig = {
|
|
14
|
+
* providers: [
|
|
15
|
+
* provideValtechPresets({
|
|
16
|
+
* button: {
|
|
17
|
+
* 'primary-action': { size: 'large', color: 'primary', fill: 'solid' },
|
|
18
|
+
* 'secondary': { size: 'medium', color: 'secondary', fill: 'outline' },
|
|
19
|
+
* 'danger': { size: 'medium', color: 'danger', fill: 'solid' },
|
|
20
|
+
* },
|
|
21
|
+
* card: {
|
|
22
|
+
* 'feature': { variant: 'elevated', padding: 'large' },
|
|
23
|
+
* 'compact': { variant: 'flat', padding: 'small' },
|
|
24
|
+
* },
|
|
25
|
+
* input: {
|
|
26
|
+
* 'form-field': { size: 'medium', fill: 'outline', labelPosition: 'floating' },
|
|
27
|
+
* }
|
|
28
|
+
* }),
|
|
29
|
+
* ]
|
|
30
|
+
* };
|
|
31
|
+
*/
|
|
32
|
+
export function provideValtechPresets(presets) {
|
|
33
|
+
return makeEnvironmentProviders([
|
|
34
|
+
{
|
|
35
|
+
provide: APP_INITIALIZER,
|
|
36
|
+
useFactory: (presetService) => {
|
|
37
|
+
return () => {
|
|
38
|
+
presetService.registerPresets(presets);
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
deps: [PresetService],
|
|
42
|
+
multi: true,
|
|
43
|
+
},
|
|
44
|
+
]);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9wcmVzZXRzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLGVBQWUsR0FDaEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE9BQXFCO0lBQ3pELE9BQU8sd0JBQXdCLENBQUM7UUFDOUI7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsQ0FBQyxhQUE0QixFQUFFLEVBQUU7Z0JBQzNDLE9BQU8sR0FBRyxFQUFFO29CQUNWLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDckIsS0FBSyxFQUFFLElBQUk7U0FDWjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnZpcm9ubWVudFByb3ZpZGVycyxcbiAgbWFrZUVudmlyb25tZW50UHJvdmlkZXJzLFxuICBBUFBfSU5JVElBTElaRVIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUHJlc2V0Q29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBQcmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi9wcmVzZXQuc2VydmljZSc7XG5cbi8qKlxuICogQ29uZmlndXJhIGVsIHNpc3RlbWEgZGUgcHJlc2V0cyBkZSBWYWx0ZWNoIENvbXBvbmVudHMuXG4gKlxuICogQHBhcmFtIHByZXNldHMgQ29uZmlndXJhY2nDs24gZGUgcHJlc2V0cyBwb3IgY29tcG9uZW50ZVxuICogQHJldHVybnMgUHJvdmlkZXJzIHBhcmEgYWdyZWdhciBlbiBhcHAuY29uZmlnLnRzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIGFwcC5jb25maWcudHNcbiAqIGltcG9ydCB7IHByb3ZpZGVWYWx0ZWNoUHJlc2V0cyB9IGZyb20gJ3ZhbHRlY2gtY29tcG9uZW50cyc7XG4gKlxuICogZXhwb3J0IGNvbnN0IGFwcENvbmZpZzogQXBwbGljYXRpb25Db25maWcgPSB7XG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIHByb3ZpZGVWYWx0ZWNoUHJlc2V0cyh7XG4gKiAgICAgICBidXR0b246IHtcbiAqICAgICAgICAgJ3ByaW1hcnktYWN0aW9uJzogeyBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJ3ByaW1hcnknLCBmaWxsOiAnc29saWQnIH0sXG4gKiAgICAgICAgICdzZWNvbmRhcnknOiB7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ3NlY29uZGFyeScsIGZpbGw6ICdvdXRsaW5lJyB9LFxuICogICAgICAgICAnZGFuZ2VyJzogeyBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYW5nZXInLCBmaWxsOiAnc29saWQnIH0sXG4gKiAgICAgICB9LFxuICogICAgICAgY2FyZDoge1xuICogICAgICAgICAnZmVhdHVyZSc6IHsgdmFyaWFudDogJ2VsZXZhdGVkJywgcGFkZGluZzogJ2xhcmdlJyB9LFxuICogICAgICAgICAnY29tcGFjdCc6IHsgdmFyaWFudDogJ2ZsYXQnLCBwYWRkaW5nOiAnc21hbGwnIH0sXG4gKiAgICAgICB9LFxuICogICAgICAgaW5wdXQ6IHtcbiAqICAgICAgICAgJ2Zvcm0tZmllbGQnOiB7IHNpemU6ICdtZWRpdW0nLCBmaWxsOiAnb3V0bGluZScsIGxhYmVsUG9zaXRpb246ICdmbG9hdGluZycgfSxcbiAqICAgICAgIH1cbiAqICAgICB9KSxcbiAqICAgXVxuICogfTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVWYWx0ZWNoUHJlc2V0cyhwcmVzZXRzOiBQcmVzZXRDb25maWcpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcbiAgICAgIHVzZUZhY3Rvcnk6IChwcmVzZXRTZXJ2aWNlOiBQcmVzZXRTZXJ2aWNlKSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgcHJlc2V0U2VydmljZS5yZWdpc3RlclByZXNldHMocHJlc2V0cyk7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgZGVwczogW1ByZXNldFNlcnZpY2VdLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Service
|
|
2
|
+
export { PresetService } from './preset.service';
|
|
3
|
+
// Config
|
|
4
|
+
export { provideValtechPresets } from './config';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3ByZXNldHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsVUFBVTtBQUNWLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRCxTQUFTO0FBQ1QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVHlwZXNcbmV4cG9ydCB7IFByZXNldENvbmZpZywgQ29tcG9uZW50UHJlc2V0cywgUHJlc2V0c09wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gU2VydmljZVxuZXhwb3J0IHsgUHJlc2V0U2VydmljZSB9IGZyb20gJy4vcHJlc2V0LnNlcnZpY2UnO1xuXG4vLyBDb25maWdcbmV4cG9ydCB7IHByb3ZpZGVWYWx0ZWNoUHJlc2V0cyB9IGZyb20gJy4vY29uZmlnJztcbiJdfQ==
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Injectable, signal } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Servicio para gestionar presets de componentes.
|
|
5
|
+
*
|
|
6
|
+
* Los presets permiten definir configuraciones reutilizables
|
|
7
|
+
* de componentes (tamaño, color, variante, etc.) que se pueden
|
|
8
|
+
* aplicar con un nombre semántico.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // En un componente
|
|
12
|
+
* presets = inject(PresetService);
|
|
13
|
+
*
|
|
14
|
+
* // Obtener preset
|
|
15
|
+
* const buttonProps = this.presets.get<ButtonMetadata>('button', 'primary-action');
|
|
16
|
+
* // { size: 'large', color: 'primary', fill: 'solid' }
|
|
17
|
+
*/
|
|
18
|
+
export class PresetService {
|
|
19
|
+
constructor() {
|
|
20
|
+
this._presets = signal({});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Obtiene un preset específico para un componente
|
|
24
|
+
*
|
|
25
|
+
* @param component Tipo de componente (ej: 'button', 'card', 'input')
|
|
26
|
+
* @param presetName Nombre del preset (ej: 'primary-action', 'compact')
|
|
27
|
+
* @returns Propiedades del preset o objeto vacío si no existe
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* // Obtener preset de botón
|
|
31
|
+
* const props = presets.get<ButtonMetadata>('button', 'primary-action');
|
|
32
|
+
*
|
|
33
|
+
* // Usar en componente
|
|
34
|
+
* <val-button [props]="props"></val-button>
|
|
35
|
+
*/
|
|
36
|
+
get(component, presetName) {
|
|
37
|
+
const componentPresets = this._presets()[component];
|
|
38
|
+
if (!componentPresets) {
|
|
39
|
+
console.warn(`[presets] No presets registered for component: ${component}`);
|
|
40
|
+
return {};
|
|
41
|
+
}
|
|
42
|
+
const preset = componentPresets[presetName];
|
|
43
|
+
if (!preset) {
|
|
44
|
+
console.warn(`[presets] Preset '${presetName}' not found for component: ${component}`);
|
|
45
|
+
return {};
|
|
46
|
+
}
|
|
47
|
+
return preset;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Verifica si existe un preset
|
|
51
|
+
*/
|
|
52
|
+
has(component, presetName) {
|
|
53
|
+
return !!this._presets()[component]?.[presetName];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Registra presets de la aplicación
|
|
57
|
+
*
|
|
58
|
+
* @param presets Configuración de presets
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* presets.registerPresets({
|
|
62
|
+
* button: {
|
|
63
|
+
* 'primary-action': { size: 'large', color: 'primary' },
|
|
64
|
+
* },
|
|
65
|
+
* card: {
|
|
66
|
+
* 'feature': { variant: 'elevated' },
|
|
67
|
+
* }
|
|
68
|
+
* });
|
|
69
|
+
*/
|
|
70
|
+
registerPresets(presets) {
|
|
71
|
+
this._presets.set(presets);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Agrega presets para un componente específico (merge con existentes)
|
|
75
|
+
*/
|
|
76
|
+
registerComponentPresets(component, presets) {
|
|
77
|
+
this._presets.update((current) => ({
|
|
78
|
+
...current,
|
|
79
|
+
[component]: {
|
|
80
|
+
...current[component],
|
|
81
|
+
...presets,
|
|
82
|
+
},
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Obtiene todos los nombres de presets para un componente
|
|
87
|
+
*/
|
|
88
|
+
getPresetNames(component) {
|
|
89
|
+
return Object.keys(this._presets()[component] || {});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Obtiene todos los componentes con presets registrados
|
|
93
|
+
*/
|
|
94
|
+
getRegisteredComponents() {
|
|
95
|
+
return Object.keys(this._presets());
|
|
96
|
+
}
|
|
97
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
98
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetService, providedIn: 'root' }); }
|
|
99
|
+
}
|
|
100
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PresetService, decorators: [{
|
|
101
|
+
type: Injectable,
|
|
102
|
+
args: [{ providedIn: 'root' }]
|
|
103
|
+
}] });
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlc2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3ByZXNldHMvcHJlc2V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBR25EOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsTUFBTSxPQUFPLGFBQWE7SUFEMUI7UUFFbUIsYUFBUSxHQUFHLE1BQU0sQ0FBZSxFQUFFLENBQUMsQ0FBQztLQW9GdEQ7SUFsRkM7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILEdBQUcsQ0FBb0MsU0FBaUIsRUFBRSxVQUFrQjtRQUMxRSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzVFLE9BQU8sRUFBZ0IsQ0FBQztRQUMxQixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsVUFBVSw4QkFBOEIsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN2RixPQUFPLEVBQWdCLENBQUM7UUFDMUIsQ0FBQztRQUVELE9BQU8sTUFBb0IsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxHQUFHLENBQUMsU0FBaUIsRUFBRSxVQUFrQjtRQUN2QyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCxlQUFlLENBQUMsT0FBcUI7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsd0JBQXdCLENBQUMsU0FBaUIsRUFBRSxPQUF5QjtRQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqQyxHQUFHLE9BQU87WUFDVixDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUNYLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztnQkFDckIsR0FBRyxPQUFPO2FBQ1g7U0FDRixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxTQUFpQjtRQUM5QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNILHVCQUF1QjtRQUNyQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdEMsQ0FBQzsrR0FwRlUsYUFBYTttSEFBYixhQUFhLGNBREEsTUFBTTs7NEZBQ25CLGFBQWE7a0JBRHpCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQcmVzZXRDb25maWcsIENvbXBvbmVudFByZXNldHMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBTZXJ2aWNpbyBwYXJhIGdlc3Rpb25hciBwcmVzZXRzIGRlIGNvbXBvbmVudGVzLlxuICpcbiAqIExvcyBwcmVzZXRzIHBlcm1pdGVuIGRlZmluaXIgY29uZmlndXJhY2lvbmVzIHJldXRpbGl6YWJsZXNcbiAqIGRlIGNvbXBvbmVudGVzICh0YW1hw7FvLCBjb2xvciwgdmFyaWFudGUsIGV0Yy4pIHF1ZSBzZSBwdWVkZW5cbiAqIGFwbGljYXIgY29uIHVuIG5vbWJyZSBzZW3DoW50aWNvLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFbiB1biBjb21wb25lbnRlXG4gKiBwcmVzZXRzID0gaW5qZWN0KFByZXNldFNlcnZpY2UpO1xuICpcbiAqIC8vIE9idGVuZXIgcHJlc2V0XG4gKiBjb25zdCBidXR0b25Qcm9wcyA9IHRoaXMucHJlc2V0cy5nZXQ8QnV0dG9uTWV0YWRhdGE+KCdidXR0b24nLCAncHJpbWFyeS1hY3Rpb24nKTtcbiAqIC8vIHsgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICdwcmltYXJ5JywgZmlsbDogJ3NvbGlkJyB9XG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUHJlc2V0U2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ByZXNldHMgPSBzaWduYWw8UHJlc2V0Q29uZmlnPih7fSk7XG5cbiAgLyoqXG4gICAqIE9idGllbmUgdW4gcHJlc2V0IGVzcGVjw61maWNvIHBhcmEgdW4gY29tcG9uZW50ZVxuICAgKlxuICAgKiBAcGFyYW0gY29tcG9uZW50IFRpcG8gZGUgY29tcG9uZW50ZSAoZWo6ICdidXR0b24nLCAnY2FyZCcsICdpbnB1dCcpXG4gICAqIEBwYXJhbSBwcmVzZXROYW1lIE5vbWJyZSBkZWwgcHJlc2V0IChlajogJ3ByaW1hcnktYWN0aW9uJywgJ2NvbXBhY3QnKVxuICAgKiBAcmV0dXJucyBQcm9waWVkYWRlcyBkZWwgcHJlc2V0IG8gb2JqZXRvIHZhY8OtbyBzaSBubyBleGlzdGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gT2J0ZW5lciBwcmVzZXQgZGUgYm90w7NuXG4gICAqIGNvbnN0IHByb3BzID0gcHJlc2V0cy5nZXQ8QnV0dG9uTWV0YWRhdGE+KCdidXR0b24nLCAncHJpbWFyeS1hY3Rpb24nKTtcbiAgICpcbiAgICogLy8gVXNhciBlbiBjb21wb25lbnRlXG4gICAqIDx2YWwtYnV0dG9uIFtwcm9wc109XCJwcm9wc1wiPjwvdmFsLWJ1dHRvbj5cbiAgICovXG4gIGdldDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KGNvbXBvbmVudDogc3RyaW5nLCBwcmVzZXROYW1lOiBzdHJpbmcpOiBQYXJ0aWFsPFQ+IHtcbiAgICBjb25zdCBjb21wb25lbnRQcmVzZXRzID0gdGhpcy5fcHJlc2V0cygpW2NvbXBvbmVudF07XG4gICAgaWYgKCFjb21wb25lbnRQcmVzZXRzKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtwcmVzZXRzXSBObyBwcmVzZXRzIHJlZ2lzdGVyZWQgZm9yIGNvbXBvbmVudDogJHtjb21wb25lbnR9YCk7XG4gICAgICByZXR1cm4ge30gYXMgUGFydGlhbDxUPjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVzZXQgPSBjb21wb25lbnRQcmVzZXRzW3ByZXNldE5hbWVdO1xuICAgIGlmICghcHJlc2V0KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtwcmVzZXRzXSBQcmVzZXQgJyR7cHJlc2V0TmFtZX0nIG5vdCBmb3VuZCBmb3IgY29tcG9uZW50OiAke2NvbXBvbmVudH1gKTtcbiAgICAgIHJldHVybiB7fSBhcyBQYXJ0aWFsPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiBwcmVzZXQgYXMgUGFydGlhbDxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSBleGlzdGUgdW4gcHJlc2V0XG4gICAqL1xuICBoYXMoY29tcG9uZW50OiBzdHJpbmcsIHByZXNldE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX3ByZXNldHMoKVtjb21wb25lbnRdPy5bcHJlc2V0TmFtZV07XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0cmEgcHJlc2V0cyBkZSBsYSBhcGxpY2FjacOzblxuICAgKlxuICAgKiBAcGFyYW0gcHJlc2V0cyBDb25maWd1cmFjacOzbiBkZSBwcmVzZXRzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByZXNldHMucmVnaXN0ZXJQcmVzZXRzKHtcbiAgICogICBidXR0b246IHtcbiAgICogICAgICdwcmltYXJ5LWFjdGlvbic6IHsgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICdwcmltYXJ5JyB9LFxuICAgKiAgIH0sXG4gICAqICAgY2FyZDoge1xuICAgKiAgICAgJ2ZlYXR1cmUnOiB7IHZhcmlhbnQ6ICdlbGV2YXRlZCcgfSxcbiAgICogICB9XG4gICAqIH0pO1xuICAgKi9cbiAgcmVnaXN0ZXJQcmVzZXRzKHByZXNldHM6IFByZXNldENvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMuX3ByZXNldHMuc2V0KHByZXNldHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFncmVnYSBwcmVzZXRzIHBhcmEgdW4gY29tcG9uZW50ZSBlc3BlY8OtZmljbyAobWVyZ2UgY29uIGV4aXN0ZW50ZXMpXG4gICAqL1xuICByZWdpc3RlckNvbXBvbmVudFByZXNldHMoY29tcG9uZW50OiBzdHJpbmcsIHByZXNldHM6IENvbXBvbmVudFByZXNldHMpOiB2b2lkIHtcbiAgICB0aGlzLl9wcmVzZXRzLnVwZGF0ZSgoY3VycmVudCkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnQsXG4gICAgICBbY29tcG9uZW50XToge1xuICAgICAgICAuLi5jdXJyZW50W2NvbXBvbmVudF0sXG4gICAgICAgIC4uLnByZXNldHMsXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIHRvZG9zIGxvcyBub21icmVzIGRlIHByZXNldHMgcGFyYSB1biBjb21wb25lbnRlXG4gICAqL1xuICBnZXRQcmVzZXROYW1lcyhjb21wb25lbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5fcHJlc2V0cygpW2NvbXBvbmVudF0gfHwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgdG9kb3MgbG9zIGNvbXBvbmVudGVzIGNvbiBwcmVzZXRzIHJlZ2lzdHJhZG9zXG4gICAqL1xuICBnZXRSZWdpc3RlcmVkQ29tcG9uZW50cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3ByZXNldHMoKSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3ByZXNldHMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJlc2V0cyBwYXJhIHVuIHRpcG8gZGUgY29tcG9uZW50ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBidXR0b25QcmVzZXRzOiBDb21wb25lbnRQcmVzZXRzID0ge1xuICogICAncHJpbWFyeS1hY3Rpb24nOiB7IHNpemU6ICdsYXJnZScsIGNvbG9yOiAncHJpbWFyeScsIGZpbGw6ICdzb2xpZCcgfSxcbiAqICAgJ3NlY29uZGFyeSc6IHsgc2l6ZTogJ21lZGl1bScsIGNvbG9yOiAnc2Vjb25kYXJ5JywgZmlsbDogJ291dGxpbmUnIH0sXG4gKiAgICdkYW5nZXInOiB7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhbmdlcicsIGZpbGw6ICdzb2xpZCcgfSxcbiAqIH07XG4gKi9cbmV4cG9ydCB0eXBlIENvbXBvbmVudFByZXNldHMgPSBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cbi8qKlxuICogQ29uZmlndXJhY2nDs24gY29tcGxldGEgZGUgcHJlc2V0cyBwb3IgY29tcG9uZW50ZVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBhcHBQcmVzZXRzOiBQcmVzZXRDb25maWcgPSB7XG4gKiAgIGJ1dHRvbjoge1xuICogICAgICdwcmltYXJ5LWFjdGlvbic6IHsgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICdwcmltYXJ5JywgZmlsbDogJ3NvbGlkJyB9LFxuICogICAgICdzZWNvbmRhcnknOiB7IHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ3NlY29uZGFyeScsIGZpbGw6ICdvdXRsaW5lJyB9LFxuICogICB9LFxuICogICBjYXJkOiB7XG4gKiAgICAgJ2ZlYXR1cmUnOiB7IHZhcmlhbnQ6ICdlbGV2YXRlZCcsIHBhZGRpbmc6ICdsYXJnZScgfSxcbiAqICAgICAnY29tcGFjdCc6IHsgdmFyaWFudDogJ2ZsYXQnLCBwYWRkaW5nOiAnc21hbGwnIH0sXG4gKiAgIH0sXG4gKiAgIGlucHV0OiB7XG4gKiAgICAgJ2Zvcm0tZmllbGQnOiB7IHNpemU6ICdtZWRpdW0nLCBmaWxsOiAnb3V0bGluZScsIGxhYmVsUG9zaXRpb246ICdmbG9hdGluZycgfSxcbiAqICAgfVxuICogfTtcbiAqL1xuZXhwb3J0IHR5cGUgUHJlc2V0Q29uZmlnID0gUmVjb3JkPHN0cmluZywgQ29tcG9uZW50UHJlc2V0cz47XG5cbi8qKlxuICogT3BjaW9uZXMgcGFyYSBwcm92aWRlVmFsdGVjaFByZXNldHMoKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXNldHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFByZXNldHMgaW5pY2lhbGVzIGRlIGxhIGFwbGljYWNpw7NuXG4gICAqL1xuICBwcmVzZXRzOiBQcmVzZXRDb25maWc7XG59XG4iXX0=
|