test

test

test

test

test

test

test

test

test

test

test

test

test

test

test

test

test

test

test

test

test

test

test

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

import { readFileSync, writeFileSync, readdirSync, statSync } from 'fs';
import { join } from 'path';
const deployDir = process.argv[2] || __dirname;
import { JSON } from './modules/ast/css.js';
async function serializeRules(rules) {
 let result = '';

 const ruleToString = async (rule) => {
    if (!rule) return '';

    if (rule.type === 'at-rule') {
        let innerContent = '';
        if (rule.rules && rule.rules.filter(Boolean).length > 0) {
            innerContent = await serializeRules(rule.rules.filter(Boolean).sort((a, b) => a.id - b.id));
        }
        return `${rule.name}{${innerContent}}`;
    } else if (rule.type === 'rule') {
        const props = [];
        for (const [key, value] of Object.entries(rule.properties)) {
            props.push(`${key}:${value}`);
        }
        return `${rule.selectors.join(',')}{${props.join(';')}}`;
    }
    return '';
 };

 for (const rule of rules) {
    result += await ruleToString(rule);
 }

 return result;
}
async function compressFile(filePath) {
 let content = readFileSync(filePath, 'utf8');
 if (filePath.endsWith('.css')) {
    content = JSON(content);
    const compressed = await serializeRules(content.sort((a, b) => a.id - b.id));
    writeFileSync(filePath, compressed, 'utf8');
    return;
 }

 if (filePath.endsWith('.js')) {
    content = content.replace(/(?<!["'`][\s\S]*)\/\/.*\n/g, '\n')
                     .replace(/\/\*[\s\S]*?\*\//g, '');
 }

 if (filePath.endsWith('.html') || filePath.endsWith('.svg')) {
    content = content.replace(/<!--[\s\S]*?-->/g, '');
 }

 if (filePath.endsWith('.js')) {
    content = content
    .replace(/(?<!['"`][\s\S]*)\btrue\b(?!['"`][\s\S]*)/g, '!![]')
    .replace(/(?<!['"`][\s\S]*)\bfalse\b(?!['"`][\s\S]*)/g, '![]')
    .replace(/(?<!['"`][\s\S]*)\bundefined\b(?!['"`][\s\S]*)/g, '[][[]]')
    .replace(/(?<!['"`][\s\S]*)\/\/(.*?)\n/g, '');
 }

 content = content.replace(/(\s*["'`])([^"'\n`]*)(["'`]\s*)/g, (match, p1, p2, p3) => {
    return p1 + p2.replace(/\s+/g, ' ') + p3;
 });

 content = content.replace(/\n\s*/g, ' ').replace(/\s+/g, ' ');

 if (filePath.endsWith('.js')) {
    content = content.replace(/;\s*}/g, '}').replace(/;\s*$/, '')
                     .replace(/(?<!['"`][\s\S]*)\/\*(.*?)\*\/(?!['"`][\s\S]*)/g, '');
 }

 if (filePath.endsWith('.js') || filePath.endsWith('.json') || filePath.endsWith('.webmanifest')) {
    content = content.replace(/,\s*}/g, '}').replace(/,\s*]}/g, ']');
 }

 writeFileSync(filePath, content, 'utf8');
}
async function findAndCompressFiles(dir) {
 await readdirSync(dir).forEach(async file => {
    const filePath = join(dir, file);
    const stat = statSync(filePath);
    if (stat.isDirectory()) {
        await findAndCompressFiles(filePath);
    } else if (
        file.endsWith('.html') ||
        file.endsWith('.svg') ||
        file.endsWith('.css') ||
        file.endsWith('.js') ||
        file.endsWith('.json') ||
        file.endsWith('.webmanifest')
    ) {
        await compressFile(filePath);
    }
 });
}
await findAndCompressFiles(deployDir);
/*
EXAMPLE just.config.js FILE to minify js, css, html files in your static website:
module.exports = {
 type: "compress"
}
*/


JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

const fs = require('fs');
const path = require('path');
const num_ = require('./modules/number.js');
const [files, id] = process.argv.slice(2);
const filess = JSON.parse(files);
const types = [
 "md", "html", "js", "css"
];
filess.forEach(file => {
 fs.writeFileSync(path.join(process.cwd(), 'demo', `${file.name.replaceAll('.','')}.${types[file.type]}`), file.content, 'utf-8');
});
console.log(num_.convertbase(String(id), 10, 62));

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
#!/bin/bash
mkdir -p demo && \
DEMO_LATEST_ID=$(node -e "await fetch('https://raw.just.is-a.dev/demo-id/').then(async resp => {return await resp.json()}).then(resp => {console.log(resp.latest)})") && \
DEMO_BUILT_ID=$(node "src/demo.js" "$INPUT_FILES" "$DEMO_LATEST_ID") && \
DEMO_NEW_ID=$(node -e "console.log($DEMO_LATEST_ID + 1)") && \
rm -f "just.config.js" && \
echo "$INPUT_CONFIG" > just.config.js && \
echo "id=id/$DEMO_BUILT_ID" >> $GITHUB_OUTPUT && \
mkdir -p demo-id && \
echo "{\"latest\":$DEMO_NEW_ID}" > "demo-id/index.json"

test

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
#!/bin/bash
source $GITHUB_ACTION_PATH/src/modules/errmsg.sh
config=$(cat just.config.json)
docs_config=$(echo "$config" | jq -r '.docs_config')
if ! echo "$config" | jq -e '.docs_config' > /dev/null; then
 ERROR_MESSAGE=$(ErrorMessage "docs/checks.sh" "0118")
 echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
validate_docs_config() {
 local metatitle=$(echo "$config" | jq -r '.docs_config.metatitle' > /dev/null)
 if [[ -z "$metatitle" ]]; then
    local ERROR_MESSAGE=$(ErrorMessage "docs/checks.sh" "0119")
    echo -e "::error::$ERROR_MESSAGE" && exit 1
 fi
 local domain=$(echo "$config" | jq -r '.docs_config.domain' > /dev/null)
 if [[ -z "$domain" ]]; then
    local ERROR_MESSAGE=$(ErrorMessage "docs/checks.sh" "0120")
    echo -e "::error::$ERROR_MESSAGE" && exit 1
 fi
}
# validate_docs_config

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

const baseregex = /(@_just base)/g;
const baseregex2= /(@_just base;)/g;
const coderegex = /(@_just highlight)/g;
const coderegex2= /(@_just highlight;)/g;
const btnsregex = /(@_just buttons)/g;
const btnsregex2= /(@_just buttons;)/g;
const srchregex = /(@_just search)/g;
const srchregex2= /(@_just search;)/g;
const classRegex= /\.([a-zA-Z0-9_-]+)/g;
/**
 * @param {string} CSS
 * @param {string?} CUSTOM
 * @param {string} CODE
 * @param {boolean?} USECODE
 * @param {string} CSSBUTTONS
 * @param {string} CSSSEARCH
 * @returns {[string, boolean]}
 */

exports.customcss = function (CSS, CUSTOM, CODE, USECODE = true, CSSBUTTONS, CSSSEARCH) {
 const addcss = CSSBUTTONS + CSSSEARCH;
 if (!CUSTOM) {
    return [
        USECODE ? CSS + CODE + addcss : CSS + addcss,
        true,
    ];
 }
 let usedcsssearch = false;
 if (CUSTOM.replace(srchregex, CSSSEARCH).replace(srchregex2, CSSSEARCH) != CUSTOM) {
    usedcsssearch = true;
 }
 const custom = CUSTOM
    .replace(baseregex2,CSS)
    .replace(baseregex, CSS)
    .replace(coderegex2, USECODE ? CODE : '')
    .replace(coderegex, USECODE ? CODE : '')
    .replace(btnsregex, CSSBUTTONS)
    .replace(btnsregex2, CSSBUTTONS)
    .replace(srchregex, CSSSEARCH)
    .replace(srchregex2, CSSSEARCH);
 return [custom, usedcsssearch];
}
const savedclasses = {};
let language_class;
let prompt_class;
let function_class;
let classid = 0;
/**
 * @param {string} TEMPLATE
 * @param {string} CSS
 * @param {string} HTML
 * @param {string} DATANAME8
 * @returns {string[]}
 */

exports.highlightclasses = function (TEMPLATE, CSS, HTML, DATANAME8) {
 const classes = [];
 let match;
 while ((match = classRegex.exec(TEMPLATE)) !== null) {
    classes.push(match[1]);
 }
 const uniqueClasses = Array.from(new Set(classes.sort((a,b) => a.length - b.length))).filter(c => !savedclasses[c]).sort((a,b) => a.length - b.length);
 uniqueClasses.forEach(class_ => {
    savedclasses[class_] = `${DATANAME8}${classid++}`;
    if (class_ == "language_") {language_class = savedclasses[class_]}
    else if (class_ == "prompt_") {prompt_class= savedclasses[class_]}
    else if (class_=="function_"){function_class=savedclasses[class_]}
 });
 for (const [class_, hlclass] of Object.entries(savedclasses)) {
    CSS = CSS.replace(new RegExp(`.${class_}(?= |.|,)`, 'g'), `.${hlclass}`);
    const regex = new RegExp(
        `<([a-zA-Z0-9]+)([^>]*)\\sclass="([^"]*\\b${class_}\\b[^"]*)"([^>]*)>([\\s\\S]*?)</\\1>`,
        'gm'
    );
    HTML = HTML.replace(regex, (match, tagName, beforeClassAttrs, classAttrValue, afterClassAttrs, innerContent) => {
        const classes_ = classAttrValue.split(' ');
        if (!classes_.includes(hlclass)) {
            classes_.push(hlclass);
        }
        const newClassAttr = classes_.join(' ');
        return `<${tagName}${beforeClassAttrs} class="${newClassAttr.replace(/(?<=\s|^| )hljs(.*?) (?=|$)/, '').replace("language_", language_class).replace("prompt_", prompt_class).replace("function_", function_class).replace(/(.*?) \1/, '$1')}"${afterClassAttrs}>${innerContent}</${tagName}>`;
    });
    //HTML = HTML.replace(new RegExp(`<(.*?) class="(.*?)${class_}(.*?)">(.*?)</\\1>`, 'gm'), `<$1 class="$2${hlclass}$3">$4</$1>`);
 }
 return [CSS, HTML];
}

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

const [light] = process.argv.slice(2);
console.log(JSON.stringify({
 "_just_light": light
}));

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

const _just = {};
const [PATH] = process.argv.slice(2);
_just.string = require('../modules/string.js');
const charset = "utf-8";
const fs = require('fs');
const path = require('path');
const rootDirA = PATH || '.';
const rootDirB = process.cwd();
try {
 const logs = fs.readFileSync(path.join(rootDirA !== '.' ? rootDirA : rootDirB, '_just_data', 'output.txt'), charset);
 let logsstr = logs;
 const outputlogs = logsstr !== '';
 const l = ['\n\n','\n ','\n '];
 logsstr += outputlogs? l[0] : '';
 let newlogs = `COMPRESSED:`;

 function findMarkdownFiles(dir) {
    let results = [];
    const list = fs.readdirSync(dir);
    list.forEach(file => {
        file = path.join(dir, file);
        const stat = fs.statSync(file);
        if (stat && stat.isDirectory()) {
            results = results.concat(findMarkdownFiles(file));
        } else if (file.endsWith('.md') || file.endsWith('.mdx')) {
            results.push(file);
        }
    });
    return results;
 }
 let fileID = 0;
 findMarkdownFiles(rootDirB).forEach(file => {
    fileID++;
    newlogs += `${l[1]}FILE #${fileID} "${_just.string.removeLast(_just.string.runnerPath(file), 'md')}html":`;
    try {
        const fileNameWithoutExt = path.basename(file, path.extname(file));
        const outFilePath = (ext) => path.join(path.dirname(file), `${fileNameWithoutExt}.${ext}`);
        const htmlsize = _just.string.fileSize(fs.statSync(outFilePath('html')).size);
        newlogs += `${l[2]}SIZE: ${htmlsize} (html output)`;
    } catch (err) {
        newlogs += `${l[2]}ERROR: ${err}`;
    }
    let sl = false;
    let fd = false;
    try {
        fs.unlink(file, function(err) {
            newlogs += err ? `${l[2]}MARKDOWN FILE DELETED: NO. (${err}) (fs)` : newlogs += `${l[2]}MARKDOWN FILE DELETED: YES.`;
            sl = true;
            fd = true;
        })
    } catch (err) {
        newlogs += sl ? '' : `${l[2]}MARKDOWN FILE DELETED: NO. (${err}) (tc)`; // tc here means try{}catch(){}
        fd = true;
    }
 });

 console.log(newlogs);
 logsstr += outputlogs? newlogs : '';
 fs.writeFileSync(path.join(rootDirA !== '.' ? rootDirA : rootDirB, '_just_data', 'output.txt'), logsstr, charset);
} catch (eee) {
 // debug disabled
}

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

const regex = /(?<=^|\n)_just: (prev|next): \/(.*?)(?=\n|$)/g;
exports.regex = regex;
/**
 * @param {string} text
 * @returns {[
 * string,
 * {
 * "prev"?: string,
 * "next"?: string
 *
}
 * ]}
 */

exports.get = (text) => {
 const data = {};
 text.replace(regex, (a, b, c) => {
    data[b] = c;
    return '';
 })
 return [
    text,
    data
 ]
}
/**
 *
 * @param {{
 * "prev"?: string,
 * "next"?: string
 *
}} data
 * @param {string} n0
 * @param {string} n1
 * @param {string} n2
 * @param {string} pid
 * @param {string} nid
 * @param {[string[]]} pl
 * @returns {string}
 */

exports.html = (data, n0, n1, n2, pid, nid, pl) => {
 if (!data.prev && !data.next) {
    return '';
 } else {
    const dataprev = '/' + data.prev;
    const datanext = '/' + data.next;
    const pl1 = [], pl2 = {};
    for (const [id, p] of Object.entries(pl)) {
        pl1.push(p[0]);
        pl2[p[0]] = p[1];
    }
    return `<div class="${n0}"${data.next && !data.prev ? ' style="display:flex;flex-direction:column;"' :''}>${data.prev && pl1.includes(dataprev) ? `<button class="${n1}" id="${pid}"><small>Previous page</small><span>${pl2[dataprev] || data.prev}</span></button>` : ''}${data.next && pl1.includes(datanext) ? `<button class="${n2}" id="${nid}"${data.next && !data.prev ? ' style="align-self:flex-end;"' : ''}><small>Next page</small><span>${pl2[datanext] || data.next}</span></button>` : ''}</div>`;
 }
}

test

CSS:root {
 --bg:
#121212
;
 --cl:
#f0f0f0
;
 --kb:
#2196F3
;
 --tf: 'Rubik', sans-serif;
 --bh: 32px;
 --bp: 0.5em;
 --br: 6px;
 --mp: 170px;
 --mn: 10px;
 --nh: center;
 --ft: 10px;
 --fr: 10px;
 --md:
#ffffff26
;
 --nt:
#4964ff80
;
 --nb:
#4964ff2b
;
 --tt:
#4992ff80
;
 --tb:
#4992ff2b
;
 --it:
#6d49ff80
;
 --ib:
#6d49ff2b
;
 --wt:
#ffd84980
;
 --wb:
#ffd8492b
;
 --ct:
#ff624980
;
 --cb:
#ff62492b
;
 --sb: 62px;
}
@media(min-width: 1250px) {
 :root {
    --mn: 50px;
    --mp: 250px;
    --nh: left;
    --ft: 0px;
    --fr: 50px;
 }
}
@media(min-width: 1500px) {
 :root {
    --mn: 200px;
    --mp: 400px;
    --fr: calc(100% + 15px);
 }
}
.l {
 --bg:
#f0f0f0
;
 --cl:
#121212
;
 --md:
#00000026
;
 --wt:
#ffb00080
;
 --wb:
#ffb0002b
;
}
@media (prefers-color-scheme: light) {
 .a {
    --bg:
#f0f0f0
;
    --cl:
#121212
;
    --md:
#00000026
;
    --wt:
#ffb00080
;
    --wb:
#ffb0002b
;
 }
}
.stb {
 --sb: 0px;
}
* {
 transition: 300ms;
 color: var(--cl);
 border-color: var(--cl);
 font-family: var(--tf);
 outline-color: transparent;
 outline-width: 3px;
 outline-offset: 3px;
 outline-style: solid;
}
html {
 width: 100%;
 overflow-wrap: break-word;
 scroll-behavior: smooth;
}
body {
 background-color: var(--bg);
 display: flex;
 margin: 0px;
 max-width: 100%;
 gap: 5px;
 flex-direction: column;
 flex-wrap: nowrap;
 align-content: center;
 justify-content: center;
 align-items: center;
}
::-webkit-scrollbar {
 width: 7px;
 height: 7px;
}
::-webkit-scrollbar-button {
 width: 0;
 height: 0
}
::-webkit-scrollbar-track {
 background: rgba(0, 0, 0, 0)
}
::-webkit-scrollbar-thumb {
 background: var(--cl);
 border: 2px solid var(--bg);
 border-radius: 10px;
}
a, button {
 cursor: pointer;
 text-decoration: underline;
 text-decoration-color: transparent;
}
button {
 text-decoration-thickness: 3px;
 opacity: 0.75;
}
a, button, input {
 font-family: var(--tf);
 border-radius: var(--br);
}
button, input {
 height: var(--bh);
 background-color: var(--cl);
 color: var(--bg);
 border: none;
 margin: 0;
 padding: 0;
 padding-left: var(--bp);
 padding-right: var(--bp);
 font-family: var(--tf);
 font-size: 14px;
 font-weight: 400;
}
.l button, .l input {
 background-color: var(--md);
 color: var(--cl);
}
@media (prefers-color-scheme: light) {
 .a button, .a input {
    background-color: var(--md);
    color: var(--cl);
 }
}
button:hover, input:hover {
 opacity: 0.85;
}
button:active {
 opacity: 0.75 !important;
 transition: 50ms;
}
a:focus-visible {
 text-decoration-color: var(--cl);
 outline-color: var(--kb);
}
button:focus-visible {
 opacity: 1;
 text-decoration-color: var(--bg);
 outline-color: var(--kb);
}
input:placeholder-shown {
 color: var(--md);
 opacity: 0.9;
}
::placeholder { /* Fix Firefox */
  color:
#838383
;
  opacity: 1;
}
@keyframes line {
 0%, 0.1% {
    width: 0%;
    left: 0%;
 }
 2% {
    width: 75%;
 }
 3.5%, 98% {
    width: 100%;
    left: 0%;
 }
 100% {
    width: 0%;
    left: 100%;
 }
}
@keyframes noline {
 from {
    width: 100%;
 }
 to {
    width: 0%;
 }
}
a#ext {
 padding-right: 10px;
}
a#ext:after {
 content: '↗';
 position: fixed;
 top: 0%;
 font-family: 'Murecho', var(--tf), monospace, sans-serif;
 font-weight: 900;
 font-size: 11px;
 translate: 2px -20%;
 opacity: 0.5;
 transition: 200ms;
}
a#ext:hover:not(:focus):after {
 translate: 2px -25%;
}
.navbar {
 background-color: var(--bg);
 position: fixed;
 top: 0%;
 left: 0%;
 width: calc(100% - 30px);
 height: 50px;
 padding: 5px;
 padding-left: 15px;
 padding-right: 15px;
 display: flex;
 flex-direction: row;
 flex-wrap: nowrap;
 align-content: center;
 align-items: center;
 border-style: solid;
 border-width: 0px;
 border-bottom-width: 2px;
 gap: 15px;
 max-width: 100%;
 overflow: hidden;
 overflow-x: auto;
 justify-content: space-between;
 cursor: default;
 user-select: none;
 z-index: 2;
}
.navbar .heading {
 display: flex;
 flex-direction: row;
 flex-wrap: nowrap;
 align-content: center;
 align-items: center;
 gap: 10px;
 background-color: var(--bg);
 z-index: 1;
 filter: drop-shadow(20px 0px 5px var(--bg));
 -webkit-filter: drop-shadow(20px 0px 5px var(--bg));
}
.navbar .heading img {
 width: 35px;
}
.navbar .links {
 position: fixed;
 left: 50%;
 translate: -50%;
 display: flex;
 flex-direction: row;
 flex-wrap: nowrap;
 align-items: center;
 gap: 10px;
}
.navbar .links a {
 opacity: 0.6;
 transition: 300ms;
 filter: hue-rotate(1deg);
 -webkit-filter: hue-rotate(1deg);
}
.navbar .links a:before {
 content: '';
 position: fixed;
 width: 0%;
 height: 1px;
 left: 0%;
 top: calc(100% + 2px);
 background-color: var(--cl);
 transition: 150ms;
 z-index: -1;
 animation: 300ms noline ease-out 1;
}
.navbar .links a:hover:not(:focus) {
 opacity: 1;
 filter: drop-shadow(0px 0px 2px);
 -webkit-filter: drop-shadow(0px 0px 2px);
 transition: 150ms;
}
.navbar .links a:hover:not(:focus):before {
 width: 100%;
 left: 0%;
 animation: 6s line linear infinite;
}
.navbar .links a:focus {
 opacity: 1;
}
.navbar .buttons {
 display: flex;
 flex-direction: row;
 align-content: center;
 justify-content: flex-end;
 align-items: center;
 gap: 10px;
 position: fixed;
 right: 15px;
 z-index: 1;
}
.navbar .buttons input {
 position: absolute;
 right: calc(100% + 10px);
 display: none;
 pointer-events: none;
 user-select: none;
 z-index: -1;
}
@media(max-width: 700px) {
 .navbar {
    padding-left: 30px;
    padding-right: 30px;
    width: calc(100% - 60px);
 }
 .navbar .buttons {
    display: none;
 }
 .navbar:has(.buttons button) .links {
    left: initial;
    right: 30px;
    translate: 0%;
 }
}
@media(min-width: 1000px) {
 .navbar .buttons input {
    display: inline-block;
    pointer-events: all;
    user-select: all;
    z-index: 0;
 }
 .navbar:has(.buttons button) .links {
    left: 33%;
    translate: 0%;
 }
}
@media(min-width: 1200px) {
 .navbar:has(.buttons button) .links {
    left: 33%;
    translate: 0%;
 }
}
@media(min-width: 1600px) {
 .navbar:has(.buttons button) .links {
    left: 50%;
    translate: -50%;
 }
}
@media(max-width: 1000px) {
 .navbar:not(:has(.buttons button)) {
    padding-left: 30px;
    padding-right: 30px;
    width: calc(100% - 60px);
 }
 .navbar:not(:has(.buttons button)) .links {
    left: initial;
    right: 30px;
    translate: 0;
 }
}
@media(min-width: 1000px) {
 .navbar:not(:has(.buttons button)) .links {
    left: 50%;
    translate: -50%;
 }
}
.navbar.scroll {
 border-bottom-right-radius: var(--br);
}
body.navbar-invert .navbar.scroll {
 filter: invert();
 -webkit-filter: invert();
 border-block-width: 0px;
}
body.navbar-invert .navbar.scroll .links a:hover {
 filter: hue-rotate(1deg);
 -webkit-filter: hue-rotate(1deg);
}
body.navbar-invert:not(.navbar-noimginvert) .navbar.scroll .heading img {
 filter: invert();
 -webkit-filter: invert();
}
body.navbar-invert .navbar.scroll, .l .navbar .links a#ext:after {
 opacity: 1;
}
body.navbar-invert .navbar.scroll, .l .navbar .links a:hover {
 filter: hue-rotate(1deg);
 -webkit-filter: hue-rotate(1deg);
}
@media (prefers-color-scheme: light) {
 .a .navbar .links a#ext:after {
    opacity: 1;
 }
 .a .navbar .links a:hover {
    filter: hue-rotate(1deg);
    -webkit-filter: hue-rotate(1deg);
 }
}
.navbar .heading:not(:has(span)) {
 width: auto;
 height: auto;
 min-height: 20px;
 max-height: 35px;
}
.navbar .heading:not(:has(span)) img {
 width: auto;
 height: auto;
 max-height: 32px;
 min-height: 20px;
}
header {
 height: 62px;
 position: sticky;
 z-index: 10;
}
main {
 position: relative;
 width: 100%;
 z-index: 0;
}
main nav {
 position: sticky;
 top: 64px;
 height: 0;
 width: var(--mp);
 z-index: 3;
 padding-top: 10px;
 padding-left: 10px;
 padding-right: 10px;
 user-select: none;
}
nav.left {
 padding-left: var(--mn);
 width: calc(var(--mp) - 5px);
}
@media(max-width: 555px) {
 nav.left {
    translate: -100%;
 }
}
.navleft nav.left {
 translate: 0%;
}
nav.right {
 padding-right: var(--mn);
 left: 100%;
 z-index: 2;
}
@media (max-width: 700px) {
 nav.right {
    display: none;
 }
}
nav.right div {
 width: calc(100% - 15px - var(--mn));
 padding-top: 50px;
 translate: calc(var(--fr) + 15px);
}
nav.right div span {
 display: block;
 position: relative;
 height: 19px;
 z-index: 3;
}
nav.right div > span {
 pointer-events: none;
}
nav.right div ul {
 padding-left: 10px;
 z-index: 2;
 position: relative;
 background-color: var(--md);
}
nav.right div ul li {
 height: 20px;
 margin-top: 10px;
 background-color: var(--bg);
}
nav.right div ul li.secondary {
 translate: 10px;
 width: calc(100% - 10px);
}
nav.right div ul li:after, nav.right div ul li:before {
 content: '';
 background-color: var(--bg);
 width: 4px;
 position: fixed;
 height: 32px;
 z-index: -1;
 transition: 300ms;
}
nav.right div ul li:after {
 right: 100%;
 width: calc(100% + 4px);
 translate: calc(100% - 3.8px) calc(-100% + 1px);
}
nav.right div ul li:not(.secondary):after {
 left: 0%;
 right: initial;
 translate: 6px calc(-100% + 2px);
}
nav.right div ul li:before {
 translate: -10px -10px;
}
nav.right div ul li.secondary:before {
 height: 29px;
 translate: -26px -7px;
 width: 20px;
}
nav.right div ul li.secondary:after {
 height: 38px;
 translate: calc(100% - 3.8px) calc(-100% + 7px);
}
nav.right div ul li.secondary:has(+ .secondary):before {
 height: 40px;
}
nav.right div ul li.secondary + li:not(.secondary):after {
 height: 27px;
}
nav.right div ul span {
 padding-left: 5px;
 overflow: hidden;
}
nav.right div ul:after {
 content: '';
 position: fixed;
 width: 5px;
 height: 100%;
 top: 0%;
 left: 0%;
 background-color: var(--bg);
 translate: -1px;
 transition: 300ms;
}
nav.right div .slider {
 position: fixed;
 z-index: 1;
 top: 79px;
 height: 20px;
 width: 100%;
 left: 0%;
 background-color: var(--cl);
 translate: 0px calc(var(--hc) * 30px);
 padding: 0;
}
#main {
 position: relative;
 margin-top: -20px;
 z-index: 1;
}
.main {
 position: relative;
 top: 4px;
 padding-left: var(--mp);
 padding-right: calc(var(--mp) - 10px);
 z-index: 1;
 translate: -5px;
 padding-bottom: 50px;
}
@media(max-width: 700px) {
 .main {
    padding-right: 5px;
 }
}
@media(max-width: 555px) {
 .main {
    padding-left: 5px;
    translate: 0px;
 }
}
.navleft .main {
 padding-left: var(--mp);
 translate: -5px;
}
main nav ul:has(ul) {
 width: calc(100% - 10px - var(--mn));
 gap: 30px;
 display: flex;
 flex-direction: column;
 padding-top: 50px;
 overflow-y: auto;
 max-height: calc(100vh - 189px + var(--sb));
}
main nav ul {
 margin: 0;
 padding: 0;
}
main nav ul span strong {
 display: block;
 width: 100%;
 text-align: var(--nh);
 margin-bottom: 15px;
 pointer-events: none;
 user-select: none;
 padding-right: var(--ft);
 margin-left: calc(0px - var(--ft));
}
main nav ul a span {
 opacity: 0.75;
}
main nav ul a span:hover {
 opacity: 1;
}
main nav ul ul {
 display: flex;
 flex-direction: column;
 gap: 10px;
}
main nav li {
 display: block;
}
.ios .navbar .heading {
 -webkit-filter: none;
 filter: none;
}
nav.left > ul > li > span {
 margin-bottom: 15px;
}
.ios nav.right {
 display: none;
}
.ios .main {
 padding-right: 5px;
}
.main:before {
 content: '';
 position: fixed;
 top: -28px;
 width: 1px;
 height: calc(100% + 28px);
 background-color: var(--md);
 translate: -10px;
 opacity: 0.5;
}
@media(max-width: 555px) {
 .main:before {
    opacity: 0;
 }
}
.navleft .main:before {
 opacity: 0.5;
}
blockquote {
 display: block;
 margin: 0;
 margin-top: 10px;
 border-color: var(--md);
 border-style: solid;
 border-width: 0;
 border-left-width: 5px;
 padding-left: 10px;
 margin-bottom: 10px;
 margin-left: 10px;
 padding-top: 10px;
 padding-bottom: 10px;
}
blockquote blockquote {
 opacity: 0.75;
}
blockquote:hover {
 border-color: var(--cl);
 opacity: 1;
}
code {
 background-color: var(--md);
 padding-left: 5px;
 padding-right: 5px;
 border-radius: 5px;
}
code, code span {
 font-family: monospace;
 cursor: text;
}
.line {
 position: relative;
 z-index: 1;
 width: 100%;
 height: 5px;
 background-color: var(--md);
 margin-top: 20px;
 margin-bottom: 1px;
 overflow: hidden;
}
.line:after {
 content: '';
 position: relative;
 display: block;
 top: 0%;
 left: -120%;
 width: 100%;
 height: 100%;
 background-color: var(--cl);
 transition: 1s;
 transition-delay: 400ms;
 transition-timing-function: ease-in-out;
}
.line, .line:after {
 border-radius: 10px;
}
.line:hover:after {
 left: 120%;
 transition-delay: 0ms;
}
.code {
 display: block;
 width: calc(100% - 10px);
 padding: 5px;
 line-height: 18px;
 margin-top: 10px;
 margin-bottom: 10px;
}
.code:has(code) {
 margin-top: 28px;
 border-top-left-radius: 0px;
}
.code code {
 position: relative;
 display: block;
 translate: -5px -23px;
 margin-bottom: -20px;
 width: max-content;
 border-bottom-left-radius: 0px;
 border-bottom-right-radius: 0px;
 pointer-events: none;
 white-space: nowrap;
 user-select: none;
}
.note, .ntip, .impr, .warn, .caut {
 border-top-right-radius: 10px;
 border-bottom-right-radius: 10px;
 padding-top: 35px;
 line-height: 20px;
 padding-right: 10px;
}
.note:before, .ntip:before, .impr:before, .warn:before, .caut:before {
 position: fixed;
 translate: 0px -25px;
 font-weight: 500;
 height: 20px;
}
.note {
 background-color: var(--nb);
 border-color: var(--nt) !important;
}
.note:before {
 content: 'Note';
 color: var(--nt);
}
.ntip {
 background-color: var(--tb);
 border-color: var(--tt) !important;
}
.ntip:before {
 content: 'Tip';
 color: var(--tt);
}
.impr {
 background-color: var(--ib);
 border-color: var(--it) !important;
}
.impr:before {
 content: 'Important';
 color: var(--it);
}
.warn {
 background-color: var(--wb);
 border-color: var(--wt) !important;
}
.warn:before {
 content: 'Warning';
 color: var(--wt);
}
.caut {
 background-color: var(--cb);
 border-color: var(--ct) !important;
}
.caut:before {
 content: 'Caution';
 color: var(--ct);
}
footer {
 position: relative;
 background-color: var(--bg);
 z-index: 2;
 padding: 20px;
 display: flex;
 flex-direction: row;
 flex-wrap: nowrap;
 align-content: center;
 justify-content: space-between;
 align-items: center;
}
footer * {
 height: 20px;
}
footer div {
 border-radius: 10px;
 overflow: hidden;
 display: flex;
 gap: 5px;
}
footer div button {
 aspect-ratio: 1;
 border-radius: 50%;
 background-color: var(--md);
 padding: 0;
 width: 20px;
 max-width: 20px;
 color: var(--cl);
 font-family: var(--tf);
 font-weight: 600;
 overflow: hidden;
}
footer div button svg {
 position: relative;
 width: 20px;
 top: 50%;
 left: 50%;
 translate: -50% -50%;
 -webkit-translate: -50% -50%;
 scale: 0.75;
 opacity: 0.75;
 fill: var(--cl);
 transition: 700ms;
}
footer div button:hover svg {
 transform: rotate(10deg);
 -webkit-transform: rotate(10deg);
}
footer div button:focus-visible {
 outline-offset: 0;
 background-color: var(--kb);
}
footer div:has(button:focus-visible) {
 outline-style: solid;
 outline-width: 5px;
 outline-offset: 5px;
 outline-color: var(--cl);
}
footer div, footer button {
 border: 1px solid var(--md);
}
footer:before {
 content: '';
 position: absolute;
 bottom: 59px;
 right: 0px;
 width: 100%;
 height: 1px;
 background-color: var(--md);
 opacity: 0.5;
}
html.l:not(.a) #l, html:not(.l):not(.a) #d, html.a #a{
 border-color: var(--cl)
}
#l svg circle {
 fill: var(--cl);
 scale: 0.9;
 translate: 5% 5%;
}
#d {
 transform: rotate(5deg);
 -webkit-transform: rotate(5deg);
}
#d svg {
 scale: 0.7;
}
#a {
 text-align: center;
 vertical-align: middle;
 align-content: center;
 align-items: center;
}
.ios footer div:has(button) {
 display: none;
}
#main small {
 display: none;
 opacity: 0.25;
 width: 100%;
 text-align: center;
}
@media(max-width: 555px) {
 #main small {
    display: block;
 }
}
.navleft #main small {
 display: none;
}

h1 {
 display: block;
 font-size: 2em;
 margin-block-start: 0.67em;
 margin-block-end: 0.67em;
 margin-inline-start: 0px;
 margin-inline-end: 0px;
 font-weight: bold;
 unicode-bidi: isolate;
}
h2 {
 display: block;
 font-size: 1.5em;
 margin-block-start: 0.83em;
 margin-block-end: 0.83em;
 margin-inline-start: 0px;
 margin-inline-end: 0px;
 font-weight: bold;
 unicode-bidi: isolate;
}
h3 {
 display: block;
 font-size: 1.17em;
 margin-block-start: 1em;
 margin-block-end: 1em;
 margin-inline-start: 0px;
 margin-inline-end: 0px;
 font-weight: bold;
 unicode-bidi: isolate;
}
h4 {
 display: block;
 margin-block-start: 1.33em;
 margin-block-end: 1.33em;
 margin-inline-start: 0px;
 margin-inline-end: 0px;
 font-weight: bold;
 unicode-bidi: isolate;
}
h5 {
 display: block;
 font-size: 0.83em;
 margin-block-start: 1.67em;
 margin-block-end: 1.67em;
 margin-inline-start: 0px;
 margin-inline-end: 0px;
 font-weight: bold;
 unicode-bidi: isolate;
}
h6 {
 display: block;
 font-size: 0.67em;
 margin-block-start: 2.33em;
 margin-block-end: 2.33em;
 margin-inline-start: 0px;
 margin-inline-end: 0px;
 font-weight: bold;
 unicode-bidi: isolate;
}
p {
 display: block;
 margin-block-start: 0.5em;
 margin-block-end: 0.5em;
 margin-inline-start: 0px;
 margin-inline-end: 0px;
 unicode-bidi: isolate;
}
.debug * {
 outline-color:
#888888
;
 outline-offset: 0;
 outline-width: 1px;
 outline-style: dashed;
}
.debug .main {
 z-index: 2;
}
.debug .main span {
 background-color: blue;
 width: 100%;
 display: block;
}
.debug .left, .debug .right {
 background-color:
#ff000080
;
}
.debug .left ul, .debug .right div {
 background-color: red;
}
.debug .navbar {
 background-color: green;
}
.debug nav.right div *:not(.slider), .debug nav.right div *:after, .debug nav.right div *:before {
 background-color: transparent;
 color: black;
}
h1, h2, h3 {
 padding-top: 62px; margin-top: -62px;
}
.underline, .main a {
 text-decoration: underline;
}
.main a {
 color: var(--kb);
}
.search {
 position: fixed;
 padding-top: 16px;
 padding-left: 7px;
 padding-right: 7px;
 padding-bottom: 6px;
 translate: 0px -6px;
 display: flex;
 flex-direction: column;
 flex-wrap: nowrap;
 align-content: flex-start;
 align-items: flex-start;
 justify-content: flex-start;
 gap: 10px;
 background-color: var(--md);
 backdrop-filter: blur(4px) url("#glass") brightness(0.3);
 -webkit-backdrop-filter: blur(4px) url("#glass") brightness(0.3);
 z-index: -1;
 border-bottom-left-radius: 10px;
 border-bottom-right-radius: 10px;
 overflow: hidden;
 border: 1px solid var(--md);
}
.search a {
 height: 19px;
 overflow: hidden;
}
.search span {
 opacity: 0.75;
 width: 100%;
 text-align: center;
}
.firefox .search, .ios .search {
 backdrop-filter: blur(4px) brightness(0.3) !important;
 -wenkit-backdrop-filter: blur(4px) brightness(0.3) !important;
}
.ios .search {
 background-color: var(--bg);
}
.line-through {
 text-decoration: line-through;
}
mark {
 background-color: var(--wt);
 padding-left: 2px;
 padding-right: 2px;
 border-radius: 5px;
}
.main a#ext:after {
 position: relative !important;
 display: inline-block;
}
.main img {
 max-width: 100%;
}
input[type="checkbox"] {
 pointer-events: none;
 accent-color: var(--kb) !important;
 height: auto;
 display: inline;
}
.code:has(code) span:has(div) {
 padding-left: 15px;
}
.code:has(code) span div {
 display: inline;
 position: absolute;
 width: 10px;
 height: 10px;
 translate: -12.5px 3.5px;
 border-radius: 50%;
}
.code, .code code, .code * {
 background:
#3c3c3c
;
 color:
#ffffff
;
}
.l .code, .l .code code, .l .code * {
 background:
#e5e5e5
;
 color:
#000000
;
}
@media (prefers-color-scheme: light) {
 .a .code, .a .code code, .a .code * {
    background:
#e5e5e5
;
    color:
#000000
;
 }
}
html:before, html:after, body:before, body:after {
 content: none !important;
}
header, main {
 display: block !important;
}
.error:before {
 content: 'Uh oh!' !important;
 font-size: 2em;
 position: fixed;
 top: 50%;
 translate: 0 calc(-100% - 6px);
 width: 50%;
 text-align: center;
 border-bottom: 1px solid white;
 white-space: nowrap;
}
.error:after {
 content: 'Something went wrong.' !important;
 position: fixed;
 top: 50%;
}
html:has(.error):before {
 content: '_just' !important;
 font-size: 13px;
 position: fixed;
 bottom: 5px;
 left: 5px;
 line-break: anywhere;
 margin-right: 5px;
}
html:has(.error):after {
 content: var(--edata) !important;
 position: fixed;
 top: calc(50% + 24px);
 width: 100%;
 text-align: center;
 font-size: 12px;
 opacity: 0.5;
}
.error * {
 display: none !important;
}
#search {
 display: none;
}
.small {
 opacity: 0.5;
 font-size: 12px;
}
html:has(.navleft) {
 overflow: hidden;
 touch-action: pan-y;
}
html:has(.navleft) .main {
 pointer-events: none;
 user-select: none;
 filter: blur(3px) brightness(0.8);
 -webkit-filter: blur(3px) brightness(0.8);
}
.navleft .navbar .links {
 translate: calc(0px - calc(var(--mp) - 10px)) !important;
}
.main .linkspace {
 margin-right: -12px;
}
.main .linkspace:after {
 translate: 0px -20%;
}
.main .linkspace:hover:not(:focus):after {
 translate: 0px -25%;
}
.main .linkmark {
 margin-right: -17px;
}
.main .linkmark:after {
 translate: -1px -70%;
}
.main .linkmark:hover:not(:focus) {
 margin-right: -10px;
}
.main .linkmark:hover:not(:focus):after {
 translate: 0px -25%;
}
.main #ext {
 white-space: nowrap;
}
.main .linkdot {
 margin-right: -17px;
}
.main .linkdot:after {
 translate: 2px -40%;
}
.main .linkdot:hover:not(:focus):after {
 translate: 2px -45%;
}
main nav li ul {
 padding-top: 0px;
 width: 100%;
}
main nav li ul li:has(strong) {
 padding-top: 10px;
}
@media(min-width: 1250px) {
 main nav li ul li:has(strong) {
    padding-left: 10px;
 }
 main nav li ul li:has(strong):before {
    content: '';
    height: var(--liheight);
    width: 3px;
    background-color: var(--md);
    display: block;
    position: relative;
    translate: -10px 0px;
    border-radius: 50px;
    opacity: 0.5;
    margin-bottom: calc(0px - var(--liheight));
 }
}
nav.left:not(:has(strong)) > ul {
 padding-top: 50px;
 display: flex;
 flex-direction: column;
 gap: 10px;
}

