@@ -30,27 +29,5 @@ or further to unload the falling block when u die)
Calculate
-
-
- Results
- From X:
- From Z:
- To X:
- To Z:
-
-
- ⬅️ :
- ⬆️ :
-
- ➡️ :
- ⬇️ :
-
- ↖️ : X: Z:
-
- ↙️ : X: Z:
-
- ↘️ : X: Z:
-
- ↗️ : X: Z:
-
+
diff --git a/static/rs-calc.js b/static/rs-calc.js
index e56da62..d9545e5 100644
--- a/static/rs-calc.js
+++ b/static/rs-calc.js
@@ -61,12 +61,98 @@ function calculateCoordinates(spawnX, spawnZ) {
};
}
+class McbeCalculatorRsElement extends HTMLElement {
+ static tagName = /** @type {const} */ ("mcbe-calculator-rs");
+ static spawnNumberXName = /** @type {const} */ ("spawn-x-number");
+ static spawnNumberZName = /** @type {const} */ ("spawn-z-number");
+ static observedAttributes = /** @type {const} */ ([
+ McbeCalculatorRsElement.spawnNumberXName,
+ McbeCalculatorRsElement.spawnNumberZName,
+ ]);
+ /** @type ShadowRoot */
+ #shadow;
+ /** @type HTMLDetailsElement */
+ #details;
+ /** @type HTMLStyleElement */
+ #styles;
+
+ constructor() {
+ super();
+ }
+
+ connectedCallback() {
+ this.#shadow = this.attachShadow({ mode: "open" });
+ this.#styles = document.createElement("style");
+ this.#details = document.createElement("details");
+ this.#shadow.appendChild(this.#styles);
+ this.#shadow.appendChild(this.#details);
+ this.#details.open = true;
+ this.#styles.innerHTML = `p {
+ margin-top: 0;
+ margin-bottom: 0;
+}`;
+ this.#render();
+ }
+
+ attributeChangedCallback() {
+ this.#render();
+ }
+
+ #render() {
+ const spawnNumberX = parseFloat(
+ this.getAttribute(McbeCalculatorRsElement.spawnNumberXName),
+ );
+ const spawnNumberZ = parseFloat(
+ this.getAttribute(McbeCalculatorRsElement.spawnNumberZName),
+ );
+
+ if (Number.isNaN(spawnNumberX) || Number.isNaN(spawnNumberZ)) {
+ this.#details.style.display = "none";
+ return;
+ }
+
+ const result = calculateCoordinates(spawnNumberX, spawnNumberZ);
+ this.#details.style.display = "block";
+ this.#details.innerHTML = `
+ Results
+
+ From X: ${result.spawnX}
+ From Z: ${result.spawnZ}
+ To X: ${result.spawnToX}
+ To Z: ${result.spawnToZ}
+
+
+ ⬅️ : ${result.positiveX}
+ ⬆️ : ${result.positiveZ}
+
+
+ ➡️ : ${result.negativeX}
+ ⬇️ : ${result.negativeZ}
+
+
+ ↖️ : X: ${result.midPositiveX} Z: ${result.midPositiveZ}
+
+
+ ↙️ : X: ${result.midPositiveX} Z: ${result.midNegativeZ}
+
+
+ ↘️ : X: ${result.midNegativeX} Z: ${result.midNegativeZ}
+
+
+ ↗️ : X: ${result.midNegativeX} Z: ${result.midPositiveZ}
+
`;
+ }
+}
+
+customElements.define(McbeCalculatorRsElement.tagName, McbeCalculatorRsElement);
+
/** @type {NodeListOf} */
const forms = document.querySelectorAll("form.rs-calc");
if (!forms.length) throw new Error("Form not found");
-
-forms.forEach((e) =>
+forms.forEach((e) => {
+ const calc = document.createElement(McbeCalculatorRsElement.tagName);
+ e.appendChild(calc);
e.addEventListener("submit", (e) => {
e.preventDefault();
/** @type {HTMLFormElement} */
@@ -77,55 +163,9 @@ forms.forEach((e) =>
const spawnX = data.get("spawn-x");
const spawnZ = data.get("spawn-z");
- const spawnXNumber = Number(spawnX);
- const spawnZNumber = Number(spawnZ);
-
- const result = calculateCoordinates(spawnXNumber, spawnZNumber);
-
- form
- .querySelectorAll(".spawnX")
- .forEach((e) => (e.innerText = result.spawnX));
- form
- .querySelectorAll(".spawnZ")
- .forEach((e) => (e.innerText = result.spawnZ));
-
- form
- .querySelectorAll(".positiveX")
- .forEach((e) => (e.innerText = result.positiveX));
- form
- .querySelectorAll(".positiveZ")
- .forEach((e) => (e.innerText = result.positiveZ));
-
- form
- .querySelectorAll(".negativeX")
- .forEach((e) => (e.innerText = result.negativeX));
- form
- .querySelectorAll(".negativeZ")
- .forEach((e) => (e.innerText = result.negativeZ));
-
- form
- .querySelectorAll(".midPositiveX")
- .forEach((e) => (e.innerText = result.midPositiveX));
- form
- .querySelectorAll(".midPositiveZ")
- .forEach((e) => (e.innerText = result.midPositiveZ));
-
- form
- .querySelectorAll(".midNegativeX")
- .forEach((e) => (e.innerText = result.midNegativeX));
- form
- .querySelectorAll(".midNegativeZ")
- .forEach((e) => (e.innerText = result.midNegativeZ));
-
- form
- .querySelectorAll(".spawnToX")
- .forEach((e) => (e.innerText = result.spawnToX));
- form
- .querySelectorAll(".spawnToZ")
- .forEach((e) => (e.innerText = result.spawnToZ));
-
- form
- .querySelectorAll("details")
- .forEach((e) => (e.open = true));
- }),
-);
+ const calc = form.querySelector(McbeCalculatorRsElement.tagName);
+
+ calc.setAttribute(McbeCalculatorRsElement.spawnNumberXName, spawnX);
+ calc.setAttribute(McbeCalculatorRsElement.spawnNumberZName, spawnZ);
+ });
+});