Andrea di Tuoro
Developer
Web Designer
Home
Portfolio
Code & Samples
Templates
Blog
Contatti
Instagram
@andrew_webdeveloper
Dark
Dark
Navigazione
Menu rapido
Home
Ingresso
Portfolio
Lavori
Code & Samples
Pagina attuale
Templates
Modelli
Blog
Articoli
Contatti
Scrivimi
Instagram
@andrew_webdeveloper
HTML
<section class="ngx" data-ngx-root data-ngx-state="idle"> <div class="ngx__aurora" aria-hidden="true"></div> <div class="ngx__grid" aria-hidden="true"></div> <div class="ngx__ring" aria-hidden="true"></div> <pre class="ngx__telemetry" data-ngx-tel>// NGX.SYNC · WAIT</pre> <div class="ngx__plate"> <div class="ngx__plate-inner"> <header class="ngx__head"> <span class="ngx__glyph" aria-hidden="true">◈</span> <h1 class="ngx__h">Clearance</h1> <p class="ngx__lead">One channel. Encrypted edge. You vector in.</p> </header> <form class="ngx__form" id="ngx-form" novalidate> <label class="ngx-field"> <span class="ngx-field__label">Identifier</span> <input class="ngx-field__input" type="email" name="email" id="ngx-mail" autocomplete="username" inputmode="email" placeholder="" data-ngx-mail required /> <span class="ngx-field__rail" aria-hidden="true"></span> </label> <div class="ngx-field"> <div class="ngx-field__row"> <label class="ngx-field__stretch" for="ngx-pass"> <span class="ngx-field__label">Token</span> </label> <button type="button" class="ngx-unseal" data-ngx-unseal aria-pressed="false" aria-controls="ngx-pass"> <span class="ngx-unseal__t">Unseal</span> </button> </div> <div class="ngx-secret"> <input class="ngx-field__input ngx-field__input--token" type="password" name="password" id="ngx-pass" autocomplete="current-password" placeholder="" data-ngx-pass required /> <span class="ngx-field__rail" aria-hidden="true"></span> </div> <div class="ngx-spectrum" data-ngx-spectrum data-score="0" aria-label="Token density"> <span class="ngx-spectrum__cap"></span> <span class="ngx-spectrum__cap"></span> <span class="ngx-spectrum__cap"></span> <span class="ngx-spectrum__cap"></span> <span class="ngx-spectrum__cap"></span> </div> </div> <div class="ngx__meta"> <label class="ngx-persist"> <input type="checkbox" name="remember" class="ngx-persist__chk" /> <span class="ngx-persist__ui" aria-hidden="true"></span> <span class="ngx-persist__txt">Bind this shell</span> </label> <a class="ngx-ghost" href="#" tabindex="-1">Recover token</a> </div> <button type="submit" class="ngx-beam" data-ngx-send> <span class="ngx-beam__label">Transmit</span> <span class="ngx-beam__sheen" aria-hidden="true"></span> </button> </form> </div> </div> </section>
CSS
@import url("https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=Syne:wght@500;600;700;800&display=swap"); @property --spin { syntax: "<angle>"; inherits: false; initial-value: 0deg; } .ngx { --void: #030308; --mist: rgba(232, 240, 255, 0.06); --line: rgba(255, 255, 255, 0.1); --ink: #f0f4ff; --dim: #7a849e; --hot: #7cf0ff; --hot2: #c4a7ff; --ok: #5ef5c3; --mx: 50%; --my: 45%; --spin: 0deg; font-family: Syne, ui-sans-serif, system-ui, sans-serif; color: var(--ink); min-height: min(100vh, 40rem); width: min(100%, 28rem); margin: 0 auto; position: relative; display: grid; place-items: center; padding: clamp(1rem, 4vw, 2rem); isolation: isolate; overflow: hidden; } .ngx *, .ngx *::before, .ngx *::after { box-sizing: border-box; } .ngx__aurora { --spin: 0deg; position: absolute; inset: -40%; z-index: 0; background: radial-gradient(ellipse 55% 42% at var(--mx) var(--my), rgba(124, 240, 255, 0.14), transparent 55%), radial-gradient(ellipse 40% 36% at 72% 34%, rgba(196, 167, 255, 0.12), transparent 50%), conic-gradient(from var(--spin) at 50% 50%, rgba(124, 240, 255, 0.07), transparent 28%, rgba(196, 167, 255, 0.06), transparent 62%, rgba(94, 245, 195, 0.05), transparent 88%); animation: ngx-spin 48s linear infinite; pointer-events: none; } @keyframes ngx-spin { from { --spin: 0deg; } to { --spin: 360deg; } } .ngx__grid { position: absolute; inset: 0; z-index: 1; opacity: 0.22; background-image: linear-gradient(rgba(255, 255, 255, 0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, 0.04) 1px, transparent 1px); background-size: 48px 48px; mask-image: radial-gradient(ellipse 70% 65% at 50% 48%, black 0%, transparent 72%); pointer-events: none; } .ngx__ring { position: absolute; left: 50%; top: 44%; width: min(120vw, 52rem); height: min(120vw, 52rem); transform: translate(-50%, -50%); z-index: 1; border: 1px solid rgba(124, 240, 255, 0.07); border-radius: 50%; pointer-events: none; animation: ngx-pulse 7s ease-in-out infinite; } .ngx__ring::after { content: ""; position: absolute; inset: 12%; border: 1px dashed rgba(196, 167, 255, 0.11); border-radius: 50%; animation: ngx-pulse 11s ease-in-out infinite reverse; } @keyframes ngx-pulse { 0%, 100% { opacity: 0.55; transform: translate(-50%, -50%) scale(1); } 50% { opacity: 1; transform: translate(-50%, -50%) scale(1.03); } } .ngx__telemetry { position: absolute; left: clamp(0.75rem, 3vw, 1.25rem); top: clamp(0.75rem, 3vw, 1.25rem); z-index: 4; margin: 0; font-family: "IBM Plex Mono", ui-monospace, monospace; font-size: 0.62rem; font-weight: 500; letter-spacing: 0.08em; color: rgba(124, 240, 255, 0.55); white-space: pre; pointer-events: none; } .ngx__plate { position: relative; z-index: 3; width: 100%; border-radius: 1.35rem; padding: 1px; background: linear-gradient(135deg, rgba(124, 240, 255, 0.35), rgba(196, 167, 255, 0.2), rgba(94, 245, 195, 0.15)); box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 28px 80px -40px rgba(0, 0, 0, 0.9), 0 0 120px -60px rgba(124, 240, 255, 0.25); } .ngx__plate-inner { border-radius: calc(1.35rem - 1px); background: rgba(6, 8, 18, 0.72); backdrop-filter: blur(22px) saturate(1.2); -webkit-backdrop-filter: blur(22px) saturate(1.2); padding: clamp(1.35rem, 4vw, 2rem); border: 1px solid var(--mist); } .ngx__head { text-align: center; margin-bottom: 1.65rem; } .ngx__glyph { display: inline-block; font-size: 1.35rem; color: var(--hot); text-shadow: 0 0 24px rgba(124, 240, 255, 0.45); animation: ngx-breathe 4s ease-in-out infinite; } @keyframes ngx-breathe { 0%, 100% { opacity: 0.85; transform: scale(1); } 50% { opacity: 1; transform: scale(1.06); } } .ngx__h { margin: 0.35rem 0 0; font-size: clamp(1.65rem, 5vw, 2.05rem); font-weight: 800; letter-spacing: -0.04em; line-height: 1.05; } .ngx__lead { margin: 0.55rem 0 0; font-size: 0.82rem; line-height: 1.45; color: var(--dim); max-width: 20rem; margin-inline: auto; } .ngx__form { display: flex; flex-direction: column; gap: 1.25rem; } .ngx-field { display: flex; flex-direction: column; gap: 0.38rem; position: relative; } .ngx-field__row { display: flex; align-items: baseline; justify-content: space-between; gap: 0.75rem; } .ngx-field__stretch { flex: 1; margin: 0; cursor: pointer; } .ngx-field__label { display: block; font-family: "IBM Plex Mono", ui-monospace, monospace; font-size: 0.62rem; font-weight: 600; letter-spacing: 0.22em; text-transform: uppercase; color: rgba(122, 132, 158, 0.95); } .ngx-field__input { width: 100%; padding: 0.72rem 0 0.5rem; font: inherit; font-size: 1.02rem; font-weight: 600; letter-spacing: 0.02em; color: var(--ink); background: transparent; border: none; outline: none; caret-color: var(--hot); } .ngx-field__input::placeholder { color: transparent; } .ngx-field__rail { display: block; height: 2px; margin-top: 0.15rem; border-radius: 2px; background: linear-gradient(90deg, var(--hot), var(--hot2)); transform-origin: left center; transform: scaleX(0.15); opacity: 0.45; transition: transform 0.45s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.35s ease; } .ngx-field:focus-within .ngx-field__rail { transform: scaleX(1); opacity: 1; } .ngx-secret { position: relative; } .ngx-unseal { font-family: "IBM Plex Mono", ui-monospace, monospace; font-size: 0.58rem; font-weight: 600; letter-spacing: 0.18em; text-transform: uppercase; color: var(--hot); background: rgba(124, 240, 255, 0.08); border: 1px solid rgba(124, 240, 255, 0.22); border-radius: 999px; padding: 0.35rem 0.75rem; cursor: pointer; transition: background 0.2s, border-color 0.2s, color 0.2s; } .ngx-unseal:hover { background: rgba(124, 240, 255, 0.14); border-color: rgba(124, 240, 255, 0.4); } .ngx-unseal[aria-pressed="true"] { color: var(--hot2); border-color: rgba(196, 167, 255, 0.45); } .ngx-spectrum { display: flex; gap: 4px; margin-top: 0.35rem; height: 4px; } .ngx-spectrum__cap { flex: 1; border-radius: 2px; background: rgba(255, 255, 255, 0.06); transition: background 0.25s ease, box-shadow 0.25s ease, transform 0.25s ease; } .ngx-spectrum[data-score="1"] .ngx-spectrum__cap:nth-child(-n + 1), .ngx-spectrum[data-score="2"] .ngx-spectrum__cap:nth-child(-n + 2), .ngx-spectrum[data-score="3"] .ngx-spectrum__cap:nth-child(-n + 3), .ngx-spectrum[data-score="4"] .ngx-spectrum__cap:nth-child(-n + 4), .ngx-spectrum[data-score="5"] .ngx-spectrum__cap:nth-child(-n + 5) { background: linear-gradient(90deg, var(--hot), var(--hot2)); box-shadow: 0 0 12px rgba(124, 240, 255, 0.35); transform: scaleY(1.35); } .ngx__meta { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; flex-wrap: wrap; } .ngx-persist { display: inline-flex; align-items: center; gap: 0.45rem; cursor: pointer; font-size: 0.72rem; color: var(--dim); user-select: none; } .ngx-persist__chk { position: absolute; opacity: 0; width: 0; height: 0; } .ngx-persist__ui { width: 0.9rem; height: 0.9rem; border-radius: 0.2rem; border: 1px solid var(--line); background: rgba(255, 255, 255, 0.03); transition: border-color 0.2s, background 0.2s, box-shadow 0.2s; } .ngx-persist__chk:checked + .ngx-persist__ui { background: rgba(124, 240, 255, 0.2); border-color: var(--hot); box-shadow: 0 0 12px rgba(124, 240, 255, 0.25); } .ngx-persist__chk:focus-visible + .ngx-persist__ui { outline: 2px solid var(--hot); outline-offset: 2px; } .ngx-ghost { font-family: "IBM Plex Mono", ui-monospace, monospace; font-size: 0.58rem; letter-spacing: 0.14em; text-transform: uppercase; color: rgba(196, 167, 255, 0.85); text-decoration: none; border-bottom: 1px solid transparent; transition: border-color 0.2s, color 0.2s; } .ngx-ghost:hover { border-bottom-color: rgba(196, 167, 255, 0.4); color: var(--hot2); } .ngx-beam { position: relative; margin-top: 0.35rem; width: 100%; padding: 0.88rem 1.25rem; border: none; border-radius: 0.65rem; cursor: pointer; font: inherit; font-size: 0.78rem; font-weight: 700; letter-spacing: 0.28em; text-transform: uppercase; color: #031016; background: linear-gradient(105deg, var(--hot) 0%, #8ae8ff 35%, var(--hot2) 100%); background-size: 200% 100%; overflow: hidden; transition: background-position 0.5s ease, transform 0.15s ease, box-shadow 0.35s ease; box-shadow: 0 0 40px -12px rgba(124, 240, 255, 0.55), 0 1px 0 rgba(255, 255, 255, 0.35) inset; } .ngx-beam:hover { background-position: 100% 0; box-shadow: 0 0 56px -8px rgba(124, 240, 255, 0.65), 0 1px 0 rgba(255, 255, 255, 0.45) inset; } .ngx-beam:active { transform: scale(0.985); } .ngx-beam__sheen { position: absolute; inset: 0; background: linear-gradient(105deg, transparent 0%, rgba(255, 255, 255, 0.35) 48%, transparent 96%); transform: translateX(-100%); animation: ngx-sheen 3.2s ease-in-out infinite; pointer-events: none; } @keyframes ngx-sheen { 0% { transform: translateX(-120%); } 40%, 100% { transform: translateX(120%); } } .ngx[data-ngx-state="sent"] .ngx-beam { background: linear-gradient(105deg, var(--ok), #8cf5d0); box-shadow: 0 0 48px -6px rgba(94, 245, 195, 0.55); } .ngx[data-ngx-state="sent"] .ngx-beam__sheen { animation: none; opacity: 0; } .ngx[data-ngx-state="sent"] .ngx__plate { animation: ngx-win 0.9s ease forwards; } @keyframes ngx-win { 0% { filter: brightness(1); } 40% { filter: brightness(1.15) drop-shadow(0 0 20px rgba(94, 245, 195, 0.4)); } 100% { filter: brightness(1); } } @media (prefers-reduced-motion: reduce) { .ngx__aurora, .ngx__ring, .ngx__ring::after, .ngx__glyph, .ngx-beam__sheen { animation: none; } .ngx-field__rail { transition: none; } }
JS
(function () { const root = document.querySelector("[data-ngx-root]"); if (!root) return; const tel = root.querySelector("[data-ngx-tel]"); const mail = root.querySelector("[data-ngx-mail]"); const pass = root.querySelector("[data-ngx-pass]"); const unseal = root.querySelector("[data-ngx-unseal]"); const unsealT = root.querySelector(".ngx-unseal__t"); const spectrum = root.querySelector("[data-ngx-spectrum]"); const form = root.querySelector("#ngx-form"); const send = root.querySelector("[data-ngx-send]"); const sendLabel = root.querySelector(".ngx-beam__label"); const scorePass = (v) => { let s = 0; if (v.length >= 6) s++; if (v.length >= 10) s++; if (/[a-z]/.test(v) && /[A-Z]/.test(v)) s++; if (/\d/.test(v)) s++; if (/[^a-zA-Z0-9]/.test(v)) s++; return Math.min(5, s); }; const paintSpectrum = () => { if (!spectrum || !pass) return; spectrum.dataset.score = String(scorePass(pass.value)); }; const setAurora = (x, y) => { const r = root.getBoundingClientRect(); const px = ((x - r.left) / r.width) * 100; const py = ((y - r.top) / r.height) * 100; root.style.setProperty("--mx", `${Math.max(8, Math.min(92, px)).toFixed(2)}%`); root.style.setProperty("--my", `${Math.max(8, Math.min(92, py)).toFixed(2)}%`); }; const tickTel = (x, y) => { if (!tel) return; const hx = (x >>> 0).toString(16).slice(-4).padStart(4, "0"); const hy = (y >>> 0).toString(16).slice(-4).padStart(4, "0"); tel.textContent = `// NGX · VEC 0x${hx}:${hy} · ${document.activeElement === mail ? "ID" : document.activeElement === pass ? "TK" : "—"}`; }; let lx = window.innerWidth * 0.5; let ly = window.innerHeight * 0.45; window.addEventListener( "mousemove", (e) => { lx = e.clientX; ly = e.clientY; setAurora(lx, ly); tickTel(Math.floor(lx), Math.floor(ly)); }, { passive: true } ); setAurora(lx, ly); tickTel(Math.floor(lx), Math.floor(ly)); mail?.addEventListener("input", paintSpectrum); pass?.addEventListener("input", paintSpectrum); mail?.addEventListener("focus", () => tickTel(Math.floor(lx), Math.floor(ly))); pass?.addEventListener("focus", () => tickTel(Math.floor(lx), Math.floor(ly))); unseal?.addEventListener("click", () => { const open = pass?.type === "password"; if (pass) pass.type = open ? "text" : "password"; unseal.setAttribute("aria-pressed", open ? "true" : "false"); if (unsealT) unsealT.textContent = open ? "Seal" : "Unseal"; }); form?.addEventListener("submit", (e) => { e.preventDefault(); if (!form.checkValidity()) { form.reportValidity(); return; } root.dataset.ngxState = "sent"; if (sendLabel) sendLabel.textContent = "Locked in"; if (send) send.disabled = true; window.setTimeout(() => { root.dataset.ngxState = "idle"; if (sendLabel) sendLabel.textContent = "Transmit"; if (send) send.disabled = false; }, 2200); }); paintSpectrum(); })();
Clearance — login NGX