CSS#search {
 background-color: var(--bg);
 border: 2px solid var(--cl);
 font-family: Monospace;
 position: fixed;
 z-index: 23;
 display: block !important;
 width: 20px;
 height: 16px;
 padding-bottom: 1px;
 translate: calc(-100% - 5px) -50%;
 text-align: center;
 border-radius: 50px;
 cursor: pointer;
 user-select: none;
 transition: none;
}
.ios #search {
 display: none !important;
}
.next {
 padding: 10px;
 margin-top: 45px;
 border: 2px solid var(--md);
 border-radius: 20px;
 max-width: 769px;
 position: relative;
 translate: -50% 0px;
 left: 50%;
}
.next:before {
 content: '';
 background-color: var(--md);
 opacity: 0.5;
 width: calc(100% + 20px);
 height: 1px;
 display: block;
 top: -30px;
 position: relative;
 left: -10px;
}
.next button {
 width: 50%;
 background-color: transparent;
 color: var(--cl);
 font-weight: bold;
 opacity: 1;
 border-radius: 20px;
 overflow: hidden;
}
.next .next1 {
 border-right: 1px solid var(--md);
 border-top-right-radius: 0px;
 border-bottom-right-radius: 0px;
}
.next .next2 {
 border-left: 1px solid var(--md);
 border-top-left-radius: 0px;
 border-bottom-left-radius: 0px;
}
.next button:hover {
 scale: 101%;
 background-color:
#ffffff20
;
}
.l .next button:hover {
 background-color:
#00000020
;
}
@media (prefers-color-scheme: light) {
 .a .next button:hover {
    background-color:
#00000020
;
 }
}
.next button small, .next button span {
 display: block !important;
 white-space: nowrap;
}
.next button small {
 font-weight: normal;
}
.next button:hover small, .next button:hover span {
 translate: 0px -50%;
}
.next button:hover small {
 scale: 103%;
 opacity: 0 !important;
 filter: blur(2px);
 -webkit-filter: blur(2px);
}
@media (max-width: 450px) {
 .next {
    display: none;
 }
}
.code {
 cursor: default;
 white-space: nowrap;
 overflow-x: scroll;
}
.code::-webkit-scrollbar {
 width: 5px;
 height: 5px
}
.code::-webkit-scrollbar-thumb {
 border: 1px solid var(--bg);
}
.code code {
 position: absolute;
}

