valtech-components 2.0.971 → 2.0.974

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.
Files changed (42) hide show
  1. package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +3 -3
  2. package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +3 -3
  3. package/esm2022/lib/components/molecules/hint/hint.component.mjs +3 -3
  4. package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +3 -3
  5. package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +3 -3
  6. package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +3 -3
  7. package/esm2022/lib/components/organisms/form/form.component.mjs +54 -12
  8. package/esm2022/lib/components/organisms/preferences-view/preferences-view.component.mjs +263 -0
  9. package/esm2022/lib/components/organisms/preferences-view/preferences-view.i18n.mjs +37 -0
  10. package/esm2022/lib/components/organisms/preferences-view/preferences.routes.mjs +29 -0
  11. package/esm2022/lib/components/organisms/preferences-view/types.mjs +2 -0
  12. package/esm2022/lib/components/organisms/profile-view/profile-view.component.mjs +59 -2
  13. package/esm2022/lib/components/organisms/profile-view/profile-view.i18n.mjs +7 -1
  14. package/esm2022/lib/components/organisms/profile-view/types.mjs +1 -1
  15. package/esm2022/lib/components/organisms/share-profile-modal/share-profile-modal.component.mjs +13 -5
  16. package/esm2022/lib/components/organisms/share-profile-modal/types.mjs +1 -1
  17. package/esm2022/lib/components/types.mjs +1 -1
  18. package/esm2022/lib/version.mjs +2 -2
  19. package/esm2022/public-api.mjs +4 -2
  20. package/fesm2022/valtech-components.mjs +645 -298
  21. package/fesm2022/valtech-components.mjs.map +1 -1
  22. package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +1 -1
  23. package/lib/components/atoms/text/text.component.d.ts +1 -1
  24. package/lib/components/atoms/user-avatar/user-avatar.component.d.ts +1 -1
  25. package/lib/components/molecules/features-list/features-list.component.d.ts +1 -1
  26. package/lib/components/organisms/article/article.component.d.ts +9 -6
  27. package/lib/components/organisms/form/form.component.d.ts +23 -0
  28. package/lib/components/organisms/landing-steps/landing-steps.component.d.ts +1 -1
  29. package/lib/components/organisms/preferences-view/preferences-view.component.d.ts +53 -0
  30. package/lib/components/organisms/preferences-view/preferences-view.i18n.d.ts +12 -0
  31. package/lib/components/organisms/preferences-view/preferences.routes.d.ts +24 -0
  32. package/lib/components/organisms/preferences-view/types.d.ts +35 -0
  33. package/lib/components/organisms/profile-view/profile-view.component.d.ts +6 -1
  34. package/lib/components/organisms/profile-view/types.d.ts +12 -0
  35. package/lib/components/organisms/share-profile-modal/share-profile-modal.component.d.ts +1 -1
  36. package/lib/components/organisms/share-profile-modal/types.d.ts +2 -0
  37. package/lib/components/types.d.ts +14 -0
  38. package/lib/version.d.ts +1 -1
  39. package/package.json +1 -1
  40. package/public-api.d.ts +3 -1
  41. package/esm2022/lib/components/organisms/form/form-footer/form-footer.component.mjs +0 -83
  42. package/lib/components/organisms/form/form-footer/form-footer.component.d.ts +0 -17
