@ryuzaki13/react-foundation-ui 1.0.12 → 1.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextEditorLexicalClient-CxOJuwOC.js","names":[],"sources":["../../src/text-editor/toolbar/Toolbar.module.scss","../../src/text-editor/toolbar/ToolbarControl.tsx","../../src/text-editor/toolbar/AlignmentControls.tsx","../../src/text-editor/toolbar/HistoryControls.tsx","../../src/text-editor/toolbar/LinkButtons.tsx","../../src/text-editor/toolbar/TagButtons.tsx","../../src/text-editor/toolbar/TextEditorToolbarLexical.tsx","../../src/text-editor/lexical/plugins/InitialHtmlPlugin.tsx","../../src/text-editor/model/textEditorTypes.ts","../../src/text-editor/lib/toolbar/styleMappers.ts","../../src/text-editor/lib/toolbar/resolveToolbarState.ts","../../src/text-editor/lexical/plugins/SelectionStatePlugin.tsx","../../src/text-editor/lib/serialization/createLexicalRaw.ts","../../src/text-editor/lib/semantic/getSemanticTagDepth.ts","../../src/text-editor/nodes/AccessibleLinkNode.ts","../../src/text-editor/nodes/SemanticTagNode.ts","../../src/text-editor/model/hooks/useTextEditorLexicalActions.ts","../../src/text-editor/TextEditor.module.scss","../../src/text-editor/EmailDialog.tsx","../../src/text-editor/LinkDialog.tsx","../../src/text-editor/PhoneDialog.tsx","../../src/text-editor/SemanticDialog.tsx","../../src/text-editor/semanticTagConfigs.tsx","../../src/text-editor/TimeDialog.tsx","../../src/text-editor/TextEditorDialogs.tsx","../../src/text-editor/TextEditorLexicalClient.tsx"],"sourcesContent":[".toolbar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tjustify-content: start;\n\tgap: var(--space-sm);\n\tmargin-bottom: var(--space-md);\n\n\thr {\n\t\tmargin: 0.5rem 0;\n\t}\n}\n\n.groupControls {\n\tdisplay: flex;\n\tgap: var(--space-sm);\n}\n","import { type MouseEvent, type ReactNode } from \"react\";\n\nimport { Button } from \"../../button\";\n\ntype ToolbarControlProps = {\n\tisActive?: boolean;\n\tonClick?: (style: string) => void;\n\ttitle?: string;\n\tstyle?: string;\n\tdisabled?: boolean;\n\ticon?: ReactNode;\n};\n\n/**\n * Унифицированная кнопка действия в тулбаре текстового редактора. Отвечает за активное состояние, disabled-режим и визуальное представление иконки.\n */\nexport function ToolbarControl({ isActive, disabled, style, title, icon, onClick }: ToolbarControlProps) {\n\tconst handleMouseDown = (e: MouseEvent<HTMLButtonElement>) => {\n\t\te.preventDefault();\n\t\tonClick?.(style || \"\");\n\t};\n\n\treturn (\n\t\t<Button\n\t\t\ttitle={title}\n\t\t\tdisabled={disabled}\n\t\t\tappearance=\"outline\"\n\t\t\ttone={isActive ? \"info\" : undefined}\n\t\t\tonMouseDown={handleMouseDown}\n\t\t\ticon={icon}\n\t\t/>\n\t);\n}\n","import { AlignCenter, AlignJustify, AlignLeft, AlignRight } from \"lucide-react\";\n\nimport ToolbarStyle from \"./Toolbar.module.scss\";\nimport { ToolbarControl } from \"./ToolbarControl\";\n\nimport type { TextAlignment } from \"../model/textEditorTypes\";\n\ninterface AlignmentControlsProps {\n\tonAlignmentChange: (alignment: TextAlignment) => void;\n\tactiveAlignment?: TextAlignment | null;\n}\n\n/**\n * Кнопки управления выравниванием содержимого в текстовом редакторе. Используются в тулбаре для смены текстового alignment.\n */\nexport function AlignmentControls({ onAlignmentChange, activeAlignment }: AlignmentControlsProps) {\n\treturn (\n\t\t<div className={ToolbarStyle.groupControls}>\n\t\t\t<ToolbarControl\n\t\t\t\ttitle=\"По левому краю\"\n\t\t\t\ticon={<AlignLeft />}\n\t\t\t\tisActive={activeAlignment === \"left\"}\n\t\t\t\tonClick={() => onAlignmentChange(\"left\")}\n\t\t\t/>\n\t\t\t<ToolbarControl\n\t\t\t\ttitle=\"По центру\"\n\t\t\t\ticon={<AlignCenter />}\n\t\t\t\tisActive={activeAlignment === \"center\"}\n\t\t\t\tonClick={() => onAlignmentChange(\"center\")}\n\t\t\t/>\n\t\t\t<ToolbarControl\n\t\t\t\ttitle=\"По правому краю\"\n\t\t\t\ticon={<AlignRight />}\n\t\t\t\tisActive={activeAlignment === \"right\"}\n\t\t\t\tonClick={() => onAlignmentChange(\"right\")}\n\t\t\t/>\n\t\t\t<ToolbarControl\n\t\t\t\ttitle=\"По ширине\"\n\t\t\t\ticon={<AlignJustify />}\n\t\t\t\tisActive={activeAlignment === \"justify\"}\n\t\t\t\tonClick={() => onAlignmentChange(\"justify\")}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { Redo, Undo } from \"lucide-react\";\n\nimport ToolbarStyle from \"./Toolbar.module.scss\";\nimport { ToolbarControl } from \"./ToolbarControl\";\n\ninterface HistoryControlsProps {\n\tonUndo: () => void;\n\tonRedo: () => void;\n}\n\n/**\n * Кнопки отмены и повтора действий для текстового редактора. Отвечают за работу с историей изменений документа.\n */\nexport function HistoryControls({ onUndo, onRedo }: HistoryControlsProps) {\n\treturn (\n\t\t<div className={ToolbarStyle.groupControls}>\n\t\t\t<ToolbarControl title=\"Отменить последнее действие\" icon={<Undo />} onClick={onUndo} />\n\t\t\t<ToolbarControl title=\"Повторить предыдущее действие\" icon={<Redo />} onClick={onRedo} />\n\t\t</div>\n\t);\n}\n","import { AtSign, ExternalLink, Link, Phone } from \"lucide-react\";\n\nimport ToolbarStyle from \"./Toolbar.module.scss\";\nimport { ToolbarControl } from \"./ToolbarControl\";\nimport { LinkTypes } from \"./types\";\n\ninterface LinkButtonsProps {\n\tdisabled: boolean;\n\tonClick: (type: LinkTypes) => void;\n}\n\n/**\n * Набор кнопок для вставки ссылок и связанных сущностей в текстовом редакторе. Используется в составе тулбара редактора.\n */\nexport function LinkButtons({ disabled, onClick }: LinkButtonsProps) {\n\treturn (\n\t\t<div className={ToolbarStyle.groupControls}>\n\t\t\t<ToolbarControl title=\"Добавить ссылку на статью\" icon={<Link />} onClick={() => onClick(LinkTypes.LOCAL_LINK)} />\n\t\t\t<ToolbarControl title=\"Добавить ссылку\" disabled={disabled} icon={<ExternalLink />} onClick={() => onClick(LinkTypes.LINK)} />\n\t\t\t<ToolbarControl title=\"Добавить телефон\" disabled={disabled} icon={<Phone />} onClick={() => onClick(LinkTypes.PHONE)} />\n\t\t\t<ToolbarControl title=\"Добавить email\" disabled={disabled} icon={<AtSign />} onClick={() => onClick(LinkTypes.EMAIL)} />\n\t\t</div>\n\t);\n}\n","import { BookType, Clock, Languages, MessageSquareQuote, PictureInPicture, Shredder } from \"lucide-react\";\n\nimport ToolbarStyle from \"./Toolbar.module.scss\";\nimport { ToolbarControl } from \"./ToolbarControl\";\nimport { TagTypes } from \"./types\";\n\ninterface TagButtonsProps {\n\tonClick: (type: TagTypes) => void;\n}\n\n/**\n * Переиспользуемый компонент `TagButtons` из раздела `toolbar`. Инкапсулирует общую логику отображения и взаимодействия, чтобы интерфейс оставался консистентным.\n */\nexport function TagButtons({ onClick }: TagButtonsProps) {\n\treturn (\n\t\t<div className={ToolbarStyle.groupControls}>\n\t\t\t<ToolbarControl title=\"Вставить Аббревиатуру\" icon={<BookType />} onClick={() => onClick(TagTypes.abbr)} />\n\t\t\t<ToolbarControl title=\"Вставить Код языка\" icon={<Languages />} onClick={() => onClick(TagTypes.lang)} />\n\t\t\t<ToolbarControl title=\"Вставить Дату/время\" icon={<Clock />} onClick={() => onClick(TagTypes.time)} />\n\t\t\t<ToolbarControl title=\"Вставить Ссылку на источник\" icon={<MessageSquareQuote />} onClick={() => onClick(TagTypes.cite)} />\n\t\t\t<ToolbarControl title=\"Вставить Удалённый фрагмент\" icon={<Shredder />} onClick={() => onClick(TagTypes.del)} />\n\t\t\t<ToolbarControl title=\"Вставить Добавленный фрагмент\" icon={<PictureInPicture />} onClick={() => onClick(TagTypes.ins)} />\n\t\t</div>\n\t);\n}\n","import { BrushCleaning } from \"lucide-react\";\n\nimport { AlignmentControls } from \"./AlignmentControls\";\nimport { HistoryControls } from \"./HistoryControls\";\nimport { LinkButtons } from \"./LinkButtons\";\nimport { TagButtons } from \"./TagButtons\";\nimport ToolbarStyle from \"./Toolbar.module.scss\";\nimport { ToolbarControl } from \"./ToolbarControl\";\nimport { LinkTypes, TagTypes, TextEditorBlockControls, TextEditorInlineControls } from \"./types\";\n\nimport type { TextEditorToolbarComponents } from \"../editorModel\";\nimport type { LexicalToolbarState, TextAlignment } from \"../model/textEditorTypes\";\n\ninterface TextEditorToolbarLexicalProps {\n\ttoolbarComponents?: TextEditorToolbarComponents;\n\tstate: LexicalToolbarState;\n\tonBlockStyleToggle: (style: string) => void;\n\tonInlineStyleToggle: (style: string) => void;\n\tonAlignmentChange: (alignment: TextAlignment) => void;\n\tonLinkClick: (type: LinkTypes) => void;\n\tonTagClick: (type: TagTypes) => void;\n\tonUndo: () => void;\n\tonRedo: () => void;\n\tonCleanTag?: () => void;\n}\n\n/**\n * Основная панель инструментов редактора Lexical. Собирает управляющие блоки и синхронизирует их с текущим состоянием выделения.\n */\nexport function TextEditorToolbarLexical({\n\ttoolbarComponents,\n\tstate,\n\tonBlockStyleToggle,\n\tonInlineStyleToggle,\n\tonAlignmentChange,\n\tonLinkClick,\n\tonTagClick,\n\tonUndo,\n\tonRedo,\n\tonCleanTag\n}: TextEditorToolbarLexicalProps) {\n\tconst components = { history: true, ...(toolbarComponents || {}) };\n\n\treturn (\n\t\t<div className={ToolbarStyle.toolbar}>\n\t\t\t{components.blocks && (\n\t\t\t\t<>\n\t\t\t\t\t<div className={ToolbarStyle.groupControls}>\n\t\t\t\t\t\t{TextEditorBlockControls.map((control) => (\n\t\t\t\t\t\t\t<ToolbarControl\n\t\t\t\t\t\t\t\tkey={control.style}\n\t\t\t\t\t\t\t\tisActive={control.style === state.blockType}\n\t\t\t\t\t\t\t\tstyle={control.style}\n\t\t\t\t\t\t\t\ttitle={control.label}\n\t\t\t\t\t\t\t\ticon={control.icon}\n\t\t\t\t\t\t\t\tonClick={onBlockStyleToggle}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t\t<hr />\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{components.inline && (\n\t\t\t\t<>\n\t\t\t\t\t<div className={ToolbarStyle.groupControls}>\n\t\t\t\t\t\t{TextEditorInlineControls.map((control) => (\n\t\t\t\t\t\t\t<ToolbarControl\n\t\t\t\t\t\t\t\tkey={control.style}\n\t\t\t\t\t\t\t\tisActive={!!state.activeInlineStyles[control.style as keyof typeof state.activeInlineStyles]}\n\t\t\t\t\t\t\t\ttitle={control.label}\n\t\t\t\t\t\t\t\tstyle={control.style}\n\t\t\t\t\t\t\t\ticon={control.icon}\n\t\t\t\t\t\t\t\tdisabled={state.isTextUnselected}\n\t\t\t\t\t\t\t\tonClick={onInlineStyleToggle}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t\t<hr />\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{components.alignment && (\n\t\t\t\t<>\n\t\t\t\t\t<AlignmentControls activeAlignment={state.activeAlignment} onAlignmentChange={onAlignmentChange} />\n\t\t\t\t\t<hr />\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{components.links && (\n\t\t\t\t<>\n\t\t\t\t\t<LinkButtons disabled={state.isTextUnselected} onClick={onLinkClick} />\n\t\t\t\t\t<hr />\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{components.tags && (\n\t\t\t\t<>\n\t\t\t\t\t<TagButtons onClick={onTagClick} />\n\t\t\t\t\t<hr />\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{components.history && (\n\t\t\t\t<>\n\t\t\t\t\t<HistoryControls onUndo={onUndo} onRedo={onRedo} />\n\t\t\t\t\t<hr />\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t<ToolbarControl\n\t\t\t\tdisabled={state.isTextUnselected}\n\t\t\t\ttitle=\"Очистить выбранный тег\"\n\t\t\t\ticon={<BrushCleaning />}\n\t\t\t\tonClick={onCleanTag}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { useEffect, useRef } from \"react\";\n\nimport { $generateNodesFromDOM } from \"@lexical/html\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { $createParagraphNode, $getRoot } from \"lexical\";\n\ninterface InitialHtmlPluginProps {\n\tinitialHTML?: string;\n\tshouldSkip: boolean;\n}\n\n/**\n * Плагин Lexical для инициализации содержимого редактора из HTML-строки.\n */\nexport function InitialHtmlPlugin({ initialHTML, shouldSkip }: InitialHtmlPluginProps) {\n\tconst [editor] = useLexicalComposerContext();\n\tconst isAppliedRef = useRef(false);\n\n\tuseEffect(() => {\n\t\tif (shouldSkip || !initialHTML || isAppliedRef.current || typeof window === \"undefined\") return;\n\n\t\tisAppliedRef.current = true;\n\t\teditor.update(() => {\n\t\t\tconst root = $getRoot();\n\t\t\tconst dom = new DOMParser().parseFromString(initialHTML, \"text/html\");\n\t\t\tconst nodes = $generateNodesFromDOM(editor, dom);\n\n\t\t\troot.clear();\n\t\t\tif (nodes.length === 0) {\n\t\t\t\troot.append($createParagraphNode());\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\troot.append(...nodes);\n\t\t});\n\t}, [editor, initialHTML, shouldSkip]);\n\n\treturn null;\n}\n","export type TextAlignment = \"left\" | \"center\" | \"right\" | \"justify\";\n\nexport type TextEditorBlockStyle =\n\t| \"header-one\"\n\t| \"header-two\"\n\t| \"header-three\"\n\t| \"header-four\"\n\t| \"header-five\"\n\t| \"header-six\"\n\t| \"blockquote\"\n\t| \"code-block\"\n\t| \"ordered-list-item\"\n\t| \"unordered-list-item\"\n\t| \"unstyled\"\n\t| \"paragraph\";\n\nexport type TextEditorInlineStyle = \"BOLD\" | \"ITALIC\" | \"UNDERLINE\" | \"STRIKETHROUGH\" | \"HIGHLIGHT\" | \"CODE\";\n\nexport type TextEditorElementTypes = TextEditorBlockStyle | TextEditorInlineStyle;\n\nexport interface TextEditorLinkState {\n\tariaLabel: string;\n\ttext: string;\n\turl: string;\n\tadd: string;\n\tqrCode?: boolean;\n}\n\nexport type LinkType = TextEditorLinkState | string;\n\nexport interface LexicalToolbarState {\n\tblockType: string;\n\tisTextUnselected: boolean;\n\tactiveInlineStyles: Record<TextEditorInlineStyle, boolean>;\n\tactiveAlignment: TextAlignment | null;\n}\n\nexport const DEFAULT_TOOLBAR_STATE: LexicalToolbarState = {\n\tblockType: \"unstyled\",\n\tisTextUnselected: true,\n\tactiveInlineStyles: {\n\t\tBOLD: false,\n\t\tITALIC: false,\n\t\tUNDERLINE: false,\n\t\tSTRIKETHROUGH: false,\n\t\tHIGHLIGHT: false,\n\t\tCODE: false\n\t},\n\tactiveAlignment: null\n};\n","import type { TextEditorBlockStyle } from \"../../model/textEditorTypes\";\n\nexport const getHeadingBlockType = (tag: string): TextEditorBlockStyle => {\n\tswitch (tag) {\n\t\tcase \"h3\":\n\t\t\treturn \"header-three\";\n\t\tcase \"h4\":\n\t\t\treturn \"header-four\";\n\t\tcase \"h5\":\n\t\t\treturn \"header-five\";\n\t\tcase \"h6\":\n\t\t\treturn \"header-six\";\n\t\tdefault:\n\t\t\treturn \"unstyled\";\n\t}\n};\n\nexport const getHeadingTagByStyle = (style: string): \"h3\" | \"h4\" | \"h5\" | \"h6\" | null => {\n\tswitch (style) {\n\t\tcase \"header-three\":\n\t\t\treturn \"h3\";\n\t\tcase \"header-four\":\n\t\t\treturn \"h4\";\n\t\tcase \"header-five\":\n\t\t\treturn \"h5\";\n\t\tcase \"header-six\":\n\t\t\treturn \"h6\";\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n\nexport const getLexicalInlineStyle = (style: string): string | null => {\n\tswitch (style) {\n\t\tcase \"BOLD\":\n\t\t\treturn \"bold\";\n\t\tcase \"ITALIC\":\n\t\t\treturn \"italic\";\n\t\tcase \"UNDERLINE\":\n\t\t\treturn \"underline\";\n\t\tcase \"STRIKETHROUGH\":\n\t\t\treturn \"strikethrough\";\n\t\tcase \"HIGHLIGHT\":\n\t\t\treturn \"highlight\";\n\t\tcase \"CODE\":\n\t\t\treturn \"code\";\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n","import { $isListItemNode, $isListNode } from \"@lexical/list\";\nimport { $isHeadingNode, $isQuoteNode } from \"@lexical/rich-text\";\nimport { $getSelection, $isRangeSelection } from \"lexical\";\n\nimport { DEFAULT_TOOLBAR_STATE, type LexicalToolbarState, type TextAlignment } from \"../../model/textEditorTypes\";\n\nimport { getHeadingBlockType } from \"./styleMappers\";\n\nexport const resolveBlockType = (): string => {\n\tconst selection = $getSelection();\n\tif (!$isRangeSelection(selection)) return \"unstyled\";\n\n\tconst anchorNode = selection.anchor.getNode();\n\tconst topLevel = anchorNode.getTopLevelElementOrThrow();\n\n\tif ($isListItemNode(topLevel)) {\n\t\tconst listNode = topLevel.getParent();\n\t\tif ($isListNode(listNode)) {\n\t\t\treturn listNode.getListType() === \"bullet\" ? \"unordered-list-item\" : \"ordered-list-item\";\n\t\t}\n\t}\n\n\tif ($isListNode(topLevel)) {\n\t\treturn topLevel.getListType() === \"bullet\" ? \"unordered-list-item\" : \"ordered-list-item\";\n\t}\n\n\tif ($isHeadingNode(topLevel)) {\n\t\treturn getHeadingBlockType(topLevel.getTag());\n\t}\n\n\tif ($isQuoteNode(topLevel)) {\n\t\treturn \"blockquote\";\n\t}\n\n\tif (topLevel.getType() === \"paragraph\") {\n\t\treturn \"unstyled\";\n\t}\n\n\treturn topLevel.getType();\n};\n\nexport const resolveAlignment = (): TextAlignment | null => {\n\tconst selection = $getSelection();\n\tif (!$isRangeSelection(selection)) return null;\n\n\tconst anchorNode = selection.anchor.getNode();\n\tconst topLevel = anchorNode.getTopLevelElementOrThrow();\n\tconst formatType = topLevel.getFormatType();\n\n\tswitch (formatType) {\n\t\tcase \"left\":\n\t\tcase \"center\":\n\t\tcase \"right\":\n\t\tcase \"justify\":\n\t\t\treturn formatType;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n\nexport const resolveToolbarState = (): LexicalToolbarState => {\n\tconst selection = $getSelection();\n\tif (!$isRangeSelection(selection)) {\n\t\treturn DEFAULT_TOOLBAR_STATE;\n\t}\n\n\treturn {\n\t\tblockType: resolveBlockType(),\n\t\tisTextUnselected: selection.isCollapsed(),\n\t\tactiveInlineStyles: {\n\t\t\tBOLD: selection.hasFormat(\"bold\"),\n\t\t\tITALIC: selection.hasFormat(\"italic\"),\n\t\t\tUNDERLINE: selection.hasFormat(\"underline\"),\n\t\t\tSTRIKETHROUGH: selection.hasFormat(\"strikethrough\"),\n\t\t\tHIGHLIGHT: selection.hasFormat(\"highlight\" as never),\n\t\t\tCODE: selection.hasFormat(\"code\")\n\t\t},\n\t\tactiveAlignment: resolveAlignment()\n\t};\n};\n","import { useEffect } from \"react\";\n\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { LexicalEditor } from \"lexical\";\n\nimport { resolveToolbarState } from \"../../lib/toolbar/resolveToolbarState\";\n\nimport type { LexicalToolbarState } from \"../../model/textEditorTypes\";\n\ninterface SelectionStatePluginProps {\n\tonEditorReady: (editor: LexicalEditor) => void;\n\tonStateChange: (state: LexicalToolbarState) => void;\n}\n\n/**\n * Плагин Lexical, отслеживающий состояние выделения и готовность редактора.\n */\nexport function SelectionStatePlugin({ onEditorReady, onStateChange }: SelectionStatePluginProps) {\n\tconst [editor] = useLexicalComposerContext();\n\n\tuseEffect(() => {\n\t\tonEditorReady(editor);\n\n\t\treturn editor.registerUpdateListener(({ editorState }) => {\n\t\t\teditorState.read(() => {\n\t\t\t\tonStateChange(resolveToolbarState());\n\t\t\t});\n\t\t});\n\t}, [editor, onEditorReady, onStateChange]);\n\n\treturn null;\n}\n","import { EditorState as LexicalEditorState } from \"lexical\";\n\nimport type { TextEditorLexicalRaw } from \"../../editorModel\";\n\nexport const createLexicalRaw = (editorState: LexicalEditorState): TextEditorLexicalRaw => {\n\treturn {\n\t\tformat: \"lexical\",\n\t\tversion: 1,\n\t\teditorState: editorState.toJSON() as unknown as Record<string, unknown>\n\t};\n};\n","import type { LexicalNode } from \"lexical\";\n\nexport const getSemanticTagDepth = (node: LexicalNode): number => {\n\tlet depth = 0;\n\tlet current: LexicalNode | null = node;\n\n\twhile (current) {\n\t\tdepth += 1;\n\t\tcurrent = current.getParent();\n\t}\n\n\treturn depth;\n};\n","import { LinkAttributes, LinkNode, SerializedLinkNode } from \"@lexical/link\";\nimport {\n\t$applyNodeReplacement,\n\tDOMConversionMap,\n\tDOMConversionOutput,\n\tEditorConfig,\n\tElementNode,\n\tLexicalNode,\n\tLexicalUpdateJSON,\n\tNodeKey,\n\tRangeSelection,\n\tSpread\n} from \"lexical\";\n\nexport type AccessibleLinkAttributes = LinkAttributes & {\n\tariaLabel?: null | string;\n\tqrCode?: boolean;\n\tadd?: null | string;\n\ttext?: null | string;\n};\n\nexport type SerializedAccessibleLinkNode = Spread<\n\t{\n\t\tariaLabel: null | string;\n\t\tqrCode: boolean;\n\t\tadd: null | string;\n\t\ttext: null | string;\n\t},\n\tSerializedLinkNode\n>;\n\nconst convertAccessibleLinkElement = (domNode: Node): DOMConversionOutput => {\n\tif (!(domNode instanceof HTMLAnchorElement)) {\n\t\treturn { node: null };\n\t}\n\n\tconst textContent = domNode.textContent;\n\tif ((textContent === null || textContent === \"\") && domNode.children.length === 0) {\n\t\treturn { node: null };\n\t}\n\n\treturn {\n\t\tnode: $createAccessibleLinkNode(domNode.getAttribute(\"href\") || \"\", {\n\t\t\trel: domNode.getAttribute(\"rel\"),\n\t\t\ttarget: domNode.getAttribute(\"target\"),\n\t\t\ttitle: domNode.getAttribute(\"title\"),\n\t\t\tariaLabel: domNode.getAttribute(\"aria-label\"),\n\t\t\tqrCode: domNode.getAttribute(\"data-qr-code\") === \"true\",\n\t\t\tadd: null,\n\t\t\ttext: textContent\n\t\t})\n\t};\n};\n\nexport class AccessibleLinkNode extends LinkNode {\n\t__ariaLabel: null | string;\n\t__qrCode: boolean;\n\t__add: null | string;\n\t__text: null | string;\n\n\tstatic getType(): string {\n\t\treturn \"accessible-link\";\n\t}\n\n\tstatic clone(node: AccessibleLinkNode): AccessibleLinkNode {\n\t\treturn new AccessibleLinkNode(\n\t\t\tnode.__url,\n\t\t\t{\n\t\t\t\trel: node.__rel,\n\t\t\t\ttarget: node.__target,\n\t\t\t\ttitle: node.__title,\n\t\t\t\tariaLabel: node.__ariaLabel,\n\t\t\t\tqrCode: node.__qrCode,\n\t\t\t\tadd: node.__add,\n\t\t\t\ttext: node.__text\n\t\t\t},\n\t\t\tnode.__key\n\t\t);\n\t}\n\n\tconstructor(url = \"\", attributes: AccessibleLinkAttributes = {}, key?: NodeKey) {\n\t\tsuper(url, attributes, key);\n\n\t\tconst { ariaLabel = null, qrCode = false, add = null, text = null } = attributes;\n\t\tthis.__ariaLabel = ariaLabel;\n\t\tthis.__qrCode = qrCode;\n\t\tthis.__add = add;\n\t\tthis.__text = text;\n\t}\n\n\tstatic importDOM(): DOMConversionMap | null {\n\t\treturn {\n\t\t\ta: () => ({\n\t\t\t\tconversion: convertAccessibleLinkElement,\n\t\t\t\tpriority: 2\n\t\t\t})\n\t\t};\n\t}\n\n\tstatic importJSON(serializedNode: SerializedAccessibleLinkNode): AccessibleLinkNode {\n\t\treturn $createAccessibleLinkNode().updateFromJSON(serializedNode);\n\t}\n\n\tupdateFromJSON(serializedNode: LexicalUpdateJSON<SerializedAccessibleLinkNode>): this {\n\t\treturn super\n\t\t\t.updateFromJSON(serializedNode)\n\t\t\t.setAriaLabel(serializedNode.ariaLabel || null)\n\t\t\t.setQrCode(!!serializedNode.qrCode)\n\t\t\t.setAdd(serializedNode.add || null)\n\t\t\t.setText(serializedNode.text || null);\n\t}\n\n\texportJSON(): SerializedAccessibleLinkNode {\n\t\treturn {\n\t\t\t...super.exportJSON(),\n\t\t\ttype: \"accessible-link\",\n\t\t\tversion: 1,\n\t\t\tariaLabel: this.getAriaLabel(),\n\t\t\tqrCode: this.getQrCode(),\n\t\t\tadd: this.getAdd(),\n\t\t\ttext: this.getText()\n\t\t} as SerializedAccessibleLinkNode;\n\t}\n\n\tcreateDOM(config: EditorConfig): HTMLElement {\n\t\tconst dom = super.createDOM(config) as HTMLElement;\n\t\tthis.applyAccessibleAttributes(null, dom);\n\t\treturn dom;\n\t}\n\n\tupdateDOM(prevNode: this, anchor: HTMLElement, config: EditorConfig): boolean {\n\t\tconst isUpdated = super.updateDOM(prevNode, anchor as never, config);\n\t\tthis.applyAccessibleAttributes(prevNode, anchor);\n\t\treturn isUpdated;\n\t}\n\n\tapplyAccessibleAttributes(prevNode: this | null, anchor: HTMLElement): void {\n\t\tif (!(anchor instanceof HTMLAnchorElement)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!prevNode || prevNode.__ariaLabel !== this.__ariaLabel) {\n\t\t\tif (this.__ariaLabel) {\n\t\t\t\tanchor.setAttribute(\"aria-label\", this.__ariaLabel);\n\t\t\t} else {\n\t\t\t\tanchor.removeAttribute(\"aria-label\");\n\t\t\t}\n\t\t}\n\n\t\tif (!prevNode || prevNode.__qrCode !== this.__qrCode) {\n\t\t\tanchor.setAttribute(\"data-qr-code\", this.__qrCode ? \"true\" : \"false\");\n\t\t}\n\t}\n\n\tinsertNewAfter(_selection: RangeSelection, restoreSelection = true): null | ElementNode {\n\t\tconst linkNode = $createAccessibleLinkNode(this.__url, {\n\t\t\trel: this.__rel,\n\t\t\ttarget: this.__target,\n\t\t\ttitle: this.__title,\n\t\t\tariaLabel: this.__ariaLabel,\n\t\t\tqrCode: this.__qrCode,\n\t\t\tadd: this.__add,\n\t\t\ttext: this.__text\n\t\t});\n\t\tthis.insertAfter(linkNode, restoreSelection);\n\t\treturn linkNode;\n\t}\n\n\tgetAriaLabel(): null | string {\n\t\treturn this.getLatest().__ariaLabel;\n\t}\n\n\tsetAriaLabel(ariaLabel: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__ariaLabel = ariaLabel;\n\t\treturn this;\n\t}\n\n\tgetQrCode(): boolean {\n\t\treturn this.getLatest().__qrCode;\n\t}\n\n\tsetQrCode(qrCode: boolean): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__qrCode = qrCode;\n\t\treturn this;\n\t}\n\n\tgetAdd(): null | string {\n\t\treturn this.getLatest().__add;\n\t}\n\n\tsetAdd(add: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__add = add;\n\t\treturn this;\n\t}\n\n\tgetText(): null | string {\n\t\treturn this.getLatest().__text;\n\t}\n\n\tsetText(text: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__text = text;\n\t\treturn this;\n\t}\n}\n\nexport const $createAccessibleLinkNode = (url = \"\", attributes?: AccessibleLinkAttributes): AccessibleLinkNode => {\n\treturn $applyNodeReplacement(new AccessibleLinkNode(url, attributes));\n};\n\nexport const $isAccessibleLinkNode = (node: LexicalNode | null | undefined): node is AccessibleLinkNode => {\n\treturn node instanceof AccessibleLinkNode;\n};\n","import {\n\t$applyNodeReplacement,\n\tDOMConversionMap,\n\tDOMConversionOutput,\n\tEditorConfig,\n\tElementNode,\n\tLexicalNode,\n\tLexicalUpdateJSON,\n\tNodeKey,\n\tRangeSelection,\n\tSerializedElementNode,\n\tSpread\n} from \"lexical\";\n\nexport type SemanticTagAttributes = Record<string, string>;\n\nexport type SerializedSemanticTagNode = Spread<\n\t{\n\t\ttag: string;\n\t\tattributes: SemanticTagAttributes;\n\t\ttext: null | string;\n\t},\n\tSerializedElementNode\n>;\n\nconst getAttributesFromElement = (element: HTMLElement): SemanticTagAttributes => {\n\tconst attributes: SemanticTagAttributes = {};\n\tArray.from(element.attributes).forEach((attr) => {\n\t\tif (attr.name === \"class\") return;\n\t\tattributes[attr.name] = attr.value;\n\t});\n\treturn attributes;\n};\n\nconst convertSemanticTagElement = (domNode: Node): DOMConversionOutput => {\n\tif (!(domNode instanceof HTMLElement)) {\n\t\treturn { node: null };\n\t}\n\n\tconst tag = domNode.tagName.toLowerCase();\n\tif (![\"abbr\", \"span\", \"time\", \"cite\", \"del\", \"ins\"].includes(tag)) {\n\t\treturn { node: null };\n\t}\n\n\tconst text = domNode.textContent;\n\tif ((text === null || text === \"\") && domNode.children.length === 0) {\n\t\treturn { node: null };\n\t}\n\n\treturn {\n\t\tnode: $createSemanticTagNode(tag, getAttributesFromElement(domNode), text)\n\t};\n};\n\nexport class SemanticTagNode extends ElementNode {\n\t__tag: string;\n\t__attributes: SemanticTagAttributes;\n\t__text: null | string;\n\n\tstatic getType(): string {\n\t\treturn \"semantic-tag\";\n\t}\n\n\tstatic clone(node: SemanticTagNode): SemanticTagNode {\n\t\treturn new SemanticTagNode(node.__tag, node.__attributes, node.__text, node.__key);\n\t}\n\n\tconstructor(tag = \"span\", attributes: SemanticTagAttributes = {}, text: null | string = null, key?: NodeKey) {\n\t\tsuper(key);\n\t\tthis.__tag = tag;\n\t\tthis.__attributes = attributes;\n\t\tthis.__text = text;\n\t}\n\n\tstatic importDOM(): DOMConversionMap | null {\n\t\treturn {\n\t\t\tabbr: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tspan: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\ttime: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tcite: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tdel: () => ({ conversion: convertSemanticTagElement, priority: 2 }),\n\t\t\tins: () => ({ conversion: convertSemanticTagElement, priority: 2 })\n\t\t};\n\t}\n\n\tstatic importJSON(serializedNode: SerializedSemanticTagNode): SemanticTagNode {\n\t\treturn $createSemanticTagNode(serializedNode.tag, serializedNode.attributes, serializedNode.text).updateFromJSON(serializedNode);\n\t}\n\n\tupdateFromJSON(serializedNode: LexicalUpdateJSON<SerializedSemanticTagNode>): this {\n\t\treturn super\n\t\t\t.updateFromJSON(serializedNode)\n\t\t\t.setTag(serializedNode.tag)\n\t\t\t.setAttributes(serializedNode.attributes || {})\n\t\t\t.setText(serializedNode.text || null);\n\t}\n\n\texportJSON(): SerializedSemanticTagNode {\n\t\treturn {\n\t\t\t...super.exportJSON(),\n\t\t\ttype: \"semantic-tag\",\n\t\t\tversion: 1,\n\t\t\ttag: this.getTag(),\n\t\t\tattributes: this.getAttributes(),\n\t\t\ttext: this.getText()\n\t\t};\n\t}\n\n\tcreateDOM(config: EditorConfig): HTMLElement {\n\t\tvoid config;\n\t\tconst element = document.createElement(this.__tag);\n\t\tthis.applyEditorAttributes(element);\n\t\treturn element;\n\t}\n\n\tupdateDOM(prevNode: this, dom: HTMLElement): boolean {\n\t\tif (prevNode.__tag !== this.__tag) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.applyEditorAttributes(dom);\n\t\treturn false;\n\t}\n\n\texportDOM(): { element: HTMLElement } {\n\t\tconst element = document.createElement(this.__tag);\n\t\tObject.entries(this.__attributes).forEach(([key, value]) => {\n\t\t\telement.setAttribute(key, value);\n\t\t});\n\t\treturn { element };\n\t}\n\n\tapplyEditorAttributes(dom: HTMLElement): void {\n\t\tdom.classList.add(\"custom-tag-highlight\");\n\t\tArray.from(dom.attributes).forEach((attr) => {\n\t\t\tif (attr.name === \"class\") return;\n\t\t\tdom.removeAttribute(attr.name);\n\t\t});\n\t\tObject.entries(this.__attributes).forEach(([key, value]) => {\n\t\t\tdom.setAttribute(key, value);\n\t\t});\n\t}\n\n\tinsertNewAfter(_selection: RangeSelection, restoreSelection = true): null | ElementNode {\n\t\tconst node = $createSemanticTagNode(this.__tag, this.__attributes, this.__text);\n\t\tthis.insertAfter(node, restoreSelection);\n\t\treturn node;\n\t}\n\n\tcanInsertTextBefore(): boolean {\n\t\treturn false;\n\t}\n\n\tcanInsertTextAfter(): boolean {\n\t\treturn false;\n\t}\n\n\tcanBeEmpty(): boolean {\n\t\treturn false;\n\t}\n\n\tisInline(): boolean {\n\t\treturn true;\n\t}\n\n\tgetTag(): string {\n\t\treturn this.getLatest().__tag;\n\t}\n\n\tsetTag(tag: string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__tag = tag;\n\t\treturn this;\n\t}\n\n\tgetAttributes(): SemanticTagAttributes {\n\t\treturn this.getLatest().__attributes;\n\t}\n\n\tsetAttributes(attributes: SemanticTagAttributes): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__attributes = attributes;\n\t\treturn this;\n\t}\n\n\tgetText(): null | string {\n\t\treturn this.getLatest().__text;\n\t}\n\n\tsetText(text: null | string): this {\n\t\tconst writable = this.getWritable();\n\t\twritable.__text = text;\n\t\treturn this;\n\t}\n}\n\nexport const $createSemanticTagNode = (\n\ttag: string,\n\tattributes: SemanticTagAttributes = {},\n\ttext: null | string = null\n): SemanticTagNode => {\n\treturn $applyNodeReplacement(new SemanticTagNode(tag, attributes, text));\n};\n\nexport const $isSemanticTagNode = (node: LexicalNode | null | undefined): node is SemanticTagNode => {\n\treturn node instanceof SemanticTagNode;\n};\n","import { useCallback } from \"react\";\n\nimport { $isLinkNode } from \"@lexical/link\";\nimport { INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, REMOVE_LIST_COMMAND } from \"@lexical/list\";\nimport { $createHeadingNode, $createQuoteNode } from \"@lexical/rich-text\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { $findMatchingParent } from \"@lexical/utils\";\nimport {\n\t$createParagraphNode,\n\t$createTextNode,\n\t$getSelection,\n\t$isRangeSelection,\n\tElementFormatType,\n\tFORMAT_ELEMENT_COMMAND,\n\tFORMAT_TEXT_COMMAND,\n\ttype LexicalEditor,\n\ttype LexicalNode,\n\tREDO_COMMAND,\n\tUNDO_COMMAND\n} from \"lexical\";\n\nimport { getSemanticTagDepth } from \"../../lib/semantic/getSemanticTagDepth\";\nimport { getHeadingTagByStyle, getLexicalInlineStyle } from \"../../lib/toolbar/styleMappers\";\nimport { $createAccessibleLinkNode, $isAccessibleLinkNode } from \"../../nodes/AccessibleLinkNode\";\nimport { $createSemanticTagNode, $isSemanticTagNode, type SemanticTagNode } from \"../../nodes/SemanticTagNode\";\nimport { LinkTypes, TagTypes } from \"../../toolbar\";\nimport { type LexicalToolbarState, type LinkType, type TextAlignment } from \"../textEditorTypes\";\n\ninterface InsertLinkPayload {\n\turl: string;\n\ttext: string;\n\tadd: string;\n\tariaLabel: string;\n\tqrCode: boolean;\n}\n\ninterface UseTextEditorLexicalActionsParams {\n\teditor: LexicalEditor | null;\n\ttoolbarState: LexicalToolbarState;\n\thasLocalLinkDialog: boolean;\n\tonOpenLinkDialog: (type: LinkTypes) => void;\n\tonOpenTagDialog: (type: TagTypes) => void;\n}\n\nexport function useTextEditorLexicalActions({\n\teditor,\n\ttoolbarState,\n\thasLocalLinkDialog,\n\tonOpenLinkDialog,\n\tonOpenTagDialog\n}: UseTextEditorLexicalActionsParams) {\n\tconst handleBlockStyleToggle = useCallback(\n\t\t(style: string) => {\n\t\t\tif (!editor) return;\n\n\t\t\tif (style === \"unordered-list-item\") {\n\t\t\t\tif (toolbarState.blockType === \"unordered-list-item\") {\n\t\t\t\t\teditor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (style === \"ordered-list-item\") {\n\t\t\t\tif (toolbarState.blockType === \"ordered-list-item\") {\n\t\t\t\t\teditor.dispatchCommand(REMOVE_LIST_COMMAND, undefined);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teditor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\teditor.update(() => {\n\t\t\t\tconst selection = $getSelection();\n\t\t\t\tif (!$isRangeSelection(selection)) return;\n\n\t\t\t\tif (style === \"unstyled\" || style === \"paragraph\") {\n\t\t\t\t\t$setBlocksType(selection, () => $createParagraphNode());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (style === \"blockquote\") {\n\t\t\t\t\t$setBlocksType(selection, () => $createQuoteNode());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst headingTag = getHeadingTagByStyle(style);\n\t\t\t\tif (headingTag) {\n\t\t\t\t\t$setBlocksType(selection, () => $createHeadingNode(headingTag));\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t[editor, toolbarState.blockType]\n\t);\n\n\tconst handleInlineStyleToggle = useCallback(\n\t\t(style: string) => {\n\t\t\tif (!editor) return;\n\n\t\t\tconst lexicalStyle = getLexicalInlineStyle(style);\n\t\t\tif (!lexicalStyle) return;\n\n\t\t\teditor.dispatchCommand(FORMAT_TEXT_COMMAND, lexicalStyle as never);\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleAlignmentChange = useCallback(\n\t\t(alignment: TextAlignment) => {\n\t\t\tif (!editor) return;\n\t\t\teditor.dispatchCommand(FORMAT_ELEMENT_COMMAND, alignment as ElementFormatType);\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleUndo = useCallback(() => {\n\t\tif (!editor) return;\n\t\teditor.dispatchCommand(UNDO_COMMAND, undefined);\n\t}, [editor]);\n\n\tconst handleRedo = useCallback(() => {\n\t\tif (!editor) return;\n\t\teditor.dispatchCommand(REDO_COMMAND, undefined);\n\t}, [editor]);\n\n\tconst getCurrentSelectionText = useCallback((): string => {\n\t\tif (!editor) return \"\";\n\n\t\tlet text = \"\";\n\t\teditor.getEditorState().read(() => {\n\t\t\tconst selection = $getSelection();\n\t\t\tif (!$isRangeSelection(selection)) return;\n\t\t\ttext = selection.getTextContent();\n\t\t});\n\n\t\treturn text;\n\t}, [editor]);\n\n\tconst insertLinkAtSelection = useCallback(\n\t\t(payload: InsertLinkPayload) => {\n\t\t\tif (!editor) return;\n\n\t\t\teditor.update(() => {\n\t\t\t\tconst selection = $getSelection();\n\t\t\t\tif (!$isRangeSelection(selection)) return;\n\n\t\t\t\tconst selectionText = selection.getTextContent();\n\t\t\t\tconst finalText = payload.text.length > 0 ? payload.text : selectionText;\n\t\t\t\tif (!finalText.trim()) return;\n\n\t\t\t\tconst linkNode = $createAccessibleLinkNode(payload.url, {\n\t\t\t\t\ttarget: \"_blank\",\n\t\t\t\t\trel: \"noopener noreferrer\",\n\t\t\t\t\tariaLabel: payload.ariaLabel || selectionText || finalText,\n\t\t\t\t\tqrCode: payload.qrCode,\n\t\t\t\t\tadd: payload.add || null,\n\t\t\t\t\ttext: finalText\n\t\t\t\t});\n\n\t\t\t\tconst textNode = $createTextNode(finalText);\n\t\t\t\tlinkNode.append(textNode);\n\t\t\t\tselection.insertNodes([linkNode]);\n\t\t\t});\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\teditor.focus();\n\t\t\t});\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleAddLink = useCallback(\n\t\t(url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => {\n\t\t\tinsertLinkAtSelection({\n\t\t\t\turl,\n\t\t\t\ttext,\n\t\t\t\tadd,\n\t\t\t\tariaLabel,\n\t\t\t\tqrCode: showQrCode\n\t\t\t});\n\t\t},\n\t\t[insertLinkAtSelection]\n\t);\n\n\tconst handleAddLocalLink = useCallback(\n\t\t(url: string, caption: string) => {\n\t\t\tinsertLinkAtSelection({\n\t\t\t\turl,\n\t\t\t\ttext: caption,\n\t\t\t\tadd: \"\",\n\t\t\t\tariaLabel: \"Внутренняя ссылка на статью: \" + caption,\n\t\t\t\tqrCode: false\n\t\t\t});\n\t\t},\n\t\t[insertLinkAtSelection]\n\t);\n\n\tconst getSelectedLinkState = useCallback((): LinkType => {\n\t\tif (!editor) return \"\";\n\n\t\tlet state: LinkType = \"\";\n\t\teditor.getEditorState().read(() => {\n\t\t\tconst selection = $getSelection();\n\t\t\tif (!$isRangeSelection(selection)) {\n\t\t\t\tstate = \"\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selectionText = selection.getTextContent();\n\t\t\tconst anchorNode = selection.anchor.getNode();\n\t\t\tconst linkNode = $findMatchingParent(anchorNode, (node) => $isAccessibleLinkNode(node) || $isLinkNode(node));\n\n\t\t\tif ($isAccessibleLinkNode(linkNode)) {\n\t\t\t\tstate = {\n\t\t\t\t\turl: linkNode.getURL(),\n\t\t\t\t\tariaLabel: linkNode.getAriaLabel() || \"\",\n\t\t\t\t\ttext: linkNode.getText() || selectionText,\n\t\t\t\t\tadd: linkNode.getAdd() || \"\",\n\t\t\t\t\tqrCode: linkNode.getQrCode()\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ($isLinkNode(linkNode)) {\n\t\t\t\tstate = {\n\t\t\t\t\turl: linkNode.getURL(),\n\t\t\t\t\tariaLabel: \"\",\n\t\t\t\t\ttext: selectionText,\n\t\t\t\t\tadd: \"\",\n\t\t\t\t\tqrCode: false\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstate = selectionText;\n\t\t});\n\n\t\treturn state;\n\t}, [editor]);\n\n\tconst handleLinkClick = useCallback(\n\t\t(type: LinkTypes) => {\n\t\t\tif (type === LinkTypes.LOCAL_LINK && !hasLocalLinkDialog) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tonOpenLinkDialog(type);\n\t\t},\n\t\t[hasLocalLinkDialog, onOpenLinkDialog]\n\t);\n\n\tconst insertSemanticTagAtSelection = useCallback(\n\t\t(tag: string, text: string, attributes: Record<string, string>) => {\n\t\t\tif (!editor) return;\n\n\t\t\teditor.update(() => {\n\t\t\t\tconst selection = $getSelection();\n\t\t\t\tif (!$isRangeSelection(selection)) return;\n\n\t\t\t\tconst selectionText = selection.getTextContent().trim();\n\t\t\t\tconst finalText =\n\t\t\t\t\ttext || selectionText || attributes[\"title\"] || attributes[\"aria-label\"] || Object.values(attributes).join(\" \") || tag;\n\n\t\t\t\tif (!finalText.trim()) return;\n\n\t\t\t\tconst node = $createSemanticTagNode(tag, attributes, finalText);\n\t\t\t\tnode.append($createTextNode(finalText));\n\t\t\t\tselection.insertNodes([node]);\n\t\t\t});\n\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\teditor.focus();\n\t\t\t});\n\t\t},\n\t\t[editor]\n\t);\n\n\tconst handleCleanSemanticTag = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\teditor.update(() => {\n\t\t\tconst selection = $getSelection();\n\t\t\tif (!$isRangeSelection(selection) || selection.isCollapsed()) return;\n\n\t\t\tconst selectedNodes = selection.getNodes();\n\t\t\tconst semanticNodes = new Set<SemanticTagNode>();\n\n\t\t\tselectedNodes.forEach((node) => {\n\t\t\t\tlet current: LexicalNode | null = node;\n\t\t\t\twhile (current) {\n\t\t\t\t\tif ($isSemanticTagNode(current)) {\n\t\t\t\t\t\tsemanticNodes.add(current);\n\t\t\t\t\t}\n\t\t\t\t\tcurrent = current.getParent();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst sortedNodes = Array.from(semanticNodes).sort((a, b) => getSemanticTagDepth(b) - getSemanticTagDepth(a));\n\t\t\tsortedNodes.forEach((node) => {\n\t\t\t\tif (!node.isAttached()) return;\n\t\t\t\tconst children = node.getChildren();\n\t\t\t\tchildren.forEach((child) => node.insertBefore(child));\n\t\t\t\tnode.remove();\n\t\t\t});\n\t\t});\n\t}, [editor]);\n\n\tconst handleTagClick = useCallback(\n\t\t(type: TagTypes) => {\n\t\t\tonOpenTagDialog(type);\n\t\t},\n\t\t[onOpenTagDialog]\n\t);\n\n\treturn {\n\t\thandleAddLink,\n\t\thandleAddLocalLink,\n\t\thandleAlignmentChange,\n\t\thandleBlockStyleToggle,\n\t\thandleCleanSemanticTag,\n\t\thandleInlineStyleToggle,\n\t\thandleLinkClick,\n\t\thandleRedo,\n\t\thandleTagClick,\n\t\thandleUndo,\n\t\tgetCurrentSelectionText,\n\t\tgetSelectedLinkState,\n\t\tinsertSemanticTagAtSelection\n\t};\n}\n","@use \"@/styles/mixins/mixin\" as *;\n\n.textEditor {\n\tfont-size: inherit;\n}\n\n.textEditorContent {\n\tposition: relative;\n\tpadding: var(--space-md);\n\tborder-radius: var(--radius-md);\n\tbackground-color: var(--surface-secondary);\n\tborder: var(--border);\n\n\t&.focused {\n\t\tborder-color: var(--brand-primary);\n\t}\n}\n\n.wrapper {\n\tfont-size: inherit;\n}\n","import { type MouseEvent, useEffect, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { isSafe } from \"@ryuzaki13/react-foundation-lib/validators\";\n\nimport { Button } from \"../button\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nimport { LinkType } from \"./linkTypes\";\n\ninterface EmailDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tinitialState?: LinkType;\n}\n\n/**\n * Диалог вставки или редактирования email-ссылки в текстовом редакторе.\n */\nexport function EmailDialog({ isOpen, onClose, onConfirm, initialState }: EmailDialogProps) {\n\tconst [email, setEmail] = useState(\"\");\n\tconst [ariaLabel, setAriaLabel] = useState(\"\");\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [state] = useState(() => {\n\t\tif (isSafe(initialState) && typeof initialState === \"string\") {\n\t\t\treturn { text: \"\", add: \"\", ariaLabel: \"\", url: initialState };\n\t\t}\n\n\t\treturn initialState;\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tif (isSafe(state)) {\n\t\t\t\tsetEmail(state.url ?? \"\");\n\t\t\t\tsetAriaLabel(state.ariaLabel ?? \"\");\n\t\t\t}\n\t\t}\n\t}, [isOpen, state]);\n\n\tconst validateEmail = (email: string): boolean => {\n\t\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\t\tif (!emailRegex.test(email)) {\n\t\t\tsetError(\"Некорректный email адрес\");\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst handleConfirm = (e: MouseEvent) => {\n\t\te.preventDefault();\n\n\t\tif (!validateEmail(email)) return;\n\t\tif (!ariaLabel) {\n\t\t\tsetError(\"Добавьте описание для email\");\n\t\t\treturn;\n\t\t}\n\n\t\tonConfirm(`mailto:${email}`, \"\", \"\", ariaLabel, false);\n\t\thandleClose();\n\t};\n\n\tconst handleClose = () => {\n\t\tsetEmail(\"\");\n\t\tsetAriaLabel(\"\");\n\t\tsetError(null);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={handleClose} title=\"Ссылка на email\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<div className={cn(\"flexColumn\", \"gapMd\")}>\n\t\t\t\t\t<Input label=\"Email адрес\" value={email} onChange={setEmail} placeholder=\"some_email@mail.ru\" />\n\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<div className=\"textColorDanger\">\n\t\t\t\t\t\t\t<strong>Ошибка ввода:</strong> <span className=\"fontItalic\">{error}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Текст для экранных читалок\"\n\t\t\t\t\t\tvalue={ariaLabel}\n\t\t\t\t\t\tonChange={setAriaLabel}\n\t\t\t\t\t\tplaceholder=\"Электронная почта руководителя городской думмы\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"outline\" tone=\"error\" onClick={handleClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"outline\" tone=\"success\" onClick={handleConfirm} disabled={!email || !ariaLabel}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { type MouseEvent, useEffect, useState } from \"react\";\n\nimport { isSafe, validateUrl } from \"@ryuzaki13/react-foundation-lib/validators\";\n\nimport { Button } from \"../button\";\nimport { CheckBox } from \"../check-box\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nimport { LinkType } from \"./linkTypes\";\n\ninterface LinkDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tinitialState?: LinkType;\n}\n\n/**\n * Диалог вставки или редактирования ссылки в текстовом редакторе.\n */\nexport function LinkDialog({ isOpen, onClose, onConfirm, initialState }: LinkDialogProps) {\n\tconst [url, setUrl] = useState(\"\");\n\tconst [ariaLabel, setAriaLabel] = useState(\"\");\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [showQrCode, setShowQrCode] = useState(false);\n\tconst [state] = useState(() => {\n\t\tif (isSafe(initialState)) {\n\t\t\tif (typeof initialState === \"string\") {\n\t\t\t\treturn { text: \"\", add: \"\", ariaLabel: \"\", url: initialState };\n\t\t\t}\n\t\t}\n\t\treturn initialState;\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tif (isSafe(state)) {\n\t\t\t\tsetUrl(state.url ?? \"\");\n\t\t\t\tsetAriaLabel(state.ariaLabel ?? \"\");\n\t\t\t}\n\t\t}\n\t}, [isOpen, state]);\n\n\tconst handleUrlChange = (value: string) => {\n\t\tsetUrl(value);\n\n\t\t// Очищаем ошибку при изменении URL\n\t\tif (error) {\n\t\t\tsetError(null);\n\t\t}\n\t};\n\n\tconst handleConfirm = (e: MouseEvent) => {\n\t\te.preventDefault();\n\n\t\tconst validation = validateUrl(url);\n\t\tif (!validation.isValid) {\n\t\t\tsetError(validation.error);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!ariaLabel) {\n\t\t\tsetError(\"добавьте описание для ссылки\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Добавляем протокол, если его нет\n\t\tconst finalUrl = url.startsWith(\"http\") ? url : `https://${url}`;\n\t\tonConfirm(finalUrl, \"\", \"\", ariaLabel, showQrCode);\n\t\thandleClose();\n\t};\n\n\tconst handleClose = () => {\n\t\tsetUrl(\"\");\n\t\tsetAriaLabel(\"\");\n\t\tsetError(null);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={handleClose} title=\"Ссылка на внешний url\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<Input label=\"Полный URL адрес\" value={url} onChange={handleUrlChange} placeholder=\"https://somesite.ru\" />\n\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<div className=\"textColorDanger\">\n\t\t\t\t\t\t\t<strong>Ошибка ввода:</strong> <span className=\"fontItalic\">{error}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Текст для экранных читалок\"\n\t\t\t\t\t\tvalue={ariaLabel}\n\t\t\t\t\t\tonChange={setAriaLabel}\n\t\t\t\t\t\tplaceholder=\"Ссылка на официальный сайт городской думмы\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t<CheckBox title=\"Показать кнопку для генерации QR кода ссылки\" value={showQrCode} onChange={setShowQrCode} />\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"outline\" tone=\"error\" onClick={handleClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"outline\" tone=\"success\" onClick={handleConfirm} disabled={!url || !ariaLabel}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { type MouseEvent, useEffect, useState } from \"react\";\n\nimport { formatPhone } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { isSafe } from \"@ryuzaki13/react-foundation-lib/validators\";\n\nimport { Button } from \"../button\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nimport { LinkType } from \"./linkTypes\";\n\ninterface PhoneDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tinitialState?: LinkType;\n}\n\n/**\n * Диалог вставки или редактирования телефонной ссылки в текстовом редакторе.\n */\nexport function PhoneDialog({ isOpen, onClose, onConfirm, initialState }: PhoneDialogProps) {\n\tconst [phone, setPhone] = useState(\"\");\n\tconst [phoneAdd, setPhoneAdd] = useState(\"\");\n\tconst [ariaLabel, setAriaLabel] = useState(\"\");\n\tconst [error, setError] = useState<string | null>(null);\n\tconst [state] = useState(() => {\n\t\tif (isSafe(initialState) && typeof initialState === \"string\") {\n\t\t\treturn { text: \"\", add: \"\", ariaLabel: \"\", url: initialState };\n\t\t}\n\n\t\treturn initialState;\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tif (isSafe(state)) {\n\t\t\t\tsetPhone((state.url ?? \"\").replace(/\\D/g, \"\").slice(0, 11).replace(/^7/, \"\"));\n\n\t\t\t\tif (!state.add) {\n\t\t\t\t\tsetPhoneAdd((state.url ?? \"\").replace(/\\D/g, \"\").slice(11));\n\t\t\t\t} else {\n\t\t\t\t\tsetPhoneAdd((state.add ?? \"\").replace(/\\D/g, \"\"));\n\t\t\t\t}\n\n\t\t\t\tsetAriaLabel(state.ariaLabel ?? \"\");\n\t\t\t}\n\t\t}\n\t}, [isOpen, state]);\n\n\tconst handlePhoneChange = (value: string) => {\n\t\tvalue = value.replace(/\\D/g, \"\");\n\t\tif (value.length <= 10) {\n\t\t\tsetPhone(value);\n\t\t\tsetError(null);\n\t\t} else {\n\t\t\tsetError(\"нельзя ввести более 10 цифр\");\n\t\t}\n\t};\n\n\tconst validatePhone = (phone: string): boolean => {\n\t\tif (phone.length !== 10) {\n\t\t\tsetError(\"номер телефона должен содержать 10 цифр\");\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst handleConfirm = (e: MouseEvent) => {\n\t\te.preventDefault();\n\n\t\tif (!validatePhone(phone)) return;\n\t\tif (!ariaLabel) {\n\t\t\tsetError(\"добавьте описание для телефона\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst formattedPhone = formatPhone(phone);\n\t\tconst fullPhone = `+7${phone}`;\n\t\tonConfirm(`tel:${fullPhone}`, phoneAdd ? `${formattedPhone} доб. ${phoneAdd}` : formattedPhone, phoneAdd, ariaLabel, false);\n\t\thandleClose();\n\t};\n\n\tconst handleClose = () => {\n\t\tsetPhone(\"\");\n\t\tsetAriaLabel(\"\");\n\t\tsetError(null);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={handleClose} title=\"Ссылка на телефон\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<div className={cn(\"flex\", \"alignItemsEnd\", \"gapSm\")}>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"Номер телефона без 7-ки\"\n\t\t\t\t\t\t\tdescription=\"Вводится только номер (10) цифр без каких-либо дополнительных символов. Ссылка будет привязана к текущему выделенному фрагменту текста. Поэтому текст самой ссылки можно оформить грамотно, например: +7 (3522) 12-34-56 доб. 100\"\n\t\t\t\t\t\t\tvalue={phone}\n\t\t\t\t\t\t\tonChange={handlePhoneChange}\n\t\t\t\t\t\t\tplaceholder=\"3522123456\"\n\t\t\t\t\t\t\tclassName=\"flex1\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Input label=\"Добавочный номер\" value={phoneAdd} onChange={setPhoneAdd} placeholder=\"100\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<div className=\"textColorDanger\">\n\t\t\t\t\t\t\t<strong>Ошибка ввода:</strong> <span className=\"fontItalic\">{error}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Текст для экранных читалок\"\n\t\t\t\t\t\tdescription=\"Обязательное поле для организации доступности ссылки для лиц с ОВЗ, использующих скринридеры\"\n\t\t\t\t\t\tvalue={ariaLabel}\n\t\t\t\t\t\tonChange={setAriaLabel}\n\t\t\t\t\t\tplaceholder=\"Контактный телефон директора\"\n\t\t\t\t\t/>\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"solid\" tone=\"error\" onClick={handleClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"solid\" tone=\"success\" onClick={handleConfirm} disabled={!phone || !ariaLabel}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { type ReactNode, useEffect, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\n\nexport interface AttributeField {\n\tname: string;\n\tlabel: string;\n\tdescription?: string;\n\tplaceholder?: string;\n\trequired?: boolean;\n\tvalidate?: (value: string) => string | null;\n}\n\nexport interface SemanticTagConfig {\n\ttagName: string;\n\ttitle: string;\n\tdescription: string;\n\texample: ReactNode;\n\tfields: AttributeField[];\n}\n\ninterface SemanticDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (tagName: string, text: string, attributes: Record<string, string>) => void;\n\tconfig: SemanticTagConfig;\n\tinitialState?: Record<string, string>;\n\tinitialText?: string;\n}\n\n/**\n * Диалог настройки семантического тега и его атрибутов в текстовом редакторе.\n */\nexport function SemanticDialog({ isOpen, onClose, onConfirm, config, initialText = \"\", initialState = {} }: SemanticDialogProps) {\n\tconst [text, setText] = useState(initialText);\n\tconst [values, setValues] = useState<Record<string, string>>({});\n\tconst [errors, setErrors] = useState<Record<string, string | null>>({});\n\tconst [initialized, setInitialized] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (isOpen && !initialized) {\n\t\t\tconst initial = config.fields.reduce(\n\t\t\t\t(acc, field) => {\n\t\t\t\t\tacc[field.name] = initialState[field.name] ?? \"\";\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{} as Record<string, string>\n\t\t\t);\n\t\t\tsetValues(initial);\n\t\t\tsetErrors({});\n\t\t\tsetInitialized(true);\n\t\t} else if (!isOpen && initialized) {\n\t\t\tsetInitialized(false); // сбрасываем при закрытии\n\t\t}\n\t}, [isOpen, config.fields, initialState, initialized]);\n\n\tconst handleChange = (name: string, value: string) => {\n\t\tsetValues((prev) => ({ ...prev, [name]: value }));\n\t\tsetErrors((prev) => ({ ...prev, [name]: null }));\n\t};\n\n\tconst validate = (): boolean => {\n\t\tconst newErrors: Record<string, string | null> = {};\n\t\tlet isValid = true;\n\n\t\tif (!text.trim()) {\n\t\t\tnewErrors[\"text\"] = \"Обязательное поле\";\n\t\t\tisValid = false;\n\t\t}\n\n\t\tfor (const field of config.fields) {\n\t\t\tconst value = values[field.name]?.trim();\n\t\t\tif (field.required && !value) {\n\t\t\t\tnewErrors[field.name] = \"Обязательное поле\";\n\t\t\t\tisValid = false;\n\t\t\t} else if (field.validate) {\n\t\t\t\tconst err = field.validate(value);\n\t\t\t\tif (err) {\n\t\t\t\t\tnewErrors[field.name] = err;\n\t\t\t\t\tisValid = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsetErrors(newErrors);\n\t\treturn isValid;\n\t};\n\n\tconst handleConfirm = () => {\n\t\tif (!validate()) return;\n\t\tonConfirm(config.tagName, text.trim(), values);\n\t\tonClose();\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={onClose} title={`Вставка <${config.tagName}>`} size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t{config.description}.<br />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<strong>Пример:</strong> {config.example}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel={config.title}\n\t\t\t\t\t\tdescription={`Данный текст будет вставлен в редактор и обёрнуть в специальный семантический тег ${config.tagName}`}\n\t\t\t\t\t\tvalue={text}\n\t\t\t\t\t\tonChange={setText}\n\t\t\t\t\t\terror={errors[\"text\"] ?? undefined}\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\t\t\t\t\t{config.fields.map((field) => {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\tkey={field.name}\n\t\t\t\t\t\t\t\tlabel={field.label}\n\t\t\t\t\t\t\t\tdescription={field.description}\n\t\t\t\t\t\t\t\tplaceholder={field.placeholder}\n\t\t\t\t\t\t\t\tvalue={values[field.name] ?? \"\"}\n\t\t\t\t\t\t\t\tonChange={(value) => handleChange(field.name, value)}\n\t\t\t\t\t\t\t\terror={errors[field.name] ?? undefined}\n\t\t\t\t\t\t\t\trequired={field.required}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"solid\" tone=\"error\" onClick={onClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"solid\" tone=\"success\" onClick={handleConfirm}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import { TagTypes } from \"./toolbar\";\n\nimport type { SemanticTagConfig } from \"./SemanticDialog\";\n\nexport const SemanticTagConfigs: Record<TagTypes, SemanticTagConfig> = {\n\t[TagTypes.abbr]: {\n\t\ttagName: \"abbr\",\n\t\ttitle: \"Аббревиатура\",\n\t\tdescription: \"Обозначает аббревиатуры и сокращения, при наведении покажет расшифровку\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\t<abbr title=\"Национальное управление по аэронавтике и исследованию космического пространства\">НАСА</abbr>\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`<abbr title=\"Национальное управление по аэронавтике и исследованию космического пространства\">НАСА</abbr>`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"title\",\n\t\t\t\tlabel: \"Расшифровка\",\n\t\t\t\tdescription: \"Появится как подсказка и будет прочитана скринридером\",\n\t\t\t\tplaceholder: \"например: HyperText Markup Language\",\n\t\t\t\trequired: true\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.lang]: {\n\t\ttagName: \"span\",\n\t\ttitle: \"Текст на другом языке\",\n\t\tdescription:\n\t\t\t\"Указывает язык фрагмента текста, если он отличается от основного языка страницы, скринридер прочитает это слово с французским произношением\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\t<span lang=\"fr\">Bonjour!</span> — сказал турист.\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`<span lang=\"fr\">Bonjour!</span> — сказал турист.`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"lang\",\n\t\t\t\tlabel: \"Код языка\",\n\t\t\t\tplaceholder: \"en, fr, ru\",\n\t\t\t\trequired: true,\n\t\t\t\tvalidate: (val) => (!/^[a-z]{2,3}(-[A-Z]{2})?$/.test(val) ? \"Неверный код языка (например, en или en-US)\" : null)\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.time]: {\n\t\ttagName: \"time\",\n\t\ttitle: \"Дата/время\",\n\t\tdescription: \"\",\n\t\texample: \"\",\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"datetime\",\n\t\t\t\tlabel: \"Дата/время (machine-readable)\",\n\t\t\t\tdescription: \"Формат ISO 8601: 2025-05-18, 14:30, 2025-05-18T14:30\",\n\t\t\t\tplaceholder: \"например: 2025-05-18T14:30\",\n\t\t\t\trequired: true\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.cite]: {\n\t\ttagName: \"cite\",\n\t\ttitle: \"Цитата источника\",\n\t\tdescription: \"Обозначает название книги, статьи, фильма или другого произведения, на которое вы ссылаетесь\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\tПо словам Эйнштейна: <cite>«Воображение важнее знания»</cite>.\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`По словам Эйнштейна: <cite>«Воображение важнее знания»</cite>.`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"title\",\n\t\t\t\tlabel: \"Название источника\",\n\t\t\t\tdescription: \"Будет отображаться как подсказка\",\n\t\t\t\tplaceholder: \"например: Википедия\",\n\t\t\t\trequired: false\n\t\t\t}\n\t\t]\n\t},\n\t// [TagTypes.address]: {\n\t// \ttagName: \"address\",\n\t// \ttitle: \"Указывает контакты автора статьи/страницы (не для почтовых адресов компаний!)\",\n\t// \tdescription: \"\",\n\t// \texample: ``,\n\t// \tfields: [\n\t// \t\t{\n\t// \t\t\tname: \"aria-label\",\n\t// \t\t\tlabel: \"Описание (для доступности)\",\n\t// \t\t\tdescription: \"Содержимое будет прочитано скринридером, если адрес не очевиден\",\n\t// \t\t\tplaceholder: \"например: Контактный адрес компании\",\n\t// \t\t\trequired: false\n\t// \t\t}\n\t// \t]\n\t// },\n\t[TagTypes.del]: {\n\t\ttagName: \"del\",\n\t\ttitle: \"Изменения в тексте\",\n\t\tdescription: \"Удаленный фрагмент\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\tПроект сдачи: <del>1 июня</del> <ins>15 июня</ins>\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`Проект сдачи: <del>1 июня</del> <ins>15 июня</ins>`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"datetime\",\n\t\t\t\tlabel: \"Когда был удалён\",\n\t\t\t\tdescription: \"Формат ISO 8601: 2025-05-18T14:30\",\n\t\t\t\tplaceholder: \"например: 2025-05-18T14:30\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"cite\",\n\t\t\t\tlabel: \"Источник/обоснование\",\n\t\t\t\tdescription: \"Ссылка на объяснение причины\",\n\t\t\t\tplaceholder: \"например: https://example.com/edit-log\",\n\t\t\t\trequired: false\n\t\t\t}\n\t\t]\n\t},\n\t[TagTypes.ins]: {\n\t\ttagName: \"ins\",\n\t\ttitle: \"Изменения в тексте\",\n\t\tdescription: \"Новый добавленный текст\",\n\t\texample: (\n\t\t\t<>\n\t\t\t\tПроект сдачи: <del>1 июня</del> <ins>15 июня</ins>\n\t\t\t\t<div className=\"marginTopMd\">\n\t\t\t\t\t<code>{`Проект сдачи: <del>1 июня</del> <ins>15 июня</ins>`}</code>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t),\n\t\tfields: [\n\t\t\t{\n\t\t\t\tname: \"datetime\",\n\t\t\t\tlabel: \"Когда был добавлен\",\n\t\t\t\tdescription: \"Формат ISO 8601: 2025-05-18T14:30\",\n\t\t\t\tplaceholder: \"например: 2025-05-18T14:30\",\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"cite\",\n\t\t\t\tlabel: \"Источник/обоснование\",\n\t\t\t\tdescription: \"Ссылка на объяснение причины\",\n\t\t\t\tplaceholder: \"например: https://example.com/edit-log\",\n\t\t\t\trequired: false\n\t\t\t}\n\t\t]\n\t}\n};\n","import { useEffect, useEffectEvent, useState } from \"react\";\n\nimport { Button } from \"../button\";\nimport { GridContainer } from \"../grid\";\nimport { Input } from \"../input\";\nimport { Modal, ModalContent, ModalFooter } from \"../modal\";\nimport { RadioGroup } from \"../radio-group\";\n\ntype TimeDialogInitialState = {\n\tmode?: TimeMode;\n\tfrom?: string;\n\tto?: string;\n};\n\ninterface TimeDialogProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (tagName: string, text: string, attributes: Record<string, string>) => void;\n\tinitialState?: TimeDialogInitialState;\n}\n\ntype TimeMode = \"date\" | \"datetime\" | \"time\" | \"range-time\" | \"range-date\" | \"range-datetime\";\n\n/**\n * Диалог настройки временного атрибута или значения в текстовом редакторе.\n */\nexport function TimeDialog({ isOpen, onClose, onConfirm, initialState }: TimeDialogProps) {\n\tconst [mode, setMode] = useState<TimeMode | undefined>(\"date\");\n\tconst [from, setFrom] = useState(\"\");\n\tconst [to, setTo] = useState(\"\");\n\tconst [errors, setErrors] = useState<{ from?: string; to?: string }>({});\n\n\tconst syncInitialState = useEffectEvent((initialState?: TimeDialogInitialState) => {\n\t\tsetMode(initialState?.mode ?? \"date\");\n\t\tsetFrom(initialState?.from ?? \"\");\n\t\tsetTo(initialState?.to ?? \"\");\n\t\tsetErrors({});\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tsyncInitialState(initialState);\n\t\t}\n\t}, [isOpen, initialState]);\n\n\tconst validate = () => {\n\t\tconst newErrors: typeof errors = {};\n\t\t// const isValid = true;\n\n\t\tconst isDate = (v: string) => /^\\d{4}-\\d{2}-\\d{2}$/.test(v);\n\t\tconst isTime = (v: string) => /^\\d{2}:\\d{2}$/.test(v);\n\t\tconst isDateTime = (v: string) => /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/.test(v);\n\n\t\tconst check = (label: string, value: string, type: \"date\" | \"time\" | \"datetime\") => {\n\t\t\tif (!value) return `${label} обязательно`;\n\t\t\tif (type === \"date\" && !isDate(value)) return \"Неверный формат даты (ГГГГ-ММ-ДД)\";\n\t\t\tif (type === \"time\" && !isTime(value)) return \"Неверный формат времени (ЧЧ:ММ)\";\n\t\t\tif (type === \"datetime\" && !isDateTime(value)) return \"Неверный формат даты и времени (ГГГГ-ММ-ДДTЧЧ:ММ)\";\n\t\t\treturn undefined;\n\t\t};\n\n\t\tswitch (mode) {\n\t\t\tcase \"date\":\n\t\t\t\tnewErrors.from = check(\"Дата\", from, \"date\");\n\t\t\t\tbreak;\n\t\t\tcase \"time\":\n\t\t\t\tnewErrors.from = check(\"Время\", from, \"time\");\n\t\t\t\tbreak;\n\t\t\tcase \"datetime\":\n\t\t\t\tnewErrors.from = check(\"Дата и время\", from, \"datetime\");\n\t\t\t\tbreak;\n\t\t\tcase \"range-time\":\n\t\t\t\tnewErrors.from = check(\"Время начала\", from, \"time\");\n\t\t\t\tnewErrors.to = check(\"Время окончания\", to, \"time\");\n\t\t\t\tbreak;\n\t\t\tcase \"range-date\":\n\t\t\t\tnewErrors.from = check(\"Дата начала\", from, \"date\");\n\t\t\t\tnewErrors.to = check(\"Дата окончания\", to, \"date\");\n\t\t\t\tbreak;\n\t\t\tcase \"range-datetime\":\n\t\t\t\tnewErrors.from = check(\"Начало\", from, \"datetime\");\n\t\t\t\tnewErrors.to = check(\"Окончание\", to, \"datetime\");\n\t\t\t\tbreak;\n\t\t}\n\n\t\tsetErrors(newErrors);\n\t\treturn Object.values(newErrors).every((e) => !e);\n\t};\n\n\tconst handleConfirm = () => {\n\t\tif (!validate()) return;\n\n\t\tconst datetime = to ? `${from}/${to}` : from;\n\t\tonConfirm(\"time\", datetime, { datetime });\n\t\tonClose();\n\t};\n\n\tconst renderInputs = () => {\n\t\tswitch (mode) {\n\t\t\tcase \"date\":\n\t\t\tcase \"datetime\":\n\t\t\tcase \"time\":\n\t\t\t\treturn (\n\t\t\t\t\t<Input\n\t\t\t\t\t\tlabel=\"Значение\"\n\t\t\t\t\t\tplaceholder={mode === \"time\" ? \"09:00\" : mode === \"date\" ? \"2025-05-18\" : \"2025-05-18T09:00\"}\n\t\t\t\t\t\tvalue={from}\n\t\t\t\t\t\tonChange={setFrom}\n\t\t\t\t\t\terror={errors.from}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\tcase \"range-time\":\n\t\t\tcase \"range-date\":\n\t\t\tcase \"range-datetime\":\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"С\"\n\t\t\t\t\t\t\tplaceholder={mode.includes(\"time\") ? \"09:00\" : mode.includes(\"date\") ? \"2025-05-18\" : \"2025-05-18T09:00\"}\n\t\t\t\t\t\t\tvalue={from}\n\t\t\t\t\t\t\tonChange={setFrom}\n\t\t\t\t\t\t\terror={errors.from}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tlabel=\"По\"\n\t\t\t\t\t\t\tplaceholder={mode.includes(\"time\") ? \"17:00\" : mode.includes(\"date\") ? \"2025-05-22\" : \"2025-05-22T17:00\"}\n\t\t\t\t\t\t\tvalue={to}\n\t\t\t\t\t\t\tonChange={setFrom}\n\t\t\t\t\t\t\terror={errors.to}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={onClose} title=\"Вставка <time>\" size=\"md\">\n\t\t\t<ModalContent>\n\t\t\t\t<GridContainer gap=\"md\">\n\t\t\t\t\t<RadioGroup label=\"Тип значения\" value={mode} onChange={setMode}>\n\t\t\t\t\t\t<RadioGroup.Option label=\"Дата\" value=\"date\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Дата и время\" value=\"datetime\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Время\" value=\"time\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Диапазон дат\" value=\"range-date\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Диапазон времени\" value=\"range-time\" />\n\t\t\t\t\t\t<RadioGroup.Option label=\"Диапазон даты и времени\" value=\"range-datetime\" />\n\t\t\t\t\t</RadioGroup>\n\n\t\t\t\t\t<GridContainer gap=\"md\">{renderInputs()}</GridContainer>\n\t\t\t\t</GridContainer>\n\t\t\t</ModalContent>\n\t\t\t<ModalFooter>\n\t\t\t\t<Button appearance=\"solid\" tone=\"error\" onClick={onClose}>\n\t\t\t\t\tОтмена\n\t\t\t\t</Button>\n\t\t\t\t<Button appearance=\"solid\" tone=\"success\" onClick={handleConfirm}>\n\t\t\t\t\tПодтвердить\n\t\t\t\t</Button>\n\t\t\t</ModalFooter>\n\t\t</Modal>\n\t);\n}\n","import type { ComponentType } from \"react\";\n\nimport { EmailDialog } from \"./EmailDialog\";\nimport { LinkDialog } from \"./LinkDialog\";\nimport { PhoneDialog } from \"./PhoneDialog\";\nimport { SemanticDialog } from \"./SemanticDialog\";\nimport { SemanticTagConfigs } from \"./semanticTagConfigs\";\nimport { TimeDialog } from \"./TimeDialog\";\nimport { LinkTypes, TagTypes } from \"./toolbar\";\n\nimport type { LocalLinkDialogAdapterProps } from \"./editorModel\";\nimport type { LinkType } from \"./model/textEditorTypes\";\n\ninterface TextEditorDialogsProps {\n\tlinkTypeDialog: LinkTypes | null;\n\ttagTypeDialog: TagTypes | null;\n\tlocalLinkDialogComponent?: ComponentType<LocalLinkDialogAdapterProps>;\n\tonCloseLinkDialog: () => void;\n\tonCloseTagDialog: () => void;\n\tonAddLink: (url: string, text: string, add: string, ariaLabel: string, showQrCode: boolean) => void;\n\tonAddLocalLink: (url: string, caption: string) => void;\n\tonInsertSemanticTag: (tagName: string, text: string, attributes: Record<string, string>) => void;\n\tgetCurrentSelectionText: () => string;\n\tgetSelectedLinkState: () => LinkType;\n}\n\n/**\n * Контейнер набора диалогов, которые используются редактором для вставки ссылок и семантических сущностей.\n */\nexport function TextEditorDialogs({\n\tlinkTypeDialog,\n\ttagTypeDialog,\n\tlocalLinkDialogComponent,\n\tonCloseLinkDialog,\n\tonCloseTagDialog,\n\tonAddLink,\n\tonAddLocalLink,\n\tonInsertSemanticTag,\n\tgetCurrentSelectionText,\n\tgetSelectedLinkState\n}: TextEditorDialogsProps) {\n\tconst LocalLinkDialogComponent = localLinkDialogComponent;\n\n\treturn (\n\t\t<>\n\t\t\t{linkTypeDialog && (\n\t\t\t\t<>\n\t\t\t\t\t{LocalLinkDialogComponent && (\n\t\t\t\t\t\t<LocalLinkDialogComponent\n\t\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.LOCAL_LINK}\n\t\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\t\tonConfirm={onAddLocalLink}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<LinkDialog\n\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.LINK}\n\t\t\t\t\t\tinitialState={getSelectedLinkState()}\n\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\tonConfirm={onAddLink}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<PhoneDialog\n\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.PHONE}\n\t\t\t\t\t\tinitialState={getSelectedLinkState()}\n\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\tonConfirm={onAddLink}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<EmailDialog\n\t\t\t\t\t\tisOpen={linkTypeDialog === LinkTypes.EMAIL}\n\t\t\t\t\t\tinitialState={getSelectedLinkState()}\n\t\t\t\t\t\tonClose={onCloseLinkDialog}\n\t\t\t\t\t\tonConfirm={onAddLink}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t)}\n\n\t\t\t{tagTypeDialog &&\n\t\t\t\t(tagTypeDialog !== TagTypes.time ? (\n\t\t\t\t\t<SemanticDialog\n\t\t\t\t\t\tisOpen={true}\n\t\t\t\t\t\tonClose={onCloseTagDialog}\n\t\t\t\t\t\tonConfirm={onInsertSemanticTag}\n\t\t\t\t\t\tconfig={SemanticTagConfigs[tagTypeDialog]}\n\t\t\t\t\t\tinitialText={getCurrentSelectionText()}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<TimeDialog isOpen={true} onClose={onCloseTagDialog} onConfirm={onInsertSemanticTag} />\n\t\t\t\t))}\n\t\t</>\n\t);\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { $generateHtmlFromNodes } from \"@lexical/html\";\nimport { ListItemNode, ListNode } from \"@lexical/list\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { OnChangePlugin } from \"@lexical/react/LexicalOnChangePlugin\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { HeadingNode, QuoteNode } from \"@lexical/rich-text\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { type LexicalEditor, type EditorState as LexicalEditorState } from \"lexical\";\n\nimport { TextEditorCoreProps, isLexicalTextRaw } from \"./editorModel\";\nimport { InitialHtmlPlugin, SelectionStatePlugin } from \"./lexical/plugins\";\nimport { createLexicalRaw } from \"./lib/serialization/createLexicalRaw\";\nimport { useTextEditorLexicalActions } from \"./model/hooks/useTextEditorLexicalActions\";\nimport { DEFAULT_TOOLBAR_STATE, type LexicalToolbarState } from \"./model/textEditorTypes\";\nimport { AccessibleLinkNode } from \"./nodes/AccessibleLinkNode\";\nimport { SemanticTagNode } from \"./nodes/SemanticTagNode\";\nimport TextEditorStyle from \"./TextEditor.module.scss\";\nimport \"./TextEditor.scss\";\nimport { TextEditorDialogs } from \"./TextEditorDialogs\";\nimport { type LinkTypes, type TagTypes, TextEditorToolbarLexical } from \"./toolbar\";\n\ntype TextEditorProps = TextEditorCoreProps;\n\n/**\n * Редактор форматированного текста на базе Lexical. Поддерживает тулбар, бизнес-адаптеры и сериализацию контента в единый формат данных.\n */\nexport function TextEditorLexicalClient({ initialData, onChange, toolbarComponents, businessAdapters }: TextEditorProps) {\n\tconst LocalLinkDialogComponent = businessAdapters?.LocalLinkDialogComponent;\n\tconst [isFocused, setIsFocused] = useState(false);\n\tconst [toolbarState, setToolbarState] = useState<LexicalToolbarState>(DEFAULT_TOOLBAR_STATE);\n\tconst [editor, setEditor] = useState<LexicalEditor | null>(null);\n\tconst [linkTypeDialog, setLinkTypeDialog] = useState<LinkTypes | null>(null);\n\tconst [tagTypeDialog, setTagTypeDialog] = useState<TagTypes | null>(null);\n\n\tconst lexicalRaw = isLexicalTextRaw(initialData?.raw) ? initialData.raw : null;\n\tconst hasLexicalRaw = !!lexicalRaw;\n\n\tconst initialEditorState = useMemo(() => {\n\t\tif (!lexicalRaw) return undefined;\n\t\treturn JSON.stringify(lexicalRaw.editorState);\n\t}, [lexicalRaw]);\n\n\tconst handleError = useCallback((error: Error) => {\n\t\tconsole.error(\"Ошибка редактора Lexical\", error);\n\t}, []);\n\n\tconst handleChange = useCallback(\n\t\t(editorState: LexicalEditorState, lexicalEditor: LexicalEditor) => {\n\t\t\tlet html = \"\";\n\t\t\teditorState.read(() => {\n\t\t\t\thtml = $generateHtmlFromNodes(lexicalEditor, null);\n\t\t\t});\n\n\t\t\tconst raw = createLexicalRaw(editorState);\n\t\t\tonChange({ raw, html });\n\t\t},\n\t\t[onChange]\n\t);\n\n\tconst openLinkDialog = useCallback((type: LinkTypes) => {\n\t\tsetLinkTypeDialog(type);\n\t}, []);\n\n\tconst openTagDialog = useCallback((type: TagTypes) => {\n\t\tsetTagTypeDialog(type);\n\t}, []);\n\n\tconst actions = useTextEditorLexicalActions({\n\t\teditor,\n\t\ttoolbarState,\n\t\thasLocalLinkDialog: !!LocalLinkDialogComponent,\n\t\tonOpenLinkDialog: openLinkDialog,\n\t\tonOpenTagDialog: openTagDialog\n\t});\n\n\tconst initialConfig = useMemo(\n\t\t() => ({\n\t\t\tnamespace: \"KtkTextEditorLexical\",\n\t\t\tonError: handleError,\n\t\t\ttheme: {\n\t\t\t\tparagraph: \"paragraph\",\n\t\t\t\ttext: {\n\t\t\t\t\tcode: \"lexicalTextCode\",\n\t\t\t\t\thighlight: \"lexicalTextHighlight\",\n\t\t\t\t\tunderline: \"lexicalTextUnderline\",\n\t\t\t\t\tstrikethrough: \"lexicalTextStrikethrough\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tnodes: [HeadingNode, QuoteNode, ListNode, ListItemNode, AccessibleLinkNode, SemanticTagNode],\n\t\t\teditorState: initialEditorState\n\t\t}),\n\t\t[handleError, initialEditorState]\n\t);\n\n\treturn (\n\t\t<div className={TextEditorStyle.textEditor}>\n\t\t\t<div\n\t\t\t\tclassName={cn(TextEditorStyle.textEditorContent, {\n\t\t\t\t\t[TextEditorStyle.focused]: isFocused\n\t\t\t\t})}>\n\t\t\t\t<LexicalComposer initialConfig={initialConfig}>\n\t\t\t\t\t<TextEditorToolbarLexical\n\t\t\t\t\t\ttoolbarComponents={toolbarComponents}\n\t\t\t\t\t\tstate={toolbarState}\n\t\t\t\t\t\tonBlockStyleToggle={actions.handleBlockStyleToggle}\n\t\t\t\t\t\tonInlineStyleToggle={actions.handleInlineStyleToggle}\n\t\t\t\t\t\tonAlignmentChange={actions.handleAlignmentChange}\n\t\t\t\t\t\tonLinkClick={actions.handleLinkClick}\n\t\t\t\t\t\tonTagClick={actions.handleTagClick}\n\t\t\t\t\t\tonUndo={actions.handleUndo}\n\t\t\t\t\t\tonRedo={actions.handleRedo}\n\t\t\t\t\t\tonCleanTag={actions.handleCleanSemanticTag}\n\t\t\t\t\t/>\n\t\t\t\t\t<RichTextPlugin\n\t\t\t\t\t\tcontentEditable={\n\t\t\t\t\t\t\t<ContentEditable\n\t\t\t\t\t\t\t\tclassName=\"lexicalEditorContentEditable\"\n\t\t\t\t\t\t\t\tonFocus={() => setIsFocused(true)}\n\t\t\t\t\t\t\t\tonBlur={() => setIsFocused(false)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tplaceholder={<div className=\"lexicalEditorPlaceholder\">Введите текст...</div>}\n\t\t\t\t\t\tErrorBoundary={LexicalErrorBoundary}\n\t\t\t\t\t/>\n\t\t\t\t\t<HistoryPlugin />\n\t\t\t\t\t<ListPlugin />\n\t\t\t\t\t<SelectionStatePlugin onEditorReady={setEditor} onStateChange={setToolbarState} />\n\t\t\t\t\t<InitialHtmlPlugin initialHTML={initialData?.html} shouldSkip={hasLexicalRaw} />\n\t\t\t\t\t<OnChangePlugin onChange={handleChange} ignoreSelectionChange />\n\t\t\t\t</LexicalComposer>\n\t\t\t</div>\n\n\t\t\t<TextEditorDialogs\n\t\t\t\tlinkTypeDialog={linkTypeDialog}\n\t\t\t\ttagTypeDialog={tagTypeDialog}\n\t\t\t\tlocalLinkDialogComponent={LocalLinkDialogComponent}\n\t\t\t\tonCloseLinkDialog={() => setLinkTypeDialog(null)}\n\t\t\t\tonCloseTagDialog={() => setTagTypeDialog(null)}\n\t\t\t\tonAddLink={actions.handleAddLink}\n\t\t\t\tonAddLocalLink={actions.handleAddLocalLink}\n\t\t\t\tonInsertSemanticTag={actions.insertSemanticTagAtSelection}\n\t\t\t\tgetCurrentSelectionText={actions.getCurrentSelectionText}\n\t\t\t\tgetSelectedLinkState={actions.getSelectedLinkState}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ import { Bold as e, Code as t, Heading1 as n, Heading2 as r, Heading3 as i, Heading4 as a, Heading5 as o, Heading6 as s, Highlighter as c, Italic as l, List as u, ListOrdered as d, Pilcrow as f, Strikethrough as p, TextQuote as m, Type as h, Underline as g } from "lucide-react";
2
+ import { jsx as _ } from "react/jsx-runtime";
3
+ //#region src/text-editor/editorModel.ts
4
+ var v = (e) => {
5
+ if (!e || typeof e != "object") return !1;
6
+ let t = e;
7
+ return t.format === "lexical" && t.version === 1 && !!t.editorState && typeof t.editorState == "object";
8
+ }, y = {
9
+ unstyled: {
10
+ label: "Параграф",
11
+ node: "p",
12
+ style: "unstyled",
13
+ icon: /* @__PURE__ */ _(h, {})
14
+ },
15
+ paragraph: {
16
+ label: "Параграф",
17
+ node: "p",
18
+ style: "paragraph",
19
+ icon: /* @__PURE__ */ _(f, {})
20
+ },
21
+ "header-one": {
22
+ label: "Заголовок первого уровня",
23
+ node: "h1",
24
+ style: "header-one",
25
+ icon: /* @__PURE__ */ _(n, {})
26
+ },
27
+ "header-two": {
28
+ label: "Заголовок второго уровня",
29
+ node: "h2",
30
+ style: "header-two",
31
+ icon: /* @__PURE__ */ _(r, {})
32
+ },
33
+ "header-three": {
34
+ label: "Заголовок третьего уровня",
35
+ node: "h3",
36
+ style: "header-three",
37
+ icon: /* @__PURE__ */ _(i, {})
38
+ },
39
+ "header-four": {
40
+ label: "Заголовок четвертого уровня",
41
+ node: "h4",
42
+ style: "header-four",
43
+ icon: /* @__PURE__ */ _(a, {})
44
+ },
45
+ "header-five": {
46
+ label: "Заголовок пятого уровня",
47
+ node: "h5",
48
+ style: "header-five",
49
+ icon: /* @__PURE__ */ _(o, {})
50
+ },
51
+ "header-six": {
52
+ label: "Заголовок шестого уровня",
53
+ node: "h6",
54
+ style: "header-six",
55
+ icon: /* @__PURE__ */ _(s, {})
56
+ },
57
+ "code-block": {
58
+ label: "Блок кода",
59
+ node: "pre",
60
+ style: "code-block",
61
+ icon: /* @__PURE__ */ _(t, {})
62
+ },
63
+ blockquote: {
64
+ label: "Цитата",
65
+ node: "blockquote",
66
+ style: "blockquote",
67
+ icon: /* @__PURE__ */ _(m, {})
68
+ },
69
+ "unordered-list-item": {
70
+ label: "Маркированный список",
71
+ node: "ul",
72
+ style: "unordered-list-item",
73
+ icon: /* @__PURE__ */ _(u, {})
74
+ },
75
+ "ordered-list-item": {
76
+ label: "Нумерованный список",
77
+ node: "ol",
78
+ style: "ordered-list-item",
79
+ icon: /* @__PURE__ */ _(d, {})
80
+ },
81
+ CODE: {
82
+ label: "Моноширинный код",
83
+ node: "code",
84
+ style: "CODE",
85
+ icon: /* @__PURE__ */ _(t, {})
86
+ },
87
+ BOLD: {
88
+ label: "Выделение жирным",
89
+ node: "strong",
90
+ style: "BOLD",
91
+ icon: /* @__PURE__ */ _(e, {})
92
+ },
93
+ UNDERLINE: {
94
+ label: "Выделение подчеркнутым",
95
+ node: "u",
96
+ style: "UNDERLINE",
97
+ icon: /* @__PURE__ */ _(g, {})
98
+ },
99
+ STRIKETHROUGH: {
100
+ label: "Выделение зачеркнутым",
101
+ node: "s",
102
+ style: "STRIKETHROUGH",
103
+ icon: /* @__PURE__ */ _(p, {})
104
+ },
105
+ HIGHLIGHT: {
106
+ label: "Подсветка цветом",
107
+ node: "span",
108
+ style: "HIGHLIGHT",
109
+ icon: /* @__PURE__ */ _(c, {})
110
+ },
111
+ ITALIC: {
112
+ label: "Выделение курсивным",
113
+ node: "i",
114
+ style: "ITALIC",
115
+ icon: /* @__PURE__ */ _(l, {})
116
+ }
117
+ }, b = [
118
+ y.unstyled,
119
+ y["header-three"],
120
+ y["header-four"],
121
+ y["header-five"],
122
+ y["header-six"],
123
+ y["ordered-list-item"],
124
+ y["unordered-list-item"],
125
+ y.blockquote
126
+ ], x = [
127
+ y.BOLD,
128
+ y.ITALIC,
129
+ y.UNDERLINE,
130
+ y.STRIKETHROUGH,
131
+ y.HIGHLIGHT,
132
+ y.CODE
133
+ ], S = /* @__PURE__ */ function(e) {
134
+ return e.LINK = "link", e.LOCAL_LINK = "localLink", e.PHONE = "phone", e.EMAIL = "email", e;
135
+ }({}), C = /* @__PURE__ */ function(e) {
136
+ return e.abbr = "abbr", e.lang = "lang", e.time = "time", e.cite = "cite", e.ins = "ins", e.del = "del", e;
137
+ }({});
138
+ //#endregion
139
+ export { v as a, x as i, C as n, b as r, S as t };
140
+
141
+ //# sourceMappingURL=types-CxXyru6U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-CxXyru6U.js","names":[],"sources":["../../src/text-editor/editorModel.ts","../../src/text-editor/toolbar/types.tsx"],"sourcesContent":["import { ComponentType } from \"react\";\n\nexport type TextEditorLexicalRaw = {\n\tformat: \"lexical\";\n\tversion: 1;\n\teditorState: Record<string, unknown>;\n};\n\nexport type TextEditorData<TRaw = unknown> = {\n\thtml: string;\n\traw: TRaw;\n};\n\nexport interface TextEditorToolbarComponents {\n\tblocks?: boolean;\n\tlinks?: boolean;\n\thistory?: boolean;\n\talignment?: boolean;\n\tinline?: boolean;\n\ttags?: boolean;\n}\n\nexport interface LocalLinkDialogAdapterProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tonConfirm: (url: string, ariaLabel: string) => void;\n}\n\nexport interface TextEditorBusinessAdapters {\n\tLocalLinkDialogComponent?: ComponentType<LocalLinkDialogAdapterProps>;\n}\n\nexport interface TextEditorCoreProps<TRaw = unknown> {\n\tinitialData: TextEditorData<TRaw>;\n\tonChange: (data: TextEditorData<TextEditorLexicalRaw>) => void;\n\ttoolbarComponents?: TextEditorToolbarComponents;\n\tbusinessAdapters?: TextEditorBusinessAdapters;\n}\n\nexport const isLexicalTextRaw = (raw: unknown): raw is TextEditorLexicalRaw => {\n\tif (!raw || typeof raw !== \"object\") return false;\n\n\tconst value = raw as Partial<TextEditorLexicalRaw>;\n\treturn value.format === \"lexical\" && value.version === 1 && !!value.editorState && typeof value.editorState === \"object\";\n};\n","import { JSX } from \"react\";\n\nimport {\n\tBold,\n\tCode,\n\tHeading1,\n\tHeading2,\n\tHeading3,\n\tHeading4,\n\tHeading5,\n\tHeading6,\n\tHighlighter,\n\tItalic,\n\tList,\n\tListOrdered,\n\tPilcrow,\n\tStrikethrough,\n\tTextQuote,\n\tType,\n\tUnderline\n} from \"lucide-react\";\n\nimport type { TextEditorElementTypes } from \"../types\";\n\ninterface TextEditorElement {\n\tlabel: string;\n\tstyle: TextEditorElementTypes;\n\tnode: string;\n\ticon: JSX.Element;\n}\n\nconst TextEditorElements: Record<TextEditorElementTypes, TextEditorElement> = {\n\tunstyled: { label: \"Параграф\", node: \"p\", style: \"unstyled\", icon: <Type /> },\n\tparagraph: { label: \"Параграф\", node: \"p\", style: \"paragraph\", icon: <Pilcrow /> },\n\t\"header-one\": { label: \"Заголовок первого уровня\", node: \"h1\", style: \"header-one\", icon: <Heading1 /> },\n\t\"header-two\": { label: \"Заголовок второго уровня\", node: \"h2\", style: \"header-two\", icon: <Heading2 /> },\n\t\"header-three\": { label: \"Заголовок третьего уровня\", node: \"h3\", style: \"header-three\", icon: <Heading3 /> },\n\t\"header-four\": { label: \"Заголовок четвертого уровня\", node: \"h4\", style: \"header-four\", icon: <Heading4 /> },\n\t\"header-five\": { label: \"Заголовок пятого уровня\", node: \"h5\", style: \"header-five\", icon: <Heading5 /> },\n\t\"header-six\": { label: \"Заголовок шестого уровня\", node: \"h6\", style: \"header-six\", icon: <Heading6 /> },\n\t\"code-block\": { label: \"Блок кода\", node: \"pre\", style: \"code-block\", icon: <Code /> },\n\tblockquote: { label: \"Цитата\", node: \"blockquote\", style: \"blockquote\", icon: <TextQuote /> },\n\t\"unordered-list-item\": { label: \"Маркированный список\", node: \"ul\", style: \"unordered-list-item\", icon: <List /> },\n\t\"ordered-list-item\": { label: \"Нумерованный список\", node: \"ol\", style: \"ordered-list-item\", icon: <ListOrdered /> },\n\tCODE: { label: \"Моноширинный код\", node: \"code\", style: \"CODE\", icon: <Code /> },\n\tBOLD: { label: \"Выделение жирным\", node: \"strong\", style: \"BOLD\", icon: <Bold /> },\n\tUNDERLINE: { label: \"Выделение подчеркнутым\", node: \"u\", style: \"UNDERLINE\", icon: <Underline /> },\n\tSTRIKETHROUGH: { label: \"Выделение зачеркнутым\", node: \"s\", style: \"STRIKETHROUGH\", icon: <Strikethrough /> },\n\tHIGHLIGHT: { label: \"Подсветка цветом\", node: \"span\", style: \"HIGHLIGHT\", icon: <Highlighter /> },\n\tITALIC: { label: \"Выделение курсивным\", node: \"i\", style: \"ITALIC\", icon: <Italic /> }\n};\n\nexport const getElementFromElementStyle = (style: TextEditorElementTypes) => {\n\tconst element = TextEditorElements[style];\n\tif (!element) {\n\t\treturn \"div\";\n\t}\n\treturn element.node;\n};\n\nexport const getTagFromElementStyle = (style: TextEditorElementTypes) => {\n\tconst element = TextEditorElements[style];\n\tif (!element) {\n\t\treturn null;\n\t}\n\treturn element.node;\n};\n\nexport const TextEditorBlockControls = [\n\tTextEditorElements.unstyled,\n\tTextEditorElements[\"header-three\"],\n\tTextEditorElements[\"header-four\"],\n\tTextEditorElements[\"header-five\"],\n\tTextEditorElements[\"header-six\"],\n\tTextEditorElements[\"ordered-list-item\"],\n\tTextEditorElements[\"unordered-list-item\"],\n\tTextEditorElements.blockquote\n];\n\nexport const TextEditorInlineControls = [\n\tTextEditorElements.BOLD,\n\tTextEditorElements.ITALIC,\n\tTextEditorElements.UNDERLINE,\n\tTextEditorElements.STRIKETHROUGH,\n\tTextEditorElements.HIGHLIGHT,\n\tTextEditorElements.CODE\n];\n\nexport const TextEditorStyleClasses = {\n\tCODE: {\n\t\tcolor: \"rgb(8, 89, 114)\",\n\t\tpadding: \"0.15em 0.4em\",\n\t\tmargin: \"0\",\n\t\tfontFamily: \"monospace\",\n\t\tfontSize: \"85%\",\n\t\tbackgroundColor: \"rgba(40, 68, 77, 0.05)\",\n\t\tborderRadius: \"var(--radius-md)\",\n\t\tlineHeight: \"1\"\n\t},\n\tHIGHLIGHT: {\n\t\tpaddingInline: \"0.15em\",\n\t\tbackgroundColor: \"rgb(234,255,142)\",\n\t\tborderRadius: \"var(--radius-md)\"\n\t},\n\tunstyled: {\n\t\tmarginBottom: \"1.5em\"\n\t},\n\tBOLD: { fontWeight: \"bold\" },\n\tITALIC: { fontStyle: \"italic\" },\n\tUNDERLINE: { textDecoration: \"underline\" },\n\tSTRIKETHROUGH: { textDecoration: \"line-through\" }\n};\n\nexport enum LinkTypes {\n\tLINK = \"link\",\n\tLOCAL_LINK = \"localLink\",\n\tPHONE = \"phone\",\n\tEMAIL = \"email\"\n}\n\nexport enum TagTypes {\n\tabbr = \"abbr\",\n\tlang = \"lang\",\n\ttime = \"time\",\n\tcite = \"cite\",\n\tins = \"ins\",\n\tdel = \"del\"\n}\n"],"mappings":";;;AAuCA,IAAa,KAAoB,MAA8C;CAC9E,IAAI,CAAC,KAAO,OAAO,KAAQ,UAAU,OAAO;CAE5C,IAAM,IAAQ;CACd,OAAO,EAAM,WAAW,aAAa,EAAM,YAAY,KAAK,CAAC,CAAC,EAAM,eAAe,OAAO,EAAM,eAAgB;AACjH,GCbM,IAAwE;CAC7E,UAAU;EAAE,OAAO;EAAY,MAAM;EAAK,OAAO;EAAY,MAAM,kBAAC,GAAD,CAAO,CAAA;CAAE;CAC5E,WAAW;EAAE,OAAO;EAAY,MAAM;EAAK,OAAO;EAAa,MAAM,kBAAC,GAAD,CAAU,CAAA;CAAE;CACjF,cAAc;EAAE,OAAO;EAA4B,MAAM;EAAM,OAAO;EAAc,MAAM,kBAAC,GAAD,CAAW,CAAA;CAAE;CACvG,cAAc;EAAE,OAAO;EAA4B,MAAM;EAAM,OAAO;EAAc,MAAM,kBAAC,GAAD,CAAW,CAAA;CAAE;CACvG,gBAAgB;EAAE,OAAO;EAA6B,MAAM;EAAM,OAAO;EAAgB,MAAM,kBAAC,GAAD,CAAW,CAAA;CAAE;CAC5G,eAAe;EAAE,OAAO;EAA+B,MAAM;EAAM,OAAO;EAAe,MAAM,kBAAC,GAAD,CAAW,CAAA;CAAE;CAC5G,eAAe;EAAE,OAAO;EAA2B,MAAM;EAAM,OAAO;EAAe,MAAM,kBAAC,GAAD,CAAW,CAAA;CAAE;CACxG,cAAc;EAAE,OAAO;EAA4B,MAAM;EAAM,OAAO;EAAc,MAAM,kBAAC,GAAD,CAAW,CAAA;CAAE;CACvG,cAAc;EAAE,OAAO;EAAa,MAAM;EAAO,OAAO;EAAc,MAAM,kBAAC,GAAD,CAAO,CAAA;CAAE;CACrF,YAAY;EAAE,OAAO;EAAU,MAAM;EAAc,OAAO;EAAc,MAAM,kBAAC,GAAD,CAAY,CAAA;CAAE;CAC5F,uBAAuB;EAAE,OAAO;EAAwB,MAAM;EAAM,OAAO;EAAuB,MAAM,kBAAC,GAAD,CAAO,CAAA;CAAE;CACjH,qBAAqB;EAAE,OAAO;EAAuB,MAAM;EAAM,OAAO;EAAqB,MAAM,kBAAC,GAAD,CAAc,CAAA;CAAE;CACnH,MAAM;EAAE,OAAO;EAAoB,MAAM;EAAQ,OAAO;EAAQ,MAAM,kBAAC,GAAD,CAAO,CAAA;CAAE;CAC/E,MAAM;EAAE,OAAO;EAAoB,MAAM;EAAU,OAAO;EAAQ,MAAM,kBAAC,GAAD,CAAO,CAAA;CAAE;CACjF,WAAW;EAAE,OAAO;EAA0B,MAAM;EAAK,OAAO;EAAa,MAAM,kBAAC,GAAD,CAAY,CAAA;CAAE;CACjG,eAAe;EAAE,OAAO;EAAyB,MAAM;EAAK,OAAO;EAAiB,MAAM,kBAAC,GAAD,CAAgB,CAAA;CAAE;CAC5G,WAAW;EAAE,OAAO;EAAoB,MAAM;EAAQ,OAAO;EAAa,MAAM,kBAAC,GAAD,CAAc,CAAA;CAAE;CAChG,QAAQ;EAAE,OAAO;EAAuB,MAAM;EAAK,OAAO;EAAU,MAAM,kBAAC,GAAD,CAAS,CAAA;CAAE;AACtF,GAkBa,IAA0B;CACtC,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACnB,EAAmB;AACpB,GAEa,IAA2B;CACvC,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACnB,EAAmB;CACnB,EAAmB;AACpB,GA2BY,IAAL,yBAAA,GAAA;QACN,EAAA,OAAA,QACA,EAAA,aAAA,aACA,EAAA,QAAA,SACA,EAAA,QAAA;AACD,EAAA,CAAA,CAAA,GAEY,IAAL,yBAAA,GAAA;QACN,EAAA,OAAA,QACA,EAAA,OAAA,QACA,EAAA,OAAA,QACA,EAAA,OAAA,QACA,EAAA,MAAA,OACA,EAAA,MAAA;AACD,EAAA,CAAA,CAAA"}