valtech-components 4.0.970 → 4.0.971

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.
@@ -67,7 +67,7 @@ import fixWebmDuration from 'fix-webm-duration';
67
67
  * Current version of valtech-components.
68
68
  * This is automatically updated during the publish process.
69
69
  */
70
- const VERSION = '4.0.970';
70
+ const VERSION = '4.0.971';
71
71
 
72
72
  function evaluateValtechAccess(rule, context, features = {}, visitedFeatures = new Set()) {
73
73
  if (rule == null)
@@ -89861,6 +89861,513 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
89861
89861
  }]
89862
89862
  }] });
89863
89863
 
89864
+ /**
89865
+ * `val-page-block`
89866
+ *
89867
+ * Organism que renderiza UN bloque del constructor de páginas de plataforma
89868
+ * (ADR-077, `services/page` en el backend). Es el punto de la lib donde el
89869
+ * catálogo de bloques (`hero`, `text`, `gallery`, `cta`, `faq`) mapea 1:1 a
89870
+ * componentes reales — la razón de ser del ADR: "un rediseño de la lib
89871
+ * mejora todas las páginas publicadas sin tocar sus datos".
89872
+ *
89873
+ * Presentacional puro: recibe `props` ya tipados (espejo exacto del `Block`
89874
+ * del backend), sin llamadas HTTP propias ni conocimiento de a qué app
89875
+ * pertenece la página. El bloque `cta` NO navega — emite `(ctaAction)` con
89876
+ * la intención cruda (`{ action }`) para que el consumidor (la app) la
89877
+ * resuelva contra su propio routing (ADR-077: "el CTA guarda una intención,
89878
+ * nunca una URL").
89879
+ *
89880
+ * El caller típico itera `Page.Blocks` y renderiza uno de estos por bloque:
89881
+ *
89882
+ * @example
89883
+ * ```html
89884
+ * @for (block of page().blocks; track $index) {
89885
+ * <val-page-block [props]="block" (ctaAction)="onCtaAction($event)" />
89886
+ * }
89887
+ * ```
89888
+ */
89889
+ class PageBlockComponent {
89890
+ constructor() {
89891
+ /**
89892
+ * Emite la intención cruda del CTA al hacer click (`{ action }`, nunca una
89893
+ * URL — ver comentario de clase). El consumidor decide qué hacer con
89894
+ * `action`; este componente no la interpreta.
89895
+ */
89896
+ this.ctaAction = new EventEmitter();
89897
+ /** Fallback de imagen rota (convención de la lib) — un slot, una signal. */
89898
+ this.heroImageFailed = signal(false);
89899
+ /** Índices de `gallery.images` cuya carga falló (`error` del `<img>`). */
89900
+ this.failedGalleryImages = signal(new Set());
89901
+ }
89902
+ get hero() {
89903
+ return this.props.props;
89904
+ }
89905
+ get text() {
89906
+ return this.props.props;
89907
+ }
89908
+ get gallery() {
89909
+ return this.props.props;
89910
+ }
89911
+ get cta() {
89912
+ return this.props.props;
89913
+ }
89914
+ get faq() {
89915
+ return this.props.props;
89916
+ }
89917
+ /**
89918
+ * `text.body` es texto plano (no markdown — a diferencia de
89919
+ * `val-article`/`val-faq`, `blocks_validate.go` solo exige un string no
89920
+ * vacío). Partido por línea para que `val-text` (un `<p>` por línea)
89921
+ * respete los saltos que el autor escribió, sin interpretar sintaxis.
89922
+ */
89923
+ textParagraphs() {
89924
+ return this.text.body.split('\n').filter(line => line.trim().length > 0);
89925
+ }
89926
+ /**
89927
+ * `val-faq` agrupa por categoría; el bloque `faq` de `services/page` no
89928
+ * tiene categorías (solo `items` planos) — se envuelve en una única
89929
+ * categoría sin label (`hideSingleCategoryLabel` default `true` la oculta).
89930
+ */
89931
+ faqCategories() {
89932
+ return [
89933
+ {
89934
+ id: 'page-faq',
89935
+ label: '',
89936
+ items: this.faq.items.map((item, index) => ({
89937
+ id: `page-faq-${index}`,
89938
+ question: item.question,
89939
+ answer: item.answer,
89940
+ })),
89941
+ },
89942
+ ];
89943
+ }
89944
+ onCtaClick() {
89945
+ this.ctaAction.emit(this.cta.intent);
89946
+ }
89947
+ onGalleryImageError(index) {
89948
+ const next = new Set(this.failedGalleryImages());
89949
+ next.add(index);
89950
+ this.failedGalleryImages.set(next);
89951
+ }
89952
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PageBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
89953
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PageBlockComponent, isStandalone: true, selector: "val-page-block", inputs: { props: "props" }, outputs: { ctaAction: "ctaAction" }, ngImport: i0, template: `
89954
+ @switch (props.type) {
89955
+ @case ('hero') {
89956
+ <section class="page-block page-block--hero" [class]="'align-' + (hero.align || 'center')">
89957
+ @if (hero.image && !heroImageFailed()) {
89958
+ <img
89959
+ class="page-block__hero-image"
89960
+ [src]="hero.image"
89961
+ [alt]="hero.title"
89962
+ loading="lazy"
89963
+ (error)="heroImageFailed.set(true)"
89964
+ />
89965
+ }
89966
+ <div class="page-block__hero-copy">
89967
+ <val-display [props]="{ size: 'large', color: 'dark', content: hero.title }" />
89968
+ @if (hero.subtitle) {
89969
+ <val-text [props]="{ size: 'large', color: 'medium', bold: false, content: hero.subtitle }" />
89970
+ }
89971
+ </div>
89972
+ </section>
89973
+ }
89974
+ @case ('text') {
89975
+ <section class="page-block page-block--text">
89976
+ @if (text.heading) {
89977
+ <val-title [props]="{ size: 'large', color: 'dark', bold: false, content: text.heading }" />
89978
+ }
89979
+ @for (paragraph of textParagraphs(); track $index) {
89980
+ <val-text [props]="{ size: 'medium', color: 'dark', bold: false, content: paragraph }" />
89981
+ }
89982
+ </section>
89983
+ }
89984
+ @case ('gallery') {
89985
+ <section class="page-block page-block--gallery">
89986
+ <div class="page-block__gallery-grid">
89987
+ @for (image of gallery.images; track $index) {
89988
+ @if (!failedGalleryImages().has($index)) {
89989
+ <!-- Sin alt descriptivo: el backend no modela texto alternativo
89990
+ por imagen (services/page/blocks_validate.go, gallery.images
89991
+ es solo un arreglo de strings). Se marca decorativa a
89992
+ propósito, no un olvido de a11y. -->
89993
+ <img
89994
+ class="page-block__gallery-image"
89995
+ [src]="image"
89996
+ alt=""
89997
+ loading="lazy"
89998
+ (error)="onGalleryImageError($index)"
89999
+ />
90000
+ }
90001
+ }
90002
+ </div>
90003
+ </section>
90004
+ }
90005
+ @case ('cta') {
90006
+ <section class="page-block page-block--cta">
90007
+ <val-button
90008
+ [props]="{
90009
+ text: cta.label,
90010
+ color: 'primary',
90011
+ fill: 'solid',
90012
+ shape: 'round',
90013
+ type: 'button',
90014
+ state: 'ENABLED',
90015
+ }"
90016
+ (onClick)="onCtaClick()"
90017
+ />
90018
+ </section>
90019
+ }
90020
+ @case ('faq') {
90021
+ <section class="page-block page-block--faq">
90022
+ <val-faq [props]="{ categories: faqCategories(), searchable: false }" />
90023
+ </section>
90024
+ }
90025
+ }
90026
+ `, isInline: true, styles: [".page-block{display:block;width:100%}.page-block--hero{display:flex;flex-direction:column;gap:16px;text-align:center;align-items:center}.page-block--hero.align-left{text-align:left;align-items:flex-start}.page-block--hero.align-right{text-align:right;align-items:flex-end}.page-block__hero-image{width:100%;max-height:360px;object-fit:cover;border-radius:12px}.page-block__hero-copy{display:flex;flex-direction:column;gap:8px;max-width:640px}.page-block--text{display:flex;flex-direction:column;gap:8px}.page-block__gallery-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}@media (min-width: 768px){.page-block__gallery-grid{grid-template-columns:repeat(3,1fr);gap:12px}}@media (min-width: 992px){.page-block__gallery-grid{grid-template-columns:repeat(4,1fr)}}.page-block__gallery-image{width:100%;aspect-ratio:1/1;object-fit:cover;border-radius:8px}.page-block--cta{display:flex;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: FaqComponent, selector: "val-faq", inputs: ["props"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
90027
+ }
90028
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PageBlockComponent, decorators: [{
90029
+ type: Component,
90030
+ args: [{ selector: 'val-page-block', standalone: true, imports: [CommonModule, DisplayComponent, TitleComponent, TextComponent, ButtonComponent, FaqComponent], template: `
90031
+ @switch (props.type) {
90032
+ @case ('hero') {
90033
+ <section class="page-block page-block--hero" [class]="'align-' + (hero.align || 'center')">
90034
+ @if (hero.image && !heroImageFailed()) {
90035
+ <img
90036
+ class="page-block__hero-image"
90037
+ [src]="hero.image"
90038
+ [alt]="hero.title"
90039
+ loading="lazy"
90040
+ (error)="heroImageFailed.set(true)"
90041
+ />
90042
+ }
90043
+ <div class="page-block__hero-copy">
90044
+ <val-display [props]="{ size: 'large', color: 'dark', content: hero.title }" />
90045
+ @if (hero.subtitle) {
90046
+ <val-text [props]="{ size: 'large', color: 'medium', bold: false, content: hero.subtitle }" />
90047
+ }
90048
+ </div>
90049
+ </section>
90050
+ }
90051
+ @case ('text') {
90052
+ <section class="page-block page-block--text">
90053
+ @if (text.heading) {
90054
+ <val-title [props]="{ size: 'large', color: 'dark', bold: false, content: text.heading }" />
90055
+ }
90056
+ @for (paragraph of textParagraphs(); track $index) {
90057
+ <val-text [props]="{ size: 'medium', color: 'dark', bold: false, content: paragraph }" />
90058
+ }
90059
+ </section>
90060
+ }
90061
+ @case ('gallery') {
90062
+ <section class="page-block page-block--gallery">
90063
+ <div class="page-block__gallery-grid">
90064
+ @for (image of gallery.images; track $index) {
90065
+ @if (!failedGalleryImages().has($index)) {
90066
+ <!-- Sin alt descriptivo: el backend no modela texto alternativo
90067
+ por imagen (services/page/blocks_validate.go, gallery.images
90068
+ es solo un arreglo de strings). Se marca decorativa a
90069
+ propósito, no un olvido de a11y. -->
90070
+ <img
90071
+ class="page-block__gallery-image"
90072
+ [src]="image"
90073
+ alt=""
90074
+ loading="lazy"
90075
+ (error)="onGalleryImageError($index)"
90076
+ />
90077
+ }
90078
+ }
90079
+ </div>
90080
+ </section>
90081
+ }
90082
+ @case ('cta') {
90083
+ <section class="page-block page-block--cta">
90084
+ <val-button
90085
+ [props]="{
90086
+ text: cta.label,
90087
+ color: 'primary',
90088
+ fill: 'solid',
90089
+ shape: 'round',
90090
+ type: 'button',
90091
+ state: 'ENABLED',
90092
+ }"
90093
+ (onClick)="onCtaClick()"
90094
+ />
90095
+ </section>
90096
+ }
90097
+ @case ('faq') {
90098
+ <section class="page-block page-block--faq">
90099
+ <val-faq [props]="{ categories: faqCategories(), searchable: false }" />
90100
+ </section>
90101
+ }
90102
+ }
90103
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".page-block{display:block;width:100%}.page-block--hero{display:flex;flex-direction:column;gap:16px;text-align:center;align-items:center}.page-block--hero.align-left{text-align:left;align-items:flex-start}.page-block--hero.align-right{text-align:right;align-items:flex-end}.page-block__hero-image{width:100%;max-height:360px;object-fit:cover;border-radius:12px}.page-block__hero-copy{display:flex;flex-direction:column;gap:8px;max-width:640px}.page-block--text{display:flex;flex-direction:column;gap:8px}.page-block__gallery-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}@media (min-width: 768px){.page-block__gallery-grid{grid-template-columns:repeat(3,1fr);gap:12px}}@media (min-width: 992px){.page-block__gallery-grid{grid-template-columns:repeat(4,1fr)}}.page-block__gallery-image{width:100%;aspect-ratio:1/1;object-fit:cover;border-radius:8px}.page-block--cta{display:flex;justify-content:center}\n"] }]
90104
+ }], propDecorators: { props: [{
90105
+ type: Input
90106
+ }], ctaAction: [{
90107
+ type: Output
90108
+ }] } });
90109
+
90110
+ /**
90111
+ * Tipos del organism `val-page-block` — constructor de páginas de plataforma
90112
+ * (ADR-077: `docs/adr/077-constructor-de-paginas-de-plataforma.md`, primera
90113
+ * aplicación real en Eklesee, Bloque 4:
90114
+ * `docs/eklesee/03-roadmap-y-abiertos.md`).
90115
+ *
90116
+ * Espejo 1:1 de `Block`/`Props` en `backend/go/services/page/types.go` +
90117
+ * `backend/go/services/page/blocks_validate.go` — la forma de cada `props`
90118
+ * sale de ahí, no se inventa acá. El catálogo de esta primera pasada son 5
90119
+ * tipos (`hero`, `text`, `gallery`, `cta`, `faq`); `countdown`/`sponsors`/
90120
+ * `progress` (catálogo completo del ADR) quedan fuera hasta que Bingo migre.
90121
+ *
90122
+ * El componente es i18n-agnóstico y agnóstico al dominio a propósito (mismo
90123
+ * criterio que `val-faq`/`val-article`): recibe `props` ya resueltos, sin
90124
+ * llamadas HTTP propias ni conocimiento de rutas de ninguna app. La app que
90125
+ * lo consume (Eklesee) resuelve `PageCTAIntent.action` a una ruta real —
90126
+ * este organism solo la emite via `(ctaAction)`.
90127
+ */
90128
+
90129
+ const VIDEO_PLAYER_I18N = {
90130
+ es: {
90131
+ uploadingTitle: 'Subiendo video',
90132
+ uploadingBody: 'La subida está en curso. Vuelve en un momento.',
90133
+ processingTitle: 'Video en proceso',
90134
+ processingBody: 'Estamos preparando este video. Vuelve en unos minutos.',
90135
+ rejectedTitle: 'Este video no se pudo publicar',
90136
+ failedTitle: 'No pudimos procesar este video',
90137
+ unsupportedLink: 'Este enlace no se puede reproducir aquí.',
90138
+ },
90139
+ en: {
90140
+ uploadingTitle: 'Uploading video',
90141
+ uploadingBody: 'The upload is in progress. Check back in a moment.',
90142
+ processingTitle: 'Video processing',
90143
+ processingBody: "We're getting this video ready. Check back in a few minutes.",
90144
+ rejectedTitle: "This video couldn't be published",
90145
+ failedTitle: "We couldn't process this video",
90146
+ unsupportedLink: "This link can't be played here.",
90147
+ },
90148
+ };
90149
+ /**
90150
+ * `val-video-player` — reproductor de video de plataforma (ADR-087, "Fase 1 —
90151
+ * Reproducción"). Presentacional/dumb: recibe un `VideoPlayerAsset` YA
90152
+ * RESUELTO por el backend de turno y decide el render, sin fetch propio.
90153
+ *
90154
+ * - `source:'upload'` + `status:'ready'` → `<video>` nativo (`preload="none"`
90155
+ * + portada — ADR-087 §8, cero bytes de video hasta que alguien le da play).
90156
+ * - `source:'upload'` + `uploading|processing` → portada (si hay) + mensaje.
90157
+ * - `source:'upload'` + `failed|rejected` → mensaje legible con `failReason`
90158
+ * (texto ya resuelto por el backend, se muestra tal cual).
90159
+ * - `source:'link'` → iframe **siempre** contra un patrón fijo por proveedor
90160
+ * conocido (`youtube-nocookie.com/embed/{id}` · `player.vimeo.com/video/{id}`),
90161
+ * nunca un `src` armado con datos crudos del usuario. Proveedor no
90162
+ * reconocido → mensaje, nunca un iframe "por si acaso".
90163
+ *
90164
+ * @example
90165
+ * <val-video-player [video]="doc.video" />
90166
+ */
90167
+ class VideoPlayerComponent {
90168
+ constructor() {
90169
+ this.i18n = inject(I18nService);
90170
+ this.sanitizer = inject(DomSanitizer);
90171
+ /** El `VideoAsset` ya resuelto por el backend. `null`/`undefined` → no renderiza nada. */
90172
+ this.video = input(null);
90173
+ this.asset = computed(() => this.video() ?? null);
90174
+ this.thumbFailed = signal(false);
90175
+ /**
90176
+ * Arma el embed SIEMPRE contra un patrón fijo por proveedor conocido — el
90177
+ * `externalId` es el único dato del backend que entra en el `src`. Un
90178
+ * proveedor no reconocido devuelve `null` (el template cae al mensaje, no a
90179
+ * un iframe "por si acaso"). `bypassSecurityTrustResourceUrl` es seguro acá
90180
+ * porque el string completo lo arma este componente, nunca el usuario.
90181
+ */
90182
+ this.embedUrl = computed(() => {
90183
+ const v = this.asset();
90184
+ if (!v || v.source !== 'link' || !v.externalId)
90185
+ return null;
90186
+ const raw = this.buildEmbedUrl(v.provider, v.externalId);
90187
+ return raw ? this.sanitizer.bypassSecurityTrustResourceUrl(raw) : null;
90188
+ });
90189
+ if (!this.i18n.hasNamespace('VideoPlayer')) {
90190
+ this.i18n.registerContent('VideoPlayer', VIDEO_PLAYER_I18N);
90191
+ }
90192
+ }
90193
+ buildEmbedUrl(provider, externalId) {
90194
+ switch (provider) {
90195
+ case 'youtube':
90196
+ return `https://www.youtube-nocookie.com/embed/${encodeURIComponent(externalId)}`;
90197
+ case 'vimeo':
90198
+ return `https://player.vimeo.com/video/${encodeURIComponent(externalId)}`;
90199
+ default:
90200
+ return null;
90201
+ }
90202
+ }
90203
+ t(key) {
90204
+ return this.i18n.t(key, 'VideoPlayer');
90205
+ }
90206
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoPlayerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
90207
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: VideoPlayerComponent, isStandalone: true, selector: "val-video-player", inputs: { video: { classPropertyName: "video", publicName: "video", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
90208
+ @if (asset(); as v) {
90209
+ @if (v.source === 'upload') {
90210
+ @if (v.status === 'ready' && v.url) {
90211
+ <video
90212
+ class="val-video-player__video"
90213
+ [src]="v.url"
90214
+ [poster]="v.thumbnail || undefined"
90215
+ controls
90216
+ preload="none"
90217
+ playsinline
90218
+ ></video>
90219
+ } @else if (v.status === 'rejected' || v.status === 'failed') {
90220
+ <div class="val-video-player__state val-video-player__state--error">
90221
+ @if (v.thumbnail && !thumbFailed()) {
90222
+ <img
90223
+ class="val-video-player__poster"
90224
+ [src]="v.thumbnail"
90225
+ alt=""
90226
+ loading="lazy"
90227
+ (error)="thumbFailed.set(true)"
90228
+ />
90229
+ }
90230
+ <div class="val-video-player__overlay">
90231
+ <strong>{{ v.status === 'rejected' ? t('rejectedTitle') : t('failedTitle') }}</strong>
90232
+ @if (v.failReason) {
90233
+ <span>{{ v.failReason }}</span>
90234
+ }
90235
+ </div>
90236
+ </div>
90237
+ } @else {
90238
+ <!-- uploading | processing -->
90239
+ <div class="val-video-player__state" aria-live="polite">
90240
+ @if (v.thumbnail && !thumbFailed()) {
90241
+ <img
90242
+ class="val-video-player__poster"
90243
+ [src]="v.thumbnail"
90244
+ alt=""
90245
+ loading="lazy"
90246
+ (error)="thumbFailed.set(true)"
90247
+ />
90248
+ }
90249
+ <div class="val-video-player__overlay">
90250
+ <span class="val-video-player__spinner" aria-hidden="true"></span>
90251
+ <strong>{{ v.status === 'uploading' ? t('uploadingTitle') : t('processingTitle') }}</strong>
90252
+ <span>{{ v.status === 'uploading' ? t('uploadingBody') : t('processingBody') }}</span>
90253
+ </div>
90254
+ </div>
90255
+ }
90256
+ } @else {
90257
+ <!-- source: link -->
90258
+ @if (embedUrl(); as src) {
90259
+ <div class="val-video-player__embed-wrap">
90260
+ <iframe
90261
+ class="val-video-player__embed"
90262
+ [src]="src"
90263
+ title="video"
90264
+ frameborder="0"
90265
+ referrerpolicy="strict-origin-when-cross-origin"
90266
+ allow="accelerometer; encrypted-media; gyroscope; picture-in-picture"
90267
+ allowfullscreen
90268
+ loading="lazy"
90269
+ ></iframe>
90270
+ </div>
90271
+ } @else {
90272
+ <div class="val-video-player__state">
90273
+ <div class="val-video-player__overlay">
90274
+ <span>{{ t('unsupportedLink') }}</span>
90275
+ </div>
90276
+ </div>
90277
+ }
90278
+ }
90279
+ }
90280
+ `, isInline: true, styles: [":host{display:block}.val-video-player__video{display:block;width:100%;max-height:70vh;border-radius:12px;background:#000}.val-video-player__embed-wrap{position:relative;width:100%;padding-top:56.25%;border-radius:12px;overflow:hidden;background:#000}.val-video-player__embed{position:absolute;inset:0;width:100%;height:100%;border:0}.val-video-player__state{position:relative;width:100%;aspect-ratio:16 / 9;border-radius:12px;overflow:hidden;background:var(--ion-color-light, rgba(0, 0, 0, .06));display:flex;align-items:flex-end}.val-video-player__poster{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.55}.val-video-player__overlay{position:relative;z-index:1;display:flex;flex-direction:column;gap:4px;width:100%;padding:14px 16px;color:var(--ion-text-color, #000);background:linear-gradient(to top,rgba(0,0,0,.08),transparent)}.val-video-player__state--error .val-video-player__overlay{color:var(--ion-color-danger, #eb445a)}.val-video-player__overlay strong{font-size:.9375rem}.val-video-player__overlay span{font-size:.8125rem;opacity:.85}.val-video-player__spinner{width:18px;height:18px;border-radius:50%;border:2px solid rgba(127,127,127,.35);border-top-color:var(--ion-color-dark, #313131);animation:val-video-player-spin .8s linear infinite}@keyframes val-video-player-spin{to{transform:rotate(360deg)}}\n"] }); }
90281
+ }
90282
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: VideoPlayerComponent, decorators: [{
90283
+ type: Component,
90284
+ args: [{ selector: 'val-video-player', standalone: true, imports: [], template: `
90285
+ @if (asset(); as v) {
90286
+ @if (v.source === 'upload') {
90287
+ @if (v.status === 'ready' && v.url) {
90288
+ <video
90289
+ class="val-video-player__video"
90290
+ [src]="v.url"
90291
+ [poster]="v.thumbnail || undefined"
90292
+ controls
90293
+ preload="none"
90294
+ playsinline
90295
+ ></video>
90296
+ } @else if (v.status === 'rejected' || v.status === 'failed') {
90297
+ <div class="val-video-player__state val-video-player__state--error">
90298
+ @if (v.thumbnail && !thumbFailed()) {
90299
+ <img
90300
+ class="val-video-player__poster"
90301
+ [src]="v.thumbnail"
90302
+ alt=""
90303
+ loading="lazy"
90304
+ (error)="thumbFailed.set(true)"
90305
+ />
90306
+ }
90307
+ <div class="val-video-player__overlay">
90308
+ <strong>{{ v.status === 'rejected' ? t('rejectedTitle') : t('failedTitle') }}</strong>
90309
+ @if (v.failReason) {
90310
+ <span>{{ v.failReason }}</span>
90311
+ }
90312
+ </div>
90313
+ </div>
90314
+ } @else {
90315
+ <!-- uploading | processing -->
90316
+ <div class="val-video-player__state" aria-live="polite">
90317
+ @if (v.thumbnail && !thumbFailed()) {
90318
+ <img
90319
+ class="val-video-player__poster"
90320
+ [src]="v.thumbnail"
90321
+ alt=""
90322
+ loading="lazy"
90323
+ (error)="thumbFailed.set(true)"
90324
+ />
90325
+ }
90326
+ <div class="val-video-player__overlay">
90327
+ <span class="val-video-player__spinner" aria-hidden="true"></span>
90328
+ <strong>{{ v.status === 'uploading' ? t('uploadingTitle') : t('processingTitle') }}</strong>
90329
+ <span>{{ v.status === 'uploading' ? t('uploadingBody') : t('processingBody') }}</span>
90330
+ </div>
90331
+ </div>
90332
+ }
90333
+ } @else {
90334
+ <!-- source: link -->
90335
+ @if (embedUrl(); as src) {
90336
+ <div class="val-video-player__embed-wrap">
90337
+ <iframe
90338
+ class="val-video-player__embed"
90339
+ [src]="src"
90340
+ title="video"
90341
+ frameborder="0"
90342
+ referrerpolicy="strict-origin-when-cross-origin"
90343
+ allow="accelerometer; encrypted-media; gyroscope; picture-in-picture"
90344
+ allowfullscreen
90345
+ loading="lazy"
90346
+ ></iframe>
90347
+ </div>
90348
+ } @else {
90349
+ <div class="val-video-player__state">
90350
+ <div class="val-video-player__overlay">
90351
+ <span>{{ t('unsupportedLink') }}</span>
90352
+ </div>
90353
+ </div>
90354
+ }
90355
+ }
90356
+ }
90357
+ `, styles: [":host{display:block}.val-video-player__video{display:block;width:100%;max-height:70vh;border-radius:12px;background:#000}.val-video-player__embed-wrap{position:relative;width:100%;padding-top:56.25%;border-radius:12px;overflow:hidden;background:#000}.val-video-player__embed{position:absolute;inset:0;width:100%;height:100%;border:0}.val-video-player__state{position:relative;width:100%;aspect-ratio:16 / 9;border-radius:12px;overflow:hidden;background:var(--ion-color-light, rgba(0, 0, 0, .06));display:flex;align-items:flex-end}.val-video-player__poster{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.55}.val-video-player__overlay{position:relative;z-index:1;display:flex;flex-direction:column;gap:4px;width:100%;padding:14px 16px;color:var(--ion-text-color, #000);background:linear-gradient(to top,rgba(0,0,0,.08),transparent)}.val-video-player__state--error .val-video-player__overlay{color:var(--ion-color-danger, #eb445a)}.val-video-player__overlay strong{font-size:.9375rem}.val-video-player__overlay span{font-size:.8125rem;opacity:.85}.val-video-player__spinner{width:18px;height:18px;border-radius:50%;border:2px solid rgba(127,127,127,.35);border-top-color:var(--ion-color-dark, #313131);animation:val-video-player-spin .8s linear infinite}@keyframes val-video-player-spin{to{transform:rotate(360deg)}}\n"] }]
90358
+ }], ctorParameters: () => [] });
90359
+
90360
+ /**
90361
+ * Tipos de `val-video-player` (ADR-087 — video como servicio de plataforma).
90362
+ *
90363
+ * Espejo agnóstico al dominio de `content.VideoAsset` (backend Go,
90364
+ * `backend/go/services/content/video.go`) — mismos nombres de campo en
90365
+ * camelCase. Cualquier app pasa acá el `VideoAsset` que le devuelve SU propio
90366
+ * backend (sermón en Eklesee, receta en Okhelia, animal en Chesed, artículo de
90367
+ * ayuda) con un mapeo trivial; el componente no conoce ni le importa de qué
90368
+ * dominio viene.
90369
+ */
90370
+
89864
90371
  /*
89865
90372
  * Public API Surface of valtech-components
89866
90373
  */
@@ -89870,5 +90377,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
89870
90377
  * Generated bundle index. Do not edit.
89871
90378
  */
89872
90379
 
89873
- export { ACCESS_REQUEST_TYPE, ACCESS_REQUEST_VIEW_I18N, ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccessControlService, AccessRequestViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimalCardComponent, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BackButtonComponent, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, BubbleBlitzGameComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CanAccessDirective, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, ChatComposerComponent, ChatInputComponent, ChatWindowComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ChipSelectComponent, ClientTelemetryService, CodeDisplayComponent, CodeValidatorComponent, CollectionsService, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CommsPreferencesService, CommsPreferencesSettingsComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ConfirmationDialogV2Component, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentReactionModalComponent, ContentService, ContentTransformer, ConversationListItemComponent, ConversationService, CookieBannerComponent, CookieSettingsComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CANONICAL_FIELD_ALIASES, 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_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_POST_UPDATE_GRACE_MS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DangerSectionComponent, DataTableComponent, DatasetPaginationService, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EXPECTED_NOT_FOUND, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, EntityFeedService, EntradaSerializada, ExpandableTextComponent, ExternalBrowserService, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeatureControlService, FeatureGuardDirective, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FieldOptionsEditorComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FolderTabsComponent, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSchemaBuilderService, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GAME_AVATAR_CATALOG_SIZE_PER_STYLE, GameAvatarComponent, GameProfileService, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, GroupMembersComponent, GroupPickerComponent, GroupsService, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandleService, HandoffService, HapticsService, HasPermissionDirective, HeaderActionsService, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, HtmlViewerModalComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, KNOWN_ROUTES, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LightRippleDirective, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LiveReadFallbackService, LoadMoreComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METADATA_LIST_DEFAULTS, META_SCHEMA_VERSION, METRIC_CARD_DEFAULTS, MINI_GAMES_I18N, MINI_GAME_PLAYER_AVATARS, MINI_GAME_PLAYER_COLORS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MediaViewerModalComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MemoryGameComponent, MenuComponent, MessageBubbleComponent, MessagingService, MetaService, MetadataListComponent, MeteringService, MetricCardComponent, MfaModalComponent, MiniGameCalloutComponent, MiniGamePlayerProfileService, MiniGameScorePopComponent, MiniGamesMenuComponent, ModalLayoutComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NoticeComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberPickerComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OperationReferenceComponent, OptionCardsComponent, OptionSheetComponent, OptionSheetService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PERSONA_CONFIG, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PdfService, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PersonaService, PhoneDisplayComponent, PhoneFormatService, PhoneInputComponent, PickerV2Component, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PricingTableComponent, ProcessLinksPipe, ProfileCardComponent, ProfileContentComponent, ProfileModalComponent, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrBrandValidationError, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RbacService, ReactionBarComponent, ReactionsService, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestReviewPanelComponent, RequestService, RetroAudioService, RightsFooterComponent, RoleManagerComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SelectSearchPickerModalComponent, SessionListModalComponent, SessionService, SessionTransitionOverlayComponent, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimonGameComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SupportTicketCtaComponent, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeSelectorComponent, ThemeService, ThreadPanelComponent, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, TypingIndicatorComponent, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UsageMetersComponent, UsageService, UserAvatarComponent, UsernameInputComponent, VALTECH_ACCESS_FEATURES, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_CHAT_CONFIG, VALTECH_COLLECTIONS_CONFIG, VALTECH_COMMS_PREFERENCES_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_COPYRIGHT_TEMPLATE, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DIAGRAMS, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_LEGAL_ENTITY, VALTECH_MENU_I18N, VALTECH_NETWORK_ERROR_KEY, VALTECH_REACTIONS_CONFIG, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VAL_REGISTERED_ICONS, VERSION, ValCommentThreadComponent, ValQuotaWarningComponent, ValtechErrorService, VerifyViewComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, WorkflowService, accessGuard, accessGuardFromRoute, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildPlatformMenu, buildSettingsCards, buildSideNavItemsFromBottomNav, button, canSubmitRequestType, classifyChip, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGameAvatarCatalog, createGameAvatarProps, createGlowCardProps, createInitialDatasetState, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, datasetPageFromLegacyCursor, defaultQrBrand, docs, errorLoggingInterceptor, evaluateValtechAccess, extractPathParams, firmaDeSesionDeCustomToken, formatClockTime, formatDateSeparator, formatRelativeTime, gameAvatarCatalogEntryToMetadata, gameAvatarDataUri, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isKnownRoute, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, providePersona, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccessFeatures, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechChat, provideValtechCollections, provideValtechCommsPreferences, provideValtechContent, provideValtechDebugConsole, provideValtechDiagrams, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationClickActions, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechReactions, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, qrContrastRatio, qrErrorCorrectionFor, query, rbacGuard, renderGameAvatarSvg, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveCopyrightTemplate, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, roleOf, selectableRequestTypes, storagePaths, suggestEmailFix, superAdminGuard, supportedGameAvatarStyles, toArticle, validateQrBrand, validateRoutes };
90380
+ export { ACCESS_REQUEST_TYPE, ACCESS_REQUEST_VIEW_I18N, ACTION_CARD_DEFAULTS, AD_SIZE_MAP, API_TABLE_COLUMN_LABELS, APP_VERSION_PLATFORM_PLUGIN, APP_VERSION_REMOTE_PLUGIN, ARTICLE_CARD_DEFAULTS, ARTICLE_SPACING, ARTICLE_STRIP_DEFAULTS, AUTH_CTA_DEFAULTS, AVATAR_UPLOAD_DEFAULTS, AboutViewComponent, AccessControlService, AccessRequestViewComponent, AccordionComponent, AccountViewComponent, ActionCardComponent, ActionHeaderComponent, ActionType, AdSlotComponent, AdsLoaderService, AdsService, AlertBoxComponent, AnalyticsErrorHandler, AnalyticsRouterTracker, AnalyticsService, AnimalCardComponent, AnimatedTerminalComponent, ApiKeyCreateModalComponent, ApiKeyService, ApiKeysModalComponent, ApiKeysViewComponent, AppConfigService, AppVersionService, ArticleBuilder, ArticleCardComponent, ArticleComponent, ArticleStripComponent, AttachmentUploaderComponent, AuthBackgroundComponent, AuthCtaComponent, AuthService, AuthStateService, AuthStorageService, AuthSyncService, AvatarComponent, AvatarUploadComponent, BOTTOM_NAV_DEFAULTS, BackButtonComponent, BannerComponent, BlogPostBuilder, BottomNavComponent, BoxComponent, BreadcrumbComponent, BubbleBlitzGameComponent, ButtonComponent, ButtonGroupComponent, CALLOUT_LABELS, CHEV_KEYS, CIRCLE_KEYS, COMMON_COUNTRY_CODES, COMMON_CURRENCIES, CORNER_KEYS, CTA_CARD_DEFAULTS, CURRENCY_INFO, CanAccessDirective, CardComponent, CardSection, CardType, CardsCarouselComponent, ChangeEmailModalComponent, ChangePasswordModalComponent, ChatComposerComponent, ChatInputComponent, ChatWindowComponent, CheckInputComponent, CheckboxRadioInputComponent, ChipGroupComponent, ChipSelectComponent, ClientTelemetryService, CodeDisplayComponent, CodeValidatorComponent, CollectionsService, CommandDisplayComponent, CommentComponent, CommentInputComponent, CommentSectionComponent, CommsPreferencesService, CommsPreferencesSettingsComponent, CompanyFooterComponent, ComponentStates, ConfirmationDialogService, ConfirmationDialogV2Component, ContainerComponent, ContentLoaderComponent, ContentReactionComponent, ContentReactionModalComponent, ContentService, ContentTransformer, ConversationListItemComponent, ConversationService, CookieBannerComponent, CookieSettingsComponent, CountdownComponent, CreateOrgModalComponent, CtaCardComponent, CurrencyInputComponent, DEFAULT_ADS_CONFIG, DEFAULT_APP_CONFIG_SERVICE_CONFIG, DEFAULT_APP_VERSION_SERVICE_CONFIG, DEFAULT_AUTH_CONFIG, DEFAULT_BACK_HEADER, DEFAULT_BUTTON_PRESETS, DEFAULT_CANCEL_BUTTON, DEFAULT_CANONICAL_FIELD_ALIASES, 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_LOGIN_LOGO, DEFAULT_MODAL_CANCEL_BUTTON, DEFAULT_MODAL_CONFIRM_BUTTON, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLATFORMS, DEFAULT_POST_UPDATE_GRACE_MS, DEFAULT_PRESETS, DEFAULT_REFRESHER_METADATA, DEFAULT_SKELETON_CONFIG, DEFAULT_SPLASH_SCREEN_CONFIG, DangerSectionComponent, DataTableComponent, DatasetPaginationService, DateInputComponent, DatePickerComponent, DateRangeInputComponent, DebugConsoleComponent, DeleteAccountModalComponent, DetailSkeletonComponent, DeviceService, DisplayComponent, DividerComponent, DocsApiTableComponent, DocsBreadcrumbComponent, DocsBuilder, DocsCalloutComponent, DocsCodeExampleComponent, DocsLayoutComponent, DocsNavLinksComponent, DocsNavigationService, DocsPageComponent, DocsSearchComponent, DocsSectionComponent, DocsShellComponent, DocsSidebarComponent, DocsTocComponent, DonationService, DownloadService, EXPECTED_NOT_FOUND, EditOrgModalComponent, EmptyStateComponent, EntityCardComponent, EntityFeedService, EntradaSerializada, ExpandableTextComponent, ExternalBrowserService, FEATURES_LIST_DEFAULTS, FUN_MODAL_DEFAULTS, FabComponent, FaqComponent, FeatureControlService, FeatureGuardDirective, FeaturesListComponent, FeedbackFormComponent, FeedbackService, FieldListComponent, FieldOptionsEditorComponent, FileInputComponent, FirebaseService, FirestoreCollectionFactory, FirestoreService, FolderTabsComponent, FontSizeOption, FontSizeSelectorComponent, FontSizeService, FooterComponent, FooterLinksComponent, FormComponent, FormFieldComponent, FormSchemaBuilderService, FormSkeletonComponent, FunHeaderComponent, FunModalComponent, GAME_AVATAR_CATALOG_SIZE_PER_STYLE, GameAvatarComponent, GameProfileService, GlassComponent, GlowCardComponent, GlowComponent, GridSkeletonComponent, GroupMembersComponent, GroupPickerComponent, GroupsService, HANDOFF_ROUTE_PARAM, HANDOFF_TOKEN_PARAM, HandleService, HandoffService, HapticsService, HasPermissionDirective, HeaderActionsService, HeaderComponent, HintComponent, HorizontalScrollComponent, HrefComponent, HtmlViewerModalComponent, I18nService, IMAGE_DEFAULTS, INITIAL_AUTH_STATE, INITIAL_MFA_STATE, INVITATION_CARD_DEFAULTS, IONIC_COLORS$5 as IONIC_COLORS, Icon, IconComponent, IconService, ImageComponent, ImageCropComponent, ImageService, InAppBrowserService, InfiniteListComponent, InfoComponent, InputI18nHelper, InputType, InvitationCardComponent, InviteMemberModalComponent, ItemListComponent, KNOWN_ROUTES, LANG_STORAGE_KEY$1 as LANG_STORAGE_KEY, LEGAL_CONTENT_CONFIG, LOGGED_IN_HINT_COOKIE, LOGIN_DEFAULTS, LandingSplitComponent, LandingStepsComponent, LanguageSelectorComponent, LanguageSelectorV2Component, LayeredCardComponent, LegalContentService, LegalLinkService, LightRippleDirective, LinkComponent, LinkProcessorService, LinkedProvidersComponent, LinksAccordionComponent, LinksCakeComponent, ListSkeletonComponent, LiveReadFallbackService, LoadMoreComponent, LoadingDirective, LocalStorageService, LocaleService, LoginAttemptModalComponent, LoginComponent, MEDIA_OBJECT_DEFAULTS, MEMBER_CARD_DEFAULTS, METADATA_LIST_DEFAULTS, META_SCHEMA_VERSION, METRIC_CARD_DEFAULTS, MINI_GAMES_I18N, MINI_GAME_PLAYER_AVATARS, MINI_GAME_PLAYER_COLORS, MODAL_SIZES, MOTIF_KEYS, MOTION, MaintenancePageComponent, MarkdownArticleParserService, MediaObjectComponent, MediaViewerModalComponent, MemberCardComponent, MemberDetailModalComponent, MemberImportModalComponent, MemoryGameComponent, MenuComponent, MessageBubbleComponent, MessagingService, MetaService, MetadataListComponent, MeteringService, MetricCardComponent, MfaModalComponent, MiniGameCalloutComponent, MiniGamePlayerProfileService, MiniGameScorePopComponent, MiniGamesMenuComponent, ModalLayoutComponent, ModalService, ModalShellComponent, MultiSelectSearchComponent, NUM_KEYS, NavigationService, NetworkBannerComponent, NetworkStatusService, NewsBuilder, NoContentComponent, NotesBoxComponent, NoticeComponent, NotificationActionService, NotificationPreferencesViewComponent, NotificationsService, NotificationsViewComponent, NumberFromToComponent, NumberPickerComponent, NumberStepperComponent, OAUTH_PROVIDERS_INFO, OAuthCallbackComponent, OAuthService, OperationReferenceComponent, OptionCardsComponent, OptionSheetComponent, OptionSheetService, OrgInfoSheetComponent, OrgService, OrgSwitchService, OrganizationViewComponent, PATTERN_MOTIFS, PATTERN_PALETTES, PATTERN_STYLE_CONFIGS, PERSONA_CONFIG, PLATFORM_CONFIGS, POST_UPDATE_TS_KEY, PageBlockComponent, PageContentComponent, PageLinksComponent, PageRefreshService, PageTemplateComponent, PageWavesComponent, PageWrapperComponent, PaginationComponent, PaginationService, PasswordInputComponent, PatternComponent, PdfService, PermissionCatalogService, PermissionSelectorComponent, PermissionsModalComponent, PermissionsViewComponent, PersonaService, PhoneDisplayComponent, PhoneFormatService, PhoneInputComponent, PickerV2Component, PillComponent, PinInputComponent, PlainCodeBoxComponent, PopoverSelectorComponent, PreferencesService, PreferencesViewComponent, PresetService, PriceTagComponent, PricingTableComponent, ProcessLinksPipe, ProfileCardComponent, ProfileContentComponent, ProfileModalComponent, ProfileSkeletonComponent, ProfileViewComponent, ProgressBarComponent, ProgressRingComponent, ProgressStatusComponent, PrompterComponent, QR_PRESETS, QrBrandValidationError, QrCodeComponent, QrGeneratorService, QrScannerComponent, QueryBuilder, QuoteBoxComponent, REQUEST_STATUSES, RadioInputComponent, RangeInputComponent, RatingComponent, RbacService, ReactionBarComponent, ReactionsService, RefresherComponent, RequestFirestoreService, RequestFormBuilderService, RequestFormComponent, RequestModalComponent, RequestReviewPanelComponent, RequestService, RetroAudioService, RightsFooterComponent, RoleManagerComponent, RotatingTextComponent, SEARCH_HEADER_DEFAULTS, SETTINGS_SECTIONS_CATALOG, SHAPE_KEYS, SHARE_PROFILE_MODAL_DEFAULTS, SKELETON_LAYOUT_DEFAULT_ROWS, SKELETON_PRESETS, SOLID_KEYS, STATS_BAR_DEFAULTS, STROKE_KEYS, SearchHeaderComponent, SearchSelectorComponent, SearchbarComponent, SectionHeaderComponent, SecurityViewComponent, SegmentControlComponent, SelectSearchComponent, SelectSearchPickerModalComponent, SessionListModalComponent, SessionService, SessionTransitionOverlayComponent, SettingsHubComponent, ShareButtonsComponent, ShareProfileModalComponent, SimonGameComponent, SimpleComponent, SkeletonComponent, SkeletonLayoutComponent, SkeletonService, SplashComponent, SplashScreenService, StatsBarComponent, StatsCardComponent, StepperComponent, StorageService, SupportTicketCtaComponent, SwipeCarouselComponent, SwitchOrgModalComponent, TRI_KEYS, TabbedContentComponent, TableSkeletonComponent, TabsComponent, Terminal404Component, TestimonialCardComponent, TestimonialCarouselComponent, TextComponent, TextInputComponent, TextareaInputComponent, ThemeOption, ThemeSelectorComponent, ThemeService, ThreadPanelComponent, TicketCardComponent, TicketCardImageService, TimelineComponent, TitleBlockComponent, TitleComponent, ToastService, ToggleInputComponent, TokenService, ToolbarActionType, ToolbarComponent, TransferOwnershipModalComponent, TranslatePipe, TypedCollection, TypingIndicatorComponent, UPDATE_BANNER_DEFAULT_CONTENT, UPDATE_BANNER_I18N_NAMESPACE, UpdateBannerComponent, UsageMetersComponent, UsageService, UserAvatarComponent, UsernameInputComponent, VALTECH_ACCESS_FEATURES, VALTECH_ADS_CONFIG, VALTECH_APP_CONFIG, VALTECH_APP_VERSION, VALTECH_AUTH_CONFIG, VALTECH_CHAT_CONFIG, VALTECH_COLLECTIONS_CONFIG, VALTECH_COMMS_PREFERENCES_CONFIG, VALTECH_COMPANY_LINKS, VALTECH_CONTENT_CONFIG, VALTECH_COPYRIGHT_TEMPLATE, VALTECH_DEBUG_CONSOLE, VALTECH_DEFAULT_CONTENT, VALTECH_DIAGRAMS, VALTECH_DONATION_CONFIG, VALTECH_FEEDBACK_CONFIG, VALTECH_FIREBASE_CONFIG, VALTECH_FOOTER_I18N, VALTECH_FOOTER_LOGO, VALTECH_LANGUAGE_SELECTOR, VALTECH_LEGAL_CONFIG, VALTECH_LEGAL_ENTITY, VALTECH_MENU_I18N, VALTECH_NETWORK_ERROR_KEY, VALTECH_REACTIONS_CONFIG, VALTECH_SETTINGS_MENU_LINKS, VALTECH_SITE_PATHS, VALTECH_SOCIAL_LINKS, VALTECH_SPLASH_SCREEN, VALTECH_WEB_BASE_URLS, VALTECH_WHATSAPP_CONFIG, VAL_REGISTERED_ICONS, VERSION, ValCommentThreadComponent, ValQuotaWarningComponent, ValtechErrorService, VerifyViewComponent, VideoPlayerComponent, WhatsappFabComponent, WhatsappService, WizardComponent, WizardFooterComponent, WorkflowService, accessGuard, accessGuardFromRoute, applyDefaultValueToControl, authGuard, authInterceptor, authPasswordValidator, beautifyLegalArticle, blogPost, buildCompanyFooterProps, buildFooterLinks, buildLegalLinkResolver, buildPath, buildPlatformMenu, buildSettingsCards, buildSideNavItemsFromBottomNav, button, canSubmitRequestType, classifyChip, collections, connectPageRefresh, createErrorStateProps, createFirebaseConfig, createGameAvatarCatalog, createGameAvatarProps, createGlowCardProps, createInitialDatasetState, createInitialPaginationState, createNumberFromToField, createPageState, createPermissionLabeler, createRefreshableStream, createTitleProps, datasetPageFromLegacyCursor, defaultQrBrand, docs, errorLoggingInterceptor, evaluateValtechAccess, extractPathParams, firmaDeSesionDeCustomToken, formatClockTime, formatDateSeparator, formatRelativeTime, gameAvatarCatalogEntryToMetadata, gameAvatarDataUri, generatePatternTiles, generateRandomTile, getAppInfo, getAppVersion, getCollectionPath, getDocumentId, getTimeOfDayKey, goToTop, groupPermissionsByScope, guestGuard, hasEmulators, iconButton, interpretError, isAtEnd, isCollectionPath, isDocumentPath, isEmulatorMode, isIonicColor, isKnownRoute, isValidPath, joinPath, maxLength, mulberry32, news, parseMarkdownArticle, permissionGuard, permissionGuardFromRoute, provideLegalContent, providePersona, provideSplashScreen, provideValtechAboutRoutes, provideValtechAccessFeatures, provideValtechAccountRoutes, provideValtechAds, provideValtechApiKeysRoutes, provideValtechAppConfig, provideValtechAppVersion, provideValtechAppVersionHttp, provideValtechAuth, provideValtechAuthInterceptor, provideValtechChat, provideValtechCollections, provideValtechCommsPreferences, provideValtechContent, provideValtechDebugConsole, provideValtechDiagrams, provideValtechDonations, provideValtechErrorHandling, provideValtechFeedback, provideValtechFirebase, provideValtechI18n, provideValtechLegal, provideValtechNotificationClickActions, provideValtechNotificationPreferencesRoutes, provideValtechNotificationsRoutes, provideValtechOrganizationRoutes, provideValtechPermissionsRoutes, provideValtechPreferencesRoutes, provideValtechPresets, provideValtechProfileRoutes, provideValtechReactions, provideValtechSecurityRoutes, provideValtechSettingsRoutes, provideValtechSite, provideValtechSkeleton, provideValtechWhatsapp, qrContrastRatio, qrErrorCorrectionFor, query, rbacGuard, renderGameAvatarSvg, renderPatternSvgInner, replaceSpecialChars, requestSubmitMode, resolveColor, resolveCopyrightTemplate, resolveInputDefaultValue, resolveIonicColor, resolveWebBaseUrl, roleGuard, roleOf, selectableRequestTypes, storagePaths, suggestEmailFix, superAdminGuard, supportedGameAvatarStyles, toArticle, validateQrBrand, validateRoutes };
89874
90381
  //# sourceMappingURL=valtech-components.mjs.map