You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.4 KiB
JavaScript
87 lines
2.4 KiB
JavaScript
function createElement(self, obj) {
|
|
if (typeof obj === 'string' || obj instanceof Node)
|
|
return obj;
|
|
|
|
const $el = document.createElement(obj.type);
|
|
if (obj.class) $el.className = obj.class;
|
|
if (obj.id) $el.id = obj.id;
|
|
if (obj.text) $el.textContent = obj.text;
|
|
if (obj.html) $el.innerHTML = obj.html;
|
|
if (obj.style)
|
|
for (const [prop, value] of Object.entries(obj.style))
|
|
$el.style[prop] = value;
|
|
if (obj.also) obj.also.call(self, $el);
|
|
if (obj.name) self['$' + obj.name] = $el;
|
|
if (obj.events)
|
|
for (const [ev, handler] of Object.entries(obj.events))
|
|
$el.addEventListener(ev, handler.bind(self));
|
|
if (obj.children)
|
|
for (const i of obj.children)
|
|
$el.append(createElement(self, i));
|
|
return $el;
|
|
}
|
|
|
|
|
|
// ===================== RENDER =====================
|
|
|
|
function waitFrame() {
|
|
return new Promise(requestAnimationFrame);
|
|
}
|
|
|
|
async function wait2Frame() {
|
|
await waitFrame();
|
|
await waitFrame();
|
|
}
|
|
|
|
function getIcon(icon) {
|
|
if (!icon) return '';
|
|
return icon.length == 1 ? icon : String.fromCharCode(Number('0x' + icon));
|
|
}
|
|
|
|
function intToCol(val) {
|
|
if (val === null || val === undefined) return null;
|
|
return "#" + Number(val).toString(16).padStart(6, '0');
|
|
}
|
|
|
|
function colToInt(val) {
|
|
if (val === null || val === undefined) return null;
|
|
if (val.startsWith('#')) {
|
|
val = val.slice(1);
|
|
if (val.length == 3) {
|
|
val = val[0] + val[0] + val[1] + val[1] + val[2] + val[2];
|
|
}
|
|
return parseInt(val, 16);
|
|
}
|
|
if (val.startsWith("rgb(")) {
|
|
let intcol = 0;
|
|
for (const i of val.replace("rgb(", "").replace(")", "").replace(" ", "").split(','))
|
|
intcol = (intcol << 8) | i;
|
|
return intcol;
|
|
}
|
|
return Number(val);
|
|
}
|
|
|
|
function dataTotext(data) {
|
|
return b64ToText(data.split('base64,')[1]);
|
|
}
|
|
function b64ToText(base64) {
|
|
const binString = atob(base64);
|
|
return new TextDecoder().decode(Uint8Array.from(binString, (m) => m.codePointAt(0)));
|
|
}
|
|
|
|
function waiter(size = 50, col = 'var(--prim)', block = true) {
|
|
return `<div class="waiter ${block ? 'waiter_b' : ''}"><span style="font-size:${size}px;color:${col}" class="icon spinning"></span></div>`;
|
|
}
|
|
|
|
function adjustColor(col, ratio) {
|
|
let newcol = 0;
|
|
for (let i = 0; i < 3; i++) {
|
|
let comp = (col & 0xff0000) >> 16;
|
|
comp = Math.min(255, Math.floor((comp + 1) * ratio));
|
|
newcol <<= 8;
|
|
newcol |= comp;
|
|
col <<= 8;
|
|
}
|
|
return newcol;
|
|
}
|