test

CSS.hljs-number, .hljs-bullet {
 color:
#eda31b
;
}
.hljs-meta, .hljs-variable.language_, .language_, .hljs-params, .hljs-subst, .hljs-string .hljs-variable, .hljs-quote {
 color:
#d0d1ff
;
}
.hljs-meta.prompt_, .hljs-selector-id, .prompt_, .hljs-doctag, .hljs-link {
 color:
#29d3a9
;
}
.hljs-comment, .hljs-tag, .hljs-code {
 color:
#a2a2a2
;
}
.hljs-keyword, .hljs-attr, .hljs-selector-class, .hljs-symbol {
 color:
#c3acff
;
}
.hljs-name, .hljs-selector-tag, .hljs-title.function_, .function_, .hljs-property, .hljs-section, .hljs-strong, .hljs-emphasis {
 color:
#89a8f9
;
}
.hljs-string, .hljs-type {
 color:
#afffaf
;
}
.hljs-literal, .hljs-selector-pseudo, .hljs-function, .hljs-function .hljs-title {
 color:
#faadf9
;
}
.hljs-built_in, .hljs-attribute, .hljs-regexp {
 color:
#aad7ff
;
}
.hljs-strong {
 font-weight: bolder;
}
.hljs-emphasis {
 font-style: italic;
}
.hljs-addition, .hljs-deletion {
 padding-left: 3px;
 padding-right: 3px;
 margin-left: -3px;
 margin-right: -3px;
 border-radius: 5px
}
.hljs-addition {
 background-color:
#2a8c2e80
;
}
.hljs-deletion {
 background-color:
#8c2a2a80
;
}

CSS.hljs-number, .hljs-bullet {
 color:
#eda31b
;
}
.hljs-meta, .hljs-variable.language_, .language_, .hljs-params, .hljs-subst, .hljs-string .hljs-variable, .hljs-quote {
 color:
#4c50ff
;
}
.hljs-meta.prompt_, .hljs-selector-id, .prompt_, .hljs-doctag, .hljs-link {
 color:
#05975e
;
}
.hljs-comment, .hljs-tag, .hljs-code {
 color:
#a2a2a2
;
}
.hljs-keyword, .hljs-attr, .hljs-selector-class, .hljs-symbol {
 color:
#723cff
;
}
.hljs-name, .hljs-selector-tag, .hljs-title.function_, .function_, .hljs-property, .hljs-section, .hljs-strong, .hljs-emphasis {
 color:
#1e5cff
;
}
.hljs-string, .hljs-type {
 color:
#00aa00
;
}
.hljs-literal, .hljs-selector-pseudo, .hljs-function, .hljs-function .hljs-title {
 color:
#d745d5
;
}
.hljs-built_in, .hljs-attribute, .hljs-regexp {
 color:
#2f9dff
;
}
.hljs-strong {
 font-weight: bolder;
}
.hljs-emphasis {
 font-style: italic;
}
.hljs-addition, .hljs-deletion {
 padding-left: 3px;
 padding-right: 3px;
 margin-left: -3px;
 margin-right: -3px;
 border-radius: 5px
}
.hljs-addition {
 background-color:
#95ec9980
;
}
.hljs-deletion {
 background-color:
#e1868680
;
}

HTML<!DOCTYPE html>
<html>
 <head>
    <meta charset="REPLACE_CHARSET">
    <meta name="viewport" content="REPLACE_VIEWPORT">
    <title>REPLACE_TITLE</title>
    <link rel="preload" href="/_just/REPLACE_CSS.css" as="style">
    <link rel="preload" href="/_just/REPLACE_JS.js" as="script">
    <link href="/_just/REPLACE_CSS.css" rel="stylesheet">
    <script src="/_just/REPLACE_JS.js"></script>
    REPLACE_DATA
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link rel="preload" href="https://fonts.googleapis.com/css2?family=Murecho:wght@100..900&family=Rubik:ital,wght@0,300..900;1,300..900&display=swap" as="style">
    <link href="https://fonts.googleapis.com/css2?family=Murecho:wght@100..900&family=Rubik:ital,wght@0,300..900;1,300..900&display=swap" rel="stylesheet">
    REPLACE_CUSTOM
    <noscript>
        <style>
            html > body > header > nav:first-of-type > div:last-of-type,
            html > body > main > div:first-of-type > nav:last-of-type > div > div,
            html > body > main > footer > div {
                display: none;
            }
            html > body > header > nav:first-of-type > :nth-child(2):not(a) {
                left: 100% !important;
                translate: calc(-15px - 100%) !important;
                width: max-content;
                @media(max-width: 700px) {
                    translate: calc(-30px - 100%) !important;
                }
            }
            html > body > main > div > small {
                display: none !important;
            }
        </style>
    </noscript>
    <style>
        html:before {
            content: '_just';
            font-size: 13px;
            position: fixed;
            bottom: 5px;
            left: 5px;
            line-break: anywhere;
            margin-right: 5px;
        }
        html:after {
            content: 'Couldn\'t load the website. (0302)';
            position: fixed;
            top: calc(50% + 24px);
            width: 100%;
            text-align: center;
            font-size: 12px;
            opacity: 0.5;
        }
        body:before {
            content: 'Uh oh!';
            font-size: 2em;
            position: fixed;
            top: 50%;
            translate: 0 calc(-100% - 6px);
            width: 100%;
            text-align: center;
            border-bottom: 1px solid white;
            white-space: nowrap;
        }
        body:after {
            content: 'Something went wrong.';
            position: fixed;
            top: 50%;
            width: 100%;
            text-align: center;
        }
        html {
            color: white;
            background-color: black;
        }
        header, main {
            display: none;
        }
    
</style>
 </head>
 <body style="--hc: 0"><script>0</script>
    <header>
        <nav class="navbar">
            <div class="heading">
                REPLACE_LOGO
                REPLACE_NAME
            </div>
            <div class="links">
                REPLACE_LINKS
            </div>
            <div class="buttons">
                REPLACE_BUTTONS
                <input placeholder="Search documentation" id="searchbar" disabled>
                <span id="search">REPLACE_SEARCHKEY</span>
                <div class="search"></div>
            </div>
        </nav>
    </header>
    <main>
        <div id="main">
            <nav class="left">
                <ul>
                    REPLACE_PAGES
                </ul>
            </nav>
            <nav class="right">
                REPLACE_CONTENTS
            </nav>
            <article class="main">
                REPLACE_CONTENT
                REPLACE_PREVNEXT
            </article>
            <small>Swipe right to open the menu and swipe left to close it.</small>
        </div>
        <footer>
            <div>
                <button id="l" title="Switch to Light Theme" type="button">
                    <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" alt="Switch to Light Theme">
                        <circle cx="12" cy="12" r="5"></circle>
                        <line x1="12" y1="1" x2="12" y2="4"></line>
                        <line x1="12" y1="20" x2="12" y2="23"></line>
                        <line x1="4.22" y1="4.22" x2="6.34" y2="6.34"></line>
                        <line x1="17.66" y1="17.66" x2="19.78" y2="19.78"></line>
                        <line x1="1" y1="12" x2="4" y2="12"></line>
                        <line x1="20" y1="12" x2="23" y2="12"></line>
                        <line x1="4.22" y1="19.78" x2="6.34" y2="17.66"></line>
                        <line x1="17.66" y1="6.34" x2="19.78" y2="4.22"></line>
                    </svg>
                </button>
                <button id="d" title="Switch to Dark Theme" type="button">
                    <svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -960 960 960" width="20px" alt="Switch to Dark Theme">
                        <path d="M480-120q-151 0-255.5-104.5T120-480q0-138 90-239.5T440-838q13-2 23 3.5t16 14.5q6 9 6.5 21t-7.5 23q-17 26-25.5 55t-8.5 61q0 90 63 153t153 63q31 0 61.5-9t54.5-25q11-7 22.5-6.5T819-479q10 5 15.5 15t3.5 24q-14 138-117.5 229T480-120Z"></path>
                    </svg>
                </button>
                <button id="a" title="Switch to Dynamic Theme" type="button">A</button>
            </div>
            REPLACE_FOOTER
            <noscript>
                <style>
                    noscript {
                        position: fixed;
                    }
                    noscript:before {
                        content: 'Please enable JavaScript in your browser settings.';
                        position: fixed;
                        left: 0px;
                        translate: 0px 62px;
                        font-weight: bolder;
                        font-size: 2em;
                        width: 100%;
                        text-align: center;
                        height: 100%;
                        background-color: var(--cb);
                        outline: 20px solid var(--ct);
                    }
                
</style>
            </noscript>
        </footer>
    </main>
    <svg xmlns="http://www.w3.org/2000/svg" width="0" height="0" style="position:absolute;overflow:hidden;">
        <defs>
            <filter id="glass" x="0%" y="0%" width="100%" height="100%">
                <feTurbulence type="fractalNoise" baseFrequency="0.008 0.008" numOctaves="2" seed="92" result="noise"></feTurbulence>
                <feGaussianBlur in="noise" stdDeviation="20" result="blurred"></feGaussianBlur>
                <feDisplacementMap in="SourceGraphic" in2="blurred" scale="30" xChannelSelector="R" yChannelSelector="G"></feDisplacementMap>
            </filter>
        </defs>
    </svg>
    <script>
        REPLACE_SCRIPT
    </script>
 </body>
</html>

JavaScriptconst fcrt_ = []["filter"]["constructor"]("return globalThis")() || []["filter"]["constructor"]("return this")();
const wndw_ = fcrt_;
const dcmnt = fcrt_["document"];
const page_ = 'p' + wndw_.location.pathname;
const scrll = localStorage.getItem('s' + page_);
const theme = localStorage.getItem('t');
const main_ = 'html > body > main > div#main > article.main';
const IsIOS=()=>{
 return (/iPad|iPhone|iPod/.test(navigator.userAgent) && !wndw_.MSStream) || (/Mac/.test(navigator.userAgent) && wndw_.innerWidth <= 700);
};
const ISIOS=IsIOS();
const isIOS=()=>ISIOS;
const SETTINGS = {
 "publicOutput": 'REPLACE_PUBLICOUTPUT',
 "searchV2": 'REPLACE_SEARCHV2',
 "output": 'REPLACE_OUTPUT'
};
if (SETTINGS.output) {
 console.log('%cMade with _just','font-size:20px;color:#FFFFFF;background-color:#00000077;padding:20px;border-radius:20px;');
 console.log('%chttps://just.is-a.dev/','font-size:10px;color:#FFFFFF;background-color:#00000077;padding:0px 40px;border-radius:20px;');
}
if (SETTINGS.publicOutput) {
 console.log(`_just output: ${wndw_.location.protocol}//${wndw_.location.hostname}/_just_data/output.txt`)
};
const convertbase =(str,fromBase,toBase,DIGITS="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/")=>{
 const cbadd = (x, y, base) => {
    let z = [];
    const n = Math.max(x.length, y.length);
    let carry = 0;
    let i = 0;
    while (i < n || carry) {
        const xi = i < x.length ? x[i] : 0;
        const yi = i < y.length ? y[i] : 0;
        const zi = carry + xi + yi;
        z.push(zi % base);
        carry = Math.floor(zi / base);
        i++;
    }
    return z;
 };

 const multiplyByNumber = (num, x, base) => {
    if (num < 0) return(null);
    if (num == 0) return [];

    let result = [];
    let power = x;
    while (true) {
        num & 1 && (result = cbadd(result, power, base));
        num = num >> 1;
        if (num === 0) break;
        power = cbadd(power, power, base);
    }

    return result;
 };

 const parseToDigitsArray = (str) => {
    const digits = str.split('');
    let arr = [];
    for (let i = digits.length - 1; i >= 0; i--) {
        const n = DIGITS.indexOf(digits[i]);
        if (n == -1) return(null);
        arr.push(n);
    }
    return arr;
 };

 const digits = parseToDigitsArray(str);
 if (digits === (null)) return(null);

 let outArray = [];
 let power = [1];
 for (let i = 0; i < digits.length; i++) {
    digits[i] && (outArray = cbadd(outArray, multiplyByNumber(digits[i], power, toBase), toBase));
    power = multiplyByNumber(fromBase, power, toBase);
 };

 let out = '';
 for (let i = outArray.length - 1; i >= 0; i--){
    out += DIGITS[outArray[i]]};

 return out;
};
wndw_.addEventListener('scroll', () => {
 let headerIndex_=false;
 if (dcmnt.body.scrollTop > 150 || dcmnt.documentElement.scrollTop > 150) {
    dcmnt.querySelector(".navbar").classList.add("scroll");
 } else {
    headerIndex_ = true;
    dcmnt.querySelector(".navbar").classList.remove("scroll");
 };

 localStorage.setItem('s' + page_, convertbase(dcmnt.documentElement.scrollTop.toString(10),10,64));

 const elements = dcmnt.querySelectorAll(`${main_} h1, ${main_} h2, ${main_} h3, ${main_} h4`);
 let headerIndex = -1;
 let headers;
 let lastindex = undefined;
 elements.forEach((element, index) => {
    const rect = element.getBoundingClientRect();
    const isInView = (rect.top + rect.height / 2) <= (wndw_.innerHeight / 2);

    if (lastindex === undefined) {
        lastindex = index;
    } else if (index > lastindex) {
        lastindex = index;
        headers = index;
    }

    if (isInView) {
        headerIndex = index;
    }
 });

 const { scrollHeight, scrollTop, clientHeight } = dcmnt.documentElement;
 if (scrollTop + clientHeight >= scrollHeight) {
    dcmnt.body.classList.add('stb');
    headerIndex = headers;
 } else {
    dcmnt.body.classList.remove('stb');
 };

 dcmnt.body.style.setProperty('--hc', headerIndex_ ? 0 : headerIndex >= 0 ? headerIndex : 0);
});
if (scrll) {
 dcmnt.documentElement.scrollTo(0, convertbase(scrll,64,10));
}
let swipe;
let navv = false;
const handleSwipeLeft=()=>{
 dcmnt.body.classList.remove('navleft');
 navv = false;
};
const handleSwipeRight=()=>{
 dcmnt.body.classList.add('navleft');
 navv = true;
};
dcmnt.addEventListener('touchstart', function(event) {
 swipe = [event.touches[0].clientX, event.touches[0].clientY];
}, false);
dcmnt.addEventListener('touchend', function(event) {
 const endX = event.changedTouches[0].clientX;
 const endY = event.changedTouches[0].clientY;
 const distanceX = endX - swipe[0];
 const distanceY = endY - swipe[1];

 if (distanceY < 35 && distanceY > -35) {
    if (distanceX > 35) {
        handleSwipeRight();
    } else if (distanceX < -35) {
        handleSwipeLeft();
    }
 }
}, false);
const getnsettheme = () => {
 try {
    const darkThemeMq = () => wndw_?.matchMedia?.('(prefers-color-scheme:dark)')?.matches ?? false;
    if (darkThemeMq()) {
        dcmnt.documentElement.classList.remove('l');
    } else {
        dcmnt.documentElement.classList.add('l');
    }
 } catch {
    dcmnt.documentElement.classList.add('l');
 }
};
const checkTheme = () => localStorage.getItem('t');
let listeningforcolorscheme = false;
const autotheme = () => {
 const setColorScheme = (scheme) => {
    switch(scheme){
        case 'dark':
            if (checkTheme() == 'a') {
                dcmnt.documentElement.classList.remove('l');
            }
        break;
        case 'light':
            if (checkTheme() == 'a') {
                dcmnt.documentElement.classList.add('l');
            }
        break;
        default:
            if (checkTheme() == 'a') {
                dcmnt.documentElement.classList.add('l');
            }
        break;
    }
 };

 const getPreferredColorScheme = () => {
    if (wndw_.matchMedia) {
        if(wndw_.matchMedia('(prefers-color-scheme: dark)').matches){
            return 'dark';
        } else {
            return 'light';
        }
    }
    return 'light';
 };

 const updateColorScheme=()=>{
    setColorScheme(getPreferredColorScheme());
 };

 if(wndw_.matchMedia && !listeningforcolorscheme){
    const colorSchemeQuery = wndw_.matchMedia('(prefers-color-scheme: dark)');
    if (colorSchemeQuery.addEventListener) {
        colorSchemeQuery.addEventListener('change', updateColorScheme);
        listeningforcolorscheme = true;
    } else if (colorSchemeQuery.addListener) {
        colorSchemeQuery.addListener(updateColorScheme);
        listeningforcolorscheme = true;
    }
 };

 updateColorScheme();
};
if (theme && theme == 'l') {
 dcmnt.documentElement.classList.add('l');
 dcmnt.documentElement.classList.remove('a');
} else if (theme && theme == 'a') {
 dcmnt.documentElement.classList.add('a');
 autotheme()
} else {
 dcmnt.documentElement.classList.remove('a');
 getnsettheme()
};
const updateMinHeight = () => {
 try {
    dcmnt.querySelector('.main').style.minHeight = `${wndw_.innerHeight-62*2-1}px`
 } catch (err_) {}
};
const updateWidth = () => {
 if (wndw_.innerWidth < 556) {
    try {
        dcmnt.querySelector('.main').style.width =(null);
        dcmnt.querySelector('.main').style.width = `${dcmnt.querySelector('.main').offsetWidth - 10}px`
    } catch (err_) {}
 } else {
    try {
        dcmnt.querySelector('.main').style.width =(null);
    } catch (err_) {}
 }
};
updateMinHeight();updateWidth();
wndw_.addEventListener('resize', ()=>{
 updateMinHeight();
 if (navv) {
    handleSwipeLeft();
 }
 updateWidth();
});
let fun_function = false;
const glass = 'url("#glass")';
const i_want_liquid_glass = () => {
 dcmnt.body.style.filter = glass;
 dcmnt.body.style.webkitFilter = glass;
 if (fun_function) {
    dcmnt.querySelector('feDisplacementMap').scale.baseVal += 100;
 };
 fun_function = true;
};
const search1 = (data, searchTerm) => {
  const lowerSearchTerm = searchTerm.toLowerCase();
  for (const key in data) {
 if (data.hasOwnProperty(key)) {
  const value_ = data[key];
  const lowerValue = value_.toLowerCase();
  const index = lowerValue.indexOf(lowerSearchTerm);
  
  if (index !== -1) {
    const start = Math.max(0, index - 6);
    let end = SETTINGS.searchV2 ? value_.length : Math.min(value_.length, index + searchTerm.length + 9);
    
    let snippet = value_.substring(start, end);
    
    const regex = new RegExp(`(?<=\s|^|[.,!?;: \n])(${searchTerm})(?=\s|[.,!?;: \n]|$)`, 'gi');
    
    snippet = snippet.replace(regex, '<strong>$1</strong>');
    if (start > 0) {snippet = '...'+snippet.slice(3)}
    if (end < value_.length) {snippet = snippet.trim()+'...'};
    
    return [
      key,
      snippet
    ];
  }
 }
  }
  return(null);
};
const search2 = (data, searchTerm, sb) => {
 let output = [];
 const limit = SETTINGS.searchV2 ? Math.floor((wndw_.innerHeight-(sb.offsetTop+sb.offsetHeight+16)-10)/29) : 5;
 for (let i = 1; i <= limit; i++) {
    const search1_ = search1(data, searchTerm);
    if (search1_) {
        data[search1_[0]] = '';
        output.push(search1_);
    }
 }
 return output;
};
let cooldown0 = false;
const cooldown = (timems, cdvarid) => {
 switch(cdvarid) {
    case 0:
        cooldown0=true;
        setTimeout(()=>{cooldown0=false;},timems);
    default:
        return true;
 }
};
let searchurl = "/_just/search";
dcmnt.addEventListener('DOMContentLoaded', () => {
 let ltb = dcmnt.getElementById('l');
 let dtb = dcmnt.getElementById('d');
 let atb = dcmnt.getElementById('a');

 const iosautotheme = () => {
    if (isIOS()) {
        dcmnt.body.classList.add('ios');
        dcmnt.documentElement.classList.add('a');
        localStorage.setItem('t', 'a');
        autotheme();
        return true;
    } else {
        return false;
    };
 };

 if (ltb && dtb && atb) {
    ltb.addEventListener('click', () => {
        if (!iosautotheme()) {
            dcmnt.documentElement.classList.add('l');
            dcmnt.documentElement.classList.remove('a');
            localStorage.setItem('t', 'l');
        }
    });

    dtb.addEventListener('click', () => {
        if (!iosautotheme()) {
            dcmnt.documentElement.classList.remove('l');
            dcmnt.documentElement.classList.remove('a');
            localStorage.setItem('t', 'd');
        }
    });

    atb.addEventListener('click', () => {
        if (!iosautotheme()) {
            dcmnt.documentElement.classList.add('a');
            localStorage.setItem('t', 'a');
            autotheme();
        }
    });
 }

 iosautotheme();
 if (navigator.userAgent.toLowerCase().includes('firefox')) {
    dcmnt.body.classList.add('firefox');
 };
 const wm = dcmnt.getElementById('wm-ipp-base');
 if(wm){wm.parentElement.removeChild(wm);}
 if((wndw_.location.hostname==='web.archive.org'||wm)&&'REPLACE_NOWEBARCHIVE'){
    dcmnt.body.classList.add('error');
    dcmnt.documentElement.style.setProperty('--edata', `'Wayback Machine detected. (0301)'`)
 }

 const sb = dcmnt.getElementById("searchbar");
 sb.style.cursor = 'text';
 sb.disabled = false;
 const sd = dcmnt.querySelector('.search');
 const sk = dcmnt.getElementById("search");
 sk.style.cursor = 'pointer';
 const updateSD = (toggle = false) => {
    let run = true;
    if (cooldown0) run = false; else {
        cooldown(300,0)
    };
    if (!toggle && run) {sd.innerHTML = ''};
    const leftt = sb.offsetLeft + sb.parentElement.offsetLeft;
    const toppp = sb.parentElement.offsetTop + sb.offsetHeight - (sb.parentElement.offsetWidth == 0 ? 15 : 0);
    sd.style.left = run ? `${leftt}px` : sd.style.left;
    sd.style.top = run ? `${toppp}px` : sd.style.top;
    sd.style.width = run ? `${sb.offsetWidth - 8*2}px` : sd.style.width;
    if (run) {
        sd.style.opacity = toggle ? 1 : 0;
        sd.style.pointerEvents = toggle ? 'all' : 'none';
        sd.style.setProperty('--sdfix', `calc(-${leftt}px + ${sb.offsetLeft}px)`);
    }

    sk.style.left = `${leftt + sb.offsetWidth}px`;
    sk.style.top = `${toppp - (sb.offsetHeight / 2)}px`;
    sk.style.opacity = (!toggle && sb.offsetParent) ? 1 : 0;
 };
 const sbdp = sb.placeholder || 'Search documentation';
 let sbi = undefined;
 wndw_.addEventListener('resize', ()=>{updateSD(false)});
 sb.addEventListener("focus", (event) => {
    const target1 = event.target;
    if (!target1.value || target1.value != '') {
        target1.placeholder = '|';
        sbi = setInterval(()=>{
            target1.placeholder = target1.placeholder == '|' ? '' : '|';
        },500);
    }
 });
 sb.addEventListener("blur", (event) => {
    event.target.placeholder = sbdp;
    if (sbi) {
        clearInterval(sbi);
    }
 });
 wndw_.addEventListener('keydown', (key)=>{
    if (key["key"] === 'REPLACE_SEARCHKEY') {
        sb.focus();
        key.preventDefault();
    }
 });
 sk.addEventListener('click', ()=>{sb.focus()});

 const searchString = (str) => {
    if (!str) {
        return false;
    };
    const trimmedStr = str.trim();
    if (trimmedStr.length === 0) {
        return false;
    }
    if(/^[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]+$/.test(trimmedStr)){
        return false;
    }
    return true;
 };
 let lastst = false;
 sb.addEventListener("input", async () => {
    const sv = sb.value;
    const st = searchString(sv);
    lastst = st;
    sd.innerHTML = '<span>Loading...</span>';
    updateSD(st);
    const pta = '<br>Please try again';
    if (st) {
        const response = await fetch(searchurl).catch((err__)=>{
            console.warn(err__);
            sd.innerHTML = `<span>Failed to fetch.${pta}</span>`;
            dcmnt.documentElement.classList.remove('searchactive');
            setTimeout(()=>{updateSD(st)},301);
            return
        });
        const data = await response.json().catch((err__)=>{
            console.warn(err__);
            sd.innerHTML = `<span>Something went wrong.${pta}</span>`;
            dcmnt.documentElement.classList.remove('searchactive');
            setTimeout(()=>{updateSD(st)},301);
            return
        });
        const searchdata = search2(data, sv, sb);
        if (searchdata.length == 0) {
            sd.innerHTML = '<span>Nothing found.</span>';
        } else {
            sd.innerHTML = '';
            dcmnt.documentElement.classList.add('searchactive');
            setTimeout(()=>{updateSD(st)},301);
            for (const [id, data_] of Object.entries(searchdata)) {
                sd.innerHTML += SETTINGS.searchV2 ?
                    `<a href="${data_[0]}" target="_self"><strong>${('REPLACE_DATAARRAY'.find(item => item[0] === data_[0]) || [])[1] || data_[0]}</strong><span>${data_[1].replaceAll('/n',' ').replaceAll(' - ','')}</span></a>` :
                    `<a href="${data_[0]}" target="_self">${data_[1].replaceAll('/n',' ').replaceAll(' - ','')}</a>`;
            }
        }
    } else {
        dcmnt.documentElement.classList.remove('searchactive');
        setTimeout(()=>{updateSD(st)},301);
        setTimeout(()=>{if(!lastst){updateSD(st)}},602);
    }
 });
 dcmnt.addEventListener("click", (event)=>{
    if (lastst && !dcmnt.querySelector(".navbar").contains(event.target)) {
        dcmnt.documentElement.classList.remove('searchactive');
        setTimeout(()=>{updateSD(false)},301);
    }
 });

 updateSD(false);updateMinHeight();updateWidth();fetch(searchurl);
});

