diff --git a/src/frontend/content_script/custom_elements.ts b/src/frontend/content_script/custom_elements.ts index 44dbfcc..0d647ad 100644 --- a/src/frontend/content_script/custom_elements.ts +++ b/src/frontend/content_script/custom_elements.ts @@ -1,25 +1,32 @@ import { Communicator } from "../../communication"; -import contents from "./spinner.scss?raw"; +import spinnerCSS from "./spinner.scss?raw"; +import translationCSS from "./translation.scss?raw"; class LingoTranslate extends HTMLElement { + loadingElm: LingoLoading; + translationElm: LingoTranslation; constructor() { super(); this.attachShadow({ mode: "open" }); + this.shadowRoot.innerHTML = ` `; + this.loadingElm = this.shadowRoot.querySelector("lingo-loading"); + this.translationElm = this.shadowRoot.querySelector("lingo-translation"); } render = () => { - this.shadowRoot.innerHTML = ""; + this.loadingElm.hidden = false; + this.translationElm.hidden = true; + const toTranslate = this.getAttribute("translate"); if (toTranslate) { const translation = Communicator.translate(toTranslate); translation.then((t: Translation) => { if (t.src == this.getAttribute("translate")) { - this.shadowRoot.innerHTML = ""; + this.loadingElm.hidden = true; + this.translationElm.hidden = false; - let translationElement = document.createElement("lingo-translation"); - translationElement.setAttribute("src", t.src); - translationElement.setAttribute("translation", t.result); - this.shadowRoot.appendChild(translationElement); + this.translationElm.setAttribute("src", t.src); + this.translationElm.setAttribute("translation", t.result); this.dispatchEvent(new Event("translationFinished")); } }); @@ -44,7 +51,7 @@ class LingoLoading extends HTMLElement { spinner.id = "spinner"; const style = document.createElement("style"); - style.textContent = contents; + style.textContent = spinnerCSS; shadow.appendChild(style); shadow.appendChild(spinner); } @@ -57,21 +64,29 @@ class LingoTranslation extends HTMLElement { addToCollection: HTMLButtonElement; constructor() { super(); - const shadow = this.attachShadow({ mode: "open" }); + this.attachShadow({ mode: "open" }); - this.translateElm = document.createElement("span"); - this.srcElm = document.createElement("span"); - this.addToCollection = document.createElement("button"); + let style = document.createElement("style"); + style.textContent = translationCSS; + this.shadowRoot.appendChild(style); + + this.shadowRoot.innerHTML = ` +
+ - +
+ + `; + + this.srcElm = this.shadowRoot.querySelector("#src"); + this.translateElm = this.shadowRoot.querySelector("#translated"); + + this.addToCollection = this.shadowRoot.querySelector("button"); this.addToCollection.addEventListener("click", () => Communicator.addFlashcard({ src: this.getAttribute("src"), result: this.getAttribute("translation"), }) ); - - shadow.appendChild(this.translateElm); - shadow.appendChild(this.srcElm); - shadow.appendChild(this.addToCollection); } render = () => { diff --git a/src/frontend/content_script/translation.scss b/src/frontend/content_script/translation.scss new file mode 100644 index 0000000..4d0481f --- /dev/null +++ b/src/frontend/content_script/translation.scss @@ -0,0 +1,4 @@ +lingo-translation { + display: flex; + width: 100%; +}