@@ -0,0 +1,263 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, computed, inject, Input, signal } from '@angular/core';
3
+ import { ActivatedRoute } from '@angular/router';
4
+ import { DisplayComponent } from '../../atoms/display/display.component';
5
+ import { TextComponent } from '../../atoms/text/text.component';
6
+ import { TitleComponent } from '../../atoms/title/title.component';
7
+ import { LanguageSelectorComponent } from '../../molecules/language-selector/language-selector.component';
8
+ import { SegmentControlComponent } from '../../molecules/segment-control/segment-control.component';
9
+ import { I18nService } from '../../../services/i18n';
10
+ import { NavigationService } from '../../../services/navigation/navigation.service';
11
+ import { PreferencesService } from '../../../services/preferences/preferences.service';
12
+ import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
13
+ import { PREFERENCES_VIEW_I18N } from './preferences-view.i18n';
14
+ import * as i0 from "@angular/core";
15
+ const DEFAULT_NAMESPACE = 'Settings.General';
16
+ const DEFAULT_LANGUAGES = ['es', 'en'];
17
+ /**
18
+ * `val-preferences-view` — vista de preferencias de UI cross-app (tema +
19
+ * idioma) full-feature autocontenida (organism). Promovida desde `showcase`
20
+ * bajo el proceso de ADR-021.
21
+ *
22
+ * Backend integration 100% en `PreferencesService`:
23
+ * - Read: listener Firestore reactivo (`prefs.theme()` / `prefs.language()`).
24
+ * - Write: `PUT /v2/auth/preferences` (`prefs.setTheme` / `prefs.setLanguage`).
25
+ * El cliente NUNCA escribe Firestore directo.
26
+ *
27
+ * NO renderiza ion-content — vive dentro de val-page-wrapper.
28
+ *
29
+ * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no
30
+ * proveyó el namespace configurado (default `Settings.General`).
31
+ */
32
+ export class PreferencesViewComponent {
33
+ /** Namespace i18n resuelto (capturado para llamadas no-reactivas). */
34
+ get ns() {
35
+ return this.resolvedConfig().i18nNamespace;
36
+ }
37
+ constructor() {
38
+ this.nav = inject(NavigationService);
39
+ this.prefs = inject(PreferencesService);
40
+ this.i18n = inject(I18nService);
41
+ this.errors = inject(ValtechErrorService);
42
+ this.route = inject(ActivatedRoute, { optional: true });
43
+ /** Config mergeada con defaults. @Input gana sobre route data. */
44
+ this.resolvedConfig = computed(() => {
45
+ const fromRoute = (this.route?.snapshot.data['preferencesConfig'] ?? {});
46
+ const merged = { ...fromRoute, ...(this.config ?? {}) };
47
+ return {
48
+ showTheme: merged.showTheme ?? true,
49
+ showLanguage: merged.showLanguage ?? true,
50
+ supportedLanguages: merged.supportedLanguages ?? DEFAULT_LANGUAGES,
51
+ i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE,
52
+ onThemeChanged: merged.onThemeChanged,
53
+ onLanguageChanged: merged.onLanguageChanged,
54
+ };
55
+ });
56
+ this.saving = signal(false);
57
+ this.pageTitle = computed(() => this.t('pageTitle'));
58
+ this.pageDescription = computed(() => this.t('pageDescription'));
59
+ this.themeTitle = computed(() => this.t('themeTitle'));
60
+ this.themeHint = computed(() => this.t('themeHint'));
61
+ this.langTitle = computed(() => this.t('languageTitle'));
62
+ this.langHint = computed(() => this.t('languageHint'));
63
+ this.themeProps = computed(() => ({
64
+ value: this.prefs.theme(),
65
+ disabled: this.saving(),
66
+ options: [
67
+ { value: 'light', label: this.t('themeLight') },
68
+ { value: 'dark', label: this.t('themeDark') },
69
+ { value: 'auto', label: this.t('themeAuto') },
70
+ ],
71
+ }));
72
+ this.langProps = computed(() => ({
73
+ currentLanguage: this.prefs.language(),
74
+ availableLanguages: this.resolvedConfig().supportedLanguages,
75
+ showLabel: false,
76
+ disabled: this.saving(),
77
+ expand: 'block',
78
+ fill: 'outline',
79
+ }));
80
+ // Auto-registro i18n — respeta override del consumer. El namespace puede
81
+ // venir de @Input.config o del route data; lo resolvemos acá.
82
+ const ns = this.ns;
83
+ if (!this.i18n.hasNamespace(ns)) {
84
+ this.i18n.registerContent(ns, PREFERENCES_VIEW_I18N);
85
+ }
86
+ this.nav.setBackHeader('pageTitle', ns, { withMenu: true });
87
+ }
88
+ async onThemeChange(value) {
89
+ if (this.saving() || value === this.prefs.theme())
90
+ return;
91
+ const theme = value;
92
+ await this.dispatch(() => this.prefs.setTheme(theme), () => this.resolvedConfig().onThemeChanged?.(theme));
93
+ }
94
+ async onLanguageChange(value) {
95
+ const lang = value;
96
+ if (!this.resolvedConfig().supportedLanguages.includes(lang))
97
+ return;
98
+ if (this.saving() || value === this.prefs.language())
99
+ return;
100
+ await this.dispatch(() => this.prefs.setLanguage(lang), () => this.resolvedConfig().onLanguageChanged?.(lang));
101
+ }
102
+ async dispatch(fn, onSuccess) {
103
+ this.saving.set(true);
104
+ try {
105
+ await fn();
106
+ onSuccess?.();
107
+ }
108
+ catch (err) {
109
+ this.errors.handle(err, {
110
+ context: 'settings.preferences.save',
111
+ fallbackKey: 'saveError',
112
+ i18nNamespace: this.ns,
113
+ });
114
+ }
115
+ finally {
116
+ this.saving.set(false);
117
+ }
118
+ }
119
+ /** Lee del namespace configurado. */
120
+ t(key) {
121
+ return this.i18n.t(key, this.ns);
122
+ }
123
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PreferencesViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
124
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PreferencesViewComponent, isStandalone: true, selector: "val-preferences-view", inputs: { config: "config" }, ngImport: i0, template: `
125
+ <div class="page">
126
+ <header class="page-header">
127
+ <val-display [props]="{ size: 'small', color: 'dark', content: pageTitle() }" />
128
+ <val-title
129
+ [props]="{
130
+ size: 'large',
131
+ color: 'dark',
132
+ bold: false,
133
+ content: pageDescription(),
134
+ }"
135
+ />
136
+ </header>
137
+
138
+ @if (resolvedConfig().showTheme) {
139
+ <section class="settings-section">
140
+ <val-title
141
+ [props]="{
142
+ size: 'medium',
143
+ color: 'dark',
144
+ bold: true,
145
+ content: themeTitle(),
146
+ }"
147
+ />
148
+ <div class="section-body">
149
+ <val-text
150
+ [props]="{
151
+ size: 'medium',
152
+ color: 'dark',
153
+ bold: false,
154
+ content: themeHint(),
155
+ }"
156
+ />
157
+ <val-segment-control [props]="themeProps()" (segmentChange)="onThemeChange($event)" />
158
+ </div>
159
+ </section>
160
+ }
161
+
162
+ @if (resolvedConfig().showLanguage) {
163
+ <section class="settings-section">
164
+ <val-title
165
+ [props]="{
166
+ size: 'medium',
167
+ color: 'dark',
168
+ bold: true,
169
+ content: langTitle(),
170
+ }"
171
+ />
172
+ <div class="section-body">
173
+ <val-text
174
+ [props]="{
175
+ size: 'medium',
176
+ color: 'dark',
177
+ bold: false,
178
+ content: langHint(),
179
+ }"
180
+ />
181
+ <val-language-selector [props]="langProps()" (languageChange)="onLanguageChange($event)" />
182
+ </div>
183
+ </section>
184
+ }
185
+ </div>
186
+ `, isInline: true, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.section-body{display:flex;flex-direction:column;gap:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SegmentControlComponent, selector: "val-segment-control", inputs: ["preset", "props"], outputs: ["segmentChange"] }, { kind: "component", type: LanguageSelectorComponent, selector: "val-language-selector", inputs: ["props"], outputs: ["languageChange"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
187
+ }
188
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PreferencesViewComponent, decorators: [{
189
+ type: Component,
190
+ args: [{ selector: 'val-preferences-view', standalone: true, imports: [
191
+ CommonModule,
192
+ SegmentControlComponent,
193
+ LanguageSelectorComponent,
194
+ DisplayComponent,
195
+ TitleComponent,
196
+ TextComponent,
197
+ ], template: `
198
+ <div class="page">
199
+ <header class="page-header">
200
+ <val-display [props]="{ size: 'small', color: 'dark', content: pageTitle() }" />
201
+ <val-title
202
+ [props]="{
203
+ size: 'large',
204
+ color: 'dark',
205
+ bold: false,
206
+ content: pageDescription(),
207
+ }"
208
+ />
209
+ </header>
210
+
211
+ @if (resolvedConfig().showTheme) {
212
+ <section class="settings-section">
213
+ <val-title
214
+ [props]="{
215
+ size: 'medium',
216
+ color: 'dark',
217
+ bold: true,
218
+ content: themeTitle(),
219
+ }"
220
+ />
221
+ <div class="section-body">
222
+ <val-text
223
+ [props]="{
224
+ size: 'medium',
225
+ color: 'dark',
226
+ bold: false,
227
+ content: themeHint(),
228
+ }"
229
+ />
230
+ <val-segment-control [props]="themeProps()" (segmentChange)="onThemeChange($event)" />
231
+ </div>
232
+ </section>
233
+ }
234
+
235
+ @if (resolvedConfig().showLanguage) {
236
+ <section class="settings-section">
237
+ <val-title
238
+ [props]="{
239
+ size: 'medium',
240
+ color: 'dark',
241
+ bold: true,
242
+ content: langTitle(),
243
+ }"
244
+ />
245
+ <div class="section-body">
246
+ <val-text
247
+ [props]="{
248
+ size: 'medium',
249
+ color: 'dark',
250
+ bold: false,
251
+ content: langHint(),
252
+ }"
253
+ />
254
+ <val-language-selector [props]="langProps()" (languageChange)="onLanguageChange($event)" />
255
+ </div>
256
+ </section>
257
+ }
258
+ </div>
259
+ `, styles: [".page{padding:16px 0;max-width:720px;margin:0 auto}.settings-section{padding:16px 0}.settings-section+.settings-section{border-top:1px solid var(--val-border-color, rgba(0, 0, 0, .08))}.section-body{display:flex;flex-direction:column;gap:10px}\n"] }]
260
+ }], ctorParameters: () => [], propDecorators: { config: [{
261
+ type: Input
262
+ }] } });
263
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyZW5jZXMtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL3ByZWZlcmVuY2VzLXZpZXcvcHJlZmVyZW5jZXMtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBRTFHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBR3BHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUV2RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUdyRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFFaEUsTUFBTSxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQztBQUM3QyxNQUFNLGlCQUFpQixHQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FB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LEdBQVc7UUFDckIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7K0dBakhVLHdCQUF3QjttR0FBeEIsd0JBQXdCLDhHQXBGekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOERULDhUQXJFQyxZQUFZLCtCQUNaLHVCQUF1Qix5SEFDdkIseUJBQXlCLGtIQUN6QixnQkFBZ0IsMkVBQ2hCLGNBQWMseUVBQ2QsYUFBYTs7NEZBc0ZKLHdCQUF3QjtrQkEvRnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLHVCQUF1Qjt3QkFDdkIseUJBQXlCO3dCQUN6QixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsYUFBYTtxQkFDZCxZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThEVDt3REFrQ1EsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgSW5wdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBEaXNwbGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGV4dC90ZXh0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaXRsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3RpdGxlL3RpdGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL2xhbmd1YWdlLXNlbGVjdG9yL2xhbmd1YWdlLXNlbGVjdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlbGVjdG9yTWV0YWRhdGEgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvbGFuZ3VhZ2Utc2VsZWN0b3IvdHlwZXMnO1xuaW1wb3J0IHsgU2VnbWVudENvbnRyb2xDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvc2VnbWVudC1jb250cm9sL3NlZ21lbnQtY29udHJvbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VnbWVudENvbnRyb2xNZXRhZGF0YSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9zZWdtZW50LWNvbnRyb2wvdHlwZXMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9uYXZpZ2F0aW9uL25hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFByZWZlcmVuY2VzTGFuZ3VhZ2UsIFByZWZlcmVuY2VzVGhlbWUgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wcmVmZXJlbmNlcy9wcmVmZXJlbmNlcy50eXBlcyc7XG5pbXBvcnQgeyBWYWx0ZWNoRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZXJyb3JzL3ZhbHRlY2gtZXJyb3Iuc2VydmljZSc7XG5cbmltcG9ydCB7IFByZWZlcmVuY2VzVmlld0NvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgUFJFRkVSRU5DRVNfVklFV19JMThOIH0gZnJvbSAnLi9wcmVmZXJlbmNlcy12aWV3LmkxOG4nO1xuXG5jb25zdCBERUZBVUxUX05BTUVTUEFDRSA9ICdTZXR0aW5ncy5HZW5lcmFsJztcbmNvbnN0IERFRkFVTFRfTEFOR1VBR0VTOiBQcmVmZXJlbmNlc0xhbmd1YWdlW10gPSBbJ2VzJywgJ2VuJ107XG5cbi8qKlxuICogYHZhbC1wcmVmZXJlbmNlcy12aWV3YCDigJQgdmlzdGEgZGUgcHJlZmVyZW5jaWFzIGRlIFVJIGNyb3NzLWFwcCAodGVtYSArXG4gKiBpZGlvbWEpIGZ1bGwtZmVhdHVyZSBhdXRvY29udGVuaWRhIChvcmdhbmlzbSkuIFByb21vdmlkYSBkZXNkZSBgc2hvd2Nhc2VgXG4gKiBiYWpvIGVsIHByb2Nlc28gZGUgQURSLTAyMS5cbiAqXG4gKiBCYWNrZW5kIGludGVncmF0aW9uIDEwMCUgZW4gYFByZWZlcmVuY2VzU2VydmljZWA6XG4gKiAgLSBSZWFkOiBsaXN0ZW5lciBGaXJlc3RvcmUgcmVhY3Rpdm8gKGBwcmVmcy50aGVtZSgpYCAvIGBwcmVmcy5sYW5ndWFnZSgpYCkuXG4gKiAgLSBXcml0ZTogYFBVVCAvdjIvYXV0aC9wcmVmZXJlbmNlc2AgKGBwcmVmcy5zZXRUaGVtZWAgLyBgcHJlZnMuc2V0TGFuZ3VhZ2VgKS5cbiAqICAgIEVsIGNsaWVudGUgTlVOQ0EgZXNjcmliZSBGaXJlc3RvcmUgZGlyZWN0by5cbiAqXG4gKiBOTyByZW5kZXJpemEgaW9uLWNvbnRlbnQg4oCUIHZpdmUgZGVudHJvIGRlIHZhbC1wYWdlLXdyYXBwZXIuXG4gKlxuICogQXV0by1yZWdpc3RyYSBzdXMgZGVmYXVsdHMgaTE4biAoZXMvZW4pIGVuIGVsIGNvbnN0cnVjdG9yIHNpIGVsIGNvbnN1bWVyIG5vXG4gKiBwcm92ZXnDsyBlbCBuYW1lc3BhY2UgY29uZmlndXJhZG8gKGRlZmF1bHQgYFNldHRpbmdzLkdlbmVyYWxgKS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXByZWZlcmVuY2VzLXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFNlZ21lbnRDb250cm9sQ29tcG9uZW50LFxuICAgIExhbmd1YWdlU2VsZWN0b3JDb21wb25lbnQsXG4gICAgRGlzcGxheUNvbXBvbmVudCxcbiAgICBUaXRsZUNvbXBvbmVudCxcbiAgICBUZXh0Q29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwYWdlXCI+XG4gICAgICA8aGVhZGVyIGNsYXNzPVwicGFnZS1oZWFkZXJcIj5cbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycsIGNvbnRlbnQ6IHBhZ2VUaXRsZSgpIH1cIiAvPlxuICAgICAgICA8dmFsLXRpdGxlXG4gICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgIHNpemU6ICdsYXJnZScsXG4gICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgYm9sZDogZmFsc2UsXG4gICAgICAgICAgICBjb250ZW50OiBwYWdlRGVzY3JpcHRpb24oKSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgLz5cbiAgICAgIDwvaGVhZGVyPlxuXG4gICAgICBAaWYgKHJlc29sdmVkQ29uZmlnKCkuc2hvd1RoZW1lKSB7XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2V0dGluZ3Mtc2VjdGlvblwiPlxuICAgICAgICAgIDx2YWwtdGl0bGVcbiAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiB0cnVlLFxuICAgICAgICAgICAgICBjb250ZW50OiB0aGVtZVRpdGxlKCksXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWJvZHlcIj5cbiAgICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgICAgYm9sZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29udGVudDogdGhlbWVIaW50KCksXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDx2YWwtc2VnbWVudC1jb250cm9sIFtwcm9wc109XCJ0aGVtZVByb3BzKClcIiAoc2VnbWVudENoYW5nZSk9XCJvblRoZW1lQ2hhbmdlKCRldmVudClcIiAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICB9XG5cbiAgICAgIEBpZiAocmVzb2x2ZWRDb25maWcoKS5zaG93TGFuZ3VhZ2UpIHtcbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZXR0aW5ncy1zZWN0aW9uXCI+XG4gICAgICAgICAgPHZhbC10aXRsZVxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGxhbmdUaXRsZSgpLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1ib2R5XCI+XG4gICAgICAgICAgICA8dmFsLXRleHRcbiAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICBzaXplOiAnbWVkaXVtJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGxhbmdIaW50KCksXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDx2YWwtbGFuZ3VhZ2Utc2VsZWN0b3IgW3Byb3BzXT1cImxhbmdQcm9wcygpXCIgKGxhbmd1YWdlQ2hhbmdlKT1cIm9uTGFuZ3VhZ2VDaGFuZ2UoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLnBhZ2Uge1xuICAgICAgICBwYWRkaW5nOiAxNnB4IDA7XG4gICAgICAgIG1heC13aWR0aDogNzIwcHg7XG4gICAgICAgIG1hcmdpbjogMCBhdXRvO1xuICAgICAgfVxuICAgICAgLnNldHRpbmdzLXNlY3Rpb24ge1xuICAgICAgICBwYWRkaW5nOiAxNnB4IDA7XG4gICAgICB9XG4gICAgICAuc2V0dGluZ3Mtc2VjdGlvbiArIC5zZXR0aW5ncy1zZWN0aW9uIHtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLXZhbC1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpO1xuICAgICAgfVxuICAgICAgLnNlY3Rpb24tYm9keSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTBweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBQcmVmZXJlbmNlc1ZpZXdDb21wb25lbnQge1xuICBwcml2YXRlIG5hdiA9IGluamVjdChOYXZpZ2F0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcHJlZnMgPSBpbmplY3QoUHJlZmVyZW5jZXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBlcnJvcnMgPSBpbmplY3QoVmFsdGVjaEVycm9yU2VydmljZSk7XG4gIHByaXZhdGUgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgLyoqXG4gICAqIENvbmZpZyB2w61hIEBJbnB1dCAob2JqZWN0LWZpcnN0KS4gU2kgbm8gc2UgcGFzYSwgc2UgY2FlIGFsIHJvdXRlIGRhdGFcbiAgICogYHByZWZlcmVuY2VzQ29uZmlnYCAocG9ibGFkbyBwb3IgYHByb3ZpZGVWYWx0ZWNoUHJlZmVyZW5jZXNSb3V0ZXNgKS5cbiAgICogYHJlc29sdmVkQ29uZmlnYCBtZXJnZWEgY29uIGxvcyBkZWZhdWx0cy5cbiAgICovXG4gIEBJbnB1dCgpIGNvbmZpZz86IFByZWZlcmVuY2VzVmlld0NvbmZpZztcblxuICAvKiogQ29uZmlnIG1lcmdlYWRhIGNvbiBkZWZhdWx0cy4gQElucHV0IGdhbmEgc29icmUgcm91dGUgZGF0YS4gKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRDb25maWcgPSBjb21wdXRlZDxcbiAgICBSZXF1aXJlZDxPbWl0PFByZWZlcmVuY2VzVmlld0NvbmZpZywgJ29uVGhlbWVDaGFuZ2VkJyB8ICdvbkxhbmd1YWdlQ2hhbmdlZCc+PiAmXG4gICAgICBQaWNrPFByZWZlcmVuY2VzVmlld0NvbmZpZywgJ29uVGhlbWVDaGFuZ2VkJyB8ICdvbkxhbmd1YWdlQ2hhbmdlZCc+XG4gID4oKCkgPT4ge1xuICAgIGNvbnN0IGZyb21Sb3V0ZSA9ICh0aGlzLnJvdXRlPy5zbmFwc2hvdC5kYXRhWydwcmVmZXJlbmNlc0NvbmZpZyddID8/IHt9KSBhcyBQcmVmZXJlbmNlc1ZpZXdDb25maWc7XG4gICAgY29uc3QgbWVyZ2VkOiBQcmVmZXJlbmNlc1ZpZXdDb25maWcgPSB7IC4uLmZyb21Sb3V0ZSwgLi4uKHRoaXMuY29uZmlnID8/IHt9KSB9O1xuICAgIHJldHVybiB7XG4gICAgICBzaG93VGhlbWU6IG1lcmdlZC5zaG93VGhlbWUgPz8gdHJ1ZSxcbiAgICAgIHNob3dMYW5ndWFnZTogbWVyZ2VkLnNob3dMYW5ndWFnZSA/PyB0cnVlLFxuICAgICAgc3VwcG9ydGVkTGFuZ3VhZ2VzOiBtZXJnZWQuc3VwcG9ydGVkTGFuZ3VhZ2VzID8/IERFRkFVTFRfTEFOR1VBR0VTLFxuICAgICAgaTE4bk5hbWVzcGFjZTogbWVyZ2VkLmkxOG5OYW1lc3BhY2UgPz8gREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgICBvblRoZW1lQ2hhbmdlZDogbWVyZ2VkLm9uVGhlbWVDaGFuZ2VkLFxuICAgICAgb25MYW5ndWFnZUNoYW5nZWQ6IG1lcmdlZC5vbkxhbmd1YWdlQ2hhbmdlZCxcbiAgICB9O1xuICB9KTtcblxuICAvKiogTmFtZXNwYWNlIGkxOG4gcmVzdWVsdG8gKGNhcHR1cmFkbyBwYXJhIGxsYW1hZGFzIG5vLXJlYWN0aXZhcykuICovXG4gIHByaXZhdGUgZ2V0IG5zKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRDb25maWcoKS5pMThuTmFtZXNwYWNlO1xuICB9XG5cbiAgcmVhZG9ubHkgc2F2aW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICByZWFkb25seSBwYWdlVGl0bGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnQoJ3BhZ2VUaXRsZScpKTtcbiAgcmVhZG9ubHkgcGFnZURlc2NyaXB0aW9uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50KCdwYWdlRGVzY3JpcHRpb24nKSk7XG4gIHJlYWRvbmx5IHRoZW1lVGl0bGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnQoJ3RoZW1lVGl0bGUnKSk7XG4gIHJlYWRvbmx5IHRoZW1lSGludCA9IGNvbXB1dGVkKCgpID0+IHRoaXMudCgndGhlbWVIaW50JykpO1xuICByZWFkb25seSBsYW5nVGl0bGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnQoJ2xhbmd1YWdlVGl0bGUnKSk7XG4gIHJlYWRvbmx5IGxhbmdIaW50ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50KCdsYW5ndWFnZUhpbnQnKSk7XG5cbiAgcmVhZG9ubHkgdGhlbWVQcm9wcyA9IGNvbXB1dGVkPFBhcnRpYWw8U2VnbWVudENvbnRyb2xNZXRhZGF0YT4+KCgpID0+ICh7XG4gICAgdmFsdWU6IHRoaXMucHJlZnMudGhlbWUoKSxcbiAgICBkaXNhYmxlZDogdGhpcy5zYXZpbmcoKSxcbiAgICBvcHRpb25zOiBbXG4gICAgICB7IHZhbHVlOiAnbGlnaHQnLCBsYWJlbDogdGhpcy50KCd0aGVtZUxpZ2h0JykgfSxcbiAgICAgIHsgdmFsdWU6ICdkYXJrJywgbGFiZWw6IHRoaXMudCgndGhlbWVEYXJrJykgfSxcbiAgICAgIHsgdmFsdWU6ICdhdXRvJywgbGFiZWw6IHRoaXMudCgndGhlbWVBdXRvJykgfSxcbiAgICBdLFxuICB9KSk7XG5cbiAgcmVhZG9ubHkgbGFuZ1Byb3BzID0gY29tcHV0ZWQ8UGFydGlhbDxMYW5ndWFnZVNlbGVjdG9yTWV0YWRhdGE+PigoKSA9PiAoe1xuICAgIGN1cnJlbnRMYW5ndWFnZTogdGhpcy5wcmVmcy5sYW5ndWFnZSgpLFxuICAgIGF2YWlsYWJsZUxhbmd1YWdlczogdGhpcy5yZXNvbHZlZENvbmZpZygpLnN1cHBvcnRlZExhbmd1YWdlcyxcbiAgICBzaG93TGFiZWw6IGZhbHNlLFxuICAgIGRpc2FibGVkOiB0aGlzLnNhdmluZygpLFxuICAgIGV4cGFuZDogJ2Jsb2NrJyxcbiAgICBmaWxsOiAnb3V0bGluZScsXG4gIH0pKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBBdXRvLXJlZ2lzdHJvIGkxOG4g4oCUIHJlc3BldGEgb3ZlcnJpZGUgZGVsIGNvbnN1bWVyLiBFbCBuYW1lc3BhY2UgcHVlZGVcbiAgICAvLyB2ZW5pciBkZSBASW5wdXQuY29uZmlnIG8gZGVsIHJvdXRlIGRhdGE7IGxvIHJlc29sdmVtb3MgYWPDoS5cbiAgICBjb25zdCBucyA9IHRoaXMubnM7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKG5zKSkge1xuICAgICAgdGhpcy5pMThuLnJlZ2lzdGVyQ29udGVudChucywgUFJFRkVSRU5DRVNfVklFV19JMThOKTtcbiAgICB9XG5cbiAgICB0aGlzLm5hdi5zZXRCYWNrSGVhZGVyKCdwYWdlVGl0bGUnLCBucywgeyB3aXRoTWVudTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGFzeW5jIG9uVGhlbWVDaGFuZ2UodmFsdWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNhdmluZygpIHx8IHZhbHVlID09PSB0aGlzLnByZWZzLnRoZW1lKCkpIHJldHVybjtcbiAgICBjb25zdCB0aGVtZSA9IHZhbHVlIGFzIFByZWZlcmVuY2VzVGhlbWU7XG4gICAgYXdhaXQgdGhpcy5kaXNwYXRjaChcbiAgICAgICgpID0+IHRoaXMucHJlZnMuc2V0VGhlbWUodGhlbWUpLFxuICAgICAgKCkgPT4gdGhpcy5yZXNvbHZlZENvbmZpZygpLm9uVGhlbWVDaGFuZ2VkPy4odGhlbWUpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG9uTGFuZ3VhZ2VDaGFuZ2UodmFsdWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhbmcgPSB2YWx1ZSBhcyBQcmVmZXJlbmNlc0xhbmd1YWdlO1xuICAgIGlmICghdGhpcy5yZXNvbHZlZENvbmZpZygpLnN1cHBvcnRlZExhbmd1YWdlcy5pbmNsdWRlcyhsYW5nKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnNhdmluZygpIHx8IHZhbHVlID09PSB0aGlzLnByZWZzLmxhbmd1YWdlKCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmRpc3BhdGNoKFxuICAgICAgKCkgPT4gdGhpcy5wcmVmcy5zZXRMYW5ndWFnZShsYW5nKSxcbiAgICAgICgpID0+IHRoaXMucmVzb2x2ZWRDb25maWcoKS5vbkxhbmd1YWdlQ2hhbmdlZD8uKGxhbmcpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2goZm46ICgpID0+IFByb21pc2U8dW5rbm93bj4sIG9uU3VjY2Vzcz86ICgpID0+IHZvaWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNhdmluZy5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgICBvblN1Y2Nlc3M/LigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICBjb250ZXh0OiAnc2V0dGluZ3MucHJlZmVyZW5jZXMuc2F2ZScsXG4gICAgICAgIGZhbGxiYWNrS2V5OiAnc2F2ZUVycm9yJyxcbiAgICAgICAgaTE4bk5hbWVzcGFjZTogdGhpcy5ucyxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNhdmluZy5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBMZWUgZGVsIG5hbWVzcGFjZSBjb25maWd1cmFkby4gKi9cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIHRoaXMubnMpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Defaults i18n (es/en) embebidos en `val-preferences-view`. Auto-registrados
3
+ * en el constructor del componente si el consumer no proveyó el namespace
4
+ * (`Settings.General` por default). Garantiza que nunca haya una key faltante
5
+ * evaluada por cada change-detection (ver nota en valtech-components/CLAUDE.md
6
+ * sobre el storm de CD con `val-debug-console`). El consumer puede override
7
+ * registrando el mismo namespace antes de que el componente monte.
8
+ *
9
+ * SOLO incluye las keys que la vista realmente usa.
10
+ */
11
+ export const PREFERENCES_VIEW_I18N = {
12
+ es: {
13
+ pageTitle: 'General',
14
+ pageDescription: 'Apariencia e idioma',
15
+ themeTitle: 'Tema',
16
+ themeHint: 'Cómo se ve la app: claro, oscuro o según tu sistema.',
17
+ themeLight: 'Claro',
18
+ themeDark: 'Oscuro',
19
+ themeAuto: 'Auto',
20
+ languageTitle: 'Idioma',
21
+ languageHint: 'Idioma de la interfaz y de los correos que recibes.',
22
+ saveError: 'No se pudo guardar la preferencia.',
23
+ },
24
+ en: {
25
+ pageTitle: 'General',
26
+ pageDescription: 'Appearance and language',
27
+ themeTitle: 'Theme',
28
+ themeHint: 'How the app looks: light, dark, or matching your system.',
29
+ themeLight: 'Light',
30
+ themeDark: 'Dark',
31
+ themeAuto: 'Auto',
32
+ languageTitle: 'Language',
33
+ languageHint: 'Language of the interface and of the emails you receive.',
34
+ saveError: 'Could not save preference.',
35
+ },
36
+ };
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyZW5jZXMtdmlldy5pMThuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9wcmVmZXJlbmNlcy12aWV3L3ByZWZlcmVuY2VzLXZpZXcuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBcUI7SUFDckQsRUFBRSxFQUFFO1FBQ0YsU0FBUyxFQUFFLFNBQVM7UUFDcEIsZUFBZSxFQUFFLHFCQUFxQjtRQUN0QyxVQUFVLEVBQUUsTUFBTTtRQUNsQixTQUFTLEVBQUUsc0RBQXNEO1FBQ2pFLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFNBQVMsRUFBRSxRQUFRO1FBQ25CLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLGFBQWEsRUFBRSxRQUFRO1FBQ3ZCLFlBQVksRUFBRSxxREFBcUQ7UUFDbkUsU0FBUyxFQUFFLG9DQUFvQztLQUNoRDtJQUNELEVBQUUsRUFBRTtRQUNGLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGVBQWUsRUFBRSx5QkFBeUI7UUFDMUMsVUFBVSxFQUFFLE9BQU87UUFDbkIsU0FBUyxFQUFFLDBEQUEwRDtRQUNyRSxVQUFVLEVBQUUsT0FBTztRQUNuQixTQUFTLEVBQUUsTUFBTTtRQUNqQixTQUFTLEVBQUUsTUFBTTtRQUNqQixhQUFhLEVBQUUsVUFBVTtRQUN6QixZQUFZLEVBQUUsMERBQTBEO1FBQ3hFLFNBQVMsRUFBRSw0QkFBNEI7S0FDeEM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGFuZ3VhZ2VzQ29udGVudCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmF1bHRzIGkxOG4gKGVzL2VuKSBlbWJlYmlkb3MgZW4gYHZhbC1wcmVmZXJlbmNlcy12aWV3YC4gQXV0by1yZWdpc3RyYWRvc1xuICogZW4gZWwgY29uc3RydWN0b3IgZGVsIGNvbXBvbmVudGUgc2kgZWwgY29uc3VtZXIgbm8gcHJvdmV5w7MgZWwgbmFtZXNwYWNlXG4gKiAoYFNldHRpbmdzLkdlbmVyYWxgIHBvciBkZWZhdWx0KS4gR2FyYW50aXphIHF1ZSBudW5jYSBoYXlhIHVuYSBrZXkgZmFsdGFudGVcbiAqIGV2YWx1YWRhIHBvciBjYWRhIGNoYW5nZS1kZXRlY3Rpb24gKHZlciBub3RhIGVuIHZhbHRlY2gtY29tcG9uZW50cy9DTEFVREUubWRcbiAqIHNvYnJlIGVsIHN0b3JtIGRlIENEIGNvbiBgdmFsLWRlYnVnLWNvbnNvbGVgKS4gRWwgY29uc3VtZXIgcHVlZGUgb3ZlcnJpZGVcbiAqIHJlZ2lzdHJhbmRvIGVsIG1pc21vIG5hbWVzcGFjZSBhbnRlcyBkZSBxdWUgZWwgY29tcG9uZW50ZSBtb250ZS5cbiAqXG4gKiBTT0xPIGluY2x1eWUgbGFzIGtleXMgcXVlIGxhIHZpc3RhIHJlYWxtZW50ZSB1c2EuXG4gKi9cbmV4cG9ydCBjb25zdCBQUkVGRVJFTkNFU19WSUVXX0kxOE46IExhbmd1YWdlc0NvbnRlbnQgPSB7XG4gIGVzOiB7XG4gICAgcGFnZVRpdGxlOiAnR2VuZXJhbCcsXG4gICAgcGFnZURlc2NyaXB0aW9uOiAnQXBhcmllbmNpYSBlIGlkaW9tYScsXG4gICAgdGhlbWVUaXRsZTogJ1RlbWEnLFxuICAgIHRoZW1lSGludDogJ0PDs21vIHNlIHZlIGxhIGFwcDogY2xhcm8sIG9zY3VybyBvIHNlZ8O6biB0dSBzaXN0ZW1hLicsXG4gICAgdGhlbWVMaWdodDogJ0NsYXJvJyxcbiAgICB0aGVtZURhcms6ICdPc2N1cm8nLFxuICAgIHRoZW1lQXV0bzogJ0F1dG8nLFxuICAgIGxhbmd1YWdlVGl0bGU6ICdJZGlvbWEnLFxuICAgIGxhbmd1YWdlSGludDogJ0lkaW9tYSBkZSBsYSBpbnRlcmZheiB5IGRlIGxvcyBjb3JyZW9zIHF1ZSByZWNpYmVzLicsXG4gICAgc2F2ZUVycm9yOiAnTm8gc2UgcHVkbyBndWFyZGFyIGxhIHByZWZlcmVuY2lhLicsXG4gIH0sXG4gIGVuOiB7XG4gICAgcGFnZVRpdGxlOiAnR2VuZXJhbCcsXG4gICAgcGFnZURlc2NyaXB0aW9uOiAnQXBwZWFyYW5jZSBhbmQgbGFuZ3VhZ2UnLFxuICAgIHRoZW1lVGl0bGU6ICdUaGVtZScsXG4gICAgdGhlbWVIaW50OiAnSG93IHRoZSBhcHAgbG9va3M6IGxpZ2h0LCBkYXJrLCBvciBtYXRjaGluZyB5b3VyIHN5c3RlbS4nLFxuICAgIHRoZW1lTGlnaHQ6ICdMaWdodCcsXG4gICAgdGhlbWVEYXJrOiAnRGFyaycsXG4gICAgdGhlbWVBdXRvOiAnQXV0bycsXG4gICAgbGFuZ3VhZ2VUaXRsZTogJ0xhbmd1YWdlJyxcbiAgICBsYW5ndWFnZUhpbnQ6ICdMYW5ndWFnZSBvZiB0aGUgaW50ZXJmYWNlIGFuZCBvZiB0aGUgZW1haWxzIHlvdSByZWNlaXZlLicsXG4gICAgc2F2ZUVycm9yOiAnQ291bGQgbm90IHNhdmUgcHJlZmVyZW5jZS4nLFxuICB9LFxufTtcbiJdfQ==
@@ -0,0 +1,29 @@
1
+ import { PreferencesViewComponent } from './preferences-view.component';
2
+ /**
3
+ * Helper para montar la vista de preferencias (`val-preferences-view`) como
4
+ * ruta en una app del factory. El `config` se pasa por route `data`
5
+ * (`preferencesConfig`) y el componente lo lee como fallback de su
6
+ * `@Input() config`.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * // settings.routes.ts
11
+ * export const settingsRoutes: Routes = [
12
+ * ...provideValtechPreferencesRoutes(),
13
+ * { path: 'profile', loadComponent: () => ... },
14
+ * ];
15
+ *
16
+ * // con config acotada:
17
+ * ...provideValtechPreferencesRoutes({ config: { showLanguage: false } }),
18
+ * ```
19
+ */
20
+ export function provideValtechPreferencesRoutes(opts) {
21
+ return [
22
+ {
23
+ path: opts?.path ?? 'preferences',
24
+ component: PreferencesViewComponent,
25
+ data: { preferencesConfig: opts?.config },
26
+ },
27
+ ];
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZmVyZW5jZXMucm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9wcmVmZXJlbmNlcy12aWV3L3ByZWZlcmVuY2VzLnJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUd4RTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsK0JBQStCLENBQUMsSUFHL0M7SUFDQyxPQUFPO1FBQ0w7WUFDRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxhQUFhO1lBQ2pDLFNBQVMsRUFBRSx3QkFBd0I7WUFDbkMsSUFBSSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtTQUMxQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91dGVzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgUHJlZmVyZW5jZXNWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi9wcmVmZXJlbmNlcy12aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQcmVmZXJlbmNlc1ZpZXdDb25maWcgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBIZWxwZXIgcGFyYSBtb250YXIgbGEgdmlzdGEgZGUgcHJlZmVyZW5jaWFzIChgdmFsLXByZWZlcmVuY2VzLXZpZXdgKSBjb21vXG4gKiBydXRhIGVuIHVuYSBhcHAgZGVsIGZhY3RvcnkuIEVsIGBjb25maWdgIHNlIHBhc2EgcG9yIHJvdXRlIGBkYXRhYFxuICogKGBwcmVmZXJlbmNlc0NvbmZpZ2ApIHkgZWwgY29tcG9uZW50ZSBsbyBsZWUgY29tbyBmYWxsYmFjayBkZSBzdVxuICogYEBJbnB1dCgpIGNvbmZpZ2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBzZXR0aW5ncy5yb3V0ZXMudHNcbiAqIGV4cG9ydCBjb25zdCBzZXR0aW5nc1JvdXRlczogUm91dGVzID0gW1xuICogICAuLi5wcm92aWRlVmFsdGVjaFByZWZlcmVuY2VzUm91dGVzKCksXG4gKiAgIHsgcGF0aDogJ3Byb2ZpbGUnLCBsb2FkQ29tcG9uZW50OiAoKSA9PiAuLi4gfSxcbiAqIF07XG4gKlxuICogLy8gY29uIGNvbmZpZyBhY290YWRhOlxuICogLi4ucHJvdmlkZVZhbHRlY2hQcmVmZXJlbmNlc1JvdXRlcyh7IGNvbmZpZzogeyBzaG93TGFuZ3VhZ2U6IGZhbHNlIH0gfSksXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVWYWx0ZWNoUHJlZmVyZW5jZXNSb3V0ZXMob3B0cz86IHtcbiAgcGF0aD86IHN0cmluZztcbiAgY29uZmlnPzogUHJlZmVyZW5jZXNWaWV3Q29uZmlnO1xufSk6IFJvdXRlcyB7XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgcGF0aDogb3B0cz8ucGF0aCA/PyAncHJlZmVyZW5jZXMnLFxuICAgICAgY29tcG9uZW50OiBQcmVmZXJlbmNlc1ZpZXdDb21wb25lbnQsXG4gICAgICBkYXRhOiB7IHByZWZlcmVuY2VzQ29uZmlnOiBvcHRzPy5jb25maWcgfSxcbiAgICB9LFxuICBdO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL3ByZWZlcmVuY2VzLXZpZXcvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFByZWZlcmVuY2VzTGFuZ3VhZ2UsXG4gIFByZWZlcmVuY2VzVGhlbWUsXG59IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ByZWZlcmVuY2VzL3ByZWZlcmVuY2VzLnR5cGVzJztcblxuLyoqXG4gKiBDb25maWd1cmFjacOzbiBhY290YWRhIGRlIGB2YWwtcHJlZmVyZW5jZXMtdmlld2AgKG9iamVjdC1maXJzdCkuIEVqZXNcbiAqIHBlcm1pdGlkb3M6XG4gKiAgLSAqKnNlY2Npb25lcyB2aXNpYmxlcyoqIOKAlCBnYXRlYW4gZWwgcmVuZGVyIGRlIGNhZGEgYDxzZWN0aW9uPmAgKHRlbWEgL1xuICogICAgaWRpb21hKS5cbiAqICAtICoqZGF0YS9icmFuZGluZyoqIOKAlCBgc3VwcG9ydGVkTGFuZ3VhZ2VzYCBwYXJhIGVsIHNlbGVjdG9yIGRlIGlkaW9tYSBlXG4gKiAgICBgaTE4bk5hbWVzcGFjZWAgcGFyYSByZXNvbHZlciBsb3MgdGV4dG9zIChkZWZhdWx0IGAnU2V0dGluZ3MuR2VuZXJhbCdgKS5cbiAqICAgIEVsIGNvbnN1bWVyIHB1ZWRlIHJlZ2lzdHJhciBlc2UgbmFtZXNwYWNlIHBhcmEgb3ZlcnJpZGUgZGUgbG9zIGRlZmF1bHRzXG4gKiAgICBlbWJlYmlkb3MuXG4gKiAgLSAqKmNhbGxiYWNrcyoqIOKAlCBob29rcyB0cmFzIHVuIGNhbWJpbyBkZSB0ZW1hIC8gaWRpb21hIGV4aXRvc28gKGFkZW3DoXMgZGVsXG4gKiAgICBlZmVjdG8gaW50ZXJubyBlbiBgUHJlZmVyZW5jZXNTZXJ2aWNlYCkuXG4gKlxuICogTk8gYWRtaXRlIHNsb3RzIGFyYml0cmFyaW9zIG5pIG92ZXJyaWRlIGRlbCBsYXlvdXQ6IGxhIHZpc3RhIGVzIGZ1bGwtZmVhdHVyZVxuICogeSBhdXRvY29udGVuaWRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZWZlcmVuY2VzVmlld0NvbmZpZyB7XG4gIC8qKiBNdWVzdHJhIGxhIHNlY2Npw7NuIGRlIHRlbWEgKHNlZ21lbnQgY2xhcm8vb3NjdXJvL2F1dG8pLiBEZWZhdWx0IGB0cnVlYC4gKi9cbiAgc2hvd1RoZW1lPzogYm9vbGVhbjtcbiAgLyoqIE11ZXN0cmEgbGEgc2VjY2nDs24gZGUgaWRpb21hIChsYW5ndWFnZSBzZWxlY3RvcikuIERlZmF1bHQgYHRydWVgLiAqL1xuICBzaG93TGFuZ3VhZ2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZGlvbWFzIG9mcmVjaWRvcyBlbiBlbCBzZWxlY3Rvci4gRGVmYXVsdCBgWydlcycsICdlbiddYC5cbiAgICovXG4gIHN1cHBvcnRlZExhbmd1YWdlcz86IFByZWZlcmVuY2VzTGFuZ3VhZ2VbXTtcblxuICAvKipcbiAgICogTmFtZXNwYWNlIGkxOG4gY29uIGVsIHF1ZSBsYSB2aXN0YSByZXN1ZWx2ZSBzdXMgdGV4dG9zLlxuICAgKiBEZWZhdWx0IGAnU2V0dGluZ3MuR2VuZXJhbCdgLlxuICAgKi9cbiAgaTE4bk5hbWVzcGFjZT86IHN0cmluZztcblxuICAvKiogQ2FsbGJhY2sgdHJhcyB1biBjYW1iaW8gZGUgdGVtYSBleGl0b3NvLiAqL1xuICBvblRoZW1lQ2hhbmdlZD86ICh0aGVtZTogUHJlZmVyZW5jZXNUaGVtZSkgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHRyYXMgdW4gY2FtYmlvIGRlIGlkaW9tYSBleGl0b3NvLiAqL1xuICBvbkxhbmd1YWdlQ2hhbmdlZD86IChsYW5nOiBQcmVmZXJlbmNlc0xhbmd1YWdlKSA9PiB2b2lkO1xufVxuIl19