valtech-components 2.0.941 → 2.0.943

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Standard cross-app site links (env-aware)
3
+ *
4
+ * En el factory MyValtech cada producto satélite (showcase, sigify, …) enlaza a
5
+ * `web` —la landing de marca— para soporte, contacto y contenido legal. `web`
6
+ * es el dueño canónico de esas rutas. Este módulo centraliza:
7
+ *
8
+ * 1. El mapa ambiente → base URL de `web` (`VALTECH_WEB_BASE_URLS`).
9
+ * 2. El catálogo de paths estándar que viven en `web` (`VALTECH_SITE_PATHS`).
10
+ *
11
+ * El ambiente se decide en BUILD TIME (campo `valtechEnv` en el `environment*.ts`
12
+ * de cada app), igual que `apiUrl`. Es el mecanismo más confiable: detectar por
13
+ * hostname en runtime se rompe con dominios custom / `web.app` / variantes de
14
+ * localhost.
15
+ *
16
+ * La resolución real (join baseUrl + path, abrir en tab nueva, `?lang=`) la hace
17
+ * `LegalLinkService`; este módulo solo le entrega el `baseUrl` correcto por env.
18
+ *
19
+ * @see provideValtechSite — wiring de una sola línea para apps satélite.
20
+ */
21
+ /**
22
+ * Base URL de `web` (landing de marca) por ambiente.
23
+ *
24
+ * - `local` → `ng serve` de `web` (puerto 8100).
25
+ * - `dev` → proyecto Firebase `myvaltech-dev`.
26
+ * - `prod` → dominio custom de producción.
27
+ *
28
+ * Sin trailing slash (lo asume `LegalLinkService`).
29
+ */
30
+ export const VALTECH_WEB_BASE_URLS = {
31
+ local: 'http://localhost:8100',
32
+ dev: 'https://myvaltech-dev.web.app',
33
+ prod: 'https://myvaltech.com',
34
+ };
35
+ /**
36
+ * Resuelve la base URL de `web` para un ambiente.
37
+ *
38
+ * Fallback a `prod` cuando el env es desconocido o falta: ante la duda, apuntar
39
+ * a producción es lo seguro (nunca enlaza a un host local/dev inexistente).
40
+ */
41
+ export function resolveWebBaseUrl(env) {
42
+ if (env && env in VALTECH_WEB_BASE_URLS) {
43
+ return VALTECH_WEB_BASE_URLS[env];
44
+ }
45
+ return VALTECH_WEB_BASE_URLS.prod;
46
+ }
47
+ /**
48
+ * Catálogo de paths estándar que viven en `web`. Las apps resuelven estos
49
+ * contra la base URL del ambiente vía `LegalLinkService.resolve(path)`.
50
+ *
51
+ * Mantener alineado con las rutas reales de `web/src/app/app.routes.ts` y con
52
+ * `VALTECH_COMPANY_LINKS` (footer).
53
+ */
54
+ export const VALTECH_SITE_PATHS = {
55
+ home: '/',
56
+ support: '/contact',
57
+ contact: '/contact',
58
+ faq: '/faq',
59
+ about: '/legal/about',
60
+ terms: '/legal/terms',
61
+ privacy: '/legal/privacy',
62
+ cookies: '/legal/cookies',
63
+ legalNotice: '/legal/legal-notice',
64
+ };
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2l0ZS1saW5rcy5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbmZpZy9zaXRlLWxpbmtzLmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUtIOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQStCO0lBQy9ELEtBQUssRUFBRSx1QkFBdUI7SUFDOUIsR0FBRyxFQUFFLCtCQUErQjtJQUNwQyxJQUFJLEVBQUUsdUJBQXVCO0NBQzlCLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxHQUFnQztJQUNoRSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztRQUN4QyxPQUFPLHFCQUFxQixDQUFDLEdBQWlCLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsT0FBTyxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7QUFDcEMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2hDLElBQUksRUFBRSxHQUFHO0lBQ1QsT0FBTyxFQUFFLFVBQVU7SUFDbkIsT0FBTyxFQUFFLFVBQVU7SUFDbkIsR0FBRyxFQUFFLE1BQU07SUFDWCxLQUFLLEVBQUUsY0FBYztJQUNyQixLQUFLLEVBQUUsY0FBYztJQUNyQixPQUFPLEVBQUUsZ0JBQWdCO0lBQ3pCLE9BQU8sRUFBRSxnQkFBZ0I7SUFDekIsV0FBVyxFQUFFLHFCQUFxQjtDQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFuZGFyZCBjcm9zcy1hcHAgc2l0ZSBsaW5rcyAoZW52LWF3YXJlKVxuICpcbiAqIEVuIGVsIGZhY3RvcnkgTXlWYWx0ZWNoIGNhZGEgcHJvZHVjdG8gc2F0w6lsaXRlIChzaG93Y2FzZSwgc2lnaWZ5LCDigKYpIGVubGF6YSBhXG4gKiBgd2ViYCDigJRsYSBsYW5kaW5nIGRlIG1hcmNh4oCUIHBhcmEgc29wb3J0ZSwgY29udGFjdG8geSBjb250ZW5pZG8gbGVnYWwuIGB3ZWJgXG4gKiBlcyBlbCBkdWXDsW8gY2Fuw7NuaWNvIGRlIGVzYXMgcnV0YXMuIEVzdGUgbcOzZHVsbyBjZW50cmFsaXphOlxuICpcbiAqICAxLiBFbCBtYXBhIGFtYmllbnRlIOKGkiBiYXNlIFVSTCBkZSBgd2ViYCAoYFZBTFRFQ0hfV0VCX0JBU0VfVVJMU2ApLlxuICogIDIuIEVsIGNhdMOhbG9nbyBkZSBwYXRocyBlc3TDoW5kYXIgcXVlIHZpdmVuIGVuIGB3ZWJgIChgVkFMVEVDSF9TSVRFX1BBVEhTYCkuXG4gKlxuICogRWwgYW1iaWVudGUgc2UgZGVjaWRlIGVuIEJVSUxEIFRJTUUgKGNhbXBvIGB2YWx0ZWNoRW52YCBlbiBlbCBgZW52aXJvbm1lbnQqLnRzYFxuICogZGUgY2FkYSBhcHApLCBpZ3VhbCBxdWUgYGFwaVVybGAuIEVzIGVsIG1lY2FuaXNtbyBtw6FzIGNvbmZpYWJsZTogZGV0ZWN0YXIgcG9yXG4gKiBob3N0bmFtZSBlbiBydW50aW1lIHNlIHJvbXBlIGNvbiBkb21pbmlvcyBjdXN0b20gLyBgd2ViLmFwcGAgLyB2YXJpYW50ZXMgZGVcbiAqIGxvY2FsaG9zdC5cbiAqXG4gKiBMYSByZXNvbHVjacOzbiByZWFsIChqb2luIGJhc2VVcmwgKyBwYXRoLCBhYnJpciBlbiB0YWIgbnVldmEsIGA/bGFuZz1gKSBsYSBoYWNlXG4gKiBgTGVnYWxMaW5rU2VydmljZWA7IGVzdGUgbcOzZHVsbyBzb2xvIGxlIGVudHJlZ2EgZWwgYGJhc2VVcmxgIGNvcnJlY3RvIHBvciBlbnYuXG4gKlxuICogQHNlZSBwcm92aWRlVmFsdGVjaFNpdGUg4oCUIHdpcmluZyBkZSB1bmEgc29sYSBsw61uZWEgcGFyYSBhcHBzIHNhdMOpbGl0ZS5cbiAqL1xuXG4vKiogQW1iaWVudGVzIGRlbCBmYWN0b3J5LiBDb2luY2lkZSBjb24gbG9zIGBlbnZpcm9ubWVudCoudHNgIGRlIGNhZGEgYXBwLiAqL1xuZXhwb3J0IHR5cGUgVmFsdGVjaEVudiA9ICdsb2NhbCcgfCAnZGV2JyB8ICdwcm9kJztcblxuLyoqXG4gKiBCYXNlIFVSTCBkZSBgd2ViYCAobGFuZGluZyBkZSBtYXJjYSkgcG9yIGFtYmllbnRlLlxuICpcbiAqIC0gYGxvY2FsYCDihpIgYG5nIHNlcnZlYCBkZSBgd2ViYCAocHVlcnRvIDgxMDApLlxuICogLSBgZGV2YCAgIOKGkiBwcm95ZWN0byBGaXJlYmFzZSBgbXl2YWx0ZWNoLWRldmAuXG4gKiAtIGBwcm9kYCAg4oaSIGRvbWluaW8gY3VzdG9tIGRlIHByb2R1Y2Npw7NuLlxuICpcbiAqIFNpbiB0cmFpbGluZyBzbGFzaCAobG8gYXN1bWUgYExlZ2FsTGlua1NlcnZpY2VgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBTFRFQ0hfV0VCX0JBU0VfVVJMUzogUmVjb3JkPFZhbHRlY2hFbnYsIHN0cmluZz4gPSB7XG4gIGxvY2FsOiAnaHR0cDovL2xvY2FsaG9zdDo4MTAwJyxcbiAgZGV2OiAnaHR0cHM6Ly9teXZhbHRlY2gtZGV2LndlYi5hcHAnLFxuICBwcm9kOiAnaHR0cHM6Ly9teXZhbHRlY2guY29tJyxcbn07XG5cbi8qKlxuICogUmVzdWVsdmUgbGEgYmFzZSBVUkwgZGUgYHdlYmAgcGFyYSB1biBhbWJpZW50ZS5cbiAqXG4gKiBGYWxsYmFjayBhIGBwcm9kYCBjdWFuZG8gZWwgZW52IGVzIGRlc2Nvbm9jaWRvIG8gZmFsdGE6IGFudGUgbGEgZHVkYSwgYXB1bnRhclxuICogYSBwcm9kdWNjacOzbiBlcyBsbyBzZWd1cm8gKG51bmNhIGVubGF6YSBhIHVuIGhvc3QgbG9jYWwvZGV2IGluZXhpc3RlbnRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVXZWJCYXNlVXJsKGVudj86IFZhbHRlY2hFbnYgfCBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKGVudiAmJiBlbnYgaW4gVkFMVEVDSF9XRUJfQkFTRV9VUkxTKSB7XG4gICAgcmV0dXJuIFZBTFRFQ0hfV0VCX0JBU0VfVVJMU1tlbnYgYXMgVmFsdGVjaEVudl07XG4gIH1cbiAgcmV0dXJuIFZBTFRFQ0hfV0VCX0JBU0VfVVJMUy5wcm9kO1xufVxuXG4vKipcbiAqIENhdMOhbG9nbyBkZSBwYXRocyBlc3TDoW5kYXIgcXVlIHZpdmVuIGVuIGB3ZWJgLiBMYXMgYXBwcyByZXN1ZWx2ZW4gZXN0b3NcbiAqIGNvbnRyYSBsYSBiYXNlIFVSTCBkZWwgYW1iaWVudGUgdsOtYSBgTGVnYWxMaW5rU2VydmljZS5yZXNvbHZlKHBhdGgpYC5cbiAqXG4gKiBNYW50ZW5lciBhbGluZWFkbyBjb24gbGFzIHJ1dGFzIHJlYWxlcyBkZSBgd2ViL3NyYy9hcHAvYXBwLnJvdXRlcy50c2AgeSBjb25cbiAqIGBWQUxURUNIX0NPTVBBTllfTElOS1NgIChmb290ZXIpLlxuICovXG5leHBvcnQgY29uc3QgVkFMVEVDSF9TSVRFX1BBVEhTID0ge1xuICBob21lOiAnLycsXG4gIHN1cHBvcnQ6ICcvY29udGFjdCcsXG4gIGNvbnRhY3Q6ICcvY29udGFjdCcsXG4gIGZhcTogJy9mYXEnLFxuICBhYm91dDogJy9sZWdhbC9hYm91dCcsXG4gIHRlcm1zOiAnL2xlZ2FsL3Rlcm1zJyxcbiAgcHJpdmFjeTogJy9sZWdhbC9wcml2YWN5JyxcbiAgY29va2llczogJy9sZWdhbC9jb29raWVzJyxcbiAgbGVnYWxOb3RpY2U6ICcvbGVnYWwvbGVnYWwtbm90aWNlJyxcbn0gYXMgY29uc3Q7XG5cbi8qKiBDbGF2ZSBkZSB1biBsaW5rIGVzdMOhbmRhciBkZWwgc2l0aW8gKGAnaG9tZScgfCAnc3VwcG9ydCcgfCDigKZgKS4gKi9cbmV4cG9ydCB0eXBlIFZhbHRlY2hTaXRlUGF0aEtleSA9IGtleW9mIHR5cGVvZiBWQUxURUNIX1NJVEVfUEFUSFM7XG4iXX0=
@@ -1,4 +1,5 @@
1
1
  import { InjectionToken, Injectable, inject } from '@angular/core';
