| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | import extend from 'extend';import Emitter from '../core/emitter';import BaseTheme, { BaseTooltip } from './base';import { Range } from '../core/selection';import icons from '../ui/icons';const TOOLBAR_CONFIG = [  ['bold', 'italic', 'link'],  [{ header: 1 }, { header: 2 }, 'blockquote']];class BubbleTheme extends BaseTheme {  constructor(quill, options) {    if (options.modules.toolbar != null && options.modules.toolbar.container == null) {      options.modules.toolbar.container = TOOLBAR_CONFIG;    }    super(quill, options);    this.quill.container.classList.add('ql-bubble');  }  extendToolbar(toolbar) {    this.tooltip = new BubbleTooltip(this.quill, this.options.bounds);    this.tooltip.root.appendChild(toolbar.container);    this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), icons);    this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), icons);  }}BubbleTheme.DEFAULTS = extend(true, {}, BaseTheme.DEFAULTS, {  modules: {    toolbar: {      handlers: {        link: function(value) {          if (!value) {            this.quill.format('link', false);          } else {            this.quill.theme.tooltip.edit();          }        }      }    }  }});class BubbleTooltip extends BaseTooltip {  constructor(quill, bounds) {    super(quill, bounds);    this.quill.on(Emitter.events.EDITOR_CHANGE, (type, range, oldRange, source) => {      if (type !== Emitter.events.SELECTION_CHANGE) return;      if (range != null && range.length > 0 && source === Emitter.sources.USER) {        this.show();        // Lock our width so we will expand beyond our offsetParent boundaries        this.root.style.left = '0px';        this.root.style.width = '';        this.root.style.width = this.root.offsetWidth + 'px';        let lines = this.quill.getLines(range.index, range.length);        if (lines.length === 1) {          this.position(this.quill.getBounds(range));        } else {          let lastLine = lines[lines.length - 1];          let index = this.quill.getIndex(lastLine);          let length = Math.min(lastLine.length() - 1, range.index + range.length - index);          let bounds = this.quill.getBounds(new Range(index, length));          this.position(bounds);        }      } else if (document.activeElement !== this.textbox && this.quill.hasFocus()) {        this.hide();      }    });  }  listen() {    super.listen();    this.root.querySelector('.ql-close').addEventListener('click', () => {      this.root.classList.remove('ql-editing');    });    this.quill.on(Emitter.events.SCROLL_OPTIMIZE, () => {      // Let selection be restored by toolbar handlers before repositioning      setTimeout(() => {        if (this.root.classList.contains('ql-hidden')) return;        let range = this.quill.getSelection();        if (range != null) {          this.position(this.quill.getBounds(range));        }      }, 1);    });  }  cancel() {    this.show();  }  position(reference) {    let shift = super.position(reference);    let arrow = this.root.querySelector('.ql-tooltip-arrow');    arrow.style.marginLeft = '';    if (shift === 0) return shift;    arrow.style.marginLeft = (-1*shift - arrow.offsetWidth/2) + 'px';  }}BubbleTooltip.TEMPLATE = [  '<span class="ql-tooltip-arrow"></span>',  '<div class="ql-tooltip-editor">',    '<input type="text" data-formula="e=mc^2" data-link="https://quilljs.com" data-video="Embed URL">',    '<a class="ql-close"></a>',  '</div>'].join('');export { BubbleTooltip, BubbleTheme as default };
 |