From bfad4465547caf72bdf0181d0f6b23ca59c4422f Mon Sep 17 00:00:00 2001 From: rattatwinko Date: Sun, 1 Mar 2026 16:12:11 +0100 Subject: [PATCH] buch of stuff; simple-captcha; mdtable; some more stuff --- bots/captcha.php | 111 ++++++++++++++++ bots/fonts/ComicRelief-Bold.ttf | Bin 0 -> 93304 bytes bots/fonts/readme.txt | 1 + bots/index.html | 29 +++++ bots/simple-captcha.js | 107 ++++++++++++++++ bots/validate.php | 22 ++++ elements/mdtable.js | 221 ++++++++++++++++++++++++++++++++ elements/pole.js | 160 +++++++++++++++++++++++ elements/styles/pole.css | 43 +++++++ examples/mdtable.html | 17 +++ examples/progressbar.html | 32 +++++ 11 files changed, 743 insertions(+) create mode 100644 bots/captcha.php create mode 100644 bots/fonts/ComicRelief-Bold.ttf create mode 100644 bots/fonts/readme.txt create mode 100644 bots/index.html create mode 100644 bots/simple-captcha.js create mode 100644 bots/validate.php create mode 100644 elements/mdtable.js create mode 100644 elements/pole.js create mode 100644 elements/styles/pole.css create mode 100644 examples/mdtable.html create mode 100644 examples/progressbar.html diff --git a/bots/captcha.php b/bots/captcha.php new file mode 100644 index 0000000..acf466c --- /dev/null +++ b/bots/captcha.php @@ -0,0 +1,111 @@ += 0 && $newX < $width && $newY >= 0 && $newY < $height) { + $color = imagecolorat($image, $newX, $newY); + imagesetpixel($distorted, $x, $y, $color); + } + } +} + +header("Content-Type: image/png"); +imagepng($distorted); +imagedestroy($image); // deprectated but who cares +imagedestroy($distorted); // also deprecated + + +/* + +MIT License + +Copyright (c) [2026] [rattatwinko] + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +?> diff --git a/bots/fonts/ComicRelief-Bold.ttf b/bots/fonts/ComicRelief-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7b862465bcfe7b30ac1cfea6d91c93505c49e3eb GIT binary patch literal 93304 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 + + + + + Captcha + + + +
+ + +
+ + + + diff --git a/bots/simple-captcha.js b/bots/simple-captcha.js new file mode 100644 index 0000000..5c09f02 --- /dev/null +++ b/bots/simple-captcha.js @@ -0,0 +1,107 @@ +class SimpleCaptcha extends HTMLElement { + constructor() { + super(); + this.attachShadow({ mode: "open" }); + } + + connectedCallback() { + this.render(); + } + + render() { + this.shadowRoot.innerHTML = ` + +
+ Captcha + + + +
+ `; + + const img = this.shadowRoot.getElementById("img"); + img.addEventListener("click", () => this.refresh()); + + this.shadowRoot.getElementById("refresh") + .addEventListener("click", () => this.refresh()); + + this.shadowRoot.getElementById("submit") + .addEventListener("click", () => this.handleSubmit()); + } + + refresh() { + const img = this.shadowRoot.getElementById("img"); + img.src = "captcha.php?" + Date.now(); + this.shadowRoot.getElementById("input").value = ""; + } + + async validate() { + const input = this.shadowRoot.getElementById("input").value.trim(); + if (!input) return false; + + const formData = new FormData(); + formData.append("captcha", input); + + try { + const res = await fetch("validate.php", { method: "POST", body: formData }); + const data = await res.json(); + + return data.status === "valid"; + } catch (err) { + console.error("Captcha validation failed:", err); + return false; + } + } + + async handleSubmit() { + const isValid = await this.validate(); + + if (isValid) { + this.dispatchEvent(new CustomEvent("valid")); + this.refresh(); + } else { + this.dispatchEvent(new CustomEvent("invalid")); + this.refresh(); + } + } +} + +customElements.define("simple-captcha", SimpleCaptcha); diff --git a/bots/validate.php b/bots/validate.php new file mode 100644 index 0000000..ca29420 --- /dev/null +++ b/bots/validate.php @@ -0,0 +1,22 @@ + "error"]); + exit; +} + +if (strcasecmp($input, $_SESSION["simple-captcha"]) === 0) { + unset($_SESSION["simple-captcha"]); + echo json_encode(["status" => "valid"]); +} else { + echo json_encode(["status" => "invalid"]); +} + +?> diff --git a/elements/mdtable.js b/elements/mdtable.js new file mode 100644 index 0000000..a7eeb6f --- /dev/null +++ b/elements/mdtable.js @@ -0,0 +1,221 @@ +/* + * mdtable.js - OSS tool for HTML5 Tables + * This Class creates a HTML Tag (md-table) which lets you define a Markdown Table INSIDE + * of your exsisting HTML, you do NOT need any external libraries as this is a vanilla javascript class. + * Example HTML at EOF! + * + * written by rattatwinko@26/02/26 (license: MIT) + */ +class MdTable extends HTMLElement { + constructor() { + super(); + const shadow = this.attachShadow({ mode: "open" }); + const style = document.createElement("style"); + style.textContent = MdTable.styles; + + this._wrapper = document.createElement("div"); + shadow.append(style, this._wrapper); + } + + static get observedAttributes() { + return ["caption"]; + } + + connectedCallback() { + this._render(); + } + + attributeChangedCallback() { + this._render(); + } + + _render() { + const raw = this.textContent.trim(); + if (!raw) return; + const parsed = this._parseMarkdown(raw); + if (!parsed) return; + const { headers, rows, aligns } = parsed; + const table = document.createElement("table"); + const captionText = this.getAttribute("caption"); + + if (captionText) { + const caption = document.createElement("caption"); + caption.textContent = captionText; + table.appendChild(caption); + } + + const thead = document.createElement("thead"); + const tbody = document.createElement("tbody"); + const trHead = document.createElement("tr"); + + headers.forEach((text, i) => { + const th = document.createElement("th"); + th.textContent = text; + th.dataset.align = aligns[i]; + + if (this.hasAttribute("sortable")) { + th.classList.add("sortable"); + th.addEventListener("click", () => { + this._sortTable(tbody, i); + }); + } + + trHead.appendChild(th); + }); + + thead.appendChild(trHead); + + // create table elements based on how many rows there are + rows.forEach(row => { + const tr = document.createElement("tr"); + + row.forEach((text, i) => { + const td = document.createElement("td"); + td.textContent = text; + td.dataset.align = aligns[i]; + tr.appendChild(td); + }); + + tbody.appendChild(tr); + }); + + table.append(thead, tbody); + + this._wrapper.replaceChildren(table); + } + + // parse table + _parseMarkdown(md) { + const lines = md + .split("\n") + .map(l => l.trim()) + .filter(Boolean); + + if (lines.length < 2) return null; + + const headers = lines[0] + .split("|") + .map(c => c.trim()) + .filter(Boolean); + + const alignRow = lines[1] + .split("|") + .map(c => c.trim()) + .filter(Boolean); + + const aligns = alignRow.map(a => { + if (a.startsWith(":") && a.endsWith(":")) return "center"; + if (a.endsWith(":")) return "right"; + if (a.startsWith(":")) return "left"; + return "left"; + }); + + const rows = lines.slice(2).map(line => + line.split("|") + .map(c => c.trim()) + .filter(Boolean) + ); + + return { headers, rows, aligns }; + } + + _sortTable(tbody, columnIndex) { + const rows = Array.from(tbody.querySelectorAll("tr")); + const isNumeric = rows.every(row => + !isNaN(parseFloat(row.children[columnIndex].textContent)) + ); + + const asc = this._lastSortCol !== columnIndex || !this._lastAsc; + this._lastSortCol = columnIndex; + this._lastAsc = asc; + + rows.sort((a, b) => { + let A = a.children[columnIndex].textContent; + let B = b.children[columnIndex].textContent; + + if (isNumeric) { + A = parseFloat(A); + B = parseFloat(B); + } + + return asc ? (A > B ? 1 : -1) : (A < B ? 1 : -1); + }); + + rows.forEach(r => tbody.appendChild(r)); + } + + static styles = ` + :host { + display: block; + font-family: sans-serif; + --border-color: #ccc; + --header-bg: #f5f5f5; + } + + table { + width: 100%; + border-collapse: collapse; + } + + caption { + caption-side: top; + padding: 6px 0; + font-weight: bold; + text-align: left; + } + + th, td { + border: 1px solid var(--border-color); + padding: 6px 10px; + } + + th { + background: var(--header-bg); + font-weight: 600; + } + + th[data-align="right"], + td[data-align="right"] { + text-align: right; + } + + th[data-align="center"], + td[data-align="center"] { + text-align: center; + } + + th.sortable { + cursor: pointer; + } + `; +} + +// define +customElements.define("md-table", MdTable); + +/* Example HTML: + + + + + + html5 mdtable + + + + + | Name | Age | Score | + |:-----|----:|:----:| + | Anna | 22 | 90 | + | Max | 30 | 85 | + + + +*//* +License (MIT): + +Copyright (c) 2026 rattatwinko +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ diff --git a/elements/pole.js b/elements/pole.js new file mode 100644 index 0000000..b673df7 --- /dev/null +++ b/elements/pole.js @@ -0,0 +1,160 @@ +/* + * pole-js - OSS tool for HTML5 Loading Bars + * HTML5-Tags created by This Project are: , + * This Class does NOT rely on any EXTERNAL dependencies. + * Example Script for Incrementing Pole is at EOF! + * written by rattatwinko@25/02/26 for https://rattatwinko.servecounterstrike.com + * + */ +class Pole extends HTMLElement { + constructor() { + super(); + const shadow = this.attachShadow({ mode: "open" }); + const style = document.createElement("style"); + const container = document.createElement("div"); + const valueBar = document.createElement("div"); + const labelDark = document.createElement("span"); + const labelLight = document.createElement("span"); + style.textContent = Pole.styles; + container.classList.add("container"); + valueBar.classList.add("valueBar"); + labelDark.classList.add("label", "label-dark"); + labelLight.classList.add("label", "label-light"); + container.appendChild(valueBar); + container.appendChild(labelDark); + container.appendChild(labelLight); + valueBar.appendChild(labelLight.cloneNode()); + shadow.append(style, container); + this._valueBar = valueBar; + this._labelDark = labelDark; + this._labelLight = labelLight; + this._manualLabel = null; + this._updateLabel(); + } + + attributeChangedCallback(name, oldValue, newValue) { + if (name === "value") { + const val = Math.min(100, Math.max(0, Number(newValue))); + this._valueBar.style.width = val + "%"; + this._labelLight.style.clipPath = `inset(0 0 0 0)`; + this._updateLabel(); + if (val >= 100) { this._valueBar.classList.add("complete"); } + else { this._valueBar.classList.remove("complete"); } + } + if (name === "unit") { this._updateLabel(); } + } + + _updateLabel() { + if (!this._labelDark || !this._labelLight) return; + const text = this._manualLabel !== null + ? this._manualLabel + : this.value + (this.getAttribute("unit") ?? "%"); + this._labelDark.textContent = text; + this._labelLight.textContent = text; + } + + get label() { return this._manualLabel ?? null; } + set label(val) { + this._manualLabel = val === null ? null : String(val); + this._updateLabel(); + } + + get value() { return Number(this.getAttribute("value")) || 0; } + set value(val) { this.setAttribute("value", val); } + + get unit() { return this.getAttribute("unit") ?? "%"; } + set unit(val) { this.setAttribute("unit", val); } + + static get observedAttributes() { return ["value", "unit"]; } + static styles = ` + /* pole-js stylesheet ; variable definitions: --bar-color ; --background-color ; --height (you can define this, but it wont look good); --width */ + :host { display: inline-block; --bar-color: blue; --background-color: #ddd; --width: 300px; --height: 25px; } + .container { + width: var(--width); + height: var(--height); + background: var(--background-color); + border-radius: 4px; + overflow: hidden; + position: relative; + } + .valueBar { + width: 0%; + height: 100%; + background-color: var(--bar-color); + background-image: linear-gradient( + 45deg, + rgba(255,255,255,0.3) 25%, + rgba(255,255,255,0) 25%, + rgba(255,255,255,0) 50%, + rgba(255,255,255,0.3) 50%, + rgba(255,255,255,0.3) 75%, + rgba(255,255,255,0) 75%, + rgba(255,255,255,0) 100% + ); + background-size: 40px 40px; + animation: pole-js 1s linear infinite; + transition: width 0.3s ease; + } + .valueBar.complete { animation: none; } + + .label { + position: absolute; + top: 0; left: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + font-size: calc(var(--height) * 0.55); + font-family: sans-serif; + font-weight: bold; + white-space: nowrap; + pointer-events: none; + user-select: none; + } + + .label-dark { color: #333; text-shadow: 1px 1px 2px #000000; } + .label-light { text-shadow: 1px 1px 2px #000000; color: white; text-shadow: 0 1px 2px rgba(0,0,0,0.3); clip-path: inset(0 100% 0 0); transition: clip-path 0.3s ease; } + + @keyframes pole-js { + from { background-position: 0 0; } + to { background-position: 40px 0; } + } + `; +} +class ProgressBar extends Pole {/* for ease of use */} +customElements.define("pole-js", Pole); +customElements.define("progress-bar", ProgressBar); + +/* Example Script: + + + + + + HTML:5 ProgressBar.js Test + + + + + + + + +*//* +License (MIT): + +Copyright (c) 2026 rattatwinko +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ diff --git a/elements/styles/pole.css b/elements/styles/pole.css new file mode 100644 index 0000000..426ab70 --- /dev/null +++ b/elements/styles/pole.css @@ -0,0 +1,43 @@ +:host { + display: inline-block; + --bar-color: red; +} + +.container { + width: 300px; + height: 25px; + background: #ddd; + border-radius: 4px; + overflow: hidden; + position: relative; +} + +.valueBar { + width: 0%; + height: 100%; + background-color: var(--bar-color); + + background-image: linear-gradient( + 45deg, + rgba(255,255,255,0.3) 25%, + rgba(255,255,255,0) 25%, + rgba(255,255,255,0) 50%, + rgba(255,255,255,0.3) 50%, + rgba(255,255,255,0.3) 75%, + rgba(255,255,255,0) 75%, + rgba(255,255,255,0) 100% + ); + + background-size: 40px 40px; + animation: barberpole 1s linear infinite; + transition: width 0.3s ease; +} + +.valueBar.complete { + animation: none; +} + +@keyframes barberpole { + from { background-position: 0 0; } + to { background-position: 40px 0; } +} diff --git a/examples/mdtable.html b/examples/mdtable.html new file mode 100644 index 0000000..eb5a699 --- /dev/null +++ b/examples/mdtable.html @@ -0,0 +1,17 @@ + + + + + + html5 mdtable + + + + + | Name | Age | Score | + |:-----|----:|:----:| + | Anna | 22 | 90 | + | Max | 30 | 85 | + + + diff --git a/examples/progressbar.html b/examples/progressbar.html new file mode 100644 index 0000000..d0f91cd --- /dev/null +++ b/examples/progressbar.html @@ -0,0 +1,32 @@ + + + + + + HTML:5 ProgressBar.js Test + + + +

HTML:5 progressbar.js script test

+ + + + + + + +