valtech-components 2.0.727 → 2.0.729
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/components/organisms/bottom-nav/bottom-nav.component.mjs +36 -21
- package/esm2022/lib/components/organisms/bottom-nav/types.mjs +2 -1
- package/esm2022/lib/services/auth/handoff.service.mjs +1 -1
- package/esm2022/lib/services/auth/notification-action.service.mjs +10 -6
- package/esm2022/lib/services/markdown-article/legal-content.service.mjs +56 -0
- package/esm2022/lib/services/markdown-article/markdown-article-parser.service.mjs +289 -0
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +5 -1
- package/fesm2022/valtech-components.mjs +384 -26
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/rights-footer/rights-footer.component.d.ts +1 -1
- package/lib/components/atoms/text/text.component.d.ts +1 -1
- package/lib/components/molecules/features-list/features-list.component.d.ts +1 -1
- package/lib/components/organisms/article/article.component.d.ts +3 -3
- package/lib/components/organisms/bottom-nav/bottom-nav.component.d.ts +4 -1
- package/lib/components/organisms/bottom-nav/types.d.ts +3 -1
- package/lib/components/organisms/toolbar/toolbar.component.d.ts +1 -1
- package/lib/services/auth/handoff.service.d.ts +10 -0
- package/lib/services/markdown-article/legal-content.service.d.ts +31 -0
- package/lib/services/markdown-article/markdown-article-parser.service.d.ts +31 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
|
@@ -14,7 +14,7 @@ import { Meta, Title } from '@angular/platform-browser';
|
|
|
14
14
|
import QRCodeStyling from 'qr-code-styling';
|
|
15
15
|
import * as i1$3 from '@angular/forms';
|
|
16
16
|
import { ReactiveFormsModule, FormsModule, FormControl, Validators, FormBuilder } from '@angular/forms';
|
|
17
|
-
import { BehaviorSubject, map, Subject, debounceTime, distinctUntilChanged, switchMap, of, catchError, takeUntil, isObservable, firstValueFrom, EMPTY, from, Observable, throwError, filter as filter$1 } from 'rxjs';
|
|
17
|
+
import { BehaviorSubject, map, Subject, debounceTime, distinctUntilChanged, switchMap, of, catchError, takeUntil, isObservable, firstValueFrom, EMPTY, from, Observable, throwError, filter as filter$1, shareReplay } from 'rxjs';
|
|
18
18
|
import * as i1$4 from 'ng-otp-input';
|
|
19
19
|
import { NgOtpInputComponent, NgOtpInputModule } from 'ng-otp-input';
|
|
20
20
|
import * as i2 from '@ionic/angular';
|
|
@@ -50,7 +50,7 @@ import 'prismjs/components/prism-json';
|
|
|
50
50
|
* Current version of valtech-components.
|
|
51
51
|
* This is automatically updated during the publish process.
|
|
52
52
|
*/
|
|
53
|
-
const VERSION = '2.0.
|
|
53
|
+
const VERSION = '2.0.729';
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
56
|
* Servicio para gestionar presets de componentes.
|
|
@@ -31164,14 +31164,18 @@ class NotificationActionService {
|
|
|
31164
31164
|
const currentApp = this.config.appId;
|
|
31165
31165
|
const targetApp = notif.appId;
|
|
31166
31166
|
// 2) Cross-app: handoff + full redirect
|
|
31167
|
+
//
|
|
31168
|
+
// baseUrl resolution priority:
|
|
31169
|
+
// (1) response.targetBaseUrl — backend lookup en app-config (preferred, single source of truth)
|
|
31170
|
+
// (2) config.appUrls[targetApp] — fallback frontend mientras backend agrega el campo
|
|
31167
31171
|
if (targetApp && currentApp && targetApp !== currentApp) {
|
|
31168
|
-
const baseUrl = this.config.appUrls?.[targetApp];
|
|
31169
|
-
if (!baseUrl) {
|
|
31170
|
-
console.warn(`[NotificationAction] Missing appUrls['${targetApp}'] — configure ValtechAuthConfig.appUrls`);
|
|
31171
|
-
return 'cross-app-unconfigured';
|
|
31172
|
-
}
|
|
31173
31172
|
try {
|
|
31174
31173
|
const resp = await firstValueFrom(this.handoff.createHandoff({ targetAppId: targetApp, route }));
|
|
31174
|
+
const baseUrl = resp.targetBaseUrl ?? this.config.appUrls?.[targetApp];
|
|
31175
|
+
if (!baseUrl) {
|
|
31176
|
+
console.warn(`[NotificationAction] No baseUrl for app '${targetApp}' — backend did not return targetBaseUrl and no appUrls fallback configured`);
|
|
31177
|
+
return 'cross-app-unconfigured';
|
|
31178
|
+
}
|
|
31175
31179
|
const url = this.buildHandoffUrl(baseUrl, resp.token, route);
|
|
31176
31180
|
if (typeof window !== 'undefined') {
|
|
31177
31181
|
window.location.href = url;
|
|
@@ -32468,6 +32472,7 @@ const BOTTOM_NAV_DEFAULTS = {
|
|
|
32468
32472
|
hideLabels: false,
|
|
32469
32473
|
safeArea: true,
|
|
32470
32474
|
animation: 'scale',
|
|
32475
|
+
maxWidth: 'xl',
|
|
32471
32476
|
theme: {
|
|
32472
32477
|
background: 'var(--ion-background-color)',
|
|
32473
32478
|
activeColor: 'primary',
|
|
@@ -32594,7 +32599,7 @@ class BottomNavComponent {
|
|
|
32594
32599
|
return true;
|
|
32595
32600
|
// Check additional active routes
|
|
32596
32601
|
if (tab.activeRoutes) {
|
|
32597
|
-
return tab.activeRoutes.some(
|
|
32602
|
+
return tab.activeRoutes.some(r => route.startsWith(r));
|
|
32598
32603
|
}
|
|
32599
32604
|
return false;
|
|
32600
32605
|
}
|
|
@@ -32624,15 +32629,36 @@ class BottomNavComponent {
|
|
|
32624
32629
|
'--bottom-nav-active': this.resolveColor(theme.activeColor),
|
|
32625
32630
|
'--bottom-nav-inactive': this.resolveColor(theme.inactiveColor),
|
|
32626
32631
|
'--bottom-nav-radius': theme.borderRadius || '',
|
|
32632
|
+
'--bottom-nav-max-width': this.resolveMaxWidth(this.config().maxWidth),
|
|
32627
32633
|
};
|
|
32628
32634
|
}
|
|
32635
|
+
/** Resolve maxWidth token (sm|md|lg|xl|full) to CSS var or raw value */
|
|
32636
|
+
resolveMaxWidth(v) {
|
|
32637
|
+
switch (v) {
|
|
32638
|
+
case 'sm':
|
|
32639
|
+
return 'var(--val-container-sm, 540px)';
|
|
32640
|
+
case 'md':
|
|
32641
|
+
return 'var(--val-container-md, 720px)';
|
|
32642
|
+
case 'lg':
|
|
32643
|
+
return 'var(--val-container-lg, 880px)';
|
|
32644
|
+
case 'xl':
|
|
32645
|
+
return 'var(--val-container-xl, 1100px)';
|
|
32646
|
+
case 'full':
|
|
32647
|
+
return 'none';
|
|
32648
|
+
case undefined:
|
|
32649
|
+
case '':
|
|
32650
|
+
return 'var(--val-container-xl, 1100px)';
|
|
32651
|
+
default:
|
|
32652
|
+
return v;
|
|
32653
|
+
}
|
|
32654
|
+
}
|
|
32629
32655
|
ngOnInit() {
|
|
32630
32656
|
// Set initial route
|
|
32631
32657
|
this.currentRoute.set(this.router.url);
|
|
32632
32658
|
// Subscribe to route changes
|
|
32633
32659
|
this.routerSubscription = this.router.events
|
|
32634
|
-
.pipe(filter$1(
|
|
32635
|
-
.subscribe(
|
|
32660
|
+
.pipe(filter$1(event => event instanceof NavigationEnd))
|
|
32661
|
+
.subscribe(event => {
|
|
32636
32662
|
this.currentRoute.set(event.urlAfterRedirects);
|
|
32637
32663
|
});
|
|
32638
32664
|
}
|
|
@@ -32670,17 +32696,7 @@ class BottomNavComponent {
|
|
|
32670
32696
|
resolveColor(color) {
|
|
32671
32697
|
if (!color)
|
|
32672
32698
|
return '';
|
|
32673
|
-
const ionicColors = [
|
|
32674
|
-
'primary',
|
|
32675
|
-
'secondary',
|
|
32676
|
-
'tertiary',
|
|
32677
|
-
'success',
|
|
32678
|
-
'warning',
|
|
32679
|
-
'danger',
|
|
32680
|
-
'light',
|
|
32681
|
-
'medium',
|
|
32682
|
-
'dark',
|
|
32683
|
-
];
|
|
32699
|
+
const ionicColors = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
|
|
32684
32700
|
if (ionicColors.includes(color)) {
|
|
32685
32701
|
return `var(--ion-color-${color})`;
|
|
32686
32702
|
}
|
|
@@ -32738,7 +32754,9 @@ class BottomNavComponent {
|
|
|
32738
32754
|
class="bottom-nav__badge"
|
|
32739
32755
|
[class.bottom-nav__badge--dot]="item.badge.dot"
|
|
32740
32756
|
[style.color]="item.badge.color ? resolveColor(item.badge.color) : null"
|
|
32741
|
-
[style.background-color]="
|
|
32757
|
+
[style.background-color]="
|
|
32758
|
+
item.badge.backgroundColor ? resolveColor(item.badge.backgroundColor) : null
|
|
32759
|
+
"
|
|
32742
32760
|
>
|
|
32743
32761
|
@if (!item.badge.dot && item.badge.text) {
|
|
32744
32762
|
{{ item.badge.text }}
|
|
@@ -32755,7 +32773,7 @@ class BottomNavComponent {
|
|
|
32755
32773
|
}
|
|
32756
32774
|
</div>
|
|
32757
32775
|
</nav>
|
|
32758
|
-
`, isInline: true, styles: [":host{display:block;position:fixed;bottom:0;left:0;right:0;z-index:100;pointer-events:none}.bottom-nav{--bottom-nav-bg: var(--ion-background-color);--bottom-nav-active: var(--ion-color-primary);--bottom-nav-inactive: var(--ion-color-medium);--bottom-nav-radius: 16px 16px 0 0;--bottom-nav-height: 64px;--bottom-nav-fab-size: 56px;--fab-color: var(--ion-color-primary);pointer-events:auto;background:var(--bottom-nav-bg);border-radius:var(--bottom-nav-radius);height:var(--bottom-nav-height);padding:0 8px}.bottom-nav--elevated{box-shadow:0 -4px 20px #00000014}.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 255, 255, 255),.75);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border-top:1px solid rgba(var(--ion-text-color-rgb, 0, 0, 0),.06)}.bottom-nav--floating{margin:0
|
|
32776
|
+
`, isInline: true, styles: [":host{display:block;position:fixed;bottom:0;left:0;right:0;z-index:100;pointer-events:none}.bottom-nav{--bottom-nav-bg: var(--ion-background-color);--bottom-nav-active: var(--ion-color-primary);--bottom-nav-inactive: var(--ion-color-medium);--bottom-nav-radius: 16px 16px 0 0;--bottom-nav-height: 64px;--bottom-nav-fab-size: 56px;--bottom-nav-max-width: var(--val-container-xl, 1100px);--fab-color: var(--ion-color-primary);pointer-events:auto;background:var(--bottom-nav-bg);border-radius:var(--bottom-nav-radius);height:var(--bottom-nav-height);padding:0 8px;max-width:var(--bottom-nav-max-width);margin:0 auto}.bottom-nav--elevated{box-shadow:0 -4px 20px #00000014}.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 255, 255, 255),.75);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border-top:1px solid rgba(var(--ion-text-color-rgb, 0, 0, 0),.06)}.bottom-nav--floating{margin:0 auto 8px;width:calc(100% - 32px);border-radius:32px;border:1px solid rgba(var(--ion-text-color-rgb, 0, 0, 0),.08);box-shadow:0 4px 24px #00000014,0 8px 32px #0000000a;--bottom-nav-radius: 32px}.bottom-nav--floating.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 255, 255, 255),.82);backdrop-filter:blur(28px) saturate(200%);-webkit-backdrop-filter:blur(28px) saturate(200%);border:1px solid rgba(var(--ion-text-color-rgb, 0, 0, 0),.08)}.bottom-nav--floating.bottom-nav--elevated{box-shadow:0 4px 24px #0000001a,0 12px 48px #00000014}.bottom-nav--floating.bottom-nav--safe-area{margin-bottom:calc(8px + env(safe-area-inset-bottom,0))}.bottom-nav--safe-area{padding-bottom:env(safe-area-inset-bottom,0);height:calc(var(--bottom-nav-height) + env(safe-area-inset-bottom,0))}.bottom-nav__container{display:flex;align-items:center;justify-content:space-around;height:var(--bottom-nav-height);max-width:500px;margin:0 auto}.bottom-nav__tab{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;height:100%;padding:8px 4px;background:transparent;border:none;cursor:pointer;position:relative;overflow:hidden;color:var(--bottom-nav-inactive);transition:color .2s ease;max-width:80px;--ripple-color: var(--bottom-nav-active)}.bottom-nav__tab:focus-visible{outline:2px solid var(--bottom-nav-active);outline-offset:-2px;border-radius:8px}.bottom-nav__tab--active{color:var(--bottom-nav-active)}.bottom-nav__tab--disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.bottom-nav__tab[data-animation=scale] .bottom-nav__tab-icon{transition:transform .2s cubic-bezier(.4,0,.2,1)}.bottom-nav__tab[data-animation=scale].bottom-nav__tab--active .bottom-nav__tab-icon{transform:scale(1.15)}.bottom-nav__tab[data-animation=fade]{transition:opacity .2s ease,color .2s ease}.bottom-nav__tab[data-animation=fade]:not(.bottom-nav__tab--active){opacity:.6}.bottom-nav__tab[data-animation=slide] .bottom-nav__tab-label{transition:transform .2s ease,opacity .2s ease;transform:translateY(6px);opacity:0}.bottom-nav__tab[data-animation=slide].bottom-nav__tab--active .bottom-nav__tab-label{transform:translateY(0);opacity:1}.bottom-nav__tab-icon{position:relative;font-size:24px;line-height:1}.bottom-nav__tab-icon ion-icon{display:block}.bottom-nav__tab-label{font-size:11px;font-weight:500;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;letter-spacing:.01em}.bottom-nav__badge{position:absolute;top:-4px;right:-10px;min-width:18px;height:18px;padding:0 5px;font-size:10px;font-weight:600;line-height:18px;text-align:center;color:#fff;background-color:var(--ion-color-danger);border-radius:9px;box-shadow:0 1px 3px #0003}.bottom-nav__badge--dot{min-width:10px;width:10px;height:10px;padding:0;top:-2px;right:-4px;border-radius:50%}.bottom-nav__fab{position:relative;flex-shrink:0;width:var(--bottom-nav-fab-size);height:var(--bottom-nav-fab-size);margin:0 12px;margin-top:calc(var(--bottom-nav-fab-size) * -.35);background:var(--fab-color);border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#fff;font-size:28px;box-shadow:0 4px 14px rgba(var(--ion-color-primary-rgb, 56, 128, 255),.4);transition:transform .2s cubic-bezier(.4,0,.2,1),box-shadow .2s ease;overflow:hidden;--ripple-color: rgba(255, 255, 255, .3)}.bottom-nav__fab:hover{transform:scale(1.08);box-shadow:0 6px 20px rgba(var(--ion-color-primary-rgb, 56, 128, 255),.5)}.bottom-nav__fab:active{transform:scale(.95)}.bottom-nav__fab:focus-visible{outline:3px solid white;outline-offset:2px}.bottom-nav__fab--small{--bottom-nav-fab-size: 48px;font-size:24px;margin-top:-14.4px}.bottom-nav__fab ion-icon{display:block}.bottom-nav--hide-labels{--bottom-nav-height: 56px}.bottom-nav--hide-labels .bottom-nav__tab-label{display:none}.bottom-nav--hide-labels .bottom-nav__tab-icon{font-size:26px}@media (prefers-color-scheme: dark){.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 0, 0, 0),.8);border-top-color:#ffffff14}.bottom-nav--elevated{box-shadow:0 -4px 20px #00000040}.bottom-nav--floating{border-color:#ffffff1a;box-shadow:0 4px 24px #0003,0 8px 32px #00000026}.bottom-nav--floating.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 18, 18, 18),.88);border-color:#ffffff1a}.bottom-nav__fab{box-shadow:0 4px 14px #0006}.bottom-nav__fab:hover{box-shadow:0 6px 20px #00000080}}:host-context(.dark) .bottom-nav--translucent,:host-context(body.dark) .bottom-nav--translucent,:host-context([data-theme=dark]) .bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 18, 18, 18),.85);border-top-color:#ffffff14}:host-context(.dark) .bottom-nav--elevated,:host-context(body.dark) .bottom-nav--elevated,:host-context([data-theme=dark]) .bottom-nav--elevated{box-shadow:0 -4px 20px #0000004d}:host-context(.dark) .bottom-nav--floating,:host-context(body.dark) .bottom-nav--floating,:host-context([data-theme=dark]) .bottom-nav--floating{border-color:#ffffff1a;box-shadow:0 4px 24px #0003,0 8px 32px #00000026}:host-context(.dark) .bottom-nav--floating.bottom-nav--translucent,:host-context(body.dark) .bottom-nav--floating.bottom-nav--translucent,:host-context([data-theme=dark]) .bottom-nav--floating.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 18, 18, 18),.88);border-color:#ffffff1a}:host-context(.dark) .bottom-nav__fab,:host-context(body.dark) .bottom-nav__fab,:host-context([data-theme=dark]) .bottom-nav__fab{box-shadow:0 4px 14px #00000080}:host-context(.dark) .bottom-nav__fab:hover,:host-context(body.dark) .bottom-nav__fab:hover,:host-context([data-theme=dark]) .bottom-nav__fab:hover{box-shadow:0 6px 20px #0009}@supports (padding-bottom: env(safe-area-inset-bottom)){.bottom-nav--safe-area .bottom-nav__container{height:var(--bottom-nav-height)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonRippleEffect, selector: "ion-ripple-effect", inputs: ["type"] }] }); }
|
|
32759
32777
|
}
|
|
32760
32778
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BottomNavComponent, decorators: [{
|
|
32761
32779
|
type: Component,
|
|
@@ -32810,7 +32828,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
32810
32828
|
class="bottom-nav__badge"
|
|
32811
32829
|
[class.bottom-nav__badge--dot]="item.badge.dot"
|
|
32812
32830
|
[style.color]="item.badge.color ? resolveColor(item.badge.color) : null"
|
|
32813
|
-
[style.background-color]="
|
|
32831
|
+
[style.background-color]="
|
|
32832
|
+
item.badge.backgroundColor ? resolveColor(item.badge.backgroundColor) : null
|
|
32833
|
+
"
|
|
32814
32834
|
>
|
|
32815
32835
|
@if (!item.badge.dot && item.badge.text) {
|
|
32816
32836
|
{{ item.badge.text }}
|
|
@@ -32827,7 +32847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
32827
32847
|
}
|
|
32828
32848
|
</div>
|
|
32829
32849
|
</nav>
|
|
32830
|
-
`, styles: [":host{display:block;position:fixed;bottom:0;left:0;right:0;z-index:100;pointer-events:none}.bottom-nav{--bottom-nav-bg: var(--ion-background-color);--bottom-nav-active: var(--ion-color-primary);--bottom-nav-inactive: var(--ion-color-medium);--bottom-nav-radius: 16px 16px 0 0;--bottom-nav-height: 64px;--bottom-nav-fab-size: 56px;--fab-color: var(--ion-color-primary);pointer-events:auto;background:var(--bottom-nav-bg);border-radius:var(--bottom-nav-radius);height:var(--bottom-nav-height);padding:0 8px}.bottom-nav--elevated{box-shadow:0 -4px 20px #00000014}.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 255, 255, 255),.75);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border-top:1px solid rgba(var(--ion-text-color-rgb, 0, 0, 0),.06)}.bottom-nav--floating{margin:0
|
|
32850
|
+
`, styles: [":host{display:block;position:fixed;bottom:0;left:0;right:0;z-index:100;pointer-events:none}.bottom-nav{--bottom-nav-bg: var(--ion-background-color);--bottom-nav-active: var(--ion-color-primary);--bottom-nav-inactive: var(--ion-color-medium);--bottom-nav-radius: 16px 16px 0 0;--bottom-nav-height: 64px;--bottom-nav-fab-size: 56px;--bottom-nav-max-width: var(--val-container-xl, 1100px);--fab-color: var(--ion-color-primary);pointer-events:auto;background:var(--bottom-nav-bg);border-radius:var(--bottom-nav-radius);height:var(--bottom-nav-height);padding:0 8px;max-width:var(--bottom-nav-max-width);margin:0 auto}.bottom-nav--elevated{box-shadow:0 -4px 20px #00000014}.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 255, 255, 255),.75);backdrop-filter:blur(20px) saturate(180%);-webkit-backdrop-filter:blur(20px) saturate(180%);border-top:1px solid rgba(var(--ion-text-color-rgb, 0, 0, 0),.06)}.bottom-nav--floating{margin:0 auto 8px;width:calc(100% - 32px);border-radius:32px;border:1px solid rgba(var(--ion-text-color-rgb, 0, 0, 0),.08);box-shadow:0 4px 24px #00000014,0 8px 32px #0000000a;--bottom-nav-radius: 32px}.bottom-nav--floating.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 255, 255, 255),.82);backdrop-filter:blur(28px) saturate(200%);-webkit-backdrop-filter:blur(28px) saturate(200%);border:1px solid rgba(var(--ion-text-color-rgb, 0, 0, 0),.08)}.bottom-nav--floating.bottom-nav--elevated{box-shadow:0 4px 24px #0000001a,0 12px 48px #00000014}.bottom-nav--floating.bottom-nav--safe-area{margin-bottom:calc(8px + env(safe-area-inset-bottom,0))}.bottom-nav--safe-area{padding-bottom:env(safe-area-inset-bottom,0);height:calc(var(--bottom-nav-height) + env(safe-area-inset-bottom,0))}.bottom-nav__container{display:flex;align-items:center;justify-content:space-around;height:var(--bottom-nav-height);max-width:500px;margin:0 auto}.bottom-nav__tab{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;height:100%;padding:8px 4px;background:transparent;border:none;cursor:pointer;position:relative;overflow:hidden;color:var(--bottom-nav-inactive);transition:color .2s ease;max-width:80px;--ripple-color: var(--bottom-nav-active)}.bottom-nav__tab:focus-visible{outline:2px solid var(--bottom-nav-active);outline-offset:-2px;border-radius:8px}.bottom-nav__tab--active{color:var(--bottom-nav-active)}.bottom-nav__tab--disabled{opacity:.4;cursor:not-allowed;pointer-events:none}.bottom-nav__tab[data-animation=scale] .bottom-nav__tab-icon{transition:transform .2s cubic-bezier(.4,0,.2,1)}.bottom-nav__tab[data-animation=scale].bottom-nav__tab--active .bottom-nav__tab-icon{transform:scale(1.15)}.bottom-nav__tab[data-animation=fade]{transition:opacity .2s ease,color .2s ease}.bottom-nav__tab[data-animation=fade]:not(.bottom-nav__tab--active){opacity:.6}.bottom-nav__tab[data-animation=slide] .bottom-nav__tab-label{transition:transform .2s ease,opacity .2s ease;transform:translateY(6px);opacity:0}.bottom-nav__tab[data-animation=slide].bottom-nav__tab--active .bottom-nav__tab-label{transform:translateY(0);opacity:1}.bottom-nav__tab-icon{position:relative;font-size:24px;line-height:1}.bottom-nav__tab-icon ion-icon{display:block}.bottom-nav__tab-label{font-size:11px;font-weight:500;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;letter-spacing:.01em}.bottom-nav__badge{position:absolute;top:-4px;right:-10px;min-width:18px;height:18px;padding:0 5px;font-size:10px;font-weight:600;line-height:18px;text-align:center;color:#fff;background-color:var(--ion-color-danger);border-radius:9px;box-shadow:0 1px 3px #0003}.bottom-nav__badge--dot{min-width:10px;width:10px;height:10px;padding:0;top:-2px;right:-4px;border-radius:50%}.bottom-nav__fab{position:relative;flex-shrink:0;width:var(--bottom-nav-fab-size);height:var(--bottom-nav-fab-size);margin:0 12px;margin-top:calc(var(--bottom-nav-fab-size) * -.35);background:var(--fab-color);border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;color:#fff;font-size:28px;box-shadow:0 4px 14px rgba(var(--ion-color-primary-rgb, 56, 128, 255),.4);transition:transform .2s cubic-bezier(.4,0,.2,1),box-shadow .2s ease;overflow:hidden;--ripple-color: rgba(255, 255, 255, .3)}.bottom-nav__fab:hover{transform:scale(1.08);box-shadow:0 6px 20px rgba(var(--ion-color-primary-rgb, 56, 128, 255),.5)}.bottom-nav__fab:active{transform:scale(.95)}.bottom-nav__fab:focus-visible{outline:3px solid white;outline-offset:2px}.bottom-nav__fab--small{--bottom-nav-fab-size: 48px;font-size:24px;margin-top:-14.4px}.bottom-nav__fab ion-icon{display:block}.bottom-nav--hide-labels{--bottom-nav-height: 56px}.bottom-nav--hide-labels .bottom-nav__tab-label{display:none}.bottom-nav--hide-labels .bottom-nav__tab-icon{font-size:26px}@media (prefers-color-scheme: dark){.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 0, 0, 0),.8);border-top-color:#ffffff14}.bottom-nav--elevated{box-shadow:0 -4px 20px #00000040}.bottom-nav--floating{border-color:#ffffff1a;box-shadow:0 4px 24px #0003,0 8px 32px #00000026}.bottom-nav--floating.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 18, 18, 18),.88);border-color:#ffffff1a}.bottom-nav__fab{box-shadow:0 4px 14px #0006}.bottom-nav__fab:hover{box-shadow:0 6px 20px #00000080}}:host-context(.dark) .bottom-nav--translucent,:host-context(body.dark) .bottom-nav--translucent,:host-context([data-theme=dark]) .bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 18, 18, 18),.85);border-top-color:#ffffff14}:host-context(.dark) .bottom-nav--elevated,:host-context(body.dark) .bottom-nav--elevated,:host-context([data-theme=dark]) .bottom-nav--elevated{box-shadow:0 -4px 20px #0000004d}:host-context(.dark) .bottom-nav--floating,:host-context(body.dark) .bottom-nav--floating,:host-context([data-theme=dark]) .bottom-nav--floating{border-color:#ffffff1a;box-shadow:0 4px 24px #0003,0 8px 32px #00000026}:host-context(.dark) .bottom-nav--floating.bottom-nav--translucent,:host-context(body.dark) .bottom-nav--floating.bottom-nav--translucent,:host-context([data-theme=dark]) .bottom-nav--floating.bottom-nav--translucent{background:rgba(var(--ion-background-color-rgb, 18, 18, 18),.88);border-color:#ffffff1a}:host-context(.dark) .bottom-nav__fab,:host-context(body.dark) .bottom-nav__fab,:host-context([data-theme=dark]) .bottom-nav__fab{box-shadow:0 4px 14px #00000080}:host-context(.dark) .bottom-nav__fab:hover,:host-context(body.dark) .bottom-nav__fab:hover,:host-context([data-theme=dark]) .bottom-nav__fab:hover{box-shadow:0 6px 20px #0009}@supports (padding-bottom: env(safe-area-inset-bottom)){.bottom-nav--safe-area .bottom-nav__container{height:var(--bottom-nav-height)}}\n"] }]
|
|
32831
32851
|
}], propDecorators: { tabClick: [{
|
|
32832
32852
|
type: Output
|
|
32833
32853
|
}], fabClick: [{
|
|
@@ -34922,6 +34942,344 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
34922
34942
|
}]
|
|
34923
34943
|
}] });
|
|
34924
34944
|
|
|
34945
|
+
const BOX_DRAWING = /[┌┐└┘├┤┬┴┼─│╔╗╚╝═║]/;
|
|
34946
|
+
const CALLOUT_RE = /^>\s*\[!(NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT)\]\s*(.*)$/i;
|
|
34947
|
+
const FENCE_RE = /^```([\w-]*)\s*$/;
|
|
34948
|
+
const HEADING_RE = /^(#{1,6})\s+(.+)$/;
|
|
34949
|
+
const SEPARATOR_RE = /^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/;
|
|
34950
|
+
const UNORDERED_RE = /^\s*[-*+]\s+(.+)$/;
|
|
34951
|
+
const CHECKLIST_RE = /^\s*[-*+]\s+\[([ xX])\]\s+(.+)$/;
|
|
34952
|
+
const ORDERED_RE = /^\s*\d+\.\s+(.+)$/;
|
|
34953
|
+
const TABLE_DIVIDER_RE = /^\s*\|?[\s:|-]+\|?\s*$/;
|
|
34954
|
+
const TABLE_ROW_RE = /^\s*\|(.+)\|\s*$/;
|
|
34955
|
+
/**
|
|
34956
|
+
* Converts Markdown documents into ArticleMetadata for the val-article organism.
|
|
34957
|
+
*
|
|
34958
|
+
* Supported syntax:
|
|
34959
|
+
* - Headings (#, ##, ### …) → title / subtitle
|
|
34960
|
+
* - Paragraphs → paragraph (with `processLinks` + `allowPartialBold`)
|
|
34961
|
+
* - Lists (-, *, 1.) → unordered / ordered list (- [ ] / - [x] for checklist)
|
|
34962
|
+
* - Blockquotes (>) → quote, with GitHub callouts `> [!NOTE|TIP|INFO|WARNING|CAUTION|IMPORTANT]` mapped to notes
|
|
34963
|
+
* - Code fences (```lang) → code
|
|
34964
|
+
* - Box-drawing ASCII art (┌┐└┘│─) auto-wrapped as code
|
|
34965
|
+
* - Tables → flattened into paragraphs with bold keys
|
|
34966
|
+
* - Horizontal rules (---, ***, ___) → separator
|
|
34967
|
+
*/
|
|
34968
|
+
class MarkdownArticleParserService {
|
|
34969
|
+
parse(markdown, config) {
|
|
34970
|
+
const lines = this.normalize(markdown).split('\n');
|
|
34971
|
+
const elements = [];
|
|
34972
|
+
let i = 0;
|
|
34973
|
+
while (i < lines.length) {
|
|
34974
|
+
const line = lines[i];
|
|
34975
|
+
if (line.trim() === '') {
|
|
34976
|
+
i++;
|
|
34977
|
+
continue;
|
|
34978
|
+
}
|
|
34979
|
+
// Fenced code block
|
|
34980
|
+
const fence = line.match(FENCE_RE);
|
|
34981
|
+
if (fence) {
|
|
34982
|
+
const lang = fence[1] || undefined;
|
|
34983
|
+
const body = [];
|
|
34984
|
+
i++;
|
|
34985
|
+
while (i < lines.length && !FENCE_RE.test(lines[i])) {
|
|
34986
|
+
body.push(lines[i]);
|
|
34987
|
+
i++;
|
|
34988
|
+
}
|
|
34989
|
+
i++; // skip closing fence
|
|
34990
|
+
elements.push({
|
|
34991
|
+
type: 'code',
|
|
34992
|
+
props: { code: body.join('\n'), language: lang, theme: 'dark' },
|
|
34993
|
+
});
|
|
34994
|
+
continue;
|
|
34995
|
+
}
|
|
34996
|
+
// ASCII box-drawing art → treat as code block
|
|
34997
|
+
if (BOX_DRAWING.test(line)) {
|
|
34998
|
+
const body = [];
|
|
34999
|
+
while (i < lines.length && (lines[i].trim() === '' || BOX_DRAWING.test(lines[i]))) {
|
|
35000
|
+
body.push(lines[i]);
|
|
35001
|
+
i++;
|
|
35002
|
+
}
|
|
35003
|
+
// Trim trailing blank lines from the block
|
|
35004
|
+
while (body.length && body[body.length - 1].trim() === '')
|
|
35005
|
+
body.pop();
|
|
35006
|
+
elements.push({
|
|
35007
|
+
type: 'code',
|
|
35008
|
+
props: { code: body.join('\n'), language: 'text', theme: 'dark' },
|
|
35009
|
+
});
|
|
35010
|
+
continue;
|
|
35011
|
+
}
|
|
35012
|
+
// Separator
|
|
35013
|
+
if (SEPARATOR_RE.test(line)) {
|
|
35014
|
+
elements.push({ type: 'separator', props: { style: 'line' } });
|
|
35015
|
+
i++;
|
|
35016
|
+
continue;
|
|
35017
|
+
}
|
|
35018
|
+
// Heading
|
|
35019
|
+
const heading = line.match(HEADING_RE);
|
|
35020
|
+
if (heading) {
|
|
35021
|
+
elements.push(this.makeHeading(heading[1].length, heading[2].trim()));
|
|
35022
|
+
i++;
|
|
35023
|
+
continue;
|
|
35024
|
+
}
|
|
35025
|
+
// Callout / blockquote (consume contiguous `>` lines)
|
|
35026
|
+
if (line.startsWith('>')) {
|
|
35027
|
+
const block = [];
|
|
35028
|
+
while (i < lines.length && lines[i].startsWith('>')) {
|
|
35029
|
+
block.push(lines[i]);
|
|
35030
|
+
i++;
|
|
35031
|
+
}
|
|
35032
|
+
elements.push(this.makeQuoteOrCallout(block));
|
|
35033
|
+
continue;
|
|
35034
|
+
}
|
|
35035
|
+
// Table (consume contiguous `|` lines)
|
|
35036
|
+
if (TABLE_ROW_RE.test(line)) {
|
|
35037
|
+
const rows = [];
|
|
35038
|
+
while (i < lines.length && TABLE_ROW_RE.test(lines[i])) {
|
|
35039
|
+
rows.push(lines[i]);
|
|
35040
|
+
i++;
|
|
35041
|
+
}
|
|
35042
|
+
elements.push(...this.makeTable(rows));
|
|
35043
|
+
continue;
|
|
35044
|
+
}
|
|
35045
|
+
// List (checklist / unordered / ordered) — consume contiguous lines
|
|
35046
|
+
if (CHECKLIST_RE.test(line) || UNORDERED_RE.test(line) || ORDERED_RE.test(line)) {
|
|
35047
|
+
const listType = CHECKLIST_RE.test(line)
|
|
35048
|
+
? 'checklist'
|
|
35049
|
+
: ORDERED_RE.test(line)
|
|
35050
|
+
? 'ordered'
|
|
35051
|
+
: 'unordered';
|
|
35052
|
+
const items = [];
|
|
35053
|
+
while (i < lines.length && lines[i].trim() !== '') {
|
|
35054
|
+
const cur = lines[i];
|
|
35055
|
+
const check = cur.match(CHECKLIST_RE);
|
|
35056
|
+
const unord = cur.match(UNORDERED_RE);
|
|
35057
|
+
const ord = cur.match(ORDERED_RE);
|
|
35058
|
+
if (check)
|
|
35059
|
+
items.push({ text: check[2].trim() });
|
|
35060
|
+
else if (ord && listType === 'ordered')
|
|
35061
|
+
items.push({ text: ord[1].trim() });
|
|
35062
|
+
else if (unord && listType !== 'ordered')
|
|
35063
|
+
items.push({ text: unord[1].trim() });
|
|
35064
|
+
else
|
|
35065
|
+
break;
|
|
35066
|
+
i++;
|
|
35067
|
+
}
|
|
35068
|
+
elements.push({ type: 'list', props: { items, listType } });
|
|
35069
|
+
continue;
|
|
35070
|
+
}
|
|
35071
|
+
// Paragraph — consume contiguous non-empty lines that aren't a special block
|
|
35072
|
+
const paragraph = [];
|
|
35073
|
+
while (i < lines.length && lines[i].trim() !== '' && !this.startsNewBlock(lines[i])) {
|
|
35074
|
+
paragraph.push(lines[i]);
|
|
35075
|
+
i++;
|
|
35076
|
+
}
|
|
35077
|
+
const text = paragraph.join(' ').trim();
|
|
35078
|
+
if (text) {
|
|
35079
|
+
elements.push({
|
|
35080
|
+
type: 'paragraph',
|
|
35081
|
+
props: {
|
|
35082
|
+
content: text,
|
|
35083
|
+
size: 'medium',
|
|
35084
|
+
color: 'dark',
|
|
35085
|
+
bold: false,
|
|
35086
|
+
processLinks: true,
|
|
35087
|
+
allowPartialBold: true,
|
|
35088
|
+
},
|
|
35089
|
+
});
|
|
35090
|
+
}
|
|
35091
|
+
}
|
|
35092
|
+
return {
|
|
35093
|
+
elements,
|
|
35094
|
+
maxWidth: '900px',
|
|
35095
|
+
centered: true,
|
|
35096
|
+
theme: 'auto',
|
|
35097
|
+
...config,
|
|
35098
|
+
};
|
|
35099
|
+
}
|
|
35100
|
+
normalize(md) {
|
|
35101
|
+
return md.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
|
|
35102
|
+
}
|
|
35103
|
+
startsNewBlock(line) {
|
|
35104
|
+
return (HEADING_RE.test(line) ||
|
|
35105
|
+
FENCE_RE.test(line) ||
|
|
35106
|
+
SEPARATOR_RE.test(line) ||
|
|
35107
|
+
TABLE_ROW_RE.test(line) ||
|
|
35108
|
+
UNORDERED_RE.test(line) ||
|
|
35109
|
+
ORDERED_RE.test(line) ||
|
|
35110
|
+
CHECKLIST_RE.test(line) ||
|
|
35111
|
+
line.startsWith('>') ||
|
|
35112
|
+
BOX_DRAWING.test(line));
|
|
35113
|
+
}
|
|
35114
|
+
makeHeading(level, content) {
|
|
35115
|
+
if (level === 1) {
|
|
35116
|
+
return {
|
|
35117
|
+
type: 'title',
|
|
35118
|
+
props: { content, size: 'xlarge', color: 'dark', bold: true },
|
|
35119
|
+
};
|
|
35120
|
+
}
|
|
35121
|
+
const size = level === 2 ? 'large' : level === 3 ? 'medium' : 'small';
|
|
35122
|
+
return {
|
|
35123
|
+
type: 'subtitle',
|
|
35124
|
+
props: { content, size, color: 'dark', bold: true },
|
|
35125
|
+
};
|
|
35126
|
+
}
|
|
35127
|
+
makeQuoteOrCallout(block) {
|
|
35128
|
+
const first = block[0];
|
|
35129
|
+
const callout = first.match(CALLOUT_RE);
|
|
35130
|
+
const lines = block.map(l => l.replace(/^>\s?/, ''));
|
|
35131
|
+
if (callout) {
|
|
35132
|
+
const type = callout[1].toUpperCase();
|
|
35133
|
+
const firstLineRest = callout[2] || '';
|
|
35134
|
+
const rest = lines.slice(1).join(' ').trim();
|
|
35135
|
+
const text = [firstLineRest, rest].filter(Boolean).join(' ').trim();
|
|
35136
|
+
return this.makeNote(type, text);
|
|
35137
|
+
}
|
|
35138
|
+
const text = lines.join(' ').trim();
|
|
35139
|
+
return {
|
|
35140
|
+
type: 'quote',
|
|
35141
|
+
props: {
|
|
35142
|
+
content: text,
|
|
35143
|
+
size: 'medium',
|
|
35144
|
+
color: 'medium',
|
|
35145
|
+
bold: false,
|
|
35146
|
+
showQuoteMark: true,
|
|
35147
|
+
alignment: 'left',
|
|
35148
|
+
},
|
|
35149
|
+
};
|
|
35150
|
+
}
|
|
35151
|
+
makeNote(kind, text) {
|
|
35152
|
+
const map = {
|
|
35153
|
+
NOTE: { color: 'primary', prefix: 'Nota' },
|
|
35154
|
+
TIP: { color: 'success', prefix: 'Tip' },
|
|
35155
|
+
INFO: { color: 'tertiary', prefix: 'Info' },
|
|
35156
|
+
IMPORTANT: { color: 'warning', prefix: 'Importante' },
|
|
35157
|
+
WARNING: { color: 'warning', prefix: 'Atención' },
|
|
35158
|
+
CAUTION: { color: 'danger', prefix: 'Precaución' },
|
|
35159
|
+
};
|
|
35160
|
+
const cfg = map[kind];
|
|
35161
|
+
return {
|
|
35162
|
+
type: 'note',
|
|
35163
|
+
props: {
|
|
35164
|
+
text,
|
|
35165
|
+
prefix: `${cfg.prefix}:`,
|
|
35166
|
+
color: cfg.color,
|
|
35167
|
+
textColor: 'dark',
|
|
35168
|
+
size: 'medium',
|
|
35169
|
+
rounded: true,
|
|
35170
|
+
},
|
|
35171
|
+
};
|
|
35172
|
+
}
|
|
35173
|
+
/**
|
|
35174
|
+
* Tables are flattened into a header subtitle (if present) followed by one paragraph per
|
|
35175
|
+
* data row using `**col[0]:** col[1] · **col[2]:** col[3] …` format. val-article has no
|
|
35176
|
+
* native table element so this preserves the information without breaking the layout.
|
|
35177
|
+
*/
|
|
35178
|
+
makeTable(rows) {
|
|
35179
|
+
const parsed = rows
|
|
35180
|
+
.filter(r => !TABLE_DIVIDER_RE.test(r))
|
|
35181
|
+
.map(r => r
|
|
35182
|
+
.trim()
|
|
35183
|
+
.replace(/^\|/, '')
|
|
35184
|
+
.replace(/\|$/, '')
|
|
35185
|
+
.split('|')
|
|
35186
|
+
.map(c => c.trim()));
|
|
35187
|
+
if (parsed.length === 0)
|
|
35188
|
+
return [];
|
|
35189
|
+
const header = parsed[0];
|
|
35190
|
+
const dataRows = parsed.slice(1);
|
|
35191
|
+
if (dataRows.length === 0) {
|
|
35192
|
+
return [
|
|
35193
|
+
{
|
|
35194
|
+
type: 'paragraph',
|
|
35195
|
+
props: {
|
|
35196
|
+
content: header.join(' · '),
|
|
35197
|
+
size: 'medium',
|
|
35198
|
+
color: 'dark',
|
|
35199
|
+
bold: false,
|
|
35200
|
+
processLinks: true,
|
|
35201
|
+
allowPartialBold: true,
|
|
35202
|
+
},
|
|
35203
|
+
},
|
|
35204
|
+
];
|
|
35205
|
+
}
|
|
35206
|
+
return dataRows.map(row => {
|
|
35207
|
+
const pairs = row.map((cell, idx) => {
|
|
35208
|
+
const key = header[idx] ?? '';
|
|
35209
|
+
return key ? `**${key}:** ${cell}` : cell;
|
|
35210
|
+
});
|
|
35211
|
+
return {
|
|
35212
|
+
type: 'paragraph',
|
|
35213
|
+
props: {
|
|
35214
|
+
content: pairs.join(' · '),
|
|
35215
|
+
size: 'medium',
|
|
35216
|
+
color: 'dark',
|
|
35217
|
+
bold: false,
|
|
35218
|
+
processLinks: true,
|
|
35219
|
+
allowPartialBold: true,
|
|
35220
|
+
},
|
|
35221
|
+
};
|
|
35222
|
+
});
|
|
35223
|
+
}
|
|
35224
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkdownArticleParserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
35225
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkdownArticleParserService, providedIn: 'root' }); }
|
|
35226
|
+
}
|
|
35227
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MarkdownArticleParserService, decorators: [{
|
|
35228
|
+
type: Injectable,
|
|
35229
|
+
args: [{ providedIn: 'root' }]
|
|
35230
|
+
}] });
|
|
35231
|
+
|
|
35232
|
+
/**
|
|
35233
|
+
* Loads Markdown legal documents from `/assets/legal/{locale}/{slug}.md` and parses them
|
|
35234
|
+
* into ArticleMetadata ready for `<val-article>`. Caches parsed results by `locale:slug`
|
|
35235
|
+
* so multiple views consuming the same doc share one HTTP request.
|
|
35236
|
+
*/
|
|
35237
|
+
class LegalContentService {
|
|
35238
|
+
constructor() {
|
|
35239
|
+
this.http = inject(HttpClient);
|
|
35240
|
+
this.parser = inject(MarkdownArticleParserService);
|
|
35241
|
+
this.DEFAULT_BASE = '/assets/legal';
|
|
35242
|
+
this.cache = new Map();
|
|
35243
|
+
}
|
|
35244
|
+
load(slug, options = {}) {
|
|
35245
|
+
const locale = (options.locale ?? 'es').toLowerCase();
|
|
35246
|
+
const base = options.basePath ?? this.DEFAULT_BASE;
|
|
35247
|
+
const fallback = options.fallbackLocale === undefined ? 'es' : options.fallbackLocale;
|
|
35248
|
+
const key = `${base}|${locale}|${slug}`;
|
|
35249
|
+
const cached = this.cache.get(key);
|
|
35250
|
+
if (cached)
|
|
35251
|
+
return cached;
|
|
35252
|
+
const primary = this.fetchAndParse(`${base}/${locale}/${slug}.md`);
|
|
35253
|
+
const stream = fallback && fallback !== locale
|
|
35254
|
+
? primary.pipe(catchError(() => this.fetchAndParse(`${base}/${fallback}/${slug}.md`)))
|
|
35255
|
+
: primary;
|
|
35256
|
+
const shared = stream.pipe(shareReplay({ bufferSize: 1, refCount: false }));
|
|
35257
|
+
this.cache.set(key, shared);
|
|
35258
|
+
return shared;
|
|
35259
|
+
}
|
|
35260
|
+
/** Returns the raw Markdown string without parsing. Useful for debugging. */
|
|
35261
|
+
raw(slug, options = {}) {
|
|
35262
|
+
const locale = (options.locale ?? 'es').toLowerCase();
|
|
35263
|
+
const base = options.basePath ?? this.DEFAULT_BASE;
|
|
35264
|
+
return this.http.get(`${base}/${locale}/${slug}.md`, { responseType: 'text' });
|
|
35265
|
+
}
|
|
35266
|
+
/** Clears the in-memory cache. Call when the user changes locale at runtime. */
|
|
35267
|
+
invalidate() {
|
|
35268
|
+
this.cache.clear();
|
|
35269
|
+
}
|
|
35270
|
+
fetchAndParse(url) {
|
|
35271
|
+
return this.http.get(url, { responseType: 'text' }).pipe(switchMap(md => md && md.trim().length > 0
|
|
35272
|
+
? of(this.parser.parse(md))
|
|
35273
|
+
: throwError(() => new Error(`Empty legal doc: ${url}`))), map(parsed => parsed));
|
|
35274
|
+
}
|
|
35275
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LegalContentService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
35276
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LegalContentService, providedIn: 'root' }); }
|
|
35277
|
+
}
|
|
35278
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LegalContentService, decorators: [{
|
|
35279
|
+
type: Injectable,
|
|
35280
|
+
args: [{ providedIn: 'root' }]
|
|
35281
|
+
}] });
|
|
35282
|
+
|
|
34925
35283
|
/**
|
|
34926
35284
|
* Cross-Platform Version Helpers
|
|
34927
35285
|
*
|
|
@@ -42069,5 +42427,5 @@ function buildFooterLinks(links, t) {
|
|
|
42069
42427
|
* Generated bundle index. Do not edit.
|
|
42070
42428
|
*/
|
|
42071
42429
|
|
|
42072
|
-
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, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, 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, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTION, MaintenancePageComponent, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, 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, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SKELETON_PRESETS, 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, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, news, permissionGuard, permissionGuardFromRoute, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechPresets, provideValtechSkeleton, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
|
|
42430
|
+
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, AppConfigService, ArticleBuilder, ArticleComponent, AuthBackgroundComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BannerComponent, BaseDefault, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, ButtonComponent, ButtonGroupComponent, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CURRENCY_INFO, CardComponent, CardSection, CardType, CardsCarouselComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ClearDefault, ClearDefaultBlock, ClearDefaultFull, ClearDefaultRound, ClearDefaultRoundBlock, ClearDefaultRoundFull, CodeDisplayComponent, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentTransformer, CountdownComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_CANCEL_BUTTON, DEFAULT_CONFIRM_BUTTON, DEFAULT_COUNTDOWN_LABELS, DEFAULT_COUNTDOWN_LABELS_EN, 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, DataTableComponent, DateInputComponent, DateRangeInputComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DownloadService, EmailInputComponent, ExpandableTextComponent, FEATURES_LIST_DEFAULTS, FabComponent, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FooterComponent, FooterLinksComponent, FormComponent, FormFooterComponent, FormSkeletonComponent, FunHeaderComponent, GlowCardComponent, GridSkeletonComponent, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandoffService, HeaderComponent, HintComponent, HorizontalScrollComponent, HourInputComponent, HrefComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, ItemListComponent, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LOGIN_DEFAULTS, LanguageSelectorComponent, LayeredCardComponent, LegalContentService, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LoadingDirective, LocalStorageService, LocaleService, LoginComponent, MODAL_SIZES, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MenuComponent, MessagingService, MetaService, ModalService, MultiSelectSearchComponent, NavigationService, NewsBuilder, NoContentComponent, NotesBoxComponent, NotificationActionService, NotificationsService, NumberFromToComponent, NumberInputComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OrgSwitchService, OutlineDefault, OutlineDefaultBlock, OutlineDefaultFull, OutlineDefaultRound, OutlineDefaultRoundBlock, OutlineDefaultRoundFull, PLATFORM_CONFIGS, PageContentComponent, PageTemplateComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PhoneInputComponent, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, 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, RadioInputComponent, RangeInputComponent, RatingComponent, RefresherComponent, RightsFooterComponent, RotatingTextComponent, SKELETON_PRESETS, 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, SkeletonService, SolidBlockButton, SolidDefault, SolidDefaultBlock, SolidDefaultButton, SolidDefaultFull, SolidDefaultRound, SolidDefaultRoundBlock, SolidDefaultRoundButton, SolidDefaultRoundFull, SolidFullButton, SolidLargeButton, SolidLargeRoundButton, SolidSmallButton, SolidSmallRoundButton, StatsCardComponent, StepperComponent, StorageService, SwipeCarouselComponent, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TranslatePipe, TypedCollection, UpdateBannerComponent, UsernameInputComponent, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_AUTH_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_DEFAULT_CONTENT, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_SOCIAL_LINKS, VERSION, WizardComponent, WizardFooterComponent, applyDefaultValueToControl, authGuard, authInterceptor, blogPost, buildFooterLinks, buildPath, collections, createFirebaseConfig, createGlowCardProps, createInitialPaginationState, createNumberFromToField, createTitleProps, docs, extractPathParams, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, guestGuard, hasEmulators, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isValidPath, joinPath, maxLength, news, permissionGuard, permissionGuardFromRoute, provideValtechAds, provideValtechAppConfig, provideValtechAuth, provideValtechAuthInterceptor, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechPresets, provideValtechSkeleton, query, replaceSpecialChars, resolveColor, resolveInputDefaultValue, roleGuard, storagePaths, superAdminGuard, toArticle };
|
|
42073
42431
|
//# sourceMappingURL=valtech-components.mjs.map
|