valtech-components 4.0.971 → 4.0.972

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,287 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild, inject, signal, } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { IonButton, IonIcon } from '@ionic/angular/standalone';
4
+ import { addIcons } from 'ionicons';
5
+ import { chatboxOutline, 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 { RICH_EDITOR_I18N } from './rich-editor.i18n';
11
+ import { tiptapDocToArticle } from './tiptap-to-article';
12
+ import { articleToTiptapDoc } from './article-to-tiptap';
13
+ import * as i0 from "@angular/core";
14
+ // Íconos de la toolbar. B/I/H2/H3 no tienen ícono Ionicons dedicado — se
15
+ // renderizan como texto ("B", "I", "H2", "H3") directo en el botón, mismo
16
+ // criterio que un editor de texto rico convencional (Google Docs, Notion).
17
+ addIcons({ listOutline, chatboxOutline, removeOutline });
18
+ /**
19
+ * val-rich-editor
20
+ *
21
+ * Organism: editor WYSIWYG reusable para toda la plataforma, sobre TipTap.
22
+ * Emite `ArticleMetadata` — el mismo contrato que `val-article` renderiza,
23
+ * que también producen Markdown (`parseMarkdownArticle`) y (a futuro) el
24
+ * page builder. El consumer nunca toca TipTap directamente.
25
+ *
26
+ * Cobertura de la toolbar v1: negrita, cursiva, título (H2), subtítulo (H3),
27
+ * lista con/sin viñetas, cita, separador, imagen. Ver `tiptap-to-article.ts`
28
+ * para qué tipos de `ArticleElement` puede producir el editor hoy.
29
+ *
30
+ * @example
31
+ * ```html
32
+ * <val-rich-editor
33
+ * [props]="{ initialValue: recipe.descriptionArticle, placeholder: 'Escribe la preparación...' }"
34
+ * (articleChange)="onArticleChange($event)"
35
+ * />
36
+ * ```
37
+ */
38
+ export class RichEditorComponent {
39
+ constructor() {
40
+ this.props = {};
41
+ this.articleChange = new EventEmitter();
42
+ this.i18n = inject(I18nService);
43
+ /** Se recalcula en cada `onUpdate`/`onSelectionUpdate` para reflejar el
44
+ * mark/nodo activo bajo el cursor (ej. el botón "B" resaltado si el
45
+ * cursor está dentro de texto en negrita). */
46
+ this._toolbarTick = signal(0);
47
+ this.toolbarButtons = signal([]);
48
+ this.i18n.registerDefaults('RichEditor', RICH_EDITOR_I18N);
49
+ }
50
+ t(key) {
51
+ return this.i18n.t(key, 'RichEditor');
52
+ }
53
+ ngAfterViewInit() {
54
+ this.editor = new Editor({
55
+ element: this.editorHost.nativeElement,
56
+ extensions: [StarterKit, Image],
57
+ editable: !this.props.disabled,
58
+ content: this.props.initialValue
59
+ ? articleToTiptapDoc(this.props.initialValue)
60
+ : '',
61
+ editorProps: {
62
+ attributes: {
63
+ 'data-placeholder': this.props.placeholder ?? '',
64
+ },
65
+ },
66
+ onUpdate: ({ editor }) => {
67
+ this.emitArticle(editor.getJSON());
68
+ this.refreshToolbar();
69
+ },
70
+ onSelectionUpdate: () => this.refreshToolbar(),
71
+ });
72
+ this.refreshToolbar();
73
+ }
74
+ ngOnChanges(changes) {
75
+ if (changes['props']?.currentValue && this.editor) {
76
+ this.editor.setEditable(!this.props.disabled);
77
+ }
78
+ }
79
+ emitArticle(doc) {
80
+ this.articleChange.emit(tiptapDocToArticle(doc));
81
+ }
82
+ refreshToolbar() {
83
+ const editor = this.editor;
84
+ if (!editor)
85
+ return;
86
+ this.toolbarButtons.set([
87
+ {
88
+ token: 'bold',
89
+ icon: '',
90
+ label: this.t('bold'),
91
+ isActive: editor.isActive('bold'),
92
+ disabled: false,
93
+ },
94
+ {
95
+ token: 'italic',
96
+ icon: '',
97
+ label: this.t('italic'),
98
+ isActive: editor.isActive('italic'),
99
+ disabled: false,
100
+ },
101
+ {
102
+ token: 'heading2',
103
+ icon: '',
104
+ label: this.t('heading2'),
105
+ isActive: editor.isActive('heading', { level: 2 }),
106
+ disabled: false,
107
+ },
108
+ {
109
+ token: 'heading3',
110
+ icon: '',
111
+ label: this.t('heading3'),
112
+ isActive: editor.isActive('heading', { level: 3 }),
113
+ disabled: false,
114
+ },
115
+ {
116
+ token: 'bulletList',
117
+ icon: 'list-outline',
118
+ label: this.t('bulletList'),
119
+ isActive: editor.isActive('bulletList'),
120
+ disabled: false,
121
+ },
122
+ {
123
+ token: 'orderedList',
124
+ icon: 'list-outline',
125
+ label: this.t('orderedList'),
126
+ isActive: editor.isActive('orderedList'),
127
+ disabled: false,
128
+ },
129
+ {
130
+ token: 'quote',
131
+ icon: 'chatbox-outline',
132
+ label: this.t('quote'),
133
+ isActive: editor.isActive('blockquote'),
134
+ disabled: false,
135
+ },
136
+ {
137
+ token: 'separator',
138
+ icon: 'remove-outline',
139
+ label: this.t('separator'),
140
+ isActive: false,
141
+ disabled: false,
142
+ },
143
+ ]);
144
+ }
145
+ runCommand(token) {
146
+ const editor = this.editor;
147
+ if (!editor)
148
+ return;
149
+ const chain = editor.chain().focus();
150
+ switch (token) {
151
+ case 'bold':
152
+ chain.toggleBold().run();
153
+ break;
154
+ case 'italic':
155
+ chain.toggleItalic().run();
156
+ break;
157
+ case 'heading2':
158
+ chain.toggleHeading({ level: 2 }).run();
159
+ break;
160
+ case 'heading3':
161
+ chain.toggleHeading({ level: 3 }).run();
162
+ break;
163
+ case 'bulletList':
164
+ chain.toggleBulletList().run();
165
+ break;
166
+ case 'orderedList':
167
+ chain.toggleOrderedList().run();
168
+ break;
169
+ case 'quote':
170
+ chain.toggleBlockquote().run();
171
+ break;
172
+ case 'separator':
173
+ chain.setHorizontalRule().run();
174
+ break;
175
+ }
176
+ this.refreshToolbar();
177
+ }
178
+ ngOnDestroy() {
179
+ this.editor?.destroy();
180
+ }
181
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
182
+ 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: `
183
+ <div class="rich-editor" [class.rich-editor--disabled]="props.disabled">
184
+ @if (!props.disabled) {
185
+ <div class="rich-editor__toolbar" role="toolbar">
186
+ @for (btn of toolbarButtons(); track btn.token) {
187
+ <ion-button
188
+ fill="clear"
189
+ size="small"
190
+ [class.rich-editor__btn--active]="btn.isActive"
191
+ [disabled]="btn.disabled"
192
+ [attr.aria-label]="btn.label"
193
+ [attr.aria-pressed]="btn.isActive"
194
+ (click)="runCommand(btn.token)"
195
+ >
196
+ @switch (btn.token) {
197
+ @case ('bold') {
198
+ <strong>B</strong>
199
+ }
200
+ @case ('italic') {
201
+ <em>I</em>
202
+ }
203
+ @case ('heading2') {
204
+ <strong>H2</strong>
205
+ }
206
+ @case ('heading3') {
207
+ <strong>H3</strong>
208
+ }
209
+ @case ('bulletList') {
210
+ <ion-icon name="list-outline" slot="icon-only" />
211
+ }
212
+ @case ('orderedList') {
213
+ <ion-icon name="list-outline" slot="icon-only" />
214
+ }
215
+ @case ('quote') {
216
+ <ion-icon name="chatbox-outline" slot="icon-only" />
217
+ }
218
+ @case ('separator') {
219
+ <ion-icon name="remove-outline" slot="icon-only" />
220
+ }
221
+ }
222
+ </ion-button>
223
+ }
224
+ </div>
225
+ }
226
+ <div #editorHost class="rich-editor__surface"></div>
227
+ </div>
228
+ `, 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__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"] }] }); }
229
+ }
230
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichEditorComponent, decorators: [{
231
+ type: Component,
232
+ args: [{ selector: 'val-rich-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon], template: `
233
+ <div class="rich-editor" [class.rich-editor--disabled]="props.disabled">
234
+ @if (!props.disabled) {
235
+ <div class="rich-editor__toolbar" role="toolbar">
236
+ @for (btn of toolbarButtons(); track btn.token) {
237
+ <ion-button
238
+ fill="clear"
239
+ size="small"
240
+ [class.rich-editor__btn--active]="btn.isActive"
241
+ [disabled]="btn.disabled"
242
+ [attr.aria-label]="btn.label"
243
+ [attr.aria-pressed]="btn.isActive"
244
+ (click)="runCommand(btn.token)"
245
+ >
246
+ @switch (btn.token) {
247
+ @case ('bold') {
248
+ <strong>B</strong>
249
+ }
250
+ @case ('italic') {
251
+ <em>I</em>
252
+ }
253
+ @case ('heading2') {
254
+ <strong>H2</strong>
255
+ }
256
+ @case ('heading3') {
257
+ <strong>H3</strong>
258
+ }
259
+ @case ('bulletList') {
260
+ <ion-icon name="list-outline" slot="icon-only" />
261
+ }
262
+ @case ('orderedList') {
263
+ <ion-icon name="list-outline" slot="icon-only" />
264
+ }
265
+ @case ('quote') {
266
+ <ion-icon name="chatbox-outline" slot="icon-only" />
267
+ }
268
+ @case ('separator') {
269
+ <ion-icon name="remove-outline" slot="icon-only" />
270
+ }
271
+ }
272
+ </ion-button>
273
+ }
274
+ </div>
275
+ }
276
+ <div #editorHost class="rich-editor__surface"></div>
277
+ </div>
278
+ `, 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__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"] }]
279
+ }], ctorParameters: () => [], propDecorators: { props: [{
280
+ type: Input
281
+ }], articleChange: [{
282
+ type: Output
283
+ }], editorHost: [{
284
+ type: ViewChild,
285
+ args: ['editorHost', { static: true }]
286
+ }] } });
287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9yaWNoLWVkaXRvci9yaWNoLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxLQUFLLE1BQU0seUJBQXlCLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUd6RCx5RUFBeUU7QUFDekUsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSxRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7QUFFekQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0Ft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Z0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMvQixNQUFNO1lBQ1IsS0FBSyxXQUFXO2dCQUNkLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNoQyxNQUFNO1FBQ1YsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQzsrR0F6SlUsbUJBQW1CO21HQUFuQixtQkFBbUIsaVNBakRwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThDVCw2c0RBL0NTLFlBQVksK0JBQUUsU0FBUyxvUEFBRSxPQUFPOzs0RkFrRC9CLG1CQUFtQjtrQkFyRC9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsWUFDakM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q1Q7d0RBSVEsS0FBSztzQkFBYixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBRW9DLFVBQVU7c0JBQXBELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGNoYXRib3hPdXRsaW5lLCBsaXN0T3V0bGluZSwgcmVtb3ZlT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJ0B0aXB0YXAvY29yZSc7XG5pbXBvcnQgU3RhcnRlcktpdCBmcm9tICdAdGlwdGFwL3N0YXJ0ZXIta2l0JztcbmltcG9ydCBJbWFnZSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1pbWFnZSc7XG5cbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBBcnRpY2xlTWV0YWRhdGEgfSBmcm9tICcuLi9hcnRpY2xlL3R5cGVzJztcbmltcG9ydCB7IFJpY2hFZGl0b3JNZXRhZGF0YSwgUmljaEVkaXRvclRvb2xiYXJCdXR0b24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFJJQ0hfRURJVE9SX0kxOE4gfSBmcm9tICcuL3JpY2gtZWRpdG9yLmkxOG4nO1xuaW1wb3J0IHsgdGlwdGFwRG9jVG9BcnRpY2xlIH0gZnJvbSAnLi90aXB0YXAtdG8tYXJ0aWNsZSc7XG5pbXBvcnQgeyBhcnRpY2xlVG9UaXB0YXBEb2MgfSBmcm9tICcuL2FydGljbGUtdG8tdGlwdGFwJztcbmltcG9ydCB0eXBlIHsgVGlwdGFwRG9jIH0gZnJvbSAnLi90aXB0YXAtdG8tYXJ0aWNsZSc7XG5cbi8vIMONY29ub3MgZGUgbGEgdG9vbGJhci4gQi9JL0gyL0gzIG5vIHRpZW5lbiDDrWNvbm8gSW9uaWNvbnMgZGVkaWNhZG8g4oCUIHNlXG4vLyByZW5kZXJpemFuIGNvbW8gdGV4dG8gKFwiQlwiLCBcIklcIiwgXCJIMlwiLCBcIkgzXCIpIGRpcmVjdG8gZW4gZWwgYm90w7NuLCBtaXNtb1xuLy8gY3JpdGVyaW8gcXVlIHVuIGVkaXRvciBkZSB0ZXh0byByaWNvIGNvbnZlbmNpb25hbCAoR29vZ2xlIERvY3MsIE5vdGlvbikuXG5hZGRJY29ucyh7IGxpc3RPdXRsaW5lLCBjaGF0Ym94T3V0bGluZSwgcmVtb3ZlT3V0bGluZSB9KTtcblxuLyoqXG4gKiB2YWwtcmljaC1lZGl0b3JcbiAqXG4gKiBPcmdhbmlzbTogZWRpdG9yIFdZU0lXWUcgcmV1c2FibGUgcGFyYSB0b2RhIGxhIHBsYXRhZm9ybWEsIHNvYnJlIFRpcFRhcC5cbiAqIEVtaXRlIGBBcnRpY2xlTWV0YWRhdGFgIOKAlCBlbCBtaXNtbyBjb250cmF0byBxdWUgYHZhbC1hcnRpY2xlYCByZW5kZXJpemEsXG4gKiBxdWUgdGFtYmnDqW4gcHJvZHVjZW4gTWFya2Rvd24gKGBwYXJzZU1hcmtkb3duQXJ0aWNsZWApIHkgKGEgZnV0dXJvKSBlbFxuICogcGFnZSBidWlsZGVyLiBFbCBjb25zdW1lciBudW5jYSB0b2NhIFRpcFRhcCBkaXJlY3RhbWVudGUuXG4gKlxuICogQ29iZXJ0dXJhIGRlIGxhIHRvb2xiYXIgdjE6IG5lZ3JpdGEsIGN1cnNpdmEsIHTDrXR1bG8gKEgyKSwgc3VidMOtdHVsbyAoSDMpLFxuICogbGlzdGEgY29uL3NpbiB2acOxZXRhcywgY2l0YSwgc2VwYXJhZG9yLCBpbWFnZW4uIFZlciBgdGlwdGFwLXRvLWFydGljbGUudHNgXG4gKiBwYXJhIHF1w6kgdGlwb3MgZGUgYEFydGljbGVFbGVtZW50YCBwdWVkZSBwcm9kdWNpciBlbCBlZGl0b3IgaG95LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8dmFsLXJpY2gtZWRpdG9yXG4gKiAgIFtwcm9wc109XCJ7IGluaXRpYWxWYWx1ZTogcmVjaXBlLmRlc2NyaXB0aW9uQXJ0aWNsZSwgcGxhY2Vob2xkZXI6ICdFc2NyaWJlIGxhIHByZXBhcmFjacOzbi4uLicgfVwiXG4gKiAgIChhcnRpY2xlQ2hhbmdlKT1cIm9uQXJ0aWNsZUNoYW5nZSgkZXZlbnQpXCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXJpY2gtZWRpdG9yJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW9uQnV0dG9uLCBJb25JY29uXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicmljaC1lZGl0b3JcIiBbY2xhc3MucmljaC1lZGl0b3ItLWRpc2FibGVkXT1cInByb3BzLmRpc2FibGVkXCI+XG4gICAgICBAaWYgKCFwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicmljaC1lZGl0b3JfX3Rvb2xiYXJcIiByb2xlPVwidG9vbGJhclwiPlxuICAgICAgICAgIEBmb3IgKGJ0biBvZiB0b29sYmFyQnV0dG9ucygpOyB0cmFjayBidG4udG9rZW4pIHtcbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5yaWNoLWVkaXRvcl9fYnRuLS1hY3RpdmVdPVwiYnRuLmlzQWN0aXZlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ0bi5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYnRuLmxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImJ0bi5pc0FjdGl2ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJydW5Db21tYW5kKGJ0bi50b2tlbilcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAc3dpdGNoIChidG4udG9rZW4pIHtcbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2JvbGQnKSB7XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPkI8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdpdGFsaWMnKSB7XG4gICAgICAgICAgICAgICAgICA8ZW0+STwvZW0+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnaGVhZGluZzInKSB7XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPkgyPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnaGVhZGluZzMnKSB7XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPkgzPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnYnVsbGV0TGlzdCcpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwibGlzdC1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnb3JkZXJlZExpc3QnKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImxpc3Qtb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ3F1b3RlJykge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGF0Ym94LW91dGxpbmVcIiBzbG90PVwiaWNvbi1vbmx5XCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdzZXBhcmF0b3InKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInJlbW92ZS1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgI2VkaXRvckhvc3QgY2xhc3M9XCJyaWNoLWVkaXRvcl9fc3VyZmFjZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vcmljaC1lZGl0b3IuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBSaWNoRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwcm9wczogUmljaEVkaXRvck1ldGFkYXRhID0ge307XG4gIEBPdXRwdXQoKSBhcnRpY2xlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnRpY2xlTWV0YWRhdGE+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZWRpdG9ySG9zdCcsIHsgc3RhdGljOiB0cnVlIH0pIGVkaXRvckhvc3QhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGVkaXRvcj86IEVkaXRvcjtcblxuICAvKiogU2UgcmVjYWxjdWxhIGVuIGNhZGEgYG9uVXBkYXRlYC9gb25TZWxlY3Rpb25VcGRhdGVgIHBhcmEgcmVmbGVqYXIgZWxcbiAgICogbWFyay9ub2RvIGFjdGl2byBiYWpvIGVsIGN1cnNvciAoZWouIGVsIGJvdMOzbiBcIkJcIiByZXNhbHRhZG8gc2kgZWxcbiAgICogY3Vyc29yIGVzdMOhIGRlbnRybyBkZSB0ZXh0byBlbiBuZWdyaXRhKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdG9vbGJhclRpY2sgPSBzaWduYWwoMCk7XG4gIHJlYWRvbmx5IHRvb2xiYXJCdXR0b25zID0gc2lnbmFsPFJpY2hFZGl0b3JUb29sYmFyQnV0dG9uW10+KFtdKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnUmljaEVkaXRvcicsIFJJQ0hfRURJVE9SX0kxOE4pO1xuICB9XG5cbiAgcHJpdmF0ZSB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnUmljaEVkaXRvcicpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yID0gbmV3IEVkaXRvcih7XG4gICAgICBlbGVtZW50OiB0aGlzLmVkaXRvckhvc3QubmF0aXZlRWxlbWVudCxcbiAgICAgIGV4dGVuc2lvbnM6IFtTdGFydGVyS2l0LCBJbWFnZV0sXG4gICAgICBlZGl0YWJsZTogIXRoaXMucHJvcHMuZGlzYWJsZWQsXG4gICAgICBjb250ZW50OiB0aGlzLnByb3BzLmluaXRpYWxWYWx1ZVxuICAgICAgICA/IChhcnRpY2xlVG9UaXB0YXBEb2ModGhpcy5wcm9wcy5pbml0aWFsVmFsdWUpIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDogJycsXG4gICAgICBlZGl0b3JQcm9wczoge1xuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgJ2RhdGEtcGxhY2Vob2xkZXInOiB0aGlzLnByb3BzLnBsYWNlaG9sZGVyID8/ICcnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG9uVXBkYXRlOiAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgICB0aGlzLmVtaXRBcnRpY2xlKGVkaXRvci5nZXRKU09OKCkgYXMgVGlwdGFwRG9jKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9vbGJhcigpO1xuICAgICAgfSxcbiAgICAgIG9uU2VsZWN0aW9uVXBkYXRlOiAoKSA9PiB0aGlzLnJlZnJlc2hUb29sYmFyKCksXG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoVG9vbGJhcigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydwcm9wcyddPy5jdXJyZW50VmFsdWUgJiYgdGhpcy5lZGl0b3IpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnNldEVkaXRhYmxlKCF0aGlzLnByb3BzLmRpc2FibGVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRBcnRpY2xlKGRvYzogVGlwdGFwRG9jKTogdm9pZCB7XG4gICAgdGhpcy5hcnRpY2xlQ2hhbmdlLmVtaXQodGlwdGFwRG9jVG9BcnRpY2xlKGRvYykpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVG9vbGJhcigpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcbiAgICBpZiAoIWVkaXRvcikgcmV0dXJuO1xuICAgIHRoaXMudG9vbGJhckJ1dHRvbnMuc2V0KFtcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdib2xkJyxcbiAgICAgICAgaWNvbjogJycsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ2JvbGQnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnYm9sZCcpLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2l0YWxpYycsXG4gICAgICAgIGljb246ICcnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdpdGFsaWMnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnaXRhbGljJyksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnaGVhZGluZzInLFxuICAgICAgICBpY29uOiAnJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnaGVhZGluZzInKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnaGVhZGluZycsIHsgbGV2ZWw6IDIgfSksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnaGVhZGluZzMnLFxuICAgICAgICBpY29uOiAnJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnaGVhZGluZzMnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnaGVhZGluZycsIHsgbGV2ZWw6IDMgfSksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnYnVsbGV0TGlzdCcsXG4gICAgICAgIGljb246ICdsaXN0LW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdidWxsZXRMaXN0JyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2J1bGxldExpc3QnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdvcmRlcmVkTGlzdCcsXG4gICAgICAgIGljb246ICdsaXN0LW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdvcmRlcmVkTGlzdCcpLFxuICAgICAgICBpc0FjdGl2ZTogZWRpdG9yLmlzQWN0aXZlKCdvcmRlcmVkTGlzdCcpLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ3F1b3RlJyxcbiAgICAgICAgaWNvbjogJ2NoYXRib3gtb3V0bGluZScsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ3F1b3RlJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2Jsb2NrcXVvdGUnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdzZXBhcmF0b3InLFxuICAgICAgICBpY29uOiAncmVtb3ZlLW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdzZXBhcmF0b3InKSxcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG5cbiAgcnVuQ29tbWFuZCh0b2tlbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XG4gICAgaWYgKCFlZGl0b3IpIHJldHVybjtcbiAgICBjb25zdCBjaGFpbiA9IGVkaXRvci5jaGFpbigpLmZvY3VzKCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSAnYm9sZCc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUJvbGQoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpdGFsaWMnOlxuICAgICAgICBjaGFpbi50b2dnbGVJdGFsaWMoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdoZWFkaW5nMic6XG4gICAgICAgIGNoYWluLnRvZ2dsZUhlYWRpbmcoeyBsZXZlbDogMiB9KS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdoZWFkaW5nMyc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUhlYWRpbmcoeyBsZXZlbDogMyB9KS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdidWxsZXRMaXN0JzpcbiAgICAgICAgY2hhaW4udG9nZ2xlQnVsbGV0TGlzdCgpLnJ1bigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29yZGVyZWRMaXN0JzpcbiAgICAgICAgY2hhaW4udG9nZ2xlT3JkZXJlZExpc3QoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdxdW90ZSc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUJsb2NrcXVvdGUoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZXBhcmF0b3InOlxuICAgICAgICBjaGFpbi5zZXRIb3Jpem9udGFsUnVsZSgpLnJ1bigpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVG9vbGJhcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3I/LmRlc3Ryb3koKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,27 @@
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
+ },
16
+ en: {
17
+ bold: 'Bold',
18
+ italic: 'Italic',
19
+ heading2: 'Heading',
20
+ heading3: 'Subheading',
21
+ bulletList: 'Bullet list',
22
+ orderedList: 'Numbered list',
23
+ quote: 'Quote',
24
+ separator: 'Separator',
25
+ },
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC1lZGl0b3IuaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvcmljaC1lZGl0b3IvcmljaC1lZGl0b3IuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixFQUFFLEVBQUU7UUFDRixJQUFJLEVBQUUsU0FBUztRQUNmLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFFBQVEsRUFBRSxXQUFXO1FBQ3JCLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsV0FBVyxFQUFFLGdCQUFnQjtRQUM3QixLQUFLLEVBQUUsTUFBTTtRQUNiLFNBQVMsRUFBRSxXQUFXO0tBQ3ZCO0lBQ0QsRUFBRSxFQUFFO1FBQ0YsSUFBSSxFQUFFLE1BQU07UUFDWixNQUFNLEVBQUUsUUFBUTtRQUNoQixRQUFRLEVBQUUsU0FBUztRQUNuQixRQUFRLEVBQUUsWUFBWTtRQUN0QixVQUFVLEVBQUUsYUFBYTtRQUN6QixXQUFXLEVBQUUsZUFBZTtRQUM1QixLQUFLLEVBQUUsT0FBTztRQUNkLFNBQVMsRUFBRSxXQUFXO0tBQ3ZCO0NBQ08sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVmYXVsdHMgaTE4biAoZXMvZW4pIGRlbCBgdmFsLXJpY2gtZWRpdG9yYC4gQXV0by1yZWdpc3RyYWRvcyBlbiBlbFxuICogY29uc3RydWN0b3IgKG5hbWVzcGFjZSBgUmljaEVkaXRvcmApIOKAlCBlbCBjb25zdW1lciBudW5jYSBsb3MgcmVnaXN0cmEuXG4gKi9cbmV4cG9ydCBjb25zdCBSSUNIX0VESVRPUl9JMThOID0ge1xuICBlczoge1xuICAgIGJvbGQ6ICdOZWdyaXRhJyxcbiAgICBpdGFsaWM6ICdDdXJzaXZhJyxcbiAgICBoZWFkaW5nMjogJ1TDrXR1bG8nLFxuICAgIGhlYWRpbmczOiAnU3VidMOtdHVsbycsXG4gICAgYnVsbGV0TGlzdDogJ0xpc3RhIGNvbiB2acOxZXRhcycsXG4gICAgb3JkZXJlZExpc3Q6ICdMaXN0YSBudW1lcmFkYScsXG4gICAgcXVvdGU6ICdDaXRhJyxcbiAgICBzZXBhcmF0b3I6ICdTZXBhcmFkb3InLFxuICB9LFxuICBlbjoge1xuICAgIGJvbGQ6ICdCb2xkJyxcbiAgICBpdGFsaWM6ICdJdGFsaWMnLFxuICAgIGhlYWRpbmcyOiAnSGVhZGluZycsXG4gICAgaGVhZGluZzM6ICdTdWJoZWFkaW5nJyxcbiAgICBidWxsZXRMaXN0OiAnQnVsbGV0IGxpc3QnLFxuICAgIG9yZGVyZWRMaXN0OiAnTnVtYmVyZWQgbGlzdCcsXG4gICAgcXVvdGU6ICdRdW90ZScsXG4gICAgc2VwYXJhdG9yOiAnU2VwYXJhdG9yJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iXX0=
@@ -0,0 +1,136 @@
1
+ /** Texto inline con marks bold/italic convertidas a <strong>/<em> — mismo
2
+ * criterio que `allowPartialBold` en ArticleTextElement/ArticleNoteElement:
3
+ * el elemento consumer debe setear `allowPartialBold: true` para que se
4
+ * rendericen (si no, val-text/val-note escapan el HTML a propósito). */
5
+ function inlineText(node) {
6
+ if (node.type === 'text') {
7
+ let text = node.text ?? '';
8
+ for (const mark of node.marks ?? []) {
9
+ if (mark.type === 'bold')
10
+ text = `<strong>${text}</strong>`;
11
+ if (mark.type === 'italic')
12
+ text = `<em>${text}</em>`;
13
+ if (mark.type === 'code')
14
+ text = `<code>${text}</code>`;
15
+ }
16
+ return text;
17
+ }
18
+ return (node.content ?? []).map(inlineText).join('');
19
+ }
20
+ function hasBold(node) {
21
+ if (node.type === 'text') {
22
+ return (node.marks ?? []).some(m => m.type === 'bold' || m.type === 'code');
23
+ }
24
+ return (node.content ?? []).some(hasBold);
25
+ }
26
+ function paragraphText(node) {
27
+ return (node.content ?? []).map(inlineText).join('');
28
+ }
29
+ function listItemsFrom(node) {
30
+ return (node.content ?? []).map(li => ({
31
+ text: (li.content ?? []).map(paragraphText).join(' '),
32
+ }));
33
+ }
34
+ /**
35
+ * Convierte un doc de TipTap a `ArticleElement[]`. Función pura — sin
36
+ * Angular DI, usable también desde Node (mismo criterio que
37
+ * `parseMarkdownArticle`).
38
+ */
39
+ export function tiptapDocToArticleElements(doc) {
40
+ const elements = [];
41
+ for (const node of doc.content ?? []) {
42
+ switch (node.type) {
43
+ case 'heading': {
44
+ const level = node.attrs?.['level'] ?? 2;
45
+ elements.push({
46
+ type: level <= 2 ? 'title' : 'subtitle',
47
+ props: {
48
+ content: paragraphText(node),
49
+ size: level === 1 ? 'large' : level === 2 ? 'medium' : 'small',
50
+ color: 'dark',
51
+ bold: true,
52
+ },
53
+ });
54
+ break;
55
+ }
56
+ case 'paragraph': {
57
+ const content = paragraphText(node);
58
+ if (!content.trim())
59
+ break; // párrafo vacío (Enter suelto) — no genera elemento
60
+ elements.push({
61
+ type: 'text',
62
+ props: {
63
+ content,
64
+ size: 'medium',
65
+ color: 'dark',
66
+ bold: false,
67
+ allowPartialBold: hasBold(node),
68
+ },
69
+ });
70
+ break;
71
+ }
72
+ case 'bulletList':
73
+ case 'orderedList': {
74
+ elements.push({
75
+ type: 'list',
76
+ props: {
77
+ items: listItemsFrom(node),
78
+ listType: node.type === 'orderedList' ? 'ordered' : 'unordered',
79
+ },
80
+ });
81
+ break;
82
+ }
83
+ case 'blockquote': {
84
+ elements.push({
85
+ type: 'quote',
86
+ props: {
87
+ content: (node.content ?? []).map(paragraphText).join(' '),
88
+ size: 'medium',
89
+ color: 'dark',
90
+ bold: false,
91
+ showQuoteMark: true,
92
+ },
93
+ });
94
+ break;
95
+ }
96
+ case 'codeBlock': {
97
+ elements.push({
98
+ type: 'code',
99
+ props: {
100
+ code: (node.content ?? []).map(n => n.text ?? '').join('\n'),
101
+ language: node.attrs?.['language'] ?? undefined,
102
+ },
103
+ });
104
+ break;
105
+ }
106
+ case 'horizontalRule': {
107
+ elements.push({ type: 'separator', props: { style: 'line' } });
108
+ break;
109
+ }
110
+ case 'image': {
111
+ const src = node.attrs?.['src'] ?? '';
112
+ if (!src)
113
+ break; // sin src no hay nada que renderizar
114
+ elements.push({
115
+ type: 'image',
116
+ props: {
117
+ src,
118
+ alt: node.attrs?.['alt'] ?? '',
119
+ title: node.attrs?.['title'] ?? undefined,
120
+ },
121
+ });
122
+ break;
123
+ }
124
+ default:
125
+ break; // nodo no soportado todavía — se omite, no rompe el resto
126
+ }
127
+ }
128
+ return elements;
129
+ }
130
+ export function tiptapDocToArticle(doc, config) {
131
+ return {
132
+ ...config,
133
+ elements: tiptapDocToArticleElements(doc),
134
+ };
135
+ }
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlwdGFwLXRvLWFydGljbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL3JpY2gtZWRpdG9yL3RpcHRhcC10by1hcnRpY2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdDQTs7O3dFQUd3RTtBQUN4RSxTQUFTLFVBQVUsQ0FBQyxJQUFnQjtJQUNsQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDM0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNO2dCQUFFLElBQUksR0FBRyxXQUFXLElBQUksV0FBVyxDQUFDO1lBQzVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRO2dCQUFFLElBQUksR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDO1lBQ3RELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNO2dCQUFFLElBQUksR0FBRyxTQUFTLElBQUksU0FBUyxDQUFDO1FBQzFELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxJQUFnQjtJQUMvQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMs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RUFBRSxDQUFDLEtBQUssQ0FBWSxJQUFJLEVBQUUsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLEdBQUc7b0JBQUUsTUFBTSxDQUFDLHFDQUFxQztnQkFDdEQsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDWixJQUFJLEVBQUUsT0FBTztvQkFDYixLQUFLLEVBQUU7d0JBQ0wsR0FBRzt3QkFDSCxHQUFHLEVBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBWSxJQUFJLEVBQUU7d0JBQzFDLEtBQUssRUFBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFZLElBQUksU0FBUztxQkFDdEQ7aUJBQ0YsQ0FBQyxDQUFDO2dCQUNILE1BQU07WUFDUixDQUFDO1lBQ0Q7Z0JBQ0UsTUFBTSxDQUFDLDBEQUEwRDtRQUNyRSxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLEdBQWMsRUFDZCxNQUFpQztJQUVqQyxPQUFPO1FBQ0wsR0FBRyxNQUFNO1FBQ1QsUUFBUSxFQUFFLDBCQUEwQixDQUFDLEdBQUcsQ0FBQztLQUMxQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFydGljbGVFbGVtZW50LCBBcnRpY2xlTGlzdEVsZW1lbnQsIEFydGljbGVNZXRhZGF0YSB9IGZyb20gJy4uL2FydGljbGUvdHlwZXMnO1xuXG4vKipcbiAqIENvbnZpZXJ0ZSBlbCBkb2N1bWVudG8gSlNPTiBkZSBUaXBUYXAgKFByb3NlTWlycm9yKSBhIGBBcnRpY2xlRWxlbWVudFtdYFxuICogc2luIHBhc2FyIHBvciBIVE1MIGludGVybWVkaW8g4oCUIGVzIGxhIG1pdGFkIFwiZ3VhcmRhclwiIGRlIGB2YWwtcmljaC1lZGl0b3JgLFxuICogcXVlIGFsaW1lbnRhIGVsIG1pc21vIGB2YWwtYXJ0aWNsZWAgcXVlIHlhIHVzYW4gTWFya2Rvd25cbiAqIChgcGFyc2VNYXJrZG93bkFydGljbGVgKSB5IGxhcyBpbnN0cnVjY2lvbmVzIGRlIHJlY2V0YSBkZSBPa2hlbGlhLiBWZXJcbiAqIGBhcnRpY2xlLXRvLXRpcHRhcC50c2AgcGFyYSBsYSBjb252ZXJzacOzbiBpbnZlcnNhIChoaWRyYXRhciBlbCBlZGl0b3IgY29uXG4gKiBjb250ZW5pZG8gZXhpc3RlbnRlKS5cbiAqXG4gKiBDb2JlcnR1cmE6IGxvcyBub2RvcyBxdWUgdHJhZSBgQHRpcHRhcC9zdGFydGVyLWtpdGAgcG9yIGRlZmF1bHQgKGRvYyxcbiAqIHBhcmFncmFwaCwgaGVhZGluZywgYnVsbGV0TGlzdC9vcmRlcmVkTGlzdC9saXN0SXRlbSwgYmxvY2txdW90ZSwgY29kZUJsb2NrLFxuICogaG9yaXpvbnRhbFJ1bGUpICsgbWFya3MgaW5saW5lIChib2xkLCBpdGFsaWMgdsOtYSA8c3Ryb25nPi88ZW0+LCBpZ3VhbFxuICogY3JpdGVyaW8gcXVlIGBhbGxvd1BhcnRpYWxCb2xkYCBkZSBBcnRpY2xlVGV4dEVsZW1lbnQvQXJ0aWNsZU5vdGVFbGVtZW50KS5cbiAqIE5PIGN1YnJlIHRvZGF2w61hOiB0YWJsYXMsIG5pIGV4dGVuc2lvbmVzIGN1c3RvbSBwYXJhIGBub3RlYC9gZGlhZ3JhbWAvXG4gKiBgY29tbWFuZGAgKGVzb3MgcmVxdWVyaXLDrWFuIG5vZG9zIFRpcFRhcCBwcm9waW9zIOKAlCBmYWN0aWJsZSwgcGVuZGllbnRlIGRlXG4gKiBkZWNpZGlyIHNpIHZhbGUgbGEgcGVuYSkuIGBpbWFnZWAgc8OtIGVzdMOhIGN1YmllcnRvICh2ZXIgY2FzZSAnaW1hZ2UnKS5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpcHRhcE5vZGUge1xuICB0eXBlOiBzdHJpbmc7XG4gIGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnRlbnQ/OiBUaXB0YXBOb2RlW107XG4gIHRleHQ/OiBzdHJpbmc7XG4gIG1hcmtzPzogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IGF0dHJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGlwdGFwRG9jIHtcbiAgdHlwZTogJ2RvYyc7XG4gIGNvbnRlbnQ6IFRpcHRhcE5vZGVbXTtcbn1cblxuLyoqIFRleHRvIGlubGluZSBjb24gbWFya3MgYm9sZC9pdGFsaWMgY29udmVydGlkYXMgYSA8c3Ryb25nPi88ZW0+IOKAlCBtaXNtb1xuICogY3JpdGVyaW8gcXVlIGBhbGxvd1BhcnRpYWxCb2xkYCBlbiBBcnRpY2xlVGV4dEVsZW1lbnQvQXJ0aWNsZU5vdGVFbGVtZW50OlxuICogZWwgZWxlbWVudG8gY29uc3VtZXIgZGViZSBzZXRlYXIgYGFsbG93UGFydGlhbEJvbGQ6IHRydWVgIHBhcmEgcXVlIHNlXG4gKiByZW5kZXJpY2VuIChzaSBubywgdmFsLXRleHQvdmFsLW5vdGUgZXNjYXBhbiBlbCBIVE1MIGEgcHJvcMOzc2l0bykuICovXG5mdW5jdGlvbiBpbmxpbmVUZXh0KG5vZGU6IFRpcHRhcE5vZGUpOiBzdHJpbmcge1xuICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICBsZXQgdGV4dCA9IG5vZGUudGV4dCA/PyAnJztcbiAgICBmb3IgKGNvbnN0IG1hcmsgb2Ygbm9kZS5tYXJrcyA/PyBbXSkge1xuICAgICAgaWYgKG1hcmsudHlwZSA9PT0gJ2JvbGQnKSB0ZXh0ID0gYDxzdHJvbmc+JHt0ZXh0fTwvc3Ryb25nPmA7XG4gICAgICBpZiAobWFyay50eXBlID09PSAnaXRhbGljJykgdGV4dCA9IGA8ZW0+JHt0ZXh0fTwvZW0+YDtcbiAgICAgIGlmIChtYXJrLnR5cGUgPT09ICdjb2RlJykgdGV4dCA9IGA8Y29kZT4ke3RleHR9PC9jb2RlPmA7XG4gICAgfVxuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHJldHVybiAobm9kZS5jb250ZW50ID8/IFtdKS5tYXAoaW5saW5lVGV4dCkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGhhc0JvbGQobm9kZTogVGlwdGFwTm9kZSk6IGJvb2xlYW4ge1xuICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICByZXR1cm4gKG5vZGUubWFya3MgPz8gW10pLnNvbWUobSA9PiBtLnR5cGUgPT09ICdib2xkJyB8fCBtLnR5cGUgPT09ICdjb2RlJyk7XG4gIH1cbiAgcmV0dXJuIChub2RlLmNvbnRlbnQgPz8gW10pLnNvbWUoaGFzQm9sZCk7XG59XG5cbmZ1bmN0aW9uIHBhcmFncmFwaFRleHQobm9kZTogVGlwdGFwTm9kZSk6IHN0cmluZyB7XG4gIHJldHVybiAobm9kZS5jb250ZW50ID8/IFtdKS5tYXAoaW5saW5lVGV4dCkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGxpc3RJdGVtc0Zyb20obm9kZTogVGlwdGFwTm9kZSk6IEFydGljbGVMaXN0RWxlbWVudFsncHJvcHMnXVsnaXRlbXMnXSB7XG4gIHJldHVybiAobm9kZS5jb250ZW50ID8/IFtdKS5tYXAobGkgPT4gKHtcbiAgICB0ZXh0OiAobGkuY29udGVudCA/PyBbXSkubWFwKHBhcmFncmFwaFRleHQpLmpvaW4oJyAnKSxcbiAgfSkpO1xufVxuXG4vKipcbiAqIENvbnZpZXJ0ZSB1biBkb2MgZGUgVGlwVGFwIGEgYEFydGljbGVFbGVtZW50W11gLiBGdW5jacOzbiBwdXJhIOKAlCBzaW5cbiAqIEFuZ3VsYXIgREksIHVzYWJsZSB0YW1iacOpbiBkZXNkZSBOb2RlIChtaXNtbyBjcml0ZXJpbyBxdWVcbiAqIGBwYXJzZU1hcmtkb3duQXJ0aWNsZWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGlwdGFwRG9jVG9BcnRpY2xlRWxlbWVudHMoZG9jOiBUaXB0YXBEb2MpOiBBcnRpY2xlRWxlbWVudFtdIHtcbiAgY29uc3QgZWxlbWVudHM6IEFydGljbGVFbGVtZW50W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IG5vZGUgb2YgZG9jLmNvbnRlbnQgPz8gW10pIHtcbiAgICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgICAgY2FzZSAnaGVhZGluZyc6IHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSAobm9kZS5hdHRycz8uWydsZXZlbCddIGFzIG51bWJlcikgPz8gMjtcbiAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgdHlwZTogbGV2ZWwgPD0gMiA/ICd0aXRsZScgOiAnc3VidGl0bGUnLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBjb250ZW50OiBwYXJhZ3JhcGhUZXh0KG5vZGUpLFxuICAgICAgICAgICAgc2l6ZTogbGV2ZWwgPT09IDEgPyAnbGFyZ2UnIDogbGV2ZWwgPT09IDIgPyAnbWVkaXVtJyA6ICdzbWFsbCcsXG4gICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdwYXJhZ3JhcGgnOiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwYXJhZ3JhcGhUZXh0KG5vZGUpO1xuICAgICAgICBpZiAoIWNvbnRlbnQudHJpbSgpKSBicmVhazsgLy8gcMOhcnJhZm8gdmFjw61vIChFbnRlciBzdWVsdG8pIOKAlCBubyBnZW5lcmEgZWxlbWVudG9cbiAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgYm9sZDogZmFsc2UsXG4gICAgICAgICAgICBhbGxvd1BhcnRpYWxCb2xkOiBoYXNCb2xkKG5vZGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J1bGxldExpc3QnOlxuICAgICAgY2FzZSAnb3JkZXJlZExpc3QnOiB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgaXRlbXM6IGxpc3RJdGVtc0Zyb20obm9kZSksXG4gICAgICAgICAgICBsaXN0VHlwZTogbm9kZS50eXBlID09PSAnb3JkZXJlZExpc3QnID8gJ29yZGVyZWQnIDogJ3Vub3JkZXJlZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6IHtcbiAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3F1b3RlJyxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgY29udGVudDogKG5vZGUuY29udGVudCA/PyBbXSkubWFwKHBhcmFncmFwaFRleHQpLmpvaW4oJyAnKSxcbiAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgc2hvd1F1b3RlTWFyazogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb2RlQmxvY2snOiB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdjb2RlJyxcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgY29kZTogKG5vZGUuY29udGVudCA/PyBbXSkubWFwKG4gPT4gbi50ZXh0ID8/ICcnKS5qb2luKCdcXG4nKSxcbiAgICAgICAgICAgIGxhbmd1YWdlOiAobm9kZS5hdHRycz8uWydsYW5ndWFnZSddIGFzIHN0cmluZykgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2hvcml6b250YWxSdWxlJzoge1xuICAgICAgICBlbGVtZW50cy5wdXNoKHsgdHlwZTogJ3NlcGFyYXRvcicsIHByb3BzOiB7IHN0eWxlOiAnbGluZScgfSB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdpbWFnZSc6IHtcbiAgICAgICAgY29uc3Qgc3JjID0gKG5vZGUuYXR0cnM/Llsnc3JjJ10gYXMgc3RyaW5nKSA/PyAnJztcbiAgICAgICAgaWYgKCFzcmMpIGJyZWFrOyAvLyBzaW4gc3JjIG5vIGhheSBuYWRhIHF1ZSByZW5kZXJpemFyXG4gICAgICAgIGVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdpbWFnZScsXG4gICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHNyYyxcbiAgICAgICAgICAgIGFsdDogKG5vZGUuYXR0cnM/LlsnYWx0J10gYXMgc3RyaW5nKSA/PyAnJyxcbiAgICAgICAgICAgIHRpdGxlOiAobm9kZS5hdHRycz8uWyd0aXRsZSddIGFzIHN0cmluZykgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrOyAvLyBub2RvIG5vIHNvcG9ydGFkbyB0b2RhdsOtYSDigJQgc2Ugb21pdGUsIG5vIHJvbXBlIGVsIHJlc3RvXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGlwdGFwRG9jVG9BcnRpY2xlKFxuICBkb2M6IFRpcHRhcERvYyxcbiAgY29uZmlnPzogUGFydGlhbDxBcnRpY2xlTWV0YWRhdGE+XG4pOiBBcnRpY2xlTWV0YWRhdGEge1xuICByZXR1cm4ge1xuICAgIC4uLmNvbmZpZyxcbiAgICBlbGVtZW50czogdGlwdGFwRG9jVG9BcnRpY2xlRWxlbWVudHMoZG9jKSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL3JpY2gtZWRpdG9yL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcnRpY2xlTWV0YWRhdGEgfSBmcm9tICcuLi9hcnRpY2xlL3R5cGVzJztcblxuLyoqXG4gKiBQcm9wcyBkZSBgdmFsLXJpY2gtZWRpdG9yYCAob2JqZWN0LWZpcnN0LCBjb21vIGVsIHJlc3RvIGRlIGxhIGxpYikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmljaEVkaXRvck1ldGFkYXRhIHtcbiAgLyoqIENvbnRlbmlkbyBpbmljaWFsIOKAlCBwYXNhciBlbCBgQXJ0aWNsZU1ldGFkYXRhYCB5YSBndWFyZGFkbyBwYXJhIGVkaXRhclxuICAgKiBhbGdvIGV4aXN0ZW50ZS4gVmFjw61vL3VuZGVmaW5lZCA9IGVkaXRvciBlbiBibGFuY28uICovXG4gIGluaXRpYWxWYWx1ZT86IEFydGljbGVNZXRhZGF0YTtcbiAgLyoqIFRleHRvIGRlIHBsYWNlaG9sZGVyIGN1YW5kbyBlbCBlZGl0b3IgZXN0w6EgdmFjw61vLiAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqIERlc2hhYmlsaXRhIGxhIGVkaWNpw7NuIChzb2xvIGxlY3R1cmEsIHNpbiB0b29sYmFyIGludGVyYWN0aXZhKS4gKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vKiogVW4gYm90w7NuIGRlIGxhIHRvb2xiYXIg4oCUIGlkZW50aWZpY2EgZWwgY29tYW5kbyBUaXBUYXAgeSBzdSBlc3RhZG8gYWN0aXZvLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaWNoRWRpdG9yVG9vbGJhckJ1dHRvbiB7XG4gIHRva2VuOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIGRpc2FibGVkOiBib29sZWFuO1xufVxuIl19