valtech-components 4.0.971 → 4.0.973

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.
@@ -27,7 +27,7 @@ import * as i1$5 from '@ionic/angular/standalone';
27
27
  import { IonText, IonHeader, IonToolbar, IonButtons, IonButton, IonContent, IonFooter, IonSpinner, AlertController, IonAvatar, IonCard, IonIcon, IonModal, IonTitle, IonProgressBar, IonSkeletonText, IonFab, IonFabButton, IonFabList, IonLabel, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonRadio, IonRadioGroup, IonTextarea, IonDatetime, IonInput, IonSelect, IonSelectOption, IonPopover, IonList, IonItem, IonChip, IonRange, IonSearchbar, IonSegment, IonSegmentButton, IonToggle, IonRippleEffect, IonAccordion, IonAccordionGroup, IonTabBar, IonTabButton, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonInfiniteScroll, IonInfiniteScrollContent, IonNote, IonDatetimeButton, ToastController as ToastController$1, IonCol, IonRow, IonRefresher, IonRefresherContent, IonMenuButton, IonListHeader, IonGrid, MenuController, IonMenu, IonMenuToggle, IonSplitPane, IonAlert } from '@ionic/angular/standalone';
28
28
  import { Browser } from '@capacitor/browser';
29
29
  import { addIcons } from 'ionicons';
30
- import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, chevronBackCircleOutline, chevronForwardCircleOutline, helpCircleOutline, logInOutline, chatbubbleEllipsesOutline, listOutline, folderOutline, pricetagOutline, starOutline, gameControllerOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, mailOutline, qrCodeOutline, sendOutline, createOutline, trashOutline, playOutline, peopleOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, cloudUploadOutline, textOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, personOutline, shieldCheckmarkOutline, keyOutline, desktopOutline, logOutOutline, cloudDownloadOutline, cloudOutline, gitBranchOutline, layersOutline, serverOutline, warningOutline, bulbOutline, lockOpenOutline, diamondOutline, newspaperOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, reorderThreeOutline, chevronDown, language, globeOutline, checkmark, sunnyOutline, moonOutline, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, chevronDownCircleOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, attachOutline, cameraOutline, closeCircleOutline, documentOutline, imageOutline, cloudOfflineOutline, printOutline, chevronBackOutline, swapVerticalOutline, chevronUpOutline, searchOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, documents, documentsOutline, statsChart, statsChartOutline, laptopOutline, swapHorizontalOutline, codeSlashOutline, appsOutline, notificationsOffOutline, alarmOutline, chatboxEllipsesOutline, checkmarkDoneOutline, cogOutline, shareSocialOutline, sparklesOutline, trophyOutline, musicalNotesOutline, volumeHighOutline, volumeMuteOutline, menuOutline, flashlight, flashlightOutline, stopCircleOutline, videocamOffOutline, keypadOutline, checkmarkDone, arrowUndoOutline, micOutline, pulseOutline, arrowUpOutline } from 'ionicons/icons';
30
+ import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, chevronBackCircleOutline, chevronForwardCircleOutline, helpCircleOutline, logInOutline, chatbubbleEllipsesOutline, listOutline, folderOutline, pricetagOutline, starOutline, gameControllerOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, mailOutline, qrCodeOutline, sendOutline, createOutline, trashOutline, playOutline, peopleOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, cloudUploadOutline, textOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, personOutline, shieldCheckmarkOutline, keyOutline, desktopOutline, logOutOutline, cloudDownloadOutline, cloudOutline, gitBranchOutline, layersOutline, serverOutline, warningOutline, bulbOutline, lockOpenOutline, diamondOutline, newspaperOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, reorderThreeOutline, chevronDown, language, globeOutline, checkmark, sunnyOutline, moonOutline, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, chevronDownCircleOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, attachOutline, cameraOutline, closeCircleOutline, documentOutline, imageOutline, cloudOfflineOutline, chatboxOutline, printOutline, chevronBackOutline, swapVerticalOutline, chevronUpOutline, searchOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, documents, documentsOutline, statsChart, statsChartOutline, laptopOutline, swapHorizontalOutline, codeSlashOutline, appsOutline, notificationsOffOutline, alarmOutline, chatboxEllipsesOutline, checkmarkDoneOutline, cogOutline, shareSocialOutline, sparklesOutline, trophyOutline, musicalNotesOutline, volumeHighOutline, volumeMuteOutline, menuOutline, flashlight, flashlightOutline, stopCircleOutline, videocamOffOutline, keypadOutline, checkmarkDone, arrowUndoOutline, micOutline, pulseOutline, arrowUpOutline } from 'ionicons/icons';
31
31
  import * as i1$7 from '@angular/platform-browser';
