dishui 0.0.75 → 0.0.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js +2 -26
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.d.ts +2 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js +57 -22
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js +2 -22
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js +31 -31
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js +44 -69
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js +71 -70
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.d.ts +2 -0
- package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js +96 -0
- package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -0
- package/dist/dishui.css +1 -1
- package/package.json +1 -1
|
@@ -137,21 +137,7 @@ var f = ({ editor: f, onAddComment: p }) => {
|
|
|
137
137
|
},
|
|
138
138
|
title: "Text color",
|
|
139
139
|
buttonClassName: "rte-bubble__btn",
|
|
140
|
-
|
|
141
|
-
width: "14",
|
|
142
|
-
height: "14",
|
|
143
|
-
viewBox: "0 0 24 24",
|
|
144
|
-
fill: "none",
|
|
145
|
-
stroke: "currentColor",
|
|
146
|
-
strokeWidth: "2",
|
|
147
|
-
strokeLinecap: "round",
|
|
148
|
-
strokeLinejoin: "round",
|
|
149
|
-
children: [
|
|
150
|
-
/* @__PURE__ */ c("path", { d: "M4 20h16" }),
|
|
151
|
-
/* @__PURE__ */ c("path", { d: "M6 16l4.5-12h1L16 16" }),
|
|
152
|
-
/* @__PURE__ */ c("path", { d: "M7.8 12h6.4" })
|
|
153
|
-
]
|
|
154
|
-
})
|
|
140
|
+
kind: "text"
|
|
155
141
|
}),
|
|
156
142
|
/* @__PURE__ */ c(e, {
|
|
157
143
|
value: f.getAttributes("highlight").color || "",
|
|
@@ -160,17 +146,7 @@ var f = ({ editor: f, onAddComment: p }) => {
|
|
|
160
146
|
},
|
|
161
147
|
title: "Highlight color",
|
|
162
148
|
buttonClassName: "rte-bubble__btn",
|
|
163
|
-
|
|
164
|
-
width: "14",
|
|
165
|
-
height: "14",
|
|
166
|
-
viewBox: "0 0 24 24",
|
|
167
|
-
fill: "none",
|
|
168
|
-
stroke: "currentColor",
|
|
169
|
-
strokeWidth: "2",
|
|
170
|
-
strokeLinecap: "round",
|
|
171
|
-
strokeLinejoin: "round",
|
|
172
|
-
children: [/* @__PURE__ */ c("path", { d: "M12 20h9" }), /* @__PURE__ */ c("path", { d: "M16.5 3.5a2.121 2.121 0 013 3L7 19l-4 1 1-4L16.5 3.5z" })]
|
|
173
|
-
})
|
|
149
|
+
kind: "highlight"
|
|
174
150
|
}),
|
|
175
151
|
/* @__PURE__ */ c("div", { className: "rte-bubble__divider" }),
|
|
176
152
|
/* @__PURE__ */ c("select", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BubbleToolbar.js","names":[],"sources":["../../../../src/components/pro/RichTextEditor/BubbleToolbar.tsx"],"sourcesContent":["import React, { useState, useEffect, useLayoutEffect, useRef } from 'react';\nimport { useEditorState, type Editor } from '@tiptap/react';\nimport { TextSelection } from '@tiptap/pm/state';\nimport { ColorPicker } from './Toolbar/ColorPicker';\nimport { FONT_FAMILIES, FONT_SIZES } from './Toolbar/SelectDropdown';\n\ninterface BubbleToolbarProps {\n editor: Editor;\n onAddComment?: () => void;\n}\n\nconst BubbleToolbar: React.FC<BubbleToolbarProps> = ({ editor, onAddComment }) => {\n useEditorState({ editor, selector: ({ transactionNumber }) => transactionNumber });\n const [visible, setVisible] = useState(false);\n const [pos, setPos] = useState({ x: 0, y: 0 });\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (editor.isDestroyed) return;\n const doc = editor.view.dom.ownerDocument;\n const win = doc.defaultView;\n if (!win) return;\n let frame: number | null = null;\n const hide = () => {\n if (frame !== null) win.cancelAnimationFrame(frame);\n frame = null;\n setVisible(false);\n };\n const update = () => {\n frame = null;\n if (editor.isDestroyed) { hide(); return; }\n const { from, to } = editor.state.selection;\n if (!editor.isEditable || !(editor.state.selection instanceof TextSelection) || from === to || (!editor.isFocused && !ref.current?.contains(doc.activeElement))) {\n setVisible(false);\n return;\n }\n const coords = editor.view.coordsAtPos(from);\n const endCoords = editor.view.coordsAtPos(to);\n const wrapperEl = editor.view.dom.closest<HTMLElement>('.rte-editor-wrapper');\n if (!wrapperEl) { hide(); return; }\n const rect = wrapperEl.getBoundingClientRect();\n\n const centerX = (coords.left + endCoords.left) / 2 - rect.left - wrapperEl.clientLeft + wrapperEl.scrollLeft;\n const topY = Math.min(coords.top, endCoords.top) - rect.top - wrapperEl.clientTop + wrapperEl.scrollTop - 44;\n\n setPos({ x: centerX, y: topY });\n setVisible(true);\n };\n\n const scheduleUpdate = () => {\n if (frame !== null) win.cancelAnimationFrame(frame);\n frame = win.requestAnimationFrame(update);\n };\n const onBlur = ({ event }: { event: FocusEvent }) => {\n if (event.relatedTarget instanceof Node && ref.current?.contains(event.relatedTarget)) return;\n hide();\n };\n editor.on('transaction', scheduleUpdate);\n editor.on('selectionUpdate', scheduleUpdate);\n editor.on('focus', scheduleUpdate);\n editor.on('blur', onBlur);\n editor.on('destroy', hide);\n doc.addEventListener('scroll', scheduleUpdate, true);\n win.addEventListener('resize', scheduleUpdate);\n update();\n return () => {\n if (frame !== null) win.cancelAnimationFrame(frame);\n editor.off('transaction', scheduleUpdate);\n editor.off('selectionUpdate', scheduleUpdate);\n editor.off('focus', scheduleUpdate);\n editor.off('blur', onBlur);\n editor.off('destroy', hide);\n doc.removeEventListener('scroll', scheduleUpdate, true);\n win.removeEventListener('resize', scheduleUpdate);\n };\n }, [editor]);\n\n // Keep the bubble inside the wrapper horizontally: with the extra color /\n // font controls it can be wider than a phone-size editor, and transform:\n // translateX(-50%) would otherwise clip it at either edge.\n useLayoutEffect(() => {\n if (!visible || !ref.current) return;\n const el = ref.current;\n const wrapper = el.parentElement;\n if (!wrapper) return;\n const w = wrapper.clientWidth;\n const half = el.offsetWidth / 2;\n const min = Math.min(half + 4, w / 2);\n const max = Math.max(w - half - 4, w / 2);\n const clamped = Math.min(Math.max(pos.x, min), max);\n if (clamped !== pos.x) setPos((p) => ({ ...p, x: clamped }));\n }, [visible, pos.x]);\n\n if (!visible || editor.isDestroyed || !editor.isEditable) return null;\n\n const btn = (onClick: () => void, title: string, isActive: boolean | undefined, children: React.ReactNode) => (\n <button\n type=\"button\"\n className={`rte-bubble__btn ${isActive ? 'rte-bubble__btn--active' : ''}`}\n onClick={() => { if (!editor.isDestroyed && editor.isEditable) onClick(); }}\n title={title}\n aria-label={title}\n aria-pressed={isActive}\n onMouseDown={(e) => e.preventDefault()}\n >\n {children}\n </button>\n );\n\n return (\n <div ref={ref} className=\"rte-bubble\" role=\"group\" aria-label=\"Selection formatting\"\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget) && !editor.isFocused) setVisible(false);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n editor.commands.focus();\n setVisible(false);\n }\n }}\n style={{ left: pos.x, top: pos.y }}>\n {btn(() => editor.chain().focus().toggleBold().run(), 'Bold', editor.isActive('bold'),\n <strong style={{ fontSize: 13 }}>B</strong>)}\n {btn(() => editor.chain().focus().toggleItalic().run(), 'Italic', editor.isActive('italic'),\n <em style={{ fontSize: 13 }}>I</em>)}\n {btn(() => editor.chain().focus().toggleUnderline().run(), 'Underline', editor.isActive('underline'),\n <span style={{ fontSize: 13, textDecoration: 'underline' }}>U</span>)}\n {btn(() => editor.chain().focus().toggleStrike().run(), 'Strike', editor.isActive('strike'),\n <span style={{ fontSize: 13, textDecoration: 'line-through' }}>S</span>)}\n {btn(() => editor.chain().focus().toggleCode().run(), 'Code', editor.isActive('code'),\n <span style={{ fontSize: 11, fontFamily: 'monospace' }}></></span>)}\n {btn(() => {\n const url = window.prompt('URL:', editor.getAttributes('link').href || '');\n if (url === null || editor.isDestroyed || !editor.isEditable) return;\n const chain = editor.chain().focus().extendMarkRange('link');\n if (url.trim() === '') chain.unsetLink().run();\n else chain.setLink({ href: url.trim() }).run();\n }, 'Link', editor.isActive('link'),\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71\" /><path d=\"M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71\" /></svg>)}\n <div className=\"rte-bubble__divider\" />\n <ColorPicker\n value={editor.getAttributes('textStyle').color || ''}\n onChange={(color) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n if (color) editor.chain().focus().setColor(color).run();\n else editor.chain().focus().unsetColor().run();\n }}\n title=\"Text color\"\n buttonClassName=\"rte-bubble__btn\"\n icon={\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4 20h16\" /><path d=\"M6 16l4.5-12h1L16 16\" /><path d=\"M7.8 12h6.4\" />\n </svg>\n }\n />\n <ColorPicker\n value={editor.getAttributes('highlight').color || ''}\n onChange={(color) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n if (color) editor.chain().focus().toggleHighlight({ color }).run();\n else editor.chain().focus().unsetHighlight().run();\n }}\n title=\"Highlight color\"\n buttonClassName=\"rte-bubble__btn\"\n icon={\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 20h9\" /><path d=\"M16.5 3.5a2.121 2.121 0 013 3L7 19l-4 1 1-4L16.5 3.5z\" />\n </svg>\n }\n />\n <div className=\"rte-bubble__divider\" />\n <select\n className=\"rte-bubble__select\"\n value={editor.getAttributes('textStyle').fontFamily || ''}\n onChange={(e) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n if (e.target.value) editor.chain().focus().setFontFamily(e.target.value).run();\n else editor.chain().focus().unsetFontFamily().run();\n }}\n title=\"Font family\"\n aria-label=\"Font family\"\n >\n {FONT_FAMILIES.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n <select\n className=\"rte-bubble__select rte-bubble__select--size\"\n value={editor.getAttributes('textStyle').fontSize || ''}\n onChange={(e) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n if (e.target.value) (editor.chain().focus() as any).setFontSize(e.target.value).run();\n else (editor.chain().focus() as any).unsetFontSize().run();\n }}\n title=\"Font size\"\n aria-label=\"Font size\"\n >\n {FONT_SIZES.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n {onAddComment && (\n <>\n <div className=\"rte-bubble__divider\" />\n {btn(onAddComment, 'Comment', undefined,\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z\" /></svg>)}\n </>\n )}\n </div>\n );\n};\n\nexport default BubbleToolbar;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BubbleToolbar.js","names":[],"sources":["../../../../src/components/pro/RichTextEditor/BubbleToolbar.tsx"],"sourcesContent":["import React, { useState, useEffect, useLayoutEffect, useRef } from 'react';\nimport { useEditorState, type Editor } from '@tiptap/react';\nimport { TextSelection } from '@tiptap/pm/state';\nimport { ColorPicker } from './Toolbar/ColorPicker';\nimport { FONT_FAMILIES, FONT_SIZES } from './Toolbar/SelectDropdown';\n\ninterface BubbleToolbarProps {\n editor: Editor;\n onAddComment?: () => void;\n}\n\nconst BubbleToolbar: React.FC<BubbleToolbarProps> = ({ editor, onAddComment }) => {\n useEditorState({ editor, selector: ({ transactionNumber }) => transactionNumber });\n const [visible, setVisible] = useState(false);\n const [pos, setPos] = useState({ x: 0, y: 0 });\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (editor.isDestroyed) return;\n const doc = editor.view.dom.ownerDocument;\n const win = doc.defaultView;\n if (!win) return;\n let frame: number | null = null;\n const hide = () => {\n if (frame !== null) win.cancelAnimationFrame(frame);\n frame = null;\n setVisible(false);\n };\n const update = () => {\n frame = null;\n if (editor.isDestroyed) { hide(); return; }\n const { from, to } = editor.state.selection;\n if (!editor.isEditable || !(editor.state.selection instanceof TextSelection) || from === to || (!editor.isFocused && !ref.current?.contains(doc.activeElement))) {\n setVisible(false);\n return;\n }\n const coords = editor.view.coordsAtPos(from);\n const endCoords = editor.view.coordsAtPos(to);\n const wrapperEl = editor.view.dom.closest<HTMLElement>('.rte-editor-wrapper');\n if (!wrapperEl) { hide(); return; }\n const rect = wrapperEl.getBoundingClientRect();\n\n const centerX = (coords.left + endCoords.left) / 2 - rect.left - wrapperEl.clientLeft + wrapperEl.scrollLeft;\n const topY = Math.min(coords.top, endCoords.top) - rect.top - wrapperEl.clientTop + wrapperEl.scrollTop - 44;\n\n setPos({ x: centerX, y: topY });\n setVisible(true);\n };\n\n const scheduleUpdate = () => {\n if (frame !== null) win.cancelAnimationFrame(frame);\n frame = win.requestAnimationFrame(update);\n };\n const onBlur = ({ event }: { event: FocusEvent }) => {\n if (event.relatedTarget instanceof Node && ref.current?.contains(event.relatedTarget)) return;\n hide();\n };\n editor.on('transaction', scheduleUpdate);\n editor.on('selectionUpdate', scheduleUpdate);\n editor.on('focus', scheduleUpdate);\n editor.on('blur', onBlur);\n editor.on('destroy', hide);\n doc.addEventListener('scroll', scheduleUpdate, true);\n win.addEventListener('resize', scheduleUpdate);\n update();\n return () => {\n if (frame !== null) win.cancelAnimationFrame(frame);\n editor.off('transaction', scheduleUpdate);\n editor.off('selectionUpdate', scheduleUpdate);\n editor.off('focus', scheduleUpdate);\n editor.off('blur', onBlur);\n editor.off('destroy', hide);\n doc.removeEventListener('scroll', scheduleUpdate, true);\n win.removeEventListener('resize', scheduleUpdate);\n };\n }, [editor]);\n\n // Keep the bubble inside the wrapper horizontally: with the extra color /\n // font controls it can be wider than a phone-size editor, and transform:\n // translateX(-50%) would otherwise clip it at either edge.\n useLayoutEffect(() => {\n if (!visible || !ref.current) return;\n const el = ref.current;\n const wrapper = el.parentElement;\n if (!wrapper) return;\n const w = wrapper.clientWidth;\n const half = el.offsetWidth / 2;\n const min = Math.min(half + 4, w / 2);\n const max = Math.max(w - half - 4, w / 2);\n const clamped = Math.min(Math.max(pos.x, min), max);\n if (clamped !== pos.x) setPos((p) => ({ ...p, x: clamped }));\n }, [visible, pos.x]);\n\n if (!visible || editor.isDestroyed || !editor.isEditable) return null;\n\n const btn = (onClick: () => void, title: string, isActive: boolean | undefined, children: React.ReactNode) => (\n <button\n type=\"button\"\n className={`rte-bubble__btn ${isActive ? 'rte-bubble__btn--active' : ''}`}\n onClick={() => { if (!editor.isDestroyed && editor.isEditable) onClick(); }}\n title={title}\n aria-label={title}\n aria-pressed={isActive}\n onMouseDown={(e) => e.preventDefault()}\n >\n {children}\n </button>\n );\n\n return (\n <div ref={ref} className=\"rte-bubble\" role=\"group\" aria-label=\"Selection formatting\"\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget) && !editor.isFocused) setVisible(false);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n editor.commands.focus();\n setVisible(false);\n }\n }}\n style={{ left: pos.x, top: pos.y }}>\n {btn(() => editor.chain().focus().toggleBold().run(), 'Bold', editor.isActive('bold'),\n <strong style={{ fontSize: 13 }}>B</strong>)}\n {btn(() => editor.chain().focus().toggleItalic().run(), 'Italic', editor.isActive('italic'),\n <em style={{ fontSize: 13 }}>I</em>)}\n {btn(() => editor.chain().focus().toggleUnderline().run(), 'Underline', editor.isActive('underline'),\n <span style={{ fontSize: 13, textDecoration: 'underline' }}>U</span>)}\n {btn(() => editor.chain().focus().toggleStrike().run(), 'Strike', editor.isActive('strike'),\n <span style={{ fontSize: 13, textDecoration: 'line-through' }}>S</span>)}\n {btn(() => editor.chain().focus().toggleCode().run(), 'Code', editor.isActive('code'),\n <span style={{ fontSize: 11, fontFamily: 'monospace' }}></></span>)}\n {btn(() => {\n const url = window.prompt('URL:', editor.getAttributes('link').href || '');\n if (url === null || editor.isDestroyed || !editor.isEditable) return;\n const chain = editor.chain().focus().extendMarkRange('link');\n if (url.trim() === '') chain.unsetLink().run();\n else chain.setLink({ href: url.trim() }).run();\n }, 'Link', editor.isActive('link'),\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71\" /><path d=\"M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71\" /></svg>)}\n <div className=\"rte-bubble__divider\" />\n <ColorPicker\n value={editor.getAttributes('textStyle').color || ''}\n onChange={(color) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n if (color) editor.chain().focus().setColor(color).run();\n else editor.chain().focus().unsetColor().run();\n }}\n title=\"Text color\"\n buttonClassName=\"rte-bubble__btn\"\n kind=\"text\"\n />\n <ColorPicker\n value={editor.getAttributes('highlight').color || ''}\n onChange={(color) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n if (color) editor.chain().focus().toggleHighlight({ color }).run();\n else editor.chain().focus().unsetHighlight().run();\n }}\n title=\"Highlight color\"\n buttonClassName=\"rte-bubble__btn\"\n kind=\"highlight\"\n />\n <div className=\"rte-bubble__divider\" />\n <select\n className=\"rte-bubble__select\"\n value={editor.getAttributes('textStyle').fontFamily || ''}\n onChange={(e) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n if (e.target.value) editor.chain().focus().setFontFamily(e.target.value).run();\n else editor.chain().focus().unsetFontFamily().run();\n }}\n title=\"Font family\"\n aria-label=\"Font family\"\n >\n {FONT_FAMILIES.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n <select\n className=\"rte-bubble__select rte-bubble__select--size\"\n value={editor.getAttributes('textStyle').fontSize || ''}\n onChange={(e) => {\n if (editor.isDestroyed || !editor.isEditable) return;\n if (e.target.value) (editor.chain().focus() as any).setFontSize(e.target.value).run();\n else (editor.chain().focus() as any).unsetFontSize().run();\n }}\n title=\"Font size\"\n aria-label=\"Font size\"\n >\n {FONT_SIZES.map((opt) => (\n <option key={opt.value} value={opt.value}>{opt.label}</option>\n ))}\n </select>\n {onAddComment && (\n <>\n <div className=\"rte-bubble__divider\" />\n {btn(onAddComment, 'Comment', undefined,\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\"><path d=\"M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z\" /></svg>)}\n </>\n )}\n </div>\n );\n};\n\nexport default BubbleToolbar;\n"],"mappings":"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"}
|
|
@@ -3,7 +3,8 @@ interface ColorPickerProps {
|
|
|
3
3
|
value: string;
|
|
4
4
|
onChange: (color: string) => void;
|
|
5
5
|
title?: string;
|
|
6
|
-
icon
|
|
6
|
+
icon?: React.ReactNode;
|
|
7
|
+
kind?: 'text' | 'highlight';
|
|
7
8
|
/** Button class; defaults to the classic toolbar button. Bubble toolbar passes its own. */
|
|
8
9
|
buttonClassName?: string;
|
|
9
10
|
}
|
|
@@ -1,47 +1,82 @@
|
|
|
1
|
-
import { useEffect as e,
|
|
2
|
-
import { jsx as
|
|
1
|
+
import { useEffect as e, useId as t, useRef as n, useState as r } from "react";
|
|
2
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
3
3
|
//#region src/components/pro/RichTextEditor/Toolbar/ColorPicker.tsx
|
|
4
|
-
var
|
|
5
|
-
let [
|
|
4
|
+
var o = /* @__PURE__ */ "#000000.#434343.#666666.#999999.#cccccc.#eeeeee.#ffffff.#ff0000.#ff4500.#ff8c00.#ffd700.#32cd32.#00bfff.#8a2be2.#ff69b4.#dc143c.#ff6347.#ffa500.#9acd32.#20b2aa.#4169e1.#9370db.#db7093.#b22222.#d2691e.#daa520.#228b22.#008b8b.#191970.#4b0082".split("."), s = ({ value: s, onChange: c, title: l, icon: u, kind: d = "text", buttonClassName: f = "rte-toolbar__btn" }) => {
|
|
5
|
+
let [p, m] = r(!1), h = n(null), g = n(null), _ = t(), v = l || (d === "text" ? "Text color" : "Highlight color"), y = `${v}: ${s || (d === "text" ? "Default" : "None")}`;
|
|
6
6
|
return e(() => {
|
|
7
7
|
let e = (e) => {
|
|
8
|
-
|
|
8
|
+
h.current && !h.current.contains(e.target) && m(!1);
|
|
9
9
|
};
|
|
10
10
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
11
|
-
}, []), /* @__PURE__ */
|
|
12
|
-
ref:
|
|
11
|
+
}, []), /* @__PURE__ */ a("div", {
|
|
12
|
+
ref: h,
|
|
13
13
|
className: "rte-toolbar__color-picker",
|
|
14
|
+
onBlur: (e) => {
|
|
15
|
+
e.currentTarget.contains(e.relatedTarget) || m(!1);
|
|
16
|
+
},
|
|
17
|
+
onKeyDown: (e) => {
|
|
18
|
+
e.key === "Escape" && p && (e.preventDefault(), e.stopPropagation(), m(!1), g.current?.focus());
|
|
19
|
+
},
|
|
14
20
|
children: [/* @__PURE__ */ i("button", {
|
|
15
21
|
type: "button",
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
ref: g,
|
|
23
|
+
className: `${f} rte-toolbar__color-trigger`,
|
|
24
|
+
onClick: () => m(!p),
|
|
25
|
+
title: y,
|
|
26
|
+
"aria-label": y,
|
|
27
|
+
"aria-expanded": p,
|
|
28
|
+
"aria-controls": p ? _ : void 0,
|
|
29
|
+
children: /* @__PURE__ */ a("span", {
|
|
30
|
+
className: `rte-toolbar__color-icon rte-toolbar__color-icon--${d}`,
|
|
31
|
+
"aria-hidden": "true",
|
|
32
|
+
children: [u || (d === "text" ? /* @__PURE__ */ i("span", {
|
|
33
|
+
className: "rte-toolbar__color-letter",
|
|
34
|
+
children: "A"
|
|
35
|
+
}) : /* @__PURE__ */ i("svg", {
|
|
36
|
+
width: "18",
|
|
37
|
+
height: "16",
|
|
38
|
+
viewBox: "0 0 24 24",
|
|
39
|
+
fill: "none",
|
|
40
|
+
stroke: "currentColor",
|
|
41
|
+
strokeWidth: "2",
|
|
42
|
+
strokeLinecap: "round",
|
|
43
|
+
strokeLinejoin: "round",
|
|
44
|
+
children: /* @__PURE__ */ i("path", { d: "m14 3 7 7-9 9-7-7zM5 12l-2 7 2 2 7-2M14 7l3 3M3 21h6" })
|
|
45
|
+
})), /* @__PURE__ */ i("span", {
|
|
46
|
+
className: `rte-toolbar__color-indicator${s ? "" : " rte-toolbar__color-indicator--empty"}`,
|
|
47
|
+
style: { backgroundColor: s || void 0 }
|
|
48
|
+
})]
|
|
49
|
+
})
|
|
50
|
+
}), p && /* @__PURE__ */ a("div", {
|
|
51
|
+
id: _,
|
|
24
52
|
className: "rte-toolbar__color-dropdown",
|
|
25
|
-
|
|
53
|
+
role: "group",
|
|
54
|
+
"aria-label": v,
|
|
55
|
+
children: [o.map((e) => /* @__PURE__ */ i("button", {
|
|
26
56
|
type: "button",
|
|
27
|
-
className: `rte-toolbar__color-swatch ${e ===
|
|
57
|
+
className: `rte-toolbar__color-swatch ${e === s ? "rte-toolbar__color-swatch--active" : ""}`,
|
|
28
58
|
style: { backgroundColor: e },
|
|
29
59
|
onClick: () => {
|
|
30
|
-
|
|
60
|
+
c(e), m(!1);
|
|
31
61
|
},
|
|
32
|
-
title: e
|
|
33
|
-
|
|
62
|
+
title: `${v}: ${e}`,
|
|
63
|
+
"aria-label": `${v}: ${e}`,
|
|
64
|
+
"aria-pressed": e.toLowerCase() === s.toLowerCase()
|
|
65
|
+
}, e)), /* @__PURE__ */ i("button", {
|
|
34
66
|
type: "button",
|
|
35
67
|
className: "rte-toolbar__color-clear",
|
|
36
68
|
onClick: () => {
|
|
37
|
-
|
|
69
|
+
c(""), m(!1);
|
|
38
70
|
},
|
|
71
|
+
title: `Clear ${v}`,
|
|
72
|
+
"aria-label": `Clear ${v}`,
|
|
73
|
+
"aria-pressed": !s,
|
|
39
74
|
children: "Clear"
|
|
40
75
|
})]
|
|
41
76
|
})]
|
|
42
77
|
});
|
|
43
78
|
};
|
|
44
79
|
//#endregion
|
|
45
|
-
export {
|
|
80
|
+
export { s as ColorPicker };
|
|
46
81
|
|
|
47
82
|
//# sourceMappingURL=ColorPicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ColorPicker.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/Toolbar/ColorPicker.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\n\ninterface ColorPickerProps {\n value: string;\n onChange: (color: string) => void;\n title?: string;\n icon
|
|
1
|
+
{"version":3,"file":"ColorPicker.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/Toolbar/ColorPicker.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useId } from 'react';\n\ninterface ColorPickerProps {\n value: string;\n onChange: (color: string) => void;\n title?: string;\n icon?: React.ReactNode;\n kind?: 'text' | 'highlight';\n /** Button class; defaults to the classic toolbar button. Bubble toolbar passes its own. */\n buttonClassName?: string;\n}\n\nconst COLORS = [\n '#000000', '#434343', '#666666', '#999999', '#cccccc', '#eeeeee', '#ffffff',\n '#ff0000', '#ff4500', '#ff8c00', '#ffd700', '#32cd32', '#00bfff', '#8a2be2',\n '#ff69b4', '#dc143c', '#ff6347', '#ffa500', '#9acd32', '#20b2aa', '#4169e1',\n '#9370db', '#db7093', '#b22222', '#d2691e', '#daa520', '#228b22', '#008b8b',\n '#191970', '#4b0082',\n];\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({ value, onChange, title, icon, kind = 'text', buttonClassName = 'rte-toolbar__btn' }) => {\n const [isOpen, setIsOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const paletteId = useId();\n const label = title || (kind === 'text' ? 'Text color' : 'Highlight color');\n const description = `${label}: ${value || (kind === 'text' ? 'Default' : 'None')}`;\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, []);\n\n return (\n <div ref={ref} className=\"rte-toolbar__color-picker\"\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) setIsOpen(false);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape' && isOpen) {\n event.preventDefault();\n event.stopPropagation();\n setIsOpen(false);\n triggerRef.current?.focus();\n }\n }}>\n <button\n type=\"button\"\n ref={triggerRef}\n className={`${buttonClassName} rte-toolbar__color-trigger`}\n onClick={() => setIsOpen(!isOpen)}\n title={description}\n aria-label={description}\n aria-expanded={isOpen}\n aria-controls={isOpen ? paletteId : undefined}\n >\n <span className={`rte-toolbar__color-icon rte-toolbar__color-icon--${kind}`} aria-hidden=\"true\">\n {icon || (kind === 'text' ? <span className=\"rte-toolbar__color-letter\">A</span> : (\n <svg width=\"18\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m14 3 7 7-9 9-7-7zM5 12l-2 7 2 2 7-2M14 7l3 3M3 21h6\" />\n </svg>\n ))}\n <span\n className={`rte-toolbar__color-indicator${value ? '' : ' rte-toolbar__color-indicator--empty'}`}\n style={{ backgroundColor: value || undefined }}\n />\n </span>\n </button>\n {isOpen && (\n <div id={paletteId} className=\"rte-toolbar__color-dropdown\" role=\"group\" aria-label={label}>\n {COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n className={`rte-toolbar__color-swatch ${c === value ? 'rte-toolbar__color-swatch--active' : ''}`}\n style={{ backgroundColor: c }}\n onClick={() => { onChange(c); setIsOpen(false); }}\n title={`${label}: ${c}`}\n aria-label={`${label}: ${c}`}\n aria-pressed={c.toLowerCase() === value.toLowerCase()}\n />\n ))}\n <button\n type=\"button\"\n className=\"rte-toolbar__color-clear\"\n onClick={() => { onChange(''); setIsOpen(false); }}\n title={`Clear ${label}`}\n aria-label={`Clear ${label}`}\n aria-pressed={!value}\n >\n Clear\n </button>\n </div>\n )}\n </div>\n );\n};\n"],"mappings":";;;AAYA,IAAM,IAAS,2QAMf,GAEa,KAA2C,EAAE,UAAO,aAAU,UAAO,SAAM,UAAO,QAAQ,qBAAkB,yBAAyB;CAChJ,IAAM,CAAC,GAAQ,KAAa,EAAS,EAAK,GACpC,IAAM,EAAuB,IAAI,GACjC,IAAa,EAA0B,IAAI,GAC3C,IAAY,EAAM,GAClB,IAAQ,MAAU,MAAS,SAAS,eAAe,oBACnD,IAAc,GAAG,EAAM,IAAI,MAAU,MAAS,SAAS,YAAY;CAYzE,OAVA,QAAgB;EACd,IAAM,KAAW,MAAkB;GACjC,AAAI,EAAI,WAAW,CAAC,EAAI,QAAQ,SAAS,EAAE,MAAc,KACvD,EAAU,EAAK;EAEnB;EAEA,OADA,SAAS,iBAAiB,aAAa,CAAO,SACjC,SAAS,oBAAoB,aAAa,CAAO;CAChE,GAAG,CAAC,CAAC,GAGH,kBAAC,OAAD;EAAU;EAAK,WAAU;EACvB,SAAS,MAAU;GACjB,AAAK,EAAM,cAAc,SAAS,EAAM,aAAa,KAAG,EAAU,EAAK;EACzE;EACA,YAAY,MAAU;GACpB,AAAI,EAAM,QAAQ,YAAY,MAC5B,EAAM,eAAe,GACrB,EAAM,gBAAgB,GACtB,EAAU,EAAK,GACf,EAAW,SAAS,MAAM;EAE9B;EAXF,UAAA,CAYE,kBAAC,UAAD;GACE,MAAK;GACL,KAAK;GACL,WAAW,GAAG,EAAgB;GAC9B,eAAe,EAAU,CAAC,CAAM;GAChC,OAAO;GACP,cAAY;GACZ,iBAAe;GACf,iBAAe,IAAS,IAAY,KAAA;GAEpC,UAAA,kBAAC,QAAD;IAAM,WAAW,oDAAoD;IAAQ,eAAY;IAAzF,UAAA,CACG,MAAS,MAAS,SAAS,kBAAC,QAAD;KAAM,WAAU;KAA4B,UAAA;IAAO,CAAA,IAC7E,kBAAC,OAAD;KAAK,OAAM;KAAK,QAAO;KAAK,SAAQ;KAAY,MAAK;KAAO,QAAO;KAAe,aAAY;KAAI,eAAc;KAAQ,gBAAe;KACrI,UAAA,kBAAC,QAAD,EAAM,GAAE,uDAAwD,CAAA;IAC7D,CAAA,IAEP,kBAAC,QAAD;KACE,WAAW,+BAA+B,IAAQ,KAAK;KACvD,OAAO,EAAE,iBAAiB,KAAS,KAAA,EAAU;IAC9C,CAAA,CACG;;EACA,CAAA,GACP,KACC,kBAAC,OAAD;GAAK,IAAI;GAAW,WAAU;GAA8B,MAAK;GAAQ,cAAY;GAArF,UAAA,CACG,EAAO,KAAK,MACX,kBAAC,UAAD;IAEE,MAAK;IACL,WAAW,6BAA6B,MAAM,IAAQ,sCAAsC;IAC5F,OAAO,EAAE,iBAAiB,EAAE;IAC5B,eAAe;KAAe,AAAb,EAAS,CAAC,GAAG,EAAU,EAAK;IAAG;IAChD,OAAO,GAAG,EAAM,IAAI;IACpB,cAAY,GAAG,EAAM,IAAI;IACzB,gBAAc,EAAE,YAAY,MAAM,EAAM,YAAY;GACrD,GARM,CAQN,CACF,GACD,kBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,eAAe;KAAgB,AAAd,EAAS,EAAE,GAAG,EAAU,EAAK;IAAG;IACjD,OAAO,SAAS;IAChB,cAAY,SAAS;IACrB,gBAAc,CAAC;IAChB,UAAA;GAEO,CAAA,CACL;EAEJ,CAAA,CAAA;;AAET"}
|
|
@@ -949,17 +949,7 @@ var y = /* @__PURE__ */ new Set([
|
|
|
949
949
|
e ? b.chain().focus().setColor(e).run() : b.chain().focus().unsetColor().run();
|
|
950
950
|
},
|
|
951
951
|
title: D.color,
|
|
952
|
-
|
|
953
|
-
width: "16",
|
|
954
|
-
height: "16",
|
|
955
|
-
viewBox: "0 0 24 24",
|
|
956
|
-
fill: "none",
|
|
957
|
-
stroke: "currentColor",
|
|
958
|
-
strokeWidth: "2",
|
|
959
|
-
strokeLinecap: "round",
|
|
960
|
-
strokeLinejoin: "round",
|
|
961
|
-
children: /* @__PURE__ */ g("path", { d: "M12 2L2 22h20L12 2z" })
|
|
962
|
-
})
|
|
952
|
+
kind: "text"
|
|
963
953
|
}),
|
|
964
954
|
/* @__PURE__ */ g(i, {
|
|
965
955
|
value: b.getAttributes("highlight").color || "",
|
|
@@ -967,17 +957,7 @@ var y = /* @__PURE__ */ new Set([
|
|
|
967
957
|
e ? b.chain().focus().toggleHighlight({ color: e }).run() : b.chain().focus().unsetHighlight().run();
|
|
968
958
|
},
|
|
969
959
|
title: D.highlight,
|
|
970
|
-
|
|
971
|
-
width: "16",
|
|
972
|
-
height: "16",
|
|
973
|
-
viewBox: "0 0 24 24",
|
|
974
|
-
fill: "none",
|
|
975
|
-
stroke: "currentColor",
|
|
976
|
-
strokeWidth: "2",
|
|
977
|
-
strokeLinecap: "round",
|
|
978
|
-
strokeLinejoin: "round",
|
|
979
|
-
children: [/* @__PURE__ */ g("path", { d: "M12 20h9" }), /* @__PURE__ */ g("path", { d: "M16.5 3.5a2.121 2.121 0 013 3L7 19l-4 1 1-4L16.5 3.5z" })]
|
|
980
|
-
})
|
|
960
|
+
kind: "highlight"
|
|
981
961
|
}),
|
|
982
962
|
/* @__PURE__ */ g(r, {})
|
|
983
963
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/Toolbar/Toolbar.tsx"],"sourcesContent":["import React, { useCallback, useState, useEffect, useRef } from 'react';\nimport { useEditorState, type Editor } from '@tiptap/react';\nimport type { Mark } from '@tiptap/pm/model';\nimport type { ToolbarSection, RichTextEditorLabels } from '../types';\nimport { defaultLabels } from '../types';\nimport { getNextFloatZIndex } from '../extensions/FloatingDialog';\nimport { ToolbarButton, ToolbarDivider } from './ToolbarButton';\nimport { ColorPicker } from './ColorPicker';\nimport { SelectDropdown, FONT_FAMILIES, FONT_SIZES } from './SelectDropdown';\nimport { MarkdownTemplateMenu } from './MarkdownTemplates';\nimport { FloatingDialogMenu } from './FloatingDialogMenu';\nimport { TableOpsMenu } from './TableOpsMenu';\n\n// Only visual formatting belongs to the painter, never links or comment IDs.\nconst PAINT_MARKS = new Set(['bold', 'italic', 'underline', 'strike', 'code', 'subscript', 'superscript', 'textStyle', 'highlight']);\n\ninterface ToolbarProps {\n editor: Editor;\n config?: ToolbarSection;\n labels?: RichTextEditorLabels;\n hasAI?: boolean;\n onAIClick?: () => void;\n onFormatPainterChange?: (active: boolean) => void;\n children?: React.ReactNode;\n}\n\nconst Toolbar: React.FC<ToolbarProps> = ({\n editor,\n config,\n labels: propsLabels,\n hasAI,\n onAIClick,\n onFormatPainterChange,\n children,\n}) => {\n const labels = { ...defaultLabels, ...propsLabels };\n useEditorState({ editor, selector: ({ transactionNumber }) => transactionNumber });\n const [formatPainterMarks, setFormatPainterMarks] = useState<readonly Mark[] | null>(null);\n const painterChange = useRef(onFormatPainterChange);\n useEffect(() => {\n painterChange.current = onFormatPainterChange;\n }, [onFormatPainterChange]);\n\n const cfg: Required<ToolbarSection> = {\n textFormat: config?.textFormat ?? true,\n heading: config?.heading ?? true,\n alignment: config?.alignment ?? true,\n list: config?.list ?? true,\n insert: config?.insert ?? true,\n color: config?.color ?? true,\n history: config?.history ?? true,\n ai: config?.ai ?? true,\n tableOps: config?.tableOps ?? true,\n fontStyle: config?.fontStyle ?? true,\n formatPainter: config?.formatPainter ?? true,\n };\n\n const setLink = useCallback(() => {\n const previousUrl = editor.getAttributes('link').href;\n const url = window.prompt(labels.insertLinkUrl, previousUrl);\n if (url === null) return;\n if (editor.isDestroyed || !editor.isEditable) return;\n if (url.trim() === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n editor.chain().focus().extendMarkRange('link').setLink({ href: url.trim() }).run();\n }, [editor, labels.insertLinkUrl]);\n\n const addImage = useCallback(() => {\n const url = window.prompt(labels.insertImageUrl);\n if (url) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }, [editor, labels.insertImageUrl]);\n\n const insertTable = useCallback(() => {\n editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run();\n }, [editor]);\n\n const insertMarkdownBlock = useCallback(() => {\n editor.chain().focus().insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-markdown' },\n content: [{ type: 'text', text: '# Markdown\\n\\nWrite your **markdown** here.' }],\n }).run();\n }, [editor]);\n\n const insertMarkdownTemplate = useCallback((content: string) => {\n editor.chain().focus().insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-markdown' },\n content: [{ type: 'text', text: content }],\n }).run();\n }, [editor]);\n\n const insertFloatingDialog = useCallback((layout: 'block' | 'wrap-left' | 'wrap-right' | 'float' = 'block') => {\n const extraAttrs = layout === 'float'\n ? { x: 40, y: 40, zIndex: getNextFloatZIndex(editor) }\n : layout === 'block'\n ? {}\n : { width: 240 };\n editor.chain().focus().insertContent({\n type: 'floatingDialog',\n attrs: { title: 'Note', layout, ...extraAttrs },\n content: [{ type: 'paragraph' }],\n }).run();\n }, [editor]);\n\n const handleFormatPainter = useCallback(() => {\n if (formatPainterMarks) {\n setFormatPainterMarks(null);\n return;\n }\n if (editor.isDestroyed || !editor.isEditable) return;\n const { from, to } = editor.state.selection;\n if (from === to) return;\n\n let marks: readonly Mark[] | undefined;\n editor.state.doc.nodesBetween(from, to, (node) => {\n if (!node.isText) return;\n const formatting = node.marks.filter((mark) => PAINT_MARKS.has(mark.type.name));\n marks = marks === undefined ? formatting : marks.filter((mark) => formatting.some((other) => mark.eq(other)));\n });\n if (marks === undefined) return;\n setFormatPainterMarks(marks);\n }, [editor, formatPainterMarks]);\n\n useEffect(() => {\n if (!formatPainterMarks) return;\n if (editor.isDestroyed || !editor.isEditable || !cfg.formatPainter || !cfg.textFormat) {\n setFormatPainterMarks(null);\n return;\n }\n\n painterChange.current?.(true);\n const editorEl = editor.view.dom;\n let frame: number | null = null;\n let cancelled = false;\n const cancel = () => {\n cancelled = true;\n if (frame !== null) cancelAnimationFrame(frame);\n frame = null;\n setFormatPainterMarks(null);\n };\n const onTransaction = () => {\n if (!editor.isEditable) cancel();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') cancel();\n };\n\n const applyMarks = () => {\n frame = null;\n if (cancelled || editor.isDestroyed || !editor.isEditable) return;\n const { from, to } = editor.state.selection;\n if (from === to) return;\n\n const { tr } = editor.state;\n for (const name of PAINT_MARKS) {\n const type = editor.schema.marks[name];\n if (type) tr.removeMark(from, to, type);\n }\n editor.state.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isText) return;\n const semantic = node.marks.filter((mark) => !PAINT_MARKS.has(mark.type.name));\n for (const mark of formatPainterMarks) {\n // Code and custom exclusions must not implicitly remove semantic marks.\n if (semantic.some((other) => mark.type.excludes(other.type) || other.type.excludes(mark.type))) continue;\n tr.addMark(Math.max(from, pos), Math.min(to, pos + node.nodeSize), mark);\n }\n });\n cancelled = true;\n editor.view.dispatch(tr);\n setFormatPainterMarks(null);\n };\n\n const onMouseUp = () => {\n if (cancelled) return;\n if (frame !== null) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(applyMarks);\n };\n\n editorEl.addEventListener('mouseup', onMouseUp);\n editorEl.ownerDocument.addEventListener('keydown', onKeyDown);\n editor.on('transaction', onTransaction);\n editor.on('destroy', cancel);\n return () => {\n cancelled = true;\n if (frame !== null) cancelAnimationFrame(frame);\n editorEl.removeEventListener('mouseup', onMouseUp);\n editorEl.ownerDocument.removeEventListener('keydown', onKeyDown);\n editor.off('transaction', onTransaction);\n editor.off('destroy', cancel);\n painterChange.current?.(false);\n };\n }, [editor, formatPainterMarks, cfg.formatPainter, cfg.textFormat]);\n\n const currentFontFamily = editor.getAttributes('textStyle').fontFamily || '';\n const currentFontSize = editor.getAttributes('textStyle').fontSize || '';\n\n return (\n <div className=\"rte-toolbar\" role=\"group\" aria-label=\"Text formatting\">\n {cfg.history && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title={labels.undo}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"1 4 1 10 7 10\" />\n <path d=\"M3.51 15a9 9 0 102.13-9.36L1 10\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title={labels.redo}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"23 4 23 10 17 10\" />\n <path d=\"M20.49 15a9 9 0 11-2.13-9.36L23 10\" />\n </svg>\n </ToolbarButton>\n <ToolbarDivider />\n </>\n )}\n\n {cfg.fontStyle && (\n <>\n <SelectDropdown\n value={currentFontFamily}\n options={FONT_FAMILIES}\n onChange={(val) => {\n if (val) {\n editor.chain().focus().setFontFamily(val).run();\n } else {\n editor.chain().focus().unsetFontFamily().run();\n }\n }}\n title={labels.fontFamily}\n width={120}\n />\n <SelectDropdown\n value={currentFontSize}\n options={FONT_SIZES}\n onChange={(val) => {\n if (val) {\n (editor.chain().focus() as any).setFontSize(val).run();\n } else {\n (editor.chain().focus() as any).unsetFontSize().run();\n }\n }}\n title={labels.fontSize}\n width={80}\n />\n <ToolbarDivider />\n </>\n )}\n\n {cfg.textFormat && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n isActive={editor.isActive('bold')}\n title={labels.bold}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 4h8a4 4 0 014 4 4 4 0 01-4 4H6z\" />\n <path d=\"M6 12h9a4 4 0 014 4 4 4 0 01-4 4H6z\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n isActive={editor.isActive('italic')}\n title={labels.italic}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\" />\n <line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\" />\n <line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n isActive={editor.isActive('underline')}\n title={labels.underline}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 3v7a6 6 0 006 6 6 6 0 006-6V3\" />\n <line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleStrike().run()}\n isActive={editor.isActive('strike')}\n title={labels.strikethrough}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.3 4.9c-2.3-.6-4.4-1-6.2-.9-2.7 0-5.3.7-5.3 3.6 0 1.5 1.8 3.3 7.2 3.3\" />\n <path d=\"M13 15.1c0 2.8-2.6 3.6-5.3 3.6-1.8-.1-3.9-.5-6.2-.9\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n isActive={editor.isActive('subscript')}\n title={labels.subscript}\n >\n <span style={{ fontSize: '13px', fontWeight: 600 }}>X<sub style={{ fontSize: '9px' }}>2</sub></span>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n isActive={editor.isActive('superscript')}\n title={labels.superscript}\n >\n <span style={{ fontSize: '13px', fontWeight: 600 }}>X<sup style={{ fontSize: '9px' }}>2</sup></span>\n </ToolbarButton>\n {cfg.formatPainter && (\n <ToolbarButton\n onClick={handleFormatPainter}\n disabled={!editor.isEditable || (!formatPainterMarks && editor.state.selection.empty)}\n isActive={!!formatPainterMarks}\n title={formatPainterMarks ? labels.formatPainterActive : labels.formatPainter}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 3H5a2 2 0 00-2 2v2a2 2 0 002 2h14a2 2 0 002-2V5a2 2 0 00-2-2z\" />\n <path d=\"M10 7v4a2 2 0 01-2 2H7\" />\n <path d=\"M7 13l-3 8\" />\n <path d=\"M4 21h6\" />\n </svg>\n </ToolbarButton>\n )}\n <ToolbarDivider />\n </>\n )}\n\n {cfg.heading && (\n <>\n {([1, 2, 3, 4, 5, 6] as const).map((level) => (\n <ToolbarButton\n key={level}\n onClick={() => editor.chain().focus().toggleHeading({ level }).run()}\n isActive={editor.isActive('heading', { level })}\n title={`${labels.heading} ${level}`}\n >\n <span style={{ fontSize: '12px', fontWeight: 700 }}>H{level}</span>\n </ToolbarButton>\n ))}\n <ToolbarDivider />\n </>\n )}\n\n {cfg.alignment && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n isActive={editor.isActive({ textAlign: 'left' })}\n title={labels.alignLeft}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"17\" y1=\"10\" x2=\"3\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"17\" y1=\"18\" x2=\"3\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n isActive={editor.isActive({ textAlign: 'center' })}\n title={labels.alignCenter}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"10\" x2=\"6\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"18\" y1=\"18\" x2=\"6\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n isActive={editor.isActive({ textAlign: 'right' })}\n title={labels.alignRight}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"21\" y1=\"10\" x2=\"7\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"21\" y1=\"18\" x2=\"7\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('justify').run()}\n isActive={editor.isActive({ textAlign: 'justify' })}\n title={labels.alignJustify}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"21\" y1=\"10\" x2=\"3\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"21\" y1=\"18\" x2=\"3\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarDivider />\n </>\n )}\n\n {cfg.list && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n isActive={editor.isActive('bulletList')}\n title={labels.bulletList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" /><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <circle cx=\"4\" cy=\"6\" r=\"1\" fill=\"currentColor\" /><circle cx=\"4\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"4\" cy=\"18\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n isActive={editor.isActive('orderedList')}\n title={labels.orderedList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" /><line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <text x=\"2\" y=\"8\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">1</text>\n <text x=\"2\" y=\"14\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">2</text>\n <text x=\"2\" y=\"20\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">3</text>\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleTaskList().run()}\n isActive={editor.isActive('taskList')}\n title={labels.taskList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"5\" width=\"6\" height=\"6\" rx=\"1\" /><path d=\"M5 8l1.5 1.5L9 6.5\" />\n <line x1=\"12\" y1=\"8\" x2=\"21\" y2=\"8\" />\n <rect x=\"3\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\" />\n <line x1=\"12\" y1=\"17\" x2=\"21\" y2=\"17\" />\n </svg>\n </ToolbarButton>\n <ToolbarDivider />\n </>\n )}\n\n {cfg.insert && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n isActive={editor.isActive('blockquote')}\n title={labels.blockquote}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V21z\" />\n <path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3z\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleNode('codeBlock', 'paragraph').run()}\n isActive={editor.isActive('codeBlock')}\n title={labels.codeBlock}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"16 18 22 12 16 6\" /><polyline points=\"8 6 2 12 8 18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => {\n editor.chain().focus().insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-mermaid' },\n content: [{ type: 'text', text: 'graph TD\\n A[Start] --> B[End]' }],\n }).run();\n }}\n title={labels.mermaidBlock}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"6\" cy=\"6\" r=\"3\" /><circle cx=\"18\" cy=\"6\" r=\"3\" />\n <circle cx=\"12\" cy=\"18\" r=\"3\" />\n <line x1=\"6\" y1=\"9\" x2=\"12\" y2=\"15\" /><line x1=\"18\" y1=\"9\" x2=\"12\" y2=\"15\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={setLink} isActive={editor.isActive('link')} title={labels.link}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={addImage} title={labels.image}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" /><polyline points=\"21 15 16 10 5 21\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={insertTable} title={labels.table}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" /><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" /><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\" />\n </svg>\n </ToolbarButton>\n {cfg.tableOps && <TableOpsMenu editor={editor} labels={labels} />}\n <ToolbarButton\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n title={labels.horizontalRule}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={insertMarkdownBlock} title={labels.markdownBlock}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M2 3h20v18H2z\" />\n <path d=\"M5 15V9l3 3.5L11 9v6\" />\n <path d=\"M17 9l-2.5 3H17v3\" />\n </svg>\n </ToolbarButton>\n <MarkdownTemplateMenu labels={labels} onSelect={insertMarkdownTemplate} />\n <FloatingDialogMenu labels={labels} onInsert={insertFloatingDialog} />\n <ToolbarDivider />\n </>\n )}\n\n {cfg.color && (\n <>\n <ColorPicker\n value={editor.getAttributes('textStyle').color || ''}\n onChange={(color) => {\n if (color) {\n editor.chain().focus().setColor(color).run();\n } else {\n editor.chain().focus().unsetColor().run();\n }\n }}\n title={labels.color}\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 2L2 22h20L12 2z\" />\n </svg>\n }\n />\n <ColorPicker\n value={editor.getAttributes('highlight').color || ''}\n onChange={(color) => {\n if (color) {\n editor.chain().focus().toggleHighlight({ color }).run();\n } else {\n editor.chain().focus().unsetHighlight().run();\n }\n }}\n title={labels.highlight}\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 20h9\" /><path d=\"M16.5 3.5a2.121 2.121 0 013 3L7 19l-4 1 1-4L16.5 3.5z\" />\n </svg>\n }\n />\n <ToolbarDivider />\n </>\n )}\n\n {cfg.ai && hasAI && onAIClick && (\n <ToolbarButton onClick={onAIClick} title={labels.ai}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M9.5 2A2.5 2.5 0 0112 4.5v15a2.5 2.5 0 01-4.96.44 2.5 2.5 0 01-2.96-3.08 3 3 0 01-.34-5.58 2.5 2.5 0 011.32-4.24 2.5 2.5 0 011.98-3A2.5 2.5 0 019.5 2z\" />\n <path d=\"M14.5 2A2.5 2.5 0 0012 4.5v15a2.5 2.5 0 004.96.44 2.5 2.5 0 002.96-3.08 3 3 0 00.34-5.58 2.5 2.5 0 00-1.32-4.24 2.5 2.5 0 00-1.98-3A2.5 2.5 0 0014.5 2z\" />\n </svg>\n </ToolbarButton>\n )}\n\n {children}\n </div>\n );\n};\n\nexport default Toolbar;\n"],"mappings":";;;;;;;;;;;;AAcA,IAAM,oBAAc,IAAI,IAAI;CAAC;CAAQ;CAAU;CAAa;CAAU;CAAQ;CAAa;CAAe;CAAa;AAAW,CAAC,GAY7H,KAAmC,EACvC,WACA,WACA,QAAQ,GACR,UACA,cACA,0BACA,kBACI;CACJ,IAAM,IAAS;EAAE,GAAG;EAAe,GAAG;CAAY;CAClD,EAAe;EAAE;EAAQ,WAAW,EAAE,2BAAwB;CAAkB,CAAC;CACjF,IAAM,CAAC,GAAoB,KAAyB,EAAiC,IAAI,GACnF,IAAgB,EAAO,CAAqB;CAClD,QAAgB;EACd,EAAc,UAAU;CAC1B,GAAG,CAAC,CAAqB,CAAC;CAE1B,IAAM,IAAgC;EACpC,YAAY,GAAQ,cAAc;EAClC,SAAS,GAAQ,WAAW;EAC5B,WAAW,GAAQ,aAAa;EAChC,MAAM,GAAQ,QAAQ;EACtB,QAAQ,GAAQ,UAAU;EAC1B,OAAO,GAAQ,SAAS;EACxB,SAAS,GAAQ,WAAW;EAC5B,IAAI,GAAQ,MAAM;EAClB,UAAU,GAAQ,YAAY;EAC9B,WAAW,GAAQ,aAAa;EAChC,eAAe,GAAQ,iBAAiB;CAC1C,GAEM,IAAU,QAAkB;EAChC,IAAM,IAAc,EAAO,cAAc,MAAM,CAAC,CAAC,MAC3C,IAAM,OAAO,OAAO,EAAO,eAAe,CAAW;EACvD,UAAQ,QACR,GAAO,eAAgB,EAAO,YAClC;OAAI,EAAI,KAAK,MAAM,IAAI;IACrB,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI;IAC/D;GACF;GACA,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;EADjF;CAEF,GAAG,CAAC,GAAQ,EAAO,aAAa,CAAC,GAE3B,IAAW,QAAkB;EACjC,IAAM,IAAM,OAAO,OAAO,EAAO,cAAc;EAC/C,AAAI,KACF,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,KAAK,EAAI,CAAC,CAAC,CAAC,IAAI;CAEtD,GAAG,CAAC,GAAQ,EAAO,cAAc,CAAC,GAE5B,IAAc,QAAkB;EACpC,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY;GAAE,MAAM;GAAG,MAAM;GAAG,eAAe;EAAK,CAAC,CAAC,CAAC,IAAI;CACpF,GAAG,CAAC,CAAM,CAAC,GAEL,IAAsB,QAAkB;EAC5C,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc;GACnC,MAAM;GACN,OAAO,EAAE,UAAU,aAAa;GAChC,SAAS,CAAC;IAAE,MAAM;IAAQ,MAAM;GAA8C,CAAC;EACjF,CAAC,CAAC,CAAC,IAAI;CACT,GAAG,CAAC,CAAM,CAAC,GAEL,IAAyB,GAAa,MAAoB;EAC9D,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc;GACnC,MAAM;GACN,OAAO,EAAE,UAAU,aAAa;GAChC,SAAS,CAAC;IAAE,MAAM;IAAQ,MAAM;GAAQ,CAAC;EAC3C,CAAC,CAAC,CAAC,IAAI;CACT,GAAG,CAAC,CAAM,CAAC,GAEL,IAAuB,GAAa,IAAyD,YAAY;EAC7G,IAAM,IAAa,MAAW,UAC1B;GAAE,GAAG;GAAI,GAAG;GAAI,QAAQ,EAAmB,CAAM;EAAE,IACnD,MAAW,UACT,CAAC,IACD,EAAE,OAAO,IAAI;EACnB,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc;GACnC,MAAM;GACN,OAAO;IAAE,OAAO;IAAQ;IAAQ,GAAG;GAAW;GAC9C,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC;EACjC,CAAC,CAAC,CAAC,IAAI;CACT,GAAG,CAAC,CAAM,CAAC,GAEL,IAAsB,QAAkB;EAC5C,IAAI,GAAoB;GACtB,EAAsB,IAAI;GAC1B;EACF;EACA,IAAI,EAAO,eAAe,CAAC,EAAO,YAAY;EAC9C,IAAM,EAAE,SAAM,UAAO,EAAO,MAAM;EAClC,IAAI,MAAS,GAAI;EAEjB,IAAI;EACJ,EAAO,MAAM,IAAI,aAAa,GAAM,IAAK,MAAS;GAChD,IAAI,CAAC,EAAK,QAAQ;GAClB,IAAM,IAAa,EAAK,MAAM,QAAQ,MAAS,EAAY,IAAI,EAAK,KAAK,IAAI,CAAC;GAC9E,IAAQ,MAAU,KAAA,IAAY,IAAa,EAAM,QAAQ,MAAS,EAAW,MAAM,MAAU,EAAK,GAAG,CAAK,CAAC,CAAC;EAC9G,CAAC,GACG,MAAU,KAAA,KACd,EAAsB,CAAK;CAC7B,GAAG,CAAC,GAAQ,CAAkB,CAAC;CAE/B,QAAgB;EACd,IAAI,CAAC,GAAoB;EACzB,IAAI,EAAO,eAAe,CAAC,EAAO,cAAc,CAAC,EAAI,iBAAiB,CAAC,EAAI,YAAY;GACrF,EAAsB,IAAI;GAC1B;EACF;EAEA,EAAc,UAAU,EAAI;EAC5B,IAAM,IAAW,EAAO,KAAK,KACzB,IAAuB,MACvB,IAAY,IACV,UAAe;GAInB,AAHA,IAAY,IACR,MAAU,QAAM,qBAAqB,CAAK,GAC9C,IAAQ,MACR,EAAsB,IAAI;EAC5B,GACM,UAAsB;GAC1B,AAAK,EAAO,cAAY,EAAO;EACjC,GACM,KAAa,MAAyB;GAC1C,AAAI,EAAM,QAAQ,YAAU,EAAO;EACrC,GAEM,UAAmB;GAEvB,IADA,IAAQ,MACJ,KAAa,EAAO,eAAe,CAAC,EAAO,YAAY;GAC3D,IAAM,EAAE,SAAM,UAAO,EAAO,MAAM;GAClC,IAAI,MAAS,GAAI;GAEjB,IAAM,EAAE,UAAO,EAAO;GACtB,KAAK,IAAM,KAAQ,GAAa;IAC9B,IAAM,IAAO,EAAO,OAAO,MAAM;IACjC,AAAI,KAAM,EAAG,WAAW,GAAM,GAAI,CAAI;GACxC;GAYA,AAXA,EAAO,MAAM,IAAI,aAAa,GAAM,IAAK,GAAM,MAAQ;IACrD,IAAI,CAAC,EAAK,QAAQ;IAClB,IAAM,IAAW,EAAK,MAAM,QAAQ,MAAS,CAAC,EAAY,IAAI,EAAK,KAAK,IAAI,CAAC;IAC7E,KAAK,IAAM,KAAQ,GAEb,EAAS,MAAM,MAAU,EAAK,KAAK,SAAS,EAAM,IAAI,KAAK,EAAM,KAAK,SAAS,EAAK,IAAI,CAAC,KAC7F,EAAG,QAAQ,KAAK,IAAI,GAAM,CAAG,GAAG,KAAK,IAAI,GAAI,IAAM,EAAK,QAAQ,GAAG,CAAI;GAE3E,CAAC,GACD,IAAY,IACZ,EAAO,KAAK,SAAS,CAAE,GACvB,EAAsB,IAAI;EAC5B,GAEM,UAAkB;GAClB,MACA,MAAU,QAAM,qBAAqB,CAAK,GAC9C,IAAQ,sBAAsB,CAAU;EAC1C;EAMA,OAJA,EAAS,iBAAiB,WAAW,CAAS,GAC9C,EAAS,cAAc,iBAAiB,WAAW,CAAS,GAC5D,EAAO,GAAG,eAAe,CAAa,GACtC,EAAO,GAAG,WAAW,CAAM,SACd;GAOX,AANA,IAAY,IACR,MAAU,QAAM,qBAAqB,CAAK,GAC9C,EAAS,oBAAoB,WAAW,CAAS,GACjD,EAAS,cAAc,oBAAoB,WAAW,CAAS,GAC/D,EAAO,IAAI,eAAe,CAAa,GACvC,EAAO,IAAI,WAAW,CAAM,GAC5B,EAAc,UAAU,EAAK;EAC/B;CACF,GAAG;EAAC;EAAQ;EAAoB,EAAI;EAAe,EAAI;CAAU,CAAC;CAElE,IAAM,IAAoB,EAAO,cAAc,WAAW,CAAC,CAAC,cAAc,IACpE,IAAkB,EAAO,cAAc,WAAW,CAAC,CAAC,YAAY;CAEtE,OACE,kBAAC,OAAD;EAAK,WAAU;EAAc,MAAK;EAAQ,cAAW;EAArD,UAAA;GACG,EAAI,WACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI;KACjD,UAAU,CAAC,EAAO,IAAI,CAAC,CAAC,KAAK;KAC7B,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,YAAD,EAAU,QAAO,gBAAiB,CAAA,GAClC,kBAAC,QAAD,EAAM,GAAE,kCAAmC,CAAA,CACxC;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI;KACjD,UAAU,CAAC,EAAO,IAAI,CAAC,CAAC,KAAK;KAC7B,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,YAAD,EAAU,QAAO,mBAAoB,CAAA,GACrC,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA,CAC3C;;IACQ,CAAA;IACf,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,aACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,OAAO;KACP,SAAS;KACT,WAAW,MAAQ;MACjB,AAAI,IACF,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,CAAG,CAAC,CAAC,IAAI,IAE9C,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI;KAEjD;KACA,OAAO,EAAO;KACd,OAAO;IACR,CAAA;IACD,kBAAC,GAAD;KACE,OAAO;KACP,SAAS;KACT,WAAW,MAAQ;MACjB,AAAI,IACF,EAAQ,MAAM,CAAC,CAAC,MAAM,CAAC,CAAS,YAAY,CAAG,CAAC,CAAC,IAAI,IAErD,EAAQ,MAAM,CAAC,CAAC,MAAM,CAAC,CAAS,cAAc,CAAC,CAAC,IAAI;KAExD;KACA,OAAO,EAAO;KACd,OAAO;IACR,CAAA;IACD,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,cACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI;KACvD,UAAU,EAAO,SAAS,MAAM;KAChC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAM,eAAc;MAAQ,gBAAe;MAAzI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA,GAC9C,kBAAC,QAAD,EAAM,GAAE,sCAAuC,CAAA,CAC5C;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI;KACzD,UAAU,EAAO,SAAS,QAAQ;KAClC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAK,IAAG;OAAK,CAAA;OACrC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OACtC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAI,IAAG;OAAM,CAAA;MAClC;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI;KAC5D,UAAU,EAAO,SAAS,WAAW;KACrC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,mCAAoC,CAAA,GAC5C,kBAAC,QAAD;OAAM,IAAG;OAAI,IAAG;OAAK,IAAG;OAAK,IAAG;MAAM,CAAA,CACnC;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI;KACzD,UAAU,EAAO,SAAS,QAAQ;KAClC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD,EAAM,GAAE,2EAA4E,CAAA;OACpF,kBAAC,QAAD,EAAM,GAAE,sDAAuD,CAAA;OAC/D,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;MACnC;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI;KAC5D,UAAU,EAAO,SAAS,WAAW;KACrC,OAAO,EAAO;KAEd,UAAA,kBAAC,QAAD;MAAM,OAAO;OAAE,UAAU;OAAQ,YAAY;MAAI;MAAjD,UAAA,CAAoD,KAAC,kBAAC,OAAD;OAAK,OAAO,EAAE,UAAU,MAAM;OAAG,UAAA;MAAM,CAAA,CAAO;;IACtF,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI;KAC9D,UAAU,EAAO,SAAS,aAAa;KACvC,OAAO,EAAO;KAEd,UAAA,kBAAC,QAAD;MAAM,OAAO;OAAE,UAAU;OAAQ,YAAY;MAAI;MAAjD,UAAA,CAAoD,KAAC,kBAAC,OAAD;OAAK,OAAO,EAAE,UAAU,MAAM;OAAG,UAAA;MAAM,CAAA,CAAO;;IACtF,CAAA;IACd,EAAI,iBACH,kBAAC,GAAD;KACE,SAAS;KACT,UAAU,CAAC,EAAO,cAAe,CAAC,KAAsB,EAAO,MAAM,UAAU;KAC/E,UAAU,CAAC,CAAC;KACZ,OAAO,IAAqB,EAAO,sBAAsB,EAAO;KAEhE,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD,EAAM,GAAE,oEAAqE,CAAA;OAC7E,kBAAC,QAAD,EAAM,GAAE,yBAA0B,CAAA;OAClC,kBAAC,QAAD,EAAM,GAAE,aAAc,CAAA;OACtB,kBAAC,QAAD,EAAM,GAAE,UAAW,CAAA;MAChB;;IACQ,CAAA;IAEjB,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,WACH,kBAAA,GAAA,EAAA,UAAA,CACI;IAAC;IAAG;IAAG;IAAG;IAAG;IAAG;GAAC,CAAC,CAAW,KAAK,MAClC,kBAAC,GAAD;IAEE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,SAAM,CAAC,CAAC,CAAC,IAAI;IACnE,UAAU,EAAO,SAAS,WAAW,EAAE,SAAM,CAAC;IAC9C,OAAO,GAAG,EAAO,QAAQ,GAAG;IAE5B,UAAA,kBAAC,QAAD;KAAM,OAAO;MAAE,UAAU;MAAQ,YAAY;KAAI;KAAjD,UAAA,CAAoD,KAAE,CAAY;;GACrD,GANR,CAMQ,CAChB,GACD,kBAAC,GAAD,CAAiB,CAAA,CACjB,EAAA,CAAA;GAGH,EAAI,aACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,MAAM,CAAC,CAAC,IAAI;KAC/D,UAAU,EAAO,SAAS,EAAE,WAAW,OAAO,CAAC;KAC/C,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAI,IAAG;OAAK,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;MAC1E;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,QAAQ,CAAC,CAAC,IAAI;KACjE,UAAU,EAAO,SAAS,EAAE,WAAW,SAAS,CAAC;KACjD,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAI,IAAG;OAAK,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;MAC1E;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,OAAO,CAAC,CAAC,IAAI;KAChE,UAAU,EAAO,SAAS,EAAE,WAAW,QAAQ,CAAC;KAChD,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAI,IAAG;OAAK,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;MAC1E;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,SAAS,CAAC,CAAC,IAAI;KAClE,UAAU,EAAO,SAAS,EAAE,WAAW,UAAU,CAAC;KAClD,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAI,IAAG;OAAK,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;MAC1E;;IACQ,CAAA;IACf,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,QACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI;KAC7D,UAAU,EAAO,SAAS,YAAY;KACtC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAI,IAAG;QAAK,IAAG;OAAK,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;OACtC,kBAAC,UAAD;QAAQ,IAAG;QAAI,IAAG;QAAI,GAAE;QAAI,MAAK;OAAgB,CAAA;OAAC,kBAAC,UAAD;QAAQ,IAAG;QAAI,IAAG;QAAK,GAAE;QAAI,MAAK;OAAgB,CAAA;OACpG,kBAAC,UAAD;QAAQ,IAAG;QAAI,IAAG;QAAK,GAAE;QAAI,MAAK;OAAgB,CAAA;MAC/C;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI;KAC9D,UAAU,EAAO,SAAS,aAAa;KACvC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAK,IAAG;OAAK,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;OAC7E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;OACvC,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAI,UAAS;QAAI,MAAK;QAAe,QAAO;QAAO,YAAW;QAAO,UAAA;OAAO,CAAA;OAC1F,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAK,UAAS;QAAI,MAAK;QAAe,QAAO;QAAO,YAAW;QAAO,UAAA;OAAO,CAAA;OAC3F,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAK,UAAS;QAAI,MAAK;QAAe,QAAO;QAAO,YAAW;QAAO,UAAA;OAAO,CAAA;MACxF;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI;KAC3D,UAAU,EAAO,SAAS,UAAU;KACpC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAI,OAAM;QAAI,QAAO;QAAI,IAAG;OAAK,CAAA;OAAC,kBAAC,QAAD,EAAM,GAAE,qBAAsB,CAAA;OAC9E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAK,IAAG;OAAK,CAAA;OACrC,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAK,OAAM;QAAI,QAAO;QAAI,IAAG;OAAK,CAAA;OAChD,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;MACpC;;IACQ,CAAA;IACf,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,UACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI;KAC7D,UAAU,EAAO,SAAS,YAAY;KACtC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,qIAAsI,CAAA,GAC9I,kBAAC,QAAD,EAAM,GAAE,mHAAoH,CAAA,CACzH;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,aAAa,WAAW,CAAC,CAAC,IAAI;KAC/E,UAAU,EAAO,SAAS,WAAW;KACrC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,YAAD,EAAU,QAAO,mBAAoB,CAAA,GAAC,kBAAC,YAAD,EAAU,QAAO,gBAAiB,CAAA,CACrE;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe;MACb,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc;OACnC,MAAM;OACN,OAAO,EAAE,UAAU,YAAY;OAC/B,SAAS,CAAC;QAAE,MAAM;QAAQ,MAAM;OAAoC,CAAC;MACvE,CAAC,CAAC,CAAC,IAAI;KACT;KACA,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,UAAD;QAAQ,IAAG;QAAI,IAAG;QAAI,GAAE;OAAK,CAAA;OAAC,kBAAC,UAAD;QAAQ,IAAG;QAAK,IAAG;QAAI,GAAE;OAAK,CAAA;OAC5D,kBAAC,UAAD;QAAQ,IAAG;QAAK,IAAG;QAAK,GAAE;OAAK,CAAA;OAC/B,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAI,IAAG;QAAK,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAK,IAAG;OAAM,CAAA;MACzE;;IACQ,CAAA;IACf,kBAAC,GAAD;KAAe,SAAS;KAAS,UAAU,EAAO,SAAS,MAAM;KAAG,OAAO,EAAO;KAChF,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,2DAA4D,CAAA,GACpE,kBAAC,QAAD,EAAM,GAAE,4DAA6D,CAAA,CAClE;;IACQ,CAAA;IACf,kBAAC,GAAD;KAAe,SAAS;KAAU,OAAO,EAAO;KAC9C,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAI,OAAM;QAAK,QAAO;QAAK,IAAG;QAAI,IAAG;OAAK,CAAA;OACxD,kBAAC,UAAD;QAAQ,IAAG;QAAM,IAAG;QAAM,GAAE;OAAO,CAAA;OAAC,kBAAC,YAAD,EAAU,QAAO,mBAAoB,CAAA;MACtE;;IACQ,CAAA;IACf,kBAAC,GAAD;KAAe,SAAS;KAAa,OAAO,EAAO;KACjD,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAI,OAAM;QAAK,QAAO;QAAK,IAAG;OAAK,CAAA;OACjD,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAI,IAAG;QAAK,IAAG;OAAK,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAI,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAK,IAAG;OAAM,CAAA;MACxE;;IACQ,CAAA;IACd,EAAI,YAAY,kBAAC,GAAD;KAAsB;KAAgB;IAAS,CAAA;IAChE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI;KAC9D,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAC9G,UAAA,kBAAC,QAAD;OAAM,IAAG;OAAI,IAAG;OAAK,IAAG;OAAK,IAAG;MAAM,CAAA;KACnC,CAAA;IACQ,CAAA;IACf,kBAAC,GAAD;KAAe,SAAS;KAAqB,OAAO,EAAO;KACzD,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD,EAAM,GAAE,gBAAiB,CAAA;OACzB,kBAAC,QAAD,EAAM,GAAE,uBAAwB,CAAA;OAChC,kBAAC,QAAD,EAAM,GAAE,oBAAqB,CAAA;MAC1B;;IACQ,CAAA;IACf,kBAAC,GAAD;KAA8B;KAAQ,UAAU;IAAyB,CAAA;IACzE,kBAAC,GAAD;KAA4B;KAAQ,UAAU;IAAuB,CAAA;IACrE,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,SACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,OAAO,EAAO,cAAc,WAAW,CAAC,CAAC,SAAS;KAClD,WAAW,MAAU;MACnB,AAAI,IACF,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAK,CAAC,CAAC,IAAI,IAE3C,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI;KAE5C;KACA,OAAO,EAAO;KACd,MACE,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MACrI,UAAA,kBAAC,QAAD,EAAM,GAAE,sBAAuB,CAAA;KAC5B,CAAA;IAER,CAAA;IACD,kBAAC,GAAD;KACE,OAAO,EAAO,cAAc,WAAW,CAAC,CAAC,SAAS;KAClD,WAAW,MAAU;MACnB,AAAI,IACF,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,SAAM,CAAC,CAAC,CAAC,IAAI,IAEtD,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI;KAEhD;KACA,OAAO,EAAO;KACd,MACE,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,WAAY,CAAA,GAAC,kBAAC,QAAD,EAAM,GAAE,wDAAyD,CAAA,CACnF;;IAER,CAAA;IACD,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,MAAM,KAAS,KAClB,kBAAC,GAAD;IAAe,SAAS;IAAW,OAAO,EAAO;IAC/C,UAAA,kBAAC,OAAD;KAAK,OAAM;KAAK,QAAO;KAAK,SAAQ;KAAY,MAAK;KAAO,QAAO;KAAe,aAAY;KAAI,eAAc;KAAQ,gBAAe;KAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,yJAA0J,CAAA,GAClK,kBAAC,QAAD,EAAM,GAAE,0JAA2J,CAAA,CAChK;;GACQ,CAAA;GAGhB;EACE;;AAET"}
|
|
1
|
+
{"version":3,"file":"Toolbar.js","names":[],"sources":["../../../../../src/components/pro/RichTextEditor/Toolbar/Toolbar.tsx"],"sourcesContent":["import React, { useCallback, useState, useEffect, useRef } from 'react';\nimport { useEditorState, type Editor } from '@tiptap/react';\nimport type { Mark } from '@tiptap/pm/model';\nimport type { ToolbarSection, RichTextEditorLabels } from '../types';\nimport { defaultLabels } from '../types';\nimport { getNextFloatZIndex } from '../extensions/FloatingDialog';\nimport { ToolbarButton, ToolbarDivider } from './ToolbarButton';\nimport { ColorPicker } from './ColorPicker';\nimport { SelectDropdown, FONT_FAMILIES, FONT_SIZES } from './SelectDropdown';\nimport { MarkdownTemplateMenu } from './MarkdownTemplates';\nimport { FloatingDialogMenu } from './FloatingDialogMenu';\nimport { TableOpsMenu } from './TableOpsMenu';\n\n// Only visual formatting belongs to the painter, never links or comment IDs.\nconst PAINT_MARKS = new Set(['bold', 'italic', 'underline', 'strike', 'code', 'subscript', 'superscript', 'textStyle', 'highlight']);\n\ninterface ToolbarProps {\n editor: Editor;\n config?: ToolbarSection;\n labels?: RichTextEditorLabels;\n hasAI?: boolean;\n onAIClick?: () => void;\n onFormatPainterChange?: (active: boolean) => void;\n children?: React.ReactNode;\n}\n\nconst Toolbar: React.FC<ToolbarProps> = ({\n editor,\n config,\n labels: propsLabels,\n hasAI,\n onAIClick,\n onFormatPainterChange,\n children,\n}) => {\n const labels = { ...defaultLabels, ...propsLabels };\n useEditorState({ editor, selector: ({ transactionNumber }) => transactionNumber });\n const [formatPainterMarks, setFormatPainterMarks] = useState<readonly Mark[] | null>(null);\n const painterChange = useRef(onFormatPainterChange);\n useEffect(() => {\n painterChange.current = onFormatPainterChange;\n }, [onFormatPainterChange]);\n\n const cfg: Required<ToolbarSection> = {\n textFormat: config?.textFormat ?? true,\n heading: config?.heading ?? true,\n alignment: config?.alignment ?? true,\n list: config?.list ?? true,\n insert: config?.insert ?? true,\n color: config?.color ?? true,\n history: config?.history ?? true,\n ai: config?.ai ?? true,\n tableOps: config?.tableOps ?? true,\n fontStyle: config?.fontStyle ?? true,\n formatPainter: config?.formatPainter ?? true,\n };\n\n const setLink = useCallback(() => {\n const previousUrl = editor.getAttributes('link').href;\n const url = window.prompt(labels.insertLinkUrl, previousUrl);\n if (url === null) return;\n if (editor.isDestroyed || !editor.isEditable) return;\n if (url.trim() === '') {\n editor.chain().focus().extendMarkRange('link').unsetLink().run();\n return;\n }\n editor.chain().focus().extendMarkRange('link').setLink({ href: url.trim() }).run();\n }, [editor, labels.insertLinkUrl]);\n\n const addImage = useCallback(() => {\n const url = window.prompt(labels.insertImageUrl);\n if (url) {\n editor.chain().focus().setImage({ src: url }).run();\n }\n }, [editor, labels.insertImageUrl]);\n\n const insertTable = useCallback(() => {\n editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run();\n }, [editor]);\n\n const insertMarkdownBlock = useCallback(() => {\n editor.chain().focus().insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-markdown' },\n content: [{ type: 'text', text: '# Markdown\\n\\nWrite your **markdown** here.' }],\n }).run();\n }, [editor]);\n\n const insertMarkdownTemplate = useCallback((content: string) => {\n editor.chain().focus().insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-markdown' },\n content: [{ type: 'text', text: content }],\n }).run();\n }, [editor]);\n\n const insertFloatingDialog = useCallback((layout: 'block' | 'wrap-left' | 'wrap-right' | 'float' = 'block') => {\n const extraAttrs = layout === 'float'\n ? { x: 40, y: 40, zIndex: getNextFloatZIndex(editor) }\n : layout === 'block'\n ? {}\n : { width: 240 };\n editor.chain().focus().insertContent({\n type: 'floatingDialog',\n attrs: { title: 'Note', layout, ...extraAttrs },\n content: [{ type: 'paragraph' }],\n }).run();\n }, [editor]);\n\n const handleFormatPainter = useCallback(() => {\n if (formatPainterMarks) {\n setFormatPainterMarks(null);\n return;\n }\n if (editor.isDestroyed || !editor.isEditable) return;\n const { from, to } = editor.state.selection;\n if (from === to) return;\n\n let marks: readonly Mark[] | undefined;\n editor.state.doc.nodesBetween(from, to, (node) => {\n if (!node.isText) return;\n const formatting = node.marks.filter((mark) => PAINT_MARKS.has(mark.type.name));\n marks = marks === undefined ? formatting : marks.filter((mark) => formatting.some((other) => mark.eq(other)));\n });\n if (marks === undefined) return;\n setFormatPainterMarks(marks);\n }, [editor, formatPainterMarks]);\n\n useEffect(() => {\n if (!formatPainterMarks) return;\n if (editor.isDestroyed || !editor.isEditable || !cfg.formatPainter || !cfg.textFormat) {\n setFormatPainterMarks(null);\n return;\n }\n\n painterChange.current?.(true);\n const editorEl = editor.view.dom;\n let frame: number | null = null;\n let cancelled = false;\n const cancel = () => {\n cancelled = true;\n if (frame !== null) cancelAnimationFrame(frame);\n frame = null;\n setFormatPainterMarks(null);\n };\n const onTransaction = () => {\n if (!editor.isEditable) cancel();\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') cancel();\n };\n\n const applyMarks = () => {\n frame = null;\n if (cancelled || editor.isDestroyed || !editor.isEditable) return;\n const { from, to } = editor.state.selection;\n if (from === to) return;\n\n const { tr } = editor.state;\n for (const name of PAINT_MARKS) {\n const type = editor.schema.marks[name];\n if (type) tr.removeMark(from, to, type);\n }\n editor.state.doc.nodesBetween(from, to, (node, pos) => {\n if (!node.isText) return;\n const semantic = node.marks.filter((mark) => !PAINT_MARKS.has(mark.type.name));\n for (const mark of formatPainterMarks) {\n // Code and custom exclusions must not implicitly remove semantic marks.\n if (semantic.some((other) => mark.type.excludes(other.type) || other.type.excludes(mark.type))) continue;\n tr.addMark(Math.max(from, pos), Math.min(to, pos + node.nodeSize), mark);\n }\n });\n cancelled = true;\n editor.view.dispatch(tr);\n setFormatPainterMarks(null);\n };\n\n const onMouseUp = () => {\n if (cancelled) return;\n if (frame !== null) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(applyMarks);\n };\n\n editorEl.addEventListener('mouseup', onMouseUp);\n editorEl.ownerDocument.addEventListener('keydown', onKeyDown);\n editor.on('transaction', onTransaction);\n editor.on('destroy', cancel);\n return () => {\n cancelled = true;\n if (frame !== null) cancelAnimationFrame(frame);\n editorEl.removeEventListener('mouseup', onMouseUp);\n editorEl.ownerDocument.removeEventListener('keydown', onKeyDown);\n editor.off('transaction', onTransaction);\n editor.off('destroy', cancel);\n painterChange.current?.(false);\n };\n }, [editor, formatPainterMarks, cfg.formatPainter, cfg.textFormat]);\n\n const currentFontFamily = editor.getAttributes('textStyle').fontFamily || '';\n const currentFontSize = editor.getAttributes('textStyle').fontSize || '';\n\n return (\n <div className=\"rte-toolbar\" role=\"group\" aria-label=\"Text formatting\">\n {cfg.history && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title={labels.undo}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"1 4 1 10 7 10\" />\n <path d=\"M3.51 15a9 9 0 102.13-9.36L1 10\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title={labels.redo}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"23 4 23 10 17 10\" />\n <path d=\"M20.49 15a9 9 0 11-2.13-9.36L23 10\" />\n </svg>\n </ToolbarButton>\n <ToolbarDivider />\n </>\n )}\n\n {cfg.fontStyle && (\n <>\n <SelectDropdown\n value={currentFontFamily}\n options={FONT_FAMILIES}\n onChange={(val) => {\n if (val) {\n editor.chain().focus().setFontFamily(val).run();\n } else {\n editor.chain().focus().unsetFontFamily().run();\n }\n }}\n title={labels.fontFamily}\n width={120}\n />\n <SelectDropdown\n value={currentFontSize}\n options={FONT_SIZES}\n onChange={(val) => {\n if (val) {\n (editor.chain().focus() as any).setFontSize(val).run();\n } else {\n (editor.chain().focus() as any).unsetFontSize().run();\n }\n }}\n title={labels.fontSize}\n width={80}\n />\n <ToolbarDivider />\n </>\n )}\n\n {cfg.textFormat && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n isActive={editor.isActive('bold')}\n title={labels.bold}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 4h8a4 4 0 014 4 4 4 0 01-4 4H6z\" />\n <path d=\"M6 12h9a4 4 0 014 4 4 4 0 01-4 4H6z\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n isActive={editor.isActive('italic')}\n title={labels.italic}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\" />\n <line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\" />\n <line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n isActive={editor.isActive('underline')}\n title={labels.underline}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M6 3v7a6 6 0 006 6 6 6 0 006-6V3\" />\n <line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleStrike().run()}\n isActive={editor.isActive('strike')}\n title={labels.strikethrough}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M17.3 4.9c-2.3-.6-4.4-1-6.2-.9-2.7 0-5.3.7-5.3 3.6 0 1.5 1.8 3.3 7.2 3.3\" />\n <path d=\"M13 15.1c0 2.8-2.6 3.6-5.3 3.6-1.8-.1-3.9-.5-6.2-.9\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleSubscript().run()}\n isActive={editor.isActive('subscript')}\n title={labels.subscript}\n >\n <span style={{ fontSize: '13px', fontWeight: 600 }}>X<sub style={{ fontSize: '9px' }}>2</sub></span>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleSuperscript().run()}\n isActive={editor.isActive('superscript')}\n title={labels.superscript}\n >\n <span style={{ fontSize: '13px', fontWeight: 600 }}>X<sup style={{ fontSize: '9px' }}>2</sup></span>\n </ToolbarButton>\n {cfg.formatPainter && (\n <ToolbarButton\n onClick={handleFormatPainter}\n disabled={!editor.isEditable || (!formatPainterMarks && editor.state.selection.empty)}\n isActive={!!formatPainterMarks}\n title={formatPainterMarks ? labels.formatPainterActive : labels.formatPainter}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 3H5a2 2 0 00-2 2v2a2 2 0 002 2h14a2 2 0 002-2V5a2 2 0 00-2-2z\" />\n <path d=\"M10 7v4a2 2 0 01-2 2H7\" />\n <path d=\"M7 13l-3 8\" />\n <path d=\"M4 21h6\" />\n </svg>\n </ToolbarButton>\n )}\n <ToolbarDivider />\n </>\n )}\n\n {cfg.heading && (\n <>\n {([1, 2, 3, 4, 5, 6] as const).map((level) => (\n <ToolbarButton\n key={level}\n onClick={() => editor.chain().focus().toggleHeading({ level }).run()}\n isActive={editor.isActive('heading', { level })}\n title={`${labels.heading} ${level}`}\n >\n <span style={{ fontSize: '12px', fontWeight: 700 }}>H{level}</span>\n </ToolbarButton>\n ))}\n <ToolbarDivider />\n </>\n )}\n\n {cfg.alignment && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('left').run()}\n isActive={editor.isActive({ textAlign: 'left' })}\n title={labels.alignLeft}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"17\" y1=\"10\" x2=\"3\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"17\" y1=\"18\" x2=\"3\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('center').run()}\n isActive={editor.isActive({ textAlign: 'center' })}\n title={labels.alignCenter}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"10\" x2=\"6\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"18\" y1=\"18\" x2=\"6\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('right').run()}\n isActive={editor.isActive({ textAlign: 'right' })}\n title={labels.alignRight}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"21\" y1=\"10\" x2=\"7\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"21\" y1=\"18\" x2=\"7\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().setTextAlign('justify').run()}\n isActive={editor.isActive({ textAlign: 'justify' })}\n title={labels.alignJustify}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"21\" y1=\"10\" x2=\"3\" y2=\"10\" /><line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\" />\n <line x1=\"21\" y1=\"14\" x2=\"3\" y2=\"14\" /><line x1=\"21\" y1=\"18\" x2=\"3\" y2=\"18\" />\n </svg>\n </ToolbarButton>\n <ToolbarDivider />\n </>\n )}\n\n {cfg.list && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n isActive={editor.isActive('bulletList')}\n title={labels.bulletList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" /><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <circle cx=\"4\" cy=\"6\" r=\"1\" fill=\"currentColor\" /><circle cx=\"4\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"4\" cy=\"18\" r=\"1\" fill=\"currentColor\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n isActive={editor.isActive('orderedList')}\n title={labels.orderedList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" /><line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <text x=\"2\" y=\"8\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">1</text>\n <text x=\"2\" y=\"14\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">2</text>\n <text x=\"2\" y=\"20\" fontSize=\"8\" fill=\"currentColor\" stroke=\"none\" fontWeight=\"bold\">3</text>\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleTaskList().run()}\n isActive={editor.isActive('taskList')}\n title={labels.taskList}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"5\" width=\"6\" height=\"6\" rx=\"1\" /><path d=\"M5 8l1.5 1.5L9 6.5\" />\n <line x1=\"12\" y1=\"8\" x2=\"21\" y2=\"8\" />\n <rect x=\"3\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\" />\n <line x1=\"12\" y1=\"17\" x2=\"21\" y2=\"17\" />\n </svg>\n </ToolbarButton>\n <ToolbarDivider />\n </>\n )}\n\n {cfg.insert && (\n <>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n isActive={editor.isActive('blockquote')}\n title={labels.blockquote}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V21z\" />\n <path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3z\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleNode('codeBlock', 'paragraph').run()}\n isActive={editor.isActive('codeBlock')}\n title={labels.codeBlock}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"16 18 22 12 16 6\" /><polyline points=\"8 6 2 12 8 18\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton\n onClick={() => {\n editor.chain().focus().insertContent({\n type: 'codeBlock',\n attrs: { language: 'r-mermaid' },\n content: [{ type: 'text', text: 'graph TD\\n A[Start] --> B[End]' }],\n }).run();\n }}\n title={labels.mermaidBlock}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"6\" cy=\"6\" r=\"3\" /><circle cx=\"18\" cy=\"6\" r=\"3\" />\n <circle cx=\"12\" cy=\"18\" r=\"3\" />\n <line x1=\"6\" y1=\"9\" x2=\"12\" y2=\"15\" /><line x1=\"18\" y1=\"9\" x2=\"12\" y2=\"15\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={setLink} isActive={editor.isActive('link')} title={labels.link}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={addImage} title={labels.image}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" /><polyline points=\"21 15 16 10 5 21\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={insertTable} title={labels.table}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" /><line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" /><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\" />\n </svg>\n </ToolbarButton>\n {cfg.tableOps && <TableOpsMenu editor={editor} labels={labels} />}\n <ToolbarButton\n onClick={() => editor.chain().focus().setHorizontalRule().run()}\n title={labels.horizontalRule}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n </svg>\n </ToolbarButton>\n <ToolbarButton onClick={insertMarkdownBlock} title={labels.markdownBlock}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M2 3h20v18H2z\" />\n <path d=\"M5 15V9l3 3.5L11 9v6\" />\n <path d=\"M17 9l-2.5 3H17v3\" />\n </svg>\n </ToolbarButton>\n <MarkdownTemplateMenu labels={labels} onSelect={insertMarkdownTemplate} />\n <FloatingDialogMenu labels={labels} onInsert={insertFloatingDialog} />\n <ToolbarDivider />\n </>\n )}\n\n {cfg.color && (\n <>\n <ColorPicker\n value={editor.getAttributes('textStyle').color || ''}\n onChange={(color) => {\n if (color) {\n editor.chain().focus().setColor(color).run();\n } else {\n editor.chain().focus().unsetColor().run();\n }\n }}\n title={labels.color}\n kind=\"text\"\n />\n <ColorPicker\n value={editor.getAttributes('highlight').color || ''}\n onChange={(color) => {\n if (color) {\n editor.chain().focus().toggleHighlight({ color }).run();\n } else {\n editor.chain().focus().unsetHighlight().run();\n }\n }}\n title={labels.highlight}\n kind=\"highlight\"\n />\n <ToolbarDivider />\n </>\n )}\n\n {cfg.ai && hasAI && onAIClick && (\n <ToolbarButton onClick={onAIClick} title={labels.ai}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M9.5 2A2.5 2.5 0 0112 4.5v15a2.5 2.5 0 01-4.96.44 2.5 2.5 0 01-2.96-3.08 3 3 0 01-.34-5.58 2.5 2.5 0 011.32-4.24 2.5 2.5 0 011.98-3A2.5 2.5 0 019.5 2z\" />\n <path d=\"M14.5 2A2.5 2.5 0 0012 4.5v15a2.5 2.5 0 004.96.44 2.5 2.5 0 002.96-3.08 3 3 0 00.34-5.58 2.5 2.5 0 00-1.32-4.24 2.5 2.5 0 00-1.98-3A2.5 2.5 0 0014.5 2z\" />\n </svg>\n </ToolbarButton>\n )}\n\n {children}\n </div>\n );\n};\n\nexport default Toolbar;\n"],"mappings":";;;;;;;;;;;;AAcA,IAAM,oBAAc,IAAI,IAAI;CAAC;CAAQ;CAAU;CAAa;CAAU;CAAQ;CAAa;CAAe;CAAa;AAAW,CAAC,GAY7H,KAAmC,EACvC,WACA,WACA,QAAQ,GACR,UACA,cACA,0BACA,kBACI;CACJ,IAAM,IAAS;EAAE,GAAG;EAAe,GAAG;CAAY;CAClD,EAAe;EAAE;EAAQ,WAAW,EAAE,2BAAwB;CAAkB,CAAC;CACjF,IAAM,CAAC,GAAoB,KAAyB,EAAiC,IAAI,GACnF,IAAgB,EAAO,CAAqB;CAClD,QAAgB;EACd,EAAc,UAAU;CAC1B,GAAG,CAAC,CAAqB,CAAC;CAE1B,IAAM,IAAgC;EACpC,YAAY,GAAQ,cAAc;EAClC,SAAS,GAAQ,WAAW;EAC5B,WAAW,GAAQ,aAAa;EAChC,MAAM,GAAQ,QAAQ;EACtB,QAAQ,GAAQ,UAAU;EAC1B,OAAO,GAAQ,SAAS;EACxB,SAAS,GAAQ,WAAW;EAC5B,IAAI,GAAQ,MAAM;EAClB,UAAU,GAAQ,YAAY;EAC9B,WAAW,GAAQ,aAAa;EAChC,eAAe,GAAQ,iBAAiB;CAC1C,GAEM,IAAU,QAAkB;EAChC,IAAM,IAAc,EAAO,cAAc,MAAM,CAAC,CAAC,MAC3C,IAAM,OAAO,OAAO,EAAO,eAAe,CAAW;EACvD,UAAQ,QACR,GAAO,eAAgB,EAAO,YAClC;OAAI,EAAI,KAAK,MAAM,IAAI;IACrB,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI;IAC/D;GACF;GACA,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI;EADjF;CAEF,GAAG,CAAC,GAAQ,EAAO,aAAa,CAAC,GAE3B,IAAW,QAAkB;EACjC,IAAM,IAAM,OAAO,OAAO,EAAO,cAAc;EAC/C,AAAI,KACF,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,KAAK,EAAI,CAAC,CAAC,CAAC,IAAI;CAEtD,GAAG,CAAC,GAAQ,EAAO,cAAc,CAAC,GAE5B,IAAc,QAAkB;EACpC,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY;GAAE,MAAM;GAAG,MAAM;GAAG,eAAe;EAAK,CAAC,CAAC,CAAC,IAAI;CACpF,GAAG,CAAC,CAAM,CAAC,GAEL,IAAsB,QAAkB;EAC5C,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc;GACnC,MAAM;GACN,OAAO,EAAE,UAAU,aAAa;GAChC,SAAS,CAAC;IAAE,MAAM;IAAQ,MAAM;GAA8C,CAAC;EACjF,CAAC,CAAC,CAAC,IAAI;CACT,GAAG,CAAC,CAAM,CAAC,GAEL,IAAyB,GAAa,MAAoB;EAC9D,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc;GACnC,MAAM;GACN,OAAO,EAAE,UAAU,aAAa;GAChC,SAAS,CAAC;IAAE,MAAM;IAAQ,MAAM;GAAQ,CAAC;EAC3C,CAAC,CAAC,CAAC,IAAI;CACT,GAAG,CAAC,CAAM,CAAC,GAEL,IAAuB,GAAa,IAAyD,YAAY;EAC7G,IAAM,IAAa,MAAW,UAC1B;GAAE,GAAG;GAAI,GAAG;GAAI,QAAQ,EAAmB,CAAM;EAAE,IACnD,MAAW,UACT,CAAC,IACD,EAAE,OAAO,IAAI;EACnB,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc;GACnC,MAAM;GACN,OAAO;IAAE,OAAO;IAAQ;IAAQ,GAAG;GAAW;GAC9C,SAAS,CAAC,EAAE,MAAM,YAAY,CAAC;EACjC,CAAC,CAAC,CAAC,IAAI;CACT,GAAG,CAAC,CAAM,CAAC,GAEL,IAAsB,QAAkB;EAC5C,IAAI,GAAoB;GACtB,EAAsB,IAAI;GAC1B;EACF;EACA,IAAI,EAAO,eAAe,CAAC,EAAO,YAAY;EAC9C,IAAM,EAAE,SAAM,UAAO,EAAO,MAAM;EAClC,IAAI,MAAS,GAAI;EAEjB,IAAI;EACJ,EAAO,MAAM,IAAI,aAAa,GAAM,IAAK,MAAS;GAChD,IAAI,CAAC,EAAK,QAAQ;GAClB,IAAM,IAAa,EAAK,MAAM,QAAQ,MAAS,EAAY,IAAI,EAAK,KAAK,IAAI,CAAC;GAC9E,IAAQ,MAAU,KAAA,IAAY,IAAa,EAAM,QAAQ,MAAS,EAAW,MAAM,MAAU,EAAK,GAAG,CAAK,CAAC,CAAC;EAC9G,CAAC,GACG,MAAU,KAAA,KACd,EAAsB,CAAK;CAC7B,GAAG,CAAC,GAAQ,CAAkB,CAAC;CAE/B,QAAgB;EACd,IAAI,CAAC,GAAoB;EACzB,IAAI,EAAO,eAAe,CAAC,EAAO,cAAc,CAAC,EAAI,iBAAiB,CAAC,EAAI,YAAY;GACrF,EAAsB,IAAI;GAC1B;EACF;EAEA,EAAc,UAAU,EAAI;EAC5B,IAAM,IAAW,EAAO,KAAK,KACzB,IAAuB,MACvB,IAAY,IACV,UAAe;GAInB,AAHA,IAAY,IACR,MAAU,QAAM,qBAAqB,CAAK,GAC9C,IAAQ,MACR,EAAsB,IAAI;EAC5B,GACM,UAAsB;GAC1B,AAAK,EAAO,cAAY,EAAO;EACjC,GACM,KAAa,MAAyB;GAC1C,AAAI,EAAM,QAAQ,YAAU,EAAO;EACrC,GAEM,UAAmB;GAEvB,IADA,IAAQ,MACJ,KAAa,EAAO,eAAe,CAAC,EAAO,YAAY;GAC3D,IAAM,EAAE,SAAM,UAAO,EAAO,MAAM;GAClC,IAAI,MAAS,GAAI;GAEjB,IAAM,EAAE,UAAO,EAAO;GACtB,KAAK,IAAM,KAAQ,GAAa;IAC9B,IAAM,IAAO,EAAO,OAAO,MAAM;IACjC,AAAI,KAAM,EAAG,WAAW,GAAM,GAAI,CAAI;GACxC;GAYA,AAXA,EAAO,MAAM,IAAI,aAAa,GAAM,IAAK,GAAM,MAAQ;IACrD,IAAI,CAAC,EAAK,QAAQ;IAClB,IAAM,IAAW,EAAK,MAAM,QAAQ,MAAS,CAAC,EAAY,IAAI,EAAK,KAAK,IAAI,CAAC;IAC7E,KAAK,IAAM,KAAQ,GAEb,EAAS,MAAM,MAAU,EAAK,KAAK,SAAS,EAAM,IAAI,KAAK,EAAM,KAAK,SAAS,EAAK,IAAI,CAAC,KAC7F,EAAG,QAAQ,KAAK,IAAI,GAAM,CAAG,GAAG,KAAK,IAAI,GAAI,IAAM,EAAK,QAAQ,GAAG,CAAI;GAE3E,CAAC,GACD,IAAY,IACZ,EAAO,KAAK,SAAS,CAAE,GACvB,EAAsB,IAAI;EAC5B,GAEM,UAAkB;GAClB,MACA,MAAU,QAAM,qBAAqB,CAAK,GAC9C,IAAQ,sBAAsB,CAAU;EAC1C;EAMA,OAJA,EAAS,iBAAiB,WAAW,CAAS,GAC9C,EAAS,cAAc,iBAAiB,WAAW,CAAS,GAC5D,EAAO,GAAG,eAAe,CAAa,GACtC,EAAO,GAAG,WAAW,CAAM,SACd;GAOX,AANA,IAAY,IACR,MAAU,QAAM,qBAAqB,CAAK,GAC9C,EAAS,oBAAoB,WAAW,CAAS,GACjD,EAAS,cAAc,oBAAoB,WAAW,CAAS,GAC/D,EAAO,IAAI,eAAe,CAAa,GACvC,EAAO,IAAI,WAAW,CAAM,GAC5B,EAAc,UAAU,EAAK;EAC/B;CACF,GAAG;EAAC;EAAQ;EAAoB,EAAI;EAAe,EAAI;CAAU,CAAC;CAElE,IAAM,IAAoB,EAAO,cAAc,WAAW,CAAC,CAAC,cAAc,IACpE,IAAkB,EAAO,cAAc,WAAW,CAAC,CAAC,YAAY;CAEtE,OACE,kBAAC,OAAD;EAAK,WAAU;EAAc,MAAK;EAAQ,cAAW;EAArD,UAAA;GACG,EAAI,WACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI;KACjD,UAAU,CAAC,EAAO,IAAI,CAAC,CAAC,KAAK;KAC7B,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,YAAD,EAAU,QAAO,gBAAiB,CAAA,GAClC,kBAAC,QAAD,EAAM,GAAE,kCAAmC,CAAA,CACxC;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI;KACjD,UAAU,CAAC,EAAO,IAAI,CAAC,CAAC,KAAK;KAC7B,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,YAAD,EAAU,QAAO,mBAAoB,CAAA,GACrC,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA,CAC3C;;IACQ,CAAA;IACf,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,aACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,OAAO;KACP,SAAS;KACT,WAAW,MAAQ;MACjB,AAAI,IACF,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,CAAG,CAAC,CAAC,IAAI,IAE9C,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI;KAEjD;KACA,OAAO,EAAO;KACd,OAAO;IACR,CAAA;IACD,kBAAC,GAAD;KACE,OAAO;KACP,SAAS;KACT,WAAW,MAAQ;MACjB,AAAI,IACF,EAAQ,MAAM,CAAC,CAAC,MAAM,CAAC,CAAS,YAAY,CAAG,CAAC,CAAC,IAAI,IAErD,EAAQ,MAAM,CAAC,CAAC,MAAM,CAAC,CAAS,cAAc,CAAC,CAAC,IAAI;KAExD;KACA,OAAO,EAAO;KACd,OAAO;IACR,CAAA;IACD,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,cACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI;KACvD,UAAU,EAAO,SAAS,MAAM;KAChC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAM,eAAc;MAAQ,gBAAe;MAAzI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,qCAAsC,CAAA,GAC9C,kBAAC,QAAD,EAAM,GAAE,sCAAuC,CAAA,CAC5C;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI;KACzD,UAAU,EAAO,SAAS,QAAQ;KAClC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAK,IAAG;OAAK,CAAA;OACrC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OACtC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAI,IAAG;OAAM,CAAA;MAClC;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI;KAC5D,UAAU,EAAO,SAAS,WAAW;KACrC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,mCAAoC,CAAA,GAC5C,kBAAC,QAAD;OAAM,IAAG;OAAI,IAAG;OAAK,IAAG;OAAK,IAAG;MAAM,CAAA,CACnC;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI;KACzD,UAAU,EAAO,SAAS,QAAQ;KAClC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD,EAAM,GAAE,2EAA4E,CAAA;OACpF,kBAAC,QAAD,EAAM,GAAE,sDAAuD,CAAA;OAC/D,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;MACnC;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI;KAC5D,UAAU,EAAO,SAAS,WAAW;KACrC,OAAO,EAAO;KAEd,UAAA,kBAAC,QAAD;MAAM,OAAO;OAAE,UAAU;OAAQ,YAAY;MAAI;MAAjD,UAAA,CAAoD,KAAC,kBAAC,OAAD;OAAK,OAAO,EAAE,UAAU,MAAM;OAAG,UAAA;MAAM,CAAA,CAAO;;IACtF,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI;KAC9D,UAAU,EAAO,SAAS,aAAa;KACvC,OAAO,EAAO;KAEd,UAAA,kBAAC,QAAD;MAAM,OAAO;OAAE,UAAU;OAAQ,YAAY;MAAI;MAAjD,UAAA,CAAoD,KAAC,kBAAC,OAAD;OAAK,OAAO,EAAE,UAAU,MAAM;OAAG,UAAA;MAAM,CAAA,CAAO;;IACtF,CAAA;IACd,EAAI,iBACH,kBAAC,GAAD;KACE,SAAS;KACT,UAAU,CAAC,EAAO,cAAe,CAAC,KAAsB,EAAO,MAAM,UAAU;KAC/E,UAAU,CAAC,CAAC;KACZ,OAAO,IAAqB,EAAO,sBAAsB,EAAO;KAEhE,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD,EAAM,GAAE,oEAAqE,CAAA;OAC7E,kBAAC,QAAD,EAAM,GAAE,yBAA0B,CAAA;OAClC,kBAAC,QAAD,EAAM,GAAE,aAAc,CAAA;OACtB,kBAAC,QAAD,EAAM,GAAE,UAAW,CAAA;MAChB;;IACQ,CAAA;IAEjB,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,WACH,kBAAA,GAAA,EAAA,UAAA,CACI;IAAC;IAAG;IAAG;IAAG;IAAG;IAAG;GAAC,CAAC,CAAW,KAAK,MAClC,kBAAC,GAAD;IAEE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,EAAE,SAAM,CAAC,CAAC,CAAC,IAAI;IACnE,UAAU,EAAO,SAAS,WAAW,EAAE,SAAM,CAAC;IAC9C,OAAO,GAAG,EAAO,QAAQ,GAAG;IAE5B,UAAA,kBAAC,QAAD;KAAM,OAAO;MAAE,UAAU;MAAQ,YAAY;KAAI;KAAjD,UAAA,CAAoD,KAAE,CAAY;;GACrD,GANR,CAMQ,CAChB,GACD,kBAAC,GAAD,CAAiB,CAAA,CACjB,EAAA,CAAA;GAGH,EAAI,aACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,MAAM,CAAC,CAAC,IAAI;KAC/D,UAAU,EAAO,SAAS,EAAE,WAAW,OAAO,CAAC;KAC/C,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAI,IAAG;OAAK,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;MAC1E;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,QAAQ,CAAC,CAAC,IAAI;KACjE,UAAU,EAAO,SAAS,EAAE,WAAW,SAAS,CAAC;KACjD,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAI,IAAG;OAAK,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;MAC1E;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,OAAO,CAAC,CAAC,IAAI;KAChE,UAAU,EAAO,SAAS,EAAE,WAAW,QAAQ,CAAC;KAChD,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAI,IAAG;OAAK,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;MAC1E;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,SAAS,CAAC,CAAC,IAAI;KAClE,UAAU,EAAO,SAAS,EAAE,WAAW,UAAU,CAAC;KAClD,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAI,IAAG;OAAK,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAI,IAAG;OAAM,CAAA;MAC1E;;IACQ,CAAA;IACf,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,QACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI;KAC7D,UAAU,EAAO,SAAS,YAAY;KACtC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAI,IAAG;QAAK,IAAG;OAAK,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;OACtC,kBAAC,UAAD;QAAQ,IAAG;QAAI,IAAG;QAAI,GAAE;QAAI,MAAK;OAAgB,CAAA;OAAC,kBAAC,UAAD;QAAQ,IAAG;QAAI,IAAG;QAAK,GAAE;QAAI,MAAK;OAAgB,CAAA;OACpG,kBAAC,UAAD;QAAQ,IAAG;QAAI,IAAG;QAAK,GAAE;QAAI,MAAK;OAAgB,CAAA;MAC/C;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI;KAC9D,UAAU,EAAO,SAAS,aAAa;KACvC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAK,IAAG;OAAK,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;OAC7E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;OACvC,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAI,UAAS;QAAI,MAAK;QAAe,QAAO;QAAO,YAAW;QAAO,UAAA;OAAO,CAAA;OAC1F,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAK,UAAS;QAAI,MAAK;QAAe,QAAO;QAAO,YAAW;QAAO,UAAA;OAAO,CAAA;OAC3F,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAK,UAAS;QAAI,MAAK;QAAe,QAAO;QAAO,YAAW;QAAO,UAAA;OAAO,CAAA;MACxF;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI;KAC3D,UAAU,EAAO,SAAS,UAAU;KACpC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAI,OAAM;QAAI,QAAO;QAAI,IAAG;OAAK,CAAA;OAAC,kBAAC,QAAD,EAAM,GAAE,qBAAsB,CAAA;OAC9E,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAK,IAAG;OAAK,CAAA;OACrC,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAK,OAAM;QAAI,QAAO;QAAI,IAAG;OAAK,CAAA;OAChD,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;MACpC;;IACQ,CAAA;IACf,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,UACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI;KAC7D,UAAU,EAAO,SAAS,YAAY;KACtC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,qIAAsI,CAAA,GAC9I,kBAAC,QAAD,EAAM,GAAE,mHAAoH,CAAA,CACzH;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,aAAa,WAAW,CAAC,CAAC,IAAI;KAC/E,UAAU,EAAO,SAAS,WAAW;KACrC,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,YAAD,EAAU,QAAO,mBAAoB,CAAA,GAAC,kBAAC,YAAD,EAAU,QAAO,gBAAiB,CAAA,CACrE;;IACQ,CAAA;IACf,kBAAC,GAAD;KACE,eAAe;MACb,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc;OACnC,MAAM;OACN,OAAO,EAAE,UAAU,YAAY;OAC/B,SAAS,CAAC;QAAE,MAAM;QAAQ,MAAM;OAAoC,CAAC;MACvE,CAAC,CAAC,CAAC,IAAI;KACT;KACA,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,UAAD;QAAQ,IAAG;QAAI,IAAG;QAAI,GAAE;OAAK,CAAA;OAAC,kBAAC,UAAD;QAAQ,IAAG;QAAK,IAAG;QAAI,GAAE;OAAK,CAAA;OAC5D,kBAAC,UAAD;QAAQ,IAAG;QAAK,IAAG;QAAK,GAAE;OAAK,CAAA;OAC/B,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAI,IAAG;QAAK,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAK,IAAG;OAAM,CAAA;MACzE;;IACQ,CAAA;IACf,kBAAC,GAAD;KAAe,SAAS;KAAS,UAAU,EAAO,SAAS,MAAM;KAAG,OAAO,EAAO;KAChF,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,2DAA4D,CAAA,GACpE,kBAAC,QAAD,EAAM,GAAE,4DAA6D,CAAA,CAClE;;IACQ,CAAA;IACf,kBAAC,GAAD;KAAe,SAAS;KAAU,OAAO,EAAO;KAC9C,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAI,OAAM;QAAK,QAAO;QAAK,IAAG;QAAI,IAAG;OAAK,CAAA;OACxD,kBAAC,UAAD;QAAQ,IAAG;QAAM,IAAG;QAAM,GAAE;OAAO,CAAA;OAAC,kBAAC,YAAD,EAAU,QAAO,mBAAoB,CAAA;MACtE;;IACQ,CAAA;IACf,kBAAC,GAAD;KAAe,SAAS;KAAa,OAAO,EAAO;KACjD,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD;QAAM,GAAE;QAAI,GAAE;QAAI,OAAM;QAAK,QAAO;QAAK,IAAG;OAAK,CAAA;OACjD,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAI,IAAG;QAAK,IAAG;OAAK,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAK,IAAG;QAAK,IAAG;OAAM,CAAA;OAC3E,kBAAC,QAAD;QAAM,IAAG;QAAI,IAAG;QAAI,IAAG;QAAI,IAAG;OAAM,CAAA;OAAC,kBAAC,QAAD;QAAM,IAAG;QAAK,IAAG;QAAI,IAAG;QAAK,IAAG;OAAM,CAAA;MACxE;;IACQ,CAAA;IACd,EAAI,YAAY,kBAAC,GAAD;KAAsB;KAAgB;IAAS,CAAA;IAChE,kBAAC,GAAD;KACE,eAAe,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAAI;KAC9D,OAAO,EAAO;KAEd,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAC9G,UAAA,kBAAC,QAAD;OAAM,IAAG;OAAI,IAAG;OAAK,IAAG;OAAK,IAAG;MAAM,CAAA;KACnC,CAAA;IACQ,CAAA;IACf,kBAAC,GAAD;KAAe,SAAS;KAAqB,OAAO,EAAO;KACzD,UAAA,kBAAC,OAAD;MAAK,OAAM;MAAK,QAAO;MAAK,SAAQ;MAAY,MAAK;MAAO,QAAO;MAAe,aAAY;MAAI,eAAc;MAAQ,gBAAe;MAAvI,UAAA;OACE,kBAAC,QAAD,EAAM,GAAE,gBAAiB,CAAA;OACzB,kBAAC,QAAD,EAAM,GAAE,uBAAwB,CAAA;OAChC,kBAAC,QAAD,EAAM,GAAE,oBAAqB,CAAA;MAC1B;;IACQ,CAAA;IACf,kBAAC,GAAD;KAA8B;KAAQ,UAAU;IAAyB,CAAA;IACzE,kBAAC,GAAD;KAA4B;KAAQ,UAAU;IAAuB,CAAA;IACrE,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,SACH,kBAAA,GAAA,EAAA,UAAA;IACE,kBAAC,GAAD;KACE,OAAO,EAAO,cAAc,WAAW,CAAC,CAAC,SAAS;KAClD,WAAW,MAAU;MACnB,AAAI,IACF,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAK,CAAC,CAAC,IAAI,IAE3C,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI;KAE5C;KACA,OAAO,EAAO;KACd,MAAK;IACN,CAAA;IACD,kBAAC,GAAD;KACE,OAAO,EAAO,cAAc,WAAW,CAAC,CAAC,SAAS;KAClD,WAAW,MAAU;MACnB,AAAI,IACF,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,SAAM,CAAC,CAAC,CAAC,IAAI,IAEtD,EAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI;KAEhD;KACA,OAAO,EAAO;KACd,MAAK;IACN,CAAA;IACD,kBAAC,GAAD,CAAiB,CAAA;GACjB,EAAA,CAAA;GAGH,EAAI,MAAM,KAAS,KAClB,kBAAC,GAAD;IAAe,SAAS;IAAW,OAAO,EAAO;IAC/C,UAAA,kBAAC,OAAD;KAAK,OAAM;KAAK,QAAO;KAAK,SAAQ;KAAY,MAAK;KAAO,QAAO;KAAe,aAAY;KAAI,eAAc;KAAQ,gBAAe;KAAvI,UAAA,CACE,kBAAC,QAAD,EAAM,GAAE,yJAA0J,CAAA,GAClK,kBAAC,QAAD,EAAM,GAAE,0JAA2J,CAAA,CAChK;;GACQ,CAAA;GAGhB;EACE;;AAET"}
|