You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							1 line
						
					
					
						
							11 KiB
						
					
					
				
			
		
		
	
	
							1 line
						
					
					
						
							11 KiB
						
					
					
				| {"version":3,"file":"tiptap-extension-floating-menu.cjs","sources":["../src/floating-menu-plugin.ts","../src/floating-menu.ts"],"sourcesContent":["import { Editor, posToDOMRect } from '@tiptap/core'\nimport { EditorState, Plugin, PluginKey } from 'prosemirror-state'\nimport { EditorView } from 'prosemirror-view'\nimport tippy, { Instance, Props } from 'tippy.js'\n\nexport interface FloatingMenuPluginProps {\n  pluginKey: PluginKey | string,\n  editor: Editor,\n  element: HTMLElement,\n  tippyOptions?: Partial<Props>,\n  shouldShow?: ((props: {\n    editor: Editor,\n    view: EditorView,\n    state: EditorState,\n    oldState?: EditorState,\n  }) => boolean) | null,\n}\n\nexport type FloatingMenuViewProps = FloatingMenuPluginProps & {\n  view: EditorView,\n}\n\nexport class FloatingMenuView {\n  public editor: Editor\n\n  public element: HTMLElement\n\n  public view: EditorView\n\n  public preventHide = false\n\n  public tippy: Instance | undefined\n\n  public tippyOptions?: Partial<Props>\n\n  public shouldShow: Exclude<FloatingMenuPluginProps['shouldShow'], null> = ({ view, state }) => {\n    const { selection } = state\n    const { $anchor, empty } = selection\n    const isRootDepth = $anchor.depth === 1\n    const isEmptyTextBlock = $anchor.parent.isTextblock\n      && !$anchor.parent.type.spec.code\n      && !$anchor.parent.textContent\n\n    if (\n      !view.hasFocus()\n      || !empty\n      || !isRootDepth\n      || !isEmptyTextBlock\n      || !this.editor.isEditable\n    ) {\n      return false\n    }\n\n    return true\n  }\n\n  constructor({\n    editor,\n    element,\n    view,\n    tippyOptions = {},\n    shouldShow,\n  }: FloatingMenuViewProps) {\n    this.editor = editor\n    this.element = element\n    this.view = view\n\n    if (shouldShow) {\n      this.shouldShow = shouldShow\n    }\n\n    this.element.addEventListener('mousedown', this.mousedownHandler, { capture: true })\n    this.editor.on('focus', this.focusHandler)\n    this.editor.on('blur', this.blurHandler)\n    this.tippyOptions = tippyOptions\n    // Detaches menu content from its current parent\n    this.element.remove()\n    this.element.style.visibility = 'visible'\n  }\n\n  mousedownHandler = () => {\n    this.preventHide = true\n  }\n\n  focusHandler = () => {\n    // we use `setTimeout` to make sure `selection` is already updated\n    setTimeout(() => this.update(this.editor.view))\n  }\n\n  blurHandler = ({ event }: { event: FocusEvent }) => {\n    if (this.preventHide) {\n      this.preventHide = false\n\n      return\n    }\n\n    if (\n      event?.relatedTarget\n      && this.element.parentNode?.contains(event.relatedTarget as Node)\n    ) {\n      return\n    }\n\n    this.hide()\n  }\n\n  tippyBlurHandler = (event : FocusEvent) => {\n    this.blurHandler({ event })\n  }\n\n  createTooltip() {\n    const { element: editorElement } = this.editor.options\n    const editorIsAttached = !!editorElement.parentElement\n\n    if (this.tippy || !editorIsAttached) {\n      return\n    }\n\n    this.tippy = tippy(editorElement, {\n      duration: 0,\n      getReferenceClientRect: null,\n      content: this.element,\n      interactive: true,\n      trigger: 'manual',\n      placement: 'right',\n      hideOnClick: 'toggle',\n      ...this.tippyOptions,\n    })\n\n    // maybe we have to hide tippy on its own blur event as well\n    if (this.tippy.popper.firstChild) {\n      (this.tippy.popper.firstChild as HTMLElement).addEventListener('blur', this.tippyBlurHandler)\n    }\n  }\n\n  update(view: EditorView, oldState?: EditorState) {\n    const { state } = view\n    const { doc, selection } = state\n    const { from, to } = selection\n    const isSame = oldState && oldState.doc.eq(doc) && oldState.selection.eq(selection)\n\n    if (isSame) {\n      return\n    }\n\n    this.createTooltip()\n\n    const shouldShow = this.shouldShow?.({\n      editor: this.editor,\n      view,\n      state,\n      oldState,\n    })\n\n    if (!shouldShow) {\n      this.hide()\n\n      return\n    }\n\n    this.tippy?.setProps({\n      getReferenceClientRect: this.tippyOptions?.getReferenceClientRect || (() => posToDOMRect(view, from, to)),\n    })\n\n    this.show()\n  }\n\n  show() {\n    this.tippy?.show()\n  }\n\n  hide() {\n    this.tippy?.hide()\n  }\n\n  destroy() {\n    if (this.tippy?.popper.firstChild) {\n      (this.tippy.popper.firstChild as HTMLElement).removeEventListener('blur', this.tippyBlurHandler)\n    }\n    this.tippy?.destroy()\n    this.element.removeEventListener('mousedown', this.mousedownHandler, { capture: true })\n    this.editor.off('focus', this.focusHandler)\n    this.editor.off('blur', this.blurHandler)\n  }\n}\n\nexport const FloatingMenuPlugin = (options: FloatingMenuPluginProps) => {\n  return new Plugin({\n    key: typeof options.pluginKey === 'string'\n      ? new PluginKey(options.pluginKey)\n      : options.pluginKey,\n    view: view => new FloatingMenuView({ view, ...options }),\n  })\n}\n","import { Extension } from '@tiptap/core'\n\nimport { FloatingMenuPlugin, FloatingMenuPluginProps } from './floating-menu-plugin'\n\nexport type FloatingMenuOptions = Omit<FloatingMenuPluginProps, 'editor' | 'element'> & {\n  element: HTMLElement | null,\n}\n\nexport const FloatingMenu = Extension.create<FloatingMenuOptions>({\n  name: 'floatingMenu',\n\n  addOptions() {\n    return {\n      element: null,\n      tippyOptions: {},\n      pluginKey: 'floatingMenu',\n      shouldShow: null,\n    }\n  },\n\n  addProseMirrorPlugins() {\n    if (!this.options.element) {\n      return []\n    }\n\n    return [\n      FloatingMenuPlugin({\n        pluginKey: this.options.pluginKey,\n        editor: this.editor,\n        element: this.options.element,\n        tippyOptions: this.options.tippyOptions,\n        shouldShow: this.options.shouldShow,\n      }),\n    ]\n  },\n})\n"],"names":["tippy","posToDOMRect","Plugin","PluginKey","Extension"],"mappings":"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"} |