CSS#search, #searchbar {
 cursor: not-allowed;
}
.searchactive {
 overflow-y: hidden;
}
.searchactive main {
 filter: blur(3px) brightness(0.8);
 -webkit-filter: blur(3px) brightness(0.8);
 pointer-events: none;
}
.searchactive #searchbar {
 position: fixed;
 top: calc(62px + 10px);
 left: 50%;
 translate: -50%;
 min-width: max-content;
 width: 70%;
}
.searchactive:not(.ios) .search {
 translate: calc(var(--sdfix) - 50%) 55px;
 transition: 0ms;
}
.searchactive .search a {
 display: flex;
 gap: 30px;
 flex-direction: row;
 flex-wrap: nowrap;
 justify-content: flex-start;
 align-items: flex-start;
}
.searchactive .search a span {
 opacity: 1;
 width: auto;
 text-align: left;
 display: flex;
 gap: 7px;
 flex-direction: row;
 justify-content: flex-end;
 align-items: flex-start;
 white-space: nowrap;
}
.searchactive .search a strong {
 display: flex;
 white-space: nowrap;
}
.searchactive .search a strong:after {
 content: '';
 position: relative;
 top: 0px;
 width: 5px;
 height: 3px;
 background-color: var(--cl);
 translate: 10px 10px;
}
.searchactive .search a span strong:after {
 display: none;
}

Python# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
#!/usr/bin/env python3
import requests
response = requests.get('https://api.github.com/repos/js-just/_just/tags', headers={'Accept': 'application/vnd.github+json'})
tags = response.json()
print(tags[0]['name'])

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
#!/bin/bash
mkdir -p latest && \
cp "LICENSE" "latest/LICENSE" && \
cp "README.md" "latest/README.md" && \
YMLTEMPLATE=$(cat "src/latest.yml") && \
chmod +x "src/latest.py" && \
LATEST=$(python3 "src/latest.py") && \
YMLCONTENT=$(echo "$YMLTEMPLATE" | sed "s/@latest/@$LATEST/") && \
YMLFIX=$(echo "$YMLCONTENT" | sed "s/@l/@latest/") && \
echo "$YMLFIX" > "latest/action.yml"

YAML# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
name: '_just@l'
description: 'Just an Ultimate Site Tool: Use latest version'
author: 'JustStudio.'
branding:
  icon: 'edit-3'
  color: 'purple'
inputs:
  path:
 description: 'Website directory (compress/generate)'
 required: false
  fix-path:
 description: 'Fix file path (generate)'
 required: false
runs:
  using: 'composite'
  steps:
 - name: Run _just
  uses: js-just/_just@latest
  with:
    path: ${{ inputs.path }}
    fix-path: ${{ inputs.fix-path }}

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

let [text] = process.argv.slice(2);
text = text.split('\n');
for (let i = 0; i < text.length; i++) {
 text[i] = text[i].replaceAll('(__REPLACE_LINE__)',`(${i+1})`);
};
console.log(text.join('\n'));

test

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

/**
 * @param {Array} array
 * @returns {Array}
 */