2
+ import { resolveWebBaseUrl } from '../../config/site-links.config';
2
3
  import * as i0 from "@angular/core";
3
4
  export const VALTECH_LEGAL_CONFIG = new InjectionToken('VALTECH_LEGAL_CONFIG');
4
5
  /**
@@ -82,4 +83,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
82
83
  export function provideValtechLegal(config) {
83
84
  return { provide: VALTECH_LEGAL_CONFIG, useValue: config };
84
85
  }
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnYWwtbGluay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9sZWdhbC1saW5rL2xlZ2FsLWxpbmsuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBWSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBcUI3RSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLGNBQWMsQ0FBcUIsc0JBQXNCLENBQUMsQ0FBQztBQUVuRzs7Ozs7OztHQU9HO0FBRUgsTUFBTSxPQUFPLGdCQUFnQjtJQUQ3QjtRQUVtQixXQUFNLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0tBaURsRjtJQS9DQyx5REFBeUQ7SUFDekQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUN6RCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQkc7SUFDSCxPQUFPLENBQUMsSUFBWSxFQUFFLE9BQTZCO1FBQ2pELElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN2QixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUMvRCxJQUFJLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNwQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMxQyxPQUFPLEdBQUcsR0FBRyxHQUFHLEdBQUcsUUFBUSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLFVBQVUsQ0FBQyxJQUFZO1FBQ3JCLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDO0lBQy9CLENBQUM7K0dBakRVLGdCQUFnQjttSEFBaEIsZ0JBQWdCLGNBREgsTUFBTTs7NEZBQ25CLGdCQUFnQjtrQkFENUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7O0FBcURsQzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQTBCO0lBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0YWJsZSwgUHJvdmlkZXIsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIENvbmZpZyBmb3IgY3Jvc3MtYXBwIGxlZ2FsL3NpdGUgbGluayByZXNvbHV0aW9uLlxuICpcbiAqIFVzZWQgYnkgc2F0ZWxsaXRlIGFwcHMgKHNob3djYXNlLCBzaWdpZnksIGFkbWluLXBvcnRhbCwg4oCmKSB0byBwb2ludCB0aGVpciBsZWdhbFxuICogYW5kIHNpdGUgbGlua3MgKHRlcm1zLCBwcml2YWN5LCBhYm91dCwgY29udGFjdCwg4oCmKSB0byB0aGUgbWFpbiBtYXJrZXRpbmcgc2l0ZSxcbiAqIHdoaWNoIG93bnMgdGhlIGNhbm9uaWNhbCBsZWdhbCBjb250ZW50LiBUaGUgbWFpbiBzaXRlIGl0c2VsZiBkb2VzIE5PVCBjYWxsXG4gKiBgcHJvdmlkZVZhbHRlY2hMZWdhbGAg4oCUIGl0cyBsaW5rcyBzdGF5IHJlbGF0aXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbHRlY2hMZWdhbENvbmZpZyB7XG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBiYXNlIFVSTCBvZiB0aGUgbWFpbiBzaXRlIChubyB0cmFpbGluZyBzbGFzaCkuXG4gICAqIEBleGFtcGxlICdodHRwczovL215dmFsdGVjaC5jb20nXG4gICAqL1xuICBiYXNlVXJsPzogc3RyaW5nO1xuXG4gIC8qKiBPcGVuIHJlc29sdmVkIGV4dGVybmFsIGxpbmtzIGluIGEgbmV3IHRhYi4gRGVmYXVsdHMgdG8gYHRydWVgIHdoZW4gYGJhc2VVcmxgIGlzIHNldC4gKi9cbiAgb3BlbkluTmV3VGFiPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IFZBTFRFQ0hfTEVHQUxfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFZhbHRlY2hMZWdhbENvbmZpZz4oJ1ZBTFRFQ0hfTEVHQUxfQ09ORklHJyk7XG5cbi8qKlxuICogUmVzb2x2ZXMgbGVnYWwvc2l0ZSBwYXRocyBhZ2FpbnN0IGEgY29uZmlndXJhYmxlIG1haW4tc2l0ZSBiYXNlIFVSTC5cbiAqXG4gKiAtICoqTWFpbiBzaXRlIG1vZGUqKjogbm8gYHByb3ZpZGVWYWx0ZWNoTGVnYWxgIGNhbGxlZCDihpIgYHJlc29sdmUoJy9sZWdhbC90ZXJtcycpYCByZXR1cm5zIGAvbGVnYWwvdGVybXNgIChyZWxhdGl2ZSkuXG4gKiAtICoqU2F0ZWxsaXRlIG1vZGUqKjogYHByb3ZpZGVWYWx0ZWNoTGVnYWwoeyBiYXNlVXJsOiAnaHR0cHM6Ly9teXZhbHRlY2guY29tJyB9KWAg4oaSIGByZXNvbHZlKCcvbGVnYWwvdGVybXMnKWAgcmV0dXJucyBgJ2h0dHBzOi8vbXl2YWx0ZWNoLmNvbS9sZWdhbC90ZXJtcydgIGFuZCBgaXNFeHRlcm5hbCgnL2xlZ2FsL3Rlcm1zJylgIHJldHVybnMgYHRydWVgLlxuICpcbiAqIEFic29sdXRlIFVSTHMgcGFzc2VkIGluIGFyZSByZXR1cm5lZCB1bmNoYW5nZWQgKG5vIGRvdWJsZS1wcmVmaXgpLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIExlZ2FsTGlua1NlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZyA9IGluamVjdChWQUxURUNIX0xFR0FMX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyB7fTtcblxuICAvKiogRWZmZWN0aXZlIGJhc2UgVVJMIChudWxsIGlmIHJ1bm5pbmcgYXMgbWFpbiBzaXRlKS4gKi9cbiAgZ2V0IGJhc2VVcmwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmJhc2VVcmw/LnJlcGxhY2UoL1xcLyQvLCAnJykgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHJlc29sdmVkIGV4dGVybmFsIGxpbmtzIHNob3VsZCBvcGVuIGluIGEgbmV3IHRhYi4gKi9cbiAgZ2V0IG9wZW5Jbk5ld1RhYigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcub3BlbkluTmV3VGFiID8/IEJvb2xlYW4odGhpcy5jb25maWcuYmFzZVVybCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgVVJMIHRvIHVzZSBmb3IgYSBnaXZlbiBpbnRlcm5hbCBwYXRoLiBBYnNvbHV0ZSBVUkxzIHBhc3MgdGhyb3VnaC5cbiAgICpcbiAgICogV2hlbiBgbG9jYWxlYCBpcyBwcm92aWRlZCBBTkQgdGhlIHJlc29sdmVkIFVSTCB3b3VsZCBiZSBjcm9zcy1vcmlnaW4sIGFwcGVuZHNcbiAgICogYD9sYW5nPXtsb2NhbGV9YCBzbyB0aGUgbWFpbiBzaXRlIGNhbiByZW5kZXIgdGhlIGxlZ2FsIGRvYyBpbiB0aGUgdXNlcidzXG4gICAqIGFjdGl2ZSBsYW5ndWFnZSAoaW5zdGVhZCBvZiBpdHMgZGVmYXVsdCkuIExvY2FsZSBpcyBvbWl0dGVkIGZvciBzYW1lLW9yaWdpblxuICAgKiByZXNvbHZlcyBzaW5jZSB0aGUgbWFpbiBzaXRlIHJlYWRzIGxvY2FsZSBmcm9tIGl0cyBvd24gYExvY2FsZVNlcnZpY2VgLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiByZXNvbHZlKCcvbGVnYWwvdGVybXMnKVxuICAgKiAgIC8vIG1haW4gc2l0ZTogICcvbGVnYWwvdGVybXMnXG4gICAqICAgLy8gc2F0ZWxsaXRlOiAgJ2h0dHBzOi8vbXl2YWx0ZWNoLmNvbS9sZWdhbC90ZXJtcydcbiAgICpcbiAgICogcmVzb2x2ZSgnL2xlZ2FsL3Rlcm1zJywgeyBsb2NhbGU6ICdwdCcgfSlcbiAgICogICAvLyBtYWluIHNpdGU6ICAnL2xlZ2FsL3Rlcm1zJyAgKGxvY2FsZSBzdGF5cyBpbXBsaWNpdClcbiAgICogICAvLyBzYXRlbGxpdGU6ICAnaHR0cHM6Ly9teXZhbHRlY2guY29tL2xlZ2FsL3Rlcm1zP2xhbmc9cHQnXG4gICAqXG4gICAqIHJlc29sdmUoJ2h0dHBzOi8veC5jb20veScpIC8vIHVuY2hhbmdlZFxuICAgKi9cbiAgcmVzb2x2ZShwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGxvY2FsZT86IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgICBpZiAoIXBhdGgpIHJldHVybiBwYXRoO1xuICAgIGlmICgvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHBhdGgpKSByZXR1cm4gcGF0aDtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5iYXNlVXJsO1xuICAgIGlmICghYmFzZSkgcmV0dXJuIHBhdGg7XG4gICAgY29uc3QgdXJsID0gYCR7YmFzZX0ke3BhdGguc3RhcnRzV2l0aCgnLycpID8gJycgOiAnLyd9JHtwYXRofWA7XG4gICAgaWYgKG9wdGlvbnM/LmxvY2FsZSkge1xuICAgICAgY29uc3Qgc2VwID0gdXJsLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyc7XG4gICAgICByZXR1cm4gYCR7dXJsfSR7c2VwfWxhbmc9JHtlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5sb2NhbGUpfWA7XG4gICAgfVxuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICAvKiogYHRydWVgIGlmIHRoZSBwYXRoIHdvdWxkIGJlIHJlc29sdmVkIHRvIGEgY3Jvc3Mtb3JpZ2luIFVSTC4gKi9cbiAgaXNFeHRlcm5hbChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoL15odHRwcz86XFwvXFwvL2kudGVzdChwYXRoKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIHRoaXMuYmFzZVVybCAhPT0gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFdpcmVzIGBMZWdhbExpbmtTZXJ2aWNlYCBmb3Igc2F0ZWxsaXRlIGFwcHMuIE9taXQgaW4gdGhlIG1haW4gc2l0ZSAodGhlIG9uZVxuICogdGhhdCBob3N0cyB0aGUgY2Fub25pY2FsIC9sZWdhbC8qIHJvdXRlcykgc28gbGlua3Mgc3RheSByZWxhdGl2ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gbWFpbi50cyBvZiBzaG93Y2FzZSAvIHNpZ2lmeSAvIGV0Yy5cbiAqIHByb3ZpZGVWYWx0ZWNoTGVnYWwoe1xuICogICBiYXNlVXJsOiAnaHR0cHM6Ly9teXZhbHRlY2guY29tJyxcbiAqICAgb3BlbkluTmV3VGFiOiB0cnVlLFxuICogfSksXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlVmFsdGVjaExlZ2FsKGNvbmZpZzogVmFsdGVjaExlZ2FsQ29uZmlnKTogUHJvdmlkZXIge1xuICByZXR1cm4geyBwcm92aWRlOiBWQUxURUNIX0xFR0FMX0NPTkZJRywgdXNlVmFsdWU6IGNvbmZpZyB9O1xufVxuIl19
86
+ /**
87
+ * Wiring de una sola línea para que una app satélite apunte sus links de sitio
88
+ * (legal, soporte, contacto, …) a `web` —la landing de marca— en el ambiente
89
+ * correcto. Resuelve el `baseUrl` desde `VALTECH_WEB_BASE_URLS` según el `env`
90
+ * baked en build-time (`environment.valtechEnv`) y delega en `provideValtechLegal`.
91
+ *
92
+ * Ambiente desconocido/ausente → fallback a `prod` (ver `resolveWebBaseUrl`).
93
+ * El main site (`web`) NO llama esto — sus links quedan relativos.
94
+ *
95
+ * @example
96
+ * // main.ts de showcase / sigify / …
97
+ * import { environment } from './environments/environment';
98
+ * provideValtechSite(environment.valtechEnv), // 'local' | 'dev' | 'prod'
99
+ *
100
+ * @see resolveWebBaseUrl
101
+ * @see VALTECH_SITE_PATHS — catálogo de paths estándar que viven en `web`.
102
+ */
103
+ export function provideValtechSite(env, options) {
104
+ return provideValtechLegal({
105
+ baseUrl: resolveWebBaseUrl(env),
106
+ openInNewTab: options?.openInNewTab ?? true,
107
+ });
108
+ }
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnYWwtbGluay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9sZWdhbC1saW5rL2xlZ2FsLWxpbmsuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBWSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFjLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBcUIvRSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLGNBQWMsQ0FBcUIsc0JBQXNCLENBQUMsQ0FBQztBQUVuRzs7Ozs7OztHQU9HO0FBRUgsTUFBTSxPQUFPLGdCQUFnQjtJQUQ3QjtRQUVtQixXQUFNLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO0tBaURsRjtJQS9DQyx5REFBeUQ7SUFDekQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUN6RCxDQUFDO0lBRUQsZ0VBQWdFO0lBQ2hFLElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQkc7SUFDSCxPQUFPLENBQUMsSUFBWSxFQUFFLE9BQTZCO1FBQ2pELElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN2QixNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUMvRCxJQUFJLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUNwQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMxQyxPQUFPLEdBQUcsR0FBRyxHQUFHLEdBQUcsUUFBUSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsa0VBQWtFO0lBQ2xFLFVBQVUsQ0FBQyxJQUFZO1FBQ3JCLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDO0lBQy9CLENBQUM7K0dBakRVLGdCQUFnQjttSEFBaEIsZ0JBQWdCLGNBREgsTUFBTTs7NEZBQ25CLGdCQUFnQjtrQkFENUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7O0FBcURsQzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQTBCO0lBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQzdELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsR0FBZ0MsRUFDaEMsT0FBb0M7SUFFcEMsT0FBTyxtQkFBbUIsQ0FBQztRQUN6QixPQUFPLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxDQUFDO1FBQy9CLFlBQVksRUFBRSxPQUFPLEVBQUUsWUFBWSxJQUFJLElBQUk7S0FDNUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuLCBJbmplY3RhYmxlLCBQcm92aWRlciwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWYWx0ZWNoRW52LCByZXNvbHZlV2ViQmFzZVVybCB9IGZyb20gJy4uLy4uL2NvbmZpZy9zaXRlLWxpbmtzLmNvbmZpZyc7XG5cbi8qKlxuICogQ29uZmlnIGZvciBjcm9zcy1hcHAgbGVnYWwvc2l0ZSBsaW5rIHJlc29sdXRpb24uXG4gKlxuICogVXNlZCBieSBzYXRlbGxpdGUgYXBwcyAoc2hvd2Nhc2UsIHNpZ2lmeSwgYWRtaW4tcG9ydGFsLCDigKYpIHRvIHBvaW50IHRoZWlyIGxlZ2FsXG4gKiBhbmQgc2l0ZSBsaW5rcyAodGVybXMsIHByaXZhY3ksIGFib3V0LCBjb250YWN0LCDigKYpIHRvIHRoZSBtYWluIG1hcmtldGluZyBzaXRlLFxuICogd2hpY2ggb3ducyB0aGUgY2Fub25pY2FsIGxlZ2FsIGNvbnRlbnQuIFRoZSBtYWluIHNpdGUgaXRzZWxmIGRvZXMgTk9UIGNhbGxcbiAqIGBwcm92aWRlVmFsdGVjaExlZ2FsYCDigJQgaXRzIGxpbmtzIHN0YXkgcmVsYXRpdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdGVjaExlZ2FsQ29uZmlnIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIGJhc2UgVVJMIG9mIHRoZSBtYWluIHNpdGUgKG5vIHRyYWlsaW5nIHNsYXNoKS5cbiAgICogQGV4YW1wbGUgJ2h0dHBzOi8vbXl2YWx0ZWNoLmNvbSdcbiAgICovXG4gIGJhc2VVcmw/OiBzdHJpbmc7XG5cbiAgLyoqIE9wZW4gcmVzb2x2ZWQgZXh0ZXJuYWwgbGlua3MgaW4gYSBuZXcgdGFiLiBEZWZhdWx0cyB0byBgdHJ1ZWAgd2hlbiBgYmFzZVVybGAgaXMgc2V0LiAqL1xuICBvcGVuSW5OZXdUYWI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgVkFMVEVDSF9MRUdBTF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48VmFsdGVjaExlZ2FsQ29uZmlnPignVkFMVEVDSF9MRUdBTF9DT05GSUcnKTtcblxuLyoqXG4gKiBSZXNvbHZlcyBsZWdhbC9zaXRlIHBhdGhzIGFnYWluc3QgYSBjb25maWd1cmFibGUgbWFpbi1zaXRlIGJhc2UgVVJMLlxuICpcbiAqIC0gKipNYWluIHNpdGUgbW9kZSoqOiBubyBgcHJvdmlkZVZhbHRlY2hMZWdhbGAgY2FsbGVkIOKGkiBgcmVzb2x2ZSgnL2xlZ2FsL3Rlcm1zJylgIHJldHVybnMgYC9sZWdhbC90ZXJtc2AgKHJlbGF0aXZlKS5cbiAqIC0gKipTYXRlbGxpdGUgbW9kZSoqOiBgcHJvdmlkZVZhbHRlY2hMZWdhbCh7IGJhc2VVcmw6ICdodHRwczovL215dmFsdGVjaC5jb20nIH0pYCDihpIgYHJlc29sdmUoJy9sZWdhbC90ZXJtcycpYCByZXR1cm5zIGAnaHR0cHM6Ly9teXZhbHRlY2guY29tL2xlZ2FsL3Rlcm1zJ2AgYW5kIGBpc0V4dGVybmFsKCcvbGVnYWwvdGVybXMnKWAgcmV0dXJucyBgdHJ1ZWAuXG4gKlxuICogQWJzb2x1dGUgVVJMcyBwYXNzZWQgaW4gYXJlIHJldHVybmVkIHVuY2hhbmdlZCAobm8gZG91YmxlLXByZWZpeCkuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTGVnYWxMaW5rU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnID0gaW5qZWN0KFZBTFRFQ0hfTEVHQUxfQ09ORklHLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IHt9O1xuXG4gIC8qKiBFZmZlY3RpdmUgYmFzZSBVUkwgKG51bGwgaWYgcnVubmluZyBhcyBtYWluIHNpdGUpLiAqL1xuICBnZXQgYmFzZVVybCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYmFzZVVybD8ucmVwbGFjZSgvXFwvJC8sICcnKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgcmVzb2x2ZWQgZXh0ZXJuYWwgbGlua3Mgc2hvdWxkIG9wZW4gaW4gYSBuZXcgdGFiLiAqL1xuICBnZXQgb3BlbkluTmV3VGFiKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5vcGVuSW5OZXdUYWIgPz8gQm9vbGVhbih0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBVUkwgdG8gdXNlIGZvciBhIGdpdmVuIGludGVybmFsIHBhdGguIEFic29sdXRlIFVSTHMgcGFzcyB0aHJvdWdoLlxuICAgKlxuICAgKiBXaGVuIGBsb2NhbGVgIGlzIHByb3ZpZGVkIEFORCB0aGUgcmVzb2x2ZWQgVVJMIHdvdWxkIGJlIGNyb3NzLW9yaWdpbiwgYXBwZW5kc1xuICAgKiBgP2xhbmc9e2xvY2FsZX1gIHNvIHRoZSBtYWluIHNpdGUgY2FuIHJlbmRlciB0aGUgbGVnYWwgZG9jIGluIHRoZSB1c2VyJ3NcbiAgICogYWN0aXZlIGxhbmd1YWdlIChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0KS4gTG9jYWxlIGlzIG9taXR0ZWQgZm9yIHNhbWUtb3JpZ2luXG4gICAqIHJlc29sdmVzIHNpbmNlIHRoZSBtYWluIHNpdGUgcmVhZHMgbG9jYWxlIGZyb20gaXRzIG93biBgTG9jYWxlU2VydmljZWAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHJlc29sdmUoJy9sZWdhbC90ZXJtcycpXG4gICAqICAgLy8gbWFpbiBzaXRlOiAgJy9sZWdhbC90ZXJtcydcbiAgICogICAvLyBzYXRlbGxpdGU6ICAnaHR0cHM6Ly9teXZhbHRlY2guY29tL2xlZ2FsL3Rlcm1zJ1xuICAgKlxuICAgKiByZXNvbHZlKCcvbGVnYWwvdGVybXMnLCB7IGxvY2FsZTogJ3B0JyB9KVxuICAgKiAgIC8vIG1haW4gc2l0ZTogICcvbGVnYWwvdGVybXMnICAobG9jYWxlIHN0YXlzIGltcGxpY2l0KVxuICAgKiAgIC8vIHNhdGVsbGl0ZTogICdodHRwczovL215dmFsdGVjaC5jb20vbGVnYWwvdGVybXM/bGFuZz1wdCdcbiAgICpcbiAgICogcmVzb2x2ZSgnaHR0cHM6Ly94LmNvbS95JykgLy8gdW5jaGFuZ2VkXG4gICAqL1xuICByZXNvbHZlKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgbG9jYWxlPzogc3RyaW5nIH0pOiBzdHJpbmcge1xuICAgIGlmICghcGF0aCkgcmV0dXJuIHBhdGg7XG4gICAgaWYgKC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QocGF0aCkpIHJldHVybiBwYXRoO1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmJhc2VVcmw7XG4gICAgaWYgKCFiYXNlKSByZXR1cm4gcGF0aDtcbiAgICBjb25zdCB1cmwgPSBgJHtiYXNlfSR7cGF0aC5zdGFydHNXaXRoKCcvJykgPyAnJyA6ICcvJ30ke3BhdGh9YDtcbiAgICBpZiAob3B0aW9ucz8ubG9jYWxlKSB7XG4gICAgICBjb25zdCBzZXAgPSB1cmwuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JztcbiAgICAgIHJldHVybiBgJHt1cmx9JHtzZXB9bGFuZz0ke2VuY29kZVVSSUNvbXBvbmVudChvcHRpb25zLmxvY2FsZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuXG4gIC8qKiBgdHJ1ZWAgaWYgdGhlIHBhdGggd291bGQgYmUgcmVzb2x2ZWQgdG8gYSBjcm9zcy1vcmlnaW4gVVJMLiAqL1xuICBpc0V4dGVybmFsKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICgvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHBhdGgpKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5iYXNlVXJsICE9PSBudWxsO1xuICB9XG59XG5cbi8qKlxuICogV2lyZXMgYExlZ2FsTGlua1NlcnZpY2VgIGZvciBzYXRlbGxpdGUgYXBwcy4gT21pdCBpbiB0aGUgbWFpbiBzaXRlICh0aGUgb25lXG4gKiB0aGF0IGhvc3RzIHRoZSBjYW5vbmljYWwgL2xlZ2FsLyogcm91dGVzKSBzbyBsaW5rcyBzdGF5IHJlbGF0aXZlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBtYWluLnRzIG9mIHNob3djYXNlIC8gc2lnaWZ5IC8gZXRjLlxuICogcHJvdmlkZVZhbHRlY2hMZWdhbCh7XG4gKiAgIGJhc2VVcmw6ICdodHRwczovL215dmFsdGVjaC5jb20nLFxuICogICBvcGVuSW5OZXdUYWI6IHRydWUsXG4gKiB9KSxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVWYWx0ZWNoTGVnYWwoY29uZmlnOiBWYWx0ZWNoTGVnYWxDb25maWcpOiBQcm92aWRlciB7XG4gIHJldHVybiB7IHByb3ZpZGU6IFZBTFRFQ0hfTEVHQUxfQ09ORklHLCB1c2VWYWx1ZTogY29uZmlnIH07XG59XG5cbi8qKlxuICogV2lyaW5nIGRlIHVuYSBzb2xhIGzDrW5lYSBwYXJhIHF1ZSB1bmEgYXBwIHNhdMOpbGl0ZSBhcHVudGUgc3VzIGxpbmtzIGRlIHNpdGlvXG4gKiAobGVnYWwsIHNvcG9ydGUsIGNvbnRhY3RvLCDigKYpIGEgYHdlYmAg4oCUbGEgbGFuZGluZyBkZSBtYXJjYeKAlCBlbiBlbCBhbWJpZW50ZVxuICogY29ycmVjdG8uIFJlc3VlbHZlIGVsIGBiYXNlVXJsYCBkZXNkZSBgVkFMVEVDSF9XRUJfQkFTRV9VUkxTYCBzZWfDum4gZWwgYGVudmBcbiAqIGJha2VkIGVuIGJ1aWxkLXRpbWUgKGBlbnZpcm9ubWVudC52YWx0ZWNoRW52YCkgeSBkZWxlZ2EgZW4gYHByb3ZpZGVWYWx0ZWNoTGVnYWxgLlxuICpcbiAqIEFtYmllbnRlIGRlc2Nvbm9jaWRvL2F1c2VudGUg4oaSIGZhbGxiYWNrIGEgYHByb2RgICh2ZXIgYHJlc29sdmVXZWJCYXNlVXJsYCkuXG4gKiBFbCBtYWluIHNpdGUgKGB3ZWJgKSBOTyBsbGFtYSBlc3RvIOKAlCBzdXMgbGlua3MgcXVlZGFuIHJlbGF0aXZvcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gbWFpbi50cyBkZSBzaG93Y2FzZSAvIHNpZ2lmeSAvIOKAplxuICogaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG4gKiBwcm92aWRlVmFsdGVjaFNpdGUoZW52aXJvbm1lbnQudmFsdGVjaEVudiksICAvLyAnbG9jYWwnIHwgJ2RldicgfCAncHJvZCdcbiAqXG4gKiBAc2VlIHJlc29sdmVXZWJCYXNlVXJsXG4gKiBAc2VlIFZBTFRFQ0hfU0lURV9QQVRIUyDigJQgY2F0w6Fsb2dvIGRlIHBhdGhzIGVzdMOhbmRhciBxdWUgdml2ZW4gZW4gYHdlYmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlVmFsdGVjaFNpdGUoXG4gIGVudj86IFZhbHRlY2hFbnYgfCBzdHJpbmcgfCBudWxsLFxuICBvcHRpb25zPzogeyBvcGVuSW5OZXdUYWI/OiBib29sZWFuIH1cbik6IFByb3ZpZGVyIHtcbiAgcmV0dXJuIHByb3ZpZGVWYWx0ZWNoTGVnYWwoe1xuICAgIGJhc2VVcmw6IHJlc29sdmVXZWJCYXNlVXJsKGVudiksXG4gICAgb3BlbkluTmV3VGFiOiBvcHRpb25zPy5vcGVuSW5OZXdUYWIgPz8gdHJ1ZSxcbiAgfSk7XG59XG4iXX0=
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '2.0.941';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC45NDEnO1xuIl19
5
+ export const VERSION = '2.0.943';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzIuMC45NDMnO1xuIl19
@@ -54,7 +54,7 @@ import 'prismjs/components/prism-json';
54
54
  * Current version of valtech-components.
