@plexui/ui 0.7.61 → 0.7.63
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/es/components/MarkdownEditor/MarkdownEditor.js +1 -1
- package/dist/es/components/MarkdownEditor/MarkdownEditor.js.map +1 -1
- package/dist/es/components/MarkdownEditor/MarkdownEditor.module.css +4 -4
- package/dist/types/components/MarkdownEditor/MarkdownEditor.d.ts +1 -1
- package/package.json +1 -1
|
@@ -52,7 +52,7 @@ function LinkDialog({ open, initialUrl, initialTitle, isEditing, onSave, onRemov
|
|
|
52
52
|
function ToolbarButton({ tooltip, active, disabled, onClick, children, }) {
|
|
53
53
|
return (_jsx(Tooltip, { content: tooltip, compact: true, children: _jsx("button", { type: "button", className: s.ToolbarButton, "data-active": active || undefined, onClick: onClick, disabled: disabled, "aria-label": tooltip, children: children }) }));
|
|
54
54
|
}
|
|
55
|
-
export function MarkdownEditor({ variant = "outline", disabled = false, invalid = false, placeholder, value, defaultValue, onChange, toolbarEnd, rows =
|
|
55
|
+
export function MarkdownEditor({ variant = "outline", disabled = false, invalid = false, placeholder, value, defaultValue, onChange, toolbarEnd, rows = 1, className, id, "aria-describedby": ariaDescribedby, "aria-invalid": ariaInvalid, }) {
|
|
56
56
|
const [focused, setFocused] = useState(false);
|
|
57
57
|
const [linkDialogOpen, setLinkDialogOpen] = useState(false);
|
|
58
58
|
const [linkDialogInitial, setLinkDialogInitial] = useState({ url: "", title: "" });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownEditor.js","sourceRoot":"","sources":["../../../../src/components/MarkdownEditor/MarkdownEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport clsx from \"clsx\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { type Variants } from \"../../types\"\nimport { Bold as BoldIcon, Italic as ItalicIcon, Link as LinkIcon, List as ListIcon, ListNumbers as ListNumbersIcon } from \"../Icon\"\nimport { Tooltip } from \"../Tooltip\"\n\nimport { useEditor, EditorContent } from \"@tiptap/react\"\nimport Document from \"@tiptap/extension-document\"\nimport Paragraph from \"@tiptap/extension-paragraph\"\nimport Text from \"@tiptap/extension-text\"\nimport BoldExtension from \"@tiptap/extension-bold\"\nimport ItalicExtension from \"@tiptap/extension-italic\"\nimport LinkExtension from \"@tiptap/extension-link\"\nimport BulletList from \"@tiptap/extension-bullet-list\"\nimport OrderedList from \"@tiptap/extension-ordered-list\"\nimport ListItem from \"@tiptap/extension-list-item\"\nimport History from \"@tiptap/extension-history\"\nimport Placeholder from \"@tiptap/extension-placeholder\"\nimport HardBreak from \"@tiptap/extension-hard-break\"\nimport { Markdown as MarkdownExtension } from \"tiptap-markdown\"\n\nimport s from \"./MarkdownEditor.module.css\"\n\nexport const markdownEditorStyles = {\n toolbarButton: s.ToolbarButton,\n}\n\nexport type MarkdownEditorProps = {\n /**\n * @default outline\n */\n variant?: Variants<\"outline\" | \"soft\">\n /**\n * @default false\n */\n disabled?: boolean\n /**\n * @default false\n */\n invalid?: boolean\n placeholder?: string\n /**\n * Controlled value as markdown string\n */\n value?: string\n /**\n * Default value as markdown string for uncontrolled mode\n */\n defaultValue?: string\n onChange?: (markdown: string) => void\n toolbarEnd?: React.ReactNode\n /**\n * @default 3\n */\n rows?: number\n className?: string\n id?: string\n \"aria-describedby\"?: string\n \"aria-invalid\"?: boolean\n}\n\nfunction LinkDialog({\n open,\n initialUrl,\n initialTitle,\n isEditing,\n onSave,\n onRemove,\n onCancel,\n}: {\n open: boolean\n initialUrl: string\n initialTitle: string\n isEditing: boolean\n onSave: (url: string, title: string) => void\n onRemove: () => void\n onCancel: () => void\n}) {\n const [url, setUrl] = useState(initialUrl)\n const [title, setTitle] = useState(initialTitle)\n const urlRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (open) {\n setUrl(initialUrl)\n setTitle(initialTitle)\n requestAnimationFrame(() => urlRef.current?.focus())\n }\n }, [open, initialUrl, initialTitle])\n\n const handleKeyDown = (evt: React.KeyboardEvent) => {\n if (evt.key === \"Enter\") {\n evt.preventDefault()\n onSave(url, title)\n }\n if (evt.key === \"Escape\") {\n evt.preventDefault()\n onCancel()\n }\n }\n\n if (!open || typeof document === \"undefined\") return null\n\n return createPortal(\n <>\n <div className={s.LinkDialogOverlay} onClick={onCancel} />\n <div className={s.LinkDialogContent} role=\"dialog\" aria-label=\"Link\" onKeyDown={handleKeyDown}>\n <div className={s.LinkDialogBody}>\n <h3 className={s.LinkDialogTitle}>Link</h3>\n <div className={s.LinkDialogFields}>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-url\">URL</label>\n <input\n ref={urlRef}\n id=\"md-editor-link-url\"\n className={s.LinkDialogInput}\n type=\"url\"\n placeholder=\"Enter URL\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n />\n </div>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-title\">Link title</label>\n <input\n id=\"md-editor-link-title\"\n className={s.LinkDialogInput}\n type=\"text\"\n placeholder=\"Enter link title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n </div>\n </div>\n </div>\n <div className={s.LinkDialogFooter}>\n {isEditing && (\n <button type=\"button\" className={s.LinkDialogButtonRemove} onClick={onRemove}>\n Remove\n </button>\n )}\n <div className={s.LinkDialogFooterTrailing}>\n <button type=\"button\" className={s.LinkDialogButtonCancel} onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className={s.LinkDialogButtonSave} onClick={() => onSave(url, title)}>\n Save\n </button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n )\n}\n\nfunction ToolbarButton({\n tooltip,\n active,\n disabled,\n onClick,\n children,\n}: {\n tooltip: string\n active?: boolean\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <Tooltip content={tooltip} compact>\n <button\n type=\"button\"\n className={s.ToolbarButton}\n data-active={active || undefined}\n onClick={onClick}\n disabled={disabled}\n aria-label={tooltip}\n >\n {children}\n </button>\n </Tooltip>\n )\n}\n\nexport function MarkdownEditor({\n variant = \"outline\",\n disabled = false,\n invalid = false,\n placeholder,\n value,\n defaultValue,\n onChange,\n toolbarEnd,\n rows = 3,\n className,\n id,\n \"aria-describedby\": ariaDescribedby,\n \"aria-invalid\": ariaInvalid,\n}: MarkdownEditorProps) {\n const [focused, setFocused] = useState(false)\n const [linkDialogOpen, setLinkDialogOpen] = useState(false)\n const [linkDialogInitial, setLinkDialogInitial] = useState({ url: \"\", title: \"\" })\n const [activeMarks, setActiveMarks] = useState({\n bold: false, italic: false, link: false, orderedList: false, bulletList: false,\n })\n const [linkCanEnable, setLinkCanEnable] = useState(false)\n const isControlled = value !== undefined\n const suppressChangeRef = useRef(false)\n\n const syncToolbar = useCallback((e: { isActive: (name: string) => boolean; state: { selection: { empty: boolean } } }) => {\n setActiveMarks({\n bold: e.isActive(\"bold\"),\n italic: e.isActive(\"italic\"),\n link: e.isActive(\"link\"),\n orderedList: e.isActive(\"orderedList\"),\n bulletList: e.isActive(\"bulletList\"),\n })\n setLinkCanEnable(!e.state.selection.empty || e.isActive(\"link\"))\n }, [])\n\n const editor = useEditor({\n immediatelyRender: false,\n extensions: [\n Document,\n Paragraph,\n Text,\n HardBreak,\n BoldExtension,\n ItalicExtension,\n LinkExtension.configure({\n openOnClick: false,\n HTMLAttributes: { rel: \"noopener noreferrer nofollow\" },\n }),\n BulletList,\n OrderedList,\n ListItem,\n History,\n MarkdownExtension.configure({\n html: false,\n transformPastedText: true,\n transformCopiedText: true,\n }),\n ...(placeholder ? [Placeholder.configure({ placeholder })] : []),\n ],\n content: value ?? defaultValue ?? \"\",\n editable: !disabled,\n editorProps: {\n attributes: {\n class: s.EditorContent,\n role: \"textbox\",\n \"aria-multiline\": \"true\",\n ...(id && { id }),\n ...(ariaDescribedby && { \"aria-describedby\": ariaDescribedby }),\n ...(ariaInvalid && { \"aria-invalid\": \"true\" }),\n },\n },\n onFocus: () => setFocused(true),\n onBlur: () => setFocused(false),\n onUpdate: ({ editor: e }) => {\n if (suppressChangeRef.current) return\n const md = (e.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n onChange?.(md)\n },\n onSelectionUpdate: ({ editor: e }) => syncToolbar(e),\n onTransaction: ({ editor: e }) => syncToolbar(e),\n })\n\n useEffect(() => {\n if (!editor || !isControlled) return\n const currentMd = (editor.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n if (value !== currentMd) {\n suppressChangeRef.current = true\n editor.commands.setContent(value || \"\", { emitUpdate: false })\n suppressChangeRef.current = false\n }\n }, [editor, value, isControlled])\n\n useEffect(() => {\n if (editor) editor.setEditable(!disabled)\n }, [editor, disabled])\n\n const handleContainerMouseDown = useCallback((evt: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !editor) return\n const target = evt.target as Element\n if (target.closest(\"button, [type='button'], [role='button'], a, input, label\")) return\n if (editor.isFocused) return\n evt.preventDefault()\n editor.commands.focus(\"end\")\n }, [editor, disabled])\n\n const openLinkDialog = useCallback(() => {\n if (!editor) return\n const url = editor.getAttributes(\"link\").href ?? \"\"\n let title = \"\"\n if (!editor.state.selection.empty) {\n title = editor.state.doc.textBetween(editor.state.selection.from, editor.state.selection.to, \"\")\n } else if (editor.isActive(\"link\")) {\n const { $from } = editor.state.selection\n const linkMark = $from.marks().find(m => m.type === editor.schema.marks.link)\n if (linkMark) {\n let start = $from.pos\n let end = $from.pos\n editor.state.doc.nodesBetween($from.start(), $from.end(), (node, pos) => {\n if (node.isText && node.marks.some(m => m.eq(linkMark))) {\n start = Math.min(start, pos)\n end = Math.max(end, pos + node.nodeSize)\n }\n })\n title = editor.state.doc.textBetween(start, end, \"\")\n }\n }\n setLinkDialogInitial({ url, title })\n setLinkDialogOpen(true)\n }, [editor])\n\n const handleLinkSave = useCallback((url: string, title: string) => {\n if (!editor) return\n setLinkDialogOpen(false)\n\n if (!url) {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n return\n }\n\n const { from, to, empty } = editor.state.selection\n const selectedText = empty ? \"\" : editor.state.doc.textBetween(from, to, \"\")\n const isOnExistingLink = editor.isActive(\"link\")\n\n if (empty && !isOnExistingLink) {\n editor.chain().focus().insertContent(`<a href=\"${url}\">${title || url}</a>`).run()\n } else if (isOnExistingLink) {\n editor.chain().focus().extendMarkRange(\"link\").run()\n const linkRange = editor.state.selection\n if (title && title !== editor.state.doc.textBetween(linkRange.from, linkRange.to, \"\")) {\n editor.chain().focus().insertContentAt({ from: linkRange.from, to: linkRange.to }, `<a href=\"${url}\">${title}</a>`).run()\n } else {\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run()\n }\n } else if (title && title !== selectedText) {\n editor.chain().focus().deleteSelection().insertContent(`<a href=\"${url}\">${title}</a>`).run()\n } else {\n editor.chain().focus().setLink({ href: url }).run()\n }\n }, [editor])\n\n const handleLinkRemove = useCallback(() => {\n if (!editor) return\n setLinkDialogOpen(false)\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n }, [editor])\n\n const handleLinkCancel = useCallback(() => {\n setLinkDialogOpen(false)\n editor?.commands.focus()\n }, [editor])\n\n const isInvalid = invalid || ariaInvalid\n const minHeight = 20 * rows + 16\n\n return (\n <div\n className={clsx(s.Container, className)}\n data-variant={variant}\n data-focused={focused}\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={isInvalid ? \"\" : undefined}\n onMouseDown={handleContainerMouseDown}\n >\n <div className={s.Toolbar} onMouseDown={(e) => e.preventDefault()}>\n <div className={s.ToolbarGroup}>\n <ToolbarButton tooltip=\"Bold\" active={activeMarks.bold} disabled={disabled} onClick={() => editor?.chain().focus().toggleBold().run()}>\n <BoldIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Italic\" active={activeMarks.italic} disabled={disabled} onClick={() => editor?.chain().focus().toggleItalic().run()}>\n <ItalicIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Numbered list\" active={activeMarks.orderedList} disabled={disabled} onClick={() => editor?.chain().focus().toggleOrderedList().run()}>\n <ListNumbersIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Bullet list\" active={activeMarks.bulletList} disabled={disabled} onClick={() => editor?.chain().focus().toggleBulletList().run()}>\n <ListIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Link\" active={activeMarks.link} disabled={disabled || !linkCanEnable} onClick={openLinkDialog}>\n <LinkIcon />\n </ToolbarButton>\n\n {toolbarEnd && (\n <>\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n <div className={s.ToolbarEnd}>{toolbarEnd}</div>\n </>\n )}\n </div>\n </div>\n\n <div className={s.Editor} style={{ minHeight }}>\n <EditorContent editor={editor} />\n </div>\n\n <LinkDialog\n open={linkDialogOpen}\n initialUrl={linkDialogInitial.url}\n initialTitle={linkDialogInitial.title}\n isEditing={!!linkDialogInitial.url}\n onSave={handleLinkSave}\n onRemove={handleLinkRemove}\n onCancel={handleLinkCancel}\n />\n </div>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MarkdownEditor.js","sourceRoot":"","sources":["../../../../src/components/MarkdownEditor/MarkdownEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\"\n\nimport clsx from \"clsx\"\nimport { useCallback, useEffect, useRef, useState } from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { type Variants } from \"../../types\"\nimport { Bold as BoldIcon, Italic as ItalicIcon, Link as LinkIcon, List as ListIcon, ListNumbers as ListNumbersIcon } from \"../Icon\"\nimport { Tooltip } from \"../Tooltip\"\n\nimport { useEditor, EditorContent } from \"@tiptap/react\"\nimport Document from \"@tiptap/extension-document\"\nimport Paragraph from \"@tiptap/extension-paragraph\"\nimport Text from \"@tiptap/extension-text\"\nimport BoldExtension from \"@tiptap/extension-bold\"\nimport ItalicExtension from \"@tiptap/extension-italic\"\nimport LinkExtension from \"@tiptap/extension-link\"\nimport BulletList from \"@tiptap/extension-bullet-list\"\nimport OrderedList from \"@tiptap/extension-ordered-list\"\nimport ListItem from \"@tiptap/extension-list-item\"\nimport History from \"@tiptap/extension-history\"\nimport Placeholder from \"@tiptap/extension-placeholder\"\nimport HardBreak from \"@tiptap/extension-hard-break\"\nimport { Markdown as MarkdownExtension } from \"tiptap-markdown\"\n\nimport s from \"./MarkdownEditor.module.css\"\n\nexport const markdownEditorStyles = {\n toolbarButton: s.ToolbarButton,\n}\n\nexport type MarkdownEditorProps = {\n /**\n * @default outline\n */\n variant?: Variants<\"outline\" | \"soft\">\n /**\n * @default false\n */\n disabled?: boolean\n /**\n * @default false\n */\n invalid?: boolean\n placeholder?: string\n /**\n * Controlled value as markdown string\n */\n value?: string\n /**\n * Default value as markdown string for uncontrolled mode\n */\n defaultValue?: string\n onChange?: (markdown: string) => void\n toolbarEnd?: React.ReactNode\n /**\n * @default 1\n */\n rows?: number\n className?: string\n id?: string\n \"aria-describedby\"?: string\n \"aria-invalid\"?: boolean\n}\n\nfunction LinkDialog({\n open,\n initialUrl,\n initialTitle,\n isEditing,\n onSave,\n onRemove,\n onCancel,\n}: {\n open: boolean\n initialUrl: string\n initialTitle: string\n isEditing: boolean\n onSave: (url: string, title: string) => void\n onRemove: () => void\n onCancel: () => void\n}) {\n const [url, setUrl] = useState(initialUrl)\n const [title, setTitle] = useState(initialTitle)\n const urlRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (open) {\n setUrl(initialUrl)\n setTitle(initialTitle)\n requestAnimationFrame(() => urlRef.current?.focus())\n }\n }, [open, initialUrl, initialTitle])\n\n const handleKeyDown = (evt: React.KeyboardEvent) => {\n if (evt.key === \"Enter\") {\n evt.preventDefault()\n onSave(url, title)\n }\n if (evt.key === \"Escape\") {\n evt.preventDefault()\n onCancel()\n }\n }\n\n if (!open || typeof document === \"undefined\") return null\n\n return createPortal(\n <>\n <div className={s.LinkDialogOverlay} onClick={onCancel} />\n <div className={s.LinkDialogContent} role=\"dialog\" aria-label=\"Link\" onKeyDown={handleKeyDown}>\n <div className={s.LinkDialogBody}>\n <h3 className={s.LinkDialogTitle}>Link</h3>\n <div className={s.LinkDialogFields}>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-url\">URL</label>\n <input\n ref={urlRef}\n id=\"md-editor-link-url\"\n className={s.LinkDialogInput}\n type=\"url\"\n placeholder=\"Enter URL\"\n value={url}\n onChange={(e) => setUrl(e.target.value)}\n />\n </div>\n <div className={s.LinkDialogField}>\n <label className={s.LinkDialogLabel} htmlFor=\"md-editor-link-title\">Link title</label>\n <input\n id=\"md-editor-link-title\"\n className={s.LinkDialogInput}\n type=\"text\"\n placeholder=\"Enter link title\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n </div>\n </div>\n </div>\n <div className={s.LinkDialogFooter}>\n {isEditing && (\n <button type=\"button\" className={s.LinkDialogButtonRemove} onClick={onRemove}>\n Remove\n </button>\n )}\n <div className={s.LinkDialogFooterTrailing}>\n <button type=\"button\" className={s.LinkDialogButtonCancel} onClick={onCancel}>\n Cancel\n </button>\n <button type=\"button\" className={s.LinkDialogButtonSave} onClick={() => onSave(url, title)}>\n Save\n </button>\n </div>\n </div>\n </div>\n </>,\n document.body,\n )\n}\n\nfunction ToolbarButton({\n tooltip,\n active,\n disabled,\n onClick,\n children,\n}: {\n tooltip: string\n active?: boolean\n disabled?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <Tooltip content={tooltip} compact>\n <button\n type=\"button\"\n className={s.ToolbarButton}\n data-active={active || undefined}\n onClick={onClick}\n disabled={disabled}\n aria-label={tooltip}\n >\n {children}\n </button>\n </Tooltip>\n )\n}\n\nexport function MarkdownEditor({\n variant = \"outline\",\n disabled = false,\n invalid = false,\n placeholder,\n value,\n defaultValue,\n onChange,\n toolbarEnd,\n rows = 1,\n className,\n id,\n \"aria-describedby\": ariaDescribedby,\n \"aria-invalid\": ariaInvalid,\n}: MarkdownEditorProps) {\n const [focused, setFocused] = useState(false)\n const [linkDialogOpen, setLinkDialogOpen] = useState(false)\n const [linkDialogInitial, setLinkDialogInitial] = useState({ url: \"\", title: \"\" })\n const [activeMarks, setActiveMarks] = useState({\n bold: false, italic: false, link: false, orderedList: false, bulletList: false,\n })\n const [linkCanEnable, setLinkCanEnable] = useState(false)\n const isControlled = value !== undefined\n const suppressChangeRef = useRef(false)\n\n const syncToolbar = useCallback((e: { isActive: (name: string) => boolean; state: { selection: { empty: boolean } } }) => {\n setActiveMarks({\n bold: e.isActive(\"bold\"),\n italic: e.isActive(\"italic\"),\n link: e.isActive(\"link\"),\n orderedList: e.isActive(\"orderedList\"),\n bulletList: e.isActive(\"bulletList\"),\n })\n setLinkCanEnable(!e.state.selection.empty || e.isActive(\"link\"))\n }, [])\n\n const editor = useEditor({\n immediatelyRender: false,\n extensions: [\n Document,\n Paragraph,\n Text,\n HardBreak,\n BoldExtension,\n ItalicExtension,\n LinkExtension.configure({\n openOnClick: false,\n HTMLAttributes: { rel: \"noopener noreferrer nofollow\" },\n }),\n BulletList,\n OrderedList,\n ListItem,\n History,\n MarkdownExtension.configure({\n html: false,\n transformPastedText: true,\n transformCopiedText: true,\n }),\n ...(placeholder ? [Placeholder.configure({ placeholder })] : []),\n ],\n content: value ?? defaultValue ?? \"\",\n editable: !disabled,\n editorProps: {\n attributes: {\n class: s.EditorContent,\n role: \"textbox\",\n \"aria-multiline\": \"true\",\n ...(id && { id }),\n ...(ariaDescribedby && { \"aria-describedby\": ariaDescribedby }),\n ...(ariaInvalid && { \"aria-invalid\": \"true\" }),\n },\n },\n onFocus: () => setFocused(true),\n onBlur: () => setFocused(false),\n onUpdate: ({ editor: e }) => {\n if (suppressChangeRef.current) return\n const md = (e.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n onChange?.(md)\n },\n onSelectionUpdate: ({ editor: e }) => syncToolbar(e),\n onTransaction: ({ editor: e }) => syncToolbar(e),\n })\n\n useEffect(() => {\n if (!editor || !isControlled) return\n const currentMd = (editor.storage as unknown as Record<string, { getMarkdown?: () => string }>).markdown?.getMarkdown?.() ?? \"\"\n if (value !== currentMd) {\n suppressChangeRef.current = true\n editor.commands.setContent(value || \"\", { emitUpdate: false })\n suppressChangeRef.current = false\n }\n }, [editor, value, isControlled])\n\n useEffect(() => {\n if (editor) editor.setEditable(!disabled)\n }, [editor, disabled])\n\n const handleContainerMouseDown = useCallback((evt: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || !editor) return\n const target = evt.target as Element\n if (target.closest(\"button, [type='button'], [role='button'], a, input, label\")) return\n if (editor.isFocused) return\n evt.preventDefault()\n editor.commands.focus(\"end\")\n }, [editor, disabled])\n\n const openLinkDialog = useCallback(() => {\n if (!editor) return\n const url = editor.getAttributes(\"link\").href ?? \"\"\n let title = \"\"\n if (!editor.state.selection.empty) {\n title = editor.state.doc.textBetween(editor.state.selection.from, editor.state.selection.to, \"\")\n } else if (editor.isActive(\"link\")) {\n const { $from } = editor.state.selection\n const linkMark = $from.marks().find(m => m.type === editor.schema.marks.link)\n if (linkMark) {\n let start = $from.pos\n let end = $from.pos\n editor.state.doc.nodesBetween($from.start(), $from.end(), (node, pos) => {\n if (node.isText && node.marks.some(m => m.eq(linkMark))) {\n start = Math.min(start, pos)\n end = Math.max(end, pos + node.nodeSize)\n }\n })\n title = editor.state.doc.textBetween(start, end, \"\")\n }\n }\n setLinkDialogInitial({ url, title })\n setLinkDialogOpen(true)\n }, [editor])\n\n const handleLinkSave = useCallback((url: string, title: string) => {\n if (!editor) return\n setLinkDialogOpen(false)\n\n if (!url) {\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n return\n }\n\n const { from, to, empty } = editor.state.selection\n const selectedText = empty ? \"\" : editor.state.doc.textBetween(from, to, \"\")\n const isOnExistingLink = editor.isActive(\"link\")\n\n if (empty && !isOnExistingLink) {\n editor.chain().focus().insertContent(`<a href=\"${url}\">${title || url}</a>`).run()\n } else if (isOnExistingLink) {\n editor.chain().focus().extendMarkRange(\"link\").run()\n const linkRange = editor.state.selection\n if (title && title !== editor.state.doc.textBetween(linkRange.from, linkRange.to, \"\")) {\n editor.chain().focus().insertContentAt({ from: linkRange.from, to: linkRange.to }, `<a href=\"${url}\">${title}</a>`).run()\n } else {\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run()\n }\n } else if (title && title !== selectedText) {\n editor.chain().focus().deleteSelection().insertContent(`<a href=\"${url}\">${title}</a>`).run()\n } else {\n editor.chain().focus().setLink({ href: url }).run()\n }\n }, [editor])\n\n const handleLinkRemove = useCallback(() => {\n if (!editor) return\n setLinkDialogOpen(false)\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run()\n }, [editor])\n\n const handleLinkCancel = useCallback(() => {\n setLinkDialogOpen(false)\n editor?.commands.focus()\n }, [editor])\n\n const isInvalid = invalid || ariaInvalid\n const minHeight = 20 * rows + 16\n\n return (\n <div\n className={clsx(s.Container, className)}\n data-variant={variant}\n data-focused={focused}\n data-disabled={disabled ? \"\" : undefined}\n data-invalid={isInvalid ? \"\" : undefined}\n onMouseDown={handleContainerMouseDown}\n >\n <div className={s.Toolbar} onMouseDown={(e) => e.preventDefault()}>\n <div className={s.ToolbarGroup}>\n <ToolbarButton tooltip=\"Bold\" active={activeMarks.bold} disabled={disabled} onClick={() => editor?.chain().focus().toggleBold().run()}>\n <BoldIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Italic\" active={activeMarks.italic} disabled={disabled} onClick={() => editor?.chain().focus().toggleItalic().run()}>\n <ItalicIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Numbered list\" active={activeMarks.orderedList} disabled={disabled} onClick={() => editor?.chain().focus().toggleOrderedList().run()}>\n <ListNumbersIcon />\n </ToolbarButton>\n <ToolbarButton tooltip=\"Bullet list\" active={activeMarks.bulletList} disabled={disabled} onClick={() => editor?.chain().focus().toggleBulletList().run()}>\n <ListIcon />\n </ToolbarButton>\n\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n\n <ToolbarButton tooltip=\"Link\" active={activeMarks.link} disabled={disabled || !linkCanEnable} onClick={openLinkDialog}>\n <LinkIcon />\n </ToolbarButton>\n\n {toolbarEnd && (\n <>\n <div className={s.ToolbarSeparator} aria-hidden=\"true\" />\n <div className={s.ToolbarEnd}>{toolbarEnd}</div>\n </>\n )}\n </div>\n </div>\n\n <div className={s.Editor} style={{ minHeight }}>\n <EditorContent editor={editor} />\n </div>\n\n <LinkDialog\n open={linkDialogOpen}\n initialUrl={linkDialogInitial.url}\n initialTitle={linkDialogInitial.title}\n isEditing={!!linkDialogInitial.url}\n onSave={handleLinkSave}\n onRemove={handleLinkRemove}\n onCancel={handleLinkCancel}\n />\n </div>\n )\n}\n"]}
|
|
@@ -115,7 +115,7 @@ background-color: rgba(255, 255, 255, 0.1);
|
|
|
115
115
|
margin-top: 8px;
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
.EditorContent p.is-editor-empty:first-child::before {
|
|
118
|
+
.EditorContent :global(p.is-editor-empty):first-child::before {
|
|
119
119
|
content: attr(data-placeholder);
|
|
120
120
|
float: left;
|
|
121
121
|
height: 0;
|
|
@@ -247,8 +247,8 @@ border: 1px solid rgba(255, 255, 255, 0.1);
|
|
|
247
247
|
padding: 0 12px;
|
|
248
248
|
border: 0;
|
|
249
249
|
border-radius: var(--control-radius-md);
|
|
250
|
-
background:
|
|
251
|
-
color:
|
|
250
|
+
background-color: var(--color-background-danger-solid, #dc2626);
|
|
251
|
+
color: #fff;
|
|
252
252
|
cursor: pointer;
|
|
253
253
|
font-size: 14px;
|
|
254
254
|
font-weight: var(--font-weight-medium);
|
|
@@ -259,7 +259,7 @@ border: 1px solid rgba(255, 255, 255, 0.1);
|
|
|
259
259
|
}
|
|
260
260
|
|
|
261
261
|
@media (hover: hover) and (pointer: fine) {.LinkDialogButtonRemove:hover {
|
|
262
|
-
background-color: var(--color-background-danger-
|
|
262
|
+
background-color: var(--color-background-danger-solid-hover, #b91c1c);
|
|
263
263
|
}
|
|
264
264
|
}.LinkDialogButtonCancel,
|
|
265
265
|
.LinkDialogButtonSave {
|