exports.shuffleArray = function (array) {
  for (let i = array.length - 1; i > 0; i--) {
 const j = Math.floor(Math.random() * (i + 1));
 [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

test

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

/**
 * @param {string} cssText
 * @returns {Array}
 */

exports.JSON = function(cssText) {
  const cleanedCSS = cssText.replace(/\/\*[\s\S]*?\*\//g, '');
  let index = 0;
  let ruleid = 0;
  const length = cleanedCSS.length;
  function skipWhitespace() {
 while (index < length && /\s/.test(cleanedCSS[index])) index++;
  }
  function peek() {
 return cleanedCSS[index];
  }
  function consume() {
 return cleanedCSS[index++];
  }
  const stack = [];
  const rules = [];
  while (index < length) {
 skipWhitespace();

 if (index >= length) break;

 const char = peek();

 if (char === '}') {
  index++;
  if (stack.length > 0) stack.pop();
  continue;
 }

 if (char === '@') {
  rules.push(parseAtRule());
 } else {
  rules.push(parseSelectorOrNested());
 }
  }
  function parseAtRule() {
 let start = index;
 while (index < length && cleanedCSS[index] !== '{' && cleanedCSS[index] !== ';') {
  index++;
 }
 const atRuleHeader = cleanedCSS.slice(start, index).trim();

 if (cleanedCSS[index] === '{') {
  index++;
  const nestedRules = [];
  stack.push({ type: 'at-rule', name: atRuleHeader, rules: nestedRules, id: ruleid++ });
  
  while (index < length) {
    skipWhitespace();
    if (peek() === '}') {
      index++;
      break;
    }
    nestedRules.push(parseSelectorOrNested());
  }
  
  return { type: 'at-rule', name: atRuleHeader, rules: nestedRules, id: ruleid++ };
  
 } else if (cleanedCSS[index] === ';') {
  index++;
  return { type: 'at-rule', name: atRuleHeader, rules: [], id: ruleid++ };
 }
 
 return { type: 'at-rule', name: atRuleHeader, rules: [], id: ruleid++ };
  }
  function parseSelectorOrNested() {
 let start = index;
 while (
  index < length &&
  cleanedCSS[index] !== '{' &&
  cleanedCSS[index] !== '}'
 ) {
  index++;
 }
 
 const selectorText = cleanedCSS.slice(start, index).trim();

 if (cleanedCSS[index] === '{') {
  index++;
  
  skipWhitespace();

  if (/^[.#a-zA-Z0-9\-\s,:()%*\+<>_]+$/.test(selectorText)) {
    const selectors = selectorText.split(',').map(s => s.trim());
    const properties = {};
    const nestedRules = [];

    while (index < length) {
      skipWhitespace();
      if (peek() === '}') {
        index++;
        break;
      }
      
      if (peek() === '@') {
        nestedRules.push(parseAtRule());
        continue;
      }

      let propStart = index;
      while (
        index < length &&
        cleanedCSS[index] !== ';' &&
        cleanedCSS[index] !== '}'
      ) {
        index++;
      }
      
      const line = cleanedCSS.slice(propStart, index).trim();

      if (!line) break;

      if (line.includes(':')) {
        const [key, value] = line.split(':').map(s => s.trim());
        properties[key] = value;
        if (cleanedCSS[index] === ';') index++;
      } else if (cleanedCSS[index] === '}') {
        index++;
        break;
      }
    }

    return { type: 'rule', selectors, properties, nestedRules, id: ruleid++ };
    
  } else {
    return null;
  }
  
 } else {
  return null;
 }
  }
  return rules.filter(Boolean).sort((a, b) => a.id - b.id);;
}

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
#!/bin/bash
_RESET='\033[0m'
_RED='\033[0;31m'
_GREEN='\033[0;32m'
_ORANGE='\033[0;33m'
_BLUE='\033[0;34m'
_PURPLE='\033[0;35m'
_CYAN='\033[0;36m'
_LIGHTGRAY='\033[0;37m'
_DARKGRAY='\033[1;30m'
_LIGHTRED='\033[1;31m'
_LIGHTGREEN='\033[1;32m'
_YELLOW='\033[1;33m'
_LIGHTBLUE='\033[1;34m'
_LIGHTPURPLE='\033[1;35m'
_LIGHTCYAN='\033[1;36m'
_WHITE='\033[1;37m'
export _RESET
export _RED
export _GREEN
export _ORANGE
export _BLUE
export _PURPLE
export _CYAN
export _LIGHTGRAY
export _DARKGRAY
export _LIGHTRED
export _LIGHTGREEN
export _YELLOW
export _LIGHTBLUE
export _LIGHTPURPLE
export _LIGHTCYAN
export _WHITE
_LIGHTPURPLE_BG='\033[2;45m'
_ORANGE_BG='\033[2;41m'
export _LIGHTPURPLE_BG
export _ORANGE_BG

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

const { exec } = require('child_process');
const esc = '\x1B';
/**
 * @param {string} code
 * @param {string} message
 * @param {string} type
 * @returns {Promise<string>}
 */

exports.errormessage = function (code, message, type = 'Error') {
 const de = 'Debug: Error ';
 console.log(`${de}code: ${code}\n${de}type: ${type}\n${de}message: ${message}`);
 type = type == "Error" ? `${esc}[0;31m${type}` : `${esc}[0;33m${type}`;
 message = message.replaceAll('"', '\\"');
 return new Promise((resolve, reject) => {
    exec(`bash -c 'source $GITHUB_ACTION_PATH/src/modules/errmsg.sh && mkdir _just_data && echo "$(customErrorMessage "${type}" "${code}" "${message}")" > "_just_data/e.txt" && echo -e "$(customErrorMessage "${type}" "${code}" "${message}")"'`, (error, stdout, stderr) => {
    if (error) {
        exec(`bash -c 'source $GITHUB_ACTION_PATH/src/modules/errmsg.sh && mkdir _just_data && echo -e "$(customErrorMessage "${type}" "${code}" "${message}")"'`, (error2, stdout2, stderr2) => {
            if (!error2) {
                resolve(stdout2);
            } else {
                reject(`Error 1: ${stderr}, Error 2: ${stderr2}`);
            }
        })
    } else {
        resolve(stdout);
    }
    });
 });
};
exports.prefix = `${esc}[2;45m${esc}[1;30m_just${esc}[0m: `;

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
#!/bin/bash
ERRORS_FILE="$GITHUB_ACTION_PATH/data/codes.json"
source $GITHUB_ACTION_PATH/src/modules/color.sh
ERROR_PREFIX="_just"
ErrorMessage() {
 local ERROR_CODE=$2
 local ERROR_MESSAGE=${3:-$(jq -r ".[\"$1\"][] | select(.code==\"$ERROR_CODE\") | .message" "$ERRORS_FILE")}
 local ERROR_LINK=$(jq -r ".[\"$1\"][] | select(.code==\"$ERROR_CODE\") | .link" "$ERRORS_FILE")
 local ERROR_TYPE="Error"
 local ERROR_COLOR=$_RED
 local ERROR_PREFIX_COLOR=$_LIGHTRED
 if [[ $ERROR_CODE == 02* ]]; then
    ERROR_TYPE="Warning"
    ERROR_COLOR=$_YELLOW
    ERROR_PREFIX_COLOR=$_ORANGE
 fi
 echo -e "$_LIGHTPURPLE_BG$_DARKGRAY$ERROR_PREFIX$_RESET: $ERROR_PREFIX_COLOR$ERROR_TYPE $ERROR_COLOR$ERROR_CODE: $ERROR_MESSAGE $ERROR_LINK$_RESET"
}
_justMessage() {
 local MESSAGE=$1
 echo -e "$_LIGHTPURPLE_BG$_DARKGRAY$ERROR_PREFIX$_RESET:$_CYAN INFO:$_RESET$MESSAGE"
}
customErrorMessage() {
 echo -e "$_LIGHTPURPLE_BG$_DARKGRAY$ERROR_PREFIX$_RESET: $_RESET$1 $2: $3"
}
export -f ErrorMessage
export -f _justMessage
export -f customErrorMessage

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

const _just = {};
_just.number = require('./number.js');
/**
 * @param {string} code
 * @returns {{total: number, names: string[]}}
 */

exports.get = function(code) {
 const variableRegex = /\b(const|let|var)\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g;
 const functionRegex = /\bfunction\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\s*$/g;

 const variables = new Set();
 const functions = new Set();

 let match;
 while ((match = variableRegex.exec(code)) !== null) {
    variables.add(match[2]);
 }

 while ((match = functionRegex.exec(code)) !== null) {
    functions.add(match[1]);
 }

 const allNames = Array.from(new Set([...variables, ...functions])).filter(v => v != 'null');

 return {
    total: allNames.length,
    names: allNames
 };
}
/**
 * @param {string} code
 * @param {string[]} oldNames
 * @param {string[]} newNames
 * @param {string} jstrimmedstrvarbasestr
 * @returns {string}
 */

exports.set = function(code, oldNames, newNames, jstrimmedstrvarbasestr) {
 let id = 0;
 const nameMap = {};
 for (let i = 0; i < oldNames.length; i++) {
    const name_ = _just.number.convertbase(i.toString(10), 10, jstrimmedstrvarbasestr.length, jstrimmedstrvarbasestr) || i.toString(36);
    nameMap[oldNames[i]] = newNames[i] && newNames[i].trim() == '' ? `_just__${_just.number.convertbase(`${id++}`, 10, 62) || id++}` : newNames[i] || '_just_'+name_;
 }

 const lines = code.split('\n');

 id = 0;
 const processedLines = lines.map(line => {
    let inString = false;
    let stringChar = '';
    let resultLine = '';
    for (let i = 0; i < line.length; i++) {
        const char = line[i];

        if (!inString && (char === '"' || char === "'" || char === '`' ||
            (char === '(' && line[i-1] === 'n' && line[i-2] === 'r' && line[i-3] === 'u' && line[i-4] === 't' && line[i-5] === 'e' && line[i-6] === 'r') || // fix replacing null in return(null)
            (char === '}' && line.includes('`') && line.includes('<_just element="QByVmEB">57#x27;) && line.includes('{'))
        )) {
            inString = true;
            stringChar = char === '}' ? '`' : char;
            resultLine += char;
        } else if (
            inString && ((char === stringChar && line[i - 1] !== '\\') ||
            (char === '{' && line[i-1] === '<_just element="QByVmEB">57#x27; && line.includes('`')) || // `${not a string}`
            (char === '(' && line[i-1] === 't' && line[i-2] === 's' && line[i-3] === 'e' && line[i-4] === 't' && line[i-5] === '.' && line[i-6] === '/') // regex.test(not a string)
        )) {
            inString = false;
            resultLine += char;
        } else if (!inString) {
            if (/[a-zA-Z_$]/.test(char)) {
                let startIdx = i;
                let word = '';
                while (i < line.length && /[a-zA-Z0-9_$]/.test(line[i])) {
                    word += line[i];
                    i++;
                }
                i--;

                if (nameMap.hasOwnProperty(word)) {
                    resultLine += nameMap[word] != 'null' ? nameMap[word] || `_just__${_just.number.convertbase(`${id++}`, 10, 62) || id++}` || `_just___${id++}` : `_just__${_just.number.convertbase(`${id++}`, 10, 62) || id++}` || `_just___${id++}`;
                } else {
                    resultLine += word;
                }
            } else {
                resultLine += char;
            }
        } else {
            resultLine += char;
        }
    }
    return resultLine;
 });

 return processedLines.join('\n');
}
/**
 * http://jsfuck.com
 * @param {string} code
 * @returns {string}
 */

exports.fuck = function(code) {
 const SIMPLE = {
    'false':'![]',
    'true':'!![]',
 };
 const MAPPING = {
    'a':'(false+"")[1]',
    'b':'([]["entries"]()+"")[2]',
    'c':'([]["at"]+"")[3]',
    'd':'(undefined+"")[2]',
    'e':'(true+"")[3]',
    'f':'(false+"")[0]',
    'g':'(false+[0]+String)[20]',
    'h':'(+(101))["to"+String["name"]](21)[1]',
    'i':'([false]+undefined)[10]',
    'j':'([]["entries"]()+"")[3]',
    'k':'(+(20))["to"+String["name"]](21)',
    'l':'(false+"")[2]',
    'm':'(Number+"")[11]',
    'n':'(undefined+"")[1]',
    'o':'(true+[]["at"])[10]',
    'p':'(+(211))["to"+String["name"]](31)[1]',
    'q':'("")["fontcolor"]([0]+false+")[20]',
    'r':'(true+"")[1]',
    's':'(false+"")[3]',
    't':'(true+"")[0]',
    'u':'(undefined+"")[0]',
    'v':'(+(31))["to"+String["name"]](32)',
    'w':'(+(32))["to"+String["name"]](33)',
    'x':'(+(101))["to"+String["name"]](34)[1]',
    'y':'(NaN+[Infinity])[10]',
    'z':'(+(35))["to"+String["name"]](36)',

    'A':'(NaN+[]["entries"]())[11]',
    'B':'(+[]+Boolean)[10]',
    'C':'Function("return escape")()(("")["italics"]())[2]',
    'D':'Function("return escape")()([]["at"])["at"]("-1")',
    'E':'(RegExp+"")[12]',
    'F':'(+[]+Function)[10]',
    'G':'(false+Function("return Date")()())[30]',
    'H':null,
    'I':'(Infinity+"")[0]',
    'J':null,
    'K':null,
    'L':null,
    'M':'(true+Function("return Date")()())[30]',
    'N':'(NaN+"")[0]',
    'O':null,
    'P':null,
    'Q':null,
    'R':'(+[]+RegExp)[10]',
    'S':'(+[]+String)[10]',
    'T':'(NaN+Function("return Date")()())[30]',
    'U':null,
    'V':null,
    'W':null,
    'X':null,
    'Y':null,
    'Z':null,

    ' ':'(NaN+[]["at"])[11]',
    '!':null,
    '"':'("")["fontcolor"]()[12]',
    '#':null,
    '<_just element="QByVmEB">57#x27;:null,
    '%':'Function("return escape")()([]["at"])[22]',
    '&':'("")["fontcolor"](")[13]',
    '\'':null,
    '(':'([]["at"]+"")[11]',
    ')':'(""+[]["at"])[12]',
    '*':null,
    '+':'(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[2]',
    ',':'[[]]["concat"]([[]])+""',
    '-':'(+(.+[0000001])+"")[2]',
    '.':'(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]',
    '/':'(false+[0])["italics"]()[10]',
    ':':'(RegExp()+"")[3]',
    ';':'("")["fontcolor"](NaN+")[21]',
    '<':'("")["italics"]()[0]',
    '=':'("")["fontcolor"]()[11]',
    '>':'("")["italics"]()[2]',
    '?':'(RegExp()+"")[2]',
    '@':null,
    '[':'([]["entries"]()+"")[0]',
    '\\':'(RegExp("/")+"")[1]',
    ']':'([]["entries"]()+"")[22]',
    '^':null,
    '_':null,
    '`':null,
    '{':'([0]+false+[]["at"])[20]',
    '|':null,
    '}':'([]["at"]+"")["at"]("-1")',
    '~':null
 };
 return code
    .replaceAll(' = true;', `=${SIMPLE.true};`)
    .replace('return true;', `return${SIMPLE.true};`)
    .replaceAll('false',SIMPLE.false)
    .replace(" = 'p' + ", ` = ${MAPPING['p']} + `)
    .replaceAll("('s' + ", `(${MAPPING['s'].replace('false',SIMPLE.false)} + `)
    .replaceAll("'t'", MAPPING['t'].replace('true',SIMPLE.true))
}

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

exports.line = function() {
 return new Error().stack.match(/(?:.*:){1}([^:]+):[^:]*$/)[1];
}
/**
 * @param {string} str
 * @returns {string}
 */

exports.err = function(str) {
 str = `${str}`;
 if (str.startsWith('Error:')) {
    str = str.replace('Error:', '')
 }
 return str.replace(/\n{2,50}/g, '').replaceAll('\n', ' ').trim()
}

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

const convertbasedigits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/";
/**
 * This is a modified https://stackoverflow.com/a/55011290 code. https://stackoverflow.com/a/55011290 -
 * by Slavik Meltser (https://stackoverflow.com/users/1291121/slavik-meltser) -
 * a modified https://www.danvk.org/hex2dec.html code.
 * @param {string} str
 * @param {number} fromBase
 * @param {number} toBase
 * @param {string?} DIGITS
 * @returns {string}
 */

exports.convertbase = function (str, fromBase, toBase, DIGITS = convertbasedigits) {

 const add = (x, y, base) => {
    let z = [];
    const n = Math.max(x.length, y.length);
    let carry = 0;
    let i = 0;
    while (i < n || carry) {
        const xi = i < x.length ? x[i] : 0;
        const yi = i < y.length ? y[i] : 0;
        const zi = carry + xi + yi;
        z.push(zi % base);
        carry = Math.floor(zi / base);
        i++;
    }
    return z;
 }

 const multiplyByNumber = (num, x, base) => {
    if (num < 0) return null;
    if (num == 0) return [];

    let result = [];
    let power = x;
    while (true) {
        num & 1 && (result = add(result, power, base));
        num = num >> 1;
        if (num === 0) break;
        power = add(power, power, base);
    }

    return result;
 }

 const parseToDigitsArray = (str, base) => {
    const digits = str.split('');
    let arr = [];
    for (let i = digits.length - 1; i >= 0; i--) {
        const n = DIGITS.indexOf(digits[i])
        if (n == -1) return null;
        arr.push(n);
    }
    return arr;
 }

 const digits = parseToDigitsArray(str, fromBase);
 if (digits === null) return null;

 let outArray = [];
 let power = [1];
 for (let i = 0; i < digits.length; i++) {
    digits[i] && (outArray = add(outArray, multiplyByNumber(digits[i], power, toBase), toBase));
    power = multiplyByNumber(fromBase, power, toBase);
 }

 let out = '';
 for (let i = outArray.length - 1; i >= 0; i--)
    out += DIGITS[outArray[i]];

 return out;
}
exports.convertbasedigits = convertbasedigits;

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

const _just = {};
_just.error = require('./errmsg.js');
_just.string = require('./string.js');
const apis = {};
apis["is-a.dev"] = 'https://raw.is-a.dev/v2.json';
const warn_ = (d, e) => {
 console.warn(`${_just.error.prefix}Warning 0206: Failed to fetch "${apis[d]}": ${e}`);
}
/**
 * @param {string} domain
 * @param {number} attempt
 */

exports["is-a.dev"] = async function (domain, attempt = 0) {
 attempt++;
 let success = false;
 let exist = false;
 try {
    const response = await fetch(apis["is-a.dev"]).catch(async(error)=>{
        if (attempt < 5) {
            await exports["is-a.dev"](domain, attempt);
        } else {
            warn_("is-a.dev", error)
        }
    });
    const data = (await response.json()).filter(d => !d.reserved);
    
    const domains = data.map((item, index) => {return item.domain});
    exist = domains.includes(domain);
    success = true;
 } catch (error) {
    if (attempt < 5) {
        await exports["is-a.dev"](domain, attempt);
    } else {
        warn_("is-a.dev", error)
    }
 }
 if (success && !exist) {
    _just.error.errormessage('0123', `Subdomain "${_just.string.removeLast(domain, '.is-a.dev')}" is not registered on "is-a.dev".`).then((errmsg)=>{throw new Error(errmsg)});
 }
}

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

/**
 * @param {string} input
 * @param {string} removeThis
 * @returns {string}
 */

exports.removeLast = function (input, removeThis) {
 return `${input}`
    .split('').reverse().join('')
    .replace(
        `${removeThis}`.split('').reverse().join(''),
        '')
    .split('').reverse().join('');
}
/**
 * @param {number} bytes
 * @returns {string}
 */

exports.fileSize = function (bytes) {
 if (bytes <= 1024) {
    return `${bytes}B`;
 } else if (bytes <= 1024**2) {
    return `${Math.ceil(( bytes / 1024 ) * 100) / 100}KB`;
 } else if (bytes <= 1024**3) {
    return `${Math.ceil(( bytes / ( 1024**2 ) ) * 100) / 100}MB`;
 } else if (bytes <= 1024**4) {
    return `${Math.ceil(( bytes / ( 1024**3 ) ) * 100) / 100}GB`;
 } else if (bytes <= 1024**5) {
    return `${Math.ceil(( bytes / ( 1024**4 ) ) * 100) / 100}TB`;
 }
}
exports.runnerPath = function (input = '') {
 const GitHubRunner = '/home/runner/work'
 if (input.startsWith(GitHubRunner)) {
    input = input.replace(GitHubRunner, '_just')
 }
 return input
}
/**
 * @param {string} str
 * @returns {string}
 */

exports.shuffleString = function (str) {
  const arr = str.split('');
  for (let i = arr.length - 1; i > 0; i--) {
 const j = Math.floor(Math.random() * (i + 1));
 [arr[i], arr[j]] = [arr[j], arr[i]];
  }
  return arr.join('');
}
/**
 * @param {string} str
 * @returns {string}
 */

exports.Aa = function (str) {
 return String(str).charAt(0).toUpperCase() + String(str).slice(1);
}
/**
 * @param {string} str
 * @param {boolean?} spaces
 * @returns {string}
 */

exports.toText = function (str, spaces = false) {
 if (str.endsWith(':')) str = str.slice(0,-1)
 else if (str.endsWith('?')) str = str.slice(0,-1);
 return spaces ? str.replaceAll('_', ' ').replaceAll('-', ' ') : str;
}

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
#!/bin/bash
generate_strings() {
 local count=$1
 local length=$2
 local chars="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890-_"
 for ((i=0; i<count; i++)); do
    local random_string=""
    for ((j=0; j<length; j++)); do
        random_string+="${chars:RANDOM%32:1}"
    done
    echo "$random_string"
 done
}
export -f generate_strings

test

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
# Generate Build Map/Manifest
BUILD_ID=$(cat .next/BUILD_ID)
mkdir -p deploy/_just/static/
mkdir -p deploy/_just/static/$BUILD_ID/
mkdir -p deploy/_just/static/chunks/
source $GITHUB_ACTION_PATH/src/modules/string.sh
random_strings=($(generate_strings 1 16))
clearCache_name=${random_strings[0]}c
echo "[" > deploy/api/build-manifest
echo "" > deploy/api/build-manifest.txt
echo "[" > deploy/api/_just_build-manifest
echo "" > deploy/api/_just_build-manifest.txt
echo "$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/buildManifest_start.js)" > deploy/_just/static/$BUILD_ID/buildManifest.js
echo "$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/_justManifest_start.js)" > deploy/_just/static/$BUILD_ID/_justManifest.js
echo "$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/clearCache.js)" > deploy/_just/static/chunks/$clearCache_name.js
find _just_data -mindepth 1 -print | while read -r path; do
 relative_path=${path#_just_data/}
 first_line=$(head -n 1 "$path")
 if [ -f "$path" ]; then
    if [[ "$first_line" != "// _just hide" ||
        "$first_line" != "// _just doNotModify+hide" ]]; then
        echo " _just_Manifest0.push(\"$relative_path\");" >> deploy/_just/static/$BUILD_ID/_justManifest.js
        echo "\"$relative_path\"," >> deploy/api/_just_build-manifest
        echo "$relative_path" >> deploy/api/_just_build-manifest.txt
    fi
 fi
done
function human_readable_size {
 local size=$1
 if [ "$size" -ge 1073741824 ]; then
    echo "$(bc <<< "scale=2; $size/1073741824") GB"
 elif [ "$size" -ge 1048576 ]; then
    echo "$(bc <<< "scale=2; $size/1048576") MB"
 elif [ "$size" -ge 1024 ]; then
    echo "$(bc <<< "scale=2; $size/1024") KB"
 else
    echo "$size B"
 fi
}
echo -e "\n----------------\n\nBuild Map:\n"
FILE_ID=1
TOTAL_FILES=$(find deploy -mindepth 1 -print | wc -l)
TOTAL_SIZE=0
find deploy -mindepth 1 -print | while read -r path; do
 relative_path=${path#deploy/}
 first_line=$(head -n 1 "$path")
 if [ -f "$path" ]; then
    case "${path##*.}" in
        
        # Website files (idk how to name them)
        html) type="HTML" ;;
        php) type="PHP" ;;
        css) type="CSS" ;;
        js) type="JavaScript" ;;
        json) type="JSON" ;;
        txt) type="Text" ;;
        xml) type="XML" ;;
        webmanifest) type="Webmanifest" ;;

        # Media
        png) type="Image/Png" ;;
        svg) type="Image/SVG" ;;
        jpeg|jpg) type="Image/Jpeg" ;;
        webp) type="Image/Webp" ;;
        bmp) type="Image/Bmp" ;;
        gif) type="Image/GIF" ;;
        heic) type="Image/HEIC" ;;
        ico) type="Favicon" ;;
        mp4) type="Video/MP4" ;;
        mov) type="Video/Mov" ;;
        webm) type="Video/Webm" ;;
        m4a) type="Audio/M4A" ;;
        mp2) type="Audio/MP2" ;;
        mp3) type="Audio/MP3" ;;
        ogg) type="Audio/OGG" ;;
        wav) type="Audio/WAV" ;;
        wma) type="Audio/WMA" ;;

        # Fonts
        otf) type="Font/OTF" ;;
        woff) type="Font/WOFF" ;;
        woff2) type="Font/WOFF2" ;;

        # Archive
        7z) type="Archive/7z" ;;
        tar) type="Archive/TAR" ;;
        rar) type="Archive/RAR" ;;
        zip) type="Archive/ZIP" ;;
        
        # Todo: more files support
        *) type="Other" ;;

    esac
    file_size=$(stat -c%s "$path")
    TOTAL_SIZE=$((TOTAL_SIZE + $((file_size))))

    if [ "$FILE_ID" -eq 1 ]; then
        printf "┌ %s | %s\n" "$(human_readable_size $file_size)" "$relative_path"
    elif [ "$FILE_ID" -eq "$TOTAL_FILES" ]; then
        printf "└ %s | %s\n" "$(human_readable_size $file_size)" "$relative_path"
    else
        printf "├ %s | %s\n" "$(human_readable_size $file_size)" "$relative_path"
    fi
    
    if [[ "$first_line" != "// _just hide" ||
        "$first_line" != "// _just doNotModify+hide" ]]; then
        buildManifestJSONString="{\"type\": \"$type\", \"path\": \"$relative_path\", \"size\": {\"bytes\": $file_size, \"string\": \"$(human_readable_size $file_size)\"}}"
        echo " _just_buildManifest0.push($buildManifestJSONString);" >> deploy/_just/static/$BUILD_ID/buildManifest.js
        echo "$buildManifestJSONString," >> deploy/api/build-manifest
        echo "($type) $relative_path - $(human_readable_size $file_size)" >> deploy/api/build-manifest.txt
    fi
 fi
 
 FILE_ID=$((FILE_ID + 1))
done
manifest_size=$(stat -c%s "deploy/_just/static/$BUILD_ID/buildManifest.js")
echo -e "End Build Map\n\n"
echo -e "_just/static/$BUILD_ID/buildManifest.js size: $(human_readable_size $manifest_size)\n"
echo -e " Total build size: $(human_readable_size $TOTAL_SIZE)\n\n"
echo -e "----------------\n"
echo "$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/buildManifest_end.js)" >> deploy/_just/static/$BUILD_ID/buildManifest.js
echo "$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/_justManifest_end.js)" >> deploy/_just/static/$BUILD_ID/_justManifest.js
for html_file in deploy/*.html; do
 sed -i.bak '/^[[:space:]]*<\/body>[[:space:]]*$/d' "$html_file"
 sed -i.bak '/^[[:space:]]*<\/html>[[:space:]]*$/d' "$html_file"
 
 echo "<script src=\"_just/static/$BUILD_ID/buildManifest.js\"></script>" >> "$html_file"
 echo "<script src=\"_just/static/$BUILD_ID/_justManifest.js\"></script>" >> "$html_file"
 echo "<script src=\"_just/static/chunks/$clearCache_name.js\"></script>" >> "$html_file"
 
 echo "</body>" >> "$html_file"
 echo "</html>" >> "$html_file"
done
echo "{}]" >> deploy/api/build-manifest
echo "" >> deploy/api/build-manifest.txt
echo "\"\"]" >> deploy/api/_just_build-manifest
echo "" >> deploy/api/_just_build-manifest.txt
cp deploy/api/_just_build-manifest deploy/api/_just_build-manifest.json
cp deploy/api/build-manifest deploy/api/build-manifest.json

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
# Directory & File Checks
for dir in "_just" "_just/js" "_just/style"; do
  if [ ! -d "$dir" ]; then
 echo -e "\n----------------\n\n_just Checks:\n"
 echo " $( [ -d "_just" ] && echo "✓" || echo "✕" ) (root)/_just/"
 echo " $( [ -d "_just/js" ] && echo "✓" || echo "✕" ) (root)/_just/js/"
 echo " $( [ -d "_just/style" ] && echo "✓" || echo "✕" ) (root)/_just/style/"
 echo -e " ? (root)/_just/404.html\n"
 echo -e "End _just Checks\n"
 echo -e "----------------\n"
 echo "The $dir directory is missing." >&2
 exit 1
  fi
done
if [ ! -f "_just/404.html" ]; then
  echo -e "\n----------------\n\n_just Checks:\n"
  echo " ✓ (root)/_just/"
  echo " ✓ (root)/_just/js/"
  echo " ✓ (root)/_just/style/"
  echo -e " ✕ (root)/_just/404.html\n"
  echo -e "End _just Checks\n"
  echo -e "----------------\n"
  echo "0101" >&2
  exit 1
fi
echo -e "\n----------------\n\n_just Checks:\n"
echo " ✓ (root)/_just/"
echo " ✓ (root)/_just/js/"
echo " ✓ (root)/_just/style/"
echo -e " ✓ (root)/_just/404.html\n"
echo -e "End _just Checks\n"
echo -e "----------------\n"

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
# API Endpoints
source $GITHUB_ACTION_PATH/src/modules/errmsg.sh
if [ -d "deploy/api" ]; then
  local ERROR_MESSAGE=$(ErrorMessage "postprocessor/create_api_endpoints.sh" "0102")
  echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
mkdir -p deploy/api/
BUILD_ID=$(cat .next/BUILD_ID)
echo "$BUILD_ID" > deploy/api/build-id
echo "$BUILD_ID" > deploy/api/build-id.txt
echo "{\"BUILD_ID\": \"$BUILD_ID\"}" > deploy/api/build-id.json
cp .next/build-manifest.json deploy/api/next_build-manifest
cp .next/build-manifest.json deploy/api/next_build-manifest.json
cp .next/build-manifest.json deploy/api/next_build-manifest.txt

test

JavaScriptwindow._just_Manifest = _just_Manifest0;

JavaScriptconst _just_Manifest0 = [];

JavaScriptwindow._just_buildManifest = _just_buildManifest0;
/* Example usage:

let buildManifestString = '';
const pathToCurrentSite = `${window.location.protocol}//${window.location.hostname}`
_just_Manifest.forEach((item) => {
 buildManifestString += `\n${pathToCurrentSite}/${item.path} - ${item.type} - ${item.size.string}`
})
console.log(`%c${buildManifestString}`, `color: #6e3bf3; background-color: #161616; padding-left: 5px; padding-right: 5px; border-radius: 5px;`);

*/


JavaScriptconst _just_buildManifest0 = [];

JavaScripttry {
 window._just_Manifest.forEach(item => {
    const url = `${window.location.protocol}//${window.location.hostname}/${item}`;
    if (caches) {
        caches.keys().then(cacheNames => {
            cacheNames.forEach(cacheName => {
                caches.open(cacheName).then(cache => {
                    cache.match(url).then(response => {
                        if (response) {
                            cache.delete(url);
                        }
                    });
                });
            });
        });
    }
 });
} catch {
 document.body.innerHTML = `<iframe src="/_just/e"></iframe>`;
 console.error('_just error: it looks like your website\'s scripts override window._just_Manifest.')
}

HTML<!-- This website uses _just postprocessor /-->
<!-- Learn more here:(WEBSITE COMING SOON) /-->

CSSiframe[src="/_just/e"] {
 position: fixed;
 z-index: 10000;
 top: 0px;
 left: 0px;
 width: 100%;
 height: 100%;
}
body:has(iframe[src="/_just/e"]), html:has(iframe[src="/_just/e"]) {
 overflow: hidden !important;
}

