{"version":3,"sources":["../src/index.ts","../src/floating-menu.ts","../src/floating-menu-plugin.ts"],"sourcesContent":["import { FloatingMenu } from './floating-menu.js'\n\nexport * from './floating-menu.js'\nexport * from './floating-menu-plugin.js'\n\nexport default FloatingMenu\n","import { Extension } from \"@autoartifacts/core\";\n\nimport type { FloatingMenuPluginProps } from \"./floating-menu-plugin.js\";\nimport { FloatingMenuPlugin } from \"./floating-menu-plugin.js\";\n\nexport type FloatingMenuOptions = Omit<\n  FloatingMenuPluginProps,\n  \"editor\" | \"element\"\n> & {\n  /**\n   * The DOM element that contains your menu.\n   * @type {HTMLElement}\n   * @default null\n   */\n  element: HTMLElement | null;\n};\n\n/**\n * This extension allows you to create a floating menu.\n * @see https://tiptap.dev/api/extensions/floating-menu\n */\nexport const FloatingMenu = Extension.create<FloatingMenuOptions>({\n  name: \"floatingMenu\",\n\n  addOptions() {\n    return {\n      element: null,\n      options: {},\n      pluginKey: \"floatingMenu\",\n      appendTo: undefined,\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        options: this.options.options,\n        appendTo: this.options.appendTo,\n        shouldShow: this.options.shouldShow,\n      }),\n    ];\n  },\n});\n","import {\n  type Middleware,\n  arrow,\n  autoPlacement,\n  computePosition,\n  flip,\n  hide,\n  inline,\n  offset,\n  shift,\n  size,\n} from \"@floating-ui/dom\";\nimport type { Editor } from \"@autoartifacts/core\";\nimport {\n  getText,\n  getTextSerializersFromSchema,\n  posToDOMRect,\n} from \"@autoartifacts/core\";\nimport type { Node as ProsemirrorNode } from \"@autoartifacts/pm/model\";\nimport type { EditorState } from \"@autoartifacts/pm/state\";\nimport { Plugin, PluginKey } from \"@autoartifacts/pm/state\";\nimport type { EditorView } from \"@autoartifacts/pm/view\";\n\nexport interface FloatingMenuPluginProps {\n  /**\n   * The plugin key for the floating menu.\n   * @default 'floatingMenu'\n   */\n  pluginKey: PluginKey | string;\n\n  /**\n   * The editor instance.\n   * @default null\n   */\n  editor: Editor;\n\n  /**\n   * The DOM element that contains your menu.\n   * @default null\n   */\n  element: HTMLElement;\n\n  /**\n   * The DOM element to append your menu to. Default is the editor's parent element.\n   *\n   * Sometimes the menu needs to be appended to a different DOM context due to accessibility, clipping, or z-index issues.\n   *\n   * @type {HTMLElement}\n   * @default null\n   */\n  appendTo?: HTMLElement | (() => HTMLElement);\n\n  /**\n   * A function that determines whether the menu should be shown or not.\n   * If this function returns `false`, the menu will be hidden, otherwise it will be shown.\n   */\n  shouldShow?:\n    | ((props: {\n        editor: Editor;\n        view: EditorView;\n        state: EditorState;\n        oldState?: EditorState;\n        from: number;\n        to: number;\n      }) => boolean)\n    | null;\n\n  /**\n   * The options for the floating menu. Those are passed to Floating UI and include options for the placement, offset, flip, shift, arrow, size, autoPlacement,\n   * hide, and inline middlewares.\n   * @default {}\n   * @see https://floating-ui.com/docs/computePosition#options\n   */\n  options?: {\n    strategy?: \"absolute\" | \"fixed\";\n    placement?:\n      | \"top\"\n      | \"right\"\n      | \"bottom\"\n      | \"left\"\n      | \"top-start\"\n      | \"top-end\"\n      | \"right-start\"\n      | \"right-end\"\n      | \"bottom-start\"\n      | \"bottom-end\"\n      | \"left-start\"\n      | \"left-end\";\n    offset?: Parameters<typeof offset>[0] | boolean;\n    flip?: Parameters<typeof flip>[0] | boolean;\n    shift?: Parameters<typeof shift>[0] | boolean;\n    arrow?: Parameters<typeof arrow>[0] | false;\n    size?: Parameters<typeof size>[0] | boolean;\n    autoPlacement?: Parameters<typeof autoPlacement>[0] | boolean;\n    hide?: Parameters<typeof hide>[0] | boolean;\n    inline?: Parameters<typeof inline>[0] | boolean;\n\n    onShow?: () => void;\n    onHide?: () => void;\n    onUpdate?: () => void;\n    onDestroy?: () => void;\n  };\n}\n\nexport type FloatingMenuViewProps = FloatingMenuPluginProps & {\n  /**\n   * The editor view.\n   */\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 appendTo: HTMLElement | (() => HTMLElement) | undefined;\n\n  public preventHide = false;\n\n  private isVisible = false;\n\n  private getTextContent(node: ProsemirrorNode) {\n    return getText(node, {\n      textSerializers: getTextSerializersFromSchema(this.editor.schema),\n    });\n  }\n\n  public shouldShow: Exclude<FloatingMenuPluginProps[\"shouldShow\"], null> = ({\n    view,\n    state,\n  }) => {\n    const { selection } = state;\n    const { $anchor, empty } = selection;\n    const isRootDepth = $anchor.depth === 1;\n\n    const isEmptyTextBlock =\n      $anchor.parent.isTextblock &&\n      !$anchor.parent.type.spec.code &&\n      !$anchor.parent.textContent &&\n      $anchor.parent.childCount === 0 &&\n      !this.getTextContent($anchor.parent);\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  private floatingUIOptions: NonNullable<FloatingMenuPluginProps[\"options\"]> = {\n    strategy: \"absolute\",\n    placement: \"right\",\n    offset: 8,\n    flip: {},\n    shift: {},\n    arrow: false,\n    size: false,\n    autoPlacement: false,\n    hide: false,\n    inline: false,\n  };\n\n  get middlewares() {\n    const middlewares: Middleware[] = [];\n\n    if (this.floatingUIOptions.flip) {\n      middlewares.push(\n        flip(\n          typeof this.floatingUIOptions.flip !== \"boolean\"\n            ? this.floatingUIOptions.flip\n            : undefined\n        )\n      );\n    }\n\n    if (this.floatingUIOptions.shift) {\n      middlewares.push(\n        shift(\n          typeof this.floatingUIOptions.shift !== \"boolean\"\n            ? this.floatingUIOptions.shift\n            : undefined\n        )\n      );\n    }\n\n    if (this.floatingUIOptions.offset) {\n      middlewares.push(\n        offset(\n          typeof this.floatingUIOptions.offset !== \"boolean\"\n            ? this.floatingUIOptions.offset\n            : undefined\n        )\n      );\n    }\n\n    if (this.floatingUIOptions.arrow) {\n      middlewares.push(arrow(this.floatingUIOptions.arrow));\n    }\n\n    if (this.floatingUIOptions.size) {\n      middlewares.push(\n        size(\n          typeof this.floatingUIOptions.size !== \"boolean\"\n            ? this.floatingUIOptions.size\n            : undefined\n        )\n      );\n    }\n\n    if (this.floatingUIOptions.autoPlacement) {\n      middlewares.push(\n        autoPlacement(\n          typeof this.floatingUIOptions.autoPlacement !== \"boolean\"\n            ? this.floatingUIOptions.autoPlacement\n            : undefined\n        )\n      );\n    }\n\n    if (this.floatingUIOptions.hide) {\n      middlewares.push(\n        hide(\n          typeof this.floatingUIOptions.hide !== \"boolean\"\n            ? this.floatingUIOptions.hide\n            : undefined\n        )\n      );\n    }\n\n    if (this.floatingUIOptions.inline) {\n      middlewares.push(\n        inline(\n          typeof this.floatingUIOptions.inline !== \"boolean\"\n            ? this.floatingUIOptions.inline\n            : undefined\n        )\n      );\n    }\n\n    return middlewares;\n  }\n\n  constructor({\n    editor,\n    element,\n    view,\n    options,\n    appendTo,\n    shouldShow,\n  }: FloatingMenuViewProps) {\n    this.editor = editor;\n    this.element = element;\n    this.view = view;\n    this.appendTo = appendTo;\n\n    this.floatingUIOptions = {\n      ...this.floatingUIOptions,\n      ...options,\n    };\n\n    this.element.tabIndex = 0;\n\n    if (shouldShow) {\n      this.shouldShow = shouldShow;\n    }\n\n    this.element.addEventListener(\"mousedown\", this.mousedownHandler, {\n      capture: true,\n    });\n    this.editor.on(\"focus\", this.focusHandler);\n    this.editor.on(\"blur\", this.blurHandler);\n\n    this.update(view, view.state);\n\n    if (this.getShouldShow()) {\n      this.show();\n      this.updatePosition();\n    }\n  }\n\n  getShouldShow(oldState?: EditorState) {\n    const { state } = this.view;\n    const { selection } = state;\n\n    const { ranges } = selection;\n    const from = Math.min(...ranges.map((range) => range.$from.pos));\n    const to = Math.max(...ranges.map((range) => range.$to.pos));\n\n    const shouldShow = this.shouldShow?.({\n      editor: this.editor,\n      view: this.view,\n      state,\n      oldState,\n      from,\n      to,\n    });\n\n    return shouldShow;\n  }\n\n  updateHandler = (\n    view: EditorView,\n    selectionChanged: boolean,\n    docChanged: boolean,\n    oldState?: EditorState\n  ) => {\n    const { composing } = view;\n\n    const isSame = !selectionChanged && !docChanged;\n\n    if (composing || isSame) {\n      return;\n    }\n\n    const shouldShow = this.getShouldShow(oldState);\n\n    if (!shouldShow) {\n      this.hide();\n\n      return;\n    }\n\n    this.updatePosition();\n    this.show();\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    if (event?.relatedTarget === this.editor.view.dom) {\n      return;\n    }\n\n    this.hide();\n  };\n\n  updatePosition() {\n    const { selection } = this.editor.state;\n\n    const domRect = posToDOMRect(this.view, selection.from, selection.to);\n\n    const virtualElement = {\n      getBoundingClientRect: () => domRect,\n      getClientRects: () => [domRect],\n    };\n\n    computePosition(virtualElement, this.element, {\n      placement: this.floatingUIOptions.placement,\n      strategy: this.floatingUIOptions.strategy,\n      middleware: this.middlewares,\n    }).then(({ x, y, strategy }) => {\n      this.element.style.width = \"max-content\";\n      this.element.style.position = strategy;\n      this.element.style.left = `${x}px`;\n      this.element.style.top = `${y}px`;\n\n      if (this.isVisible && this.floatingUIOptions.onUpdate) {\n        this.floatingUIOptions.onUpdate();\n      }\n    });\n  }\n\n  update(view: EditorView, oldState?: EditorState) {\n    const selectionChanged = !oldState?.selection.eq(view.state.selection);\n    const docChanged = !oldState?.doc.eq(view.state.doc);\n\n    this.updateHandler(view, selectionChanged, docChanged, oldState);\n  }\n\n  show() {\n    if (this.isVisible) {\n      return;\n    }\n\n    this.element.style.visibility = \"visible\";\n    this.element.style.opacity = \"1\";\n\n    // attach to appendTo or editor's parent element\n    const appendToElement =\n      typeof this.appendTo === \"function\" ? this.appendTo() : this.appendTo;\n    (appendToElement ?? this.view.dom.parentElement)?.appendChild(this.element);\n\n    if (this.floatingUIOptions.onShow) {\n      this.floatingUIOptions.onShow();\n    }\n\n    this.isVisible = true;\n  }\n\n  hide() {\n    if (!this.isVisible) {\n      return;\n    }\n\n    this.element.style.visibility = \"hidden\";\n    this.element.style.opacity = \"0\";\n    // remove from the parent element\n    this.element.remove();\n\n    if (this.floatingUIOptions.onHide) {\n      this.floatingUIOptions.onHide();\n    }\n\n    this.isVisible = false;\n  }\n\n  destroy() {\n    this.hide();\n    this.element.removeEventListener(\"mousedown\", this.mousedownHandler, {\n      capture: true,\n    });\n    this.editor.off(\"focus\", this.focusHandler);\n    this.editor.off(\"blur\", this.blurHandler);\n\n    if (this.floatingUIOptions.onDestroy) {\n      this.floatingUIOptions.onDestroy();\n    }\n  }\n}\n\nexport const FloatingMenuPlugin = (options: FloatingMenuPluginProps) => {\n  return new Plugin({\n    key:\n      typeof options.pluginKey === \"string\"\n        ? new PluginKey(options.pluginKey)\n        : options.pluginKey,\n    view: (view) => new FloatingMenuView({ view, ...options }),\n  });\n};\n"],"mappings":"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","names":["import_core"]}