/* global React */
const { useState, useEffect, useRef, useMemo } = React;
// ─── Marquee ───────────────────────────────────────────────
function Marquee({ items, speed=28 }){
return (
{[0,1].map(i => (
{items.map((it, n) => (
{it.text}{' ◇ '}
))}
))}
);
}
// ─── ASCII Logo ────────────────────────────────────────────
const LOGO_LINES = [
" _ ______ __ __ __ _______________",
" / | / / __ \\/ //_// //_/__ < /__ /",
" / |/ / / / / ,< / ,< / // / / / ",
" / /| / /_/ / /| |/ /| |_ / // / / / ",
"/_/ |_/\\____/_/ |_/_/ |_(_)_//_/ /_/ ",
];
function AsciiLogo({ glitch=true }){
const text = LOGO_LINES.join("\n");
return (
);
}
// ─── Alias / nickname ──────────────────────────────────────
function Alias(){
return (
alias
::
@nokk.717
// angel.engine / R.A.D.I.D.
);
}
// ─── Status row ────────────────────────────────────────────
function StatusRow({ status="ONLINE" }){
return (
Object:
////////////
tattoo / digital artist
Location:
//////
Astana, KZ
Status:
/////////
{status}
);
}
// ─── Section header ────────────────────────────────────────
function SectionHead({ num, title, sub }){
return (
[{num}]
{title}
{sub && {sub}}
);
}
// ─── Topbar (back button) ─────────────────────────────────
function Topbar({ left, title, onBack }){
return (
{title}
{left}
);
}
// ─── Footer marks ──────────────────────────────────────────
function FooterMarks(){
const I = window.Icons;
return (
N717tattoo
©'25nokk
◀◀back
BLK
WORK
▶▶next
);
}
// ─── Terminal foot ─────────────────────────────────────────
function TermFoot(){
const [t, setT] = useState(() => new Date());
useEffect(()=>{ const id = setInterval(()=>setT(new Date()), 1000); return ()=>clearInterval(id); }, []);
const pad = (n) => String(n).padStart(2,'0');
const ts = `${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}`;
return (
nokk@dystopia ~ %
●
{ts} ASTN
);
}
window.Components = { Marquee, AsciiLogo, StatusRow, SectionHead, Topbar, FooterMarks, TermFoot };