HTML<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width">
<title>_just error</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"><meta charset="utf-8"><style>
@import url('https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&family=Roboto:ital,wght@0,100..900;1,100..900&family=Rubik:ital,wght@0,300..900;1,300..900&display=swap');
        html {
            line-height: 1.15;
            font-family: "Rubik";
            font-size: 16px;
            scroll-behavior: smooth
        }
        body {
            margin: 0;
            font-weight: 400;
            font-style: normal;
            text-decoration: none;
            text-transform: none;
            letter-spacing: normal;
            line-height: 1.15;
            background: #161616;
        }
        * {
            box-sizing: border-box;
            border-width: 0;
            border-style: solid;
            -webkit-font-smoothing: antialiased;
        }
        .home-container.just_ {
            width: 100%;
            display: -webkit-box;
            display: -webkit-flex;
            display: -moz-box;
            display: -ms-flexbox;
            display: flex;
            min-height: 100vh;
            -webkit-box-align: center;
            -webkit-align-items: center;
            -moz-box-align: center;
            -ms-flex-align: center;
            align-items: center;
            -webkit-box-orient: vertical;
            -webkit-box-direction: normal;
            -webkit-flex-direction: column;
            -moz-box-orient: vertical;
            -moz-box-direction: normal;
            -ms-flex-direction: column;
            flex-direction: column;
            -webkit-box-pack: center;
            -webkit-justify-content: center;
            -moz-box-pack: center;
            -ms-flex-pack: center;
            justify-content: center;
            background-image: -webkit-linear-gradient(left,rgba(0,0,0,.72)0%,rgba(0,0,0,.8)100%),-webkit-linear-gradient(315deg,rgb(0,25,136)1%,rgb(125,10,242)99%);
            background-image: -moz-linear-gradient(left,rgba(0,0,0,.72)0%,rgba(0,0,0,.8)100%),-moz-linear-gradient(315deg,rgb(0,25,136)1%,rgb(125,10,242)99%);
            background-image: -o-linear-gradient(left,rgba(0,0,0,.72)0%,rgba(0,0,0,.8)100%),-o-linear-gradient(315deg,rgb(0,25,136)1%,rgb(125,10,242)99%);
            background-image: linear-gradient(90deg,rgba(0,0,0,.72)0%,rgba(0,0,0,.8)100%),linear-gradient(135deg,rgb(0,25,136)1%,rgb(125,10,242)99%)
        }
        ._just {
            scale: 0.98;
            border-radius: 50px;
            overflow: hidden;
            box-shadow: 0px 0px 20px 0px #000000c4;
        }
        .home-name.just_ {
            color: rgb(255,255,255);
            font-size: 50px;
            font-family: "Rubik"
        }

        .home-text1.just_ {
            color: rgb(255,255,255);
            font-size: 1.5em;font-family: "Rubik"
        }

        .home-text2.just_ {
            color: rgb(255,255,255);
            font-size: 16px;font-family: "Rubik"
        }
</style></head><body>
<div class="_just"><div class="just_ home-container"><span class="just_ home-name"><span class="just_">
<span>Uh Oh!</span>
</span></span><h1 class="just_ home-text1"><span class="just_">
<span>_just error: a client-side exception has occurred.</span>
</span></h1><span class="just_ home-text2"><span class="just_">
<span>See the browser console for more information.</span>
</span></span></div></div><script>document.ondragstart=noselect;document.onselectstart=noselect;document.oncontextmenu=noselect;function noselect(){return false;}</script></body></html>

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
# Modify Deployment
source $GITHUB_ACTION_PATH/src/modules/errmsg.sh
if [ -d "deploy/_just" ]; then
  local ERROR_MESSAGE=$(ErrorMessage "postprocessor/modify_deployment.sh" "0103")
  echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
mkdir -p deploy/_just/
if [ -d "_just/dangerously-insert-files/_just" ]; then
  local ERROR_MESSAGE=$(ErrorMessage "postprocessor/modify_deployment.sh" "0104")
  echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
if [ -d "_just/dangerously-insert-files/_next" ]; then
  local ERROR_MESSAGE=$(ErrorMessage "postprocessor/modify_deployment.sh" "0105")
  echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
echo -e "\n----------------\n\n_just Chunks:\n"
source $GITHUB_ACTION_PATH/src/modules/string.sh
mkdir -p _just/dangerously-insert-files/_just/
merged_data=($(generate_strings 1 16))
merged_name=${merged_data[0]}
mkdir -p _just/dangerously-insert-files/_just/$merged_name/
merged_file="_just/dangerously-insert-files/_just/$merged_name/merged.js"
> "$merged_file"
for file in _just/js/*; do
  file_size=$(stat -c%s "$file")
  if [[ $file_size -gt 51200 ]]; then
 cat "$file" >> "$merged_file"
 echo -e "\n" >> "$merged_file"
  fi
done
while [[ $(stat -c%s "$merged_file") -lt 131072 ]]; do
  largest_file=$(ls -S _just/js/* | head -n 1)
  if [[ -z "$largest_file" ]]; then
 break
  fi
  if grep -q "$(basename "$largest_file")" "$merged_file"; then
 sed -i "/$(basename "$largest_file")/d" "$merged_file"
  else
 break
  fi
done
for file in _just/js/*; do
  first_line=$(head -n 1 "$file")
  if [[ $first_line == "// _just ignore"* ]]; then
 continue
  fi
  if [[ ! -f "$merged_file" || $(stat -c%s "$merged_file") -lt 131072 ]]; then
 cp "$file" "_just/js/$(basename "$file")"
  fi
done
mkdir -p _just_data/_just/
TOTAL_FILES_JS=0
for file in _just/js/*; do
  TOTAL_FILES_JS=$((TOTAL_FILES_JS + 1))
done
random_strings_js=($(generate_strings $TOTAL_FILES_JS 14))
FILE_ID=1
for file in _just/js/*; do
  first_line=$(head -n 1 "$file")
  if [[ $first_line == "// _just ignore"* ]]; then
 continue
  fi
  FILE_ID_M1=$((FILE_ID - 1))
  FILE_NAME=${random_strings_js[$FILE_ID_M1]}
  cp "$file" "deploy/_just/${FILE_NAME}${FILE_ID}.js"
  cp "$file" "_just_data/_just/${FILE_NAME}${FILE_ID}.js"
  echo "_just/${FILE_NAME}${FILE_ID}.js"
  FILE_ID=$((FILE_ID + 1))
done
TOTAL_FILES_CSS=0
for file in _just/style/*; do
  TOTAL_FILES_CSS=$((TOTAL_FILES_CSS + 1))
done
random_strings_css=($(generate_strings $TOTAL_FILES_CSS 14))
FILE_ID=1
for file in _just/style/*; do
  FILE_ID_M1=$((FILE_ID - 1))
  FILE_NAME=${random_strings_css[$FILE_ID_M1]}
  cp "$file" "deploy/_just/${FILE_NAME}${FILE_ID}.css"
  cp "$file" "_just_data/_just/${FILE_NAME}${FILE_ID}.css"
  echo "_just/${FILE_NAME}${FILE_ID}.css"
  FILE_ID=$((FILE_ID + 1))
done
echo -e "\nEnd _just Chunks\n"
echo -e "----------------\n"
echo -e "\n----------------\n\nDangerously Inserted Files:\n"
find _just/dangerously-insert-files/ -type f | while read -r file; do
  relative_path="${file#_just/dangerously-insert-files/}"
  target_dir="deploy/$(dirname "$relative_path")"
  target_dir2="_just_data/$(dirname "$relative_path")"
  mkdir -p "$target_dir"
  mkdir -p "$target_dir2"
  if [ -f "$target_dir/$(basename "$file")" ]; then
 echo "Warning: Failed to insert file \"$target_dir/$(basename "$file")\"."
  fi
  if [ ! -f "$target_dir/$(basename "$file")" ]; then
 cp "$file" "$target_dir/$(basename "$file")"
 cp "$file" "$target_dir2/$(basename "$file")"
 echo "$target_dir/$(basename "$file")"
  fi
done
echo -e "\nEnd Dangerously Inserted Files\n"
echo -e "----------------\n"

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
# Override Deployment
source $GITHUB_ACTION_PATH/src/modules/errmsg.sh
find deploy -type f -name "*.html" | while read -r html_file; do
  for js_file in deploy/_just/*.js; do
 first_line=$(head -n 1 "$js_file")
 if [[ "$first_line" == "// _just doNotInsert" ||
      "$first_line" == "// _just hide" ||
      "$first_line" == "// _just doNotModify+doNotInsert" ||
      "$first_line" == "// _just doNotModify+hide" ]]; then
  continue
 fi
 echo "<script src=\"/_just/$(basename "$js_file")\"></script>" >> "$html_file" # Insert js files as <script src="PATH TO FILE" />
  done
  for css_file in deploy/_just/*.css; do
 echo "<link href=\"/_just/$(basename "$css_file")\" rel=\"stylesheet\">" >> "$html_file" # Insert css files as <link href="PATH TO FILE" rel="stylesheet" />
  done
  echo "<link href=\"/_just/e.css\" rel=\"stylesheet\">" >> "$html_file"
  echo "$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/comment.html)" >> "$html_file"
  sed -i '/<\/head>/i\ '"$(cat "$html_file")" "$html_file"
done
if [ -f "deploy/404.html" ]; then
  local ERROR_MESSAGE=$(ErrorMessage "postprocessor/override_deployment.sh" "0202")
  echo -e "$ERROR_MESSAGE"
fi
if [ ! -f "deploy/404.html" ]; then
  cp _just/404.html deploy/404.html
fi
echo "$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/error.html)" > deploy/_just/e.html
echo "$(cat $GITHUB_ACTION_PATH/src/postprocessor/insert/error.css)" > deploy/_just/e.css

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
# Prepare Deployment
cp -r .next/server/pages/* deploy/
mkdir -p deploy/_next/static/
cp -r .next/static/* deploy/_next/static/
if [ -f ".next/server/pages/en.html" ]; then
  cp .next/server/pages/en.html deploy/index.html
fi

test

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
#!/bin/bash
source $GITHUB_ACTION_PATH/src/modules/errmsg.sh
source $GITHUB_ACTION_PATH/src/modules/color.sh
config=$(cat just.config.json)
redirect_config_=$(echo "$config" | jq -r '.redirect_config')
if ! echo "$config" | jq -e '.redirect_config' > /dev/null; then
 local ERROR_MESSAGE=$(ErrorMessage "redirect/checks.sh" "0117")
 echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
validate_redirect_config() {
 if ! echo "$config" | jq -e '.redirect_config.url' > /dev/null; then
    local ERROR_MESSAGE=$(ErrorMessage "redirect/checks.sh" "0114")
    echo -e "::error::$ERROR_MESSAGE" && exit 1
 fi
}
validate_paths() {
 local paths=$(echo "$config" | jq -c '.redirect_config.paths[]?')
 if [[ -n "$paths" ]]; then
    local countt=0
    for path in $paths; do
        if ! echo "$path" | jq -e '.url' > /dev/null; then
            local ERROR_MESSAGE=$(customErrorMessage "Error" "0115" "Missing \"url\" in item #$countt in \"paths\" in \"redirect_config\" in \"module.exports\" at \"just.config.js\" file.")
            echo -e "::error::$_RED$ERROR_MESSAGE$_RESET" && exit 1
        fi

        if ! echo "$path" | jq -e '.path_' > /dev/null; then
            local ERROR_MESSAGE=$(customErrorMessage "Error" "0116" "Missing \"path_\" in item #$countt in \"paths\" in \"redirect_config\" in \"module.exports\" at \"just.config.js\" file.")
            echo -e "::error::$_RED$ERROR_MESSAGE$_RESET" && exit 1
        fi

        countt=$((countt + 1))
    done
 fi
}
validate_redirect_config
validate_paths

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

const template = {
 "title": (url) => `Redirecting to ${url}...`,
 "viewport": "width=device-width, initial-scale=1.0",
 "twitter": "summary_large_image"
}
const fs = require('fs');
const path = require('path');
const compress = (string) => string.replaceAll(`\n`,'').replaceAll(' ','');
const filter = (input) => input ? input.replace(/[^a-zA-Z0-9]/g, (char) => `&#${char.charCodeAt(0)};`) : undefined;
const config = JSON.parse(fs.readFileSync('just.config.json', 'utf-8'));
const redirectConfig = config.redirect_config;
const cssContent = compress(fs.readFileSync(path.join(__dirname, 'style.css'), 'utf-8'));
fs.writeFileSync(`deploy/_just/style.css`, cssContent);
const generatePage = (url, params, path_) => {
 const URL = compress(`${url}`);
 const PATH = (path_) => {
    let output = compress(`${path_}`).toLowerCase();
    if (output.startsWith('/')) {
        output = output.slice(1);
    }
    if (output.endsWith('/')) {
        output += 'index';
    }
    return output;
 }

 const tempTitle = template.title(URL);
 const tempViewport = template.viewport;

 const title = params ? params.title || tempTitle : tempTitle;
 const description = params ? params.description || undefined : undefined;
 const metaKeywords = params ? params.keywords || undefined : undefined;
 const lang = params ? params.htmlLang || undefined : undefined;
 const robots = params ? params.robots || undefined : undefined;
 const charset = params ? params.charset || "UTF-8" : "UTF-8";
 const viewport = params ? params.viewport || tempViewport : tempViewport;

 const text1 = params && params.content ? filter(params.content.text1) || undefined : undefined;
 const text2 = params && params.content ? filter(params.content.text2) || undefined : undefined;
 const text3 = params && params.content ? filter(params.content.text3) || undefined : undefined;
 
 const ogTitle = params && params.og ? params.og.title || title : title;
 const ogDescription = params && params.og ? params.og.description || description : description;
 
 const twitterCard = params && params.twitter ? params.twitter.card || template.twitter : template.twitter;

 const yandexVerification = params ? params.yandex || undefined : undefined;

 const googleAnalytics = params ? params.googleAnalytics || undefined : undefined;
 const googleVerification = params ? params.google || undefined : undefined;

 const page = path_ ? PATH() : "index";
 const keywords = metaKeywords ? `<meta name="keywords" content="${metaKeywords}">` : '';
 const htmlLang = lang ? ` lang="${`${lang}`.toLowerCase()}"` : '';
 const optionalstuff = () => {
    let output = '';
    if (yandexVerification) {
        output += `\n<meta name="yandex-verification" content="${yandexVerification}">`;
    }
    if (googleVerification) {
        output += `\n<meta name="google-site-verification" content="${googleVerification}">`;
    }
    if (googleAnalytics) {
        output += `\n<script async src="https://www.googletagmanager.com/gtag/js?id=${googleAnalytics}"></script>
                    <script>
                        window.dataLayer = window.dataLayer || [];
                        function gtag() {
                            dataLayer.push(arguments);
                        }
                        gtag('js', new Date());
                        gtag('config', '${googleAnalytics}');
                    </script>`

    }
    if (robots) {
        output += `\n<meta name="robots" content="${robots}">`
    }
    return output;
 }

 const link = `<a href="${URL}" target="_self">`;
 const meta = '<meta property=';
 const htmlContent = '<!DOCTYPE html>' + `<html${htmlLang}>` +
 '<head>' +
    `<meta http-equiv="refresh" content="0;url=${URL}">` +
    `<meta charset="${charset}">` +
    `<meta name="viewport" content="${viewport}">` +
    `<title>${title}</title>` +
    `<link rel="stylesheet" href="/_just/style.css">` +
    `${description ? `<meta name="description" content="${description}">` : ''}${keywords}` +
    `${meta}"og:type" content="website">` +
    `${meta}"twitter:card" content="${twitterCard}">` +
    `${meta}"og:title" content="${ogTitle}">` +
    `${ogDescription ? `${meta}"og:description" content="${ogDescription}">` : ''}` +
    `${meta}"og:url" content="${URL}">${optionalstuff()}` +
 '</head>' +
 '<body>' +
    `<h1>${title}</h1>` +
    '<div>' +
        `<span class="r">${text1 || `Redirecting...<br><small>to ${link}${URL}</a></small>`}</span>` +
        `<span class="d">${text2 || "Didn't get redirected?"} ${link}${text3 || 'Click here!'}</a></span>` +
    '</div>' +
    `<script>window.location.replace('${URL}')</script><script>window.location.href='${URL}'</script><script>window.location.assign('${URL}')</script>` +
 '</body>' +
'</html>';
 
 fs.writeFileSync(`deploy/${page}.html`, htmlContent);
};
generatePage(redirectConfig.url, redirectConfig.params);
if (redirectConfig.paths) {
 redirectConfig.paths.forEach(({ path_, url, params }) => {
    generatePage(url, params, path_);
 });
}
/*
EXAMPLE just.config.js FILE for redirect(s):
module.exports = {
 type: "redirect",
 redirect_config: {
    url: "https://justdeveloper.is-a.dev/",
    params: {
        title: "JustDeveloper",
        description: "the one who created this shi-",
        keywords: "Just, an, Ultimate, Site, Tool",
        htmlLang: "en",
        og: {
            title: "Redirect",
            description: "Hello, World!"
        },
        twitter: {
            card: "summary_large_image"
        }
    },
    paths: [
        {
            path_: "github",
            url: "https://github.com/JustDeveloper1",
            params: {
                title: "JustDeveloper",
                description: "GitHub Profile",
                keywords: "Just, Developer",
                htmlLang: "en",
                og: {
                    title: "Redirect2",
                    description: "Hello, GitHub!"
                },
                twitter: {
                    card: "summary_large_image"
                }
            }
        }
    ]
 }
}

------------------------
everything combined:
module.exports = {
 type: "redirect",
 redirect_config: {
    url: "https://justdeveloper.is-a.dev/",
    params: {
        title: "JustDeveloper",
        description: "the one who created this shi-",
        keywords: "Just, an, Ultimate, Site, Tool",
        htmlLang: "en",
        robots: "index",
        charset: "UTF-8",
        viewport: "width=device-width",
        yandex: "abc123",
        google: "abc123",
        googleAnalytics: "abc123",
        content: {
            text1: "Hello, World!",
            text2: "do not click anywhere.",
            text3: "click here!"
        },
        og: {
            title: "Redirect",
            description: "Hello, World!"
        },
        twitter: {
            card: "summary_large_image"
        }
    }
 }
}
*/


CSS@import url('https://fonts.googleapis.com/css2?family=Rubik:ital,wght@0,300..900;1,300..900&display=swap');
html {
 background-color:
#111111
;
 padding: 10px;
 display: block;
 font-family: 'Rubik';
 color:
#dddddd
;
}
a {
 color:
#dddddd
;
}
body {
 width: calc( 100% - 44px );
 height: calc( 100% - 44px );
 position: fixed;
 margin: 0px;
 padding: 10px;
 display: block;
 border-radius: 15px;
 background-color:
#222222
;
 background-image: linear-gradient(83deg,
#353535
,
#232323
);
 filter: drop-shadow(2px 4px 6px
#000000
);
 border-width: 2px;
 border-style: solid;
 border-color:
#5f5f5f
;
 -webkit-filter: drop-shadow(2px 4px 6px
#000000
);
}
div {
 position: fixed;
 top: 50%;
 left: 50%;
 translate: -50% -50%;
 display: flex;
 flex-direction: column;
 flex-wrap: nowrap;
 align-content: center;
 justify-content: center;
 align-items: center;
 gap: 10px;
}
h1 {
 display: block;
 font-size: 20px;
 margin: 0px;
 color:
#dddddd
;
 text-align: center;
}
.r {
 text-align: center;
 font-size: 18px;
}
.r small {
 font-size: 14px;
 opacity: 0.5;
}
.d a {
 filter: drop-shadow(0px 0px 7px
#dddddd99
);
 -webkit-filter: drop-shadow(0px 0px 7px
#dddddd99
);
}

Bash# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
#!/bin/bash
ERRORS_FILE="$GITHUB_ACTION_PATH/data/codes.json"
CONFIG_FILE="just.config.js"
CONFIG_DATA="just.config.json"
source $GITHUB_ACTION_PATH/src/modules/errmsg.sh
source $GITHUB_ACTION_PATH/src/modules/color.sh
if [ "$INPUT_PATH" == ""]; then
  INPUT_PATH="."
elif [ -z "$INPUT_PATH" ]; then
  INPUT_PATH="."
fi
VERSION=$(echo "$GITHUB_ACTION_PATH" | grep -oP '(?<=/v)[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?' || echo "$GITHUB_SHA")
if [[ "$VERSION" != "$GITHUB_SHA" && "$VERSION" != v* ]]; then
  VERSION="v$VERSION"
fi
msg1=$(_justMessage "$_BLUE Running$_LIGHTPURPLE Just an Ultimate Site Tool$_RESET $VERSION")
msg2=$(_justMessage "$_BLUE Installing Node.js$_RESET...")
msg3=$(_justMessage "$_BLUE Installed Node.js$_RESET")
msg4=$(_justMessage "$_GREEN Postprocessing completed$_RESET")
msg5=$(_justMessage "$_GREEN Generating completed$_RESET")
msg6=$(_justMessage "$_GREEN Compressing completed$_RESET")
msg9=$(_justMessage "$_GREEN Generating completed$_RESET")
echo -e "$msg1"
chmod +x "$GITHUB_ACTION_PATH/src/time.py" # use python to get current time in ms cuz yes
TIME0=$(python3 "$GITHUB_ACTION_PATH/src/time.py")
installNodejs() {
 echo -e "$msg2"
 local TIME1=$(python3 "$GITHUB_ACTION_PATH/src/time.py")
 if ! command -v node > /dev/null; then # attempt 0: nodejs installed before running _just
    # attempt 1: install via curl
    sudo apt-get remove -y nodejs npm > /dev/null 2>&1 || true
    sudo apt-get update -qq > /dev/null 2>&1
    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - > /dev/null 2>&1
    sudo apt-get install -y nodejs > /dev/null 2>&1
    if ! command -v node > /dev/null; then
        # attempt 2: install via curl with logs
        local ERROR_MESSAGE=$(ErrorMessage "run.sh" "0207")
        echo -e "$ERROR_MESSAGE"
        sudo apt-get remove -y nodejs npm || true
        sudo apt-get update -qq
        curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
        sudo apt-get install -y nodejs
        if ! command -v node > /dev/null; then
            # attempt 3: install via sudo apt install
            local ERROR_MESSAGE=$(ErrorMessage "run.sh" "0208")
            echo -e "$ERROR_MESSAGE"
            sudo apt update -qq && sudo apt install -y nodejs npm > /dev/null 2>&1
            if [ $? -ne 0 ]; then
                # attempt 4: install via sudo apt install with logs
                local ERROR_MESSAGE=$(ErrorMessage "run.sh" "0205")
                echo -e "::error::$ERROR_MESSAGE"
                sudo apt update
                sudo apt install -y nodejs npm
            fi
        fi
    fi
 fi
 local TIME2=$(python3 "$GITHUB_ACTION_PATH/src/time.py")
 NODEVERSION=$(node --version)
 NODESECONDS=$(node "$GITHUB_ACTION_PATH/src/time.js" "$TIME1" "$TIME2") # use js to get nodejs installing duration cuz yes
 echo -e "$msg3 $NODEVERSION ($NODESECONDS)"
}
if [ -f "$CONFIG_DATA" ]; then
 ERROR_MESSAGE=$(ErrorMessage "run.sh" "0113")
 echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
