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.
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Conversión inversa de `tiptapDocToArticle` — hidrata `val-rich-editor` con
3
+ * contenido ya guardado como `ArticleMetadata` (ej. una receta existente que
4
+ * se vuelve a editar). No es un round-trip perfecto: `ArticleElement` cubre
5
+ * tipos que TipTap no tiene nodo nativo para editar (`note`, `diagram`,
6
+ * `command`, `highlight`, `button`, `video`, `custom`) — esos se degradan a
7
+ * un párrafo de texto plano, editable pero sin su formato especial. Es
8
+ * intencional: mejor mostrar el contenido (aunque simplificado) que perderlo
9
+ * o que el editor rechace abrir el documento.
10
+ */
11
+ const STRONG_OR_EM = /<(strong|b|em|i|code)>(.*?)<\/\1>/g;
12
+ /** Extrae marks (bold/italic/code) de un string con <strong>/<em>/<code>
13
+ * embebido — el inverso de `inlineText` en tiptap-to-article.ts. Simplifica
14
+ * a un solo nivel de anidación (suficiente para lo que el editor produce). */
15
+ function textToTiptapInline(html) {
16
+ if (!html)
17
+ return [];
18
+ const nodes = [];
19
+ let lastIndex = 0;
20
+ STRONG_OR_EM.lastIndex = 0;
21
+ let match;
22
+ const markFor = (tag) => {
23
+ if (tag === 'strong' || tag === 'b')
24
+ return { type: 'bold' };
25
+ if (tag === 'em' || tag === 'i')
26
+ return { type: 'italic' };
27
+ return { type: 'code' };
28
+ };
29
+ while ((match = STRONG_OR_EM.exec(html)) !== null) {
30
+ if (match.index > lastIndex) {
31
+ nodes.push({ type: 'text', text: html.slice(lastIndex, match.index) });
32
+ }
33
+ nodes.push({ type: 'text', text: match[2], marks: [markFor(match[1])] });
34
+ lastIndex = match.index + match[0].length;
35
+ }
36
+ if (lastIndex < html.length) {
37
+ nodes.push({ type: 'text', text: html.slice(lastIndex) });
38
+ }
39
+ return nodes.length ? nodes : [{ type: 'text', text: html }];
40
+ }
41
+ function paragraph(text) {
42
+ return { type: 'paragraph', content: textToTiptapInline(text) };
43
+ }
44
+ function elementToTiptapNodes(el) {
45
+ switch (el.type) {
46
+ case 'title':
47
+ case 'subtitle': {
48
+ const level = el.type === 'title' ? (el.props.size === 'large' ? 1 : 2) : 3;
49
+ return [
50
+ {
51
+ type: 'heading',
52
+ attrs: { level },
53
+ content: textToTiptapInline(el.props.content ?? ''),
54
+ },
55
+ ];
56
+ }
57
+ case 'text':
58
+ case 'paragraph':
59
+ return [paragraph(el.props.content ?? '')];
60
+ case 'list':
61
+ return [
62
+ {
63
+ type: el.props.listType === 'ordered' ? 'orderedList' : 'bulletList',
64
+ content: el.props.items.map(item => ({
65
+ type: 'listItem',
66
+ content: [paragraph(item.text)],
67
+ })),
68
+ },
69
+ ];
70
+ case 'quote':
71
+ return [
72
+ {
73
+ type: 'blockquote',
74
+ content: [paragraph(el.props.content ?? '')],
75
+ },
76
+ ];
77
+ case 'code':
78
+ return [
79
+ {
80
+ type: 'codeBlock',
81
+ attrs: el.props.language ? { language: el.props.language } : undefined,
82
+ content: el.props.code ? [{ type: 'text', text: el.props.code }] : [],
83
+ },
84
+ ];
85
+ case 'separator':
86
+ return [{ type: 'horizontalRule' }];
87
+ case 'image':
88
+ return [
89
+ {
90
+ type: 'image',
91
+ attrs: { src: el.props.src, alt: el.props.alt, title: el.props.title },
92
+ },
93
+ ];
94
+ // Sin nodo TipTap nativo — se degrada a párrafo de texto plano (ver
95
+ // comentario del módulo). El contenido nunca se pierde, solo su formato.
96
+ case 'note':
97
+ return [paragraph(el.props.text ?? '')];
98
+ case 'highlight':
99
+ return [paragraph(el.props.content ?? '')];
100
+ default:
101
+ return [];
102
+ }
103
+ }
104
+ export function articleToTiptapDoc(article) {
105
+ return {
106
+ type: 'doc',
107
+ content: article.elements.flatMap(elementToTiptapNodes),
108
+ };
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWNsZS10by10aXB0YXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL3JpY2gtZWRpdG9yL2FydGljbGUtdG8tdGlwdGFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBOzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sWUFBWSxHQUFHLG9DQUFvQyxDQUFDO0FBRTFEOzs4RUFFOEU7QUFDOUUsU0FBUyxrQkFBa0IsQ0FBQyxJQUFZO0lBQ3RDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDckIsTUFBTSxLQUFLLEdBQWlCLEVBQUUsQ0FBQztJQUMvQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbEIsWUFBWSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDM0IsSUFBSSxLQUE2QixDQUFDO0lBRWxDLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBVyxFQUFvQixFQUFFO1FBQ2hELElBQUksR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLEtBQUssR0FBRztZQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDN0QsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLEdBQUcsS0FBSyxHQUFHO1lBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUMsQ0FBQztJQUVGLE9BQU8sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2xELElBQUksS0FBSyxDQUFDLEtBQUssR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFD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QVEsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7S0FDeEQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcnRpY2xlRWxlbWVudCwgQXJ0aWNsZU1ldGFkYXRhIH0gZnJvbSAnLi4vYXJ0aWNsZS90eXBlcyc7XG5pbXBvcnQgeyBUaXB0YXBEb2MsIFRpcHRhcE5vZGUgfSBmcm9tICcuL3RpcHRhcC10by1hcnRpY2xlJztcblxuLyoqXG4gKiBDb252ZXJzacOzbiBpbnZlcnNhIGRlIGB0aXB0YXBEb2NUb0FydGljbGVgIOKAlCBoaWRyYXRhIGB2YWwtcmljaC1lZGl0b3JgIGNvblxuICogY29udGVuaWRvIHlhIGd1YXJkYWRvIGNvbW8gYEFydGljbGVNZXRhZGF0YWAgKGVqLiB1bmEgcmVjZXRhIGV4aXN0ZW50ZSBxdWVcbiAqIHNlIHZ1ZWx2ZSBhIGVkaXRhcikuIE5vIGVzIHVuIHJvdW5kLXRyaXAgcGVyZmVjdG86IGBBcnRpY2xlRWxlbWVudGAgY3VicmVcbiAqIHRpcG9zIHF1ZSBUaXBUYXAgbm8gdGllbmUgbm9kbyBuYXRpdm8gcGFyYSBlZGl0YXIgKGBub3RlYCwgYGRpYWdyYW1gLFxuICogYGNvbW1hbmRgLCBgaGlnaGxpZ2h0YCwgYGJ1dHRvbmAsIGB2aWRlb2AsIGBjdXN0b21gKSDigJQgZXNvcyBzZSBkZWdyYWRhbiBhXG4gKiB1biBww6FycmFmbyBkZSB0ZXh0byBwbGFubywgZWRpdGFibGUgcGVybyBzaW4gc3UgZm9ybWF0byBlc3BlY2lhbC4gRXNcbiAqIGludGVuY2lvbmFsOiBtZWpvciBtb3N0cmFyIGVsIGNvbnRlbmlkbyAoYXVucXVlIHNpbXBsaWZpY2FkbykgcXVlIHBlcmRlcmxvXG4gKiBvIHF1ZSBlbCBlZGl0b3IgcmVjaGFjZSBhYnJpciBlbCBkb2N1bWVudG8uXG4gKi9cblxuY29uc3QgU1RST05HX09SX0VNID0gLzwoc3Ryb25nfGJ8ZW18aXxjb2RlKT4oLio/KTxcXC9cXDE+L2c7XG5cbi8qKiBFeHRyYWUgbWFya3MgKGJvbGQvaXRhbGljL2NvZGUpIGRlIHVuIHN0cmluZyBjb24gPHN0cm9uZz4vPGVtPi88Y29kZT5cbiAqIGVtYmViaWRvIOKAlCBlbCBpbnZlcnNvIGRlIGBpbmxpbmVUZXh0YCBlbiB0aXB0YXAtdG8tYXJ0aWNsZS50cy4gU2ltcGxpZmljYVxuICogYSB1biBzb2xvIG5pdmVsIGRlIGFuaWRhY2nDs24gKHN1ZmljaWVudGUgcGFyYSBsbyBxdWUgZWwgZWRpdG9yIHByb2R1Y2UpLiAqL1xuZnVuY3Rpb24gdGV4dFRvVGlwdGFwSW5saW5lKGh0bWw6IHN0cmluZyk6IFRpcHRhcE5vZGVbXSB7XG4gIGlmICghaHRtbCkgcmV0dXJuIFtdO1xuICBjb25zdCBub2RlczogVGlwdGFwTm9kZVtdID0gW107XG4gIGxldCBsYXN0SW5kZXggPSAwO1xuICBTVFJPTkdfT1JfRU0ubGFzdEluZGV4ID0gMDtcbiAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuXG4gIGNvbnN0IG1hcmtGb3IgPSAodGFnOiBzdHJpbmcpOiB7IHR5cGU6IHN0cmluZyB9ID0+IHtcbiAgICBpZiAodGFnID09PSAnc3Ryb25nJyB8fCB0YWcgPT09ICdiJykgcmV0dXJuIHsgdHlwZTogJ2JvbGQnIH07XG4gICAgaWYgKHRhZyA9PT0gJ2VtJyB8fCB0YWcgPT09ICdpJykgcmV0dXJuIHsgdHlwZTogJ2l0YWxpYycgfTtcbiAgICByZXR1cm4geyB0eXBlOiAnY29kZScgfTtcbiAgfTtcblxuICB3aGlsZSAoKG1hdGNoID0gU1RST05HX09SX0VNLmV4ZWMoaHRtbCkpICE9PSBudWxsKSB7XG4gICAgaWYgKG1hdGNoLmluZGV4ID4gbGFzdEluZGV4KSB7XG4gICAgICBub2Rlcy5wdXNoKHsgdHlwZTogJ3RleHQnLCB0ZXh0OiBodG1sLnNsaWNlKGxhc3RJbmRleCwgbWF0Y2guaW5kZXgpIH0pO1xuICAgIH1cbiAgICBub2Rlcy5wdXNoKHsgdHlwZTogJ3RleHQnLCB0ZXh0OiBtYXRjaFsyXSwgbWFya3M6IFttYXJrRm9yKG1hdGNoWzFdKV0gfSk7XG4gICAgbGFzdEluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gIH1cbiAgaWYgKGxhc3RJbmRleCA8IGh0bWwubGVuZ3RoKSB7XG4gICAgbm9kZXMucHVzaCh7IHR5cGU6ICd0ZXh0JywgdGV4dDogaHRtbC5zbGljZShsYXN0SW5kZXgpIH0pO1xuICB9XG4gIHJldHVybiBub2Rlcy5sZW5ndGggPyBub2RlcyA6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogaHRtbCB9XTtcbn1cblxuZnVuY3Rpb24gcGFyYWdyYXBoKHRleHQ6IHN0cmluZyk6IFRpcHRhcE5vZGUge1xuICByZXR1cm4geyB0eXBlOiAncGFyYWdyYXBoJywgY29udGVudDogdGV4dFRvVGlwdGFwSW5saW5lKHRleHQpIH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRUb1RpcHRhcE5vZGVzKGVsOiBBcnRpY2xlRWxlbWVudCk6IFRpcHRhcE5vZGVbXSB7XG4gIHN3aXRjaCAoZWwudHlwZSkge1xuICAgIGNhc2UgJ3RpdGxlJzpcbiAgICBjYXNlICdzdWJ0aXRsZSc6IHtcbiAgICAgIGNvbnN0IGxldmVsID0gZWwudHlwZSA9PT0gJ3RpdGxlJyA/IChlbC5wcm9wcy5zaXplID09PSAnbGFyZ2UnID8gMSA6IDIpIDogMztcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnaGVhZGluZycsXG4gICAgICAgICAgYXR0cnM6IHsgbGV2ZWwgfSxcbiAgICAgICAgICBjb250ZW50OiB0ZXh0VG9UaXB0YXBJbmxpbmUoZWwucHJvcHMuY29udGVudCA/PyAnJyksXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICBjYXNlICd0ZXh0JzpcbiAgICBjYXNlICdwYXJhZ3JhcGgnOlxuICAgICAgcmV0dXJuIFtwYXJhZ3JhcGgoZWwucHJvcHMuY29udGVudCA/PyAnJyldO1xuICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IGVsLnByb3BzLmxpc3RUeXBlID09PSAnb3JkZXJlZCcgPyAnb3JkZXJlZExpc3QnIDogJ2J1bGxldExpc3QnLFxuICAgICAgICAgIGNvbnRlbnQ6IGVsLnByb3BzLml0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgICB0eXBlOiAnbGlzdEl0ZW0nLFxuICAgICAgICAgICAgY29udGVudDogW3BhcmFncmFwaChpdGVtLnRleHQpXSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIGNhc2UgJ3F1b3RlJzpcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYmxvY2txdW90ZScsXG4gICAgICAgICAgY29udGVudDogW3BhcmFncmFwaChlbC5wcm9wcy5jb250ZW50ID8/ICcnKV0sXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIGNhc2UgJ2NvZGUnOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdjb2RlQmxvY2snLFxuICAgICAgICAgIGF0dHJzOiBlbC5wcm9wcy5sYW5ndWFnZSA/IHsgbGFuZ3VhZ2U6IGVsLnByb3BzLmxhbmd1YWdlIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29udGVudDogZWwucHJvcHMuY29kZSA/IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogZWwucHJvcHMuY29kZSB9XSA6IFtdLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICBjYXNlICdzZXBhcmF0b3InOlxuICAgICAgcmV0dXJuIFt7IHR5cGU6ICdob3Jpem9udGFsUnVsZScgfV07XG4gICAgY2FzZSAnaW1hZ2UnOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgICAgYXR0cnM6IHsgc3JjOiBlbC5wcm9wcy5zcmMsIGFsdDogZWwucHJvcHMuYWx0LCB0aXRsZTogZWwucHJvcHMudGl0bGUgfSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgLy8gU2luIG5vZG8gVGlwVGFwIG5hdGl2byDigJQgc2UgZGVncmFkYSBhIHDDoXJyYWZvIGRlIHRleHRvIHBsYW5vICh2ZXJcbiAgICAvLyBjb21lbnRhcmlvIGRlbCBtw7NkdWxvKS4gRWwgY29udGVuaWRvIG51bmNhIHNlIHBpZXJkZSwgc29sbyBzdSBmb3JtYXRvLlxuICAgIGNhc2UgJ25vdGUnOlxuICAgICAgcmV0dXJuIFtwYXJhZ3JhcGgoZWwucHJvcHMudGV4dCA/PyAnJyldO1xuICAgIGNhc2UgJ2hpZ2hsaWdodCc6XG4gICAgICByZXR1cm4gW3BhcmFncmFwaChlbC5wcm9wcy5jb250ZW50ID8/ICcnKV07XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJ0aWNsZVRvVGlwdGFwRG9jKGFydGljbGU6IEFydGljbGVNZXRhZGF0YSk6IFRpcHRhcERvYyB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2RvYycsXG4gICAgY29udGVudDogYXJ0aWNsZS5lbGVtZW50cy5mbGF0TWFwKGVsZW1lbnRUb1RpcHRhcE5vZGVzKSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,350 @@
1
+ import { Component, EventEmitter, Injector, Input, Output, ViewChild, inject, signal, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { IonButton, IonIcon, IonSpinner } from '@ionic/angular/standalone';
4
+ import { addIcons } from 'ionicons';
5
+ import { chatboxOutline, imageOutline, listOutline, removeOutline } from 'ionicons/icons';
6
+ import { Editor } from '@tiptap/core';
7
+ import StarterKit from '@tiptap/starter-kit';
8
+ import Image from '@tiptap/extension-image';
9
+ import { I18nService } from '../../../services/i18n';
10
+ import { StorageService } from '../../../services/firebase/storage.service';
11
+ import { RICH_EDITOR_I18N } from './rich-editor.i18n';
12
+ import { tiptapDocToArticle } from './tiptap-to-article';
13
+ import { articleToTiptapDoc } from './article-to-tiptap';
14
+ import * as i0 from "@angular/core";
15
+ // Íconos de la toolbar. B/I/H2/H3 no tienen ícono Ionicons dedicado — se
16
+ // renderizan como texto ("B", "I", "H2", "H3") directo en el botón, mismo
17
+ // criterio que un editor de texto rico convencional (Google Docs, Notion).
18
+ addIcons({ listOutline, chatboxOutline, removeOutline, imageOutline });
19
+ /**
20
+ * val-rich-editor
21
+ *
22
+ * Organism: editor WYSIWYG reusable para toda la plataforma, sobre TipTap.
23
+ * Emite `ArticleMetadata` — el mismo contrato que `val-article` renderiza,
24
+ * que también producen Markdown (`parseMarkdownArticle`) y (a futuro) el
25
+ * page builder. El consumer nunca toca TipTap directamente.
26
+ *
27
+ * Cobertura de la toolbar v1: negrita, cursiva, título (H2), subtítulo (H3),
28
+ * lista con/sin viñetas, cita, separador, imagen. Ver `tiptap-to-article.ts`
29
+ * para qué tipos de `ArticleElement` puede producir el editor hoy.
30
+ *
31
+ * @example
32
+ * ```html
33
+ * <val-rich-editor
34
+ * [props]="{ initialValue: recipe.descriptionArticle, placeholder: 'Escribe la preparación...' }"
35
+ * (articleChange)="onArticleChange($event)"
36
+ * />
37
+ * ```
38
+ */
39
+ export class RichEditorComponent {
40
+ constructor() {
41
+ this.props = {};
42
+ this.articleChange = new EventEmitter();
43
+ this.i18n = inject(I18nService);
44
+ this.injector = inject(Injector);
45
+ /** Se recalcula en cada `onUpdate`/`onSelectionUpdate` para reflejar el
46
+ * mark/nodo activo bajo el cursor (ej. el botón "B" resaltado si el
47
+ * cursor está dentro de texto en negrita). */
48
+ this._toolbarTick = signal(0);
49
+ this.toolbarButtons = signal([]);
50
+ this.uploadingImage = signal(false);
51
+ this.i18n.registerDefaults('RichEditor', RICH_EDITOR_I18N);
52
+ }
53
+ t(key) {
54
+ return this.i18n.t(key, 'RichEditor');
55
+ }
56
+ ngAfterViewInit() {
57
+ this.editor = new Editor({
58
+ element: this.editorHost.nativeElement,
59
+ extensions: [StarterKit, Image],
60
+ editable: !this.props.disabled,
61
+ content: this.props.initialValue
62
+ ? articleToTiptapDoc(this.props.initialValue)
63
+ : '',
64
+ editorProps: {
65
+ attributes: {
66
+ 'data-placeholder': this.props.placeholder ?? '',
67
+ },
68
+ },
69
+ onUpdate: ({ editor }) => {
70
+ this.emitArticle(editor.getJSON());
71
+ this.refreshToolbar();
72
+ },
73
+ onSelectionUpdate: () => this.refreshToolbar(),
74
+ });
75
+ this.refreshToolbar();
76
+ }
77
+ ngOnChanges(changes) {
78
+ if (changes['props']?.currentValue && this.editor) {
79
+ this.editor.setEditable(!this.props.disabled);
80
+ }
81
+ }
82
+ emitArticle(doc) {
83
+ this.articleChange.emit(tiptapDocToArticle(doc));
84
+ }
85
+ refreshToolbar() {
86
+ const editor = this.editor;
87
+ if (!editor)
88
+ return;
89
+ this.toolbarButtons.set([
90
+ {
91
+ token: 'bold',
92
+ icon: '',
93
+ label: this.t('bold'),
94
+ isActive: editor.isActive('bold'),
95
+ disabled: false,
96
+ },
97
+ {
98
+ token: 'italic',
99
+ icon: '',
100
+ label: this.t('italic'),
101
+ isActive: editor.isActive('italic'),
102
+ disabled: false,
103
+ },
104
+ {
105
+ token: 'heading2',
106
+ icon: '',
107
+ label: this.t('heading2'),
108
+ isActive: editor.isActive('heading', { level: 2 }),
109
+ disabled: false,
110
+ },
111
+ {
112
+ token: 'heading3',
113
+ icon: '',
114
+ label: this.t('heading3'),
115
+ isActive: editor.isActive('heading', { level: 3 }),
116
+ disabled: false,
117
+ },
118
+ {
119
+ token: 'bulletList',
120
+ icon: 'list-outline',
121
+ label: this.t('bulletList'),
122
+ isActive: editor.isActive('bulletList'),
123
+ disabled: false,
124
+ },
125
+ {
126
+ token: 'orderedList',
127
+ icon: 'list-outline',
128
+ label: this.t('orderedList'),
129
+ isActive: editor.isActive('orderedList'),
130
+ disabled: false,
131
+ },
132
+ {
133
+ token: 'quote',
134
+ icon: 'chatbox-outline',
135
+ label: this.t('quote'),
136
+ isActive: editor.isActive('blockquote'),
137
+ disabled: false,
138
+ },
139
+ {
140
+ token: 'separator',
141
+ icon: 'remove-outline',
142
+ label: this.t('separator'),
143
+ isActive: false,
144
+ disabled: false,
145
+ },
146
+ ]);
147
+ }
148
+ runCommand(token) {
149
+ const editor = this.editor;
150
+ if (!editor)
151
+ return;
152
+ const chain = editor.chain().focus();
153
+ switch (token) {
154
+ case 'bold':
155
+ chain.toggleBold().run();
156
+ break;
157
+ case 'italic':
158
+ chain.toggleItalic().run();
159
+ break;
160
+ case 'heading2':
161
+ chain.toggleHeading({ level: 2 }).run();
162
+ break;
163
+ case 'heading3':
164
+ chain.toggleHeading({ level: 3 }).run();
165
+ break;
166
+ case 'bulletList':
167
+ chain.toggleBulletList().run();
168
+ break;
169
+ case 'orderedList':
170
+ chain.toggleOrderedList().run();
171
+ break;
172
+ case 'quote':
173
+ chain.toggleBlockquote().run();
174
+ break;
175
+ case 'separator':
176
+ chain.setHorizontalRule().run();
177
+ break;
178
+ }
179
+ this.refreshToolbar();
180
+ }
181
+ /**
182
+ * Sube la imagen elegida vía `StorageService` (Regla #12 — nunca URL pegada
183
+ * a mano, siempre vía Storage) y la inserta en el punto del cursor.
184
+ * `StorageService` se resuelve perezosamente (vía `Injector`, no como
185
+ * campo de la clase): si la app consumer no configuró
186
+ * `provideValtechFirebase`, el editor sigue funcionando normal para todo
187
+ * lo demás — solo el botón de imagen queda sin efecto, con log de error en
188
+ * vez de romper el resto del componente.
189
+ */
190
+ async onImageSelected(event) {
191
+ const input = event.target;
192
+ const file = input.files?.[0];
193
+ input.value = ''; // permite re-seleccionar el mismo archivo después
194
+ if (!file || !this.editor)
195
+ return;
196
+ this.uploadingImage.set(true);
197
+ try {
198
+ const storage = this.injector.get(StorageService);
199
+ const path = `rich-editor/${Date.now()}-${file.name}`;
200
+ const result = await storage.uploadAndGetUrl(path, file);
201
+ this.editor.chain().focus().setImage({ src: result.downloadUrl, alt: file.name }).run();
202
+ this.emitArticle(this.editor.getJSON());
203
+ }
204
+ catch (err) {
205
+ console.error('[val-rich-editor] No se pudo subir la imagen — ¿la app configuró provideValtechFirebase?', err);
206
+ }
207
+ finally {
208
+ this.uploadingImage.set(false);
209
+ }
210
+ }
211
+ ngOnDestroy() {
212
+ this.editor?.destroy();
213
+ }
214
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
215
+ 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: `
216
+ <div class="rich-editor" [class.rich-editor--disabled]="props.disabled">
217
+ @if (!props.disabled) {
218
+ <div class="rich-editor__toolbar" role="toolbar">
219
+ @for (btn of toolbarButtons(); track btn.token) {
220
+ <ion-button
221
+ fill="clear"
222
+ size="small"
223
+ [class.rich-editor__btn--active]="btn.isActive"
224
+ [disabled]="btn.disabled"
225
+ [attr.aria-label]="btn.label"
226
+ [attr.aria-pressed]="btn.isActive"
227
+ (click)="runCommand(btn.token)"
228
+ >
229
+ @switch (btn.token) {
230
+ @case ('bold') {
231
+ <strong>B</strong>
232
+ }
233
+ @case ('italic') {
234
+ <em>I</em>
235
+ }
236
+ @case ('heading2') {
237
+ <strong>H2</strong>
238
+ }
239
+ @case ('heading3') {
240
+ <strong>H3</strong>
241
+ }
242
+ @case ('bulletList') {
243
+ <ion-icon name="list-outline" slot="icon-only" />
244
+ }
245
+ @case ('orderedList') {
246
+ <ion-icon name="list-outline" slot="icon-only" />
247
+ }
248
+ @case ('quote') {
249
+ <ion-icon name="chatbox-outline" slot="icon-only" />
250
+ }
251
+ @case ('separator') {
252
+ <ion-icon name="remove-outline" slot="icon-only" />
253
+ }
254
+ }
255
+ </ion-button>
256
+ }
257
+ <!-- Label trick (mismo patrón que val-attachment-uploader): el
258
+ <label> nativo reenvía el clic al input como gesto confiable,
259
+ ion-button + input.click() programático falla en iOS PWA. -->
260
+ <label
261
+ class="rich-editor__image-btn"
262
+ [class.rich-editor__image-btn--disabled]="uploadingImage()"
263
+ [attr.aria-label]="t('image')"
264
+ >
265
+ @if (uploadingImage()) {
266
+ <ion-spinner name="dots" />
267
+ } @else {
268
+ <ion-icon name="image-outline" />
269
+ }
270
+ <input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
271
+ </label>
272
+ </div>
273
+ }
274
+ <div #editorHost class="rich-editor__surface"></div>
275
+ </div>
276
+ `, 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"] }] }); }
277
+ }
278
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichEditorComponent, decorators: [{
279
+ type: Component,
280
+ args: [{ selector: 'val-rich-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon, IonSpinner], template: `
281
+ <div class="rich-editor" [class.rich-editor--disabled]="props.disabled">
282
+ @if (!props.disabled) {
283
+ <div class="rich-editor__toolbar" role="toolbar">
284
+ @for (btn of toolbarButtons(); track btn.token) {
285
+ <ion-button
286
+ fill="clear"
287
+ size="small"
288
+ [class.rich-editor__btn--active]="btn.isActive"
289
+ [disabled]="btn.disabled"
290
+ [attr.aria-label]="btn.label"
291
+ [attr.aria-pressed]="btn.isActive"
292
+ (click)="runCommand(btn.token)"
293
+ >
294
+ @switch (btn.token) {
295
+ @case ('bold') {
296
+ <strong>B</strong>
297
+ }
298
+ @case ('italic') {
299
+ <em>I</em>
300
+ }
301
+ @case ('heading2') {
302
+ <strong>H2</strong>
303
+ }
304
+ @case ('heading3') {
305
+ <strong>H3</strong>
306
+ }
307
+ @case ('bulletList') {
308
+ <ion-icon name="list-outline" slot="icon-only" />
309
+ }
310
+ @case ('orderedList') {
311
+ <ion-icon name="list-outline" slot="icon-only" />
312
+ }
313
+ @case ('quote') {
314
+ <ion-icon name="chatbox-outline" slot="icon-only" />
315
+ }
316
+ @case ('separator') {
317
+ <ion-icon name="remove-outline" slot="icon-only" />
318
+ }
319
+ }
320
+ </ion-button>
321
+ }
322
+ <!-- Label trick (mismo patrón que val-attachment-uploader): el
323
+ <label> nativo reenvía el clic al input como gesto confiable,
324
+ ion-button + input.click() programático falla en iOS PWA. -->
325
+ <label
326
+ class="rich-editor__image-btn"
327
+ [class.rich-editor__image-btn--disabled]="uploadingImage()"
328
+ [attr.aria-label]="t('image')"
329
+ >
330
+ @if (uploadingImage()) {
331
+ <ion-spinner name="dots" />
332
+ } @else {
333
+ <ion-icon name="image-outline" />
334
+ }
335
+ <input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
336
+ </label>
337
+ </div>
338
+ }
339
+ <div #editorHost class="rich-editor__surface"></div>
340
+ </div>
341
+ `, 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"] }]
342
+ }], ctorParameters: () => [], propDecorators: { props: [{
343
+ type: Input
344
+ }], articleChange: [{
345
+ type: Output
346
+ }], editorHost: [{
347
+ type: ViewChild,
348
+ args: ['editorHost', { static: true }]
349
+ }] } });
350
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9yaWNoLWVkaXRvci9yaWNoLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxLQUFLLE1BQU0seUJBQXlCLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUc1RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFHekQseUVBQXlFO0FBQ3pFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0UsUUFBUSxDQUFD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aWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uLCBJb25TcGlubmVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGNoYXRib3hPdXRsaW5lLCBpbWFnZU91dGxpbmUsIGxpc3RPdXRsaW5lLCByZW1vdmVPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnQHRpcHRhcC9jb3JlJztcbmltcG9ydCBTdGFydGVyS2l0IGZyb20gJ0B0aXB0YXAvc3RhcnRlci1raXQnO1xuaW1wb3J0IEltYWdlIGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWltYWdlJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmlyZWJhc2Uvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFydGljbGVNZXRhZGF0YSB9IGZyb20gJy4uL2FydGljbGUvdHlwZXMnO1xuaW1wb3J0IHsgUmljaEVkaXRvck1ldGFkYXRhLCBSaWNoRWRpdG9yVG9vbGJhckJ1dHRvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgUklDSF9FRElUT1JfSTE4TiB9IGZyb20gJy4vcmljaC1lZGl0b3IuaTE4bic7XG5pbXBvcnQgeyB0aXB0YXBEb2NUb0FydGljbGUgfSBmcm9tICcuL3RpcHRhcC10by1hcnRpY2xlJztcbmltcG9ydCB7IGFydGljbGVUb1RpcHRhcERvYyB9IGZyb20gJy4vYXJ0aWNsZS10by10aXB0YXAnO1xuaW1wb3J0IHR5cGUgeyBUaXB0YXBEb2MgfSBmcm9tICcuL3RpcHRhcC10by1hcnRpY2xlJztcblxuLy8gw41jb25vcyBkZSBsYSB0b29sYmFyLiBCL0kvSDIvSDMgbm8gdGllbmVuIMOtY29ubyBJb25pY29ucyBkZWRpY2FkbyDigJQgc2Vcbi8vIHJlbmRlcml6YW4gY29tbyB0ZXh0byAoXCJCXCIsIFwiSVwiLCBcIkgyXCIsIFwiSDNcIikgZGlyZWN0byBlbiBlbCBib3TDs24sIG1pc21vXG4vLyBjcml0ZXJpbyBxdWUgdW4gZWRpdG9yIGRlIHRleHRvIHJpY28gY29udmVuY2lvbmFsIChHb29nbGUgRG9jcywgTm90aW9uKS5cbmFkZEljb25zKHsgbGlzdE91dGxpbmUsIGNoYXRib3hPdXRsaW5lLCByZW1vdmVPdXRsaW5lLCBpbWFnZU91dGxpbmUgfSk7XG5cbi8qKlxuICogdmFsLXJpY2gtZWRpdG9yXG4gKlxuICogT3JnYW5pc206IGVkaXRvciBXWVNJV1lHIHJldXNhYmxlIHBhcmEgdG9kYSBsYSBwbGF0YWZvcm1hLCBzb2JyZSBUaXBUYXAuXG4gKiBFbWl0ZSBgQXJ0aWNsZU1ldGFkYXRhYCDigJQgZWwgbWlzbW8gY29udHJhdG8gcXVlIGB2YWwtYXJ0aWNsZWAgcmVuZGVyaXphLFxuICogcXVlIHRhbWJpw6luIHByb2R1Y2VuIE1hcmtkb3duIChgcGFyc2VNYXJrZG93bkFydGljbGVgKSB5IChhIGZ1dHVybykgZWxcbiAqIHBhZ2UgYnVpbGRlci4gRWwgY29uc3VtZXIgbnVuY2EgdG9jYSBUaXBUYXAgZGlyZWN0YW1lbnRlLlxuICpcbiAqIENvYmVydHVyYSBkZSBsYSB0b29sYmFyIHYxOiBuZWdyaXRhLCBjdXJzaXZhLCB0w610dWxvIChIMiksIHN1YnTDrXR1bG8gKEgzKSxcbiAqIGxpc3RhIGNvbi9zaW4gdmnDsWV0YXMsIGNpdGEsIHNlcGFyYWRvciwgaW1hZ2VuLiBWZXIgYHRpcHRhcC10by1hcnRpY2xlLnRzYFxuICogcGFyYSBxdcOpIHRpcG9zIGRlIGBBcnRpY2xlRWxlbWVudGAgcHVlZGUgcHJvZHVjaXIgZWwgZWRpdG9yIGhveS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHZhbC1yaWNoLWVkaXRvclxuICogICBbcHJvcHNdPVwieyBpbml0aWFsVmFsdWU6IHJlY2lwZS5kZXNjcmlwdGlvbkFydGljbGUsIHBsYWNlaG9sZGVyOiAnRXNjcmliZSBsYSBwcmVwYXJhY2nDs24uLi4nIH1cIlxuICogICAoYXJ0aWNsZUNoYW5nZSk9XCJvbkFydGljbGVDaGFuZ2UoJGV2ZW50KVwiXG4gKiAvPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1yaWNoLWVkaXRvcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIElvbkJ1dHRvbiwgSW9uSWNvbiwgSW9uU3Bpbm5lcl0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJpY2gtZWRpdG9yXCIgW2NsYXNzLnJpY2gtZWRpdG9yLS1kaXNhYmxlZF09XCJwcm9wcy5kaXNhYmxlZFwiPlxuICAgICAgQGlmICghcHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJpY2gtZWRpdG9yX190b29sYmFyXCIgcm9sZT1cInRvb2xiYXJcIj5cbiAgICAgICAgICBAZm9yIChidG4gb2YgdG9vbGJhckJ1dHRvbnMoKTsgdHJhY2sgYnRuLnRva2VuKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBbY2xhc3MucmljaC1lZGl0b3JfX2J0bi0tYWN0aXZlXT1cImJ0bi5pc0FjdGl2ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidG4uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImJ0bi5sYWJlbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJidG4uaXNBY3RpdmVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwicnVuQ29tbWFuZChidG4udG9rZW4pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQHN3aXRjaCAoYnRuLnRva2VuKSB7XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdib2xkJykge1xuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5CPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnaXRhbGljJykge1xuICAgICAgICAgICAgICAgICAgPGVtPkk8L2VtPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2hlYWRpbmcyJykge1xuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5IMjwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2hlYWRpbmczJykge1xuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5IMzwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2J1bGxldExpc3QnKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImxpc3Qtb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ29yZGVyZWRMaXN0Jykge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJsaXN0LW91dGxpbmVcIiBzbG90PVwiaWNvbi1vbmx5XCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdxdW90ZScpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hhdGJveC1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnc2VwYXJhdG9yJykge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJyZW1vdmUtb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8IS0tIExhYmVsIHRyaWNrIChtaXNtbyBwYXRyw7NuIHF1ZSB2YWwtYXR0YWNobWVudC11cGxvYWRlcik6IGVsXG4gICAgICAgICAgICAgICA8bGFiZWw+IG5hdGl2byByZWVudsOtYSBlbCBjbGljIGFsIGlucHV0IGNvbW8gZ2VzdG8gY29uZmlhYmxlLFxuICAgICAgICAgICAgICAgaW9uLWJ1dHRvbiArIGlucHV0LmNsaWNrKCkgcHJvZ3JhbcOhdGljbyBmYWxsYSBlbiBpT1MgUFdBLiAtLT5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwicmljaC1lZGl0b3JfX2ltYWdlLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MucmljaC1lZGl0b3JfX2ltYWdlLWJ0bi0tZGlzYWJsZWRdPVwidXBsb2FkaW5nSW1hZ2UoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2ltYWdlJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAodXBsb2FkaW5nSW1hZ2UoKSkge1xuICAgICAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImRvdHNcIiAvPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW1hZ2Utb3V0bGluZVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgW2Rpc2FibGVkXT1cInVwbG9hZGluZ0ltYWdlKClcIiAoY2hhbmdlKT1cIm9uSW1hZ2VTZWxlY3RlZCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgI2VkaXRvckhvc3QgY2xhc3M9XCJyaWNoLWVkaXRvcl9fc3VyZmFjZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vcmljaC1lZGl0b3IuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBSaWNoRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwcm9wczogUmljaEVkaXRvck1ldGFkYXRhID0ge307XG4gIEBPdXRwdXQoKSBhcnRpY2xlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnRpY2xlTWV0YWRhdGE+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZWRpdG9ySG9zdCcsIHsgc3RhdGljOiB0cnVlIH0pIGVkaXRvckhvc3QhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSBlZGl0b3I/OiBFZGl0b3I7XG5cbiAgLyoqIFNlIHJlY2FsY3VsYSBlbiBjYWRhIGBvblVwZGF0ZWAvYG9uU2VsZWN0aW9uVXBkYXRlYCBwYXJhIHJlZmxlamFyIGVsXG4gICAqIG1hcmsvbm9kbyBhY3Rpdm8gYmFqbyBlbCBjdXJzb3IgKGVqLiBlbCBib3TDs24gXCJCXCIgcmVzYWx0YWRvIHNpIGVsXG4gICAqIGN1cnNvciBlc3TDoSBkZW50cm8gZGUgdGV4dG8gZW4gbmVncml0YSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Rvb2xiYXJUaWNrID0gc2lnbmFsKDApO1xuICByZWFkb25seSB0b29sYmFyQnV0dG9ucyA9IHNpZ25hbDxSaWNoRWRpdG9yVG9vbGJhckJ1dHRvbltdPihbXSk7XG4gIHJlYWRvbmx5IHVwbG9hZGluZ0ltYWdlID0gc2lnbmFsKGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnUmljaEVkaXRvcicsIFJJQ0hfRURJVE9SX0kxOE4pO1xuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgJ1JpY2hFZGl0b3InKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvciA9IG5ldyBFZGl0b3Ioe1xuICAgICAgZWxlbWVudDogdGhpcy5lZGl0b3JIb3N0Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICBleHRlbnNpb25zOiBbU3RhcnRlcktpdCwgSW1hZ2VdLFxuICAgICAgZWRpdGFibGU6ICF0aGlzLnByb3BzLmRpc2FibGVkLFxuICAgICAgY29udGVudDogdGhpcy5wcm9wcy5pbml0aWFsVmFsdWVcbiAgICAgICAgPyAoYXJ0aWNsZVRvVGlwdGFwRG9jKHRoaXMucHJvcHMuaW5pdGlhbFZhbHVlKSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICA6ICcnLFxuICAgICAgZWRpdG9yUHJvcHM6IHtcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICdkYXRhLXBsYWNlaG9sZGVyJzogdGhpcy5wcm9wcy5wbGFjZWhvbGRlciA/PyAnJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZTogKHsgZWRpdG9yIH0pID0+IHtcbiAgICAgICAgdGhpcy5lbWl0QXJ0aWNsZShlZGl0b3IuZ2V0SlNPTigpIGFzIFRpcHRhcERvYyk7XG4gICAgICAgIHRoaXMucmVmcmVzaFRvb2xiYXIoKTtcbiAgICAgIH0sXG4gICAgICBvblNlbGVjdGlvblVwZGF0ZTogKCkgPT4gdGhpcy5yZWZyZXNoVG9vbGJhcigpLFxuICAgIH0pO1xuICAgIHRoaXMucmVmcmVzaFRvb2xiYXIoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sncHJvcHMnXT8uY3VycmVudFZhbHVlICYmIHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvci5zZXRFZGl0YWJsZSghdGhpcy5wcm9wcy5kaXNhYmxlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0QXJ0aWNsZShkb2M6IFRpcHRhcERvYyk6IHZvaWQge1xuICAgIHRoaXMuYXJ0aWNsZUNoYW5nZS5lbWl0KHRpcHRhcERvY1RvQXJ0aWNsZShkb2MpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFRvb2xiYXIoKTogdm9pZCB7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XG4gICAgaWYgKCFlZGl0b3IpIHJldHVybjtcbiAgICB0aGlzLnRvb2xiYXJCdXR0b25zLnNldChbXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnYm9sZCcsXG4gICAgICAgIGljb246ICcnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdib2xkJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2JvbGQnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdpdGFsaWMnLFxuICAgICAgICBpY29uOiAnJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnaXRhbGljJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2l0YWxpYycpLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2hlYWRpbmcyJyxcbiAgICAgICAgaWNvbjogJycsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ2hlYWRpbmcyJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2hlYWRpbmcnLCB7IGxldmVsOiAyIH0pLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2hlYWRpbmczJyxcbiAgICAgICAgaWNvbjogJycsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ2hlYWRpbmczJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2hlYWRpbmcnLCB7IGxldmVsOiAzIH0pLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2J1bGxldExpc3QnLFxuICAgICAgICBpY29uOiAnbGlzdC1vdXRsaW5lJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnYnVsbGV0TGlzdCcpLFxuICAgICAgICBpc0FjdGl2ZTogZWRpdG9yLmlzQWN0aXZlKCdidWxsZXRMaXN0JyksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnb3JkZXJlZExpc3QnLFxuICAgICAgICBpY29uOiAnbGlzdC1vdXRsaW5lJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnb3JkZXJlZExpc3QnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnb3JkZXJlZExpc3QnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdxdW90ZScsXG4gICAgICAgIGljb246ICdjaGF0Ym94LW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdxdW90ZScpLFxuICAgICAgICBpc0FjdGl2ZTogZWRpdG9yLmlzQWN0aXZlKCdibG9ja3F1b3RlJyksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnc2VwYXJhdG9yJyxcbiAgICAgICAgaWNvbjogJ3JlbW92ZS1vdXRsaW5lJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnc2VwYXJhdG9yJyksXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHJ1bkNvbW1hbmQodG9rZW46IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xuICAgIGlmICghZWRpdG9yKSByZXR1cm47XG4gICAgY29uc3QgY2hhaW4gPSBlZGl0b3IuY2hhaW4oKS5mb2N1cygpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ2JvbGQnOlxuICAgICAgICBjaGFpbi50b2dnbGVCb2xkKCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaXRhbGljJzpcbiAgICAgICAgY2hhaW4udG9nZ2xlSXRhbGljKCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaGVhZGluZzInOlxuICAgICAgICBjaGFpbi50b2dnbGVIZWFkaW5nKHsgbGV2ZWw6IDIgfSkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaGVhZGluZzMnOlxuICAgICAgICBjaGFpbi50b2dnbGVIZWFkaW5nKHsgbGV2ZWw6IDMgfSkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYnVsbGV0TGlzdCc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUJ1bGxldExpc3QoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvcmRlcmVkTGlzdCc6XG4gICAgICAgIGNoYWluLnRvZ2dsZU9yZGVyZWRMaXN0KCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncXVvdGUnOlxuICAgICAgICBjaGFpbi50b2dnbGVCbG9ja3F1b3RlKCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VwYXJhdG9yJzpcbiAgICAgICAgY2hhaW4uc2V0SG9yaXpvbnRhbFJ1bGUoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaFRvb2xiYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJlIGxhIGltYWdlbiBlbGVnaWRhIHbDrWEgYFN0b3JhZ2VTZXJ2aWNlYCAoUmVnbGEgIzEyIOKAlCBudW5jYSBVUkwgcGVnYWRhXG4gICAqIGEgbWFubywgc2llbXByZSB2w61hIFN0b3JhZ2UpIHkgbGEgaW5zZXJ0YSBlbiBlbCBwdW50byBkZWwgY3Vyc29yLlxuICAgKiBgU3RvcmFnZVNlcnZpY2VgIHNlIHJlc3VlbHZlIHBlcmV6b3NhbWVudGUgKHbDrWEgYEluamVjdG9yYCwgbm8gY29tb1xuICAgKiBjYW1wbyBkZSBsYSBjbGFzZSk6IHNpIGxhIGFwcCBjb25zdW1lciBubyBjb25maWd1csOzXG4gICAqIGBwcm92aWRlVmFsdGVjaEZpcmViYXNlYCwgZWwgZWRpdG9yIHNpZ3VlIGZ1bmNpb25hbmRvIG5vcm1hbCBwYXJhIHRvZG9cbiAgICogbG8gZGVtw6FzIOKAlCBzb2xvIGVsIGJvdMOzbiBkZSBpbWFnZW4gcXVlZGEgc2luIGVmZWN0bywgY29uIGxvZyBkZSBlcnJvciBlblxuICAgKiB2ZXogZGUgcm9tcGVyIGVsIHJlc3RvIGRlbCBjb21wb25lbnRlLlxuICAgKi9cbiAgYXN5bmMgb25JbWFnZVNlbGVjdGVkKGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XG4gICAgaW5wdXQudmFsdWUgPSAnJzsgLy8gcGVybWl0ZSByZS1zZWxlY2Npb25hciBlbCBtaXNtbyBhcmNoaXZvIGRlc3B1w6lzXG4gICAgaWYgKCFmaWxlIHx8ICF0aGlzLmVkaXRvcikgcmV0dXJuO1xuXG4gICAgdGhpcy51cGxvYWRpbmdJbWFnZS5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmluamVjdG9yLmdldChTdG9yYWdlU2VydmljZSk7XG4gICAgICBjb25zdCBwYXRoID0gYHJpY2gtZWRpdG9yLyR7RGF0ZS5ub3coKX0tJHtmaWxlLm5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UudXBsb2FkQW5kR2V0VXJsKHBhdGgsIGZpbGUpO1xuICAgICAgdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnNldEltYWdlKHsgc3JjOiByZXN1bHQuZG93bmxvYWRVcmwsIGFsdDogZmlsZS5uYW1lIH0pLnJ1bigpO1xuICAgICAgdGhpcy5lbWl0QXJ0aWNsZSh0aGlzLmVkaXRvci5nZXRKU09OKCkgYXMgVGlwdGFwRG9jKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1t2YWwtcmljaC1lZGl0b3JdIE5vIHNlIHB1ZG8gc3ViaXIgbGEgaW1hZ2VuIOKAlCDCv2xhIGFwcCBjb25maWd1csOzIHByb3ZpZGVWYWx0ZWNoRmlyZWJhc2U/JywgZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy51cGxvYWRpbmdJbWFnZS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yPy5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Defaults i18n (es/en) del `val-rich-editor`. Auto-registrados en el
3
+ * constructor (namespace `RichEditor`) — el consumer nunca los registra.
4
+ */
5
+ export const RICH_EDITOR_I18N = {
6
+ es: {
7
+ bold: 'Negrita',
8
+ italic: 'Cursiva',
9
+ heading2: 'Título',
10
+ heading3: 'Subtítulo',
11
+ bulletList: 'Lista con viñetas',
12
+ orderedList: 'Lista numerada',
13
+ quote: 'Cita',
14
+ separator: 'Separador',
15
+ image: 'Insertar imagen',
16
+ },
17
+ en: {
18
+ bold: 'Bold',
19
+ italic: 'Italic',
20
+ heading2: 'Heading',
21
+ heading3: 'Subheading',
22
+ bulletList: 'Bullet list',
23
+ orderedList: 'Numbered list',
24
+ quote: 'Quote',
25
+ separator: 'Separator',
26
+ image: 'Insert image',
27
+ },
28
+ };
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC1lZGl0b3IuaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvcmljaC1lZGl0b3IvcmljaC1lZGl0b3IuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixFQUFFLEVBQUU7UUFDRixJQUFJLEVBQUUsU0FBUztRQUNmLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFFBQVEsRUFBRSxXQUFXO1FBQ3JCLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsV0FBVyxFQUFFLGdCQUFnQjtRQUM3QixLQUFLLEVBQUUsTUFBTTtRQUNiLFNBQVMsRUFBRSxXQUFXO1FBQ3RCLEtBQUssRUFBRSxpQkFBaUI7S0FDekI7SUFDRCxFQUFFLEVBQUU7UUFDRixJQUFJLEVBQUUsTUFBTTtRQUNaLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLFFBQVEsRUFBRSxZQUFZO1FBQ3RCLFVBQVUsRUFBRSxhQUFhO1FBQ3pCLFdBQVcsRUFBRSxlQUFlO1FBQzVCLEtBQUssRUFBRSxPQUFPO1FBQ2QsU0FBUyxFQUFFLFdBQVc7UUFDdEIsS0FBSyxFQUFFLGNBQWM7S0FDdEI7Q0FDTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWZhdWx0cyBpMThuIChlcy9lbikgZGVsIGB2YWwtcmljaC1lZGl0b3JgLiBBdXRvLXJlZ2lzdHJhZG9zIGVuIGVsXG4gKiBjb25zdHJ1Y3RvciAobmFtZXNwYWNlIGBSaWNoRWRpdG9yYCkg4oCUIGVsIGNvbnN1bWVyIG51bmNhIGxvcyByZWdpc3RyYS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJJQ0hfRURJVE9SX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgYm9sZDogJ05lZ3JpdGEnLFxuICAgIGl0YWxpYzogJ0N1cnNpdmEnLFxuICAgIGhlYWRpbmcyOiAnVMOtdHVsbycsXG4gICAgaGVhZGluZzM6ICdTdWJ0w610dWxvJyxcbiAgICBidWxsZXRMaXN0OiAnTGlzdGEgY29uIHZpw7FldGFzJyxcbiAgICBvcmRlcmVkTGlzdDogJ0xpc3RhIG51bWVyYWRhJyxcbiAgICBxdW90ZTogJ0NpdGEnLFxuICAgIHNlcGFyYXRvcjogJ1NlcGFyYWRvcicsXG4gICAgaW1hZ2U6ICdJbnNlcnRhciBpbWFnZW4nLFxuICB9LFxuICBlbjoge1xuICAgIGJvbGQ6ICdCb2xkJyxcbiAgICBpdGFsaWM6ICdJdGFsaWMnLFxuICAgIGhlYWRpbmcyOiAnSGVhZGluZycsXG4gICAgaGVhZGluZzM6ICdTdWJoZWFkaW5nJyxcbiAgICBidWxsZXRMaXN0OiAnQnVsbGV0IGxpc3QnLFxuICAgIG9yZGVyZWRMaXN0OiAnTnVtYmVyZWQgbGlzdCcsXG4gICAgcXVvdGU6ICdRdW90ZScsXG4gICAgc2VwYXJhdG9yOiAnU2VwYXJhdG9yJyxcbiAgICBpbWFnZTogJ0luc2VydCBpbWFnZScsXG4gIH0sXG59IGFzIGNvbnN0O1xuIl19