reactjs-tiptap-editor 0.0.8 → 0.0.9

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":"reactjs-tiptap-editor.cjs","sources":["../src/utils/plateform.ts","../src/components/ActionButton.tsx","../src/components/ActionMenuButton.tsx","../src/extensions/MultiColumn/Column.ts","../src/extensions/MultiColumn/MultiColumn.ts","../src/utils/getRenderContainer.ts","../src/extensions/MultiColumn/menus/ColumnsMenu.tsx","../src/components/BubbleMenu.tsx","../src/constants/index.ts","../src/locales/en.ts","../src/locales/vi.ts","../src/locales/zh-cn.ts","../src/utils/mitt.ts","../src/locales/index.tsx","../src/components/ColorPicker.tsx","../src/theme/theme.ts","../src/utils/utils.ts","../src/components/RichTextEditor.tsx","../src/components/Toolbar.tsx","../src/components/icons/AspectRatio.tsx","../src/components/icons/Blockquote.tsx","../src/components/icons/DeleteColumn.tsx","../src/components/icons/DeleteRow.tsx","../src/components/icons/FileWordOutline.tsx","../src/components/icons/Icon.tsx","../src/components/icons/LineHeight.tsx","../src/components/icons/MenuDown.tsx","../src/components/icons/SizeL.tsx","../src/components/icons/SizeM.tsx","../src/components/icons/SizeS.tsx","../src/components/icons/icons.ts","../src/components/menus/bubble.ts","../src/utils/indent.ts","../src/components/menus/components/ContentMenu.tsx","../src/components/menus/components/BubbleMenuText.tsx","../src/extensions/Highlight/components/HighlightActionButton.tsx","../src/components/menus/components/TableBubbleMenu.tsx","../src/extensions/Link/components/LinkEditBlock.tsx","../src/extensions/Link/components/LinkViewBlock.tsx","../src/components/menus/components/BubbleMenuLink.tsx","../src/components/menus/components/BubbleMenuMedia.tsx","../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/input.tsx","../src/components/ui/label.tsx","../src/components/ui/popover.tsx","../src/components/ui/separator.tsx","../src/components/ui/switch.tsx","../src/components/ui/tabs.tsx","../src/components/ui/toast.tsx","../src/components/ui/toggle.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/use-toast.ts","../src/extensions/Bold/Bold.ts","../src/extensions/Italic/Italic.ts","../src/extensions/UnderLine/Underline.ts","../src/extensions/Strike/Strike.ts","../src/extensions/Code/Code.ts","../src/extensions/CodeBlock/CodeBlock.ts","../src/extensions/FontFamily/components/FontFamilyButton.tsx","../src/extensions/FontFamily/FontFamily.ts","../src/extensions/Heading/components/HeadingButton.tsx","../src/extensions/Heading/Heading.ts","../src/extensions/TextAlign/components/TextAlignMenuButton.tsx","../src/extensions/TextAlign/TextAlign.ts","../src/extensions/FontSize/components/FontSizeMenuButton.tsx","../src/extensions/FontSize/FontSize.ts","../src/extensions/Color/components/ColorActionButton.tsx","../src/extensions/Color/Color.ts","../src/extensions/Highlight/Highlight.ts","../src/extensions/BulletList/BulletList.ts","../src/extensions/Clear/Clear.ts","../src/extensions/OrderedList/OrderedList.ts","../src/extensions/TaskList/TaskList.ts","../src/extensions/Blockquote/Blockquote.ts","../src/extensions/Link/components/LinkEditPopover.tsx","../src/extensions/Link/Link.ts","../src/extensions/HorizontalRule/HorizontalRule.ts","../src/extensions/History/components/HistoryActionButton.tsx","../src/extensions/History/History.ts","../src/extensions/Document/Document.ts","../src/extensions/MultiColumn/ColumnToolbar.ts","../src/extensions/Selection/Selection.ts","../src/extensions/TextBubble/components/TextDropdown.tsx","../src/extensions/TextBubble/TextBubble.ts","../src/extensions/TrailingNode/TrailingNode.ts","../src/extensions/BaseKit.ts","../src/extensions/Subscript/Subscript.ts","../src/extensions/MoreMark/components/ActionMoreButton.tsx","../src/extensions/MoreMark/MoreMark.ts","../src/extensions/Indent/Indent.ts","../src/extensions/LineHeight/components/LineHeightDropdown.tsx","../src/utils/line-height.ts","../src/extensions/LineHeight/LineHeight.ts","../src/extensions/SlashCommand/groups.ts","../src/extensions/SlashCommand/components/CommandsList.tsx","../src/extensions/SlashCommand/SlashCommand.ts","../src/extensions/Image/components/ImageView.tsx","../src/extensions/Image/Image.ts","../src/plugins/image-upload.ts","../src/extensions/ImageUpload/components/ImageUploader.tsx","../src/extensions/ImageUpload/ImageUpload.ts","../src/extensions/Video/Video.ts","../src/extensions/VideoUpload/components/VideoUploaderView.tsx","../src/extensions/VideoUpload/VideoUpload.ts","../src/extensions/Table/cell-background.ts","../src/utils/is-mobile.ts","../src/extensions/Table/components/CreateTablePopover.tsx","../src/extensions/Table/components/TableActionButton.tsx","../src/extensions/Table/Table.ts","../src/extensions/FormatPainter/FormatPainter.ts","../src/extensions/Iframe/embed.ts","../src/extensions/Iframe/components/IframeNodeView.tsx","../src/extensions/Iframe/Iframe.ts"],"sourcesContent":["// We'll cache the result of isMac() and isTouchDevice(), since they shouldn't\n// change during a session. That way repeated calls don't require any logic and\n// are rapid.\nlet isMacResult: boolean | undefined\nlet isTouchDeviceResult: boolean | undefined\n\n/**\n * Return true if the user is using a Mac (as opposed to Windows, etc.) device.\n */\nexport function isMac(): boolean {\n if (isMacResult === undefined) {\n isMacResult = navigator.platform.includes('Mac')\n }\n return isMacResult\n}\n\n/**\n * 根据 Mac 和非 Mac 平台,返回应该用于键盘快捷键的修饰键的可读版本。用于直观地指示应该按哪个键。\n */\nexport function getShortcutKey(key: string): string {\n if (`${key}`.toLowerCase() === 'mod') {\n return isMac() ? '⌘' : 'Ctrl'\n }\n else if (`${key}`.toLowerCase() === 'alt') {\n return isMac() ? '⌥' : 'Alt'\n }\n else if (`${key}`.toLowerCase() === 'shift') {\n return isMac() ? '⇧' : 'Shift'\n }\n else {\n return key\n }\n}\nexport function getShortcutKeys(keys: string[]): string {\n return keys.map(getShortcutKey).join(' ')\n}\n\n/** Return true if the user is using a touch-based device. */\nexport function isTouchDevice(): boolean {\n if (isTouchDeviceResult === undefined) {\n // This technique is taken from\n // https://hacks.mozilla.org/2013/04/detecting-touch-its-the-why-not-the-how/\n // (and https://stackoverflow.com/a/4819886/4543977)\n isTouchDeviceResult\n = (window && 'ontouchstart' in window)\n || navigator.maxTouchPoints > 0\n // @ts-expect-error: msMaxTouchPoints is IE-specific, so needs to be ignored\n || navigator.msMaxTouchPoints > 0\n }\n\n return isTouchDeviceResult\n}\n","/* eslint-disable react/no-unstable-default-props */\n/* eslint-disable unused-imports/no-unused-vars */\nimport React from 'react'\n\nimport { Slot } from '@radix-ui/react-slot'\nimport type { TooltipContentProps } from '@radix-ui/react-tooltip'\n\nimport { Toggle, Tooltip, TooltipContent, TooltipTrigger, icons } from '@/components'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKeys } from '@/utils/plateform'\n\nexport interface ActionButtonProps {\n /* Icon name to display */\n icon?: string\n /* Button title */\n title?: string\n /* Tooltip text */\n tooltip?: string\n /* Whether the button is disabled */\n disabled?: boolean\n /* Keyboard shortcut keys */\n shortcutKeys?: string[]\n /* Custom CSS class */\n customClass?: string\n /* Loading state */\n loading?: boolean\n /* Tooltip options */\n tooltipOptions?: TooltipContentProps\n /* Button color */\n color?: string\n /* Click action handler */\n action?: ButtonViewReturnComponentProps['action']\n /* Active state checker */\n isActive?: ButtonViewReturnComponentProps['isActive']\n /* Child components */\n children?: React.ReactNode\n /* Whether to render as child */\n asChild?: boolean\n /* Whether it's an upload button */\n upload?: boolean\n}\n\nconst ActionButton = React.forwardRef<HTMLButtonElement, Partial<ActionButtonProps>>(\n (props, ref) => {\n const {\n icon = undefined,\n // title = undefined,\n tooltip = undefined,\n disabled = false,\n customClass = '',\n // color = undefined,\n // loading = false,\n shortcutKeys = undefined,\n tooltipOptions = {},\n action = undefined,\n isActive = undefined,\n children,\n asChild = false,\n upload = false,\n ...rest\n } = props\n\n const Icon = icons[icon as string]\n const Comp = asChild ? Slot : Toggle\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Comp\n ref={ref}\n size=\"sm\"\n className={`w-[32px] h-[32px] ${customClass}`}\n // pressed={isActive?.() || false}\n disabled={disabled}\n onClick={action}\n data-state={isActive?.() ? 'on' : 'off'}\n {...rest}\n >\n {Icon && <Icon className=\"w-4 h-4\" />}\n {children}\n </Comp>\n </TooltipTrigger>\n {tooltip && (\n <TooltipContent {...tooltipOptions}>\n <div className=\"flex flex-col items-center text-center max-w-24\">\n <div>{tooltip}</div>\n {!!shortcutKeys?.length && <span>{getShortcutKeys(shortcutKeys)}</span>}\n </div>\n </TooltipContent>\n )}\n </Tooltip>\n )\n },\n)\n\nexport {\n ActionButton,\n}\n","import React from 'react'\n\nimport { Slot } from '@radix-ui/react-slot'\n\nimport { Button, Tooltip, TooltipContent, TooltipTrigger, icons } from '@/components'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKeys } from '@/utils/plateform'\n\nexport interface ActionMenuButtonProps {\n /** Icon name to display */\n icon?: any\n /** Button title text */\n title?: string\n /** Tooltip text */\n tooltip?: string\n /** Whether the button is disabled */\n disabled?: boolean\n /** Keyboard shortcut keys */\n shortcutKeys?: string[]\n /** Button color */\n color?: string\n /** Click action handler */\n action?: ButtonViewReturnComponentProps['action']\n /** Active state checker */\n isActive?: ButtonViewReturnComponentProps['isActive']\n /** Whether to render as child */\n asChild?: boolean\n}\n\nconst ActionMenuButton = React.forwardRef<HTMLButtonElement, ActionMenuButtonProps>(\n ({ asChild, ...props }, ref) => {\n const Icon = icons[props.icon]\n const Comp = asChild ? Slot : Button\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Comp\n ref={ref}\n className=\"h-[32px] px-[5px] py-0 min-w-24 max-w-32 overflow-hidden\"\n variant=\"ghost\"\n disabled={props?.disabled}\n {...props}\n >\n <div className=\"flex items-center h-full font-normal\">\n {props?.title && (\n <div className=\"flex-grow text-sm text-left truncate\">{props?.title}</div>\n )}\n {Icon && <Icon className=\"flex-shrink-0 w-3 h-3 ml-1 text-zinc-500\" />}\n </div>\n </Comp>\n </TooltipTrigger>\n <TooltipContent>\n <div className=\"flex flex-col items-center text-center max-w-24\">\n {props?.tooltip && <div>{props?.tooltip}</div>}\n <div className=\"flex\">\n {!!props?.shortcutKeys?.length && <span>{getShortcutKeys(props?.shortcutKeys)}</span>}\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n )\n },\n)\n\nexport { ActionMenuButton }\n","import { Node, mergeAttributes } from '@tiptap/core'\n\nexport const Column = Node.create({\n name: 'column',\n content: 'block+',\n isolating: true,\n addAttributes() {\n return {\n position: {\n default: '',\n parseHTML: element => element.dataset.position,\n renderHTML: attributes => ({ 'data-position': attributes.position }),\n },\n }\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'column' }), 0]\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"column\"]',\n },\n ]\n },\n})\n\nexport default Column\n","import { Node } from '@tiptap/core'\n\nimport { Column } from './Column'\nimport type { GeneralOptions } from '@/types'\n\nexport enum ColumnLayout {\n SidebarLeft = 'sidebar-left',\n SidebarRight = 'sidebar-right',\n TwoColumn = 'two-column',\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n columns: {\n setColumns: () => ReturnType\n setLayout: (layout: ColumnLayout) => ReturnType\n }\n }\n}\nexport interface ColumnsOptions extends GeneralOptions<ColumnsOptions> {\n columnOptions: any\n layout: ColumnLayout\n}\n\nexport const MultiColumn = Node.create<ColumnsOptions>({\n name: 'columns',\n group: 'columns',\n content: 'column+',\n defining: true,\n isolating: true,\n addOptions() {\n return {\n ...this.parent?.(),\n layout: ColumnLayout.TwoColumn,\n }\n },\n\n addAttributes() {\n return {\n layout: {\n default: ColumnLayout.TwoColumn,\n },\n }\n },\n addCommands() {\n return {\n setColumns:\n () =>\n ({ commands }) => {\n commands.insertContent(\n '<div data-type=\"columns\"><div data-type=\"column\" data-position=\"left\"><p></p></div><div data-type=\"column\" data-position=\"right\"><p></p></div></div>',\n )\n return true\n },\n\n setLayout:\n (layout: ColumnLayout) =>\n ({ commands }) =>\n commands.updateAttributes('columns', { layout }),\n }\n },\n renderHTML({ HTMLAttributes }) {\n return ['div', { 'data-type': 'columns', 'class': `layout-${HTMLAttributes.layout}` }, 0]\n },\n parseHTML() {\n return [\n {\n tag: 'div[data-type=\"columns\"]',\n },\n ]\n },\n addExtensions() {\n return [Column.configure(this.options.columnOptions)]\n },\n})\n\nexport default MultiColumn\n","import type { Editor } from '@tiptap/react'\n\nexport function getRenderContainer(editor: Editor, nodeType: string) {\n const {\n view,\n state: {\n selection: { from },\n },\n } = editor\n\n const elements = document.querySelectorAll('.has-focus')\n const elementCount = elements.length\n const innermostNode = elements[elementCount - 1]\n const element = innermostNode as any\n\n if (\n (element && element.dataset.type && element.dataset.type === nodeType)\n || (element && element.classList && element.classList.contains(nodeType))\n ) {\n return element\n }\n\n const node = view.domAtPos(from).node as HTMLElement\n let container: any = node\n\n if (!container.tagName) {\n container = node.parentElement\n }\n\n while (\n container\n && !(container.dataset.type && container.dataset.type === nodeType)\n && !container.classList.contains(nodeType)\n ) {\n container = container.parentElement\n }\n\n return container\n}\n\nexport default getRenderContainer\n","import { BubbleMenu, isActive } from '@tiptap/react'\nimport { sticky } from 'tippy.js'\n\nimport { ActionButton } from '@/components'\nimport { ColumnLayout } from '@/extensions/MultiColumn/MultiColumn'\nimport getRenderContainer from '@/utils/getRenderContainer'\n\ninterface IPropsColumnsMenu {\n editor: any\n disabled?: boolean\n}\n\nfunction shouldShow({ editor }: any) {\n return isActive(editor.view.state, 'columns')\n}\n\nfunction ColumnsMenu(props: IPropsColumnsMenu) {\n const getReferenceClientRect = () => {\n const renderContainer = getRenderContainer(props.editor, 'columns')\n const rect = renderContainer?.getBoundingClientRect() || new DOMRect(-1000, -1000, 0, 0)\n\n return rect\n }\n\n const onColumnLeft = () => {\n props.editor.chain().focus().setLayout(ColumnLayout.SidebarLeft).run()\n }\n\n const onColumnRight = () => {\n props.editor.chain().focus().setLayout(ColumnLayout.SidebarRight).run()\n }\n\n const onColumnTwo = () => {\n props.editor.chain().focus().setLayout(ColumnLayout.TwoColumn).run()\n }\n\n return (\n <BubbleMenu\n editor={props?.editor}\n pluginKey=\"columns\"\n shouldShow={shouldShow}\n updateDelay={0}\n tippyOptions={{\n offset: [0, 8],\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n getReferenceClientRect,\n plugins: [sticky],\n sticky: 'popper',\n }}\n >\n <div className=\"p-2 bg-white border rounded-lg shadow-sm dark:bg-black border-neutral-200 dark:border-neutral-800\">\n <div className=\"flex items-center gap-1\">\n <ActionButton\n title=\"ok\"\n icon=\"PanelLeft\"\n tooltip=\"Left Sidebar\"\n action={onColumnLeft}\n isActive={() => props?.editor.isActive('columns', { layout: ColumnLayout.SidebarLeft })}\n tooltipOptions={{ sideOffset: 15 }}\n />\n <ActionButton\n title=\"ok\"\n icon=\"Columns\"\n tooltip=\"Two-column layout\"\n action={onColumnTwo}\n isActive={() => props?.editor.isActive('columns', { layout: ColumnLayout.TwoColumn })}\n tooltipOptions={{ sideOffset: 15 }}\n />\n <ActionButton\n title=\"ok\"\n icon=\"PanelRight\"\n tooltip=\"Right Sidebar\"\n action={onColumnRight}\n isActive={() =>\n props?.editor.isActive('columns', { layout: ColumnLayout.SidebarRight })}\n tooltipOptions={{ sideOffset: 15 }}\n />\n </div>\n </div>\n </BubbleMenu>\n )\n}\n\nexport default ColumnsMenu\n","import type { Editor } from '@tiptap/core'\n\nimport { BubbleMenuImage, BubbleMenuLink, BubbleMenuText, BubbleMenuVideo, ContentMenu, TableBubbleMenu } from '@/components'\nimport ColumnsMenu from '@/extensions/MultiColumn/menus/ColumnsMenu'\nimport type { BubbleMenuProps as BubbleMenuPropsType } from '@/types'\n\nexport interface BubbleMenuComponentProps {\n editor: Editor\n disabled?: boolean\n bubbleMenu?: BubbleMenuPropsType\n}\n\n/**\n * Bubble Menu Component\n *\n * @param editor Editor instance\n * @param disabled Whether the menu is disabled\n * @param bubbleMenu Bubble menu configuration\n * @returns Bubble menu component\n */\nexport function BubbleMenu({ editor, disabled, bubbleMenu }: BubbleMenuComponentProps) {\n const extensionsNames = editor.extensionManager.extensions.map(ext => ext.name)\n\n const renderMenuItems = () => [\n extensionsNames.includes('columns') && !bubbleMenu?.columnConfig?.hidden ? <ColumnsMenu key=\"columns\" editor={editor} /> : null,\n extensionsNames.includes('table') && !bubbleMenu?.tableConfig?.hidden ? <TableBubbleMenu key=\"table\" editor={editor} /> : null,\n extensionsNames.includes('link') && !bubbleMenu?.linkConfig?.hidden ? <BubbleMenuLink key=\"link\" editor={editor} disabled={disabled} /> : null,\n extensionsNames.includes('image') && !bubbleMenu?.imageConfig?.hidden ? <BubbleMenuImage key=\"image\" editor={editor} disabled={disabled} /> : null,\n extensionsNames.includes('video') && !bubbleMenu?.videoConfig?.hidden ? <BubbleMenuVideo key=\"video\" editor={editor} disabled={disabled} /> : null,\n !bubbleMenu?.floatingMenuConfig?.hidden ? <ContentMenu key=\"content\" editor={editor} disabled={disabled} /> : null,\n !bubbleMenu?.textConfig?.hidden ? <BubbleMenuText key=\"text\" editor={editor} disabled={disabled} /> : null,\n ]\n\n if (bubbleMenu?.render) {\n return bubbleMenu.render({ editor, disabled: disabled || false, bubbleMenu }, renderMenuItems())\n }\n\n return renderMenuItems().filter(Boolean)\n}\n","/** Default lang */\nexport const DEFAULT_LANG_VALUE = 'en' as const\n\n/** Throttle time for editor input (milliseconds) */\nexport const EDITOR_UPDATE_THROTTLE_WAIT_TIME = 200 as const\n\n/**\n * watch throttling time must be less than the update time\n * otherwise the cursor position will reach the end\n */\nexport const EDITOR_UPDATE_WATCH_THROTTLE_WAIT_TIME = EDITOR_UPDATE_THROTTLE_WAIT_TIME - 80\n\n/** Minimum size for image adjustments */\nexport const IMAGE_MIN_SIZE = 20 as const\n/** Maximum size for image adjustments */\nexport const IMAGE_MAX_SIZE = 100_000 as const\n/** Throttle time during adjustments for images (milliseconds) */\nexport const IMAGE_THROTTLE_WAIT_TIME = 16 as const\n\n/** Default number of rows and columns for grids when creating a table */\nexport const TABLE_INIT_GRID_SIZE = 10 as const\n/** Maximum number of rows and columns for grids when creating a table */\nexport const TABLE_MAX_GRID_SIZE = 10 as const\n/** Minimum number of rows and columns for grids when creating a table */\nexport const TABLE_DEFAULT_SELECTED_GRID_SIZE = 2 as const\n\nexport const DEFAULT_COLOR = '#262626'\n/** Default color list for text color and text highlight */\nexport const COLORS_LIST = [\n '#000000',\n '#262626',\n '#595959',\n '#8C8C8C',\n '#BFBFBF',\n '#D9D9D9',\n '#E9E9E9',\n '#F5F5F5',\n '#FAFAFA',\n '#FFFFFF',\n '#F5222D',\n '#FA541C',\n '#FA8C16',\n '#FADB14',\n '#52C41A',\n '#13C2C2',\n '#1890FF',\n '#2F54EB',\n '#722ED1',\n '#EB2F96',\n '#FFE8E6',\n '#FFECE0',\n '#FFEFD1',\n '#FCFCCA',\n '#E4F7D2',\n '#D3F5F0',\n '#D4EEFC',\n '#DEE8FC',\n '#EFE1FA',\n '#FAE1EB',\n '#FFA39E',\n '#FFBB96',\n '#FFD591',\n '#FFFB8F',\n '#B7EB8F',\n '#87E8DE',\n '#91D5FF',\n '#ADC6FF',\n '#D3ADF7',\n '#FFADD2',\n '#FF4D4F',\n '#FF7A45',\n '#FFA940',\n '#FFEC3D',\n '#73D13D',\n '#36CFC9',\n '#40A9FF',\n '#597EF7',\n '#9254DE',\n '#F759AB',\n '#CF1322',\n '#D4380D',\n '#D46B08',\n '#D4B106',\n '#389E0D',\n '#08979C',\n '#096DD9',\n '#1D39C4',\n '#531DAB',\n '#C41D7F',\n '#820014',\n '#871400',\n '#873800',\n '#614700',\n '#135200',\n '#00474F',\n '#003A8C',\n '#061178',\n '#22075E',\n '#780650',\n] as const\n\n/** Default font size list */\nexport const DEFAULT_FONT_SIZE_LIST = [\n '10px',\n '11px',\n '12px',\n '14px',\n '16px',\n '18px',\n '20px',\n '22px',\n '24px',\n '26px',\n '28px',\n '36px',\n '48px',\n '72px',\n] as const\n\n/** Default font size value */\nexport const DEFAULT_FONT_SIZE_VALUE = 'default' as const\n\n/** Options for setting image size in the bubble menu */\nexport enum IMAGE_SIZE {\n 'size-small' = 200,\n 'size-medium' = 500,\n 'size-large' = '100%',\n}\n\n/** Options for setting video size in the bubble menu */\nexport enum VIDEO_SIZE {\n 'size-small' = 480,\n 'size-medium' = 640,\n 'size-large' = '100%',\n}\n\nexport const LINE_HEIGHT_100 = 1.7\nexport const DEFAULT_LINE_HEIGHT = '1'\n\n/** display in menus */\nexport const NODE_TYPE_MENU: any = {\n image: [\n 'divider',\n 'image-size-small',\n 'image-size-medium',\n 'image-size-large',\n 'divider',\n 'image-left',\n 'image-center',\n 'image-right',\n 'divider',\n 'image-aspect-ratio',\n 'remove',\n ],\n text: [\n 'divider',\n 'text-bubble',\n 'divider',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'link',\n 'divider',\n 'color',\n 'highlight',\n 'textAlign',\n ],\n video: ['video-size-small', 'video-size-medium', 'video-size-large', 'divider', 'remove'],\n table: ['removeTable'],\n}\n\n/** display in bubble text menu */\nexport const BUBBLE_TEXT_LIST = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'link',\n 'divider',\n 'color',\n 'highlight',\n 'textAlign',\n]\n","const locale = {\n 'editor.remove': 'Remove',\n 'editor.copy': 'Copy',\n 'editor.words': 'WORDS',\n 'editor.characters': 'CHARACTERS',\n 'editor.default': 'Default',\n 'editor.recent': 'Recently Used',\n 'editor.nofill': 'No Fill',\n 'editor.format': 'Format Painter',\n 'editor.draghandle.tooltip': 'Modify',\n 'editor.copyToClipboard': 'CopyToClipboard',\n 'editor.importWord.tooltip': 'Import Word',\n 'editor.slash': 'Press \\'/\\' for commands',\n 'editor.slash.empty': 'No Result',\n 'editor.slash.format': 'Format',\n 'editor.slash.insert': 'Insert',\n 'editor.slash.embed': 'Embed Services',\n 'editor.content': 'Please input content',\n 'editor.fontFamily.tooltip': 'Font Family',\n 'editor.fontFamily.default.tooltip': 'Default',\n 'editor.moremark': 'More Text Styles',\n 'editor.size.small.tooltip': 'Small',\n 'editor.size.medium.tooltip': 'Medium',\n 'editor.size.large.tooltip': 'Cover',\n 'editor.bold.tooltip': 'Bold',\n 'editor.italic.tooltip': 'Italic',\n 'editor.underline.tooltip': 'Underline',\n 'editor.strike.tooltip': 'Strike',\n 'editor.color.tooltip': 'Color',\n 'editor.color.more': 'More Colors',\n 'editor.highlight.tooltip': 'Highlight',\n 'editor.lineheight.tooltip': 'Line Height',\n 'editor.heading.tooltip': 'Headings',\n 'editor.heading.h1.tooltip': 'Heading 1',\n 'editor.heading.h2.tooltip': 'Heading 2',\n 'editor.heading.h3.tooltip': 'Heading 3',\n 'editor.heading.h4.tooltip': 'Heading 4',\n 'editor.heading.h5.tooltip': 'Heading 5',\n 'editor.heading.h6.tooltip': 'Heading 6',\n 'editor.paragraph.tooltip': 'Paragraph',\n 'editor.textalign.tooltip': 'Align',\n 'editor.textalign.left.tooltip': 'Left',\n 'editor.textalign.center.tooltip': 'Center',\n 'editor.textalign.right.tooltip': 'Right',\n 'editor.textalign.justify.tooltip': 'Justify',\n 'editor.indent': 'Indent',\n 'editor.indent.indent': 'Increase Indent',\n 'editor.indent.outdent': 'Decrease Indent',\n 'editor.fontSize.tooltip': 'Font size',\n 'editor.fontSize.default.tooltip': 'Default',\n 'editor.superscript.tooltip': 'Superscript',\n 'editor.subscript.tooltip': 'Subscript',\n 'editor.bulletlist.tooltip': 'Bullet List',\n 'editor.orderedlist.tooltip': 'Ordered List',\n 'editor.tasklist.tooltip': 'Task List',\n 'editor.indent.tooltip': 'Indent',\n 'editor.outdent.tooltip': 'Outdent',\n 'editor.columns.tooltip': 'Columns',\n 'editor.link.tooltip': 'Link',\n 'editor.link.unlink.tooltip': 'UnLink',\n 'editor.link.open.tooltip': 'Open Link',\n 'editor.link.edit.tooltip': 'Edit Link',\n 'editor.link.dialog.title': 'Insert Link',\n 'editor.link.dialog.link': 'Link',\n 'editor.link.dialog.text': 'Text',\n 'editor.link.dialog.openInNewTab': 'Open In New Tab',\n 'editor.link.dialog.link.placeholder': 'Link Address',\n 'editor.link.dialog.text.placeholder': 'Add Description',\n 'editor.link.dialog.button.apply': 'Apply',\n 'editor.image.tooltip': 'Image',\n 'editor.image.dragger.tooltip': 'Click or drag the image to the area to upload',\n 'editor.image.float.left.tooltip': 'Float left',\n 'editor.image.float.none.tooltip': 'Float none',\n 'editor.image.float.right.tooltip': 'Float right',\n 'editor.image.dialog.title': 'Add an image',\n 'editor.image.dialog.tab.url': 'Url',\n 'editor.image.dialog.tab.upload': 'Upload',\n 'editor.image.dialog.uploading': 'Uploading',\n 'editor.image.dialog.form.link': 'Link',\n 'editor.image.dialog.placeholder': 'Link',\n 'editor.image.dialog.form.alt': 'Alt',\n 'editor.image.dialog.form.aspectRatio': 'Lock original aspect ratio',\n 'editor.image.dialog.form.file': 'File',\n 'editor.image.dialog.button.apply': 'apply',\n 'editor.video.tooltip': 'Video',\n 'editor.video.dialog.tab.upload': 'Upload',\n 'editor.video.dialog.uploading': 'Uploading',\n 'editor.video.dialog.title': 'Embed or upload a video',\n 'editor.video.dialog.link': 'link',\n 'editor.video.dialog.placeholder': 'Link',\n 'editor.video.dialog.button.apply': 'apply',\n 'editor.table.tooltip': 'Table',\n 'editor.table.menu.insert_table': 'Insert Table',\n 'editor.table.menu.insert_table.with_header_row': 'With header row',\n 'editor.table.menu.add_column_before': 'Add Column Before',\n 'editor.table.menu.add_column_after': 'Add Column After',\n 'editor.table.menu.delete_column': 'Delete Column',\n 'editor.table.menu.add_row_before': 'Add Row Before',\n 'editor.table.menu.add_row_after': 'Add Row After',\n 'editor.table.menu.delete_row': 'Delete Row',\n 'editor.table.menu.merge_or_split_cells': 'Merge Or Split Cells',\n 'editor.table.menu.delete_table': 'Delete Table',\n 'editor.blockquote.tooltip': 'Blockquote',\n 'editor.horizontalrule.tooltip': 'Horizontal Rule',\n 'editor.code.tooltip': 'Code',\n 'editor.codeblock.tooltip': 'Code Block',\n 'editor.clear.tooltip': 'Clear Format',\n 'editor.undo.tooltip': 'Undo',\n 'editor.redo.tooltip': 'Redo',\n 'editor.fullscreen.tooltip.fullscreen': 'Fullscreen',\n 'editor.fullscreen.tooltip.exit': 'Fullscreen Exit',\n 'editor.imageUpload.fileTypeNotSupported': 'File type not supported',\n 'editor.imageUpload.fileSizeTooBig': 'File size too big, Maximum size is',\n 'editor.table.menu.insertColumnBefore': 'Insert Column Before',\n 'editor.table.menu.insertColumnAfter': 'Insert Column After',\n 'editor.table.menu.deleteColumn': 'Delete Column',\n 'editor.table.menu.insertRowAbove': 'Insert Row Above',\n 'editor.table.menu.insertRowBelow': 'Insert Row Below',\n 'editor.table.menu.deleteRow': 'Delete Row',\n 'editor.table.menu.mergeCells': 'Merge Cells',\n 'editor.table.menu.splitCells': 'Split Cells',\n 'editor.table.menu.deleteTable': 'Delete Table',\n 'editor.table.menu.setCellsBgColor': 'Cell Background Color',\n 'editor.emoji.tooltip': 'Emoji',\n 'editor.iframe.tooltip': 'Iframe',\n}\n\nexport default locale\n","const locale = {\n 'editor.remove': 'Xóa',\n 'editor.copy': 'Sao chép',\n 'editor.words': 'TỪ',\n 'editor.characters': 'KÝ TỰ',\n 'editor.default': 'Mặc định',\n 'editor.recent': 'Đã sử dụng gần đây',\n 'editor.nofill': 'Không tô',\n 'editor.format': 'Format Painter',\n 'editor.draghandle.tooltip': 'Sửa đổi',\n 'editor.copyToClipboard': 'CopyToClipboard',\n 'editor.importWord.tooltip': 'Nhập Word',\n 'editor.slash': 'Nhấn \\'/\\' để biết lệnh',\n 'editor.slash.empty': 'Không có kết quả',\n 'editor.slash.format': 'Định dạng',\n 'editor.slash.insert': 'Chèn',\n 'editor.slash.embed': 'Dịch vụ nhúng',\n 'editor.content': 'Vui lòng nhập nội dung',\n 'editor.moremark': 'Nhiều kiểu văn bản hơn',\n 'editor.size.small.tooltip': 'Nhỏ',\n 'editor.fontFamily.tooltip': 'Phông chữ',\n 'editor.fontFamily.default.tooltip': 'Mặc định',\n 'editor.size.medium.tooltip': 'Trung bình',\n 'editor.size.large.tooltip': 'Lớn',\n 'editor.bold.tooltip': 'Đậm',\n 'editor.italic.tooltip': 'In nghiêng',\n 'editor.underline.tooltip': 'Gạch chân',\n 'editor.strike.tooltip': 'Gạch',\n 'editor.color.tooltip': 'Màu',\n 'editor.color.more': 'Nhiều màu hơn',\n 'editor.highlight.tooltip': 'Đánh dấu',\n 'editor.lineheight.tooltip': 'Chiều cao dòng',\n 'editor.heading.tooltip': 'Tiêu đề',\n 'editor.heading.h1.tooltip': 'Tiêu đề 1',\n 'editor.heading.h2.tooltip': 'Tiêu đề 2',\n 'editor.heading.h3.tooltip': 'Tiêu đề 3',\n 'editor.heading.h4.tooltip': 'Tiêu đề 4',\n 'editor.heading.h5.tooltip': 'Tiêu đề 5',\n 'editor.heading.h6.tooltip': 'Tiêu đề 6',\n 'editor.paragraph.tooltip': 'Đoạn văn',\n 'editor.textalign.tooltip': 'Căn chỉnh',\n 'editor.textalign.left.tooltip': 'Trái',\n 'editor.textalign.center.tooltip': 'Giữa',\n 'editor.textalign.right.tooltip': 'Phải',\n 'editor.textalign.justify.tooltip': 'Căn đều',\n 'editor.indent': 'Thụt lề',\n 'editor.indent.indent': 'Tăng thụt lề',\n 'editor.indent.outdent': 'Giảm thụt lề',\n 'editor.fontSize.tooltip': 'Kích thước phông chữ',\n 'editor.fontSize.default.tooltip': 'Mặc định',\n 'editor.superscript.tooltip': 'Chỉ số trên',\n 'editor.subscript.tooltip': 'Chỉ số dưới',\n 'editor.bulletlist.tooltip': 'Danh sách dấu đầu dòng',\n 'editor.orderedlist.tooltip': 'Danh sách có thứ tự',\n 'editor.tasklist.tooltip': 'Danh sách tác vụ',\n 'editor.indent.tooltip': 'Tăng thụt lề',\n 'editor.outdent.tooltip': 'Giảm thụt lề',\n 'editor.columns.tooltip': 'Cột',\n 'editor.link.tooltip': 'Liên kết',\n 'editor.link.unlink.tooltip': 'Hủy liên kết',\n 'editor.link.open.tooltip': 'Mở liên kết',\n 'editor.link.edit.tooltip': 'Chỉnh sửa liên kết',\n 'editor.link.dialog.title': 'Chèn liên kết',\n 'editor.link.dialog.link': 'Liên kết',\n 'editor.link.dialog.text': 'Văn bản',\n 'editor.link.dialog.openInNewTab': 'Mở trong tab mới',\n 'editor.link.dialog.link.placeholder': 'Địa chỉ liên kết',\n 'editor.link.dialog.text.placeholder': 'Thêm mô tả',\n 'editor.link.dialog.button.apply': 'Áp dụng',\n 'editor.image.tooltip': 'Hình ảnh',\n 'editor.image.dragger.tooltip': 'Nhấp hoặc kéo hình ảnh đến khu vực để tải lên',\n 'editor.image.float.left.tooltip': 'Trôi sang trái',\n 'editor.image.float.none.tooltip': 'Trôi không',\n 'editor.image.float.right.tooltip': 'Trôi sang phải',\n 'editor.image.dialog.title': 'Thêm hình ảnh',\n 'editor.image.dialog.tab.url': 'Url',\n 'editor.image.dialog.tab.upload': 'Tải lên',\n 'editor.image.dialog.uploading': 'Đang tải lên',\n 'editor.image.dialog.form.link': 'Liên kết',\n 'editor.image.dialog.placeholder': 'Liên kết',\n 'editor.image.dialog.form.alt': 'Alt',\n 'editor.image.dialog.form.aspectRatio': 'Khóa tỷ lệ khung hình gốc',\n 'editor.image.dialog.form.file': 'Tệp',\n 'editor.image.dialog.button.apply': 'áp dụng',\n 'editor.video.tooltip': 'Video',\n 'editor.video.dialog.tab.upload': 'Tải lên',\n 'editor.video.dialog.uploading': 'Đang tải lên',\n 'editor.video.dialog.title': 'Nhúng hoặc tải lên video',\n 'editor.video.dialog.link': 'liên kết',\n 'editor.video.dialog.placeholder': 'Liên kết',\n 'editor.video.dialog.button.apply': 'áp dụng',\n 'editor.table.tooltip': 'Bảng',\n 'editor.table.menu.insert_table': 'Chèn Bảng',\n 'editor.table.menu.insert_table.with_header_row': 'Có hàng tiêu đề',\n 'editor.table.menu.add_column_before': 'Thêm Cột Trước',\n 'editor.table.menu.add_column_after': 'Thêm Cột Sau',\n 'editor.table.menu.delete_column': 'Xóa Cột',\n 'editor.table.menu.add_row_before': 'Thêm Hàng Trước',\n 'editor.table.menu.add_row_after': 'Thêm Hàng Sau',\n 'editor.table.menu.delete_row': 'Xóa Hàng',\n 'editor.table.menu.merge_or_split_cells': 'Gộp Hoặc Tách Ô',\n 'editor.table.menu.delete_table': 'Xóa Bảng',\n 'editor.blockquote.tooltip': 'Blockquote',\n 'editor.horizontalrule.tooltip': 'Quy tắc ngang',\n 'editor.code.tooltip': 'Mã',\n 'editor.codeblock.tooltip': 'Khối mã',\n 'editor.clear.tooltip': 'Xóa định dạng',\n 'editor.undo.tooltip': 'Hoàn tác',\n 'editor.redo.tooltip': 'Làm lại',\n 'editor.fullscreen.tooltip.fullscreen': 'Toàn màn hình',\n 'editor.fullscreen.tooltip.exit': 'Thoát toàn màn hình',\n 'editor.imageUpload.fileTypeNotSupported': 'Loại tệp không được hỗ trợ',\n 'editor.imageUpload.fileSizeTooBig': 'Kích thước tệp quá lớn, Kích thước tối đa là',\n 'editor.table.menu.insertColumnBefore': 'Chèn cột trước',\n 'editor.table.menu.insertColumnAfter': 'Chèn cột sau',\n 'editor.table.menu.deleteColumn': 'Xóa cột',\n 'editor.table.menu.insertRowAbove': 'Chèn hàng ở trên',\n 'editor.table.menu.insertRowBelow': 'Chèn hàng ở dưới',\n 'editor.table.menu.deleteRow': 'Xóa hàng',\n 'editor.table.menu.mergeCells': 'Gộp các ô',\n 'editor.table.menu.splitCells': 'Chia ô',\n 'editor.table.menu.deleteTable': 'Xóa bảng',\n 'editor.table.menu.setCellsBgColor': 'Màu nền ô',\n 'editor.emoji.tooltip': 'Biểu tượng',\n 'editor.iframe.tooltip': 'Iframe',\n}\n\nexport default locale\n","const locale = {\n 'editor.remove': '移除',\n 'editor.copy': '复制',\n 'editor.words': '字数',\n 'editor.characters': '字符数',\n 'editor.default': '默认',\n 'editor.recent': '最近使用',\n 'editor.nofill': '无填充',\n 'editor.format': '格式刷',\n 'editor.draghandle.tooltip': '修改',\n 'editor.copyToClipboard': '复制到剪贴板',\n 'editor.importWord.tooltip': '导入 Word',\n 'editor.slash': '按 \\'/\\' 使用命令',\n 'editor.slash.empty': '无结果',\n 'editor.slash.format': '格式',\n 'editor.slash.insert': '插入',\n 'editor.slash.embed': '嵌入服务',\n 'editor.content': '请输入内容',\n 'editor.fontFamily.tooltip': '字体',\n 'editor.fontFamily.default.tooltip': '默认',\n 'editor.moremark': '更多文本样式',\n 'editor.size.small.tooltip': '小',\n 'editor.size.medium.tooltip': '中',\n 'editor.size.large.tooltip': '封面',\n 'editor.bold.tooltip': '粗体',\n 'editor.italic.tooltip': '斜体',\n 'editor.underline.tooltip': '下划线',\n 'editor.strike.tooltip': '删除线',\n 'editor.color.tooltip': '颜色',\n 'editor.color.more': '更多颜色',\n 'editor.highlight.tooltip': '高亮',\n 'editor.lineheight.tooltip': '行高',\n 'editor.heading.tooltip': '标题',\n 'editor.heading.h1.tooltip': '标题 1',\n 'editor.heading.h2.tooltip': '标题 2',\n 'editor.heading.h3.tooltip': '标题 3',\n 'editor.heading.h4.tooltip': '标题 4',\n 'editor.heading.h5.tooltip': '标题 5',\n 'editor.heading.h6.tooltip': '标题 6',\n 'editor.paragraph.tooltip': '段落',\n 'editor.textalign.tooltip': '对齐',\n 'editor.textalign.left.tooltip': '左对齐',\n 'editor.textalign.center.tooltip': '居中',\n 'editor.textalign.right.tooltip': '右对齐',\n 'editor.textalign.justify.tooltip': '两端对齐',\n 'editor.indent': '缩进',\n 'editor.indent.indent': '增加缩进',\n 'editor.indent.outdent': '减少缩进',\n 'editor.fontSize.tooltip': '字号',\n 'editor.fontSize.default.tooltip': '默认',\n 'editor.superscript.tooltip': '上标',\n 'editor.subscript.tooltip': '下标',\n 'editor.bulletlist.tooltip': '无序列表',\n 'editor.orderedlist.tooltip': '有序列表',\n 'editor.tasklist.tooltip': '任务列表',\n 'editor.indent.tooltip': '缩进',\n 'editor.outdent.tooltip': '减少缩进',\n 'editor.columns.tooltip': '列',\n 'editor.link.tooltip': '链接',\n 'editor.link.unlink.tooltip': '取消链接',\n 'editor.link.open.tooltip': '打开链接',\n 'editor.link.edit.tooltip': '编辑链接',\n 'editor.link.dialog.title': '插入链接',\n 'editor.link.dialog.link': '链接',\n 'editor.link.dialog.text': '文本',\n 'editor.link.dialog.openInNewTab': '在新标签页中打开',\n 'editor.link.dialog.link.placeholder': '链接地址',\n 'editor.link.dialog.text.placeholder': '添加描述',\n 'editor.link.dialog.button.apply': '应用',\n 'editor.image.tooltip': '图片',\n 'editor.image.dragger.tooltip': '点击或拖拽图片到此区域上传',\n 'editor.image.float.left.tooltip': '左浮动',\n 'editor.image.float.none.tooltip': '无浮动',\n 'editor.image.float.right.tooltip': '右浮动',\n 'editor.image.dialog.title': '添加图片',\n 'editor.image.dialog.tab.url': '链接',\n 'editor.image.dialog.tab.upload': '上传',\n 'editor.image.dialog.uploading': '上传中',\n 'editor.image.dialog.form.link': '链接',\n 'editor.image.dialog.placeholder': '链接',\n 'editor.image.dialog.form.alt': '替代文本',\n 'editor.image.dialog.form.aspectRatio': '锁定原始宽高比',\n 'editor.image.dialog.form.file': '文件',\n 'editor.image.dialog.button.apply': '应用',\n 'editor.video.tooltip': '视频',\n 'editor.video.dialog.tab.upload': '上传',\n 'editor.video.dialog.uploading': '上传中',\n 'editor.video.dialog.title': '嵌入或上传视频',\n 'editor.video.dialog.link': '链接',\n 'editor.video.dialog.placeholder': '链接',\n 'editor.video.dialog.button.apply': '应用',\n 'editor.table.tooltip': '表格',\n 'editor.table.menu.insert_table': '插入表格',\n 'editor.table.menu.insert_table.with_header_row': '带标题行',\n 'editor.table.menu.add_column_before': '在前面插入列',\n 'editor.table.menu.add_column_after': '在后面插入列',\n 'editor.table.menu.delete_column': '删除列',\n 'editor.table.menu.add_row_before': '在上方插入行',\n 'editor.table.menu.add_row_after': '在下方插入行',\n 'editor.table.menu.delete_row': '删除行',\n 'editor.table.menu.merge_or_split_cells': '合并或拆分单元格',\n 'editor.table.menu.delete_table': '删除表格',\n 'editor.blockquote.tooltip': '引用',\n 'editor.horizontalrule.tooltip': '水平线',\n 'editor.code.tooltip': '代码',\n 'editor.codeblock.tooltip': '代码块',\n 'editor.clear.tooltip': '清除格式',\n 'editor.undo.tooltip': '撤销',\n 'editor.redo.tooltip': '重做',\n 'editor.fullscreen.tooltip.fullscreen': '全屏',\n 'editor.fullscreen.tooltip.exit': '退出全屏',\n 'editor.imageUpload.fileTypeNotSupported': '不支持的文件类型',\n 'editor.imageUpload.fileSizeTooBig': '文件大小超出限制,最大大小为',\n 'editor.table.menu.insertColumnBefore': '在前面插入列',\n 'editor.table.menu.insertColumnAfter': '在后面插入列',\n 'editor.table.menu.deleteColumn': '删除列',\n 'editor.table.menu.insertRowAbove': '在上方插入行',\n 'editor.table.menu.insertRowBelow': '在下方插入行',\n 'editor.table.menu.deleteRow': '删除行',\n 'editor.table.menu.mergeCells': '合并单元格',\n 'editor.table.menu.splitCells': '拆分单元格',\n 'editor.table.menu.deleteTable': '删除表格',\n 'editor.table.menu.setCellsBgColor': '设置单元格背景色',\n 'editor.emoji.tooltip': '表情',\n 'editor.iframe.tooltip': '内嵌框架',\n}\n\nexport default locale\n","/* eslint-disable array-callback-return */\n// @ts-nocheck\n\n/**\n * copy to https://github.com/developit/mitt\n */\n\nexport type EventType = string | symbol\n\n// An event handler can take an optional event argument\n// and should not return a value\nexport type Handler<T = unknown> = (event: T) => void\nexport type WildcardHandler<T = Record<string, unknown>> = (\n type: keyof T,\n event: T[keyof T],\n) => void\n\n// An array of all currently registered event handlers for a type\nexport type EventHandlerList<T = unknown> = Array<Handler<T>>\nexport type WildCardEventHandlerList<T = Record<string, unknown>> = Array<WildcardHandler<T>>\n\n// A map of event types and their corresponding event handlers.\nexport type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<\n keyof Events | '*',\n EventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events>\n>\n\nexport interface Emitter<Events extends Record<EventType, unknown>> {\n all: EventHandlerMap<Events>\n\n on: (<Key extends keyof Events>(type: Key, handler: Handler<Events[Key]>) => void) & ((type: '*', handler: WildcardHandler<Events>) => void)\n\n off: (<Key extends keyof Events>(type: Key, handler?: Handler<Events[Key]>) => void) & ((type: '*', handler: WildcardHandler<Events>) => void)\n\n emit: (<Key extends keyof Events>(type: Key, event: Events[Key]) => void) & (<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never) => void)\n}\n\n/**\n * Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nexport default function mitt<Events extends Record<EventType, unknown>>(\n all?: EventHandlerMap<Events>,\n): Emitter<Events> {\n type GenericEventHandler = Handler<Events[keyof Events]> | WildcardHandler<Events>\n all = all || new Map()\n\n return {\n /**\n * A Map of event names to registered handler functions.\n */\n all,\n\n /**\n * Register an event handler for the given type.\n * @param {string|symbol} type Type of event to listen for, or `'*'` for all events\n * @param {Function} handler Function to call in response to given event\n * @memberOf mitt\n */\n on<Key extends keyof Events>(type: Key, handler: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type)\n if (handlers) {\n handlers.push(handler)\n }\n else {\n all!.set(type, [handler] as EventHandlerList<Events[keyof Events]>)\n }\n },\n\n /**\n * Remove an event handler for the given type.\n * If `handler` is omitted, all handlers of the given type are removed.\n * @param {string|symbol} type Type of event to unregister `handler` from (`'*'` to remove a wildcard handler)\n * @param {Function} [handler] Handler function to remove\n * @memberOf mitt\n */\n off<Key extends keyof Events>(type: Key, handler?: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type)\n if (handlers) {\n if (handler) {\n handlers.splice(handlers.indexOf(handler) >>> 0, 1)\n }\n else {\n all!.set(type, [])\n }\n }\n },\n\n /**\n * Invoke all handlers for the given type.\n * If present, `'*'` handlers are invoked after type-matched handlers.\n *\n * Note: Manually firing '*' handlers is not supported.\n *\n * @param {string|symbol} type The event type to invoke\n * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n * @memberOf mitt\n */\n emit<Key extends keyof Events>(type: Key, evt?: Events[Key]) {\n let handlers = all!.get(type)\n if (handlers) {\n [...(handlers as EventHandlerList<Events[keyof Events]>)].map((handler) => {\n handler(evt!)\n })\n }\n\n handlers = all!.get('*')\n if (handlers) {\n [...(handlers as WildCardEventHandlerList<Events>)].map((handler) => {\n handler(type, evt!)\n })\n }\n },\n }\n}\n","import { useEffect, useMemo } from 'react'\n\nimport { proxy, useSnapshot } from 'valtio'\n\nimport en from './en'\nimport vi from './vi'\nimport zh_CN from './zh-cn'\nimport mitt from '@/utils/mitt'\nimport type { EventType } from '@/utils/mitt'\nimport { DEFAULT_LANG_VALUE } from '@/constants'\n\n// Define supported language types\ntype LanguageType = 'en' | 'vi' | 'zh_CN' | string\n\n// Define message key types based on the 'en' locale\ntype MessageKeysType = keyof typeof en\n\n// Interface for locale configuration\ninterface LocaleInterface {\n lang: LanguageType\n message: Record<LanguageType, Record<MessageKeysType, string>>\n}\n\n// Interface for Mitt events\ninterface MittEvents extends Record<EventType, unknown> {\n lang: LanguageType\n}\n\n// Default locale configuration\nexport const DEFAULT_LOCALE: LocaleInterface = {\n lang: DEFAULT_LANG_VALUE,\n message: {\n en,\n vi,\n zh_CN,\n },\n}\n\nclass Locale {\n private emitter\n constructor() {\n this.emitter = mitt<MittEvents>()\n }\n\n // Getter and setter for current language\n get lang(): LanguageType {\n return DEFAULT_LOCALE.lang\n }\n\n set lang(lang: LanguageType) {\n if (!this.isLangSupported(lang)) {\n console.warn(\n `Can't find the current language \"${lang}\", Using language \"${DEFAULT_LOCALE.lang}\" by default`,\n )\n return\n }\n\n DEFAULT_LOCALE.lang = lang\n this.emitter.emit('lang', lang)\n }\n\n // Getter and setter for messages\n get message(): Record<LanguageType, Record<MessageKeysType, string>> {\n return DEFAULT_LOCALE.message\n }\n\n set message(message: Record<LanguageType, Record<MessageKeysType, string>>) {\n DEFAULT_LOCALE.message = message\n }\n\n // Load messages for a specific language\n loadLangMessage(lang: LanguageType): Record<MessageKeysType, string> {\n return this.message[lang]\n }\n\n // Check if a language is supported\n private isLangSupported(lang: LanguageType): boolean {\n const supportedLangs = Object.keys(this.message) as LanguageType[]\n return supportedLangs.includes(lang)\n }\n\n // Set the current language\n public setLang(lang: LanguageType) {\n this.lang = lang\n }\n\n // Register a language change watcher\n public registerWatchLang(hook: (lang: LanguageType) => void) {\n this.emitter.on('lang', hook)\n\n const unsubscribe = () => {\n this.emitter.off('lang', hook)\n }\n\n return {\n unsubscribe,\n }\n }\n\n // Set messages for a specific language\n public setMessage(lang: string, message: Record<MessageKeysType, string>) {\n this.message[lang] = message\n }\n\n // Build a translation function for a given language\n buildLocalesHandler(lang?: LanguageType) {\n if (!lang) {\n lang = this.lang\n }\n\n const message = this.loadLangMessage(lang)\n\n return function t(path: MessageKeysType) {\n return message[path] || path\n }\n }\n}\n\nconst locale = new Locale()\n\n// Proxy for reactive language state\nconst atomLang = proxy({\n lang: DEFAULT_LOCALE.lang,\n})\n\nfunction useLocale() {\n const atomLangSnap = useSnapshot(atomLang)\n\n const t = useMemo(() => {\n return locale.buildLocalesHandler(atomLangSnap.lang)\n }, [atomLangSnap.lang])\n\n useEffect(() => {\n const watchLang = locale.registerWatchLang((val) => {\n atomLang.lang = val\n })\n\n return () => {\n watchLang.unsubscribe()\n }\n }, [])\n\n return {\n lang: atomLangSnap.lang,\n t,\n }\n}\n\nconst localeActions = {\n t: (path: MessageKeysType) => {\n return locale.buildLocalesHandler(atomLang.lang)(path)\n },\n}\n\nexport default locale\nexport { Locale, useLocale, localeActions }\n\nexport { default as en } from './en'\nexport { default as vi } from './vi'\nexport { default as zh_CN } from './zh-cn'\n","import React, { useEffect, useState } from 'react'\n\nimport { Plus } from 'lucide-react'\nimport { HexColorPicker } from 'react-colorful'\n\nimport { Button, Input, Popover, PopoverContent, PopoverTrigger, Separator } from '@/components'\nimport { COLORS_LIST, DEFAULT_COLOR } from '@/constants'\nimport { useLocale } from '@/locales'\n\nexport interface ColorPickerProps {\n highlight?: boolean\n disabled?: boolean\n children: React.ReactNode\n onChange?: (color: string | undefined) => void\n setSelectedColor?: (color: string | undefined) => void\n selectedColor?: string\n}\n\nconst colorsArray = COLORS_LIST\nconst chunkedColors: string[][] = []\nfor (let i = 0; i < colorsArray.length; i += 10) {\n chunkedColors.push(colorsArray.slice(i, i + 10))\n}\n\ninterface AddMoreColorProps {\n setColor: (color: string) => void\n}\n\nfunction AddMoreColor({ setColor }: AddMoreColorProps) {\n const [colorMore, setColorMore] = useState('#000000')\n const [openColorMore, setOpenColorMore] = useState(false)\n const { t } = useLocale()\n\n useEffect(() => {\n return () => {\n setOpenColorMore(false)\n }\n }, [])\n\n return (\n <Popover open={openColorMore}>\n <PopoverTrigger asChild>\n <div\n onClick={(e) => {\n e.preventDefault()\n setOpenColorMore(true)\n }}\n className=\"text-sm hover:cursor-pointer hover:bg-accent py-1.5 px-1.5\"\n >\n {t('editor.color.more')}\n ...\n </div>\n </PopoverTrigger>\n <PopoverContent>\n <div className=\"flex flex-col items-center justify-center\">\n <HexColorPicker color={colorMore} onChange={setColorMore} />\n\n <Input\n className=\"mt-[8px] w-full\"\n type=\"text\"\n onChange={(e) => {\n e.preventDefault()\n setColorMore(`#${e.target.value}`)\n }}\n value={colorMore.slice(1)}\n />\n </div>\n\n <Separator className=\"my-[10px]\" />\n <Button\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault()\n setColor(colorMore)\n setOpenColorMore(false)\n }}\n className=\"w-full\"\n >\n <Plus size={16} />\n </Button>\n </PopoverContent>\n </Popover>\n )\n}\n\nfunction ColorPicker(props: ColorPickerProps) {\n const { t } = useLocale()\n\n const { highlight = false, disabled = false, selectedColor, setSelectedColor, onChange } = props\n\n const [recentColorsStore, setRecentColorsStore] = useState<string[]>([])\n\n const setRecentColor = (color: string) => {\n const newRecentColors = [...recentColorsStore]\n const index = newRecentColors.indexOf(color)\n if (index !== -1) {\n newRecentColors.splice(index, 1)\n }\n newRecentColors.unshift(color)\n if (newRecentColors.length > 10) {\n newRecentColors.pop()\n }\n setRecentColorsStore(newRecentColors)\n }\n\n function setColor(color: string | undefined) {\n if (color === undefined) {\n // clear color\n setSelectedColor?.(color)\n onChange?.(color)\n return\n }\n // check if color is correct\n // eslint-disable-next-line regexp/no-unused-capturing-group\n const isCorrectColor = /^#([\\da-f]{3}){1,2}$/i.test(color)\n if (isCorrectColor) {\n setSelectedColor?.(color)\n onChange?.(color)\n setRecentColor(color)\n }\n }\n\n return (\n <Popover>\n <PopoverTrigger disabled={disabled} asChild>{props?.children}</PopoverTrigger>\n\n <PopoverContent hideWhenDetached className=\"w-full h-full p-2\" align=\"start\" side=\"bottom\">\n <div className=\"flex flex-col\">\n {highlight\n ? (\n <div\n className=\"flex items-center p-1 cursor-pointer rd-1 hover:bg-accent\"\n onClick={() => setColor(undefined)}\n >\n <span className=\"w-6 h-6 p-0.5 inline-block rounded-sm border cursor-pointer hover:border-border hover:shadow-sm relative after:border-b-2 after:border-b-red-500 after:top-[10px] after:h-0 after:left-0 after:w-6 after:absolute after:block after:rotate-[45deg]\">\n <span\n style={{\n backgroundColor: 'transparent',\n }}\n >\n <svg\n viewBox=\"0 0 18 18\"\n style={{\n fill: 'rgba(0, 0, 0, 0.4)',\n display: 'none',\n }}\n >\n <path d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"></path>\n </svg>\n </span>\n </span>\n <span className=\"ml-1 text-sm\">{t('editor.nofill')}</span>\n </div>\n )\n : (\n <>\n <div\n className=\"flex items-center p-1 cursor-pointer rd-1 hover:bg-accent\"\n onClick={() => {\n setColor(undefined)\n }}\n >\n <span className=\"w-6 h-6 p-0.5 inline-block rounded-sm border border-transparent cursor-pointer\">\n <span\n style={{\n backgroundColor: DEFAULT_COLOR,\n }}\n className=\"relative w-[18px] h-[18px] block rounded-[2px] border-transparent\"\n >\n <svg\n viewBox=\"0 0 18 18\"\n style={{\n fill: 'rgb(255, 255, 255)',\n display: 'none',\n }}\n >\n <path d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"></path>\n </svg>\n </span>\n </span>\n <span className=\"ml-1 text-sm\">{t('editor.default')}</span>\n </div>\n </>\n )}\n\n {chunkedColors.map((items: string[], index: number) => {\n return (\n <span className=\"relative flex w-full h-auto p-0 last:pb-2\" key={index}>\n {items.map((item: string, idx) => {\n return (\n <span\n className=\"w-6 h-6 p-0.5 inline-block rounded-sm border border-transparent flex-[0 0 auto] cursor-pointer hover:border-border hover:shadow-sm\"\n key={`sub-color-${idx}`}\n onClick={() => setColor(item)}\n >\n <span\n style={{\n backgroundColor: item,\n }}\n className=\"relative w-[18px] h-[18px] block rounded-[2px] border-transparent\"\n >\n {item === selectedColor\n ? (\n <svg\n className=\"absolute top-[-1px] left-[1px] w-3 h-3\"\n viewBox=\"0 0 18 18\"\n style={{\n fill: 'rgb(255, 255, 255)',\n display: 'block',\n }}\n >\n <path d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"></path>\n </svg>\n )\n : (\n <svg\n viewBox=\"0 0 18 18\"\n style={{\n fill: 'rgb(255, 255, 255)',\n display: 'none',\n }}\n >\n <path d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"></path>\n </svg>\n )}\n </span>\n </span>\n )\n })}\n </span>\n )\n })}\n\n <div>\n <div className=\"my-1 text-sm\">{t('editor.recent')}</div>\n <span className=\"relative flex w-full h-auto p-0 last:pb-2\">\n {recentColorsStore?.map((item, index) => {\n return (\n <span\n className=\"w-6 h-6 p-0.5 inline-block rounded-sm border border-transparent flex-[0 0 auto] cursor-pointer hover:border-border hover:shadow-sm\"\n key={index}\n onClick={() => setColor(item)}\n >\n <span\n className=\"relative w-[18px] h-[18px] block rounded-[2px] border-transparent\"\n style={{\n backgroundColor: item,\n }}\n >\n <svg\n viewBox=\"0 0 18 18\"\n style={{\n fill: 'rgb(255, 255, 255)',\n display: 'none',\n }}\n >\n <path d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"></path>\n </svg>\n </span>\n </span>\n )\n })}\n </span>\n </div>\n\n <AddMoreColor setColor={setColor} />\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport { ColorPicker }\n","import { proxy, useSnapshot } from 'valtio'\n\nconst themeProxy = proxy({\n theme: 'light',\n})\n\nexport function useTheme() {\n const themeSnapshot = useSnapshot(themeProxy)\n\n return themeSnapshot.theme\n}\n\nexport const themeActions = {\n setTheme: (theme: string) => {\n themeProxy.theme = theme\n },\n}\n","import type { Editor } from '@tiptap/core'\n\nexport function clamp(val: number, min: number, max: number) {\n if (val < min) {\n return min\n }\n if (val > max) {\n return max\n }\n return val\n}\n\nexport const isNumber = (value: unknown): value is number => typeof value === 'number'\n\nexport const isString = (value: unknown): value is string => typeof value === 'string'\n\nexport const isBoolean = (value: unknown): value is boolean => typeof value === 'boolean'\n\nexport const isFunction = (value: unknown): boolean => typeof value === 'function'\n\nexport function getCssUnitWithDefault(value?: string | number, defaultUnit: string = 'px') {\n if (!value)\n return value\n\n const stringValue = isNumber(value) ? String(value) : value\n\n const num = Number.parseFloat(stringValue)\n const unitMatch = stringValue.match(/[a-z%]+$/i)\n const unit = unitMatch ? unitMatch[0] : defaultUnit\n\n return Number.isNaN(num) ? value : num + unit\n}\n\n/**\n * Checks if the editor has a specific extension method with the given name.\n *\n * @param {Editor} editor - An instance of the editor.\n * @param {string} name - The name of the extension method.\n * @returns {boolean} - Returns true if the specified extension method is present, otherwise returns false.\n */\nexport function hasExtension(editor: Editor, name: string): boolean {\n if (!editor) {\n return false\n }\n\n // Retrieve the extension manager of the editor, defaulting to an empty array if it doesn't exist\n const { extensions = [] } = editor?.extensionManager ?? {}\n\n // Check if the extension method with the specified name is present in the extension manager\n const find = extensions.find(i => i.name === name)\n\n // Return false if the extension method with the specified name is not found, otherwise return true\n if (!find) {\n return false\n }\n return true\n}\n\nexport { differenceBy, isEqual, throttle, truncate } from 'lodash-unified'\n","/* eslint-disable react/no-unstable-default-props */\nimport { forwardRef, useEffect, useImperativeHandle, useMemo } from 'react'\n\nimport type { AnyExtension, Editor as CoreEditor } from '@tiptap/core'\nimport type { UseEditorOptions } from '@tiptap/react'\nimport { EditorContent, useEditor } from '@tiptap/react'\nimport { differenceBy, throttle } from 'lodash-unified'\n\nimport type { BubbleMenuProps } from '@/types'\nimport { BubbleMenu, Toolbar, TooltipProvider } from '@/components'\nimport { EDITOR_UPDATE_WATCH_THROTTLE_WAIT_TIME } from '@/constants'\nimport { useLocale } from '@/locales'\nimport { themeActions } from '@/theme/theme'\nimport { hasExtension } from '@/utils/utils'\n\nimport '../styles/index.scss'\n\ninterface IPropsRichTextEditor {\n content: string\n extensions: AnyExtension[]\n\n output: 'html' | 'json' | 'text'\n modelValue?: string | object\n dark?: boolean\n dense?: boolean\n disabled?: boolean\n label?: string\n hideToolbar?: boolean\n disableBubble?: boolean\n hideBubble?: boolean\n removeDefaultWrapper?: boolean\n maxWidth?: string | number\n minHeight?: string | number\n maxHeight?: string | number\n editorClass?: string | string[] | Record<string, any>\n contentClass?: string | string[] | Record<string, any>\n onChangeContent?: (val: any) => void\n bubbleMenu?: BubbleMenuProps\n\n useEditorOptions?: UseEditorOptions\n}\n\nfunction RichTextEditor(props: IPropsRichTextEditor, ref: any) {\n const { content, extensions, useEditorOptions = {} } = props\n const { t } = useLocale()\n\n const sortExtensions = useMemo(() => {\n const diff = differenceBy(extensions, extensions, 'name')\n const exts = extensions.map((k: any) => {\n const find = extensions.find((ext: any) => ext.name === k.name)\n if (!find) {\n return k\n }\n return k.configure(find.options)\n })\n return [...exts, ...diff].map((k, i) => k.configure({ sort: i }))\n }, [extensions])\n\n const onValueChange = throttle((editor) => {\n const output = getOutput(editor, props.output as any)\n\n props?.onChangeContent?.(output as any)\n }, EDITOR_UPDATE_WATCH_THROTTLE_WAIT_TIME)\n\n const editor = useEditor({\n extensions: sortExtensions,\n content,\n onUpdate: ({ editor }) => {\n if (onValueChange)\n onValueChange(editor)\n },\n ...useEditorOptions,\n })\n\n useImperativeHandle(ref, () => {\n return {\n editor,\n }\n })\n\n useEffect(() => {\n document.body.classList.toggle('dark', props.dark)\n themeActions.setTheme(props.dark ? 'dark' : 'light')\n }, [props.dark])\n\n useEffect(() => {\n editor?.setEditable(!props?.disabled)\n }, [editor, props?.disabled])\n\n function getOutput(editor: CoreEditor, output: IPropsRichTextEditor['output']) {\n if (props?.removeDefaultWrapper) {\n if (output === 'html') {\n return editor.isEmpty ? '' : editor.getHTML()\n }\n if (output === 'json') {\n return editor.isEmpty ? {} : editor.getJSON()\n }\n if (output === 'text') {\n return editor.isEmpty ? '' : editor.getText()\n }\n return ''\n }\n\n if (output === 'html') {\n return editor.getHTML()\n }\n if (output === 'json') {\n return editor.getJSON()\n }\n if (output === 'text') {\n return editor.getText()\n }\n return ''\n }\n\n useEffect(() => {\n return () => {\n editor?.destroy?.()\n }\n }, [])\n\n const hasExtensionValue = hasExtension(editor as any, 'characterCount')\n\n if (!editor) {\n return <></>\n }\n\n return (\n <TooltipProvider delayDuration={0}>\n <div className=\"reactjs-tiptap-editor rounded-[0.5rem] bg-background shadow overflow-hidden outline outline-1\">\n {!props?.hideBubble && <BubbleMenu bubbleMenu={props?.bubbleMenu} editor={editor} disabled={props?.disabled} />}\n\n <div className=\"flex flex-col w-full max-h-full\">\n {!props?.hideToolbar && <Toolbar editor={editor} disabled={!!props?.disabled} />}\n\n <EditorContent className={`relative ${props?.contentClass || ''}`} editor={editor} />\n\n <div className=\"flex items-center justify-between p-3 border-t\">\n {hasExtensionValue && (\n <div className=\"flex flex-col\">\n <div className=\"flex justify-end gap-3 text-sm\">\n <span>\n {(editor as any).storage.characterCount.characters()}\n {' '}\n {t('editor.characters')}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </TooltipProvider>\n )\n}\n\nexport default forwardRef(RichTextEditor)\n","import React, { useMemo } from 'react'\nimport type { Editor } from '@tiptap/core'\n\nimport { Separator } from '@/components'\nimport { useLocale } from '@/locales'\nimport { isFunction } from '@/utils/utils'\n\nexport interface ToolbarProps {\n editor: Editor\n disabled?: boolean\n}\n\ninterface ToolbarItemProps {\n button: {\n component: React.ComponentType<any>\n componentProps: Record<string, any>\n }\n divider: boolean\n spacer: boolean\n}\n\nfunction Toolbar({ editor, disabled }: ToolbarProps) {\n const { t, lang } = useLocale()\n\n const items = useMemo(() => {\n const extensions = [...editor.extensionManager.extensions]\n const sortExtensions = extensions.sort((arr, acc) => {\n const a = (arr.options).sort ?? -1\n const b = (acc.options).sort ?? -1\n return a - b\n })\n\n let menus: ToolbarItemProps[] = []\n\n for (const extension of sortExtensions) {\n const { button, divider = false, spacer = false, toolbar = true } = extension.options as any\n if (!button || !isFunction(button) || !toolbar) {\n continue\n }\n\n const _button: ToolbarItemProps['button'] | ToolbarItemProps['button'][] = button({\n editor,\n extension,\n t,\n })\n\n if (Array.isArray(_button)) {\n const menu: ToolbarItemProps[] = _button.map((k, i) => ({\n button: k,\n divider: i === _button.length - 1 ? divider : false,\n spacer: i === 0 ? spacer : false,\n }))\n menus = [...menus, ...menu]\n continue\n }\n\n menus.push({ button: _button, divider, spacer })\n }\n return menus\n }, [editor, t, lang])\n\n return (\n <div\n className=\"px-1 py-2 border-b\"\n style={{\n pointerEvents: disabled ? 'none' : 'auto',\n opacity: disabled ? 0.5 : 1,\n }}\n >\n <div className=\"relative flex flex-wrap h-auto gap-y-1 gap-x-1\">\n {items.map((item: ToolbarItemProps, key) => {\n const ButtonComponent = item.button.component\n\n return (\n <div className=\"flex items-center\" key={key}>\n {item?.spacer && <Separator orientation=\"vertical\" className=\"h-[16px] mx-[10px]\" />}\n\n <ButtonComponent\n {...item.button.componentProps}\n disabled={disabled || item?.button?.componentProps?.disabled}\n />\n\n {item?.divider && <Separator orientation=\"vertical\" className=\"h-auto mx-2\" />}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nexport { Toolbar }\n","import type { SVGProps } from 'react'\n\nexport function AspectRatio(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M19 12h-2v3h-3v2h5zM7 9h3V7H5v5h2zm14-6H3a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2m0 16H3V5h18z\"\n >\n </path>\n </svg>\n )\n}\n","import type { SVGProps } from 'react'\n\nexport function BlockquoteLeft(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M6 15h15m0 4H6m9-8h6m0-4h-6M9 9h1a1 1 0 1 1-1 1V7.5a2 2 0 0 1 2-2M3 9h1a1 1 0 1 1-1 1V7.5a2 2 0 0 1 2-2\"\n >\n </path>\n </svg>\n )\n}\n","function DeleteColumn() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n aria-hidden=\"true\"\n role=\"img\"\n className=\"w-4 h-4 iconify iconify--hugeicons\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M5.5 3c1.404 0 2.107 0 2.611.38c.219.164.406.375.552.62C9 4.568 9 5.358 9 6.938v10.125c0 1.58 0 2.37-.337 2.937a2.1 2.1 0 0 1-.552.621c-.504.38-1.207.38-2.611.38s-2.107 0-2.611-.38a2.1 2.1 0 0 1-.552-.62C2 19.432 2 18.642 2 17.062V6.938c0-1.58 0-2.37.337-2.938a2.1 2.1 0 0 1 .552-.62C3.393 3 4.096 3 5.5 3M20 11.938v5.124c0 1.58 0 2.37-.337 2.938a2.1 2.1 0 0 1-.552.62c-.504.38-1.207.38-2.611.38s-2.107 0-2.611-.38a2.1 2.1 0 0 1-.552-.62C13 19.433 13 18.642 13 17.063V6.938c0-1.58 0-2.37.337-2.938M22 9l-6-6m6 0l-6 6\"\n color=\"currentColor\"\n />\n </svg>\n )\n}\n\nexport { DeleteColumn }\n","function DeleteRow() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n aria-hidden=\"true\"\n role=\"img\"\n className=\"w-4 h-4 iconify iconify--hugeicons\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M21 18.5c0 1.404 0 2.107-.38 2.611a2.1 2.1 0 0 1-.62.552c-.567.337-1.358.337-2.937.337H6.938c-1.58 0-2.37 0-2.938-.337a2.1 2.1 0 0 1-.62-.552C3 20.607 3 19.904 3 18.5s0-2.107.38-2.611c.163-.218.374-.406.62-.552C4.567 15 5.357 15 6.938 15h10.125c1.58 0 2.37 0 2.937.337c.246.146.457.334.62.552c.38.504.38 1.207.38 2.611M12.063 4H6.937C5.358 4 4.568 4 4 4.337a2.1 2.1 0 0 0-.62.552C3 5.393 3 6.096 3 7.5s0 2.107.38 2.611c.163.218.374.406.62.552C4.567 11 5.357 11 6.938 11h10.125c1.58 0 2.37 0 2.937-.337M21 8l-6-6m6 0l-6 6\"\n color=\"currentColor\"\n />\n </svg>\n )\n}\n\nexport { DeleteRow }\n","import type { SVGProps } from 'react'\n\nexport function FileWordOutline(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M14 2H6a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h12c1.11 0 2-.89 2-2V8zm4 18H6V4h7v5h5zm-.65-10l-2.1 9h-1.4l-1.8-6.79l-1.8 6.79h-1.4l-2.2-9h1.5l1.4 6.81l1.8-6.81h1.3l1.8 6.81l1.4-6.81z\"\n >\n </path>\n </svg>\n )\n}\n","import React from 'react'\nimport { icons } from '@/components'\n\nexport interface IconComponentProps {\n name: string\n className?: string\n onClick?: React.MouseEventHandler<SVGElement>\n}\n\nfunction IconComponent(props: IconComponentProps) {\n const Icon = icons[props.name]\n\n return Icon ? <Icon onClick={props?.onClick} className={`w-4 h-4 ${props?.className || ''}`} /> : null\n}\n\nexport { IconComponent }\n","import type { SVGProps } from 'react'\n\nexport function FormatLineHeight(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M21 22H3v-2h18zm0-18H3V2h18zm-11 9.7h4l-2-5.4zM11.2 6h1.7l4.7 12h-2l-.9-2.6H9.4L8.5 18h-2z\"\n >\n </path>\n </svg>\n )\n}\n","import type { SVGProps } from 'react'\n\nexport function MenuDown(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n aria-hidden=\"true\"\n role=\"img\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 48 48\"\n {...props}\n >\n <path\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth={4}\n d=\"M36 19L24 31L12 19z\"\n />\n </svg>\n )\n}\n","import type { SVGProps } from 'react'\n\nexport function SizeL(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path fill=\"currentColor\" d=\"M9 7v10h6v-2h-4V7z\"></path>\n </svg>\n )\n}\n","import type { SVGProps } from 'react'\n\nexport function SizeM(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M9 7c-1.1 0-2 .9-2 2v8h2V9h2v7h2V9h2v8h2V9a2 2 0 0 0-2-2z\"\n >\n </path>\n </svg>\n )\n}\n","import type { SVGProps } from 'react'\n\nexport function SizeS(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M11 7c-1.1 0-2 .9-2 2v2a2 2 0 0 0 2 2h2v2H9v2h4c1.11 0 2-.89 2-2v-2a2 2 0 0 0-2-2h-2V9h4V7z\"\n >\n </path>\n </svg>\n )\n}\n","import {\n BetweenHorizonalEnd,\n BetweenHorizonalStart,\n BetweenVerticalEnd,\n BetweenVerticalStart,\n Bold,\n ChevronDown,\n ChevronsUpDown,\n Clipboard,\n Code,\n CodeXml,\n Columns2,\n Columns3,\n Columns4,\n Copy,\n Eraser,\n Frame,\n GripVertical,\n Heading1,\n Heading2,\n Heading3,\n ImageUp,\n IndentDecrease,\n IndentIncrease,\n Italic,\n Link,\n List,\n ListOrdered,\n ListTodo,\n LoaderCircle,\n Maximize,\n Minimize,\n Minus,\n PaintRoller,\n PanelLeft,\n PanelRight,\n Pencil,\n Plus,\n Quote,\n Redo2,\n Replace,\n SmilePlus,\n Sparkles,\n Strikethrough,\n Subscript,\n Superscript,\n Table,\n TableCellsMerge,\n TableCellsSplit,\n Trash,\n Trash2,\n Type,\n Underline,\n Undo2,\n Unlink,\n Video,\n} from 'lucide-react'\nimport {\n TextAlignCenterIcon,\n TextAlignJustifyIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n} from '@radix-ui/react-icons'\nimport {\n AspectRatio,\n BlockquoteLeft,\n DeleteColumn,\n DeleteRow,\n FileWordOutline,\n FormatLineHeight,\n MenuDown,\n SizeL,\n SizeM,\n SizeS,\n} from '@/components/icons'\n\nexport const icons = {\n Bold,\n LoaderCircle,\n Italic,\n Underline,\n Quote,\n TextQuote: BlockquoteLeft,\n Strikethrough,\n Minus,\n Eraser,\n PaintRoller,\n Redo2,\n Undo2,\n AlignCenter: TextAlignCenterIcon,\n AlignJustify: TextAlignJustifyIcon,\n AlignLeft: TextAlignLeftIcon,\n AlignRight: TextAlignRightIcon,\n ChevronDown,\n Subscript,\n Superscript,\n Code,\n Code2: CodeXml,\n Type,\n IndentIncrease,\n IndentDecrease,\n List,\n ListOrdered,\n ListTodo,\n Link,\n ImageUp,\n Video,\n Maximize,\n Minimize,\n Table,\n Sparkles,\n Pencil,\n Unlink,\n BetweenHorizonalEnd,\n BetweenHorizonalStart,\n BetweenVerticalStart,\n BetweenVerticalEnd,\n TableCellsMerge,\n TableCellsSplit,\n Trash2,\n Trash,\n Replace,\n ChevronsUpDown,\n LineHeight: FormatLineHeight,\n Word: FileWordOutline,\n Heading1,\n Heading2,\n Heading3,\n Columns2,\n Columns3,\n Columns4,\n Plus,\n Grip: GripVertical,\n Copy,\n Clipboard,\n PanelLeft,\n PanelRight,\n Columns: Columns2,\n Iframe: Frame,\n\n MenuDown,\n SizeS,\n SizeM,\n SizeL,\n AspectRatio,\n\n Emoji: SmilePlus,\n\n DeleteColumn,\n DeleteRow,\n} as any\n","import { deleteSelection } from '@tiptap/pm/commands'\nimport type { Editor } from '@tiptap/react'\n\nimport { BUBBLE_TEXT_LIST, IMAGE_SIZE, VIDEO_SIZE } from '@/constants'\nimport type { ButtonViewParams, ButtonViewReturn, ExtensionNameKeys } from '@/types'\nimport { localeActions } from '@/locales'\nimport { ActionButton } from '@/components'\n\n/** Represents the size types for bubble images or videos */\ntype BubbleImageOrVideoSizeType = 'size-small' | 'size-medium' | 'size-large'\ntype ImageAlignments = 'left' | 'center' | 'right'\n\n/** Represents the various types for bubble images */\ntype BubbleImageType =\n | `image-${BubbleImageOrVideoSizeType}`\n | `video-${BubbleImageOrVideoSizeType}`\n | 'image'\n | 'image-aspect-ratio'\n | 'remove'\n\n/** Represents the types for bubble videos */\ntype BubbleVideoType = 'video' | 'remove'\n\n/** Represents the overall types for bubbles */\ntype BubbleAllType =\n | BubbleImageType\n | BubbleVideoType\n | ExtensionNameKeys\n | 'divider'\n | (string & {})\n\n/** Represents the key types for node types */\nexport type NodeTypeKey = 'image' | 'text' | 'video'\n\n/** Represents the menu of bubble types for each node type */\nexport type BubbleTypeMenu = Partial<Record<NodeTypeKey, BubbleMenuItem[]>>\n\n/** Represents the menu of overall bubble types for each node type */\nexport type NodeTypeMenu = Partial<Record<NodeTypeKey, BubbleAllType[]>>\n\n/**\n * Represents the structure of a bubble menu item.\n */\nexport interface BubbleMenuItem extends ButtonViewReturn {\n /** The type of the bubble item */\n type: BubbleAllType\n}\n\n/**\n * Represents a function to generate a bubble menu\n */\ninterface BubbleView<T = any> {\n /**\n * Generates a bubble menu based on the provided options.\n * @param {ButtonViewParams<T>} options - The options for generating the bubble menu.\n * @returns {BubbleTypeMenu} The generated bubble menu.\n */\n (options: ButtonViewParams<T>): BubbleTypeMenu\n}\n\n/**\n * Represents the options for configuring bubbles.\n * @interface BubbleOptions\n * @template T\n */\nexport interface BubbleOptions<T> {\n /** The menu of bubble types for each node type. */\n list: NodeTypeMenu\n /** The default list of bubble types. */\n defaultBubbleList: any\n /** The function to generate a bubble menu. */\n button: BubbleView<T>\n}\n\nfunction imageSizeMenus(editor: Editor): BubbleMenuItem[] {\n const types: BubbleImageOrVideoSizeType[] = ['size-small', 'size-medium', 'size-large']\n const icons: NonNullable<ButtonViewReturn['componentProps']['icon']>[] = [\n 'SizeS',\n 'SizeM',\n 'SizeL',\n ]\n\n return types.map((size, i) => ({\n type: `image-${size}`,\n component: ActionButton,\n componentProps: {\n tooltip: localeActions.t(`editor.${size.replace('-', '.')}.tooltip` as any),\n icon: icons[i],\n action: () => editor.commands.updateImage({ width: IMAGE_SIZE[size] }),\n isActive: () => editor.isActive('image', { width: IMAGE_SIZE[size] }),\n },\n }))\n}\n\nfunction imageAlignMenus(editor: Editor): BubbleMenuItem[] {\n const types: ImageAlignments[] = ['left', 'center', 'right']\n const iconMap: any = {\n left: 'AlignLeft',\n center: 'AlignCenter',\n right: 'AlignRight',\n }\n return types.map(k => ({\n type: `image-${k}`,\n component: ActionButton,\n componentProps: {\n tooltip: localeActions.t(`editor.textalign.${k}.tooltip`),\n icon: iconMap[k],\n action: () => editor.commands?.setTextAlign?.(k),\n isActive: () => editor.isActive({ textAlign: k }) || false,\n disabled: !editor.can()?.setTextAlign?.(k),\n },\n }))\n}\n\nfunction videoSizeMenus(editor: Editor): BubbleMenuItem[] {\n const types: BubbleImageOrVideoSizeType[] = ['size-small', 'size-medium', 'size-large']\n const icons: NonNullable<ButtonViewReturn['componentProps']['icon']>[] = [\n 'SizeS',\n 'SizeM',\n 'SizeL',\n ]\n\n return types.map((size, i) => ({\n type: `video-${size}`,\n component: ActionButton,\n componentProps: {\n tooltip: localeActions.t(`editor.${size.replace('-', '.')}.tooltip` as any),\n icon: icons[i],\n action: () => editor.commands.updateVideo({ width: VIDEO_SIZE[size] }),\n isActive: () => editor.isActive('video', { width: VIDEO_SIZE[size] }),\n },\n }))\n}\nexport function getBubbleImage(editor: Editor): BubbleMenuItem[] {\n return [\n ...imageSizeMenus(editor),\n ...imageAlignMenus(editor),\n {\n type: 'remove',\n component: ActionButton,\n componentProps: {\n editor,\n tooltip: localeActions.t('editor.remove'),\n icon: 'Trash2',\n action: () => {\n const { state, dispatch } = editor.view\n deleteSelection(state, dispatch)\n },\n },\n },\n ]\n}\n\nexport function getBubbleVideo(editor: Editor): BubbleMenuItem[] {\n return [\n ...videoSizeMenus(editor),\n {\n type: 'remove',\n component: ActionButton,\n componentProps: {\n editor,\n tooltip: localeActions.t('editor.remove'),\n icon: 'Trash2',\n action: () => {\n const { state, dispatch } = editor.view\n deleteSelection(state, dispatch)\n },\n },\n },\n ]\n}\n\n/**\n * Bubble menu text list\n */\nexport function getBubbleText(editor: Editor, t: any) {\n return BUBBLE_TEXT_LIST.reduce((acc, type) => {\n if (type === 'divider' && acc.length > 0) {\n return [...acc, {\n type: 'divider',\n component: undefined,\n componentProps: {},\n }]\n }\n\n const ext = editor.extensionManager.extensions.find(ext => ext.name === type)\n if (ext) {\n return [...acc, ext.configure().options.button({ editor, t, extension: ext })]\n }\n\n return acc\n }, [] as BubbleMenuItem[])\n}\n","/* eslint-disable no-restricted-syntax */\nimport type { Command, Editor } from '@tiptap/core'\nimport { isList } from '@tiptap/core'\nimport type { Transaction } from '@tiptap/pm/state'\nimport { AllSelection, TextSelection } from '@tiptap/pm/state'\n\nexport const enum IndentProps {\n max = 7,\n min = 0,\n\n more = 1,\n less = -1,\n}\n\nexport function clamp(val: number, min: number, max: number): number {\n if (val < min) {\n return min\n }\n if (val > max) {\n return max\n }\n return val\n}\nfunction updateIndentLevel(\n tr: Transaction,\n delta: number,\n types: string[],\n editor: Editor,\n): Transaction {\n const { doc, selection } = tr\n\n if (!doc || !selection) {\n return tr\n }\n\n if (!(selection instanceof TextSelection || selection instanceof AllSelection)) {\n return tr\n }\n\n const { from, to } = selection\n\n doc.nodesBetween(from, to, (node, pos) => {\n const nodeType = node.type\n\n if (types.includes(nodeType.name)) {\n tr = setNodeIndentMarkup(tr, pos, delta)\n return false\n }\n else if (isList(node.type.name, editor.extensionManager.extensions)) {\n return false\n }\n return true\n })\n\n return tr\n}\n\nexport function setNodeIndentMarkup(tr: Transaction, pos: number, delta: number): Transaction {\n if (!tr.doc) {\n return tr\n }\n\n const node = tr.doc.nodeAt(pos)\n if (!node) {\n return tr\n }\n\n const minIndent = IndentProps.min\n const maxIndent = IndentProps.max\n\n const indent = clamp((node.attrs.indent || 0) + delta, minIndent, maxIndent)\n\n if (indent === node.attrs.indent) {\n return tr\n }\n\n const nodeAttrs = {\n ...node.attrs,\n indent,\n }\n\n return tr.setNodeMarkup(pos, node.type, nodeAttrs, node.marks)\n}\n\nexport function createIndentCommand({ delta, types }: { delta: number, types: string[] }): Command {\n return ({ state, dispatch, editor }) => {\n const { selection } = state\n let { tr } = state\n tr = tr.setSelection(selection)\n tr = updateIndentLevel(tr, delta, types, editor)\n\n if (tr.docChanged) {\n if (dispatch)\n dispatch(tr)\n return true\n }\n\n return false\n }\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { Editor } from '@tiptap/core'\n\nimport type { Node } from '@tiptap/pm/model'\nimport type { NodeSelection } from '@tiptap/pm/state'\nimport { DragHandlePlugin, dragHandlePluginDefaultKey } from 'echo-drag-handle-plugin'\n\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n IconComponent,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@/components'\nimport { useLocale } from '@/locales'\nimport { IndentProps, setNodeIndentMarkup } from '@/utils/indent'\n\nexport interface ContentMenuProps {\n editor: Editor\n disabled?: boolean\n className?: string\n pluginKey?: string\n}\n\nfunction ContentMenu(props: ContentMenuProps) {\n const { pluginKey = dragHandlePluginDefaultKey } = props\n const { t } = useLocale()\n const [currentNode, setCurrentNode] = useState<Node | null>(null)\n const [currentNodePos, setCurrentNodePos] = useState(-1)\n const dragElement = useRef(null)\n const pluginRef = useRef<any | null>(null)\n const [menuOpen, setMenuOpen] = useState(false)\n\n const hasTextAlignExtension = props.editor.extensionManager.extensions.some(ext => ext.name === 'textAlign')\n const hasIndentExtension = props.editor.extensionManager.extensions.some(ext => ext.name === 'indent')\n const hasClearExtension = props.editor.extensionManager.extensions.some(ext => ext.name === 'clear')\n\n useEffect(() => {\n if (dragElement.current && !props.editor.isDestroyed) {\n pluginRef.current = DragHandlePlugin({\n editor: props.editor,\n element: dragElement.current,\n pluginKey: 'ContentItemMenu',\n tippyOptions: {\n offset: [-2, 16],\n zIndex: 99,\n moveTransition: 'transform 0.15s ease-out',\n },\n onNodeChange: handleNodeChange,\n })\n\n props.editor.registerPlugin(pluginRef.current)\n }\n }, [props.editor, dragElement])\n\n function resetTextFormatting() {\n const chain = props.editor.chain()\n chain.setNodeSelection(currentNodePos).unsetAllMarks()\n if (currentNode?.type.name !== 'paragraph') {\n chain.setParagraph()\n }\n chain.run()\n }\n function copyNodeToClipboard() {\n props.editor.chain().focus().setNodeSelection(currentNodePos).run()\n document.execCommand('copy')\n }\n function duplicateNode() {\n props.editor.commands.setNodeSelection(currentNodePos)\n const { $anchor } = props.editor.state.selection\n const selectedNode = $anchor.node(1) || (props.editor.state.selection as NodeSelection).node\n props.editor\n .chain()\n .setMeta('hideDragHandle', true)\n .insertContentAt(currentNodePos + (currentNode?.nodeSize || 0), selectedNode.toJSON())\n .run()\n }\n function setTextAlign(alignments: string) {\n props.editor.commands.setTextAlign(alignments)\n }\n function increaseIndent() {\n const indentTr = setNodeIndentMarkup(props.editor.state.tr, currentNodePos, 1)\n indentTr.setMeta('hideDragHandle', true)\n if (props.editor.view.dispatch)\n props.editor.view.dispatch(indentTr)\n }\n function decreaseIndent() {\n const tr = setNodeIndentMarkup(props.editor.state.tr, currentNodePos, -1)\n if (props.editor.view.dispatch)\n props.editor.view.dispatch(tr)\n }\n\n function deleteNode() {\n props.editor\n .chain()\n .setMeta('hideDragHandle', true)\n .setNodeSelection(currentNodePos)\n .deleteSelection()\n .run()\n }\n\n function handleNodeChange(e: any) {\n if (e.node) {\n setCurrentNode(e.node)\n }\n setCurrentNodePos(e.pos)\n }\n\n function handleAdd() {\n if (currentNodePos !== -1) {\n const currentNodeSize = currentNode?.nodeSize || 0\n const insertPos = currentNodePos + currentNodeSize\n const currentNodeIsEmptyParagraph\n = currentNode?.type.name === 'paragraph' && currentNode?.content?.size === 0\n const focusPos = currentNodeIsEmptyParagraph ? currentNodePos + 2 : insertPos + 2\n props.editor\n .chain()\n .command(({ dispatch, tr, state }: any) => {\n if (dispatch) {\n if (currentNodeIsEmptyParagraph) {\n tr.insertText('/', currentNodePos, currentNodePos + 1)\n }\n else {\n tr.insert(\n insertPos,\n state.schema.nodes.paragraph.create(null, [state.schema.text('/')]),\n )\n }\n\n return dispatch(tr)\n }\n\n return true\n })\n .focus(focusPos)\n .run()\n }\n }\n\n useEffect(() => {\n if (menuOpen) {\n props.editor.commands.setMeta('lockDragHandle', true)\n }\n else {\n props.editor.commands.setMeta('lockDragHandle', false)\n }\n\n return () => {\n props.editor.commands.setMeta('lockDragHandle', false)\n }\n }, [menuOpen])\n\n useEffect(() => {\n return () => {\n if (pluginRef.current) {\n props.editor.unregisterPlugin(pluginKey)\n pluginRef.current = null\n }\n }\n }, [])\n\n useEffect(() => {\n if (props.editor?.isDestroyed && pluginRef.current) {\n props.editor.unregisterPlugin(pluginKey)\n pluginRef.current = null\n }\n }, [props.editor?.isDestroyed])\n\n const handleMenuOpenChange = (open: any) => {\n if (props?.disabled) {\n return\n }\n setMenuOpen(open)\n }\n\n return (\n <>\n <div\n className={\n `drag-handle [transition-property:top,_left] ease-in-out duration-200 ${props?.className}`\n }\n style={{\n opacity: props?.disabled ? 0 : 1,\n }}\n ref={dragElement}\n >\n <div className=\"flex items-center gap-0.5 [transition-property:top,_left] ease-in-out duration-200\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"w-7 h-7 cursor-grab\"\n disabled={props?.disabled}\n onClick={handleAdd}\n >\n <IconComponent name=\"Plus\" className=\"text-lg text-neutral-600 dark:text-neutral-200\" />\n </Button>\n <DropdownMenu open={menuOpen} onOpenChange={handleMenuOpenChange}>\n <div className=\"relative flex flex-col\">\n <Tooltip>\n <TooltipTrigger asChild disabled={props?.disabled}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"w-7 h-7 cursor-grab relative z-[1]\"\n disabled={props?.disabled}\n onMouseUp={() => {\n if (props?.disabled) {\n return\n }\n setMenuOpen(true)\n }}\n >\n <IconComponent name=\"Grip\" className=\"text-sm dark:text-neutral-200 text-neutral-600\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{t('editor.draghandle.tooltip')}</p>\n </TooltipContent>\n </Tooltip>\n\n <DropdownMenuTrigger className=\"absolute top-0 left-0 w-[28px] h-[28px] z-0\" />\n </div>\n\n <DropdownMenuContent className=\"w-48\" align=\"start\" side=\"bottom\" sideOffset={0}>\n <DropdownMenuItem\n onClick={deleteNode}\n className=\"flex gap-3 focus:text-red-500 focus:bg-red-400 hover:bg-red-400 dark:hover:text-red-500 bg-opacity-10 hover:bg-opacity-20 focus:bg-opacity-30 dark:hover:bg-opacity-20\"\n >\n <IconComponent name=\"Trash2\" />\n <span>{t('editor.remove')}</span>\n </DropdownMenuItem>\n\n {hasClearExtension\n ? (\n <DropdownMenuItem className=\"flex gap-3\" onClick={resetTextFormatting}>\n <IconComponent name=\"PaintRoller\" />\n <span>{t('editor.clear.tooltip')}</span>\n </DropdownMenuItem>\n )\n : null}\n\n <DropdownMenuItem className=\"flex gap-3\" onClick={copyNodeToClipboard}>\n <IconComponent name=\"Clipboard\" />\n <span>{t('editor.copyToClipboard')}</span>\n </DropdownMenuItem>\n <DropdownMenuItem className=\"flex gap-3\" onClick={duplicateNode}>\n <IconComponent name=\"Copy\" />\n <span>{t('editor.copy')}</span>\n </DropdownMenuItem>\n\n {hasTextAlignExtension || hasIndentExtension\n ? (\n <DropdownMenuSeparator />\n )\n : null}\n\n {hasTextAlignExtension\n ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"flex gap-3\">\n <IconComponent name=\"AlignCenter\" />\n <span>{t('editor.textalign.tooltip')}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n <DropdownMenuItem className=\"flex gap-3\" onClick={() => setTextAlign('left')}>\n <IconComponent name=\"AlignLeft\" />\n <span>{t('editor.textalign.left.tooltip')}</span>\n </DropdownMenuItem>\n <DropdownMenuItem className=\"flex gap-3\" onClick={() => setTextAlign('center')}>\n <IconComponent name=\"AlignCenter\" />\n <span>{t('editor.textalign.center.tooltip')}</span>\n </DropdownMenuItem>\n <DropdownMenuItem className=\"flex gap-3\" onClick={() => setTextAlign('right')}>\n <IconComponent name=\"AlignRight\" />\n <span>{t('editor.textalign.right.tooltip')}</span>\n </DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n )\n : null}\n\n {hasIndentExtension\n ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"flex gap-3\">\n <IconComponent name=\"IndentIncrease\" />\n <span>{t('editor.indent')}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n <DropdownMenuItem\n className=\"flex gap-3\"\n onClick={increaseIndent}\n disabled={currentNode?.attrs?.indent >= IndentProps.max}\n >\n <IconComponent name=\"IndentIncrease\" />\n <span>{t('editor.indent.tooltip')}</span>\n </DropdownMenuItem>\n\n <DropdownMenuItem\n className=\"flex gap-3\"\n onClick={decreaseIndent}\n disabled={currentNode?.attrs?.indent <= IndentProps.min}\n >\n <IconComponent name=\"IndentDecrease\" />\n <span>{t('editor.outdent.tooltip')}</span>\n </DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n )\n : null}\n\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n </>\n )\n}\n\nexport { ContentMenu }\n","import { useMemo } from 'react'\n\nimport type { Editor } from '@tiptap/core'\nimport { TextSelection } from '@tiptap/pm/state'\nimport { BubbleMenu } from '@tiptap/react'\n\nimport { Separator, getBubbleText } from '@/components'\nimport { useLocale } from '@/locales'\n\nexport interface BubbleMenuTextProps {\n editor: Editor\n disabled?: boolean\n}\n\nconst tippyOptions = {\n maxWidth: 'auto',\n zIndex: 20,\n appendTo: 'parent',\n moveTransition: 'transform 0.1s ease-out',\n}\n\nfunction ItemA({ item, disabled, editor }: any) {\n const Comp = item.component\n\n if (!Comp) {\n return <></>\n }\n\n return (\n <Comp\n {...item.componentProps}\n editor={editor}\n disabled={disabled || item?.componentProps?.disabled}\n />\n )\n}\n\nfunction BubbleMenuText(props: BubbleMenuTextProps) {\n const { t, lang } = useLocale()\n\n const shouldShow = ({ editor }: any) => {\n const { selection } = editor.view.state\n const { $from, to } = selection\n\n // check content select length is not empty\n if ($from.pos === to) {\n return false\n }\n\n return selection instanceof TextSelection\n }\n\n const items = useMemo(() => {\n if (props.disabled || !props?.editor) {\n return []\n }\n\n return getBubbleText(props.editor, t)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.disabled, props.editor, lang, t])\n\n return (\n <BubbleMenu shouldShow={shouldShow} editor={props?.editor} tippyOptions={tippyOptions as any}>\n {items?.length\n ? (\n <div className=\"w-auto px-3 py-2 transition-all border rounded-sm shadow-sm pointer-events-auto select-none border-neutral-200 dark:border-neutral-800 bg-background\">\n <div className=\"flex items-center gap-[4px] flex-nowrap whitespace-nowrap h-[26px] justify-start relative\">\n {items?.map((item: any, key: any) => {\n if (item?.type === 'divider') {\n return (\n <Separator\n key={`bubbleMenu-divider-${key}`}\n orientation=\"vertical\"\n className=\"mx-1 me-2 h-[16px]\"\n />\n )\n }\n\n return (\n <ItemA\n key={`bubbleMenu-text-${key}`}\n item={item}\n disabled={props.disabled}\n editor={props.editor}\n />\n )\n })}\n </div>\n </div>\n )\n : (\n <></>\n )}\n </BubbleMenu>\n )\n}\n\nexport { BubbleMenuText }\n","import React, { useCallback, useState } from 'react'\n\nimport type { TooltipContentProps } from '@radix-ui/react-tooltip'\nimport { debounce } from 'lodash-unified'\n\nimport { ActionButton, Button, ColorPicker } from '@/components'\nimport { IconComponent } from '@/components/icons'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\ninterface IPropsHighlightActionButton {\n editor: any\n tooltip?: string\n disabled?: boolean\n action?: ButtonViewReturnComponentProps['action']\n isActive?: ButtonViewReturnComponentProps['isActive']\n tooltipOptions?: TooltipContentProps\n shortcutKeys?: string[]\n}\n\nfunction IconC({ fill }: any) {\n return (\n <svg\n width=\"18px\"\n height=\"18px\"\n viewBox=\"0 0 256 256\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g id=\"icon/填充色\" stroke=\"none\" strokeWidth={1} fill=\"none\" fillRule=\"evenodd\">\n <g id=\"icon/背景颜色\">\n <g id=\"编组\" fill=\"currentColor\">\n <g\n transform=\"translate(119.502295, 137.878331) rotate(-135.000000) translate(-119.502295, -137.878331) translate(48.002295, 31.757731)\"\n id=\"矩形\"\n >\n <path\n d=\"M100.946943,60.8084699 L43.7469427,60.8084699 C37.2852111,60.8084699 32.0469427,66.0467383 32.0469427,72.5084699 L32.0469427,118.70847 C32.0469427,125.170201 37.2852111,130.40847 43.7469427,130.40847 L100.946943,130.40847 C107.408674,130.40847 112.646943,125.170201 112.646943,118.70847 L112.646943,72.5084699 C112.646943,66.0467383 107.408674,60.8084699 100.946943,60.8084699 Z M93.646,79.808 L93.646,111.408 L51.046,111.408 L51.046,79.808 L93.646,79.808 Z\"\n fillRule=\"nonzero\"\n />\n <path\n d=\"M87.9366521,16.90916 L87.9194966,68.2000001 C87.9183543,69.4147389 86.9334998,70.399264 85.7187607,70.4 L56.9423078,70.4 C55.7272813,70.4 54.7423078,69.4150264 54.7423078,68.2 L54.7423078,39.4621057 C54.7423078,37.2523513 55.5736632,35.1234748 57.0711706,33.4985176 L76.4832996,12.4342613 C78.9534987,9.75382857 83.1289108,9.5834005 85.8093436,12.0535996 C87.1658473,13.303709 87.9372691,15.0644715 87.9366521,16.90916 Z\"\n fillRule=\"evenodd\"\n />\n <path\n d=\"M131.3,111.241199 L11.7,111.241199 C5.23826843,111.241199 0,116.479467 0,122.941199 L0,200.541199 C0,207.002931 5.23826843,212.241199 11.7,212.241199 L131.3,212.241199 C137.761732,212.241199 143,207.002931 143,200.541199 L143,122.941199 C143,116.479467 137.761732,111.241199 131.3,111.241199 Z M124,130.241 L124,193.241 L19,193.241 L19,130.241 L124,130.241 Z\"\n fillRule=\"nonzero\"\n />\n </g>\n </g>\n <path\n d=\"M51,218 L205,218 C211.075132,218 216,222.924868 216,229 C216,235.075132 211.075132,240 205,240 L51,240 C44.9248678,240 40,235.075132 40,229 C40,222.924868 44.9248678,218 51,218 Z\"\n id=\"矩形\"\n fill={fill || '#FBDE28'}\n />\n </g>\n </g>\n </svg>\n )\n}\n\nfunction HighlightActionButton(props: IPropsHighlightActionButton) {\n // const { action, isActive, disabled, icon, tooltip } = props as any;\n const [selectedColor, setSelectedColor] = useState<any>(undefined)\n\n function onChange(color: string | undefined) {\n props.action?.(color)\n }\n\n function toggleColor() {\n props.action?.(selectedColor)\n }\n\n const setSelectedColorDebounce = useCallback(\n debounce((color: any) => {\n setSelectedColor(color)\n }, 350),\n [],\n )\n\n return (\n <div className=\"flex items-center h-[32px]\">\n <ActionButton\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n action={toggleColor}\n tooltipOptions={props?.tooltipOptions}\n shortcutKeys={props?.shortcutKeys}\n >\n <span className=\"flex items-center justify-center text-sm\">\n <IconC fill={selectedColor} />\n </span>\n </ActionButton>\n <ColorPicker\n selectedColor={selectedColor}\n setSelectedColor={setSelectedColorDebounce}\n onChange={onChange}\n highlight\n disabled={props?.disabled}\n >\n <Button variant=\"ghost\" size=\"icon\" className=\"w-3 h-[32px]\" disabled={props?.disabled}>\n <IconComponent className=\"w-3 h-3 text-zinc-500\" name=\"MenuDown\" />\n </Button>\n </ColorPicker>\n </div>\n )\n}\n\nexport default HighlightActionButton\n","import type { Editor } from '@tiptap/core'\nimport { isActive } from '@tiptap/core'\nimport { BubbleMenu } from '@tiptap/react'\nimport type { GetReferenceClientRect } from 'tippy.js'\nimport { sticky } from 'tippy.js'\n\nimport { ActionButton, Separator } from '@/components'\nimport HighlightActionButton from '@/extensions/Highlight/components/HighlightActionButton'\nimport { useLocale } from '@/locales'\n\nexport interface TableBubbleMenuProps {\n editor: Editor\n}\n\nfunction TableBubbleMenu({ editor }: TableBubbleMenuProps) {\n const shouldShow = ({ editor }: { editor: Editor }) => {\n return isActive(editor.view.state, 'table')\n }\n const { t } = useLocale()\n\n function onAddColumnBefore() {\n editor.chain().focus().addColumnBefore().run()\n }\n\n function onAddColumnAfter() {\n editor.chain().focus().addColumnAfter().run()\n }\n\n function onDeleteColumn() {\n editor.chain().focus().deleteColumn().run()\n }\n function onAddRowAbove() {\n editor.chain().focus().addRowBefore().run()\n }\n\n function onAddRowBelow() {\n editor.chain().focus().addRowAfter().run()\n }\n\n function onDeleteRow() {\n editor.chain().focus().deleteRow().run()\n }\n\n function onMergeCell() {\n editor.chain().focus().mergeCells().run()\n }\n function onSplitCell() {\n editor?.chain().focus().splitCell().run()\n }\n function onDeleteTable() {\n editor.chain().focus().deleteTable().run()\n }\n\n function onSetCellBackground(color: string) {\n editor.chain().focus().setTableCellBackground(color).run()\n }\n const getReferenceClientRect: GetReferenceClientRect = () => {\n const {\n view,\n state: {\n selection: { from },\n },\n } = editor\n\n const node = view.domAtPos(from).node as HTMLElement\n if (!node) {\n return new DOMRect(-1000, -1000, 0, 0)\n }\n\n const tableWrapper = node?.closest?.('.tableWrapper')\n if (!tableWrapper) {\n return new DOMRect(-1000, -1000, 0, 0)\n }\n\n const rect = tableWrapper.getBoundingClientRect()\n\n return rect\n }\n\n return (\n <BubbleMenu\n editor={editor}\n pluginKey=\"table\"\n shouldShow={shouldShow}\n updateDelay={0}\n tippyOptions={{\n offset: [0, 8],\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n maxWidth: 'auto',\n getReferenceClientRect,\n plugins: [sticky],\n sticky: 'popper',\n }}\n >\n <div className=\"min-w-32 flex flex-row h-full items-center leading-none gap-0.5 p-2 w-full bg-background rounded-lg shadow-sm border border-border\">\n <ActionButton\n icon=\"BetweenHorizonalEnd\"\n tooltip={t('editor.table.menu.insertColumnBefore')}\n action={onAddColumnBefore}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.addColumnBefore?.()}\n />\n <ActionButton\n icon=\"BetweenHorizonalStart\"\n tooltip={t('editor.table.menu.insertColumnAfter')}\n action={onAddColumnAfter}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.addColumnAfter?.()}\n />\n <ActionButton\n icon=\"DeleteColumn\"\n action={onDeleteColumn}\n tooltip={t('editor.table.menu.deleteColumn')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can().deleteColumn?.()}\n />\n <Separator orientation=\"vertical\" className=\"mx-1 me-2 h-[16px]\" />\n\n <ActionButton\n icon=\"BetweenVerticalEnd\"\n action={onAddRowAbove}\n tooltip={t('editor.table.menu.insertRowAbove')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can().addRowBefore?.()}\n />\n\n <ActionButton\n icon=\"BetweenVerticalStart\"\n action={onAddRowBelow}\n tooltip={t('editor.table.menu.insertRowBelow')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.addRowAfter?.()}\n />\n <ActionButton\n icon=\"DeleteRow\"\n action={onDeleteRow}\n tooltip={t('editor.table.menu.deleteRow')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.deleteRow?.()}\n />\n <Separator orientation=\"vertical\" className=\"mx-1 me-2 h-[16px]\" />\n <ActionButton\n icon=\"TableCellsMerge\"\n action={onMergeCell}\n tooltip={t('editor.table.menu.mergeCells')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.mergeCells?.()}\n />\n <ActionButton\n icon=\"TableCellsSplit\"\n action={onSplitCell}\n tooltip={t('editor.table.menu.splitCells')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.splitCell?.()}\n />\n <Separator orientation=\"vertical\" className=\"mx-1 me-2 h-[16px]\" />\n\n <HighlightActionButton\n editor={editor}\n tooltip={t('editor.table.menu.setCellsBgColor')}\n action={onSetCellBackground}\n tooltipOptions={{\n sideOffset: 15,\n }}\n />\n <ActionButton\n icon=\"Trash2\"\n tooltip={t('editor.table.menu.deleteTable')}\n action={onDeleteTable}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.deleteTable?.()}\n />\n </div>\n </BubbleMenu>\n )\n}\n\nexport { TableBubbleMenu }\n","import React, { useEffect, useState } from 'react'\n\nimport { Button, IconComponent, Input, Label, Switch } from '@/components'\nimport { useLocale } from '@/locales'\n\ninterface IPropsLinkEditBlock {\n editor: any\n onSetLink: (link: string, text?: string, openInNewTab?: boolean) => void\n}\n\nfunction LinkEditBlock(props: IPropsLinkEditBlock) {\n const { t } = useLocale()\n\n const [form, setForm] = useState({\n text: '',\n link: '',\n })\n const [openInNewTab, setOpenInNewTab] = useState<boolean>(false)\n\n useEffect(() => {\n if (props?.editor) {\n const { href: link, target } = props.editor?.getAttributes('link')\n\n const { from, to } = props.editor.state.selection\n const text = props.editor.state.doc.textBetween(from, to, ' ')\n setForm({\n link,\n text,\n })\n setOpenInNewTab(target === '_blank')\n }\n }, [props?.editor])\n\n function handleSubmit(event: any) {\n event.preventDefault()\n props?.onSetLink(form.link, form.text, openInNewTab)\n }\n\n return (\n <div className=\"p-2 bg-white border rounded-lg shadow-sm dark:bg-black border-neutral-200 dark:border-neutral-800\">\n <form className=\"flex flex-col gap-2\" onSubmit={handleSubmit}>\n <Label>\n {' '}\n {t('editor.link.dialog.text')}\n {' '}\n </Label>\n <div className=\"flex w-full max-w-sm items-center gap-1.5\">\n <div className=\"relative items-center w-full max-w-sm\">\n <Input\n type=\"text\"\n value={form.text}\n required\n className=\"w-80\"\n placeholder=\"Text\"\n onChange={e => setForm({ ...form, text: e.target.value })}\n />\n </div>\n </div>\n <Label>{t('editor.link.dialog.link')}</Label>\n <div className=\"flex w-full max-w-sm items-center gap-1.5\">\n <div className=\"relative items-center w-full max-w-sm\">\n <Input\n type=\"url\"\n value={form.link}\n required\n className=\"pl-10\"\n onChange={e => setForm({ ...form, link: e.target.value })}\n />\n <span className=\"absolute inset-y-0 flex items-center justify-center px-2 start-0\">\n <IconComponent className=\"size-5 text-muted-foreground\" name=\"Link\" />\n </span>\n </div>\n </div>\n <div className=\"flex items-center space-x-2\">\n <Label>{t('editor.link.dialog.openInNewTab')}</Label>\n <Switch\n checked={openInNewTab}\n onCheckedChange={(e) => {\n setOpenInNewTab(e)\n }}\n />\n </div>\n <Button type=\"submit\" className=\"self-end mt-2\">\n {t('editor.link.dialog.button.apply')}\n </Button>\n </form>\n </div>\n )\n}\n\nexport default LinkEditBlock\n","import React from 'react'\n\nimport { truncate } from 'lodash-unified'\n\nimport { ActionButton, Separator } from '@/components'\nimport { useLocale } from '@/locales'\n\ninterface IPropsLinkViewBlock {\n editor: any\n link: string\n onClear?: any\n onEdit?: any\n}\n\nfunction LinkViewBlock(props: IPropsLinkViewBlock) {\n const { t } = useLocale()\n\n return (\n <div className=\"flex items-center gap-2 p-2 bg-white border rounded-lg shadow-sm dark:bg-black border-neutral-200 dark:border-neutral-800\">\n <a\n href={props?.link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm underline break-all\"\n >\n {truncate(props?.link, {\n length: 50,\n omission: '…',\n })}\n </a>\n {props?.link && <Separator orientation=\"vertical\" className=\"h-4\" />}\n <div className=\"flex flex-nowrap\">\n <ActionButton\n icon=\"Pencil\"\n tooltip={t('editor.link.edit.tooltip')}\n action={() => {\n props?.onEdit()\n }}\n tooltipOptions={{ sideOffset: 15 }}\n />\n <ActionButton\n icon=\"Unlink\"\n tooltip={t('editor.link.unlink.tooltip')}\n action={() => {\n props?.onClear()\n }}\n tooltipOptions={{ sideOffset: 15 }}\n />\n </div>\n </div>\n )\n}\n\nexport default LinkViewBlock\n","import { useCallback, useMemo, useState } from 'react'\n\nimport type { Editor } from '@tiptap/react'\nimport { BubbleMenu } from '@tiptap/react'\n\nimport LinkEditBlock from '@/extensions/Link/components/LinkEditBlock'\nimport LinkViewBlock from '@/extensions/Link/components/LinkViewBlock'\n\nexport interface BubbleMenuLinkProps {\n editor: Editor\n disabled?: boolean\n}\n\nfunction BubbleMenuLink({ editor, disabled }: BubbleMenuLinkProps) {\n const [showEdit, setShowEdit] = useState(false)\n\n const link = useMemo(() => {\n const { href: link } = editor.getAttributes('link')\n return link as string\n }, [editor])\n\n const shouldShow = useCallback(({ editor }: { editor: Editor }) => {\n const isActive = editor.isActive('link')\n return isActive\n }, [])\n\n const onSetLink = (url: string, text?: string, openInNewTab?: boolean) => {\n editor\n .chain()\n .extendMarkRange('link')\n .insertContent({\n type: 'text',\n text,\n marks: [\n {\n type: 'link',\n attrs: {\n href: url,\n target: openInNewTab ? '_blank' : '',\n },\n },\n ],\n })\n .setLink({ href: url })\n .focus()\n .run()\n setShowEdit(false)\n }\n\n const unSetLink = useCallback(() => {\n editor.chain().extendMarkRange('link').unsetLink().focus().run()\n setShowEdit(false)\n }, [editor])\n\n return (\n <>\n <BubbleMenu\n editor={editor}\n shouldShow={shouldShow}\n tippyOptions={{\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n placement: 'bottom-start',\n offset: [-2, 16],\n zIndex: 9999,\n onHidden: () => {\n setShowEdit(false)\n },\n }}\n >\n {disabled\n ? (\n <></>\n )\n : (\n <>\n {showEdit\n ? (\n <LinkEditBlock onSetLink={onSetLink} editor={editor} />\n )\n : (\n <LinkViewBlock\n editor={editor}\n onClear={unSetLink}\n onEdit={() => {\n setShowEdit(true)\n }}\n link={link}\n />\n )}\n </>\n )}\n </BubbleMenu>\n </>\n )\n}\n\nexport { BubbleMenuLink }\n","import { Fragment, useMemo } from 'react'\n\nimport type { Editor } from '@tiptap/react'\nimport { BubbleMenu as BubbleMenuReact } from '@tiptap/react'\n\nimport { Separator, getBubbleImage, getBubbleVideo } from '@/components'\nimport { useLocale } from '@/locales'\n\ninterface IPropsBubbleMenu {\n editor: Editor\n disabled?: boolean\n}\n\nconst tippyOptions = {\n maxWidth: 'auto',\n zIndex: 20,\n appendTo: 'parent',\n moveTransition: 'transform 0.1s ease-out',\n}\n\nfunction ItemA({ item, disabled, editor }: any) {\n const Comp = item.component\n\n if (!Comp) {\n return <></>\n }\n\n return (\n <Fragment>\n {item.type === 'divider'\n ? (\n <Separator orientation=\"vertical\" className=\"mx-1 me-2 h-[16px]\" />\n )\n : (\n <>\n <Comp\n {...item.componentProps}\n editor={editor}\n disabled={disabled || item?.componentProps?.disabled}\n />\n </>\n )}\n </Fragment>\n )\n}\n\nfunction isImageNode(node: any) {\n return node.type.name === 'image'\n}\n\nfunction isVideoNode(node: any) {\n return node.type.name === 'video'\n}\n\nfunction BubbleMenuImage(props: IPropsBubbleMenu) {\n const { lang } = useLocale()\n\n const shouldShow = ({ editor }: any) => {\n const { selection } = editor.view.state\n const { $from, to } = selection\n let isImage = false\n\n editor.view.state.doc.nodesBetween($from.pos, to, (node: any) => {\n if (isImageNode(node)) {\n isImage = true\n return false // Stop iteration if an image is found\n }\n })\n\n return isImage\n }\n\n const items = useMemo(() => {\n if (props.disabled) {\n return []\n }\n return getBubbleImage(props.editor)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.disabled, props.editor, lang])\n\n return (\n <>\n <BubbleMenuReact\n shouldShow={shouldShow}\n editor={props?.editor}\n tippyOptions={tippyOptions as any}\n >\n {items?.length\n ? (\n <div className=\"w-auto px-3 py-2 transition-all border rounded-sm shadow-sm pointer-events-auto select-none border-neutral-200 dark:border-neutral-800 bg-background\">\n <div className=\"flex items-center flex-nowrap whitespace-nowrap h-[26px] justify-start relative\">\n {items?.map((item: any, key: any) => {\n return (\n <ItemA\n key={`bubbleMenu-image-${key}`}\n item={item}\n disabled={props.disabled}\n editor={props.editor}\n />\n )\n })}\n </div>\n </div>\n )\n : (\n <></>\n )}\n </BubbleMenuReact>\n </>\n )\n}\n\nfunction BubbleMenuVideo(props: IPropsBubbleMenu) {\n const { lang } = useLocale()\n\n const shouldShow = ({ editor }: any) => {\n const { selection } = editor.view.state\n const { $from, to } = selection\n let isVideo = false\n\n editor.view.state.doc.nodesBetween($from.pos, to, (node: any) => {\n if (isVideoNode(node)) {\n isVideo = true\n return false\n }\n })\n\n return isVideo\n }\n\n const items = useMemo(() => {\n if (props.disabled) {\n return []\n }\n\n return getBubbleVideo(props.editor)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.editor, props.disabled, lang])\n\n return (\n <>\n <BubbleMenuReact\n shouldShow={shouldShow}\n editor={props?.editor}\n tippyOptions={tippyOptions as any}\n >\n {items?.length\n ? (\n <div className=\"w-auto px-3 py-2 transition-all border rounded-sm shadow-sm pointer-events-auto select-none border-neutral-200 dark:border-neutral-800 bg-background\">\n <div className=\"flex items-center flex-nowrap whitespace-nowrap h-[26px] justify-start relative\">\n {items?.map((item: any, key: any) => {\n return (\n <ItemA\n key={`bubbleMenu-video-${key}`}\n item={item}\n disabled={props.disabled}\n editor={props.editor}\n />\n )\n })}\n </div>\n </div>\n )\n : (\n <></>\n )}\n </BubbleMenuReact>\n </>\n )\n}\n\nexport { BubbleMenuImage, BubbleMenuVideo }\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n// asd\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { type VariantProps, cva } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90',\n outline:\n 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-10 px-4 py-2',\n sm: 'h-9 rounded-md px-3',\n lg: 'h-11 rounded-md px-8',\n icon: 'h-10 w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n },\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","'use client'\n\nimport * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Check, ChevronRight, Circle } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 text-sm font-semibold', inset && 'pl-8', className)}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nfunction DropdownMenuShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {\n return (\n <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\n )\n}\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut'\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n ref={ref}\n {...props}\n />\n )\n },\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","'use client'\n\nimport * as React from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { type VariantProps, cva } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst labelVariants = cva(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '@/lib/utils'\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent }\n","'use client'\n\nimport * as React from 'react'\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\n\nimport { cn } from '@/lib/utils'\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = 'horizontal', decorative = true, ...props },\n ref,\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className,\n )}\n {...props}\n />\n ),\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","'use client'\n\nimport * as React from 'react'\nimport * as SwitchPrimitives from '@radix-ui/react-switch'\n\nimport { cn } from '@/lib/utils'\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n 'peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input',\n className,\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n 'pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0',\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","'use client'\n\nimport * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport { cn } from '@/lib/utils'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground',\n className,\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm',\n className,\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n className,\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","'use client'\n\nimport * as React from 'react'\nimport * as ToastPrimitives from '@radix-ui/react-toast'\nimport { type VariantProps, cva } from 'class-variance-authority'\nimport { X } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nconst ToastProvider = ToastPrimitives.Provider\n\nconst ToastViewport = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Viewport>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Viewport\n ref={ref}\n className={cn(\n 'fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]',\n className,\n )}\n {...props}\n />\n))\nToastViewport.displayName = ToastPrimitives.Viewport.displayName\n\nconst toastVariants = cva(\n 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',\n {\n variants: {\n variant: {\n default: 'border bg-background text-foreground',\n destructive:\n 'destructive group border-destructive bg-destructive text-destructive-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nconst Toast = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &\n VariantProps<typeof toastVariants>\n>(({ className, variant, ...props }, ref) => {\n return (\n <ToastPrimitives.Root\n ref={ref}\n className={cn(toastVariants({ variant }), className)}\n {...props}\n />\n )\n})\nToast.displayName = ToastPrimitives.Root.displayName\n\nconst ToastAction = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Action>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Action\n ref={ref}\n className={cn(\n 'inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive',\n className,\n )}\n {...props}\n />\n))\nToastAction.displayName = ToastPrimitives.Action.displayName\n\nconst ToastClose = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Close>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Close\n ref={ref}\n className={cn(\n 'absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600',\n className,\n )}\n toast-close=\"\"\n {...props}\n >\n <X className=\"h-4 w-4\" />\n </ToastPrimitives.Close>\n))\nToastClose.displayName = ToastPrimitives.Close.displayName\n\nconst ToastTitle = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Title>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Title\n ref={ref}\n className={cn('text-sm font-semibold', className)}\n {...props}\n />\n))\nToastTitle.displayName = ToastPrimitives.Title.displayName\n\nconst ToastDescription = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Description>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Description\n ref={ref}\n className={cn('text-sm opacity-90', className)}\n {...props}\n />\n))\nToastDescription.displayName = ToastPrimitives.Description.displayName\n\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>\n\ntype ToastActionElement = React.ReactElement<typeof ToastAction>\n\nexport {\n type ToastProps,\n type ToastActionElement,\n ToastProvider,\n ToastViewport,\n Toast,\n ToastTitle,\n ToastDescription,\n ToastClose,\n ToastAction,\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as TogglePrimitive from '@radix-ui/react-toggle'\nimport { type VariantProps, cva } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst toggleVariants = cva(\n 'inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground',\n {\n variants: {\n variant: {\n default: 'bg-transparent',\n outline: 'border border-input bg-transparent hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'h-10 px-3',\n sm: 'h-9 px-2',\n lg: 'h-11 px-5',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> & VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n))\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n","'use client'\n\nimport * as React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\n\nimport { cn } from '@/lib/utils'\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","/* eslint-disable unused-imports/no-unused-vars */\n'use client'\n\n// Inspired by react-hot-toast library\nimport * as React from 'react'\n\nimport type { ToastActionElement, ToastProps } from '@/components/ui/toast'\n\nconst TOAST_LIMIT = 1\nconst TOAST_REMOVE_DELAY = 1000000\n\ntype ToasterToast = ToastProps & {\n id: string\n title?: React.ReactNode\n description?: React.ReactNode\n action?: ToastActionElement\n}\n\nconst actionTypes = {\n ADD_TOAST: 'ADD_TOAST',\n UPDATE_TOAST: 'UPDATE_TOAST',\n DISMISS_TOAST: 'DISMISS_TOAST',\n REMOVE_TOAST: 'REMOVE_TOAST',\n} as const\n\nlet count = 0\n\nfunction genId() {\n count = (count + 1) % Number.MAX_SAFE_INTEGER\n return count.toString()\n}\n\ntype ActionType = typeof actionTypes\n\ntype Action =\n | {\n type: ActionType['ADD_TOAST']\n toast: ToasterToast\n }\n | {\n type: ActionType['UPDATE_TOAST']\n toast: Partial<ToasterToast>\n }\n | {\n type: ActionType['DISMISS_TOAST']\n toastId?: ToasterToast['id']\n }\n | {\n type: ActionType['REMOVE_TOAST']\n toastId?: ToasterToast['id']\n }\n\ninterface State {\n toasts: ToasterToast[]\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\n\nfunction addToRemoveQueue(toastId: string) {\n if (toastTimeouts.has(toastId)) {\n return\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId)\n dispatch({\n type: 'REMOVE_TOAST',\n toastId,\n })\n }, TOAST_REMOVE_DELAY)\n\n toastTimeouts.set(toastId, timeout)\n}\n\nexport function reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'ADD_TOAST':\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n }\n\n case 'UPDATE_TOAST':\n return {\n ...state,\n toasts: state.toasts.map(t =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t,\n ),\n }\n\n case 'DISMISS_TOAST': {\n const { toastId } = action\n\n // ! Side effects ! - This could be extracted into a dismissToast() action,\n // but I'll keep it here for simplicity\n if (toastId) {\n addToRemoveQueue(toastId)\n }\n else {\n state.toasts.forEach((toast) => {\n addToRemoveQueue(toast.id)\n })\n }\n\n return {\n ...state,\n toasts: state.toasts.map(t =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n open: false,\n }\n : t,\n ),\n }\n }\n case 'REMOVE_TOAST':\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n }\n }\n return {\n ...state,\n toasts: state.toasts.filter(t => t.id !== action.toastId),\n }\n }\n}\n\nconst listeners: Array<(state: State) => void> = []\n\nlet memoryState: State = { toasts: [] }\n\nfunction dispatch(action: Action) {\n memoryState = reducer(memoryState, action)\n listeners.forEach((listener) => {\n listener(memoryState)\n })\n}\n\ntype Toast = Omit<ToasterToast, 'id'>\n\nfunction toast({ ...props }: Toast) {\n const id = genId()\n\n const update = (props: ToasterToast) =>\n dispatch({\n type: 'UPDATE_TOAST',\n toast: { ...props, id },\n })\n const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id })\n\n dispatch({\n type: 'ADD_TOAST',\n toast: {\n ...props,\n id,\n open: true,\n onOpenChange: (open) => {\n if (!open)\n dismiss()\n },\n },\n })\n\n return {\n id,\n dismiss,\n update,\n }\n}\n\nfunction useToast() {\n const [state, setState] = React.useState<State>(memoryState)\n\n React.useEffect(() => {\n listeners.push(setState)\n return () => {\n const index = listeners.indexOf(setState)\n if (index > -1) {\n listeners.splice(index, 1)\n }\n }\n }, [state])\n\n return {\n ...state,\n toast,\n dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }),\n }\n}\n\nexport { useToast, toast }\n","import type { BoldOptions as TiptapImageOptions } from '@tiptap/extension-bold'\nimport { Bold as TiptapBold } from '@tiptap/extension-bold'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface BoldOptions extends TiptapImageOptions, GeneralOptions<BoldOptions> {}\n\nexport const Bold = TiptapBold.extend<BoldOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }: any) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleBold(),\n isActive: () => editor.isActive('bold') || false,\n disabled: !editor.can().toggleBold(),\n icon: 'Bold',\n shortcutKeys: ['mod', 'B'],\n tooltip: t('editor.bold.tooltip'),\n },\n }),\n }\n },\n})\n","import type { Editor } from '@tiptap/core'\nimport type { ItalicOptions as TiptapItalicOptions } from '@tiptap/extension-italic'\nimport TiptapItalic from '@tiptap/extension-italic'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface ItalicOptions extends TiptapItalicOptions, GeneralOptions<ItalicOptions> {}\n\nexport const Italic = TiptapItalic.extend<ItalicOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button({ editor, t }: { editor: Editor, t: (...args: any[]) => string }) {\n return {\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleItalic(),\n isActive: () => editor.isActive('italic') || false,\n disabled: !editor.can().toggleItalic(),\n shortcutKeys: ['mod', 'I'],\n icon: 'Italic',\n tooltip: t('editor.italic.tooltip'),\n },\n }\n },\n }\n },\n})\n","import type { UnderlineOptions as TiptapUnderlineOptions } from '@tiptap/extension-underline'\nimport TiptapUnderline from '@tiptap/extension-underline'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface UnderlineOptions\n extends TiptapUnderlineOptions,\n GeneralOptions<UnderlineOptions> {}\n\nexport const Underline = TiptapUnderline.extend<UnderlineOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button({ editor, t }: any) {\n return {\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleUnderline(),\n isActive: () => editor.isActive('underline') || false,\n disabled: !editor.can().toggleUnderline(),\n icon: 'Underline',\n shortcutKeys: ['mod', 'U'],\n tooltip: t('editor.underline.tooltip'),\n },\n }\n },\n }\n },\n})\n","import type { StrikeOptions as TiptapStrikeOptions } from '@tiptap/extension-strike'\nimport { Strike as TiptapStrike } from '@tiptap/extension-strike'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface StrikeOptions extends TiptapStrikeOptions, GeneralOptions<StrikeOptions> {}\n\nexport const Strike = TiptapStrike.extend<StrikeOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }: any) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleStrike(),\n isActive: () => editor.isActive('strike') || false,\n disabled: !editor.can().toggleStrike(),\n icon: 'Strikethrough',\n shortcutKeys: ['shift', 'mod', 'X'],\n tooltip: t('editor.strike.tooltip'),\n },\n }),\n }\n },\n})\n","import type { CodeOptions as TiptapCodeOptions } from '@tiptap/extension-code'\nimport { Code as TiptapCode } from '@tiptap/extension-code'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface CodeOptions extends TiptapCodeOptions, GeneralOptions<CodeOptions> {}\n\nexport const Code = TiptapCode.extend<CodeOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleCode(),\n isActive: () => editor.isActive('code') || false,\n disabled: !editor.can().toggleCode(),\n icon: 'Code',\n shortcutKeys: ['mod', 'E'],\n tooltip: t('editor.code.tooltip'),\n },\n }),\n }\n },\n})\n","import { CodeBlockLowlight as TiptapCodeBlock } from '@tiptap/extension-code-block-lowlight'\nimport type { CodeBlockLowlightOptions as TiptapCodeBlockOptions } from '@tiptap/extension-code-block-lowlight'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface CodeBlockOptions\n extends TiptapCodeBlockOptions,\n GeneralOptions<CodeBlockOptions> {}\n\nexport const CodeBlock = TiptapCodeBlock.extend<CodeBlockOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n defaultLanguage: null,\n button: ({ editor, t }: any) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleCodeBlock(),\n isActive: () => editor.isActive('codeBlock') || false,\n disabled: !editor.can().toggleCodeBlock(),\n icon: 'Code2',\n tooltip: t('editor.codeblock.tooltip'),\n },\n }),\n }\n },\n})\n","import React, { Fragment, useMemo } from 'react'\n\nimport {\n ActionMenuButton,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components'\nimport { useLocale } from '@/locales'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\nexport interface Item {\n title: string\n icon?: any\n font?: string\n isActive: NonNullable<ButtonViewReturnComponentProps['isActive']>\n action?: ButtonViewReturnComponentProps['action']\n style?: React.CSSProperties\n shortcutKeys?: string[]\n disabled?: boolean\n divider?: boolean\n default?: boolean\n}\n\ninterface Props {\n editor: any\n disabled?: boolean\n color?: string\n shortcutKeys?: string[]\n maxHeight?: string | number\n tooltip?: string\n items?: Item[]\n}\n\nfunction FontFamilyButton(props: Props) {\n const { t, lang } = useLocale()\n\n const active = useMemo(() => {\n const find: any = props?.items?.find((k: any) => k.isActive())\n\n if (find && !find.default) {\n return {\n ...find,\n }\n }\n const item: Item = {\n title: props.tooltip as any,\n font: t('editor.fontFamily.default.tooltip'),\n isActive: () => false,\n disabled: false,\n action: () => props.editor.chain().focus().unsetFontFamily().run(),\n }\n return item\n }, [t, lang, props])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger disabled={props?.disabled} asChild>\n <ActionMenuButton\n title={active?.font?.length > 7 ? `${active?.font?.slice(0, 6)}...` : active?.font}\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n icon=\"MenuDown\"\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-full\">\n {props?.items?.map((item: any, index) => {\n const style\n = item.font === t('editor.fontFamily.default.tooltip') ? {} : { fontFamily: item.font }\n\n return (\n <Fragment key={index}>\n <DropdownMenuCheckboxItem checked={active?.font === item.font} onClick={item.action}>\n <div className=\"h-full ml-1\" style={style}>\n {item.font}\n </div>\n </DropdownMenuCheckboxItem>\n {item.font === t('editor.fontFamily.default.tooltip') && <DropdownMenuSeparator />}\n </Fragment>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default FontFamilyButton\n","import type { Extension } from '@tiptap/core'\nimport type { FontFamilyOptions as TiptapFontFamilyOptions } from '@tiptap/extension-font-family'\nimport FontFamilyTiptap from '@tiptap/extension-font-family'\n\nimport type { BaseKitOptions } from '../BaseKit'\nimport FontFamilyButton from '@/extensions/FontFamily/components/FontFamilyButton'\nimport type { GeneralOptions } from '@/types'\n\n// export interface FontFamilyOptions extends , GeneralOptions<FontFamilyOptions> {}\nexport interface FontFamilyOptions extends TiptapFontFamilyOptions, GeneralOptions<FontFamilyOptions> {}\n\nexport const FontFamily = FontFamilyTiptap.extend<FontFamilyOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n fonts: ['Inter', 'Comic Sans MS, Comic Sans', 'serif', 'monospace', 'cursive'],\n button({ editor, extension, t }: any) {\n const { extensions = [] } = editor.extensionManager ?? []\n const fonts = extension?.options?.fonts || []\n const baseKitExt = extensions.find(\n (k: any) => k.name === 'base-kit',\n ) as Extension<BaseKitOptions>\n\n const items: any[] = fonts.map((font: any) => ({\n action: () => {\n editor.chain().focus().setFontFamily(font).run()\n },\n isActive: () => editor.isActive('textStyle', { fontFamily: font }) || false,\n disabled: !editor.can().setFontFamily(font),\n title: font,\n font,\n }))\n\n if (baseKitExt && baseKitExt.options.textStyle !== false) {\n items.unshift({\n action: () => editor.chain().focus().unsetFontFamily().run(),\n isActive: () => false,\n disabled: false,\n font: t('editor.fontFamily.default.tooltip'),\n title: t('editor.fontFamily.tooltip'),\n })\n }\n\n const disabled = items.filter((k: any) => k.disabled).length === items.length\n\n return {\n component: FontFamilyButton,\n componentProps: {\n tooltip: t('editor.fontFamily.tooltip'),\n disabled,\n items,\n editor,\n },\n }\n },\n }\n },\n})\n","import React, { Fragment, useMemo } from 'react'\n\nimport {\n ActionMenuButton,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '@/components'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKey } from '@/utils/plateform'\n\nexport interface Item {\n title: string\n icon?: any\n level?: number\n isActive: NonNullable<ButtonViewReturnComponentProps['isActive']>\n action?: ButtonViewReturnComponentProps['action']\n style?: React.CSSProperties\n shortcutKeys?: string[]\n disabled?: boolean\n divider?: boolean\n default?: boolean\n}\n\ninterface Props {\n editor: any\n disabled?: boolean\n color?: string\n shortcutKeys?: string[]\n maxHeight?: string | number\n tooltip?: string\n items?: Item[]\n}\n\nfunction HeadingButton(props: Props) {\n const active = useMemo(() => {\n const find: any = props?.items?.find((k: any) => k.isActive())\n\n if (find && !find.default) {\n return {\n ...find,\n }\n }\n const item: Item = {\n title: props.tooltip as any,\n level: 0,\n isActive: () => false,\n }\n return item\n }, [props])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger disabled={props?.disabled} asChild>\n <ActionMenuButton\n title={active?.title}\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n icon=\"MenuDown\"\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-full\">\n {props?.items?.map((item: any, index) => {\n return (\n <Fragment key={index}>\n <DropdownMenuCheckboxItem\n checked={active?.title === item.title}\n onClick={item.action}\n >\n <div className={`ml-1 h-full heading-${item.level}`}>{item.title}</div>\n {!!item?.shortcutKeys?.length && (\n <DropdownMenuShortcut className=\"pl-4\">\n {item?.shortcutKeys?.map((item: any) => getShortcutKey(item)).join(' ')}\n </DropdownMenuShortcut>\n )}\n </DropdownMenuCheckboxItem>\n {item.level === 0 && <DropdownMenuSeparator />}\n </Fragment>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default HeadingButton\n","import type { Extension } from '@tiptap/core'\nimport type { HeadingOptions as TiptapHeadingOptions } from '@tiptap/extension-heading'\nimport { Heading as TiptapHeading } from '@tiptap/extension-heading'\n\nimport type { BaseKitOptions } from '../BaseKit'\nimport HeadingButton from '@/extensions/Heading/components/HeadingButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface HeadingOptions extends TiptapHeadingOptions, GeneralOptions<HeadingOptions> {}\n\nexport const Heading = TiptapHeading.extend<HeadingOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n levels: [1, 2, 3, 4, 5, 6],\n button({ editor, extension, t }) {\n const { extensions = [] } = editor.extensionManager ?? []\n const levels = extension.options?.levels || []\n const baseKitExt = extensions.find(\n k => k.name === 'base-kit',\n ) as Extension<BaseKitOptions>\n\n const items: any[] = levels.map(level => ({\n action: () => editor.commands.toggleHeading({ level }),\n isActive: () => editor.isActive('heading', { level }) || false,\n disabled: !editor.can().toggleHeading({ level }),\n title: t(`editor.heading.h${level}.tooltip`),\n level,\n shortcutKeys: ['alt', 'mod', `${level}`],\n }))\n\n if (baseKitExt && baseKitExt.options.paragraph !== false) {\n items.unshift({\n action: () => editor.commands.setParagraph(),\n isActive: () => editor.isActive('paragraph') || false,\n disabled: !editor.can().setParagraph(),\n level: 0,\n title: t('editor.paragraph.tooltip'),\n shortcutKeys: ['alt', 'mod', '0'],\n })\n }\n\n const disabled = items.filter((k: any) => k.disabled).length === items.length\n\n return {\n component: HeadingButton,\n componentProps: {\n tooltip: t('editor.heading.tooltip'),\n disabled,\n items,\n editor,\n },\n }\n },\n }\n },\n})\n","import React, { useMemo } from 'react'\n\nimport { ActionButton, IconComponent } from '@/components'\nimport { Popover, PopoverContent, PopoverTrigger, Toggle, Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKey } from '@/utils/plateform'\n\ninterface IPropsTextAlignMenuButton {}\n\nexport interface Item {\n title: string\n icon?: any\n isActive: NonNullable<ButtonViewReturnComponentProps['isActive']>\n action?: ButtonViewReturnComponentProps['action']\n style?: React.CSSProperties\n shortcutKeys?: string[]\n disabled?: boolean\n divider?: boolean\n default?: boolean\n}\ninterface IPropsTextAlignMenuButton {\n editor: any\n disabled?: boolean\n color?: string\n maxHeight?: string | number\n icon?: any\n tooltip?: string\n items?: Item[]\n}\n\nfunction TextAlignMenuButton(props: IPropsTextAlignMenuButton) {\n const active = useMemo(() => {\n const find: any = props?.items?.find((k: any) => k.isActive())\n if (find && !find.default) {\n return {\n ...find,\n icon: find.icon ? find.icon : props.icon,\n }\n }\n const item: Item = {\n title: props?.tooltip as any,\n icon: props.icon,\n isActive: () => false,\n }\n\n return item\n }, [props])\n\n return (\n <Popover>\n <PopoverTrigger disabled={props?.disabled} asChild>\n <ActionButton\n customClass=\"w-12\"\n icon={props?.icon}\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n >\n <IconComponent className=\"w-3 h-3 ml-1 text-zinc-500\" name=\"MenuDown\" />\n </ActionButton>\n </PopoverTrigger>\n\n <PopoverContent\n className=\"min-w-4 w-full !p-[4px] flex flex-row gap-1\"\n align=\"start\"\n side=\"bottom\"\n >\n {props?.items?.map((item, index) => {\n return (\n <Tooltip key={`text-align-${index}`}>\n <TooltipTrigger asChild>\n <Toggle\n size=\"sm\"\n onClick={item?.action}\n className=\"p-1 w-7 h-7\"\n pressed={active.title === item.title}\n data-state={active.title === item.title ? 'on' : 'off'}\n >\n {item?.icon && <IconComponent name={item.icon} />}\n </Toggle>\n </TooltipTrigger>\n <TooltipContent className=\"flex flex-col items-center\">\n <span>{item.title}</span>\n {!!item.shortcutKeys?.length && (\n <span>{item.shortcutKeys?.map(item => getShortcutKey(item)).join(' ')}</span>\n )}\n </TooltipContent>\n </Tooltip>\n )\n })}\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default TextAlignMenuButton\n","import type { Editor, Extension } from '@tiptap/core'\nimport type { TextAlignOptions as TiptapTextAlignOptions } from '@tiptap/extension-text-align'\nimport TiptapTextAlign from '@tiptap/extension-text-align'\n\nimport TextAlignMenuButton from '@/extensions/TextAlign/components/TextAlignMenuButton'\nimport type { GeneralOptions } from '@/types'\n\ntype Alignments = 'left' | 'center' | 'right' | 'justify'\n/**\n * Represents the interface for text align options, extending TiptapTextAlignOptions and GeneralOptions.\n */\nexport interface TextAlignOptions extends TiptapTextAlignOptions, GeneralOptions<TextAlignOptions> {\n /**\n * List of available alignment options\n *\n * @default ['left', 'center', 'right', 'justify']\n */\n alignments: Alignments[]\n}\nexport const TextAlign = TiptapTextAlign.extend<TextAlignOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n types: ['heading', 'paragraph', 'list_item', 'title'],\n button({\n editor,\n extension,\n t,\n }: {\n editor: Editor\n extension: Extension\n t: (...args: any[]) => string\n }) {\n const alignments = (extension.options?.alignments as Alignments[]) || []\n const shortcutKeysMap = {\n left: ['mod', 'Shift', 'L'],\n center: ['mod', 'Shift', 'E'],\n right: ['mod', 'Shift', 'R'],\n justify: ['mod', 'Shift', 'J'],\n }\n const iconMap = {\n left: 'AlignLeft',\n center: 'AlignCenter',\n right: 'AlignRight',\n justify: 'AlignJustify',\n }\n const items = alignments.map(k => ({\n title: t(`editor.textalign.${k}.tooltip`),\n icon: iconMap[k],\n shortcutKeys: shortcutKeysMap[k],\n isActive: () => editor.isActive({ textAlign: k }) || false,\n action: () => editor.commands?.setTextAlign?.(k),\n disabled: !editor?.can?.()?.setTextAlign?.(k),\n }))\n const disabled = items.filter(k => k.disabled).length === items.length\n return {\n component: TextAlignMenuButton,\n componentProps: {\n icon: 'AlignJustify',\n tooltip: t('editor.textalign.tooltip'),\n disabled,\n items,\n },\n }\n },\n }\n },\n})\n","import React, { useMemo } from 'react'\n\nimport {\n ActionMenuButton,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from '@/components'\nimport { useLocale } from '@/locales'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\nexport interface Item {\n title: string\n isActive: NonNullable<ButtonViewReturnComponentProps['isActive']>\n action?: ButtonViewReturnComponentProps['action']\n style?: React.CSSProperties\n disabled?: boolean\n divider?: boolean\n default?: boolean\n}\n\ninterface IPropsFontSizeMenuButton {\n editor: any\n disabled?: boolean\n color?: string\n shortcutKeys?: string[]\n maxHeight?: string | number\n tooltip?: string\n items?: Item[]\n}\n\nfunction FontSizeMenuButton(props: IPropsFontSizeMenuButton) {\n const { t } = useLocale()\n\n const active = useMemo(() => {\n const find: any = (props.items || []).find((k: any) => k.isActive())\n if (find) {\n return find\n }\n const item: Item = {\n title: t('editor.fontSize.default.tooltip'),\n isActive: () => false,\n }\n return item\n }, [props])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger disabled={props?.disabled} asChild>\n <ActionMenuButton\n title={active?.title}\n tooltip={`${props?.tooltip}`}\n disabled={props?.disabled}\n icon=\"MenuDown\"\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-32 overflow-y-auto max-h-96\">\n {props?.items?.map((item: any, index) => {\n return (\n <DropdownMenuCheckboxItem\n key={index}\n checked={active.title === item.title}\n onClick={item.action}\n >\n <div className=\"h-full ml-1\">{item.title}</div>\n </DropdownMenuCheckboxItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default FontSizeMenuButton\n","import { Extension } from '@tiptap/core'\n\nimport FontSizeMenuButton from './components/FontSizeMenuButton'\nimport { DEFAULT_FONT_SIZE_LIST, DEFAULT_FONT_SIZE_VALUE } from '@/constants'\nimport type { GeneralOptions } from '@/types'\n\n/**\n * Represents the interface for font size options, extending GeneralOptions.\n */\nexport interface FontSizeOptions extends GeneralOptions<FontSizeOptions> {\n types: string[]\n /**\n * List of available font size values\n *\n * @default DEFAULT_FONT_SIZE_LIST\n */\n fontSizes: string[]\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n fontSize: {\n /**\n * Set the text font size. ex: \"12px\", \"2em\", or \"small\". Must be a valid\n * CSS font-size\n * (https://developer.mozilla.org/en-US/docs/Web/CSS/font-size).\n */\n setFontSize: (fontSize: string) => ReturnType\n /**\n * Unset the font size\n */\n unsetFontSize: () => ReturnType\n }\n }\n}\n\nexport const FontSize = Extension.create<FontSizeOptions>({\n name: 'fontSize',\n addOptions() {\n return {\n ...this.parent?.(),\n types: ['textStyle'],\n fontSizes: [...DEFAULT_FONT_SIZE_LIST],\n button({ editor, extension, t }) {\n const fontSizes = (extension.options?.fontSizes as FontSizeOptions['fontSizes']) || []\n const items: any[] = [DEFAULT_FONT_SIZE_VALUE, ...fontSizes].map(k => ({\n title: k === DEFAULT_FONT_SIZE_VALUE ? t('editor.fontSize.default.tooltip') : String(k),\n isActive: () => {\n const { fontSize } = editor.getAttributes('textStyle')\n const isDefault = k === DEFAULT_FONT_SIZE_VALUE\n const notFontSize = fontSize === undefined\n if (isDefault && notFontSize) {\n return true\n }\n return editor.isActive({ fontSize: String(k) }) || false\n },\n action: () => {\n if (k === DEFAULT_FONT_SIZE_VALUE) {\n editor.commands.unsetFontSize()\n return\n }\n editor.commands.setFontSize(String(k))\n },\n disabled: !editor.can().setFontSize(String(k)),\n divider: k === DEFAULT_FONT_SIZE_VALUE || false,\n default: k === DEFAULT_FONT_SIZE_VALUE || false,\n }))\n const disabled = items.filter(k => k.disabled).length === items.length\n return {\n component: FontSizeMenuButton,\n componentProps: {\n editor,\n tooltip: t('editor.fontSize.tooltip'),\n disabled,\n items,\n maxHeight: 280,\n },\n }\n },\n }\n },\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: element => element.style.fontSize.replaceAll(/[\"']+/g, ''),\n renderHTML: (attributes) => {\n if (!attributes.fontSize) {\n return {}\n }\n return {\n style: `font-size: ${attributes.fontSize}`,\n }\n },\n },\n },\n },\n ]\n },\n addCommands() {\n return {\n setFontSize:\n fontSize =>\n ({ chain }) => {\n return chain().setMark('textStyle', { fontSize }).run()\n },\n unsetFontSize:\n () =>\n ({ chain }) => {\n return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run()\n },\n }\n },\n})\n","import React, { useCallback, useState } from 'react'\n\nimport type { Editor } from '@tiptap/react'\nimport { debounce } from 'lodash-unified'\n\nimport { ActionButton, Button, ColorPicker } from '@/components'\nimport { IconComponent } from '@/components/icons'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\ninterface IProps {\n editor: Editor\n icon?: any\n tooltip?: string\n disabled?: boolean\n action?: ButtonViewReturnComponentProps['action']\n isActive?: ButtonViewReturnComponentProps['isActive']\n}\n\nfunction IconC({ fill }: any) {\n return (\n <svg\n width=\"18px\"\n height=\"18px\"\n viewBox=\"0 0 240 240\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g stroke=\"none\" strokeWidth={1} fill=\"none\" fillRule=\"evenodd\">\n <g transform=\"translate(0.000000, 0.500000)\">\n <g transform=\"translate(39.000000, 17.353553)\">\n <path\n d=\"M11,201.146447 L167,201.146447 C173.075132,201.146447 178,206.071314 178,212.146447 C178,218.221579 173.075132,223.146447 167,223.146447 L11,223.146447 C4.92486775,223.146447 7.43989126e-16,218.221579 0,212.146447 C-7.43989126e-16,206.071314 4.92486775,201.146447 11,201.146447 Z\"\n id=\"矩形\"\n fill={fill || '#DF2A3F'}\n fillRule=\"evenodd\"\n />\n <path\n d=\"M72.3425855,16.8295583 C75.799482,7.50883712 86.1577877,2.75526801 95.4785089,6.21216449 C100.284516,7.99463061 104.096358,11.7387855 105.968745,16.4968188 L106.112518,16.8745422 L159.385152,161.694068 C161.291848,166.877345 158.635655,172.624903 153.452378,174.531599 C148.358469,176.405421 142.719567,173.872338 140.716873,168.864661 L140.614848,168.598825 L89.211,28.86 L37.3759214,168.623816 C35.4885354,173.712715 29.8981043,176.351047 24.7909589,174.617647 L24.5226307,174.522368 C19.4337312,172.634982 16.7953993,167.044551 18.5287999,161.937406 L18.6240786,161.669077 L72.3425855,16.8295583 Z\"\n id=\"路径-21\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n />\n <path\n d=\"M121,103.146447 C126.522847,103.146447 131,107.623599 131,113.146447 C131,118.575687 126.673329,122.994378 121.279905,123.142605 L121,123.146447 L55,123.146447 C49.4771525,123.146447 45,118.669294 45,113.146447 C45,107.717207 49.3266708,103.298515 54.7200952,103.150288 L55,103.146447 L121,103.146447 Z\"\n id=\"路径-22\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n />\n </g>\n </g>\n </g>\n </svg>\n )\n}\n\nfunction ColorActionButton(props: IProps) {\n const [selectedColor, setSelectedColor] = useState<any>(undefined)\n\n function onChange(color: string | undefined) {\n props.action?.(color)\n }\n\n function toggleColor() {\n props.action?.(selectedColor)\n }\n\n const setSelectedColorDebounce = useCallback(\n debounce((color: any) => {\n setSelectedColor(color)\n }, 350),\n [],\n )\n\n return (\n <div className=\"flex items-center h-[32px]\">\n <ActionButton tooltip={props?.tooltip} disabled={props?.disabled} action={toggleColor}>\n <span className=\"flex items-center justify-center text-sm\">\n <IconC fill={selectedColor} />\n </span>\n </ActionButton>\n\n <ColorPicker\n selectedColor={selectedColor}\n setSelectedColor={setSelectedColorDebounce}\n onChange={onChange}\n disabled={props?.disabled}\n >\n <Button variant=\"ghost\" size=\"icon\" className=\"h-[32px] w-3\" disabled={props?.disabled}>\n <IconComponent className=\"w-3 h-3 text-zinc-500\" name=\"MenuDown\" />\n </Button>\n </ColorPicker>\n </div>\n )\n}\n\nexport default ColorActionButton\n","import TiptapColor from '@tiptap/extension-color'\nimport type { ColorOptions as TiptapColorOptions } from '@tiptap/extension-color'\n\nimport ColorActionButton from '@/extensions/Color/components/ColorActionButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface ColorOptions extends TiptapColorOptions, GeneralOptions<ColorOptions> {}\n\nexport const Color = TiptapColor.extend<ColorOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button({ editor, t }) {\n return {\n component: ColorActionButton,\n componentProps: {\n action: (color?: unknown) => {\n if (color === undefined) {\n editor.chain().focus().unsetColor().run()\n }\n if (typeof color === 'string') {\n editor.chain().focus().setColor(color).run()\n }\n },\n isActive: () => {\n const { color } = editor.getAttributes('textStyle')\n if (!color) {\n return false\n }\n return editor.isActive({ color }) || false\n },\n editor,\n disabled: !editor.can().setColor(''),\n tooltip: t('editor.color.tooltip'),\n },\n }\n },\n }\n },\n})\n","import type { HighlightOptions as TiptapHighlightOptions } from '@tiptap/extension-highlight'\nimport { Highlight as TiptapHighlight } from '@tiptap/extension-highlight'\n\nimport HighlightActionButton from './components/HighlightActionButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface HighlightOptions\n extends TiptapHighlightOptions,\n GeneralOptions<HighlightOptions> {}\n\nexport const Highlight = TiptapHighlight.extend<HighlightOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n multicolor: true,\n button: ({ editor, t }) => ({\n component: HighlightActionButton,\n componentProps: {\n action: (color?: unknown) => {\n if (typeof color === 'string') {\n editor.chain().focus().setHighlight({ color }).run()\n }\n if (color === undefined) {\n editor.chain().focus().unsetHighlight().run()\n }\n },\n editor,\n isActive: () => editor.isActive('highlight') || false,\n disabled: !editor.can().setHighlight(),\n shortcutKeys: ['⇧', 'mod', 'H'],\n tooltip: t('editor.highlight.tooltip'),\n },\n }),\n }\n },\n})\n","import type { BulletListOptions as TiptapBulletListOptions } from '@tiptap/extension-bullet-list'\nimport { BulletList as TiptapBulletList } from '@tiptap/extension-bullet-list'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface BulletListOptions\n extends TiptapBulletListOptions,\n GeneralOptions<BulletListOptions> {}\n\nexport const BulletList = TiptapBulletList.extend<BulletListOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleBulletList(),\n isActive: () => editor.isActive('bulletList') || false,\n disabled: false,\n shortcutKeys: ['shift', 'mod', '8'],\n icon: 'List',\n tooltip: t('editor.bulletlist.tooltip'),\n },\n }),\n }\n },\n})\n","import { Node } from '@tiptap/core'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface ClearOptions extends GeneralOptions<ClearOptions> {}\n\nexport const Clear = Node.create<ClearOptions>({\n name: 'clear',\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.chain().focus().clearNodes().unsetAllMarks().run(),\n disabled: !editor.can().chain().focus().clearNodes().unsetAllMarks().run(),\n icon: 'Eraser',\n tooltip: t('editor.clear.tooltip'),\n },\n }),\n }\n },\n})\n","import type { OrderedListOptions as TiptapOrderedListOptions } from '@tiptap/extension-ordered-list'\nimport { OrderedList as TiptapOrderedList } from '@tiptap/extension-ordered-list'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface OrderedListOptions\n extends TiptapOrderedListOptions,\n GeneralOptions<OrderedListOptions> {}\n\nexport const OrderedList = TiptapOrderedList.extend<OrderedListOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleOrderedList(),\n isActive: () => editor.isActive('orderedList') || false,\n disabled: false,\n icon: 'ListOrdered',\n shortcutKeys: ['mod', 'shift', '7'],\n tooltip: t('editor.orderedlist.tooltip'),\n },\n }),\n }\n },\n})\n","import type { TaskItemOptions } from '@tiptap/extension-task-item'\nimport { TaskItem } from '@tiptap/extension-task-item'\nimport type { TaskListOptions as TiptapTaskListOptions } from '@tiptap/extension-task-list'\nimport { TaskList as TiptapTaskList } from '@tiptap/extension-task-list'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\n/**\n * Represents the interface for task list options, extending TiptapTaskListOptions and GeneralOptions.\n */\nexport interface TaskListOptions extends TiptapTaskListOptions, GeneralOptions<TaskListOptions> {\n /** options for task items */\n taskItem: Partial<TaskItemOptions>\n}\n\nexport const TaskList = TiptapTaskList.extend<TaskListOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n HTMLAttributes: {\n class: 'task-list',\n },\n taskItem: {\n HTMLAttributes: {\n class: 'task-list-item',\n },\n },\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleTaskList(),\n isActive: () => editor.isActive('taskList') || false,\n disabled: false,\n icon: 'ListTodo',\n shortcutKeys: ['shift', 'mod', '9'],\n tooltip: t('editor.tasklist.tooltip'),\n },\n }),\n }\n },\n\n addExtensions() {\n return [TaskItem.configure(this.options.taskItem)]\n },\n})\n","import type { BlockquoteOptions as TiptapBlockquoteOptions } from '@tiptap/extension-blockquote'\nimport { Blockquote as TiptapBlockquote } from '@tiptap/extension-blockquote'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface BlockquoteOptions\n extends TiptapBlockquoteOptions,\n GeneralOptions<BlockquoteOptions> {}\n\nexport const Blockquote = TiptapBlockquote.extend<BlockquoteOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n HTMLAttributes: {\n class: 'blockquote',\n },\n button: ({ editor, t }: any) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleBlockquote(),\n isActive: () => editor.isActive('blockquote') || false,\n disabled: !editor.can().toggleBlockquote(),\n icon: 'TextQuote',\n shortcutKeys: ['shift', 'mod', 'B'],\n tooltip: t('editor.blockquote.tooltip'),\n },\n }),\n }\n },\n})\n","import { ActionButton, IconComponent, Popover, PopoverContent, PopoverTrigger } from '@/components'\nimport LinkEditBlock from '@/extensions/Link/components/LinkEditBlock'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\ninterface IPropsLinkEditPopover {\n editor: any\n icon?: any\n title?: string\n tooltip?: string\n disabled?: boolean\n shortcutKeys?: string[]\n isActive?: ButtonViewReturnComponentProps['isActive']\n action?: ButtonViewReturnComponentProps['action']\n}\n\nfunction LinkEditPopover(props: IPropsLinkEditPopover) {\n function onSetLink(link: string, text?: string, openInNewTab?: boolean) {\n if (props.action) {\n props.action({ link, text, openInNewTab })\n }\n }\n\n return (\n <Popover>\n <PopoverTrigger disabled={props?.disabled} asChild>\n <ActionButton\n tooltip={props?.tooltip}\n isActive={props?.isActive}\n disabled={props?.disabled}\n >\n <IconComponent name={props?.icon} />\n </ActionButton>\n </PopoverTrigger>\n <PopoverContent hideWhenDetached className=\"w-full\" align=\"start\" side=\"bottom\">\n <LinkEditBlock editor={props.editor} onSetLink={onSetLink} />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default LinkEditPopover\n","import { getMarkRange, mergeAttributes } from '@tiptap/core'\nimport type { LinkOptions as TiptapLinkOptions } from '@tiptap/extension-link'\nimport { Link as TiptapLink } from '@tiptap/extension-link'\nimport { Plugin, TextSelection } from '@tiptap/pm/state'\nimport type { EditorView } from '@tiptap/pm/view'\n\nimport LinkEditPopover from '@/extensions/Link/components/LinkEditPopover'\nimport type { GeneralOptions } from '@/types'\n\nexport interface LinkOptions extends TiptapLinkOptions, GeneralOptions<LinkOptions> {}\n\nexport const Link = TiptapLink.extend<LinkOptions>({\n inclusive: false,\n parseHTML() {\n return [\n {\n tag: 'a[href]:not([data-type=\"button\"]):not([href *= \"javascript:\" i])',\n },\n ]\n },\n renderHTML({ HTMLAttributes }) {\n return [\n 'a',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class: 'link',\n }),\n 0,\n ]\n },\n\n addOptions() {\n return {\n ...this.parent?.(),\n openOnClick: true,\n button: ({ editor, t }) => {\n return {\n component: LinkEditPopover,\n componentProps: {\n editor,\n action: (value) => {\n const { link, text, openInNewTab } = value as any\n editor\n .chain()\n .extendMarkRange('link')\n .insertContent({\n type: 'text',\n text,\n marks: [\n {\n type: 'link',\n attrs: {\n href: link,\n target: openInNewTab ? '_blank' : '',\n },\n },\n ],\n })\n .setLink({ href: link })\n .focus()\n .run()\n },\n id: 'linkk',\n isActive: () => editor.isActive('link') || false,\n disabled: !editor.can().setLink({ href: '' }),\n icon: 'Link',\n tooltip: t('editor.link.tooltip'),\n },\n }\n },\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n props: {\n handleClick: (view: EditorView, pos: number) => {\n const { schema, doc, tr } = view.state\n const range = getMarkRange(doc.resolve(pos), schema.marks.link)\n if (!range) {\n return false\n }\n const $start = doc.resolve(range.from)\n const $end = doc.resolve(range.to)\n const transaction = tr.setSelection(new TextSelection($start, $end))\n view.dispatch(transaction)\n },\n },\n }),\n ]\n },\n})\n","import { mergeAttributes } from '@tiptap/core'\nimport type { HorizontalRuleOptions as TiptapHorizontalRuleOptions } from '@tiptap/extension-horizontal-rule'\nimport { HorizontalRule as TiptapHorizontalRule } from '@tiptap/extension-horizontal-rule'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface HorizontalRuleOptions\n extends TiptapHorizontalRuleOptions,\n GeneralOptions<HorizontalRuleOptions> {}\n\nexport const HorizontalRule = TiptapHorizontalRule.extend<HorizontalRuleOptions>({\n renderHTML() {\n return [\n 'div',\n mergeAttributes(this.options.HTMLAttributes, {\n 'data-type': this.name,\n }),\n ['hr'],\n ]\n },\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.setHorizontalRule(),\n disabled: !editor.can().setHorizontalRule(),\n icon: 'Minus',\n shortcutKeys: ['mod', 'alt', 'S'],\n tooltip: t('editor.horizontalrule.tooltip'),\n },\n }),\n }\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Alt-s': () => this.editor.commands.setHorizontalRule(),\n }\n },\n})\n","import React from 'react'\n\nimport type { TooltipContentProps } from '@radix-ui/react-tooltip'\n\nimport { Toggle, Tooltip, TooltipContent, TooltipTrigger, icons } from '@/components'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKeys } from '@/utils/plateform'\n\ninterface IPropsHistoryActionButton {\n icon?: string\n title?: string\n tooltip?: string\n disabled?: boolean\n shortcutKeys?: string[]\n customClass?: string\n loading?: boolean\n tooltipOptions?: TooltipContentProps\n color?: string\n action?: ButtonViewReturnComponentProps['action']\n isActive?: ButtonViewReturnComponentProps['isActive']\n children?: React.ReactNode\n}\n\nfunction HistoryActionButton(props?: Partial<IPropsHistoryActionButton>) {\n const {\n icon = undefined,\n // title = undefined,\n tooltip = undefined,\n // disabled = false,\n customClass = '',\n // color = undefined,\n // loading = false,\n // shortcutKeys = undefined,\n tooltipOptions = {},\n action = undefined,\n isActive = undefined,\n children,\n } = props as any\n\n const Icon = icons[icon as string]\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Toggle\n size=\"sm\"\n className={`w-[32px] h-[32px] ${customClass}`}\n disabled={isActive?.()}\n onClick={action}\n // data-state={isActive?.() ? 'on' : 'off'}\n >\n {Icon && <Icon className=\"w-4 h-4\" />}\n {children && <>{children}</>}\n </Toggle>\n </TooltipTrigger>\n {tooltip && (\n <TooltipContent {...tooltipOptions}>\n <div className=\"flex flex-col items-center text-center max-w-24\">\n <div>{tooltip}</div>\n {!!props?.shortcutKeys?.length && <span>{getShortcutKeys(props?.shortcutKeys)}</span>}\n </div>\n </TooltipContent>\n )}\n </Tooltip>\n )\n}\n\nexport default HistoryActionButton\n","import type { HistoryOptions as TiptapHistoryOptions } from '@tiptap/extension-history'\nimport { History as TiptapHistory } from '@tiptap/extension-history'\n\nimport HistoryActionButton from '@/extensions/History/components/HistoryActionButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface HistoryOptions extends TiptapHistoryOptions, GeneralOptions<HistoryOptions> {}\n\nconst historys: ['undo', 'redo'] = ['undo', 'redo']\n\nexport const History = TiptapHistory.extend<HistoryOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n depth: 100,\n newGroupDelay: 500,\n button: ({ editor, t }: any) => {\n return historys.map(item => ({\n component: HistoryActionButton,\n componentProps: {\n action: () => {\n if (item === 'undo') {\n editor.chain().focus().undo().run()\n }\n if (item === 'redo') {\n editor.chain().focus().redo().run()\n }\n },\n shortcutKeys: item === 'undo' ? ['mod', 'Z'] : ['shift', 'mod', 'Z'],\n disabled: item === 'undo' ? !editor.can().undo() : !editor.can().redo(),\n isActive: () => (item === 'undo' ? !editor.can().undo() : !editor.can().redo()),\n icon: item === 'undo' ? 'Undo2' : 'Redo2',\n tooltip: t(`editor.${item}.tooltip`),\n },\n }))\n },\n }\n },\n})\n","import { Document as TiptapDocument } from '@tiptap/extension-document'\n\nexport const Document = TiptapDocument.extend({\n content: '(block|columns)+',\n // echo editor is a block editor\n})\n\nexport default Document\n","import { Extension } from '@tiptap/core'\n\nimport { ActionButton } from '@/components'\n\nexport const ColumnToolbar = Extension.create<any>({\n name: 'columnToolbar',\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }: any) => ({\n component: ActionButton,\n componentProps: {\n action: () => {\n editor\n .chain()\n .setColumns()\n .focus(editor.state.selection.head - 1)\n .run()\n },\n icon: 'Columns',\n tooltip: t('editor.columns.tooltip'),\n },\n }),\n }\n },\n})\n","import { Extension } from '@tiptap/core'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n\nexport const Selection = Extension.create({\n name: 'selection',\n addProseMirrorPlugins() {\n const { editor } = this\n return [\n new Plugin({\n key: new PluginKey('selection'),\n props: {\n decorations(state) {\n if (state.selection.empty) {\n return null\n }\n if (editor.isFocused === true) {\n return null\n }\n return DecorationSet.create(state.doc, [\n Decoration.inline(state.selection.from, state.selection.to, {\n class: 'selection',\n }),\n ])\n },\n },\n }),\n ]\n },\n})\n\nexport default Selection\n","import React, { useMemo } from 'react'\n\nimport { ChevronDown } from 'lucide-react'\n\nimport { Button, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuTrigger, icons } from '@/components'\nimport { useLocale } from '@/locales'\n\ninterface IPropsTextDropdown {\n editor: any\n disabled?: boolean\n color?: string\n maxHeight?: string | number\n icon?: any\n tooltip?: string\n}\n\nfunction TextDropdown(props: IPropsTextDropdown) {\n const { t } = useLocale()\n\n const menus = useMemo(() => {\n return [\n {\n name: 'paragraph',\n label: t('editor.paragraph.tooltip'),\n iconName: 'Heading1',\n isActive: () =>\n props.editor.isActive('paragraph')\n && !props.editor.isActive('orderedList')\n && !props.editor.isActive('bulletList')\n && !props.editor.isActive('taskList'),\n action: () => props.editor.chain().focus().clearNodes().run(),\n },\n {\n name: 'heading1',\n label: t('editor.heading.h1.tooltip'),\n isActive: () => props.editor.isActive('heading', { level: 1 }),\n iconName: 'Heading1',\n action: () => props.editor.chain().focus().clearNodes().toggleHeading({ level: 1 }).run(),\n },\n {\n name: 'heading2',\n label: t('editor.heading.h2.tooltip'),\n isActive: () => props.editor.isActive('heading', { level: 2 }),\n iconName: 'Heading2',\n action: () => props.editor.chain().focus().clearNodes().toggleHeading({ level: 2 }).run(),\n },\n {\n name: 'heading3',\n label: t('editor.heading.h3.tooltip'),\n isActive: () => props.editor.isActive('heading', { level: 3 }),\n iconName: 'Heading3',\n action: () => props.editor.chain().focus().clearNodes().toggleHeading({ level: 3 }).run(),\n },\n {\n name: 'bulletList',\n label: t('editor.bulletlist.tooltip'),\n isActive: () => props.editor.isActive('bulletList'),\n iconName: 'List',\n action: () => props.editor.chain().focus().clearNodes().toggleBulletList().run(),\n },\n {\n name: 'numberedList',\n label: t('editor.orderedlist.tooltip'),\n isActive: () => props.editor.isActive('orderedList'),\n iconName: 'ListOrdered',\n action: () => props.editor.chain().focus().clearNodes().toggleOrderedList().run(),\n },\n {\n name: 'taskList',\n label: t('editor.tasklist.tooltip'),\n isActive: () => props.editor.isActive('taskList'),\n iconName: 'ListTodo',\n action: () => props.editor.chain().focus().clearNodes().toggleTaskList().run(),\n },\n {\n name: 'blockquote',\n label: t('editor.blockquote.tooltip'),\n isActive: () => props.editor.isActive('blockquote'),\n iconName: 'TextQuote',\n action: () => props.editor.chain().focus().clearNodes().toggleBlockquote().run(),\n },\n {\n name: 'codeBlock',\n label: t('editor.codeblock.tooltip'),\n isActive: () => props.editor.isActive('codeBlock'),\n iconName: 'Code2',\n action: () => props.editor.chain().focus().clearNodes().toggleCodeBlock().run(),\n },\n ]\n }, [props.editor, t])\n\n const activeItem = useMemo(() => {\n return (\n menus.filter(item => item.isActive()).pop() ?? {\n label: 'Empty',\n }\n )\n }, [menus])\n\n return (\n <>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"h-[32px] flex gap-1 px-1.5\">\n <span className=\"text-sm font-normal whitespace-nowrap\">\n {' '}\n {activeItem?.label}\n </span>\n <ChevronDown className=\"w-4 h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent hideWhenDetached className=\"w-full p-1\" align=\"start\" sideOffset={5}>\n {menus.map((item, index) => {\n const Icon = icons[item.iconName as any]\n\n return (\n <DropdownMenuCheckboxItem\n key={index}\n checked={item.isActive?.() || false}\n onClick={() => item.action()}\n className=\"cursor-pointer\"\n >\n <div className=\"flex items-center gap-2 px-2\">\n <Icon className=\"w-3 h3\" />\n <span>\n {' '}\n {item.label}\n </span>\n </div>\n </DropdownMenuCheckboxItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n </>\n )\n}\n\nexport default TextDropdown\n","import { Extension } from '@tiptap/core'\n\nimport TextDropdown from './components/TextDropdown'\nimport type { GeneralOptions } from '@/types'\n\nexport interface TextBubbleOptions extends GeneralOptions<TextBubbleOptions> {}\n\nexport const TextBubble = Extension.create<TextBubbleOptions>({\n name: 'text-bubble',\n addOptions() {\n return {\n ...this.parent?.(),\n toolbar: false,\n button: () => ({\n component: TextDropdown,\n componentProps: {},\n }),\n }\n },\n})\n\nexport default TextBubble\n","import { Extension } from '@tiptap/core'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\n\n// @ts-ignore\nfunction nodeEqualsType({ types, node }) {\n return (Array.isArray(types) && types.includes(node.type)) || node.type === types\n}\n\n/**\n * Extension based on:\n * - https://github.com/ueberdosis/tiptap/blob/v1/packages/tiptap-extensions/src/extensions/TrailingNode.js\n * - https://github.com/remirror/remirror/blob/e0f1bec4a1e8073ce8f5500d62193e52321155b9/packages/prosemirror-trailing-node/src/trailing-node-plugin.ts\n */\n\nexport interface TrailingNodeOptions {\n node: string\n notAfter: string[]\n}\n\nexport const TrailingNode = Extension.create<TrailingNodeOptions>({\n name: 'trailingNode',\n\n addOptions() {\n return {\n node: 'paragraph',\n notAfter: ['paragraph'],\n }\n },\n\n addProseMirrorPlugins() {\n const plugin = new PluginKey(this.name)\n const disabledNodes = Object.entries(this.editor.schema.nodes)\n .map(([, value]) => value)\n .filter(node => this.options.notAfter.includes(node.name))\n\n return [\n new Plugin({\n key: plugin,\n appendTransaction: (_, __, state) => {\n const { doc, tr, schema } = state\n const shouldInsertNodeAtEnd = plugin.getState(state)\n const endPosition = doc.content.size\n const type = schema.nodes[this.options.node]\n\n if (!shouldInsertNodeAtEnd) {\n return\n }\n\n return tr.insert(endPosition, type.create())\n },\n state: {\n init: (_, state) => {\n const lastNode = state.tr.doc.lastChild\n\n return !nodeEqualsType({ node: lastNode, types: disabledNodes })\n },\n apply: (tr, value) => {\n if (!tr.docChanged) {\n return value\n }\n\n const lastNode = tr.doc.lastChild\n\n return !nodeEqualsType({ node: lastNode, types: disabledNodes })\n },\n },\n }),\n ]\n },\n})\n","import type { AnyExtension } from '@tiptap/core'\nimport { Extension } from '@tiptap/core'\nimport type { CharacterCountOptions } from '@tiptap/extension-character-count'\nimport { CharacterCount } from '@tiptap/extension-character-count'\nimport { Document as TiptapDocumentDefault } from '@tiptap/extension-document'\nimport type { DropcursorOptions } from '@tiptap/extension-dropcursor'\nimport { Dropcursor } from '@tiptap/extension-dropcursor'\nimport type { FocusOptions } from '@tiptap/extension-focus'\nimport Focus from '@tiptap/extension-focus'\nimport { Gapcursor } from '@tiptap/extension-gapcursor'\nimport type { HardBreakOptions } from '@tiptap/extension-hard-break'\nimport { HardBreak } from '@tiptap/extension-hard-break'\nimport type { ListItemOptions } from '@tiptap/extension-list-item'\nimport { ListItem } from '@tiptap/extension-list-item'\nimport type { ParagraphOptions } from '@tiptap/extension-paragraph'\nimport { Paragraph } from '@tiptap/extension-paragraph'\nimport type { PlaceholderOptions } from '@tiptap/extension-placeholder'\nimport { Placeholder } from '@tiptap/extension-placeholder'\nimport { Text } from '@tiptap/extension-text'\nimport type { TextStyleOptions } from '@tiptap/extension-text-style'\nimport { TextStyle } from '@tiptap/extension-text-style'\n\nimport { Document } from '@/extensions/Document'\nimport { MultiColumn } from '@/extensions/MultiColumn'\nimport { Selection } from '@/extensions/Selection'\nimport type { TextBubbleOptions } from '@/extensions/TextBubble'\nimport { TextBubble } from '@/extensions/TextBubble'\nimport type { TrailingNodeOptions } from '@/extensions/TrailingNode'\nimport { TrailingNode } from '@/extensions/TrailingNode'\nimport { localeActions } from '@/locales'\n\n/**\n * Represents the interface for options in the base toolkit.\n */\nexport interface BaseKitOptions {\n /**\n * Whether to enable the document option\n *\n * @default false\n */\n multiColumn?: boolean\n\n /**\n * Whether to enable the text option\n *\n * @default true\n */\n text: false\n\n /**\n * Whether to enable the Gapcursor\n *\n * @default true\n */\n gapcursor: false\n\n /**\n * Dropcursor options or false, indicating whether to enable the drop cursor\n *\n * @default true\n */\n dropcursor: Partial<DropcursorOptions> | false\n\n /**\n * character count options or false, indicating whether to enable character count\n *\n * @default true\n */\n characterCount: Partial<CharacterCountOptions> | false\n\n /**\n * HardBreak options or false, indicating whether to enable hard breaks\n *\n * @default true\n */\n hardBreak: Partial<HardBreakOptions> | false\n\n /**\n * Placeholder options or false, indicating whether to enable placeholders\n *\n * @default true\n */\n placeholder: Partial<PlaceholderOptions> | false\n\n /**\n * Paragraph options or false, indicating whether to enable paragraph functionality\n *\n * @default true\n */\n paragraph: Partial<ParagraphOptions> | false\n\n /**\n * Focus options or false, indicating whether to enable focus functionality\n *\n * @default true\n */\n focus: Partial<FocusOptions> | false\n\n /**\n * ListItem options or false, indicating whether to enable list item functionality\n *\n * @default true\n */\n listItem: Partial<ListItemOptions> | false\n\n /**\n * Text Style options or false, indicating whether to enable text style functionality\n *\n * @default true\n */\n textStyle: Partial<TextStyleOptions> | false\n\n /**\n * Bubble options, taking `BubbleOptions<BaseKitOptions>` as parameters, indicating whether to enable the bubble functionality\n */\n // bubble: Partial<BubbleOptions<BaseKitOptions>>;\n bubble: any\n\n /**\n * Iframe options or false, indicating whether to enable the iframe\n *\n * @default true\n */\n // iframe: Partial<IframeOptions> | false;\n\n /**\n * Trailing node options or false, indicating whether to enable the trailing node\n *\n * @default true\n */\n trailingNode: Partial<TrailingNodeOptions> | false\n /**\n * textBubble options or false, indicating whether to enable the textBubble\n *\n * @default true\n */\n textBubble: Partial<TextBubbleOptions> | false\n /**\n * selection options or false, indicating whether to enable the selection\n *\n * @default true\n */\n selection: any | false\n}\n\nexport const BaseKit = Extension.create<BaseKitOptions>({\n name: 'base-kit',\n\n addExtensions() {\n const extensions: AnyExtension[] = []\n if (this.options.multiColumn) {\n extensions.push(Document.configure())\n extensions.push(MultiColumn)\n }\n else {\n extensions.push(TiptapDocumentDefault)\n }\n\n if (this.options.placeholder !== false) {\n extensions.push(\n Placeholder.configure({\n placeholder: ({ node, pos, editor }) => {\n if (node?.type?.name === 'heading') {\n // @ts-expect-error\n return `${localeActions.t(`editor.heading.h${node.attrs.level}.tooltip`)}`\n }\n if (node?.type?.name === 'codeBlock' || node?.type?.name === 'table') {\n return ''\n }\n if (editor.extensionManager.extensions.some(ext => ext.name === 'slashCommand')) {\n return localeActions.t('editor.slash')\n }\n if (pos === 0) {\n return localeActions.t('editor.content')\n }\n return localeActions.t('editor.content')\n },\n ...this.options.placeholder,\n }),\n )\n }\n\n if (this.options.focus !== false) {\n extensions.push(\n Focus.configure({\n className: 'focus',\n ...this.options.focus,\n }),\n )\n }\n\n if (this.options.text !== false) {\n extensions.push(Text.configure())\n }\n if (this.options.textBubble !== false) {\n extensions.push(TextBubble.configure())\n }\n\n if (this.options.gapcursor !== false) {\n extensions.push(Gapcursor.configure())\n }\n\n if (this.options.dropcursor !== false) {\n extensions.push(\n Dropcursor.configure({\n ...this.options.dropcursor,\n width: 2,\n class: 'ProseMirror-dropcursor border-black',\n }),\n )\n }\n\n if (this.options.characterCount !== false) {\n extensions.push(CharacterCount.configure(this.options.characterCount))\n }\n\n if (this.options.paragraph !== false) {\n extensions.push(Paragraph.configure(this.options.paragraph))\n }\n\n if (this.options.hardBreak !== false) {\n extensions.push(HardBreak.configure(this.options.hardBreak))\n }\n\n if (this.options.listItem !== false) {\n extensions.push(ListItem.configure(this.options.listItem))\n }\n\n if (this.options.textStyle !== false) {\n extensions.push(TextStyle.configure(this.options.textStyle))\n }\n\n if (this.options.trailingNode !== false) {\n extensions.push(TrailingNode.configure(this.options.trailingNode))\n }\n\n if (this.options.selection !== false) {\n extensions.push(Selection)\n }\n\n return extensions\n },\n})\n","import type { Extensions } from '@tiptap/core'\nimport { Extension } from '@tiptap/core'\nimport type { SubscriptExtensionOptions as TiptapSubscriptOptions } from '@tiptap/extension-subscript'\nimport { Subscript as TiptapSubscript } from '@tiptap/extension-subscript'\nimport type { SuperscriptExtensionOptions as TiptapSuperscriptOptions } from '@tiptap/extension-superscript'\nimport { Superscript as TiptapSuperscript } from '@tiptap/extension-superscript'\n\nimport { ActionButton } from '@/components'\nimport type { ButtonViewReturn, GeneralOptions } from '@/types'\n\n/**\n * Represents the interface for subscript and superscript options, extending GeneralOptions.\n */\nexport interface SubAndSuperScriptOptions extends GeneralOptions<SubAndSuperScriptOptions> {\n /**\n * subscript options or false, indicating whether subscript is enabled\n *\n * @default true\n */\n subscript: Partial<TiptapSubscriptOptions> | false\n /**\n * superscript options or false, indicating whether superscript is enabled\n *\n * @default true\n */\n superscript: Partial<TiptapSuperscriptOptions> | false\n}\n\nexport const SubAndSuperScript = Extension.create<SubAndSuperScriptOptions>({\n name: 'subAndSuperScript',\n\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, extension, t }) => {\n const subscript = extension.options.subscript\n const superscript = extension.options.superscript\n\n const subBtn: ButtonViewReturn = {\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleSubscript(),\n isActive: () => editor.isActive('subscript') || false,\n disabled: !editor.can().toggleSubscript(),\n icon: 'Subscript',\n tooltip: t('editor.subscript.tooltip'),\n },\n }\n\n const superBtn: ButtonViewReturn = {\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleSuperscript(),\n isActive: () => editor.isActive('superscript') || false,\n disabled: !editor.can().toggleSuperscript(),\n icon: 'Superscript',\n tooltip: t('editor.superscript.tooltip'),\n },\n }\n\n const items: ButtonViewReturn[] = []\n\n if (subscript !== false) {\n items.push(subBtn)\n }\n if (superscript !== false) {\n items.push(superBtn)\n }\n\n return items\n },\n }\n },\n\n addExtensions() {\n const extensions: Extensions = []\n\n if (this.options.subscript !== false) {\n extensions.push(TiptapSubscript.configure(this.options.subscript))\n }\n\n if (this.options.superscript !== false) {\n extensions.push(TiptapSuperscript.configure(this.options.superscript))\n }\n\n return extensions\n },\n})\n","import React, { useMemo } from 'react'\n\nimport {\n ActionButton,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n IconComponent,\n MenuDown,\n} from '@/components'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKeys } from '@/utils/plateform'\n\nexport interface Item {\n title: string\n icon?: any\n isActive: NonNullable<ButtonViewReturnComponentProps['isActive']>\n action?: ButtonViewReturnComponentProps['action']\n style?: React.CSSProperties\n shortcutKeys?: string[]\n disabled?: boolean\n divider?: boolean\n default?: boolean\n}\ninterface IPropsActionMoreButton {\n editor: any\n disabled?: boolean\n color?: string\n maxHeight?: string | number\n icon?: any\n tooltip?: string\n items?: Item[]\n}\n\nfunction ActionMoreButton(props: IPropsActionMoreButton) {\n const active = useMemo(() => {\n const find: any = props?.items?.find((k: any) => k.isActive())\n if (find && !find.default) {\n return {\n ...find,\n icon: find?.icon ? find?.icon : props?.icon,\n }\n }\n const item: Item = {\n title: props.tooltip as any,\n icon: props.icon,\n isActive: () => false,\n }\n\n return item\n }, [props])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger disabled={props?.disabled} asChild>\n <ActionButton\n customClass=\"w-12\"\n icon={props?.icon}\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n >\n <MenuDown className=\"w-3 h-3 text-gray-500\" />\n </ActionButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-full\">\n {props?.items?.map((item: any, index) => {\n return (\n <DropdownMenuCheckboxItem\n checked={active.title === item.title}\n onClick={item.action}\n key={index}\n className=\"flex items-center gap-3\"\n >\n <IconComponent name={item?.icon} />\n <span className=\"ml-1\">{item.title}</span>\n {!!item?.shortcutKeys && (\n <span className=\"ml-auto text-xs tracking-widest opacity-60\">\n {getShortcutKeys(item.shortcutKeys)}\n </span>\n )}\n </DropdownMenuCheckboxItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default ActionMoreButton\n","import { Extension } from '@tiptap/core'\nimport type { Extensions } from '@tiptap/core'\nimport type { SubscriptExtensionOptions as TiptapSubscriptOptions } from '@tiptap/extension-subscript'\nimport { Subscript as TiptapSubscript } from '@tiptap/extension-subscript'\nimport type { SuperscriptExtensionOptions as TiptapSuperscriptOptions } from '@tiptap/extension-superscript'\nimport { Superscript as TiptapSuperscript } from '@tiptap/extension-superscript'\n\nimport type { Item } from '@/extensions/MoreMark/components/ActionMoreButton'\nimport ActionMoreButton from '@/extensions/MoreMark/components/ActionMoreButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface MoreMarkOptions extends GeneralOptions<MoreMarkOptions> {\n /**\n * // 下标\n *\n * @default true\n */\n subscript: Partial<TiptapSubscriptOptions> | false\n /**\n * // 上标\n *\n * @default true\n */\n superscript: Partial<TiptapSuperscriptOptions> | false\n}\n\nexport const MoreMark = Extension.create<MoreMarkOptions>({\n name: 'moreMark',\n addOptions() {\n return {\n ...this.parent?.(),\n button({ editor, extension, t }) {\n const subscript = extension.options.subscript\n const superscript = extension.options.superscript\n const subBtn: Item = {\n action: () => editor.commands.toggleSubscript(),\n isActive: () => editor.isActive('subscript') || false,\n disabled: !editor.can().toggleSubscript(),\n icon: 'Subscript',\n title: t('editor.subscript.tooltip'),\n shortcutKeys: ['mod', '.'],\n }\n\n const superBtn: Item = {\n action: () => editor.commands.toggleSuperscript(),\n isActive: () => editor.isActive('superscript') || false,\n disabled: !editor.can().toggleSuperscript(),\n icon: 'Superscript',\n title: t('editor.superscript.tooltip'),\n shortcutKeys: ['mod', ','],\n }\n // const hasCode = hasExtension(editor, 'code');\n\n const items: Item[] = []\n\n if (subscript !== false) {\n items.push(subBtn)\n }\n if (superscript !== false) {\n items.push(superBtn)\n }\n // if (hasCode) {\n // const codeBtn: Item = {\n // action: () => editor.commands.toggleCode(),\n // isActive: () => editor.isActive('code') || false,\n // disabled: !editor.can().toggleCode(),\n // icon: 'Code',\n // title: t('editor.code.tooltip'),\n // shortcutKeys: ['mod', 'E'],\n // };\n // if (hasCode) {\n // items.push(codeBtn);\n // }\n // }\n\n return {\n component: ActionMoreButton,\n componentProps: {\n icon: 'Type',\n tooltip: t('editor.moremark'),\n disabled: !editor.isEditable,\n items,\n },\n }\n },\n }\n },\n\n addExtensions() {\n const extensions: Extensions = []\n\n if (this.options.subscript !== false) {\n extensions.push(TiptapSubscript.configure(this.options.subscript))\n }\n\n if (this.options.superscript !== false) {\n extensions.push(TiptapSuperscript.configure(this.options.superscript))\n }\n\n return extensions\n },\n})\n","import { Extension } from '@tiptap/core'\nimport type { Editor } from '@tiptap/core'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\nimport { IndentProps, createIndentCommand } from '@/utils/indent'\n\nexport interface IndentOptions extends GeneralOptions<IndentOptions> {\n types: string[]\n minIndent: number\n maxIndent: number\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n indent: {\n /**\n * Set the indent attribute\n */\n indent: () => ReturnType\n /**\n * Set the outdent attribute\n */\n outdent: () => ReturnType\n }\n }\n}\n\nexport const Indent = Extension.create<IndentOptions>({\n name: 'indent',\n addOptions() {\n return {\n ...this.parent?.(),\n types: ['paragraph', 'heading', 'blockquote'],\n minIndent: IndentProps.min,\n maxIndent: IndentProps.max,\n button({ editor, t }: { editor: Editor, t: (...args: any[]) => string }) {\n return [\n {\n component: ActionButton,\n componentProps: {\n action: () => {\n editor.commands.indent()\n },\n shortcutKeys: ['Tab'],\n icon: 'IndentIncrease',\n tooltip: t('editor.indent.tooltip'),\n },\n },\n {\n component: ActionButton,\n componentProps: {\n action: () => {\n editor.commands.outdent()\n },\n shortcutKeys: ['Shift', 'Tab'],\n icon: 'IndentDecrease',\n tooltip: t('editor.outdent.tooltip'),\n },\n },\n ]\n },\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n indent: {\n default: 0,\n parseHTML: (element) => {\n const identAttr = element.dataset.indent\n return (identAttr ? Number.parseInt(identAttr, 10) : 0) || 0\n },\n renderHTML: (attributes) => {\n if (!attributes.indent) {\n return {}\n }\n return { 'data-indent': attributes.indent }\n },\n },\n },\n },\n ]\n },\n\n addCommands() {\n return {\n indent: () =>\n createIndentCommand({\n delta: IndentProps.more,\n types: this.options.types,\n }),\n outdent: () =>\n createIndentCommand({\n delta: IndentProps.less,\n types: this.options.types,\n }),\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Tab': () => this.editor.commands.indent(),\n 'Shift-Tab': () => this.editor.commands.outdent(),\n }\n },\n})\n","import React, { useMemo, useState } from 'react'\n\nimport {\n ActionButton,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n IconComponent,\n} from '@/components'\nimport { useLocale } from '@/locales'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\ninterface IPropsLineHeightDropdown {\n editor: any\n icon?: any\n tooltip?: string\n disabled?: boolean\n action?: ButtonViewReturnComponentProps['action']\n isActive?: ButtonViewReturnComponentProps['isActive']\n}\n\nfunction percentageToDecimal(percentageString: any) {\n const percentage = Number.parseFloat(percentageString.replace('%', ''))\n const decimal = percentage / 100\n return decimal\n}\n\nfunction LineHeightDropdown(props: IPropsLineHeightDropdown) {\n const { t } = useLocale()\n const [value, setValue] = useState('default')\n\n function toggleLightheight(key: string) {\n if (key === 'default') {\n props.editor.commands.unsetLineHeight()\n }\n else {\n props.editor.commands.setLineHeight(key)\n }\n setValue(key)\n }\n\n const LineHeights = useMemo(() => {\n const lineHeightOptions = props.editor.extensionManager.extensions.find(\n (e: any) => e.name === 'lineHeight',\n )!.options\n const a = lineHeightOptions.lineHeights\n const b = a.map((item: any) => ({\n label: percentageToDecimal(item),\n value: item,\n }))\n\n b.unshift({\n label: t('editor.default'),\n value: 'default',\n })\n return b\n }, [props])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger disabled={props?.disabled} asChild>\n <ActionButton\n customClass=\"w-12\"\n icon=\"LineHeight\"\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n >\n <IconComponent className=\"w-3 h-3 ml-1 text-zinc-500\" name=\"MenuDown\" />\n </ActionButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"min-w-24\">\n {LineHeights?.map((item: any, index: any) => {\n return (\n <DropdownMenuCheckboxItem\n key={`lineHeight-${index}`}\n checked={item.value === value}\n onClick={() => toggleLightheight(item.value)}\n >\n {item.label}\n </DropdownMenuCheckboxItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default LineHeightDropdown\n","import type { Command } from '@tiptap/core'\nimport type { NodeType, Node as ProsemirrorNode } from '@tiptap/pm/model'\nimport type { EditorState, Transaction } from '@tiptap/pm/state'\nimport { AllSelection, TextSelection } from '@tiptap/pm/state'\n\nimport { DEFAULT_LINE_HEIGHT } from '@/constants'\n\nexport const ALLOWED_NODE_TYPES = ['paragraph', 'heading', 'list_item', 'todo_item']\n\nexport function isLineHeightActive(state: EditorState, lineHeight: string): boolean {\n const { selection, doc } = state\n const { from, to } = selection\n\n let keepLooking = true\n let active = false\n\n doc.nodesBetween(from, to, (node) => {\n const nodeType = node.type\n const lineHeightValue = node.attrs.lineHeight || DEFAULT_LINE_HEIGHT\n\n if (ALLOWED_NODE_TYPES.includes(nodeType.name)) {\n if (keepLooking && lineHeight === lineHeightValue) {\n keepLooking = false\n active = true\n\n return false\n }\n return nodeType.name !== 'list_item' && nodeType.name !== 'todo_item'\n }\n return keepLooking\n })\n\n return active\n}\n\ninterface SetLineHeightTask {\n node: ProsemirrorNode\n nodeType: NodeType\n pos: number\n}\n\nexport function setTextLineHeight(tr: Transaction, lineHeight: string | null): Transaction {\n const { selection, doc } = tr\n\n if (!selection || !doc) {\n return tr\n }\n\n if (!(selection instanceof TextSelection || selection instanceof AllSelection)) {\n return tr\n }\n\n const { from, to } = selection\n\n const tasks: Array<SetLineHeightTask> = []\n const lineHeightValue = lineHeight && lineHeight !== DEFAULT_LINE_HEIGHT ? lineHeight : null\n\n doc.nodesBetween(from, to, (node, pos) => {\n const nodeType = node.type\n if (ALLOWED_NODE_TYPES.includes(nodeType.name)) {\n const lineHeight = node.attrs.lineHeight || null\n if (lineHeight !== lineHeightValue) {\n tasks.push({\n node,\n pos,\n nodeType,\n })\n }\n return nodeType.name !== 'list_item' && nodeType.name !== 'todo_item'\n }\n return true\n })\n\n if (tasks.length === 0) {\n return tr\n }\n\n for (const task of tasks) {\n const { node, pos, nodeType } = task\n let { attrs } = node\n\n attrs = {\n ...attrs,\n lineHeight: lineHeightValue,\n }\n\n tr = tr.setNodeMarkup(pos, nodeType, attrs, node.marks)\n }\n\n return tr\n}\n\nexport function createLineHeightCommand(lineHeight: string): Command {\n return ({ state, dispatch }) => {\n const { selection } = state\n let { tr } = state\n tr = tr.setSelection(selection)\n\n tr = setTextLineHeight(tr, lineHeight)\n\n if (tr.docChanged) {\n if (dispatch)\n dispatch(tr)\n return true\n }\n\n return false\n }\n}\n","import { Extension } from '@tiptap/core'\nimport type { Editor } from '@tiptap/core'\n\nimport { DEFAULT_LINE_HEIGHT } from '@/constants'\nimport LineHeightDropdown from '@/extensions/LineHeight/components/LineHeightDropdown'\nimport type { GeneralOptions } from '@/types'\nimport { createLineHeightCommand } from '@/utils/line-height'\n\nexport interface LineHeightOptions extends GeneralOptions<LineHeightOptions> {\n types: string[]\n lineHeights: string[]\n defaultHeight: string\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n lineHeight: {\n setLineHeight: (lineHeight: string) => ReturnType\n unsetLineHeight: () => ReturnType\n }\n }\n}\n\nexport const LineHeight = Extension.create<LineHeightOptions>({\n name: 'lineHeight',\n addOptions() {\n return {\n ...this.parent?.(),\n types: ['paragraph', 'heading', 'list_item', 'todo_item'],\n lineHeights: ['100%', '115%', '150%', '200%', '250%', '300%'],\n defaultHeight: DEFAULT_LINE_HEIGHT,\n button({ editor, t }: { editor: Editor, t: any }) {\n return {\n component: LineHeightDropdown,\n componentProps: {\n editor,\n tooltip: t('editor.lineheight.tooltip'),\n },\n }\n },\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: null,\n parseHTML: (element) => {\n return element.style.lineHeight || this.options.defaultHeight\n },\n renderHTML: (attributes) => {\n if (attributes.lineHeight === this.options.defaultHeight || !attributes.lineHeight) {\n return {}\n }\n return { style: `line-height: ${attributes.lineHeight}` }\n },\n },\n },\n },\n ]\n },\n\n addCommands() {\n return {\n setLineHeight: lineHeight => createLineHeightCommand(lineHeight),\n unsetLineHeight:\n () =>\n ({ commands }) => {\n return this.options.types.every(type => commands.resetAttributes(type, 'lineHeight'))\n },\n }\n },\n})\n","import type { Extensions } from '@tiptap/core'\n\nimport type { Group } from './types'\nimport type { HeadingOptions } from '@/extensions'\nimport { localeActions } from '@/locales'\n\nexport function renderGroups(extensions: Extensions) {\n const groups: Group[] = [\n {\n name: 'format',\n title: localeActions.t('editor.slash.format'),\n commands: [],\n },\n {\n name: 'insert',\n title: localeActions.t('editor.slash.insert'),\n commands: [],\n },\n ]\n\n extensions.forEach((extension) => {\n /* Format */\n if (extension.name.toLowerCase() === 'heading') {\n extension.options.levels.forEach((level: HeadingOptions['levels'][number]) => {\n groups[0].commands.push({\n name: `heading${level}`,\n label: localeActions.t(`editor.heading.h${level}.tooltip`),\n aliases: [`h${level}`, 'bt', `bt${level}`],\n iconName: `Heading${level}`,\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setHeading({ level }).run()\n },\n })\n })\n }\n\n if (extension.name.toLowerCase() === 'bulletlist') {\n groups[0].commands.push({\n name: 'bulletList',\n label: localeActions.t('editor.bulletlist.tooltip'),\n aliases: ['ul', 'yxlb'],\n iconName: 'List',\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleBulletList().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'orderedlist') {\n groups[0].commands.push({\n name: 'numberedList',\n label: localeActions.t('editor.orderedlist.tooltip'),\n aliases: ['ol', 'yxlb'],\n iconName: 'ListOrdered',\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleOrderedList().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'tasklist') {\n groups[0].commands.push({\n name: 'taskList',\n label: localeActions.t('editor.tasklist.tooltip'),\n iconName: 'ListTodo',\n description: 'Task list with todo items',\n aliases: ['todo'],\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleTaskList().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'blockquote') {\n groups[0].commands.push({\n name: 'blockquote',\n label: localeActions.t('editor.blockquote.tooltip'),\n description: '插入引入格式',\n aliases: ['yr'],\n iconName: 'TextQuote',\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setBlockquote().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'codeblock') {\n groups[0].commands.push({\n name: 'codeBlock',\n label: localeActions.t('editor.codeblock.tooltip'),\n iconName: 'Code2',\n description: 'Code block with syntax highlighting',\n shouldBeHidden: editor => editor.isActive('columns'),\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setCodeBlock().run()\n },\n })\n }\n\n /* Insert */\n if (extension.name.toLowerCase() === 'image') {\n groups[1].commands.push({\n name: 'image',\n label: localeActions.t('editor.image.tooltip'),\n iconName: 'ImageUp',\n description: 'Insert a image',\n aliases: ['image', 'tp', 'tupian'],\n shouldBeHidden: editor => editor.isActive('columns'),\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setImageUpload().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'video') {\n groups[1].commands.push({\n name: 'video',\n label: localeActions.t('editor.video.tooltip'),\n iconName: 'Video',\n description: 'Insert a video',\n aliases: ['video', 'sp', 'shipin'],\n shouldBeHidden: editor => editor.isActive('columns'),\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setVideoUpload().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'table') {\n groups[1].commands.push({\n name: 'table',\n label: localeActions.t('editor.table.tooltip'),\n iconName: 'Table',\n description: 'Insert a table',\n aliases: ['table', 'bg', 'biaoge', 'biao'],\n shouldBeHidden: editor => editor.isActive('columns'),\n action: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertTable({ rows: 3, cols: 3, withHeaderRow: false })\n .run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'horizontalrule') {\n groups[1].commands.push({\n name: 'horizontalRule',\n label: localeActions.t('editor.horizontalrule.tooltip'),\n iconName: 'Minus',\n description: 'Insert a horizontal divider',\n aliases: ['hr', 'fgx', 'fg'],\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setHorizontalRule().run()\n },\n })\n }\n\n // if (extension.name.toLowerCase() === 'columns') {\n // groups[1].commands.push({\n // name: 'columns',\n // label: localeActions.t('editor.columns.tooltip'),\n // iconName: 'Columns2',\n // description: 'Add two column content',\n // aliases: ['columns', 'cols', '2cols'],\n // shouldBeHidden: (editor) => editor.isActive('columns'),\n // action: ({ editor, range }) => {\n // editor\n // .chain()\n // .deleteRange(range)\n // .setColumns()\n // .focus(editor.state.selection.head - 1)\n // .run();\n // },\n // })\n // }\n })\n\n return groups\n}\n","import React, {\n Fragment,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react'\n\nimport { IconComponent } from '@/components'\nimport { useLocale } from '@/locales'\n\nfunction CommandsList(props: any, ref: any) {\n // 选中的索引\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0)\n const [selectedGroupIndex, setSelectedGroupIndex] = useState(0)\n // 滚动ref\n const scrollContainer = useRef<HTMLDivElement | null>(null)\n\n const { t } = useLocale()\n\n const activeItemRefs = useRef<(HTMLButtonElement | null)[]>([])\n\n useImperativeHandle(ref, () => {\n return {\n onKeyDown,\n }\n })\n\n useEffect(() => {\n if (!scrollContainer.current) {\n return\n }\n const activeItemIndex = selectedGroupIndex * 1000 + selectedCommandIndex\n const activeItem = activeItemRefs.current[activeItemIndex]\n if (activeItem) {\n activeItem.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n })\n }\n }, [selectedCommandIndex, selectedGroupIndex])\n\n function onKeyDown({ event }: any) {\n if (event.key === 'ArrowUp') {\n upHandler()\n return true\n }\n\n if (event.key === 'ArrowDown') {\n downHandler()\n return true\n }\n\n if (event.key === 'Enter') {\n enterHandler()\n return true\n }\n\n return false\n }\n\n function upHandler() {\n if (props.items.length === 0) {\n return false\n }\n let newCommandIndex = selectedCommandIndex - 1\n let newGroupIndex = selectedGroupIndex\n\n if (newCommandIndex < 0) {\n newGroupIndex = selectedGroupIndex - 1\n newCommandIndex = props.items[newGroupIndex]?.commands.length - 1 || 0\n }\n\n if (newGroupIndex < 0) {\n newGroupIndex = props.items.length - 1\n newCommandIndex = props.items[newGroupIndex].commands.length - 1\n }\n\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n }\n\n function downHandler() {\n if (props.items.length === 0) {\n return false\n }\n const commands = props.items[selectedGroupIndex].commands\n let newCommandIndex = selectedCommandIndex + 1\n let newGroupIndex = selectedGroupIndex\n\n if (commands.length - 1 < newCommandIndex) {\n newCommandIndex = 0\n newGroupIndex = selectedGroupIndex + 1\n }\n if (props.items.length - 1 < newGroupIndex) {\n newGroupIndex = 0\n }\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n }\n\n function enterHandler() {\n if (props.items.length === 0 || selectedGroupIndex === -1 || selectedCommandIndex === -1) {\n return false\n }\n\n selectItem(selectedGroupIndex, selectedCommandIndex)\n }\n\n function selectItem(groupIndex: number, commandIndex: number) {\n const command = props.items[groupIndex].commands[commandIndex]\n props.command(command)\n }\n\n function createCommandClickHandler(groupIndex: number, commandIndex: number) {\n selectItem(groupIndex, commandIndex)\n }\n function setActiveItemRef(groupIndex: number, commandIndex: number, el: any) {\n activeItemRefs.current[groupIndex * 1000 + commandIndex] = el\n }\n\n return (\n <div\n className=\"bg-white rounded-lg dark:bg-black shadow-sm border border-neutral-200 dark:border-neutral-800 text-black max-h-[min(80vh,24rem)] overflow-auto flex-wrap mb-8 p-1\"\n ref={scrollContainer}\n >\n {props?.items?.length\n ? (\n <div className=\"grid grid-cols-1 gap-0.5 min-w-48\">\n {props?.items?.map((group: any, groupIndex: any) => {\n return (\n <Fragment key={group.title}>\n <div className=\"text-neutral-500 text-[0.65rem] col-[1/-1] mx-2 mt-2 font-semibold tracking-wider select-none uppercase first:mt-0.5\">\n {group.title}\n </div>\n\n {group.commands.map((command: any, commandIndex: any) => {\n return (\n <button\n className={`flex items-center gap-3 px-2 py-1.5 text-sm text-neutral-800 dark:text-neutral-200 text-left w-full rounded-sm outline-none transition-colors ${\n selectedGroupIndex === groupIndex && selectedCommandIndex === commandIndex\n ? 'bg-accent text-neutral-800 dark:bg-neutral-900 dark:text-neutral-200'\n : 'hover:bg-accent hover:text-neutral-800 dark:hover:bg-neutral-900 dark:hover:text-neutral-200'\n }`}\n ref={el => setActiveItemRef(groupIndex, commandIndex, el)}\n key={`command-${commandIndex}`}\n onClick={() => createCommandClickHandler(groupIndex, commandIndex)}\n >\n {command.iconUrl && <img className=\"w-6 h-6\" src={command.iconUrl} alt=\"\" />}\n {command.iconName && (\n <IconComponent name={command.iconName} className=\"mr-1 text-lg\" />\n )}\n {command.label}\n </button>\n )\n })}\n </Fragment>\n )\n })}\n </div>\n )\n : (\n <div className=\"p-3\">\n <span className=\"text-xs text-gray-800 dark:text-gray-100\">\n {t('editor.slash.empty')}\n </span>\n </div>\n )}\n </div>\n )\n}\n\nexport default forwardRef(CommandsList)\n","import type { Editor, Range } from '@tiptap/core'\nimport { Extension } from '@tiptap/core'\nimport { PluginKey } from '@tiptap/pm/state'\nimport { ReactRenderer } from '@tiptap/react'\nimport type { SuggestionKeyDownProps, SuggestionProps } from '@tiptap/suggestion'\nimport Suggestion from '@tiptap/suggestion'\nimport tippy from 'tippy.js'\n\nimport { renderGroups } from './groups'\nimport CommandsList from '@/extensions/SlashCommand/components/CommandsList'\n\nconst extensionName = 'slashCommand'\nlet popup: any\nexport const SlashCommand = Extension.create({\n name: extensionName,\n priority: 200,\n onCreate() {\n popup = tippy('body', {\n interactive: true,\n trigger: 'manual',\n placement: 'bottom-start',\n theme: 'slash-command',\n maxWidth: '16rem',\n offset: [16, 8],\n popperOptions: {\n strategy: 'fixed',\n modifiers: [\n {\n name: 'flip',\n enabled: false,\n },\n ],\n },\n })\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n char: '/',\n allowSpaces: true,\n startOfLine: true,\n pluginKey: new PluginKey(extensionName),\n allow: ({ state, range }) => {\n const $from = state.doc.resolve(range.from)\n const isRootDepth = $from.depth === 1\n const isParagraph = $from.parent.type.name === 'paragraph'\n const isStartOfNode = $from.parent.textContent?.charAt(0) === '/'\n // TODO 行列内\n const isInColumn = this.editor.isActive('column')\n const afterContent = $from.parent.textContent?.slice(\n Math.max(0, $from.parent.textContent?.indexOf('/')),\n )\n const isValidAfterContent = !afterContent?.endsWith(' ')\n\n return (\n ((isRootDepth && isParagraph && isStartOfNode)\n || (isInColumn && isParagraph && isStartOfNode))\n && isValidAfterContent\n )\n },\n command: ({ editor, range, props }: { editor: Editor, range: Range, props: any }) => {\n const { view } = editor\n props.action({ editor, range })\n view.focus()\n },\n items: ({ query, editor }: { query: string, editor: Editor }) => {\n // get options\n // Filter commands\n const groups = renderGroups(editor.extensionManager.extensions)\n const withFilteredCommands = groups.map(group => ({\n ...group,\n commands: group.commands\n .filter((item) => {\n const labelNormalized = item.label.toLowerCase().trim()\n const queryNormalized = query.toLowerCase().trim()\n\n if (item.aliases) {\n const aliases = item.aliases.map(alias => alias.toLowerCase().trim())\n const labelMatch = labelNormalized.match(queryNormalized)\n const aliasMatch = aliases.some(alias => alias.match(queryNormalized))\n\n return labelMatch || aliasMatch\n }\n\n return labelNormalized.match(queryNormalized)\n })\n .filter(command =>\n command.shouldBeHidden ? !command.shouldBeHidden(this.editor) : true,\n ),\n }))\n // Remove empty groups\n const withoutEmptyGroups = withFilteredCommands.filter((group) => {\n if (group.commands.length > 0) {\n return true\n }\n\n return false\n })\n const withEnabledSettings = withoutEmptyGroups.map(group => ({\n ...group,\n commands: group.commands.map(command => ({\n ...command,\n isEnabled: true,\n })),\n }))\n\n return withEnabledSettings\n },\n render: () => {\n let component: any\n let scrollHandler: (() => void) | null = null\n return {\n onStart: (props: SuggestionProps) => {\n component = new ReactRenderer(CommandsList, {\n props,\n editor: props.editor,\n })\n const { view } = props.editor\n // const editorNode = view.dom as HTMLElement;\n const getReferenceClientRect = () => {\n if (!props.clientRect) {\n return props.editor.storage[extensionName].rect\n }\n\n const rect = props.clientRect()\n\n if (!rect) {\n return props.editor.storage[extensionName].rect\n }\n\n let yPos = rect.y\n\n if (rect.top + component.element.offsetHeight + 40 > window.innerHeight) {\n const diff = rect.top + component.element.offsetHeight - window.innerHeight + 40\n yPos = rect.y - diff\n }\n\n // Account for when the editor is bound inside a container that doesn't go all the way to the edge of the screen\n // const editorXOffset = editorNode.getBoundingClientRect().x;\n return new DOMRect(rect.x, yPos, rect.width, rect.height)\n }\n\n scrollHandler = () => {\n popup?.[0].setProps({\n getReferenceClientRect,\n })\n }\n\n view.dom.parentElement?.addEventListener('scroll', scrollHandler)\n\n popup?.[0].setProps({\n getReferenceClientRect,\n appendTo: () => document.body,\n content: component.element,\n })\n\n popup?.[0].show()\n },\n\n onUpdate(props: SuggestionProps) {\n component.updateProps(props)\n\n const { view } = props.editor\n\n // const editorNode = view.dom as HTMLElement;\n\n const getReferenceClientRect = () => {\n if (!props.clientRect) {\n return props.editor.storage[extensionName].rect\n }\n\n const rect = props.clientRect()\n\n if (!rect) {\n return props.editor.storage[extensionName].rect\n }\n\n // Account for when the editor is bound inside a container that doesn't go all the way to the edge of the screen\n return new DOMRect(rect.x, rect.y, rect.width, rect.height)\n }\n\n const scrollHandler = () => {\n popup?.[0].setProps({\n getReferenceClientRect,\n })\n }\n\n view.dom.parentElement?.addEventListener('scroll', scrollHandler)\n\n props.editor.storage[extensionName].rect = props.clientRect\n ? getReferenceClientRect()\n : {\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n }\n popup?.[0].setProps({\n getReferenceClientRect,\n })\n },\n\n onKeyDown(props: SuggestionKeyDownProps) {\n if (props.event.key === 'Escape') {\n popup?.[0].hide()\n\n return true\n }\n\n if (!popup?.[0].state.isShown) {\n popup?.[0].show()\n }\n\n return component.ref?.onKeyDown(props)\n },\n\n onExit(props) {\n popup?.[0].hide()\n if (scrollHandler) {\n const { view } = props.editor\n view.dom.parentElement?.removeEventListener('scroll', scrollHandler)\n }\n component.destroy()\n },\n }\n },\n }),\n ]\n },\n\n addStorage() {\n return {\n rect: {\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n },\n }\n },\n})\n\nexport default SlashCommand\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { NodeViewWrapper } from '@tiptap/react'\nimport { flushSync } from 'react-dom'\n\nimport { IMAGE_MAX_SIZE, IMAGE_MIN_SIZE, IMAGE_THROTTLE_WAIT_TIME } from '@/constants'\nimport { clamp, isNumber, throttle } from '@/utils/utils'\n\ninterface Size {\n width: number\n height: number\n}\n\nconst ResizeDirection = {\n TOP_LEFT: 'tl',\n TOP_RIGHT: 'tr',\n BOTTOM_LEFT: 'bl',\n BOTTOM_RIGHT: 'br',\n}\n\nfunction ImageView(props: any) {\n const [maxSize, setMaxSize] = useState<Size>({\n width: IMAGE_MAX_SIZE,\n height: IMAGE_MAX_SIZE,\n })\n\n const [originalSize, setOriginalSize] = useState({\n width: 0,\n height: 0,\n })\n\n const [resizeDirections] = useState<string[]>([\n ResizeDirection.TOP_LEFT,\n ResizeDirection.TOP_RIGHT,\n ResizeDirection.BOTTOM_LEFT,\n ResizeDirection.BOTTOM_RIGHT,\n ])\n\n const [resizing, setResizing] = useState<boolean>(false)\n\n const [resizerState, setResizerState] = useState({\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n dir: '',\n })\n\n const imgAttrs = useMemo(() => {\n const { src, alt, width: w, height: h } = props?.node?.attrs\n const width = isNumber(w) ? `${w}px` : w\n const height = isNumber(h) ? `${h}px` : h\n return {\n src: src || undefined,\n alt: alt || undefined,\n style: {\n width: width || undefined,\n height: height || undefined,\n },\n }\n }, [props?.node?.attrs])\n\n const imageMaxStyle = useMemo(() => {\n const {\n style: { width },\n } = imgAttrs\n\n return { width: width === '100%' ? width : undefined }\n }, [imgAttrs])\n\n function onImageLoad(e: Record<string, any>) {\n setOriginalSize({\n width: e.target.width,\n height: e.target.height,\n })\n }\n\n // https://github.com/scrumpy/tiptap/issues/361#issuecomment-540299541\n function selectImage() {\n const { editor, getPos } = props\n editor.commands.setNodeSelection(getPos())\n }\n\n const getMaxSize = useCallback(\n throttle(() => {\n const { editor } = props as any\n const { width } = getComputedStyle(editor.view.dom)\n setMaxSize((prev) => {\n return {\n ...prev,\n width: Number.parseInt(width, 10),\n }\n })\n }, IMAGE_THROTTLE_WAIT_TIME),\n [props?.editor],\n )\n\n function onMouseDown(e: MouseEvent, dir: string) {\n e.preventDefault()\n e.stopPropagation()\n\n const originalWidth = originalSize.width\n const originalHeight = originalSize.height\n const aspectRatio = originalWidth / originalHeight\n\n let width = Number(props.node.attrs.width)\n let height = Number(props.node.attrs.height)\n const maxWidth = maxSize.width\n\n if (width && !height) {\n width = width > maxWidth ? maxWidth : width\n height = Math.round(width / aspectRatio)\n }\n else if (height && !width) {\n width = Math.round(height * aspectRatio)\n width = width > maxWidth ? maxWidth : width\n }\n else if (!width && !height) {\n width = originalWidth > maxWidth ? maxWidth : originalWidth\n height = Math.round(width / aspectRatio)\n }\n else {\n width = width > maxWidth ? maxWidth : width\n }\n\n flushSync(() => {\n setResizing(true)\n\n setResizerState({\n x: e.clientX,\n y: e.clientY,\n w: width,\n h: height,\n dir,\n })\n })\n }\n\n const onMouseMove = useCallback(\n throttle((e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (!resizing) {\n return\n }\n\n const { x, w, dir } = resizerState\n\n const dx = (e.clientX - x) * (/l/.test(dir) ? -1 : 1)\n // const dy = (e.clientY - y) * (/t/.test(dir) ? -1 : 1)\n\n const width = clamp(w + dx, IMAGE_MIN_SIZE, maxSize.width)\n const height = null\n\n props.updateAttributes({\n width,\n height,\n })\n }, IMAGE_THROTTLE_WAIT_TIME),\n [resizing, resizerState, maxSize, props.updateAttributes],\n )\n\n const onMouseUp = useCallback(\n (e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!resizing) {\n return\n }\n\n flushSync(() => {\n setResizerState({\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n dir: '',\n })\n setResizing(false)\n })\n\n selectImage()\n },\n [resizing, selectImage],\n )\n\n const onEvents = useCallback(() => {\n document?.addEventListener('mousemove', onMouseMove, true)\n document?.addEventListener('mouseup', onMouseUp, true)\n }, [onMouseMove, onMouseUp])\n\n const offEvents = useCallback(() => {\n document?.removeEventListener('mousemove', onMouseMove, true)\n document?.removeEventListener('mouseup', onMouseUp, true)\n }, [onMouseMove, onMouseUp])\n\n useEffect(() => {\n if (resizing) {\n onEvents()\n }\n else {\n offEvents()\n }\n\n return () => {\n offEvents()\n }\n }, [resizing, onEvents, offEvents])\n\n const resizeOb: ResizeObserver = useMemo(() => {\n return new ResizeObserver(() => getMaxSize())\n }, [getMaxSize])\n\n useEffect(() => {\n resizeOb.observe(props.editor.view.dom)\n\n return () => {\n resizeOb.disconnect()\n }\n }, [props.editor.view.dom, resizeOb])\n\n return (\n <NodeViewWrapper className=\"image-view\" style={{ ...imageMaxStyle, width: '100%' }}>\n <div\n draggable=\"true\"\n data-drag-handle\n className={`image-view__body ${props?.selected ? 'image-view__body--focused' : ''} ${\n resizing ? 'image-view__body--resizing' : ''\n }`}\n style={imageMaxStyle}\n >\n <img\n src={imgAttrs.src}\n alt={imgAttrs.alt}\n style={imgAttrs.style}\n height=\"auto\"\n className=\"image-view__body__image block\"\n onLoad={onImageLoad}\n onClick={selectImage}\n />\n {props?.editor.view.editable && (props?.selected || resizing) && (\n <div className=\"image-resizer\">\n {resizeDirections?.map((direction) => {\n return (\n <span\n key={direction}\n className={`image-resizer__handler image-resizer__handler--${direction}`}\n onMouseDown={(e: any) => onMouseDown(e, direction)}\n >\n </span>\n )\n })}\n </div>\n )}\n </div>\n </NodeViewWrapper>\n )\n}\n\nexport default ImageView\n","/* eslint-disable eqeqeq */\n\nimport { mergeAttributes } from '@tiptap/core'\nimport TiptapImage from '@tiptap/extension-image'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\n\nimport ImageView from '@/extensions/Image/components/ImageView'\n\nexport interface SetImageAttrsOptions {\n src?: string\n /** The alternative text for the image. */\n alt?: string\n /** The title of the image. */\n title?: string\n /** The width of the image. */\n width?: number | string | null\n}\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n imageResize: {\n /**\n * Add an image\n */\n setImage: (options: Partial<SetImageAttrsOptions>) => ReturnType\n /**\n * Update an image\n */\n updateImage: (options: Partial<SetImageAttrsOptions>) => ReturnType\n }\n }\n}\nexport const Image = TiptapImage.extend({\n inline() {\n return true\n },\n group() {\n return 'inline'\n },\n addAttributes() {\n return {\n ...this.parent?.(),\n width: {\n default: null,\n parseHTML: (element) => {\n const width = element.style.width || element.getAttribute('width') || null\n return width == undefined ? null : Number.parseInt(width, 10)\n },\n renderHTML: (attributes) => {\n return {\n width: attributes.width,\n }\n },\n },\n }\n },\n\n addOptions() {\n return {\n ...this.parent?.(),\n inline: true,\n upload: null,\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ImageView)\n },\n addCommands() {\n return {\n ...this.parent?.(),\n updateImage:\n options =>\n ({ commands }) => {\n return commands.updateAttributes(this.name, options)\n },\n }\n },\n renderHTML({ HTMLAttributes }) {\n return [\n 'img',\n mergeAttributes(\n // Always render the `height=\"auto\"\n {\n height: 'auto',\n },\n this.options.HTMLAttributes,\n HTMLAttributes,\n ),\n ]\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[src]',\n },\n ]\n },\n})\n\nexport default Image\n","import type { EditorState } from '@tiptap/pm/state'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport type { EditorView } from '@tiptap/pm/view'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n\nconst uploadKey = new PluginKey('upload-image')\n\ninterface UploadAction {\n add?: Array<{ id: string, pos: number, src: string }>\n remove?: string[]\n}\n\nexport function UploadImagesPlugin() {\n return new Plugin({\n key: uploadKey,\n state: {\n init() {\n return DecorationSet.empty\n },\n apply(tr: any, set: any) {\n set = set.map(tr.mapping, tr.doc)\n const action = tr.getMeta(uploadKey) as UploadAction\n\n if (action?.add) {\n for (const { id, pos, src } of action.add) {\n const placeholder = createPlaceholder(src)\n const deco = Decoration.widget(pos, placeholder, { id })\n set = set.add(tr.doc, [deco])\n }\n }\n else if (action?.remove) {\n for (const id of action.remove) {\n set = set.remove(set.find(undefined, undefined, (spec: any) => spec.id === id))\n }\n }\n\n return set\n },\n },\n props: {\n decorations(state) {\n return this.getState(state)\n },\n },\n })\n}\n\nfunction createPlaceholder(src: string): HTMLElement {\n const placeholder = document.createElement('div')\n const image = document.createElement('img')\n image.setAttribute('class', 'opacity-50')\n image.src = src\n image.addEventListener('load', () => {\n placeholder.setAttribute('class', 'img-placeholder')\n })\n placeholder.append(image)\n return placeholder\n}\n\nfunction findPlaceholder(state: EditorState, id: string): number | null {\n const decos = uploadKey.getState(state) as DecorationSet\n const found = decos.find(undefined, undefined, spec => spec.id === id)\n return found.length > 0 ? found[0]?.from : null\n}\n\nexport interface ImageUploadOptions {\n validateFn?: (file: File) => boolean\n onUpload: (file: File) => Promise<string | object>\n}\n\nexport type UploadFn = (files: File[], view: EditorView, pos: number) => void\n\nexport function createImageUpload({ validateFn, onUpload }: ImageUploadOptions): UploadFn {\n return (files, view, pos) => {\n for (const file of files) {\n if (validateFn && !validateFn(file)) {\n continue\n }\n\n const id = Date.now().toString()\n const tr = view.state.tr\n if (!tr.selection.empty) {\n tr.deleteSelection()\n }\n\n const result = URL.createObjectURL(file)\n tr.setMeta(uploadKey, {\n add: [{ id, pos, src: result }],\n })\n view.dispatch(tr)\n\n onUpload(file).then(\n (src) => {\n const { schema } = view.state\n const placeholderPos = findPlaceholder(view.state, id)\n if (placeholderPos === null) {\n return\n }\n\n const imageSrc = typeof src === 'object' ? result : src\n const node = schema.nodes.image?.create({ src: imageSrc })\n if (!node) {\n return\n }\n\n const transaction = view.state.tr\n .replaceWith(placeholderPos, placeholderPos, node)\n .setMeta(uploadKey, { remove: [id] })\n view.dispatch(transaction)\n },\n () => {\n const transaction = view.state.tr.delete(pos, pos).setMeta(uploadKey, { remove: [id] })\n view.dispatch(transaction)\n },\n )\n }\n }\n}\n\nexport function handleImagePaste(view: EditorView, event: ClipboardEvent, uploadFn: UploadFn): boolean {\n const files = [...(event.clipboardData?.files || [])]\n if (files.length > 0) {\n event.preventDefault()\n const pos = view.state.selection.from\n uploadFn(files, view, pos + 1)\n return true\n }\n return false\n}\n\nexport function handleImageDrop(view: EditorView, event: DragEvent, moved: boolean, uploadFn: UploadFn): boolean {\n const files = [...(event.dataTransfer?.files || [])]\n if (!moved && files.length > 0) {\n event.preventDefault()\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n if (coordinates) {\n uploadFn(files, view, coordinates.pos + 1)\n return true\n }\n }\n return false\n}\n","import React, { useRef, useState } from 'react'\n\nimport { NodeViewWrapper } from '@tiptap/react'\n\nimport { Button, IconComponent, Input, Popover, PopoverContent, PopoverTrigger, Tabs, TabsContent, TabsList, TabsTrigger } from '@/components'\nimport { useLocale } from '@/locales'\nimport { createImageUpload } from '@/plugins/image-upload'\n\nfunction ImageUploader(props: any) {\n const { t } = useLocale()\n\n const [link, setLink] = useState<string>('')\n const fileInput = useRef<HTMLInputElement>(null)\n\n function handleFile(event: any) {\n const files = event?.target?.files\n if (!props.editor || props.editor.isDestroyed || files.length === 0) {\n return\n }\n const file = files[0]\n const uploadOptions = props.editor.extensionManager.extensions.find(\n (extension: any) => extension.name === 'imageUpload',\n )?.options\n\n const uploadFn = createImageUpload({\n validateFn: () => {\n return true\n },\n onUpload: uploadOptions.upload,\n })\n uploadFn([file], props.editor.view, props.getPos())\n }\n function handleLink(e: any) {\n e.preventDefault()\n\n props.editor\n .chain()\n .setImage({ src: link })\n .deleteRange({ from: props.getPos(), to: props.getPos() })\n .focus()\n .run()\n }\n function handleDelete(e?: any) {\n e?.preventDefault()\n props.deleteNode()\n }\n function handleClick(e: any) {\n e.preventDefault()\n fileInput.current?.click()\n }\n\n return (\n <NodeViewWrapper className=\"p-0 m-0\" data-drag-handle>\n <Popover defaultOpen modal>\n <PopoverTrigger asChild>\n <div className=\"flex items-center w-full p-3 my-3 transition-all border rounded-sm cursor-pointer hover:bg-accent border-border text-muted-foreground\">\n <div className=\"flex items-center justify-between w-full\">\n <div className=\"flex items-center justify-center gap-3\">\n <IconComponent name=\"ImageUp\" className=\"w-6 h-6\" />\n <span className=\"text-sm\">{t('editor.image.dialog.title')}</span>\n </div>\n <IconComponent name=\"Trash2\" className=\"hover:text-foreground\" onClick={handleDelete} />\n </div>\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-full\" onOpenAutoFocus={e => e.preventDefault()}>\n <Tabs defaultValue=\"upload\" className=\"w-[400px]\" activationMode=\"manual\">\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"upload\">\n {t('editor.image.dialog.tab.upload')}\n {' '}\n </TabsTrigger>\n <TabsTrigger value=\"link\">\n {' '}\n {t('editor.image.dialog.tab.url')}\n {' '}\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"upload\">\n <Button className=\"w-full mt-1\" size=\"sm\" onClick={handleClick}>\n {t('editor.image.dialog.tab.upload')}\n </Button>\n <input\n type=\"file\"\n accept=\"image/*\"\n ref={fileInput}\n multiple\n style={{\n display: 'none',\n }}\n onChange={handleFile}\n />\n </TabsContent>\n <TabsContent value=\"link\">\n <form onSubmit={handleLink}>\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"url\"\n autoFocus={true}\n value={link}\n onChange={e => setLink(e.target.value)}\n required\n placeholder={t('editor.image.dialog.placeholder')}\n />\n <Button type=\"submit\">{t('editor.image.dialog.button.apply')}</Button>\n </div>\n </form>\n </TabsContent>\n </Tabs>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n )\n}\n\nexport default ImageUploader\n","/* eslint-disable prefer-promise-reject-errors */\nimport { Plugin } from '@tiptap/pm/state'\nimport { Node, ReactNodeViewRenderer } from '@tiptap/react'\n\nimport { ActionButton } from '@/components'\nimport ImageUploader from '@/extensions/ImageUpload/components/ImageUploader'\nimport {\n UploadImagesPlugin,\n createImageUpload,\n handleImageDrop,\n handleImagePaste,\n} from '@/plugins/image-upload'\n\nexport interface ImageUploadOptions {\n upload: (file: File) => Promise<string>\n acceptMimes: string[]\n maxSize: number\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n imageUpload: {\n setImageUpload: () => ReturnType\n }\n }\n}\n\nconst DEFAULT_OPTIONS: Partial<ImageUploadOptions> = {\n acceptMimes: ['image/jpeg', 'image/gif', 'image/png', 'image/jpg'],\n maxSize: 1024 * 1024 * 5, // 5MB\n}\n\n// function formatFileSize(bytes: number): string {\n// const megabytes = bytes / 1024 / 1024\n// return `${megabytes.toFixed(2)}MB`\n// }\n\nexport const ImageUpload = Node.create<ImageUploadOptions>({\n name: 'imageUpload',\n isolating: true,\n defining: true,\n group: 'block',\n draggable: false,\n selectable: true,\n inline: false,\n\n onCreate() {\n if (typeof this.options.upload !== 'function') {\n throw new TypeError('Image upload function should be a function')\n }\n },\n\n parseHTML() {\n return [{ tag: `div[data-type=\"${this.name}\"]` }]\n },\n\n renderHTML() {\n return ['div', { 'data-type': this.name }]\n },\n\n addCommands() {\n return {\n setImageUpload:\n () =>\n ({ commands }) =>\n commands.insertContent(`<div data-type=\"${this.name}\"></div>`),\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ImageUploader)\n },\n\n addOptions() {\n return {\n ...DEFAULT_OPTIONS,\n ...this.parent?.(),\n upload: () => Promise.reject('Image Upload Function'),\n button: ({\n editor,\n extension,\n t,\n }: {\n editor: any\n extension: any\n t: (key: string) => string\n }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.setImageUpload(),\n upload: extension.options.upload,\n /* If setImage is not available(when Image Component is not imported), the button is disabled */\n disabled: !editor.can().setImage?.({}),\n icon: 'ImageUp',\n tooltip: t('editor.image.tooltip'),\n },\n }),\n }\n },\n\n addProseMirrorPlugins() {\n // const { toast } = useToast();\n // const { t } = useLocale();\n\n const validateFile = (file: File): boolean => {\n if (!this.options.acceptMimes.includes(file.type)) {\n // toast({ description: t.value('editor.imageUpload.fileTypeNotSupported'), duration: 2000 });\n return false\n }\n if (file.size > this.options.maxSize) {\n // toast({\n // description: `${t.value('editor.imageUpload.fileSizeTooBig')} ${formatFileSize(\n // this.options.maxSize,\n // )}.`,\n // duration: 2000,\n // });\n return false\n }\n return true\n }\n\n const uploadFn = createImageUpload({\n validateFn: validateFile,\n onUpload: this.options.upload,\n })\n\n return [\n new Plugin({\n props: {\n handlePaste: (view, event) => {\n if (!event.clipboardData) {\n return false\n }\n const items = [...(event.clipboardData.items || [])]\n if (items.some(x => x.type === 'text/html')) {\n return false\n }\n return handleImagePaste(view, event, uploadFn)\n },\n handleDrop: (view, event, _, moved) => {\n if (!(event instanceof DragEvent) || !event.dataTransfer) {\n return false\n }\n handleImageDrop(view, event, moved, uploadFn)\n return false\n },\n },\n }),\n UploadImagesPlugin(),\n ]\n },\n})\n\nexport default ImageUpload\n","import { Node } from '@tiptap/core'\n\nimport { VIDEO_SIZE } from '@/constants'\nimport { getCssUnitWithDefault } from '@/utils/utils'\n\n/**\n * Represents the interface for video options, extending GeneralOptions.\n */\nexport interface VideoOptions {\n /**\n * Indicates whether fullscreen play is allowed\n *\n * @default true\n */\n allowFullscreen: boolean\n /**\n * Indicates whether to display the frameborder\n *\n * @default false\n */\n frameborder: boolean\n /**\n * Width of the video, can be a number or string\n *\n * @default VIDEO_SIZE['size-medium']\n */\n width: number | string\n /** HTML attributes object for passing additional attributes */\n HTMLAttributes: {\n [key: string]: any\n }\n upload?: (file: File) => Promise<string>\n}\n\n/**\n * Represents the type for setting video options\n */\ninterface SetVideoOptions {\n /** The source URL of the video */\n src: string\n /** The width of the video */\n width: string | number\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n video: {\n /**\n * Add an video\n */\n setVideo: (options: Partial<SetVideoOptions>) => ReturnType\n /**\n * Update an video\n */\n updateVideo: (options: Partial<SetVideoOptions>) => ReturnType\n }\n }\n}\n\nfunction linkConvert(src: string) {\n // Convert youtube links\n src = src\n .replace('https://youtu.be/', 'https://www.youtube.com/watch?v=')\n .replace('watch?v=', 'embed/')\n\n // Convert vimeo links\n src = src.replace('https://vimeo.com/', 'https://player.vimeo.com/video/')\n\n // Convert bilibili links\n const isBilibiliLink = /^https?:\\/\\/www.bilibili.com\\/video\\/.*/i.test(src)\n if (isBilibiliLink) {\n src = src\n .replace(/\\?.*$/, '')\n .replace('https://www.bilibili.com/video/', 'https://player.bilibili.com/player.html?bvid=')\n }\n\n // Convert google drive links\n if (src.includes('drive.google.com')) {\n src = src.replace('/view', '/preview')\n }\n\n return src\n}\n\nexport const Video = Node.create<VideoOptions>({\n name: 'video',\n group: 'block',\n atom: true,\n draggable: true,\n addAttributes() {\n return {\n src: {\n default: null,\n renderHTML: ({ src }) => ({\n src: src ? linkConvert(src) : null,\n }),\n },\n width: {\n default: this.options.width,\n renderHTML: ({ width }) => ({\n width: getCssUnitWithDefault(width),\n }),\n },\n frameborder: {\n default: this.options.frameborder ? 1 : 0,\n parseHTML: () => (this.options.frameborder ? 1 : 0),\n },\n allowfullscreen: {\n default: this.options.allowFullscreen,\n parseHTML: () => this.options.allowFullscreen,\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-video] iframe',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n const { width = '100%' } = HTMLAttributes ?? {}\n\n const iframeHTMLAttributes = {\n ...HTMLAttributes,\n width: '100%',\n height: '100%',\n }\n\n const responsiveStyle = `position: relative;overflow: hidden;display: flex;flex: 1;max-width: ${width};`\n const responsiveSizesStyle = `flex: 1;padding-bottom: ${(9 / 16) * 100}%;`\n\n const iframeDOM = ['iframe', iframeHTMLAttributes]\n const sizesDOM = ['div', { style: responsiveSizesStyle }]\n const responsiveDOM = ['div', { style: responsiveStyle }, sizesDOM, iframeDOM]\n\n const divAttrs = {\n ...this.options.HTMLAttributes,\n 'data-video': '',\n }\n\n return ['div', divAttrs, responsiveDOM]\n },\n\n addCommands() {\n return {\n setVideo:\n options =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n })\n },\n updateVideo:\n options =>\n ({ commands }) => {\n return commands.updateAttributes(this.name, options)\n },\n }\n },\n\n addOptions() {\n return {\n divider: false,\n spacer: false,\n allowFullscreen: true,\n upload: undefined,\n frameborder: false,\n width: VIDEO_SIZE['size-medium'],\n HTMLAttributes: {\n class: 'iframe-wrapper',\n style: 'display: flex;justify-content: center;',\n },\n }\n },\n})\n","import React, { useRef, useState } from 'react'\n\nimport type { Editor } from '@tiptap/react'\nimport { NodeViewWrapper } from '@tiptap/react'\n\nimport { IconComponent } from '@/components/icons'\nimport { Button, Input, Popover, PopoverContent, PopoverTrigger, Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui'\nimport { useLocale } from '@/locales'\n\ninterface IPropsVideoUploaderView {\n editor: Editor\n getPos: () => number\n deleteNode: () => void\n}\n\nfunction VideoUploaderView(props: IPropsVideoUploaderView) {\n const { t } = useLocale()\n const { editor, getPos, deleteNode } = props\n\n const [link, setLink] = useState<string>('')\n const [loading, setLoading] = useState<boolean>(false)\n const fileInput = useRef<HTMLInputElement>(null)\n\n function handleFile(event: any) {\n setLoading(true)\n const files = event?.target?.files\n if (!editor || editor.isDestroyed || files.length === 0) {\n return\n }\n const file = files[0]\n const uploadOptions = editor.extensionManager.extensions.find(\n (extension: any) => extension.name === 'videoUpload',\n )?.options\n uploadOptions?.upload([file]).then((res: any) => {\n editor\n .chain()\n .setVideo({ src: res[0].src, width: '100%' })\n .deleteRange({ from: getPos(), to: getPos() })\n .focus()\n .run()\n setLoading(false)\n })\n }\n function handleLink(e: any) {\n e.preventDefault()\n\n editor\n .chain()\n .setVideo({\n src: link,\n width: '100%',\n })\n .deleteRange({ from: getPos(), to: getPos() })\n .focus()\n .run()\n }\n function handleDelete(e: any) {\n e.preventDefault()\n deleteNode()\n }\n function handleClick(e: any) {\n e.preventDefault()\n fileInput.current?.click()\n }\n\n return (\n <NodeViewWrapper as=\"div\" data-drag-handle>\n <Popover defaultOpen modal>\n <PopoverTrigger asChild>\n <div className=\"flex items-center w-full p-3 my-3 transition-all border rounded-sm cursor-pointer hover:bg-accent border-border text-muted-foreground\">\n {loading\n ? (\n <div className=\"flex items-center justify-center gap-3 text-s\">\n <IconComponent className=\"w-6 h-6 animate-spin\" name=\"LoaderCircle\" />\n <span>\n {t('editor.video.dialog.uploading')}\n ...\n </span>\n </div>\n )\n : (\n <div className=\"flex items-center justify-between w-full\">\n <div className=\"flex items-center justify-center gap-3\">\n <IconComponent name=\"Video\" className=\"w-6 h-6\" />\n <span className=\"text-sm\">{t('editor.video.dialog.title')}</span>\n </div>\n <IconComponent name=\"Trash2\" className=\"hover:text-foreground\" onClick={handleDelete} />\n </div>\n )}\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-full\" onOpenAutoFocus={e => e.preventDefault()}>\n <Tabs defaultValue=\"upload\" className=\"w-[400px]\" activationMode=\"manual\">\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"upload\">\n {t('editor.video.dialog.tab.upload')}\n {' '}\n </TabsTrigger>\n <TabsTrigger value=\"link\">\n {' '}\n {t('editor.video.dialog.link')}\n {' '}\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"upload\">\n <Button className=\"w-full mt-1\" size=\"sm\" onClick={handleClick}>\n {t('editor.video.dialog.tab.upload')}\n </Button>\n <input\n type=\"file\"\n accept=\"video/*\"\n ref={fileInput}\n multiple\n style={{\n display: 'none',\n }}\n onChange={handleFile}\n />\n </TabsContent>\n <TabsContent value=\"link\">\n <form onSubmit={handleLink}>\n <div className=\"flex items-center gap-2\">\n <Input\n type=\"url\"\n autoFocus={true}\n required\n placeholder={t('editor.video.dialog.placeholder')}\n value={link}\n onChange={e => setLink(e.target.value)}\n />\n <Button type=\"submit\">{t('editor.video.dialog.button.apply')}</Button>\n </div>\n </form>\n </TabsContent>\n </Tabs>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n )\n}\n\nexport default VideoUploaderView\n","import { Node } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\n\nimport { ActionButton } from '@/components'\nimport VideoUploaderView from '@/extensions/VideoUpload/components/VideoUploaderView'\n\nexport interface VideoOptions {\n upload?: (files: File[]) => void\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n videoUpload: {\n setVideoUpload: () => ReturnType\n }\n }\n}\n\nexport const VideoUpload = Node.create<VideoOptions>({\n name: 'videoUpload',\n isolating: true,\n defining: true,\n group: 'block',\n draggable: true,\n selectable: true,\n inline: false,\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ]\n },\n renderHTML() {\n return ['div', { 'data-type': this.name }]\n },\n\n addCommands() {\n return {\n setVideoUpload:\n () =>\n ({ commands }) =>\n commands.insertContent(`<div data-type=\"${this.name}\"></div>`),\n }\n },\n addNodeView() {\n return ReactNodeViewRenderer(VideoUploaderView)\n },\n addOptions() {\n return {\n ...this.parent?.(),\n upload: undefined,\n button: ({ editor, t }: any) => {\n return {\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.setVideoUpload(),\n isActive: () => editor.isActive('video') || false,\n /* If setVideo is not available(when Video Component is not imported), the button is disabled */\n disabled: !editor.can().setVideo?.({}),\n icon: 'Video',\n tooltip: t('editor.video.tooltip'),\n },\n }\n },\n }\n },\n})\n\nexport default VideoUpload\n","import type { Command } from '@tiptap/core'\nimport { Extension } from '@tiptap/core'\nimport type { Transaction } from '@tiptap/pm/state'\nimport { CellSelection } from '@tiptap/pm/tables'\n\nexport interface TableCellBackgroundOptions {\n HTMLAttributes: Record<string, any>\n types?: any\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n tableCellBackground: {\n setTableCellBackground: (color: string) => ReturnType\n unsetTableCellBackground: () => ReturnType\n }\n }\n}\n\nexport function setCellBackgroundMarkup(tr: Transaction, pos: number, backgroundColor: string): Transaction {\n if (!tr.doc) {\n return tr\n }\n\n const node = tr.doc.nodeAt(pos)\n if (!node) {\n return tr\n }\n\n if (backgroundColor === node.attrs.backgroundColor) {\n return tr\n }\n\n const nodeAttrs = {\n ...node.attrs,\n backgroundColor,\n }\n\n return tr.setNodeMarkup(pos, node.type, nodeAttrs, node.marks)\n}\n\nexport function updateCellBackground(tr: Transaction, options: TableCellBackgroundOptions, backgroundColor: string): Transaction {\n const { doc, selection } = tr\n\n if (!doc || !selection || !(selection instanceof CellSelection)) {\n return tr\n }\n\n selection.forEachCell((node, pos) => {\n tr = setCellBackgroundMarkup(tr, pos, backgroundColor)\n })\n\n return tr\n}\n\nexport function createCellBackgroundCommand(backgroundColor: string, options: TableCellBackgroundOptions): Command {\n return ({ tr, state, dispatch }) => {\n const { selection } = state\n tr = tr.setSelection(selection)\n tr = updateCellBackground(tr, options, backgroundColor)\n\n if (tr.docChanged) {\n dispatch?.(tr)\n return true\n }\n\n return false\n }\n}\n\n// @ts-ignore\nexport const TableCellBackground = Extension.create<TableCellBackgroundOptions>({\n name: 'tableCellBackground',\n addOptions() {\n return {\n types: ['tableCell'],\n HTMLAttributes: {},\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n backgroundColor: {\n parseHTML: (element) => {\n return element.style.backgroundColor || ''\n },\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor || attributes.backgroundColor === '') {\n return {}\n }\n else {\n return {\n style: `background-color: ${attributes.backgroundColor}`,\n }\n }\n },\n },\n },\n },\n ]\n },\n addCommands() {\n return {\n setTableCellBackground: (backgroundColor: string) =>\n createCellBackgroundCommand(backgroundColor, this.options),\n unsetTableCellBackground: () => createCellBackgroundCommand('', this.options),\n }\n },\n})\n","/* eslint-disable regexp/optimal-quantifier-concatenation */\n/* eslint-disable regexp/no-misleading-capturing-group */\n/* eslint-disable regexp/no-super-linear-backtracking */\n/* eslint-disable regexp/no-unused-capturing-group */\ninterface HttpRequestHeadersInterfaceMock {\n [id: string]: string | string[] | undefined\n}\n\ninterface HttpRequestInterfaceMock {\n headers: HttpRequestHeadersInterfaceMock\n [id: string]: any\n}\n\nexport interface IsMobileOptions {\n ua?: string | HttpRequestInterfaceMock\n tablet?: boolean\n featureDetect?: boolean\n}\n\nconst mobileRE\n = /(android|bb\\d+|meego).+mobile|armv7l|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series[46]0|samsungbrowser.*mobile|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i\nconst notMobileRE = /CrOS/\nconst tabletRE = /android|ipad|playbook|silk/i\n\n/**\n * Determines if the current device is a mobile or tablet device.\n * @param opts - Options for the detection.\n * @returns `true` if the device is mobile or tablet, `false` otherwise.\n */\nexport function isMobile(opts: IsMobileOptions = {}): boolean {\n let ua = opts.ua || (typeof navigator !== 'undefined' && navigator.userAgent)\n\n if (ua && typeof ua === 'object' && ua.headers && typeof ua.headers['user-agent'] === 'string') {\n ua = ua.headers['user-agent']\n }\n\n if (typeof ua !== 'string') {\n return false\n }\n\n if (mobileRE.test(ua) && !notMobileRE.test(ua)) {\n return true\n }\n\n if (opts.tablet && tabletRE.test(ua)) {\n return true\n }\n\n if (\n opts.tablet\n && opts.featureDetect\n && navigator\n && navigator.maxTouchPoints > 1\n && ua.includes('Macintosh')\n && ua.includes('Safari')\n ) {\n return true\n }\n\n return false\n}\n","import React, { useState } from 'react'\n\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components'\nimport {\n TABLE_DEFAULT_SELECTED_GRID_SIZE,\n TABLE_INIT_GRID_SIZE,\n TABLE_MAX_GRID_SIZE,\n} from '@/constants'\nimport { isMobile } from '@/utils/is-mobile'\n\nconst createArray = (length: number) => Array.from({ length }).map((_, index) => index + 1)\n\ninterface IPropsCreateTablePopover {\n createTable: any\n children: any\n}\n\nexport interface GridSize {\n rows: number\n cols: number\n}\n\nexport interface CreateTablePayload extends GridSize {\n withHeaderRow: boolean\n}\n\nfunction CreateTablePopover(props: IPropsCreateTablePopover) {\n const [withHeaderRow, setWithHeaderRow] = useState<boolean>(true)\n const [tableGridSize, setTableGridSize] = useState<GridSize>({\n rows: isMobile() ? TABLE_MAX_GRID_SIZE : TABLE_INIT_GRID_SIZE,\n cols: isMobile() ? TABLE_MAX_GRID_SIZE : TABLE_INIT_GRID_SIZE,\n })\n\n const [selectedTableGridSize, setSelectedTableGridSize] = useState<GridSize>({\n rows: TABLE_DEFAULT_SELECTED_GRID_SIZE,\n cols: TABLE_DEFAULT_SELECTED_GRID_SIZE,\n })\n\n function selectTableGridSize(rows: number, cols: number): void {\n if (rows === tableGridSize.rows) {\n setTableGridSize((prev) => {\n return {\n ...prev,\n rows: Math.min(rows + 1, TABLE_MAX_GRID_SIZE),\n }\n })\n }\n\n if (cols === tableGridSize.cols) {\n setTableGridSize((prev) => {\n return {\n ...prev,\n cols: Math.min(cols + 1, TABLE_MAX_GRID_SIZE),\n }\n })\n }\n\n setSelectedTableGridSize({\n rows,\n cols,\n })\n }\n\n function onMouseDown(rows: number, cols: number) {\n props?.createTable({ rows, cols, withHeaderRow })\n resetTableGridSize()\n }\n\n function resetTableGridSize(): void {\n setWithHeaderRow(false)\n\n setTableGridSize({\n rows: TABLE_INIT_GRID_SIZE,\n cols: TABLE_INIT_GRID_SIZE,\n })\n\n setSelectedTableGridSize({\n rows: TABLE_DEFAULT_SELECTED_GRID_SIZE,\n cols: TABLE_DEFAULT_SELECTED_GRID_SIZE,\n })\n }\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n {props?.children}\n </PopoverTrigger>\n <PopoverContent className=\"w-full !p-2\" align=\"start\" side=\"bottom\">\n <div className=\"p-0 table-grid-size-editor\">\n <div className=\"flex flex-col flex-wrap justify-between gap-1\">\n {createArray(tableGridSize?.rows)?.map((row: any) => {\n return (\n <div key={`r-${row}`} className=\"flex gap-1\">\n {createArray(tableGridSize?.cols)?.map((col: any) => {\n return (\n <div\n key={`c-${col}`}\n className={`pa-1 cursor-pointer border-border ${\n col <= selectedTableGridSize.cols\n && row <= selectedTableGridSize.rows\n && 'bg-foreground'\n }`}\n onMouseOver={() => selectTableGridSize(row, col)}\n onMouseDown={() => onMouseDown(row, col)}\n >\n <div className=\"w-4 h-4 p-1 border rounded-[2px] box-border border-solid\"></div>\n </div>\n )\n })}\n </div>\n )\n })}\n </div>\n <div className=\"mt-2 text-sm text-center text-zinc-600\">\n {selectedTableGridSize.rows}\n {' '}\n x\n {selectedTableGridSize.cols}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default CreateTablePopover\n","import React from 'react'\n\nimport { ActionButton } from '@/components'\nimport CreateTablePopover from '@/extensions/Table/components/CreateTablePopover'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\ninterface IPropsTableActionButton {\n editor: any\n icon?: any\n tooltip?: string\n disabled?: boolean\n color?: string\n action?: ButtonViewReturnComponentProps['action']\n isActive?: ButtonViewReturnComponentProps['isActive']\n}\n\nfunction TableActionButton(props: IPropsTableActionButton) {\n function createTable(options: any) {\n if (!props.disabled) {\n props.editor\n .chain()\n .focus()\n .insertTable({ ...options, withHeaderRow: false })\n .run()\n }\n }\n\n return (\n <CreateTablePopover createTable={createTable}>\n <ActionButton\n icon={props?.icon}\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n color={props?.color}\n action={props?.action}\n isActive={props?.isActive}\n />\n </CreateTablePopover>\n )\n}\n\nexport default TableActionButton\n","import TiptapTable from '@tiptap/extension-table'\nimport { TableCell } from '@tiptap/extension-table-cell'\nimport type { TableCellOptions } from '@tiptap/extension-table-cell'\nimport { TableHeader } from '@tiptap/extension-table-header'\nimport type { TableHeaderOptions } from '@tiptap/extension-table-header'\nimport { TableRow } from '@tiptap/extension-table-row'\nimport type { TableRowOptions } from '@tiptap/extension-table-row'\n\nimport type { TableCellBackgroundOptions } from './cell-background'\nimport { TableCellBackground } from './cell-background'\nimport TableActionButton from '@/extensions/Table/components/TableActionButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface TableOptions extends GeneralOptions<TableOptions> {\n HTMLAttributes: Record<string, any>\n resizable: boolean\n handleWidth: number\n cellMinWidth: number\n lastColumnResizable: boolean\n allowTableNodeSelection: boolean\n /** options for table rows */\n tableRow: Partial<TableRowOptions>\n /** options for table headers */\n tableHeader: Partial<TableHeaderOptions>\n /** options for table cells */\n tableCell: Partial<TableCellOptions>\n /** options for table cell background */\n tableCellBackground: Partial<TableCellBackgroundOptions>\n}\nexport const Table = TiptapTable.extend<TableOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n resizable: true,\n lastColumnResizable: true,\n allowTableNodeSelection: false,\n button: ({ editor, t }: any) => ({\n component: TableActionButton,\n componentProps: {\n disabled: editor.isActive('table') || false,\n icon: 'Table',\n tooltip: t('editor.table.tooltip'),\n editor,\n },\n }),\n }\n },\n\n addExtensions() {\n return [\n TableRow.configure(this.options.tableRow),\n TableHeader.configure(this.options.tableHeader),\n TableCell.configure(this.options.tableCell),\n TableCellBackground.configure(this.options.tableCellBackground),\n ]\n },\n})\n\nexport default Table\n","import { Extension } from '@tiptap/core'\nimport type { Mark } from '@tiptap/pm/model'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\n/**\n * Represents the interface for font size options, extending GeneralOptions.\n */\nexport interface FormatPainterOptions extends GeneralOptions<FormatPainterOptions> {}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n painter: {\n setPainter: (marks: Mark[]) => ReturnType\n }\n }\n}\n\nexport interface PainterAction {\n type: 'start' | 'end'\n marks: Mark[]\n}\n/**\n * 格式刷\n */\nexport const FormatPainter = Extension.create<FormatPainterOptions>({\n name: 'painter',\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => {\n editor.commands.setPainter(editor?.state.selection.$head.marks() as Mark[])\n },\n icon: 'PaintRoller',\n tooltip: t('editor.format'),\n },\n }),\n }\n },\n addCommands() {\n return {\n setPainter:\n (marks: Mark[]) =>\n ({\n view: {\n dispatch,\n state: { tr },\n dom,\n },\n }) => {\n const svgCursor\n = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"#000\" d=\"M9 22v-6H4V7q0-1.65 1.175-2.825T8 3h12v13h-5v6zM6 10h12V5h-1v4h-2V5h-1v2h-2V5H8q-.825 0-1.412.588T6 7zm0 4h12v-2H6zm0 0v-2z\"/></svg>'\n const encodedSvg = encodeURIComponent(svgCursor)\n const cursorUrl = `url(\"data:image/svg+xml;utf8,${encodedSvg}\"), auto`\n\n dom.style.cursor = cursorUrl\n dispatch(tr.setMeta('painterAction', { type: 'start', marks }))\n return true\n },\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('format-painter'),\n state: {\n init: () => [] as Mark[],\n apply: (tr, set) => {\n const action = tr.getMeta('painterAction') as PainterAction\n if (action && action.type === 'start') {\n set = action.marks\n }\n else if (action && action.type === 'end') {\n set = []\n }\n return set\n },\n },\n props: {\n handleDOMEvents: {\n mousedown(view, _) {\n const marks = this.getState(view.state) as Mark[]\n if (!marks || marks.length === 0) {\n view.dom.style.cursor = ''\n return false // 如果没有标记,则不执行任何操作\n }\n const mouseup = () => {\n document.removeEventListener('mouseup', mouseup)\n\n let {\n dispatch,\n state: { tr, selection },\n dom,\n } = view as any\n dom.style.cursor = ''\n\n tr = tr.removeMark(selection.from, selection.to)\n for (const mark of marks) {\n if (mark.type.name !== 'link') {\n tr = tr.addMark(selection.from, selection.to, mark)\n }\n }\n\n dispatch(tr.setMeta('painterAction', { type: 'end' }))\n }\n document.addEventListener('mouseup', mouseup)\n return true\n },\n },\n },\n }),\n ]\n },\n})\n","interface ServiceType {\n label: string\n value: string\n icon: any\n}\nexport const VideoServices: ServiceType[] = [\n { label: '优酷', value: 'youku', icon: 'Youku' },\n {\n label: '哔哩哔哩',\n value: 'bilibili',\n icon: 'BiliBili',\n },\n {\n label: '腾讯视频',\n value: 'qqvideo',\n icon: 'QQVideo',\n },\n]\n\nexport const MapServices: ServiceType[] = [\n { label: '高德地图', value: 'amap', icon: 'Gaode' },\n { label: '百度地图', value: 'baidu_map', icon: 'Baidu' },\n]\n\nexport const DesignServices: ServiceType[] = [\n { label: '墨刀', value: 'modao', icon: 'Modao' },\n { label: '蓝湖', value: 'lanhu', icon: 'Lanhu' },\n { label: 'Figma', value: 'figma', icon: 'Figma' },\n { label: 'Canva', value: 'canva', icon: 'Canva' },\n { label: 'ProcessOn', value: 'processon', icon: 'Processon' },\n]\n\nexport const DevelopServices: ServiceType[] = [\n { label: 'CodePen', value: 'codepen', icon: 'Codepen' },\n]\n\nexport const DataServices: ServiceType[] = [\n { label: '金数据', value: 'jinshuju', icon: 'Jinshuju' },\n]\n\nexport const OtherServices = []\n\nexport const AllEmbedServices = [\n ...VideoServices,\n ...MapServices,\n ...DesignServices,\n ...DevelopServices,\n ...DataServices,\n ...OtherServices,\n]\n\nexport function getEmbedService(value: any) {\n for (const item of AllEmbedServices) {\n if (item.value === value) {\n return item\n }\n }\n\n return {}\n}\n\n/**\n * Embed service link\n * @id source id\n * @exmplae example link\n * @src source src, used in iframe\n */\nexport const EmbedServiceLink: any = {\n youtube: {\n example: 'https://www.youtube.com/watch?v=I4sMhHbHYXM',\n src: 'https://www.youtube.com/embed/I4sMhHbHYXM',\n srcPrefix: 'https://www.youtube.com/embed',\n linkRule: [\n /(?:https?:\\/\\/)?(?:www\\.)?(?:youtube\\.com\\/(?:[^\\s/]+\\/\\S+\\/|(?:v|e(?:mbed)?)\\/|\\S*?[&?]v=)|youtu\\.be\\/)([\\w-]{11})/,\n ],\n },\n youku: {\n example:\n 'https://v.youku.com/v_show/id_XNDM0NDM4MTcy.html?spm=a2h0c.8166622.PhoneSokuUgc_4.dtitle',\n src: 'https://player.youku.com/embed/XNDM0NDM4MTcy',\n srcPrefix: 'https://player.youku.com/embed',\n linkRule: ['v.youku.com\\\\/v_show\\\\/id_\\\\w+\\\\=*'],\n idRule: 'id_\\\\w+\\\\=*',\n },\n bilibili: {\n example: 'https://www.bilibili.com/video/BV1EJ411u7DN',\n src: 'https://player.bilibili.com/player.html?bvid=BV1EJ411u7DN',\n srcPrefix: 'https://player.bilibili.com/player.html?bvid',\n linkRule: ['www.bilibili.com\\\\/video\\\\/\\\\w+'],\n },\n qqvideo: {\n example: 'https://v.qq.com/x/cover/mzc0020006aw1mn/u0033nvzb5v.html',\n src: 'https://v.qq.com/txp/iframe/player.html?vid=u0033nvzb5v',\n srcPrefix: 'https://v.qq.com/txp/iframe/player.html?vid',\n linkRule: ['v.qq.com\\\\/x\\\\/cover\\\\/\\\\w+\\\\/\\\\w+'],\n },\n amap: {\n example: 'https://ditu.amap.com/',\n src: 'https://www.amap.com/place/B000A45467',\n srcPrefix: '',\n linkRule: ['\\\\.amap\\\\.com'],\n },\n baidu_map: {\n example: 'https://j.map.baidu.com/15/fo',\n src: 'https://j.map.baidu.com/15/fo',\n srcPrefix: '',\n linkRule: ['map\\\\.baidu\\\\.com'],\n },\n modao: {\n example:\n 'https://free.modao.cc/app/2cd26580a6717a147454df7470e7ec464093cba3/embed/v2#screen=sk71k6d1dfxulzx',\n src: 'https://free.modao.cc/app/6UkpAxcGE3nPz52GLqhnOZgC7MATBSy/embed/v2',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/\\\\w+.modao.cc\\\\/app\\\\/\\\\w+\\\\/embed\\\\/v2'],\n tips: 'Modao > More > Share > Embed > COPY',\n },\n lanhu: {\n example: 'https://lanhuapp.com/link/#/invite?sid=evP7L',\n src: 'https://lanhuapp.com/url/evP7L',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/lanhuapp.com\\\\/url\\\\/\\\\w+'],\n tips: 'Lanhu > Project > Share > Copy Link',\n },\n figma: {\n example: 'https://www.figma.com/file/aS9uSgPXoNpaPkzbjNcK8v/Demo?node-id=0%3A1',\n src: 'https://www.figma.com/file/aS9uSgPXoNpaPkzbjNcK8v/Demo?node-id=0%3A1',\n srcPrefix: 'https://www.figma.com/embed?embed_host=share&url',\n linkRule: ['https:\\\\/\\\\/www.figma.com\\\\/file\\\\/\\\\w+'],\n },\n canva: {\n example: 'https://www.canva.cn/design/DAD61-t29UI/view',\n src: 'https://www.canva.cn/design/DAD61-t29UI/view',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/www.canva.cn\\\\/design\\\\/.+\\\\/view'],\n },\n processon: {\n example: 'https://www.processon.com/embed/5ea99d8607912948b0e6fe78',\n src: 'https://www.processon.com/embed/5ea99d8607912948b0e6fe78',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/www.processon.com\\\\/embed\\\\/\\\\w+'],\n },\n codepen: {\n example: 'https://codepen.io/mekery/embed/YzyrKOJ',\n src: 'https://codepen.io/mekery/embed/YzyrKOJ',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/codepen.io\\\\/.+\\\\/embed\\\\/\\\\w+'],\n },\n jinshuju: {\n example: 'https://jinshuju.net/f/q9YvVf',\n src: 'https://jinshuju.net/f/q9YvVf',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/jinshuju.net\\\\/f\\\\/\\\\w+'],\n },\n iframe: {\n example: 'https://v.youku.com/v_show/id_XNDM0NDM4MTcy.html',\n src: 'https://player.youku.com/embed/XNDM0NDM4MTcy',\n srcPrefix: '',\n linkRule: ['.+'],\n },\n googlemaps: {\n example: 'https://goo.gl/maps/8Ys8b4K1ZJY2',\n src: 'https://www.google.com/maps/embed?pb=https://goo.gl/maps/8Ys8b4K1ZJY2',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/goo.gl\\\\/maps\\\\/\\\\w+'],\n },\n}\n\nfunction getYoutubeSrc(result: any) {\n const link = EmbedServiceLink.youtube\n const url = result.matchedUrl\n result.validLink = true\n\n const splits = url.split('=')\n const len = splits.length\n if (len > 0) {\n const id = splits[len - 1]\n result.src = `${link.srcPrefix}/${id}`\n result.validId = true\n }\n\n return result\n}\n\nfunction getYoukuSrc(result: any) {\n const link = EmbedServiceLink.youku as any\n const url = result.matchedUrl\n\n const idRule = link.idRule\n const regex = new RegExp(idRule)\n const match = url.match(regex)\n if (match && match.length > 0) {\n const id = match[0].slice(3)\n\n result.validId = true\n result.src = `${link.srcPrefix}/${id}`\n }\n else {\n result.validId = false\n }\n\n return result\n}\n\nfunction getBilibiliSrc(result: any) {\n const link = EmbedServiceLink.bilibili\n const url = result.matchedUrl\n\n const splits = url.split('/')\n const len = splits.length\n if (len > 0) {\n const id = splits[len - 1]\n result.src = `${link.srcPrefix}=${id}`\n result.validId = true\n }\n\n return result\n}\n\nfunction getQQVideoSrc(result: any) {\n const link = EmbedServiceLink.qqvideo\n const url = result.matchedUrl\n\n const splits = url.split('/')\n const len = splits.length\n if (len > 0) {\n const id = splits[len - 1]\n result.src = `${link.srcPrefix}=${id}`\n result.validId = true\n }\n\n return result\n}\n\nfunction getAMapSrc(originalLink: any, result: any) {\n result.src = originalLink\n result.validId = true\n\n return result\n}\n\nfunction getBaiduMapSrc(originalLink: any, result: any) {\n result.src = originalLink\n result.validId = true\n\n return result\n}\n\nfunction getGoogleMapSrc(originalLink: any, result: any) {\n result.src = originalLink\n result.validId = true\n result.originalLink = originalLink\n\n return result\n}\n\nfunction getModaoSrc(result: any) {\n result.src = result.matchedUrl\n result.validId = true\n result.originalLink = result.src\n\n return result\n}\n\nfunction getLanhuSrc(result: any) {\n result.src = result.matchedUrl\n result.validId = true\n result.originalLink = result.src\n\n return result\n}\n\nfunction getFigmaSrc(result: any) {\n const link = EmbedServiceLink.figma\n result.src = `${link.srcPrefix}=${encodeURIComponent(result.matchedUrl)}`\n result.validId = true\n result.originalLink = result.matchedUrl\n\n return result\n}\n\nfunction getCanvaSrc(originalLink: any, result: any) {\n result.src = `${result.matchedUrl}?embed`\n result.validId = true\n result.originalLink = originalLink\n\n return result\n}\n\nfunction getProcessonSrc(originalLink: any, result: any) {\n result.src = `${result.matchedUrl}`\n result.validId = true\n result.originalLink = originalLink\n\n return result\n}\n\nfunction getCodepenSrc(result: any) {\n result.src = `${result.matchedUrl}`\n result.validId = true\n result.originalLink = result.src\n\n return result\n}\n\nfunction getJinshujuSrc(originalLink: any, result: any) {\n result.src = `${result.matchedUrl}?background=white&banner=show&embedded=true`\n result.validId = true\n result.originalLink = originalLink\n\n return result\n}\n\nfunction getCommonSrc(originalLink: any, result: any) {\n result.src = `${result.matchedUrl}`\n result.validId = true\n result.originalLink = originalLink\n\n return result\n}\n\nfunction getMatchedUrl(service: any, originalLink: any, result: any) {\n if (service === 'googlemaps') {\n result.validLink = true\n result.matchedUrl = originalLink\n return result\n }\n\n const link = EmbedServiceLink[service]\n const linkRule = link.linkRule\n\n for (const rule of linkRule) {\n const regex = new RegExp(rule)\n const match = originalLink.match(regex)\n if (match && match.length > 0) {\n result.validLink = true\n result.matchedUrl = service === 'youtube' ? match[1] : match[0]\n\n return result\n }\n }\n\n return result\n}\n\nexport function getExampleUrl(service: string) {\n let exampleUrl = ''\n const link = EmbedServiceLink[service]\n if (link) {\n exampleUrl = link.example\n }\n return exampleUrl\n}\n\nfunction formatUrl(url: string) {\n let service = 'iframe'\n\n if (url.includes?.('youtube') || url.includes?.('youtu.be')) {\n service = 'youtube'\n }\n\n if (url.includes('youku')) {\n service = 'youku'\n }\n\n if (url.includes('bilibili')) {\n service = 'bilibili'\n }\n\n if (url.includes('qq')) {\n service = 'qqvideo'\n }\n\n if (url.includes('amap')) {\n service = 'amap'\n }\n\n if (url.includes('map.baidu')) {\n service = 'baidu_map'\n }\n\n if (url.includes('google.com/maps') || url.includes('maps.app.goo.gl')) {\n service = 'googlemaps'\n }\n\n if (url.includes('modao')) {\n service = 'modao'\n }\n\n if (url.includes('lanhuapp')) {\n service = 'lanhu'\n }\n\n if (url.includes('figma')) {\n service = 'figma'\n }\n\n if (url.includes('canva')) {\n service = 'canva'\n }\n\n if (url.includes('processon')) {\n service = 'processon'\n }\n\n if (url.includes('codepen')) {\n service = 'codepen'\n }\n\n if (url.includes('jinshuju')) {\n service = 'jinshuju'\n }\n\n if (url.includes('iframe')) {\n service = 'iframe'\n }\n\n return service\n}\n\nexport function getServiceSrc(originalLink: any) {\n let result = {\n validLink: false,\n validId: false,\n matchedUrl: '',\n originalLink,\n src: '',\n }\n\n const service = formatUrl(originalLink)\n\n // matched url\n result = getMatchedUrl(service, originalLink, result)\n\n if (!result.validLink) {\n return result\n }\n\n // src\n switch (service) {\n case 'youtube': {\n return getYoutubeSrc(result)\n }\n case 'youku': {\n return getYoukuSrc(result)\n }\n case 'bilibili': {\n return getBilibiliSrc(result)\n }\n case 'qqvideo': {\n return getQQVideoSrc(result)\n }\n case 'amap': {\n return getAMapSrc(originalLink, result)\n }\n case 'baidu_map': {\n return getBaiduMapSrc(originalLink, result)\n }\n case 'googlemaps': {\n return getGoogleMapSrc(originalLink, result)\n }\n case 'modao': {\n return getModaoSrc(result)\n }\n case 'lanhu': {\n return getLanhuSrc(result)\n }\n case 'figma': {\n return getFigmaSrc(result)\n }\n case 'canva': {\n return getCanvaSrc(originalLink, result)\n }\n case 'processon': {\n return getProcessonSrc(originalLink, result)\n }\n case 'codepen': {\n return getCodepenSrc(result)\n }\n case 'jinshuju': {\n return getJinshujuSrc(originalLink, result)\n }\n case 'iframe': {\n return getCommonSrc(originalLink, result)\n }\n }\n\n return result\n}\n","import React, { useState } from 'react'\n\nimport { NodeViewWrapper } from '@tiptap/react'\n\nimport { Button, Input } from '@/components'\nimport { getServiceSrc } from '@/extensions/Iframe/embed'\n\nfunction IframeNodeView(props: any) {\n const [originalLink, setOriginalLink] = useState<string>('')\n\n function handleConfirm() {\n if (!originalLink) {\n return\n }\n\n const result = getServiceSrc(originalLink)\n if (result.validLink && result.validId) {\n props.updateAttributes({ src: result.src })\n }\n }\n\n return (\n <>\n <NodeViewWrapper as=\"section\">\n {!props?.node?.attrs?.src && (\n <div className=\"max-w-[600px] mx-[auto] my-[12px] flex items-center justify-center gap-[10px] p-[10px] border-[1px] border-solid border-[#ccc] rounded-[12px]\">\n <Input\n value={originalLink}\n onInput={(e: any) => setOriginalLink(e.target.value)}\n type=\"url\"\n className=\"flex-1\"\n autoFocus\n placeholder=\"Enter link\"\n />\n <Button className=\"w-[60px]\" onClick={handleConfirm}>\n OK\n </Button>\n </div>\n )}\n {props?.node?.attrs?.src && (\n <iframe\n src={props?.node?.attrs?.src}\n frameBorder=\"0\"\n allowFullScreen={true}\n title={props?.node?.attrs?.src}\n className=\"my-[12px]\"\n >\n </iframe>\n )}\n </NodeViewWrapper>\n </>\n )\n}\n\nexport default IframeNodeView\n","import { Node } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\n\nimport { ActionButton } from '@/components'\nimport IframeNodeView from '@/extensions/Iframe/components/IframeNodeView'\nimport type { GeneralOptions } from '@/types'\n\nexport interface IframeOptions extends GeneralOptions<IframeOptions> {\n allowFullscreen: boolean\n HTMLAttributes: {\n [key: string]: any\n }\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n iframe: {\n /**\n * Add an iframe\n */\n setIframe: (options: { src: string, service: string }) => ReturnType\n }\n }\n}\n\nexport const Iframe = Node.create<IframeOptions>({\n name: 'iframes',\n group: 'block',\n atom: true,\n addOptions() {\n return {\n ...this.parent?.(),\n allowFullscreen: true,\n HTMLAttributes: {\n class: 'iframe-wrapper',\n },\n button: ({\n editor,\n extension,\n t,\n }: {\n editor: any\n extension: any\n t: (key: string) => string\n }) => ({\n component: ActionButton,\n componentProps: {\n action: (options: { src: string, service: string }) => editor.commands.setIframe(options),\n upload: extension.options.upload,\n disabled: !editor.can().setIframe({}),\n icon: 'Iframe',\n tooltip: t('editor.iframe.tooltip'),\n },\n }),\n }\n },\n addAttributes() {\n return {\n src: {\n default: null,\n },\n service: {\n default: null,\n },\n frameborder: {\n default: 0,\n },\n allowfullscreen: {\n default: this.options.allowFullscreen,\n parseHTML: () => this.options.allowFullscreen,\n },\n }\n },\n parseHTML() {\n return [\n {\n tag: 'iframe',\n },\n ]\n },\n renderHTML({ HTMLAttributes }) {\n return ['div', this.options.HTMLAttributes, ['iframe', HTMLAttributes]]\n },\n addNodeView() {\n return ReactNodeViewRenderer(IframeNodeView)\n },\n addCommands() {\n return {\n setIframe:\n (options: { src: string, service: string }) =>\n ({ tr, dispatch }) => {\n const { selection } = tr\n const node = this.type.create(options)\n\n if (dispatch) {\n tr.replaceRangeWith(selection.from, selection.to, node)\n }\n return true\n },\n }\n },\n})\n"],"names":["isMacResult","isMac","getShortcutKey","key","getShortcutKeys","keys","ActionButton","React","props","ref","icon","tooltip","disabled","customClass","shortcutKeys","tooltipOptions","action","isActive","children","asChild","upload","rest","Icon","icons","Comp","Slot","Toggle","Tooltip","jsx","TooltipTrigger","jsxs","TooltipContent","ActionMenuButton","Button","_a","Column","Node","element","attributes","HTMLAttributes","mergeAttributes","ColumnLayout","MultiColumn","commands","layout","getRenderContainer","editor","nodeType","view","from","elements","elementCount","node","container","shouldShow","ColumnsMenu","getReferenceClientRect","renderContainer","onColumnLeft","onColumnRight","onColumnTwo","BubbleMenu","sticky","bubbleMenu","extensionsNames","ext","renderMenuItems","_b","TableBubbleMenu","_c","BubbleMenuLink","_d","BubbleMenuImage","_e","BubbleMenuVideo","_f","ContentMenu","_g","BubbleMenuText","DEFAULT_LANG_VALUE","EDITOR_UPDATE_THROTTLE_WAIT_TIME","EDITOR_UPDATE_WATCH_THROTTLE_WAIT_TIME","IMAGE_MIN_SIZE","IMAGE_MAX_SIZE","IMAGE_THROTTLE_WAIT_TIME","TABLE_INIT_GRID_SIZE","TABLE_MAX_GRID_SIZE","TABLE_DEFAULT_SELECTED_GRID_SIZE","DEFAULT_COLOR","COLORS_LIST","DEFAULT_FONT_SIZE_LIST","DEFAULT_FONT_SIZE_VALUE","IMAGE_SIZE","VIDEO_SIZE","DEFAULT_LINE_HEIGHT","BUBBLE_TEXT_LIST","locale","en","vi","zh_CN","mitt","all","type","handler","handlers","evt","DEFAULT_LOCALE","Locale","__publicField","lang","message","hook","path","atomLang","proxy","useLocale","atomLangSnap","useSnapshot","useMemo","useEffect","watchLang","val","localeActions","locale$1","colorsArray","chunkedColors","i","AddMoreColor","setColor","colorMore","setColorMore","useState","openColorMore","setOpenColorMore","t","Popover","PopoverTrigger","e","PopoverContent","HexColorPicker","Input","Separator","Plus","ColorPicker","highlight","selectedColor","setSelectedColor","onChange","recentColorsStore","setRecentColorsStore","setRecentColor","color","newRecentColors","index","Fragment","items","item","idx","themeProxy","themeActions","theme","clamp","min","max","isNumber","value","isFunction","getCssUnitWithDefault","defaultUnit","stringValue","num","unitMatch","unit","hasExtension","name","extensions","RichTextEditor","content","useEditorOptions","sortExtensions","diff","differenceBy","k","find","onValueChange","throttle","output","getOutput","useEditor","useImperativeHandle","hasExtensionValue","TooltipProvider","Toolbar","EditorContent","forwardRef","arr","acc","a","b","menus","extension","button","divider","spacer","toolbar","_button","menu","ButtonComponent","AspectRatio","BlockquoteLeft","DeleteColumn","DeleteRow","FileWordOutline","IconComponent","FormatLineHeight","MenuDown","SizeL","SizeM","SizeS","Bold","LoaderCircle","Italic","Underline","Quote","Strikethrough","Minus","Eraser","PaintRoller","Redo2","Undo2","TextAlignCenterIcon","TextAlignJustifyIcon","TextAlignLeftIcon","TextAlignRightIcon","ChevronDown","Subscript","Superscript","Code","CodeXml","Type","IndentIncrease","IndentDecrease","List","ListOrdered","ListTodo","Link","ImageUp","Video","Maximize","Minimize","Table","Sparkles","Pencil","Unlink","BetweenHorizonalEnd","BetweenHorizonalStart","BetweenVerticalStart","BetweenVerticalEnd","TableCellsMerge","TableCellsSplit","Trash2","Trash","Replace","ChevronsUpDown","Heading1","Heading2","Heading3","Columns2","Columns3","Columns4","GripVertical","Copy","Clipboard","PanelLeft","PanelRight","Frame","SmilePlus","imageSizeMenus","types","size","imageAlignMenus","iconMap","videoSizeMenus","getBubbleImage","state","dispatch","deleteSelection","getBubbleVideo","getBubbleText","IndentProps","updateIndentLevel","tr","delta","doc","selection","TextSelection","AllSelection","to","pos","setNodeIndentMarkup","isList","indent","nodeAttrs","createIndentCommand","pluginKey","dragHandlePluginDefaultKey","currentNode","setCurrentNode","currentNodePos","setCurrentNodePos","dragElement","useRef","pluginRef","menuOpen","setMenuOpen","hasTextAlignExtension","hasIndentExtension","hasClearExtension","DragHandlePlugin","handleNodeChange","resetTextFormatting","chain","copyNodeToClipboard","duplicateNode","$anchor","selectedNode","setTextAlign","alignments","increaseIndent","indentTr","decreaseIndent","deleteNode","handleAdd","currentNodeSize","insertPos","currentNodeIsEmptyParagraph","focusPos","handleMenuOpenChange","open","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuPortal","DropdownMenuSubContent","tippyOptions","ItemA","$from","IconC","fill","HighlightActionButton","toggleColor","setSelectedColorDebounce","useCallback","debounce","onAddColumnBefore","onAddColumnAfter","onDeleteColumn","onAddRowAbove","onAddRowBelow","onDeleteRow","onMergeCell","onSplitCell","onDeleteTable","onSetCellBackground","tableWrapper","_h","_j","_i","_l","_k","_n","_m","_p","_o","_r","_q","LinkEditBlock","form","setForm","openInNewTab","setOpenInNewTab","link","target","text","handleSubmit","event","Label","Switch","LinkViewBlock","truncate","showEdit","setShowEdit","onSetLink","url","unSetLink","isImageNode","isVideoNode","isImage","BubbleMenuReact","isVideo","cn","inputs","twMerge","clsx","buttonVariants","cva","className","variant","DropdownMenuPrimitive.Root","DropdownMenuPrimitive.Trigger","DropdownMenuGroup","DropdownMenuPrimitive.Group","DropdownMenuPrimitive.Portal","DropdownMenuPrimitive.Sub","DropdownMenuRadioGroup","DropdownMenuPrimitive.RadioGroup","inset","DropdownMenuPrimitive.SubTrigger","ChevronRight","DropdownMenuPrimitive.SubContent","sideOffset","DropdownMenuPrimitive.Content","DropdownMenuPrimitive.Item","DropdownMenuCheckboxItem","checked","DropdownMenuPrimitive.CheckboxItem","DropdownMenuPrimitive.ItemIndicator","Check","DropdownMenuRadioItem","DropdownMenuPrimitive.RadioItem","Circle","DropdownMenuLabel","DropdownMenuPrimitive.Label","DropdownMenuPrimitive.Separator","DropdownMenuShortcut","labelVariants","LabelPrimitive.Root","PopoverPrimitive.Root","PopoverPrimitive.Trigger","align","PopoverPrimitive.Portal","PopoverPrimitive.Content","orientation","decorative","SeparatorPrimitive.Root","SwitchPrimitives.Root","SwitchPrimitives.Thumb","Tabs","TabsPrimitive.Root","TabsList","TabsPrimitive.List","TabsTrigger","TabsPrimitive.Trigger","TabsContent","TabsPrimitive.Content","ToastProvider","ToastPrimitives.Provider","ToastViewport","ToastPrimitives.Viewport","toastVariants","Toast","ToastPrimitives.Root","ToastAction","ToastPrimitives.Action","ToastClose","ToastPrimitives.Close","X","ToastTitle","ToastPrimitives.Title","ToastDescription","ToastPrimitives.Description","toggleVariants","TogglePrimitive.Root","TooltipPrimitive.Provider","TooltipPrimitive.Root","TooltipPrimitive.Trigger","TooltipPrimitive.Content","TOAST_LIMIT","TOAST_REMOVE_DELAY","count","genId","toastTimeouts","addToRemoveQueue","toastId","timeout","reducer","toast","listeners","memoryState","listener","id","update","dismiss","useToast","setState","TiptapBold","TiptapItalic","TiptapUnderline","Strike","TiptapStrike","TiptapCode","CodeBlock","TiptapCodeBlock","FontFamilyButton","active","style","FontFamily","FontFamilyTiptap","fonts","baseKitExt","font","HeadingButton","Heading","TiptapHeading","levels","level","TextAlignMenuButton","TextAlign","TiptapTextAlign","shortcutKeysMap","FontSizeMenuButton","FontSize","Extension","fontSizes","fontSize","ColorActionButton","Color","TiptapColor","Highlight","TiptapHighlight","BulletList","TiptapBulletList","Clear","OrderedList","TiptapOrderedList","TaskList","TiptapTaskList","TaskItem","Blockquote","TiptapBlockquote","LinkEditPopover","TiptapLink","Plugin","schema","range","getMarkRange","$start","$end","transaction","HorizontalRule","TiptapHorizontalRule","HistoryActionButton","historys","History","TiptapHistory","Document","TiptapDocument","ColumnToolbar","Selection","PluginKey","DecorationSet","Decoration","TextDropdown","activeItem","TextBubble","nodeEqualsType","TrailingNode","plugin","disabledNodes","_","__","shouldInsertNodeAtEnd","endPosition","lastNode","BaseKit","TiptapDocumentDefault","Placeholder","Focus","Text","Gapcursor","Dropcursor","CharacterCount","Paragraph","HardBreak","ListItem","TextStyle","SubAndSuperScript","subscript","superscript","subBtn","superBtn","TiptapSubscript","TiptapSuperscript","ActionMoreButton","MoreMark","Indent","identAttr","percentageToDecimal","percentageString","LineHeightDropdown","setValue","toggleLightheight","LineHeights","ALLOWED_NODE_TYPES","setTextLineHeight","lineHeight","tasks","lineHeightValue","task","attrs","createLineHeightCommand","LineHeight","renderGroups","groups","CommandsList","selectedCommandIndex","setSelectedCommandIndex","selectedGroupIndex","setSelectedGroupIndex","scrollContainer","activeItemRefs","onKeyDown","activeItemIndex","upHandler","downHandler","enterHandler","newCommandIndex","newGroupIndex","selectItem","groupIndex","commandIndex","command","createCommandClickHandler","setActiveItemRef","el","group","extensionName","popup","SlashCommand","tippy","Suggestion","isRootDepth","isParagraph","isStartOfNode","isInColumn","afterContent","isValidAfterContent","query","labelNormalized","queryNormalized","aliases","alias","labelMatch","aliasMatch","component","scrollHandler","ReactRenderer","rect","yPos","ResizeDirection","ImageView","maxSize","setMaxSize","originalSize","setOriginalSize","resizeDirections","resizing","setResizing","resizerState","setResizerState","imgAttrs","src","alt","w","h","width","height","imageMaxStyle","onImageLoad","selectImage","getPos","getMaxSize","prev","onMouseDown","dir","originalWidth","originalHeight","aspectRatio","maxWidth","flushSync","onMouseMove","x","dx","onMouseUp","onEvents","offEvents","resizeOb","NodeViewWrapper","direction","Image","TiptapImage","ReactNodeViewRenderer","options","uploadKey","UploadImagesPlugin","set","placeholder","createPlaceholder","deco","spec","image","findPlaceholder","found","createImageUpload","validateFn","onUpload","files","file","result","placeholderPos","imageSrc","handleImagePaste","uploadFn","handleImageDrop","moved","coordinates","ImageUploader","setLink","fileInput","handleFile","uploadOptions","handleLink","handleDelete","handleClick","DEFAULT_OPTIONS","ImageUpload","linkConvert","iframeHTMLAttributes","responsiveStyle","responsiveSizesStyle","responsiveDOM","VideoUploaderView","loading","setLoading","res","VideoUpload","setCellBackgroundMarkup","backgroundColor","updateCellBackground","CellSelection","createCellBackgroundCommand","TableCellBackground","mobileRE","notMobileRE","tabletRE","isMobile","opts","ua","createArray","length","CreateTablePopover","withHeaderRow","setWithHeaderRow","tableGridSize","setTableGridSize","selectedTableGridSize","setSelectedTableGridSize","selectTableGridSize","rows","cols","resetTableGridSize","row","col","TableActionButton","createTable","TiptapTable","TableRow","TableHeader","TableCell","FormatPainter","marks","dom","cursorUrl","mouseup","mark","EmbedServiceLink","getYoutubeSrc","splits","len","getYoukuSrc","idRule","regex","match","getBilibiliSrc","getQQVideoSrc","getAMapSrc","originalLink","getBaiduMapSrc","getGoogleMapSrc","getModaoSrc","getLanhuSrc","getFigmaSrc","getCanvaSrc","getProcessonSrc","getCodepenSrc","getJinshujuSrc","getCommonSrc","getMatchedUrl","service","linkRule","rule","formatUrl","getServiceSrc","IframeNodeView","setOriginalLink","handleConfirm","Iframe"],"mappings":"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xG,OAAImD,GAAA,MAAAA,EAAY,OACPA,EAAW,OAAO,CAAE,OAAAjB,EAAQ,SAAUlC,GAAY,GAAO,WAAAmD,CAAA,EAAcG,EAAA,CAAiB,EAG1FA,EAAkB,EAAA,OAAO,OAAO,CACzC,CCrCO,MAAMa,GAAqB,KAGrBC,GAAmC,IAMnCC,GAAyCD,GAAmC,GAG5EE,GAAiB,GAEjBC,GAAiB,IAEjBC,GAA2B,GAG3BC,GAAuB,GAEvBC,GAAsB,GAEtBC,GAAmC,EAEnCC,GAAgB,UAEhBC,GAAc,CACzB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EAGaC,GAAyB,CACpC,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACF,EAGaC,GAA0B,UAG3B,IAAAC,IAAAA,IACVA,EAAAA,EAAA,cAAe,GAAf,EAAA,aACAA,EAAAA,EAAA,eAAgB,GAAhB,EAAA,cACAA,EAAA,YAAe,EAAA,OAHLA,IAAAA,IAAA,CAAA,CAAA,EAOAC,IAAAA,IACVA,EAAAA,EAAA,cAAe,GAAf,EAAA,aACAA,EAAAA,EAAA,eAAgB,GAAhB,EAAA,cACAA,EAAA,YAAe,EAAA,OAHLA,IAAAA,IAAA,CAAA,CAAA,EAOL,MAAMC,GAAsB,IAqCtBC,GAAmB,CAC9B,OACA,SACA,YACA,SACA,OACA,OACA,UACA,QACA,YACA,WACF,ECzLMC,GAAS,CACb,gBAAiB,SACjB,cAAe,OACf,eAAgB,QAChB,oBAAqB,aACrB,iBAAkB,UAClB,gBAAiB,gBACjB,gBAAiB,UACjB,g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"}