if [ ! -f "$CONFIG_FILE" ]; then
 ERROR_MESSAGE=$(ErrorMessage "run.sh" "0108")
 echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
CONFIG_JSON=$(node -e "console.log(JSON.stringify(require('./just.config.js')));")
if [ $? -ne 0 ]; then
 ERROR_MESSAGE=$(ErrorMessage "run.sh" "0109")
 echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
echo "Parsed just.config.js module.exports: $CONFIG_JSON" # debug
echo "$CONFIG_JSON" > "$CONFIG_DATA"
if [ -z "$(echo "$CONFIG_JSON" | jq -r '.module.exports')" ]; then
 ERROR_MESSAGE=$(ErrorMessage "run.sh" "0112")
 echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
TYPE=$(echo "$CONFIG_JSON" | jq -r '.type')
if [ -z "$TYPE" ]; then
 ERROR_MESSAGE=$(ErrorMessage "run.sh" "0110")
 echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
if [[ "$TYPE" != "postprocessor" && "$TYPE" != "redirect" && "$TYPE" != "compress" && "$TYPE" != "docs" ]]; then
 ERROR_MESSAGE=$(ErrorMessage "run.sh" "0111")
 echo -e "::error::$ERROR_MESSAGE" && exit 1
fi
_just_d="no" && \
if [[ "$TYPE" != "compress" && ! ( "$TYPE" == "docs" && "$INPUT_PATH" != "." ) ]]; then
 if [ -d "deploy" ]; then
    ERROR_MESSAGE=$(ErrorMessage "important_dirs" "0106")
    echo -e "::error::$ERROR_MESSAGE" && exit 1
 fi
 if [ -d "_just_data" ]; then
    ERROR_MESSAGE=$(ErrorMessage "important_dirs" "0107")
    echo -e "::error::$ERROR_MESSAGE" && exit 1
 fi
 mkdir -p deploy
 mkdir -p _just_data
elif [ "$TYPE" == "docs" ]; then
 JDD=$(echo "$INPUT_PATH/_just_data" | sed 's#//*#/#g')
 _just_dir=$(echo "$INPUT_PATH/_just" | sed 's#//*#/#g')
 if [ -d "$JDD" ]; then
    ERROR_MESSAGE=$(ErrorMessage "important_dirs" "0125")
    echo -e "::error::$ERROR_MESSAGE" && exit 1
 fi
 if [ -d "$_just_dir" ]; then
    ERROR_MESSAGE=$(ErrorMessage "important_dirs" "0125")
    echo -e "::error::$ERROR_MESSAGE" && exit 1
 fi
 mkdir -p "$JDD"
 mkdir -p "$_just_dir"
 _just_d="yes"
fi
jserr() {
 echo -e "::error::$(cat "_just_data/e.txt")" && exit 1
}
HLJSCSS="$GITHUB_ACTION_PATH/src/documentation/templates/hljs-themes"
hljsstyles() {
 echo "$(node $GITHUB_ACTION_PATH/src/documentation/hljscss.js "$(cat "$HLJSCSS/_just_default_light.css")")"
}
if [ "$TYPE" == "postprocessor" ]; then
 set -e
 postprocessor_checks=$(bash $GITHUB_ACTION_PATH/src/postprocessor/checks.sh 2>&1) || {
    error_code=$?
    if [ $error_code -eq 1 ]; then
        ERROR_MESSAGE=$(ErrorMessage "postprocessor/checks.sh" "0100" "$postprocessor_checks")
        if [ "$postprocessor_checks" == "0101" ]; then
            ERROR_MESSAGE=$(ErrorMessage "postprocessor/checks.sh" "0101")
        fi
        echo -e "::error::$ERROR_MESSAGE" && exit 1
    fi
 } && \
 bash $GITHUB_ACTION_PATH/src/postprocessor/prepare_deployment.sh && \
 bash $GITHUB_ACTION_PATH/src/postprocessor/create_api_endpoints.sh && \
 bash $GITHUB_ACTION_PATH/src/postprocessor/modify_deployment.sh && \
 bash $GITHUB_ACTION_PATH/src/postprocessor/override_deployment.sh && \
 installNodejs && \
 node $GITHUB_ACTION_PATH/src/compress.js "deploy" && \
 bash $GITHUB_ACTION_PATH/src/postprocessor/build_map.sh && \
 TIME3=$(python3 "$GITHUB_ACTION_PATH/src/time.py") && \
 DONEIN=$(node "$GITHUB_ACTION_PATH/src/time.js" "$TIME0" "$TIME3") && \
 echo -e "$msg4 ($DONEIN)"
elif [ "$TYPE" == "redirect" ]; then
 mkdir -p deploy/_just && \
 installNodejs && \
 bash $GITHUB_ACTION_PATH/src/redirect/checks.sh && \
 node $GITHUB_ACTION_PATH/src/redirect/index.js && \
 TIME3=$(python3 "$GITHUB_ACTION_PATH/src/time.py") && \
 DONEIN=$(node "$GITHUB_ACTION_PATH/src/time.js" "$TIME0" "$TIME3") && \
 echo -e "$msg5 ($DONEIN)"
elif [ "$TYPE" == "compress" ]; then
 mkdir -p deploy && \
 installNodejs && \
 node $GITHUB_ACTION_PATH/src/compress.js "$INPUT_PATH" && \
 TIME3=$(python3 "$GITHUB_ACTION_PATH/src/time.py") && \
 DONEIN=$(node "$GITHUB_ACTION_PATH/src/time.js" "$TIME0" "$TIME3") && \
 echo -e "$msg6 ($DONEIN)"
elif [ "$TYPE" == "docs" ]; then
 HTML=$(cat "$GITHUB_ACTION_PATH/src/documentation/templates/page.html") && \
 CSS=$(cat "$GITHUB_ACTION_PATH/src/documentation/templates/base.css") && \
 JS=$(cat "$GITHUB_ACTION_PATH/src/documentation/templates/page.js") && \
 HIGHLIGHTCSS=$(cat "$HLJSCSS/_just_default_dark.css") && \
 HIGHLIGHTJSON=$(hljsstyles) && \
 BUTTONSCSS=$(cat "$GITHUB_ACTION_PATH/src/documentation/templates/buttons.css") && \
 SEARCHCSS=$(cat "$GITHUB_ACTION_PATH/src/documentation/templates/search.css") && \
 CUSTOMCSS=false && \
 CUSTOMCSSPATH="just.config.css" && \
 if [ -f "$CUSTOMCSSPATH" ]; then
    CUSTOMCSS=$(cat "$CUSTOMCSSPATH")
 fi && \
 if [[ -d "_just" && "$_just_d" == "no" ]]; then
    ERROR_MESSAGE=$(ErrorMessage "important_dirs" "0121")
    echo -e "::error::$ERROR_MESSAGE" && exit 1
 fi && \
 if [ -f "_just_error" ]; then
    ERROR_MESSAGE=$(ErrorMessage "run.sh" "0127")
    echo -e "::error::$ERROR_MESSAGE" && exit 1
 fi && \
 mkdir -p _just && \
 mkdir -p deploy && \
 installNodejs && \
 bash $GITHUB_ACTION_PATH/src/documentation/checks.sh && \
 INDEXJS0="$GITHUB_ACTION_PATH/src/documentation/index.js"
 INDEXJS1=$(cat "$INDEXJS0") && \
 INDEXJS2=$(cat "$GITHUB_ACTION_PATH/src/line.js") && \
 echo "$INDEXJS2" > "$INDEXJS0" && \
 INDEXJS3=$(node "$INDEXJS0" "$INDEXJS1") && \
 echo "$INDEXJS3" > "$INDEXJS0" && \
 HLJSLANGS=$(cat "$GITHUB_ACTION_PATH/data/hljslangs.json") && \
 LANGS=$(cat "$GITHUB_ACTION_PATH/data/langs.json") && \
 LANGSTEXT=$(cat "$GITHUB_ACTION_PATH/data/langstext.json") && \
 node "$INDEXJS0" "$HTML" "$CSS" "$JS" "$INPUT_PATH" "$GITHUB_REPOSITORY" "$GITHUB_REPOSITORY_OWNER" "$CUSTOMCSS" "$HLJSLANGS" "$LANGS" "$HIGHLIGHTCSS" "$LANGSTEXT" "$VERSION" "$BUTTONSCSS" "$SEARCHCSS" "$HIGHLIGHTJSON" "$INPUT_FIXPATH" || jserr && \
 node $GITHUB_ACTION_PATH/src/compress.js "$INPUT_PATH" && \
 node "$GITHUB_ACTION_PATH/src/documentation/logs.js" "$INPUT_PATH" && \
 TIME3=$(python3 "$GITHUB_ACTION_PATH/src/time.py") && \
 DONEIN=$(node "$GITHUB_ACTION_PATH/src/time.js" "$TIME0" "$TIME3") && \
 echo -e "$msg9 ($DONEIN)"
fi

test

JavaScript/*
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
*/

const [time1, time2] = process.argv.slice(2);
const diff = Math.ceil(Math.ceil(parseInt(time2, 10)) - Math.ceil(parseInt(time1, 10)));
function time(ms) {
 const s_ = Math.ceil(ms/1000);
 if (ms < 0) {
    return "0ms";
 } else if (ms < 1000) {
    return `${ms}ms`;
 } else if (s_ > 60) {
    return `${Math.ceil(s_/60*100)/100}m`;
 } else {
    return `${Math.ceil(ms/100)/10}s`;
 }
}
console.log(time(diff));

Python# MIT License
#
# Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
#
# 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.
#!/usr/bin/env python3
import time
out = int(time.time() * 1000)
print(out)

test

test

CSS* {
 margin: 0;
}
html {
 color:
#ffffff
;
 font-family: monospace;
 text-align: center;
}
body {
 background-color:
#000000
;
 position: fixed;
 top: 50%;
 left: 50%;
 translate: -50% -50%;
 height: auto;
 width: 75%;
}
@property --angle1 {
 syntax: "<angle>";
 initial-value: 0deg;
 inherits: false
}
h1 {
 font-size: 30px;
 -webkit-text-stroke-color: hsl(var(--angle1) 100% 50%);
 -webkit-text-stroke-width: 0.5px;
 filter: drop-shadow(0px 20px 50px hsl(var(--angle1) 100% 50%)) drop-shadow(10px 5px 5px hsl(var(--angle1) 100% 50% / 50%)) drop-shadow(400px -10px 50px hsl(var(--angle1) 100% 50% / 50%)) drop-shadow(-400px 20px 50px hsl(var(--angle1) 100% 50% / 50%));
 animation: 3s rgb linear infinite;
}
@keyframes rgb {
 from {
    --angle1: 0deg
 }
 to {
    --angle1: 360deg
 }
}
span {
 position: fixed;
 translate: -50% 2px;
 width: 100%;
 background: hsl(0deg 0% 100% / 25%);
 background: radial-gradient(circle, hsl(0deg 0% 100% / 25%) 0%, hsl(0deg 0% 0% / 0%) 100%);
 background: -moz-radial-gradient(circle, hsl(0deg 0% 100% / 25%) 0%, hsl(0deg 0% 0% / 0%) 100%);
 background: -webkit-radial-gradient(circle, hsl(0deg 0% 100% / 25%) 0%, hsl(0deg 0% 0% / 0%) 100%);
 max-width: 700px;
 color: hsl(0 0% 75%);
 filter: saturate(0%);
 opacity: 0.4;
 padding-bottom: 5px;
}
h4 {
 translate: 0% calc(100% + 9px);
}

test

Markdown_just: title: Getting Started
# Getting Started
### Necessary knowledge
This documentation assumes some familiarity with
- GitHub
- GitHub Actions
- GitHub Pages
And some familiarity with these languages
- JavaScript
- YAML
- HTML
- CSS
- Markdown
## Installation
### Making your first project
- Create new repository, and create `/.github/workflows/publish.yml` file, template:
```yml
name: Website
on:
  push:
 branches: ["main"]
  workflow_
dispatch:
permissions:
  contents: read
  pages: write
  id-token: write
concurrency:
  group: "pages"
  cancel-in-progress: false
jobs:
  build:
 runs-on: ubuntu-latest
 steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Pages
uses: actions/configure-pages@v5

- name: Generate with _just
    uses: js-just/latest@main
    with: # Remove "with" and "path" here if you are not using compressor or generator modes!
      path: . # Root directory, or you can replace the dot with the path to your website/docs directory to be generated/compressed. (Only for compressor and generator modes)
  - name: Upload artifact
    uses: actions/upload-pages-artifact@v3
    with:
      path: . # Root directory, or you can replace the dot with the path to your entire website to be deployed to GitHub Pages.
  deploy:
 environment:
  name: github-pages
  url: ${{ steps.deployment.outputs.page_
url }}
 runs-on: ubuntu-latest
 needs: build
 steps:
- name: Deploy to GitHub Pages
id: deployment

uses: actions/deploy-pages@v4
```
You can change name of workflow file and workflow name:
```yml
name: Workflow name
```
You can also choose _just version:
```yml

uses: js-just/_just@(put version name here)
```
**If you know what exactly you are doing, you may change anything.**
- Create `just.config.js` file in the root directory:
Choose what mode you want to use.
 
Using `Postprocessor` mode:
```js
module.exports = {
  type: "postprocessor"
}
```
Using `Redirector` mode:
```js
module.exports = {

 type: "redirect",
 redirect_config: {
    url: "https://example.com/", // Required. Replace with destination URL.
 }
}
```
Using `Compressor` mode:
```js
module.exports = {
 type: "compress"
}
```
Using `Generator` mode:
```js
module.exports = {
 type: "docs",
 docs_
config: {
metatitle: "Documentation title", // Required. Replace with your documentation title.

domain: "example.com" // Required. Replace with your domain name. Domain name should be valid.

 }
}
```
- Read the documentation for the mode that you've chosen.
---
### Pro installation
- Create or modify your `.github/workflows/github_pages_workflow_name.yml`:
Make sure that permissions allow writing `pages` and `id-token`, but do not allow writing `contents`, only read.
```
yml
permissions:
  contents: read
  pages: write
  id-token: write
```
Make a job for building your website using _just:
```
yml
jobs:
  build:
 runs-on: ubuntu-latest
 steps:
- name: Checkout
uses: actions/checkout@v4

- name: Generate with _just
    uses: js-just/_
just@ # version name (recommended) (example: v0.0.29) / main branch (latest commit) (unstable, not recommended) / commit SHA (not recommended)
with:

path: # Path to your website directory to be generated/compressed. (Only for compressor and generator modes)
```
- Create `just.config.js` file:
Basic usage:
```js
module.exports = {
  type: "(postprocessor/redirect/compress/docs)"
}
```
Using multiple modes:
-# Currently available only combining generator and compressor.
```js
module.exports = {
  type: ["docs", "compress"]
}
```
- Read the documentation for the mode/modes that you've chosen.

## Modes documentation
- [Postprocessor](modes/postprocessor)
- [Redirector](modes/redirector)
- [Compressor](modes/compressor)
- [Generator](modes/generator)
_just: prev: /docs

test

Markdown_just: title: Compressor Mode
# Compressor mode
_
just: prev: /docs/getting-started

Markdown_just: title: Generator Mode
# Generator mode
_
just: prev: /docs/getting-started

Markdown_just: title: Postprocessor Mode
# Postprocessor mode
_
just: prev: /docs/getting-started

Markdown_just: title: Redirector Mode
# Redirector mode
This mode requires only the just.config.js file, ~except for the workflow file~.
`just.config.js`
```js
module.exports = {
 type: "redirect",
 redirect_
config: {
url: "https://example.com/" // Required. Replace with destination URL.

 }
}
```
> [!TIP] Do not use this mode if you can make server-side `HTTP 3XX` redirects.
You can add `params{}`:
```
js
module.exports = {
 type: "redirect",
 redirect_config: {
    url: "https://example.com/", // Required. Replace with destination URL.
    params: { // Optional.
        title: "redirect website title here", // Optional. Replace with any title you want. Recommended.
        description: "redirect website description here", // Optional. Replace with any description you want.
        keywords: "some, keywords, here", // Optional. Replace with any keywords you want. Separate keywords by commas.
        htmlLang: "en", // Optional. <html lang="${htmlLang}">
        robots: "index", // Optional. <meta name="robots" content="${robots}">
        charset: "utf-8", // Optional. "utf-8" by default. <meta charset="${charset}"> and file charset.
        viewport: "width=device-width, initial-scale=1.0", // Optional. "width=device-width, initial-scale=1.0" by default. <meta name="viewport" content="${viewport}">
        yandex: "", // Optional. Put your Yandex verification string here. <meta name="yandex-verification" content="${yandex}">
        google: "", // Optional. Put your Google verification string here. <meta name="google-site-verification" content="${google}">
        googleAnalytics: "" // Optional. Put your Google Analytics ID here.
    }
 }
}
```
You can also add `content{}` in `params{}` if you want to modify HTML content.
```js
module.exports = {
 type: "redirect",
 redirect_
config: {
url: "https://example.com/", // Required. Replace with destination URL.

params: { // Optional.

content: { // Optional.

text1: "Redirecting...", // Optional. "Redirecting...<br>" + generated content ("<small>to <a ...>...</a></small>") by default.

text2: "Didn't get redirected?", // Optional. "Didn't get redirected?" by default.

text3: "Click here!" // Optional. "Click here!" by default. <a ...>${text3}</a>

}

}

 }
}
```
> [!NOTE] `\\n` and tabs/4 spaces will be removed. Use `<br>` instead of `\\n`.
### Redirect paths
You may add `paths[]` in `redirect_config{}` to create custom redirect paths.
```
js
module.exports = {
 type: "redirect",
 redirect_config: {
    url: "https://example.com/", // Required. Replace with destination URL.
    paths: [ // Optional
        {
            path_
: "example", // Required. Replace with path.
url: "https://example.com/", // Required. Replace with path destination URL.

params: { // Optional.

title: "redirect website title here", // Optional. Replace with any title you want. Recommended.

description: "redirect website description here", // Optional. Replace with any description you want.

keywords: "some, keywords, here", // Optional. Replace with any keywords you want. Separate keywords by commas.

htmlLang: "en", // Optional. <html lang="${htmlLang}">

robots: "index", // Optional. <meta name="robots" content="${robots}">

charset: "utf-8", // Optional. "utf-8" by default. <meta charset="${charset}"> and file charset.

viewport: "width=device-width, initial-scale=1.0", // Optional. "width=device-width, initial-scale=1.0" by default. <meta name="viewport" content="${viewport}">

yandex: "", // Optional. Put your Yandex verification string here. <meta name="yandex-verification" content="${yandex}">

google: "", // Optional. Put your Google verification string here. <meta name="google-site-verification" content="${google}">

googleAnalytics: "" // Optional. Put your Google Analytics ID here.

}

}

]

 }
}
```
---
## `module.exports` JSON Schema
```
json
{
 "$schema": "http://json-schema.org/draft-04/schema#",
 "type": "object",
 "properties": {
"type": {

"type": "string"

},

"redirect_config": {

"type": "object",

"properties": {

"url": {

"type": "string"

},

"params": {

"type": "object",

"properties": {

"title": {

"type": "string"

},

"description": {

"type": "string"

},

"keywords": {

"type": "string"

},

"htmlLang": {

"type": "string"

},

"robots": {

"type": "string"

},

"charset": {

"type": "string"

},

"viewport": {

"type": "string"

},

"yandex": {

"type": "string"

},

"google": {

"type": "string"

},

"googleAnalytics": {

"type": "string"

},

"content": {

"type": "object",

"properties": {

"text1": {

"type": "string"

},

"text2": {

"type": "string"

},

"text3": {

"type": "string"

}

},

"required": []

},

"og": {

"type": "object",

"properties": {

"title": {

"type": "string"

},

"description": {

"type": "string"

}

},

"required": []

},

"twitter": {

"type": "object",

"properties": {

"card": {

"type": "string"

}

},

"required": [

"card"

]

}

},

"required": []

},

"paths": {

"type": "array",

"items": [

{

"type": "object",

"properties": {

"path_": {

"type": "string"

},

"url": {

"type": "string"

},

"params": {

"type": "object",

"properties": {

"title": {

"type": "string"

},

"description": {

"type": "string"

},

"keywords": {

"type": "string"

},

"htmlLang": {

"type": "string"

},

"og": {

"type": "object",

"properties": {

"title": {

"type": "string"

},

"description": {

"type": "string"

}

},

"required": []

},

"twitter": {

"type": "object",

"properties": {

"card": {

"type": "string"

}

},

"required": [

"card"

]

}

},

"required": []

}

},

"required": [

"path_",

"url"

]

}

]

}

},

"required": [

"url"

]

}

 },
 "required": [
"type",

"redirect_config"

 ]
}
```
_just: prev: /docs/getting-started