32
32
  import { DomSanitizer, Meta, Title } from '@angular/platform-browser';
33
33
  import QRCodeStyling from 'qr-code-styling';
@@ -57,6 +57,9 @@ import { Capacitor } from '@capacitor/core';
57
57
  import { Calendar } from 'vanilla-calendar-pro';
58
58
  import Compressor from 'compressorjs';
59
59
  import { ImageCropperComponent } from 'ngx-image-cropper';
60
+ import { Editor } from '@tiptap/core';
61
+ import StarterKit from '@tiptap/starter-kit';
62
+ import Image$1 from '@tiptap/extension-image';
60
63
  import { trigger, transition, style, animate } from '@angular/animations';
61
64
  import 'prismjs/components/prism-scss';
62
65
  import 'prismjs/components/prism-json';
@@ -67,7 +70,7 @@ import fixWebmDuration from 'fix-webm-duration';
67
70
  * Current version of valtech-components.
68
71
  * This is automatically updated during the publish process.
69
72
  */
70
- const VERSION = '4.0.971';
73
+ const VERSION = '4.0.973';
71
74
 
72
75
  function evaluateValtechAccess(rule, context, features = {}, visitedFeatures = new Set()) {
73
76
  if (rule == null)
@@ -39403,6 +39406,617 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
39403
39406
  type: Input
39404
39407
  }] } });
39405
39408
 
