import {EditorContainerUiElement, EditorUiElement} from "./core";
-import {el} from "../../helpers";
+
+import {el} from "../../utils/dom";
export type EditorContextToolbarDefinition = {
selector: string;
export class EditorContextToolbar extends EditorContainerUiElement {
+ protected target: HTMLElement;
+
+ constructor(target: HTMLElement, children: EditorUiElement[]) {
+ super(children);
+ this.target = target;
+ }
+
protected buildDOM(): HTMLElement {
return el('div', {
class: 'editor-context-toolbar',
}, this.getChildren().map(child => child.getDOMElement()));
}
- attachTo(target: HTMLElement) {
- const targetBounds = target.getBoundingClientRect();
+ updatePosition() {
+ const editorBounds = this.getContext().scrollDOM.getBoundingClientRect();
+ const targetBounds = this.target.getBoundingClientRect();
const dom = this.getDOMElement();
const domBounds = dom.getBoundingClientRect();
+ const showing = targetBounds.bottom > editorBounds.top
+ && targetBounds.top < editorBounds.bottom;
+
+ dom.hidden = !showing;
+
+ if (!this.target.isConnected) {
+ // If our target is no longer in the DOM, tell the manager an update is needed.
+ this.getContext().manager.triggerFutureStateRefresh();
+ return;
+ } else if (!showing) {
+ return;
+ }
+
+ const showAbove: boolean = targetBounds.bottom + 6 + domBounds.height > editorBounds.bottom;
+ dom.classList.toggle('is-above', showAbove);
+
const targetMid = targetBounds.left + (targetBounds.width / 2);
const targetLeft = targetMid - (domBounds.width / 2);
- dom.style.top = (targetBounds.bottom + 6) + 'px';
+ if (showAbove) {
+ dom.style.top = (targetBounds.top - 6 - domBounds.height) + 'px';
+ } else {
+ dom.style.top = (targetBounds.bottom + 6) + 'px';
+ }
dom.style.left = targetLeft + 'px';
}
dom.append(...children.map(child => child.getDOMElement()));
}
- empty() {
+ protected empty() {
const children = this.getChildren();
for (const child of children) {
child.getDOMElement().remove();
}
this.removeChildren(...children);
}
+
+ destroy() {
+ this.empty();
+ this.getDOMElement().remove();
+ }
}
\ No newline at end of file