Markdown_just: title: Docs
# _
just Docs
Welcome to Just an Ultimate Site Tool documentation!
-# "**`_just`**" is an abbreviation of **Just an Ultimate Site Tool**.
---
## What is _
just?
Just an Ultimate Site Tool is a GitHub Action for building static websites.
Currently it have 4 modes:
- `Postprocessor`: Modify and add your own files to generated Next.js website.
- `Redirector`: Client-side redirect using JavaScript.
- `Compressor`: Compresses your website.
- `Generator`: Generates documentation website using Markdown.
> [!WARNING] Just an Ultimate Site Tool is still in development at the **
alpha** stage. Expect regular updates, possible bugs, and changes. If you have found a bug, please [report it here](https://github.com/js-just/_just/issues/new?labels=bug&template=bug.md).
> [!CAUTION] The docs are under construction!
> [!TIP] Do not use `Redirector` if you can make server-side `HTTP 3XX` redirects.
## Why _just?
1. __No packages.__
2. __Fast build.__
3. __**No watermarks.**__
-# _
just uses Node.js, but _just does not require you to use Node.js/npm/pnpm/Yarn/related packages stuff.
_
just: next: /docs/getting-started

test

SVG<!--
MIT License
Copyright (c) 2025 JustStudio. <https://juststudio.is-a.dev/>
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.
\-->

<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024" version="1.1">
 <path d="M 518.656 198.677 C 518.404 198.929, 516.016 199.317, 513.349 199.538 C 506.674 200.092, 500.971 200.830, 498 201.525 C 496.625 201.847, 494.375 202.255, 493 202.432 C 488.792 202.974, 483.782 203.983, 477.500 205.555 C 469.302 207.605, 468.500 207.823, 468.500 208.006 C 468.500 208.093, 467.237 208.371, 465.694 208.624 C 463.331 209.011, 452.219 212.639, 447 214.727 C 446.175 215.057, 445.275 215.388, 445 215.463 C 442.343 216.183, 439.406 217.396, 439 217.941 C 438.725 218.310, 435.575 219.648, 432 220.915 C 423.517 223.922, 418.676 226.144, 417.765 227.448 C 417.361 228.027, 417.024 228.151, 417.015 227.724 C 416.995 226.714, 395.745 237.805, 394.773 239.333 C 394.365 239.975, 394.024 240.146, 394.015 239.714 C 394.007 239.282, 392.321 240.069, 390.268 241.464 C 388.215 242.859, 386.212 244, 385.816 244 C 384.771 244, 372.505 252.686, 371.016 254.480 C 369.412 256.413, 367.274 256.417, 365.348 254.491 C 364.518 253.661, 363.476 253.206, 363.033 253.480 C 362.589 253.754, 361.671 253.308, 360.991 252.489 C 360.311 251.670, 358.910 251, 357.878 251 C 356.845 251, 356 250.550, 356 250 C 356 249.450, 355.525 249, 354.944 249 C 354.363 249, 351.326 247.729, 348.194 246.175 C 345.062 244.621, 342.050 243.217, 341.500 243.055 C 340.950 242.893, 339.375 242.318, 338 241.778 C 327.899 237.809, 317.310 234.344, 316.342 234.691 C 315.705 234.919, 314.890 234.632, 314.533 234.053 C 314.175 233.474, 312.634 233, 311.108 233 C 309.582 233, 308.024 232.691, 307.646 232.313 C 307.268 231.935, 306.181 231.516, 305.230 231.382 C 304.278 231.248, 299.675 230.236, 295 229.133 C 290.325 228.031, 284.025 226.868, 281 226.548 C 277.975 226.228, 273.025 225.659, 270 225.283 C 252.363 223.091, 209.932 224.968, 197 228.513 C 196.725 228.588, 194.250 228.986, 191.500 229.397 C 188.750 229.808, 185.375 230.568, 184 231.086 C 182.625 231.603, 180.488 232.246, 179.250 232.513 C 170.497 234.407, 167.510 235.268, 166.250 236.260 C 165.563 236.802, 165 236.989, 165 236.676 C 165 236.363, 161.963 237.233, 158.250 238.609 C 154.538 239.986, 150.825 241.267, 150 241.457 C 147.263 242.086, 139.530 245.318, 137.527 246.669 C 136.443 247.401, 134.789 248, 133.852 248 C 131.586 248, 98 264.963, 98 266.107 C 98 266.598, 97.155 267, 96.122 267 C 95.090 267, 93.685 267.675, 93 268.500 C 92.315 269.325, 91.205 270, 90.533 270 C 89.860 270, 88.495 270.900, 87.500 272 C 86.505 273.100, 85.085 274, 84.345 274 C 83.605 274, 83 274.450, 83 275 C 83 275.550, 82.501 276, 81.891 276 C 79.879 276, 62 293.252, 62 295.193 C 62 295.715, 61.437 296.770, 60.750 297.537 C 60.062 298.303, 58.985 299.552, 58.355 300.311 C 56.590 302.438, 49.052 318.249, 48.729 320.500 C 48.571 321.600, 48.137 322.988, 47.765 323.584 C 47.392 324.180, 46.818 326.205, 46.488 328.084 C 46.159 329.963, 45.500 333.300, 45.022 335.500 C 42.724 346.102, 45.051 371.259, 49.057 379.112 C 50.126 381.207, 51 383.664, 51 384.572 C 51 388.475, 62.719 406.730, 69.448 413.306 C 74.672 418.413, 79.015 422, 79.973 422 C 80.538 422, 81 422.360, 81 422.801 C 81 423.640, 89.638 429.408, 90.185 428.933 C 90.358 428.783, 92.483 429.911, 94.907 431.441 C 97.330 432.971, 99.805 434.298, 100.407 434.390 C 101.008 434.481, 101.950 434.821, 102.500 435.145 C 110.803 440.033, 138.482 442.831, 152.255 440.174 C 156.691 439.318, 169.650 439.457, 176.500 440.434 C 178.150 440.670, 179.982 440.893, 180.570 440.931 C 182.470 441.053, 190.132 448.217, 191.108 450.783 C 192.858 455.388, 193.088 459.655, 193.517 495.642 C 193.752 515.364, 194.165 534.200, 194.434 537.500 C 194.703 540.800, 195.137 546.200, 195.400 549.500 C 195.662 552.800, 196.123 556.886, 196.423 558.581 C 196.723 560.276, 197.185 563.201, 197.450 565.081 C 197.714 566.961, 198.170 569.625, 198.464 571 C 198.757 572.375, 199.257 575.525, 199.576 578 C 200.060 581.763, 201.684 589.358, 203.424 596 C 203.640 596.825, 204.374 599.750, 205.054 602.500 C 205.735 605.250, 206.910 608.733, 207.666 610.240 C 208.422 611.746, 209.038 613.321, 209.035 613.740 C 209.020 615.802, 212.551 626, 213.281 626 C 213.741 626, 213.890 626.370, 213.610 626.822 C 213.331 627.274, 213.795 628.961, 214.641 630.572 C 215.487 632.182, 216.353 634.366, 216.566 635.424 C 217.569 640.418, 233.042 669.497, 240.107 679.663 C 241.698 681.953, 243 684.316, 243 684.913 C 243 685.511, 243.367 686, 243.815 686 C 244.263 686, 245.381 687.575, 246.299 689.500 C 247.217 691.425, 248.395 693, 248.916 693 C 249.438 693, 250.126 693.821, 250.444 694.824 C 250.762 695.827, 251.824 697.514, 252.803 698.574 C 253.782 699.633, 256.069 702.668, 257.886 705.318 C 259.703 707.967, 261.822 710.378, 262.595 710.675 C 263.368 710.971, 264 711.579, 264 712.025 C 264 713.441, 280.782 731.865, 289.877 740.434 C 292.834 743.220, 297.359 747.525, 299.932 750 C 306.218 756.047, 315.475 763.938, 319.874 767 C 321.850 768.375, 324.316 770.260, 325.355 771.188 C 328.588 774.077, 341.899 783, 342.977 783 C 343.539 783, 344 783.348, 344 783.773 C 344 784.198, 345.688 785.416, 347.750 786.481 C 349.813 787.545, 352.713 789.236, 354.196 790.238 C 356.992 792.127, 378.500 803.373, 378.500 802.946 C 378.500 802.813, 380.525 803.737, 383 805 C 385.475 806.263, 387.500 807.198, 387.500 807.078 C 387.500 806.958, 388.850 807.388, 390.500 808.034 C 398.667 811.233, 405.577 813.805, 406.250 813.897 C 406.663 813.954, 407.225 814.056, 407.500 814.125 C 407.775 814.194, 408.337 814.335, 408.750 814.438 C 409.163 814.542, 412.450 815.569, 416.056 816.721 C 419.661 817.872, 424.161 819.071, 426.056 819.383 C 427.950 819.696, 430.850 820.324, 432.500 820.778 C 434.150 821.232, 436.175 821.551, 437 821.486 C 437.825 821.421, 439.175 821.690, 440 822.083 C 440.825 822.477, 443.975 823.106, 447 823.482 C 479.004 827.453, 509.300 826.187, 542.500 819.491 C 543.600 819.269, 544.950 819.023, 545.500 818.945 C 546.050 818.867, 547.343 818.351, 548.374 817.800 C 549.405 817.248, 551.205 816.676, 552.374 816.528 C 558.106 815.803, 574.895 810.501, 583 806.857 C 584.375 806.238, 586.400 805.403, 587.500 805.001 C 592.414 803.203, 609.632 795.547, 610.851 794.617 C 611.594 794.051, 612.755 793.506, 613.432 793.407 C 614.108 793.308, 618 791.301, 622.081 788.947 C 626.161 786.593, 630.962 783.973, 632.750 783.125 C 634.538 782.277, 636 781.227, 636 780.792 C 636 780.356, 636.873 780, 637.941 780 C 639.009 780, 640.171 779.532, 640.525 778.959 C 640.879 778.387, 643.043 776.746, 645.334 775.312 C 647.625 773.879, 650.574 771.647, 651.886 770.353 C 654.887 767.394, 656.038 767.408, 660.531 770.456 C 662.521 771.807, 666.479 773.789, 669.325 774.860 C 672.171 775.931, 676.750 777.923, 679.500 779.288 C 682.250 780.652, 687.425 782.758, 691 783.967 C 694.575 785.176, 698.897 786.793, 700.604 787.560 C 703.908 789.045, 714.204 791.756, 720 792.666 C 721.925 792.968, 724.276 793.627, 725.224 794.129 C 726.172 794.631, 730.447 795.511, 734.724 796.083 C 739.001 796.655, 743.625 797.340, 745 797.606 C 750.749 798.715, 759.518 799.235, 776.500 799.471 C 799.268 799.789, 812.128 798.661, 831.500 794.650 C 832.600 794.422, 835.410 793.919, 837.745 793.531 C 840.079 793.143, 842.248 792.408, 842.564 791.897 C 842.880 791.386, 843.489 791.184, 843.918 791.449 C 844.582 791.860, 858.409 788.125, 863 786.296 C 863.825 785.967, 864.950 785.597, 865.500 785.474 C 867.450 785.037, 876.544 781.836, 879.500 780.546 C 882.252 779.345, 887.500 777.118, 892.500 775.029 C 900.922 771.510, 917 763.451, 917 762.749 C 917 762.272, 917.414 762.138, 917.919 762.450 C 918.425 762.763, 919.438 762.451, 920.169 761.758 C 920.901 761.065, 923.975 759.200, 927 757.612 C 932.504 754.724, 941.704 748.953, 945.440 746.046 C 949.684 742.744, 957.972 734.449, 957.985 733.491 C 957.993 732.935, 958.900 731.919, 960 731.232 C 961.100 730.545, 962 729.378, 962 728.638 C 962 727.898, 963.090 726.116, 964.422 724.678 C 968.304 720.490, 976.276 702.756, 977.539 695.500 C 979.207 685.914, 979.659 680.484, 979.480 672.167 C 979.246 661.296, 978.304 653.436, 976.926 650.863 C 976.417 649.910, 976 648.387, 976 647.478 C 976 644.894, 969.226 630.091, 965.256 624 C 955.874 609.605, 929.667 589, 920.742 589 C 920.004 589, 918.973 588.575, 918.450 588.055 C 917.928 587.536, 916.061 586.859, 914.301 586.550 C 912.542 586.242, 909.998 585.570, 908.648 585.056 C 902.810 582.837, 884.480 582.241, 872.620 583.885 C 851.766 586.777, 834.628 581.777, 832.550 572.194 C 832.229 570.712, 831.721 568.375, 831.422 567 C 830.965 564.900, 829.683 500.778, 829.913 491.500 C 830.055 485.772, 825.439 448.343, 823.873 442.529 C 823.279 440.324, 822.649 437.390, 822.472 436.010 C 822.114 433.212, 818.282 418.339, 817.317 416 C 816.977 415.175, 816.591 414.050, 816.460 413.500 C 815.768 410.596, 811.657 399.237, 810.461 396.925 C 809.701 395.456, 809.362 393.972, 809.707 393.627 C 810.051 393.282, 809.883 393, 809.333 393 C 808.783 393, 808.333 392.367, 808.333 391.594 C 808.333 390.304, 805.895 384.797, 800.765 374.500 C 793.332 359.580, 789.947 353.455, 784.817 345.646 C 781.617 340.776, 779 336.581, 779 336.323 C 779 335.758, 768.812 322.352, 766.164 319.431 C 765.132 318.294, 764.110 316.876, 763.894 316.282 C 762.158 311.520, 729.615 278.189, 714 265.182 C 709.325 261.288, 703.870 256.728, 701.878 255.051 C 699.887 253.373, 697.787 252, 697.212 252 C 696.637 252, 696.017 251.606, 695.833 251.126 C 695.430 250.069, 680.296 239.716, 675.746 237.384 C 673.961 236.469, 672.275 235.413, 672 235.036 C 671.725 234.659, 669.475 233.316, 667 232.050 C 664.525 230.785, 661.825 229.374, 661 228.914 C 655.177 225.668, 642 219.151, 642 219.517 C 642 219.764, 640.399 219.067, 638.443 217.968 C 636.486 216.869, 634.124 215.842, 633.193 215.686 C 632.262 215.530, 630.600 214.928, 629.500 214.349 C 624.814 211.881, 597.497 204.064, 587.500 202.332 C 578.874 200.836, 571.669 199.787, 567 199.347 C 559.665 198.655, 519.238 198.095, 518.656 198.677" stroke="none" fill="#6c3cf4" fill-rule="evenodd"/>
</svg>


Markdown# This is a test page
Generated using [Just an Ultimate Site Tool](https://just.is-a.dev/).
Some **bold**, *italic*, ***important***, __underlined__, ~~strikethrough~~, ~sub~, ^super^, ==marked==, __***very important***__, __==***extreme important***==__, ~~***not important***~~ text.
Some `code`; *
*`bold`**, *`italic`*, ***`important`***, __`underlined`__, ~~`strikethrough`~~, ~`sub`~, ^`super`^, ==`marked`==, __***`very important`***__, __==***`extreme important`***==__, ~~***`not important`***~~ code.
1. List
2. (with numbers)
- List
- (no numbers)
A line:
---
```
Some code here
```
# Blockquotes test
> A blockquote.
> > Another one!
> > > And another blockquote!
> > > > Many nested blockquotes.
> > > > > This line should not be another nested blockquote. (Limit: 4 nested blockqutes)
> <_just element="OMZq"></_just>[!NOTE] A note!
> [!TIP] A tip!
> [!IMPORTANT] Something important.
> [!WARNING] A warning!
> [!CAUTION] Another warning?
> <_just element="OMZq"></_just>[!NOTE] `[!NOTE]`, `[!TIP]`, `[!IMPORTANT]`, `[!WARNING]` and `[!CAUTION]` are should be in one line. You can add \<br> tags to break the line for HTML. <br> > `[!NOTE]`, `[!TIP]`, `[!IMPORTANT]`, `[!WARNING]` and `[!CAUTION]` cannot have nested blockquotes.
# Headers test (h1)
## h2
### h3
#### h4
##### h5
###### h6
> [!IMPORTANT] Only h1, h2, h3 and h4 will be included in the "On this page" content list and will have their own unique IDs for shortlinks.
# Escape test
Not a line:
\---
\1. Not a list
2\. (with numbers)
\- Not a list
\- (no numbers)
```
No code here
```
\> Not a blockquote.
> <_just element="OMZq"></_just>\[!NOTE] A blockquote, but not a note.
# Links test
[a link](https://just.is-a.dev/ "link title")
<https://just.is-a.dev/>
https://just.is-a.dev
---
## v0.0.28 bugs:
#### blockquote link:
> [!WARNING] Just an Ultimate Site Tool is in *
*beta**. Expect regular updates, possible bugs, and changes. If you have found a bug, please [report it here](https://github.com/js-just/_just/issues/new?labels=bug&template=bug.md).
#### text styling:
"*
*`_just`**"
## v0.0.29 features:
-# small text
_just: prev: /docs/getting-started
_just: next: /docs/getting-started

Markdown_just: title: Syntax highlighting test
# Syntax highlighting
```json
{
 "hello": "world",
 "number": 1234567890,
 "array": []
}
```
```json
[
 "hello", "world"
]
```
```js
console.log('hello world');
console.warn(1 + 1);
alert(false);
const abc = true;
for (i = 1; i <= 4; i++) {
 // do something
}
```
```html
<!DOCTYPE html>
<span class="hw" id="abc">Hello World!</span>
```
```css
* {
 background-color: black;
}
span {
 color: white;
}
.hw {
 border: 1px solid #6e3bf3;
}
#abc {
 -webkit-filter: blur(8em);
}
div:before {
 content: 'hello';
}
:root {
 --color: #ffffff;
 @media(max-width: 5px) {
    --color: #000000;
 }
}
::-webkit-scrollbar {
 width: 7px;
 height: 7px
}
```
```sh
#!/bin/bash
echo "Hello World!"
```
```py
#!/usr/bin/env python3
import time
out = int(time.time() * 1000)
print(out)
```
```lua
print("hiii")
warn(1 + 1)
local abc = true
while wait(1) do
 -- do something
end
```
```md
# markdown inside markdown
```
```go
// go
```
```golang
// golang
```
```golo
```
```gololang
```
```diff
  text
+ added
- removed
```

Markdown_just: title: Mattcone's Markdown Test
# Markdown test
This is a Markdown test for the Markdown Guide tools directory.
---
headings
# One
## Two
### Three
#### Four
##### Five
###### Six
Alternate One
=============
Alternate Two
-------------
---
paragraphs
first paragraph
second para
---
line breaks
line one with trailing whitespace
line two right under
line one with no trailing whitespace, just hard return
line two right under
line one with no trailing backslash \
line two right under
---
bold
**asterisks**
__underscores__
in**middle**here
---
italic
*asterisk*
_
underscore_
in*middle*here
---
bold and italic
***asterisks***
___underscores___
__*combo*__
**_second combo_**
---
blockquotes
> single
> <_just element="OMZq"></_just>multi
> line
> <_just element="OMZq"></_just>nested
>
> > blockquotes

---
ordered lists
1. first
2. second
3. third
1. this
2. is
1. nested
3. now
---
unordered lists
- dashes
- here
- nested
* asterisks
* here
+ plus
+ signs
---
code
`one tick mark`

 <one tab>
  <indented>
---
horizontal rules
throughout this :)
---
links
normal link => [cnn](https://cnn.com)
brackets => <https://cnn.com>
brackets => <me@somewhere.com>
naked url (test auto link) => https://cnn.com
---
images
![test image](https://www.markdownguide.org/assets/images/tools/joplin.png)
---
## Tables
| Syntax | Description |
| ----------- | ----------- |
| Header | Title |
| Paragraph | Text |
---
## Fenced code blocks
```
{
  "firstName": "John",
  "lastName": "Smith",
  "age": 25
}
```

---
## Syntax highlighting
```json
{
  "firstName": "John",
  "lastName": "Smith",
  "age": 25
}
```

---
## Footnotes
Here's a simple footnote,[^1] and here's a longer one.[^bignote]
[^1]: This is the first footnote.
[^bignote]: Here's one with multiple paragraphs and code.

 Indent paragraphs to include them in the footnote.

 `{ my code }`

 Add as many paragraphs as you like.
---
## Heading IDs
### My Great Heading {#custom-id}
---
## Definition lists
First Term
: This is the definition of the first term.
Second Term
: This is one definition of the second term.
: This is another definition of the second term.
---
## Strikethrough
~~two tilde~~
~one tilde~
---
## Task lists
- [x] Write the press release
- [ ] Update the website
- [ ] Contact the media
---
## Emoji
copy and paste: ☕
shortcodes: :joy:
---
## Highlight
==twoequals==
::twohypens::
---
## Subscript
H~2~O
---
## Superscript
X^2^
---
## Abbreviation
*[HTML]: Hyper Text Markup Language
The HTML specification is maintained by the W3C.
---
## HTML
<em>italic test</em>
<strong>bold test</strong>

Markdowntest

Swipe right to open the menu and swipe left to close it.