39409
+ /**
39410
+ * Defaults i18n (es/en) del `val-rich-editor`. Auto-registrados en el
39411
+ * constructor (namespace `RichEditor`) — el consumer nunca los registra.
39412
+ */
39413
+ const RICH_EDITOR_I18N = {
39414
+ es: {
39415
+ bold: 'Negrita',
39416
+ italic: 'Cursiva',
39417
+ heading2: 'Título',
39418
+ heading3: 'Subtítulo',
39419
+ bulletList: 'Lista con viñetas',
39420
+ orderedList: 'Lista numerada',
39421
+ quote: 'Cita',
39422
+ separator: 'Separador',
39423
+ image: 'Insertar imagen',
39424
+ },
39425
+ en: {
39426
+ bold: 'Bold',
39427
+ italic: 'Italic',
39428
+ heading2: 'Heading',
39429
+ heading3: 'Subheading',
39430
+ bulletList: 'Bullet list',
39431
+ orderedList: 'Numbered list',
39432
+ quote: 'Quote',
39433
+ separator: 'Separator',
39434
+ image: 'Insert image',
39435
+ },
39436
+ };
39437
+
39438
+ /** Texto inline con marks bold/italic convertidas a <strong>/<em> — mismo
39439
+ * criterio que `allowPartialBold` en ArticleTextElement/ArticleNoteElement:
39440
+ * el elemento consumer debe setear `allowPartialBold: true` para que se
39441
+ * rendericen (si no, val-text/val-note escapan el HTML a propósito). */
39442
+ function inlineText(node) {
39443
+ if (node.type === 'text') {
39444
+ let text = node.text ?? '';
39445
+ for (const mark of node.marks ?? []) {
39446
+ if (mark.type === 'bold')
39447
+ text = `<strong>${text}</strong>`;
39448
+ if (mark.type === 'italic')
39449
+ text = `<em>${text}</em>`;
39450
+ if (mark.type === 'code')
39451
+ text = `<code>${text}</code>`;
39452
+ }
39453
+ return text;
39454
+ }
39455
+ return (node.content ?? []).map(inlineText).join('');
39456
+ }
39457
+ function hasBold(node) {
39458
+ if (node.type === 'text') {
39459
+ return (node.marks ?? []).some(m => m.type === 'bold' || m.type === 'code');
39460
+ }
39461
+ return (node.content ?? []).some(hasBold);
39462
+ }
39463
+ function paragraphText(node) {
39464
+ return (node.content ?? []).map(inlineText).join('');
39465
+ }
39466
+ function listItemsFrom(node) {
39467
+ return (node.content ?? []).map(li => ({
39468
+ text: (li.content ?? []).map(paragraphText).join(' '),
39469
+ }));
39470
+ }
39471
+ /**
39472
+ * Convierte un doc de TipTap a `ArticleElement[]`. Función pura — sin
39473
+ * Angular DI, usable también desde Node (mismo criterio que
39474
+ * `parseMarkdownArticle`).
39475
+ */
39476
+ function tiptapDocToArticleElements(doc) {
39477
+ const elements = [];
39478
+ for (const node of doc.content ?? []) {
39479
+ switch (node.type) {
39480
+ case 'heading': {
39481
+ const level = node.attrs?.['level'] ?? 2;
39482
+ elements.push({
39483
+ type: level <= 2 ? 'title' : 'subtitle',
39484
+ props: {
39485
+ content: paragraphText(node),
39486
+ size: level === 1 ? 'large' : level === 2 ? 'medium' : 'small',
39487
+ color: 'dark',
39488
+ bold: true,
39489
+ },
39490
+ });
39491
+ break;
39492
+ }
39493
+ case 'paragraph': {
39494
+ const content = paragraphText(node);
39495
+ if (!content.trim())
39496
+ break; // párrafo vacío (Enter suelto) — no genera elemento
39497
+ elements.push({
39498
+ type: 'text',
39499
+ props: {
39500
+ content,
39501
+ size: 'medium',
39502
+ color: 'dark',
39503
+ bold: false,
39504
+ allowPartialBold: hasBold(node),
39505
+ },
39506
+ });
39507
+ break;
39508
+ }
39509
+ case 'bulletList':
39510
+ case 'orderedList': {
39511
+ elements.push({
39512
+ type: 'list',
39513
+ props: {
39514
+ items: listItemsFrom(node),
39515
+ listType: node.type === 'orderedList' ? 'ordered' : 'unordered',
39516
+ },
39517
+ });
39518
+ break;
39519
+ }
39520
+ case 'blockquote': {
39521
+ elements.push({
39522
+ type: 'quote',
39523
+ props: {
39524
+ content: (node.content ?? []).map(paragraphText).join(' '),
39525
+ size: 'medium',
39526
+ color: 'dark',
39527
+ bold: false,
39528
+ showQuoteMark: true,
39529
+ },
39530
+ });
39531
+ break;
39532
+ }
39533
+ case 'codeBlock': {
39534
+ elements.push({
39535
+ type: 'code',
39536
+ props: {
39537
+ code: (node.content ?? []).map(n => n.text ?? '').join('\n'),
39538
+ language: node.attrs?.['language'] ?? undefined,
39539
+ },
39540
+ });
39541
+ break;
39542
+ }
39543
+ case 'horizontalRule': {
39544
+ elements.push({ type: 'separator', props: { style: 'line' } });
39545
+ break;
39546
+ }
39547
+ case 'image': {
39548
+ const src = node.attrs?.['src'] ?? '';
39549
+ if (!src)
39550
+ break; // sin src no hay nada que renderizar
39551
+ elements.push({
39552
+ type: 'image',
39553
+ props: {
39554
+ src,
39555
+ alt: node.attrs?.['alt'] ?? '',
39556
+ title: node.attrs?.['title'] ?? undefined,
39557
+ },
39558
+ });
39559
+ break;
39560
+ }
39561
+ default:
39562
+ break; // nodo no soportado todavía — se omite, no rompe el resto
39563
+ }
39564
+ }
39565
+ return elements;
39566
+ }
39567
+ function tiptapDocToArticle(doc, config) {
39568
+ return {
39569
+ ...config,
39570
+ elements: tiptapDocToArticleElements(doc),
39571
+ };
39572
+ }
39573
+
39574
+ /**
39575
+ * Conversión inversa de `tiptapDocToArticle` — hidrata `val-rich-editor` con
39576
+ * contenido ya guardado como `ArticleMetadata` (ej. una receta existente que
39577
+ * se vuelve a editar). No es un round-trip perfecto: `ArticleElement` cubre
39578
+ * tipos que TipTap no tiene nodo nativo para editar (`note`, `diagram`,
39579
+ * `command`, `highlight`, `button`, `video`, `custom`) — esos se degradan a
39580
+ * un párrafo de texto plano, editable pero sin su formato especial. Es
39581
+ * intencional: mejor mostrar el contenido (aunque simplificado) que perderlo
39582
+ * o que el editor rechace abrir el documento.
39583
+ */
39584
+ const STRONG_OR_EM = /<(strong|b|em|i|code)>(.*?)<\/\1>/g;
39585
+ /** Extrae marks (bold/italic/code) de un string con <strong>/<em>/<code>
39586
+ * embebido — el inverso de `inlineText` en tiptap-to-article.ts. Simplifica
39587
+ * a un solo nivel de anidación (suficiente para lo que el editor produce). */
39588
+ function textToTiptapInline(html) {
39589
+ if (!html)
39590
+ return [];
39591
+ const nodes = [];
39592
+ let lastIndex = 0;
39593
+ STRONG_OR_EM.lastIndex = 0;
39594
+ let match;
39595
+ const markFor = (tag) => {
39596
+ if (tag === 'strong' || tag === 'b')
39597
+ return { type: 'bold' };
39598
+ if (tag === 'em' || tag === 'i')
39599
+ return { type: 'italic' };
39600
+ return { type: 'code' };
39601
+ };
39602
+ while ((match = STRONG_OR_EM.exec(html)) !== null) {
39603
+ if (match.index > lastIndex) {
39604
+ nodes.push({ type: 'text', text: html.slice(lastIndex, match.index) });
39605
+ }
39606
+ nodes.push({ type: 'text', text: match[2], marks: [markFor(match[1])] });
39607
+ lastIndex = match.index + match[0].length;
39608
+ }
39609
+ if (lastIndex < html.length) {
39610
+ nodes.push({ type: 'text', text: html.slice(lastIndex) });
39611
+ }
39612
+ return nodes.length ? nodes : [{ type: 'text', text: html }];
39613
+ }
39614
+ function paragraph(text) {
39615
+ return { type: 'paragraph', content: textToTiptapInline(text) };
39616
+ }
39617
+ function elementToTiptapNodes(el) {
39618
+ switch (el.type) {
39619
+ case 'title':
39620
+ case 'subtitle': {
39621
+ const level = el.type === 'title' ? (el.props.size === 'large' ? 1 : 2) : 3;
39622
+ return [
39623
+ {
39624
+ type: 'heading',
39625
+ attrs: { level },
39626
+ content: textToTiptapInline(el.props.content ?? ''),
39627
+ },
39628
+ ];
39629
+ }
39630
+ case 'text':
39631
+ case 'paragraph':
39632
+ return [paragraph(el.props.content ?? '')];
39633
+ case 'list':
39634
+ return [
39635
+ {
39636
+ type: el.props.listType === 'ordered' ? 'orderedList' : 'bulletList',
39637
+ content: el.props.items.map(item => ({
39638
+ type: 'listItem',
39639
+ content: [paragraph(item.text)],
39640
+ })),
39641
+ },
39642
+ ];
39643
+ case 'quote':
39644
+ return [
39645
+ {
39646
+ type: 'blockquote',
39647
+ content: [paragraph(el.props.content ?? '')],
39648
+ },
39649
+ ];
39650
+ case 'code':
39651
+ return [
39652
+ {
39653
+ type: 'codeBlock',
39654
+ attrs: el.props.language ? { language: el.props.language } : undefined,
39655
+ content: el.props.code ? [{ type: 'text', text: el.props.code }] : [],
39656
+ },
39657
+ ];
39658
+ case 'separator':
39659
+ return [{ type: 'horizontalRule' }];
39660
+ case 'image':
39661
+ return [
39662
+ {
39663
+ type: 'image',
39664
+ attrs: { src: el.props.src, alt: el.props.alt, title: el.props.title },
39665
+ },
39666
+ ];
39667
+ // Sin nodo TipTap nativo — se degrada a párrafo de texto plano (ver
39668
+ // comentario del módulo). El contenido nunca se pierde, solo su formato.
39669
+ case 'note':
39670
+ return [paragraph(el.props.text ?? '')];
39671
+ case 'highlight':
39672
+ return [paragraph(el.props.content ?? '')];
39673
+ default:
39674
+ return [];
39675
+ }
39676
+ }
39677
+ function articleToTiptapDoc(article) {
39678
+ return {
39679
+ type: 'doc',
39680
+ content: article.elements.flatMap(elementToTiptapNodes),
39681
+ };
39682
+ }
39683
+
39684
+ // Íconos de la toolbar. B/I/H2/H3 no tienen ícono Ionicons dedicado — se
39685
+ // renderizan como texto ("B", "I", "H2", "H3") directo en el botón, mismo
39686
+ // criterio que un editor de texto rico convencional (Google Docs, Notion).
39687
+ addIcons({ listOutline, chatboxOutline, removeOutline, imageOutline });
39688
+ /**
39689
+ * val-rich-editor
39690
+ *
39691
+ * Organism: editor WYSIWYG reusable para toda la plataforma, sobre TipTap.
39692
+ * Emite `ArticleMetadata` — el mismo contrato que `val-article` renderiza,
39693
+ * que también producen Markdown (`parseMarkdownArticle`) y (a futuro) el
39694
+ * page builder. El consumer nunca toca TipTap directamente.
39695
+ *
39696
+ * Cobertura de la toolbar v1: negrita, cursiva, título (H2), subtítulo (H3),
39697
+ * lista con/sin viñetas, cita, separador, imagen. Ver `tiptap-to-article.ts`
39698
+ * para qué tipos de `ArticleElement` puede producir el editor hoy.
39699
+ *
39700
+ * @example
39701
+ * ```html
39702
+ * <val-rich-editor
39703
+ * [props]="{ initialValue: recipe.descriptionArticle, placeholder: 'Escribe la preparación...' }"
39704
+ * (articleChange)="onArticleChange($event)"
39705
+ * />
39706
+ * ```
39707
+ */
39708
+ class RichEditorComponent {
39709
+ constructor() {
39710
+ this.props = {};
39711
+ this.articleChange = new EventEmitter();
39712
+ this.i18n = inject(I18nService);
39713
+ this.injector = inject(Injector);
39714
+ /** Se recalcula en cada `onUpdate`/`onSelectionUpdate` para reflejar el
39715
+ * mark/nodo activo bajo el cursor (ej. el botón "B" resaltado si el
39716
+ * cursor está dentro de texto en negrita). */
39717
+ this._toolbarTick = signal(0);
39718
+ this.toolbarButtons = signal([]);
39719
+ this.uploadingImage = signal(false);
39720
+ this.i18n.registerDefaults('RichEditor', RICH_EDITOR_I18N);
39721
+ }
39722
+ t(key) {
39723
+ return this.i18n.t(key, 'RichEditor');
39724
+ }
39725
+ ngAfterViewInit() {
39726
+ this.editor = new Editor({
39727
+ element: this.editorHost.nativeElement,
39728
+ extensions: [StarterKit, Image$1],
39729
+ editable: !this.props.disabled,
39730
+ content: this.props.initialValue
39731
+ ? articleToTiptapDoc(this.props.initialValue)
39732
+ : '',
39733
+ editorProps: {
39734
+ attributes: {
39735
+ 'data-placeholder': this.props.placeholder ?? '',
39736
+ },
39737
+ },
39738
+ onUpdate: ({ editor }) => {
39739
+ this.emitArticle(editor.getJSON());
39740
+ this.refreshToolbar();
39741
+ },
39742
+ onSelectionUpdate: () => this.refreshToolbar(),
39743
+ });
39744
+ this.refreshToolbar();
39745
+ }
39746
+ ngOnChanges(changes) {
39747
+ if (changes['props']?.currentValue && this.editor) {
39748
+ this.editor.setEditable(!this.props.disabled);
39749
+ }
39750
+ }
39751
+ emitArticle(doc) {
39752
+ this.articleChange.emit(tiptapDocToArticle(doc));
39753
+ }
39754
+ refreshToolbar() {
39755
+ const editor = this.editor;
39756
+ if (!editor)
39757
+ return;
39758
+ this.toolbarButtons.set([
39759
+ {
39760
+ token: 'bold',
39761
+ icon: '',
39762
+ label: this.t('bold'),
39763
+ isActive: editor.isActive('bold'),
39764
+ disabled: false,
39765
+ },
39766
+ {
39767
+ token: 'italic',
39768
+ icon: '',
39769
+ label: this.t('italic'),
39770
+ isActive: editor.isActive('italic'),
39771
+ disabled: false,
39772
+ },
39773
+ {
39774
+ token: 'heading2',
39775
+ icon: '',
39776
+ label: this.t('heading2'),
39777
+ isActive: editor.isActive('heading', { level: 2 }),
39778
+ disabled: false,
39779
+ },
39780
+ {
39781
+ token: 'heading3',
39782
+ icon: '',
39783
+ label: this.t('heading3'),
39784
+ isActive: editor.isActive('heading', { level: 3 }),
39785
+ disabled: false,
39786
+ },
39787
+ {
39788
+ token: 'bulletList',
39789
+ icon: 'list-outline',
39790
+ label: this.t('bulletList'),
39791
+ isActive: editor.isActive('bulletList'),
39792
+ disabled: false,
39793
+ },
39794
+ {
39795
+ token: 'orderedList',
39796
+ icon: 'list-outline',
39797
+ label: this.t('orderedList'),
39798
+ isActive: editor.isActive('orderedList'),
39799
+ disabled: false,
39800
+ },
39801
+ {
39802
+ token: 'quote',
39803
+ icon: 'chatbox-outline',
39804
+ label: this.t('quote'),
39805
+ isActive: editor.isActive('blockquote'),
39806
+ disabled: false,
39807
+ },
39808
+ {
39809
+ token: 'separator',
39810
+ icon: 'remove-outline',
39811
+ label: this.t('separator'),
39812
+ isActive: false,
39813
+ disabled: false,
39814
+ },
39815
+ ]);
39816
+ }
39817
+ runCommand(token) {
39818
+ const editor = this.editor;
39819
+ if (!editor)
39820
+ return;
39821
+ const chain = editor.chain().focus();
39822
+ switch (token) {
39823
+ case 'bold':
39824
+ chain.toggleBold().run();
39825
+ break;
39826
+ case 'italic':
39827
+ chain.toggleItalic().run();
39828
+ break;
39829
+ case 'heading2':
39830
+ chain.toggleHeading({ level: 2 }).run();
39831
+ break;
39832
+ case 'heading3':
39833
+ chain.toggleHeading({ level: 3 }).run();
39834
+ break;
39835
+ case 'bulletList':
39836
+ chain.toggleBulletList().run();
39837
+ break;
39838
+ case 'orderedList':
39839
+ chain.toggleOrderedList().run();
39840
+ break;
39841
+ case 'quote':
39842
+ chain.toggleBlockquote().run();
39843
+ break;
39844
+ case 'separator':
39845
+ chain.setHorizontalRule().run();
39846
+ break;
39847
+ }
39848
+ this.refreshToolbar();
39849
+ }
39850
+ /**
39851
+ * Sube la imagen elegida vía `StorageService` (Regla #12 — nunca URL pegada
39852
+ * a mano, siempre vía Storage) y la inserta en el punto del cursor.
39853
+ * `StorageService` se resuelve perezosamente (vía `Injector`, no como
39854
+ * campo de la clase): si la app consumer no configuró
39855
+ * `provideValtechFirebase`, el editor sigue funcionando normal para todo
39856
+ * lo demás — solo el botón de imagen queda sin efecto, con log de error en
39857
+ * vez de romper el resto del componente.
39858
+ */
39859
+ async onImageSelected(event) {
39860
+ const input = event.target;
39861
+ const file = input.files?.[0];
39862
+ input.value = ''; // permite re-seleccionar el mismo archivo después
39863
+ if (!file || !this.editor)
39864
+ return;
39865
+ this.uploadingImage.set(true);
39866
+ try {
39867
+ const storage = this.injector.get(StorageService);
39868
+ const path = `rich-editor/${Date.now()}-${file.name}`;
39869
+ const result = await storage.uploadAndGetUrl(path, file);
39870
+ this.editor.chain().focus().setImage({ src: result.downloadUrl, alt: file.name }).run();
39871
+ this.emitArticle(this.editor.getJSON());
39872
+ }
39873
+ catch (err) {
39874
+ console.error('[val-rich-editor] No se pudo subir la imagen — ¿la app configuró provideValtechFirebase?', err);
39875
+ }
39876
+ finally {
39877
+ this.uploadingImage.set(false);
39878
+ }
39879
+ }
39880
+ ngOnDestroy() {
39881
+ this.editor?.destroy();
39882
+ }
39883
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39884
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RichEditorComponent, isStandalone: true, selector: "val-rich-editor", inputs: { props: "props" }, outputs: { articleChange: "articleChange" }, viewQueries: [{ propertyName: "editorHost", first: true, predicate: ["editorHost"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
39885
+ <div class="rich-editor" [class.rich-editor--disabled]="props.disabled">
39886
+ @if (!props.disabled) {
39887
+ <div class="rich-editor__toolbar" role="toolbar">
39888
+ @for (btn of toolbarButtons(); track btn.token) {
39889
+ <ion-button
39890
+ fill="clear"
39891
+ size="small"
39892
+ [class.rich-editor__btn--active]="btn.isActive"
39893
+ [disabled]="btn.disabled"
39894
+ [attr.aria-label]="btn.label"
39895
+ [attr.aria-pressed]="btn.isActive"
39896
+ (click)="runCommand(btn.token)"
39897
+ >
39898
+ @switch (btn.token) {
39899
+ @case ('bold') {
39900
+ <strong>B</strong>
39901
+ }
39902
+ @case ('italic') {
39903
+ <em>I</em>
39904
+ }
39905
+ @case ('heading2') {
39906
+ <strong>H2</strong>
39907
+ }
39908
+ @case ('heading3') {
39909
+ <strong>H3</strong>
39910
+ }
39911
+ @case ('bulletList') {
39912
+ <ion-icon name="list-outline" slot="icon-only" />
39913
+ }
39914
+ @case ('orderedList') {
39915
+ <ion-icon name="list-outline" slot="icon-only" />
39916
+ }
39917
+ @case ('quote') {
39918
+ <ion-icon name="chatbox-outline" slot="icon-only" />
39919
+ }
39920
+ @case ('separator') {
39921
+ <ion-icon name="remove-outline" slot="icon-only" />
39922
+ }
39923
+ }
39924
+ </ion-button>
39925
+ }
39926
+ <!-- Label trick (mismo patrón que val-attachment-uploader): el
39927
+ <label> nativo reenvía el clic al input como gesto confiable,
39928
+ ion-button + input.click() programático falla en iOS PWA. -->
39929
+ <label
39930
+ class="rich-editor__image-btn"
39931
+ [class.rich-editor__image-btn--disabled]="uploadingImage()"
39932
+ [attr.aria-label]="t('image')"
39933
+ >
39934
+ @if (uploadingImage()) {
39935
+ <ion-spinner name="dots" />
39936
+ } @else {
39937
+ <ion-icon name="image-outline" />
39938
+ }
39939
+ <input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
39940
+ </label>
39941
+ </div>
39942
+ }
39943
+ <div #editorHost class="rich-editor__surface"></div>
39944
+ </div>
39945
+ `, isInline: true, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__image-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 4px;border-radius:6px;color:var(--ion-color-dark, #232323);font-size:1.125rem;cursor:pointer}.rich-editor__image-btn:hover{background:#0000000f}.rich-editor__image-btn--disabled{opacity:.5;pointer-events:none}.rich-editor__image-btn input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }] }); }
39946
+ }
39947
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichEditorComponent, decorators: [{
39948
+ type: Component,
39949
+ args: [{ selector: 'val-rich-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon, IonSpinner], template: `
39950
+ <div class="rich-editor" [class.rich-editor--disabled]="props.disabled">
39951
+ @if (!props.disabled) {
39952
+ <div class="rich-editor__toolbar" role="toolbar">
39953
+ @for (btn of toolbarButtons(); track btn.token) {
39954
+ <ion-button
39955
+ fill="clear"
39956
+ size="small"
39957
+ [class.rich-editor__btn--active]="btn.isActive"
39958
+ [disabled]="btn.disabled"
39959
+ [attr.aria-label]="btn.label"
39960
+ [attr.aria-pressed]="btn.isActive"
39961
+ (click)="runCommand(btn.token)"
39962
+ >
39963
+ @switch (btn.token) {
39964
+ @case ('bold') {
39965
+ <strong>B</strong>
39966
+ }
39967
+ @case ('italic') {
39968
+ <em>I</em>
39969
+ }
39970
+ @case ('heading2') {
39971
+ <strong>H2</strong>
39972
+ }
39973
+ @case ('heading3') {
39974
+ <strong>H3</strong>
39975
+ }
39976
+ @case ('bulletList') {
39977
+ <ion-icon name="list-outline" slot="icon-only" />
39978
+ }
39979
+ @case ('orderedList') {
39980
+ <ion-icon name="list-outline" slot="icon-only" />
39981
+ }
39982
+ @case ('quote') {
39983
+ <ion-icon name="chatbox-outline" slot="icon-only" />
39984
+ }
39985
+ @case ('separator') {
39986
+ <ion-icon name="remove-outline" slot="icon-only" />
39987
+ }
39988
+ }
39989
+ </ion-button>
39990
+ }
39991
+ <!-- Label trick (mismo patrón que val-attachment-uploader): el
39992
+ <label> nativo reenvía el clic al input como gesto confiable,
39993
+ ion-button + input.click() programático falla en iOS PWA. -->
39994
+ <label
39995
+ class="rich-editor__image-btn"
39996
+ [class.rich-editor__image-btn--disabled]="uploadingImage()"
39997
+ [attr.aria-label]="t('image')"
39998
+ >
39999
+ @if (uploadingImage()) {
40000
+ <ion-spinner name="dots" />
40001
+ } @else {
40002
+ <ion-icon name="image-outline" />
40003
+ }
40004
+ <input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
40005
+ </label>
40006
+ </div>
40007
+ }
40008
+ <div #editorHost class="rich-editor__surface"></div>
40009
+ </div>
40010
+ `, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__image-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 4px;border-radius:6px;color:var(--ion-color-dark, #232323);font-size:1.125rem;cursor:pointer}.rich-editor__image-btn:hover{background:#0000000f}.rich-editor__image-btn--disabled{opacity:.5;pointer-events:none}.rich-editor__image-btn input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"] }]
40011
+ }], ctorParameters: () => [], propDecorators: { props: [{
40012
+ type: Input
40013
+ }], articleChange: [{
40014
+ type: Output
40015
+ }], editorHost: [{
40016
+ type: ViewChild,
40017
+ args: ['editorHost', { static: true }]
40018
+ }] } });
40019
+
39406
40020
  /**
39407
40021
  * val-banner
39408
40022
  *
@@ -90377,5 +90991,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
90377
90991
  * Generated bundle index. Do not edit.
90378
90992
  */
90379
90993
 
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 };
90994
+ 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, RichEditorComponent, 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, articleToTiptapDoc, 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, tiptapDocToArticle, tiptapDocToArticleElements, toArticle, validateQrBrand, validateRoutes };
90381
90995
  //# sourceMappingURL=valtech-components.mjs.map