55
55
  * This is automatically updated during the publish process.
56
56
  */
57
- const VERSION = '2.0.941';
57
+ const VERSION = '2.0.943';
58
58
 
59
59
  // Control de estado de refresco (singleton a nivel de módulo)
60
60
  let isRefreshing = false;
@@ -10006,6 +10006,7 @@ var InputType;
10006
10006
  InputType[InputType["CURRENCY"] = 21] = "CURRENCY";
10007
10007
  InputType[InputType["CHECKBOX_RADIO"] = 22] = "CHECKBOX_RADIO";
10008
10008
  InputType[InputType["HANDLE"] = 23] = "HANDLE";
10009
+ InputType[InputType["ATTACHMENT"] = 24] = "ATTACHMENT";
10009
10010
  })(InputType || (InputType = {}));
10010
10011
  /**
10011
10012
  * Possible action types for a toolbar.
@@ -28986,7 +28987,7 @@ class AttachmentUploaderComponent {
28986
28987
  this.props = input({});
28987
28988
  this.attachmentsChange = output();
28988
28989
  this.i18n = inject(I18nService);
28989
- this.feedbackService = inject(FeedbackService);
28990
+ this.feedbackService = inject(FeedbackService, { optional: true });
28990
28991
  this.attachments = signal([]);
28991
28992
  this.maxFiles = computed(() => this.props().maxFiles ?? 5);
28992
28993
  this.accept = computed(() => this.props().accept ?? 'image/jpeg,image/png,image/webp,application/pdf');
@@ -29034,7 +29035,10 @@ class AttachmentUploaderComponent {
29034
29035
  try {
29035
29036
  const shouldCompress = this.props().compressImages !== false && file.type.startsWith('image/');
29036
29037
  const fileToUpload = shouldCompress ? await this.compressImage(file) : file;
29037
- const url = await this.feedbackService.uploadAttachment(fileToUpload);
29038
+ const uploadFn = this.props().uploadFn ?? this.feedbackService?.uploadAttachment.bind(this.feedbackService);
29039
+ if (!uploadFn)
29040
+ throw new Error('No upload function configured');
29041
+ const url = await uploadFn(fileToUpload);
29038
29042
  this.attachments.update(list => list.map(a => (a.id === id ? { ...a, status: 'ready', url } : a)));
29039
29043
  }
29040
29044
  catch {
@@ -29963,6 +29967,7 @@ class FormComponent {
29963
29967
  this.onInvalid = new EventEmitter();
29964
29968
  this.onSelectChange = new EventEmitter();
29965
29969
  this.types = InputType;
29970
+ this.states = ComponentStates;
29966
29971
  this.subscriptions = [];
29967
29972
  this.actionsCache = [];
29968
29973
  // Memo de getFieldProp/getUsernameProp por referencia de field — evita
@@ -29973,6 +29978,9 @@ class FormComponent {
29973
29978
  this.usernamePropMemo = new WeakMap();
29974
29979
  this.textareaPropMemo = new WeakMap();
29975
29980
  this.selectPropMemo = new WeakMap();
29981
+ this.previousUploadingCount = 0;
29982
+ // Campos ATTACHMENT con uploads en curso — bloquea submit + pone botón en WORKING
29983
+ this.uploadingFields = new Set();
29976
29984
  }
29977
29985
  ngOnInit() {
29978
29986
  const formControls = {};
@@ -29989,6 +29997,9 @@ class FormComponent {
29989
29997
  formControls[`${field.name}_from`] = [initialValue, field.validators || []];
29990
29998
  formControls[`${field.name}_to`] = [initialValue, field.validators || []];
29991
29999
  }
30000
+ else if (field.type === this.types.ATTACHMENT) {
30001
+ formControls[field.name] = [[], field.validators || []];
30002
+ }
29992
30003
  else {
29993
30004
  formControls[field.name] = [initialValue, field.validators || []];
29994
30005
  }
@@ -30019,8 +30030,12 @@ class FormComponent {
30019
30030
  }
30020
30031
  ngDoCheck() {
30021
30032
  // Detectar cambios en el estado del formulario (mutación sin cambiar referencia)
30022
- if (this.form && this.props && this.props.state !== this.previousState) {
30033
+ const uploadingCount = this.uploadingFields.size;
30034
+ if (this.form &&
30035
+ this.props &&
30036
+ (this.props.state !== this.previousState || uploadingCount !== this.previousUploadingCount)) {
30023
30037
  this.previousState = this.props.state;
30038
+ this.previousUploadingCount = uploadingCount;
30024
30039
  this.updateActionsCache();
30025
30040
  }
30026
30041
  }
@@ -30030,6 +30045,8 @@ class FormComponent {
30030
30045
  syncFieldControlStates() {
30031
30046
  this.props.sections.forEach(section => {
30032
30047
  section.fields.forEach(field => {
30048
+ if (field.type === this.types.ATTACHMENT)
30049
+ return;
30033
30050
  if (field.type === this.types.NUMBER_FROM_TO) {
30034
30051
  const fromControl = this.getControl(`${field.name}_from`);
30035
30052
  const toControl = this.getControl(`${field.name}_to`);
@@ -30059,7 +30076,7 @@ class FormComponent {
30059
30076
  */
30060
30077
  updateActionsCache() {
30061
30078
  let actionState = this.props.actions.state;
30062
- if (this.props.state === ComponentStates.WORKING) {
30079
+ if (this.props.state === ComponentStates.WORKING || this.uploadingFields.size > 0) {
30063
30080
  actionState = ComponentStates.WORKING;
30064
30081
  }
30065
30082
  else if (this.props.state === ComponentStates.DISABLED) {
@@ -30082,8 +30099,20 @@ class FormComponent {
30082
30099
  this.subscriptions.push(subscription);
30083
30100
  }
30084
30101
  async submitHandler(token) {
30102
+ if (this.uploadingFields.size > 0)
30103
+ return;
30085
30104
  this.onSubmit.emit({ fields: this.form.getRawValue(), token });
30086
30105
  }
30106
+ onAttachmentChange(fieldName, items) {
30107
+ const readyUrls = items.filter(a => a.status === 'ready' && a.url).map(a => a.url);
30108
+ this.form.get(fieldName)?.setValue(readyUrls, { emitEvent: false });
30109
+ if (items.some(a => a.status === 'uploading')) {
30110
+ this.uploadingFields.add(fieldName);
30111
+ }
30112
+ else {
30113
+ this.uploadingFields.delete(fieldName);
30114
+ }
30115
+ }
30087
30116
  getControl(field) {
30088
30117
  return this.Form.get(field);
30089
30118
  }
@@ -30211,7 +30240,7 @@ class FormComponent {
30211
30240
  <val-title [props]="{ content: s.name, size: 'large', color: '', bold: false }"></val-title>
30212
30241
  @for (f of s.fields; track f.name) {
30213
30242
  <div class="input" [attr.data-testid]="f.token">
30214
- @if (f.type !== types.PHONE && f.type !== types.HANDLE) {
30243
+ @if (f.type !== types.PHONE && f.type !== types.HANDLE && f.type !== types.ATTACHMENT) {
30215
30244
  <val-title [props]="{ content: f.label, size: 'small', color: 'dark', bold: false }"></val-title>
30216
30245
  }
30217
30246
  @if (f.description) {
@@ -30278,6 +30307,15 @@ class FormComponent {
30278
30307
  @case (types.CHECKBOX_RADIO) {
30279
30308
  <val-checkbox-radio-input [props]="getFieldProp(f)"></val-checkbox-radio-input>
30280
30309
  }
30310
+ @case (types.ATTACHMENT) {
30311
+ <val-attachment-uploader
30312
+ [props]="{
30313
+ uploadFn: f.uploadFn,
30314
+ disabled: f.state === states.DISABLED || f.state === states.WORKING,
30315
+ }"
30316
+ (attachmentsChange)="onAttachmentChange(f.name, $event)"
30317
+ ></val-attachment-uploader>
30318
+ }
30281
30319
  }
30282
30320
  <val-hint [props]="getFieldProp(f)"></val-hint>
30283
30321
  </div>
@@ -30292,7 +30330,7 @@ class FormComponent {
30292
30330
  ></val-button-group>
30293
30331
  </form>
30294
30332
  </div>
30295
- `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.field-description{display:block;font-size:.75rem;color:var(--ion-color-dark);margin-bottom:.25rem;line-height:1.4}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: TextareaInputComponent, selector: "val-textarea-input", inputs: ["preset", "props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DividerComponent, selector: "val-divider", inputs: ["props"] }, { kind: "component", type: HintComponent, selector: "val-hint", inputs: ["props"] }, { kind: "component", type: CommentInputComponent, selector: "val-comment-input", inputs: ["props"] }, { kind: "component", type: DateInputComponent, selector: "val-date-input", inputs: ["preset", "props"] }, { kind: "component", type: FileInputComponent, selector: "val-file-input", inputs: ["props"] }, { kind: "component", type: HourInputComponent, selector: "val-hour-input", inputs: ["props"] }, { kind: "component", type: EmailInputComponent, selector: "val-email-input", inputs: ["preset", "props"] }, { kind: "component", type: NumberInputComponent, selector: "val-number-input", inputs: ["props"] }, { kind: "component", type: NumberFromToComponent, selector: "val-number-from-to", inputs: ["props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: PasswordInputComponent, selector: "val-password-input", inputs: ["preset", "props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: SelectSearchComponent, selector: "val-select-search", inputs: ["label", "labelProperty", "valueProperty", "multiple", "placeholder", "props"] }, { kind: "component", type: MultiSelectSearchComponent, selector: "val-multi-select-search", inputs: ["label", "labelProperty", "valueProperty", "placeholder", "props"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["preset", "props"] }, { kind: "component", type: PhoneInputComponent, selector: "val-phone-input", inputs: ["preset", "props"], outputs: ["phoneChange"] }, { kind: "component", type: ToggleInputComponent, selector: "val-toggle-input", inputs: ["preset", "props"] }, { kind: "component", type: CheckboxRadioInputComponent, selector: "val-checkbox-radio-input", inputs: ["props"] }, { kind: "component", type: UsernameInputComponent, selector: "val-username-input", inputs: ["props"] }] }); }
30333
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}.section{margin-top:1rem}.input{margin:.5rem 0}@media (min-width: 768px){.input{margin:.75rem 0}}.field-description{display:block;font-size:.75rem;color:var(--ion-color-dark);margin-bottom:.25rem;line-height:1.4}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: TextareaInputComponent, selector: "val-textarea-input", inputs: ["preset", "props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonGroupComponent, selector: "val-button-group", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: DividerComponent, selector: "val-divider", inputs: ["props"] }, { kind: "component", type: HintComponent, selector: "val-hint", inputs: ["props"] }, { kind: "component", type: CommentInputComponent, selector: "val-comment-input", inputs: ["props"] }, { kind: "component", type: DateInputComponent, selector: "val-date-input", inputs: ["preset", "props"] }, { kind: "component", type: FileInputComponent, selector: "val-file-input", inputs: ["props"] }, { kind: "component", type: HourInputComponent, selector: "val-hour-input", inputs: ["props"] }, { kind: "component", type: EmailInputComponent, selector: "val-email-input", inputs: ["preset", "props"] }, { kind: "component", type: NumberInputComponent, selector: "val-number-input", inputs: ["props"] }, { kind: "component", type: NumberFromToComponent, selector: "val-number-from-to", inputs: ["props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: PasswordInputComponent, selector: "val-password-input", inputs: ["preset", "props"] }, { kind: "component", type: PinInputComponent, selector: "val-pin-input", inputs: ["props"] }, { kind: "component", type: SelectSearchComponent, selector: "val-select-search", inputs: ["label", "labelProperty", "valueProperty", "multiple", "placeholder", "props"] }, { kind: "component", type: MultiSelectSearchComponent, selector: "val-multi-select-search", inputs: ["label", "labelProperty", "valueProperty", "placeholder", "props"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["preset", "props"] }, { kind: "component", type: PhoneInputComponent, selector: "val-phone-input", inputs: ["preset", "props"], outputs: ["phoneChange"] }, { kind: "component", type: ToggleInputComponent, selector: "val-toggle-input", inputs: ["preset", "props"] }, { kind: "component", type: CheckboxRadioInputComponent, selector: "val-checkbox-radio-input", inputs: ["props"] }, { kind: "component", type: UsernameInputComponent, selector: "val-username-input", inputs: ["props"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "val-attachment-uploader", inputs: ["props"], outputs: ["attachmentsChange"] }] }); }
30296
30334
  }
30297
30335
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FormComponent, decorators: [{
30298
30336
  type: Component,
@@ -30324,6 +30362,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
30324
30362
  ToggleInputComponent,
30325
30363
  CheckboxRadioInputComponent,
30326
30364
  UsernameInputComponent,
30365
+ AttachmentUploaderComponent,
30327
30366
  ], template: `
30328
30367
  <div class="container">
30329
30368
  <form [formGroup]="form">
@@ -30341,7 +30380,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
30341
30380
  <val-title [props]="{ content: s.name, size: 'large', color: '', bold: false }"></val-title>
30342
30381
  @for (f of s.fields; track f.name) {
30343
30382
  <div class="input" [attr.data-testid]="f.token">
30344
- @if (f.type !== types.PHONE && f.type !== types.HANDLE) {
30383
+ @if (f.type !== types.PHONE && f.type !== types.HANDLE && f.type !== types.ATTACHMENT) {
30345
30384
  <val-title [props]="{ content: f.label, size: 'small', color: 'dark', bold: false }"></val-title>
30346
30385
  }
30347
30386
  @if (f.description) {
@@ -30408,6 +30447,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
30408
30447
  @case (types.CHECKBOX_RADIO) {
30409
30448
  <val-checkbox-radio-input [props]="getFieldProp(f)"></val-checkbox-radio-input>
30410
30449
  }
30450
+ @case (types.ATTACHMENT) {
30451
+ <val-attachment-uploader
30452
+ [props]="{
30453
+ uploadFn: f.uploadFn,
30454
+ disabled: f.state === states.DISABLED || f.state === states.WORKING,
30455
+ }"
30456
+ (attachmentsChange)="onAttachmentChange(f.name, $event)"
30457
+ ></val-attachment-uploader>
30458
+ }
30411
30459
  }
30412
30460
  <val-hint [props]="getFieldProp(f)"></val-hint>
30413
30461
  </div>
@@ -42647,6 +42695,71 @@ function provideLegalContent(config) {
42647
42695
  return { provide: LEGAL_CONTENT_CONFIG, useValue: config };
42648
42696
  }
42649
42697
 
42698
+ /**
42699
+ * Standard cross-app site links (env-aware)
42700
+ *
42701
+ * En el factory MyValtech cada producto satélite (showcase, sigify, …) enlaza a
42702
+ * `web` —la landing de marca— para soporte, contacto y contenido legal. `web`
42703
+ * es el dueño canónico de esas rutas. Este módulo centraliza:
42704
+ *
42705
+ * 1. El mapa ambiente → base URL de `web` (`VALTECH_WEB_BASE_URLS`).
42706
+ * 2. El catálogo de paths estándar que viven en `web` (`VALTECH_SITE_PATHS`).
42707
+ *
42708
+ * El ambiente se decide en BUILD TIME (campo `valtechEnv` en el `environment*.ts`
42709
+ * de cada app), igual que `apiUrl`. Es el mecanismo más confiable: detectar por
42710
+ * hostname en runtime se rompe con dominios custom / `web.app` / variantes de
42711
+ * localhost.
42712
+ *
42713
+ * La resolución real (join baseUrl + path, abrir en tab nueva, `?lang=`) la hace
42714
+ * `LegalLinkService`; este módulo solo le entrega el `baseUrl` correcto por env.
42715
+ *
42716
+ * @see provideValtechSite — wiring de una sola línea para apps satélite.
42717
+ */
42718
+ /**
42719
+ * Base URL de `web` (landing de marca) por ambiente.
42720
+ *
42721
+ * - `local` → `ng serve` de `web` (puerto 8100).
42722
+ * - `dev` → proyecto Firebase `myvaltech-dev`.
42723
+ * - `prod` → dominio custom de producción.
42724
+ *
42725
+ * Sin trailing slash (lo asume `LegalLinkService`).
42726
+ */
42727
+ const VALTECH_WEB_BASE_URLS = {
42728
+ local: 'http://localhost:8100',
42729
+ dev: 'https://myvaltech-dev.web.app',
42730
+ prod: 'https://myvaltech.com',
42731
+ };
42732
+ /**
42733
+ * Resuelve la base URL de `web` para un ambiente.
42734
+ *
42735
+ * Fallback a `prod` cuando el env es desconocido o falta: ante la duda, apuntar
42736
+ * a producción es lo seguro (nunca enlaza a un host local/dev inexistente).
42737
+ */
42738
+ function resolveWebBaseUrl(env) {
42739
+ if (env && env in VALTECH_WEB_BASE_URLS) {
42740
+ return VALTECH_WEB_BASE_URLS[env];
42741
+ }
42742
+ return VALTECH_WEB_BASE_URLS.prod;
42743
+ }
42744
+ /**
42745
+ * Catálogo de paths estándar que viven en `web`. Las apps resuelven estos
42746
+ * contra la base URL del ambiente vía `LegalLinkService.resolve(path)`.
42747
+ *
42748
+ * Mantener alineado con las rutas reales de `web/src/app/app.routes.ts` y con
42749
+ * `VALTECH_COMPANY_LINKS` (footer).
42750
+ */
42751
+ const VALTECH_SITE_PATHS = {
42752
+ home: '/',
42753
+ support: '/contact',
42754
+ contact: '/contact',
42755
+ faq: '/faq',
42756
+ about: '/legal/about',
42757
+ terms: '/legal/terms',
42758
+ privacy: '/legal/privacy',
42759
+ cookies: '/legal/cookies',
42760
+ legalNotice: '/legal/legal-notice',
42761
+ };
42762
+
42650
42763
  const VALTECH_LEGAL_CONFIG = new InjectionToken('VALTECH_LEGAL_CONFIG');
42651
42764
  /**
42652
42765
  * Resolves legal/site paths against a configurable main-site base URL.
@@ -42729,6 +42842,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42729
42842
  function provideValtechLegal(config) {
42730
42843
  return { provide: VALTECH_LEGAL_CONFIG, useValue: config };
42731
42844
  }
42845
+ /**
42846
+ * Wiring de una sola línea para que una app satélite apunte sus links de sitio
42847
+ * (legal, soporte, contacto, …) a `web` —la landing de marca— en el ambiente
42848
+ * correcto. Resuelve el `baseUrl` desde `VALTECH_WEB_BASE_URLS` según el `env`
42849
+ * baked en build-time (`environment.valtechEnv`) y delega en `provideValtechLegal`.
42850
+ *
42851
+ * Ambiente desconocido/ausente → fallback a `prod` (ver `resolveWebBaseUrl`).
42852
+ * El main site (`web`) NO llama esto — sus links quedan relativos.
42853
+ *
42854
+ * @example
42855
+ * // main.ts de showcase / sigify / …
42856
+ * import { environment } from './environments/environment';
42857
+ * provideValtechSite(environment.valtechEnv), // 'local' | 'dev' | 'prod'
42858
+ *
42859
+ * @see resolveWebBaseUrl
42860
+ * @see VALTECH_SITE_PATHS — catálogo de paths estándar que viven en `web`.
42861
+ */
42862
+ function provideValtechSite(env, options) {
42863
+ return provideValtechLegal({
42864
+ baseUrl: resolveWebBaseUrl(env),
42865
+ openInNewTab: options?.openInNewTab ?? true,
42866
+ });
42867
+ }
42732
42868
 
42733
42869
  class OrgService {
42734
42870
  constructor(config, http) {
@@ -50242,5 +50378,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
50242
50378
  * Generated bundle index. Do not edit.
50243
50379
  */
50244
50380
 
50245
- export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CookieBannerComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DebugConsoleComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EmailInputComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MEMBER_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MemberCardComponent, MenuComponent, MessagingService, MetaService, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFormBuilderService, RequestService, RightsFooterComponent, RotatingTextComponent, SHAPE_KEYS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STROKE_KEYS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, SplashScreenService, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, blogPost, buildFooterLinks, buildPath, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
50381
+ export { ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, ARTICLE_SPACING, AVATAR_UPLOAD_DEFAULTS, AccordionComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimatedTerminalComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CookieBannerComponent, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CHECK_INTERVAL_MS, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, DEFAULT_DEBUG_CONSOLE_CONFIG, DEFAULT_DONATION_CONFIG, DEFAULT_EMPTY_STATE, DEFAULT_EMULATOR_CONFIG, DEFAULT_FEEDBACK_CONFIG, DEFAULT_FEEDBACK_TYPE_OPTIONS, DEFAULT_HOME_HEADER, DEFAULT_INFINITE_LIST_METADATA, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DataTableComponent, DateInputComponent, DateRangeInputComponent, DebugConsoleComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EmailInputComponent, EmptyStateComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FaqComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HasPermissionDirective, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LegalLinkService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MEMBER_CARD_DEFAULTS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MemberCardComponent, MenuComponent, MessagingService, MetaService, MfaModalComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PLATFORM_CONFIGS, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PresetService, PriceTagComponent, PrimarySolidBlockButton, PrimarySolidBlockHrefButton, PrimarySolidBlockIconButton, PrimarySolidBlockIconHrefButton, PrimarySolidDefaultRoundButton, PrimarySolidDefaultRoundHrefButton, PrimarySolidDefaultRoundIconButton, PrimarySolidDefaultRoundIconHrefButton, PrimarySolidFullButton, PrimarySolidFullHrefButton, PrimarySolidFullIconButton, PrimarySolidFullIconHrefButton, PrimarySolidLargeRoundButton, PrimarySolidLargeRoundHrefButton, PrimarySolidLargeRoundIconButton, PrimarySolidLargeRoundIconHrefButton, PrimarySolidSmallRoundButton, PrimarySolidSmallRoundHrefButton, PrimarySolidSmallRoundIconButton, PrimarySolidSmallRoundIconHrefButton, ProcessLinksPipe, ProfileSkeletonComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrCodeComponent, QrGeneratorService, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RequestFormBuilderService, RequestService, RightsFooterComponent, RotatingTextComponent, SHAPE_KEYS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STROKE_KEYS, SearchSelectorComponent, SearchbarComponent, SecondarySolidBlockButton, SecondarySolidBlockHrefButton, SecondarySolidBlockIconButton, SecondarySolidBlockIconHrefButton, SecondarySolidDefaultRoundButton, SecondarySolidDefaultRoundHrefButton, SecondarySolidDefaultRoundIconButton, SecondarySolidDefaultRoundIconHrefButton, SecondarySolidFullButton, SecondarySolidFullHrefButton, SecondarySolidFullIconButton, SecondarySolidFullIconHrefButton, SecondarySolidLargeRoundButton, SecondarySolidLargeRoundHrefButton, SecondarySolidLargeRoundIconButton, SecondarySolidLargeRoundIconHrefButton, SecondarySolidSmallRoundButton, SecondarySolidSmallRoundHrefButton, SecondarySolidSmallRoundIconButton, SecondarySolidSmallRoundIconHrefButton, SegmentControlComponent, SelectSearchComponent, SessionService, ShareButtonsComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, SplashScreenService, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UserAvatarComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_NETWORK_ERROR_KEY, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VERSION, ValtechErrorService, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, blogPost, buildFooterLinks, buildPath, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createRefreshableStream, createTitleProps, docs, errorLoggingInterceptor, extractPathParams, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, provideSplashScreen, provideValtechAds, provideValtechAppConfig, provideValtechAppVersion, provideValtechAuth, provideValtechAuthInterceptor, provideValtechDebugConsole, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechPresets, provideValtechSite, provideValtechSkeleton, query, renderPatternSvgInner, replaceSpecialChars, resolveColor, resolveInputDefaultValue, resolveWebBaseUrl, roleGuard, storagePaths, superAdminGuard, toArticle };
50246
50382
  //# sourceMappingURL=valtech-components.mjs.map