Files
2026-10-05 22:34:08 -04:00

229 lines
10 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Ayushya.dev</title>
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
:root{
--bg:#fafaf9; --fg:#141414; --muted:#6b6b68; --accent:#2563eb;
--border:#141414; --card-bg:#ffffff; --divider:#dcdcd8; --limb:#c7c7c2;
--accent-bg:#2563eb; --accent-fg:#ffffff;
}
@media (prefers-color-scheme: dark){
:root{
--bg:#0b0d0f; --fg:#f2f2f0; --muted:#9a9a95; --accent:#64a1fb;
--border:#f2f2f0; --card-bg:#141719; --divider:#2b2e31; --limb:#33373b;
--accent-bg:#64a1fb; --accent-fg:#0b0d0f;
}
}
*{box-sizing:border-box;}
html,body{margin:0;padding:0;}
body{background:var(--bg);color:var(--fg);font-family:'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;}
a{color:inherit;text-decoration:none;}
h1,h2,h3,p{margin:0;}
.page{max-width:1120px;margin:0 auto;padding:40px 24px 56px;}
/* Bento grid: 4 columns, 160px rows */
.bento{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:160px;gap:16px;}
.tile{position:relative;overflow:hidden;background:var(--card-bg);border:1px solid var(--divider);border-radius:20px;padding:22px;display:flex;flex-direction:column;justify-content:space-between;transition:border-color .15s ease,transform .15s ease;}
a.tile:hover{border-color:var(--border);transform:translateY(-2px);}
a.tile:focus-visible{outline:2px solid var(--accent);outline-offset:2px;}
.label{font-size:11px;letter-spacing:0.14em;color:var(--muted);}
.arrow{font-size:18px;color:var(--accent);align-self:flex-end;transition:transform .15s ease;}
a.tile:hover .arrow{transform:translate(3px,-3px);}
.hero{grid-column:span 2;grid-row:span 2;border-color:var(--border);}
.hero h1{font-size:clamp(28px,4.4vw,48px);font-weight:700;letter-spacing:0.02em;line-height:1.05;}
.hero h1 span{color:var(--accent);}
.hero p.tagline{font-size:13px;line-height:1.6;color:var(--muted);max-width:34ch;}
.robot-tile{grid-column:span 1;grid-row:span 2;align-items:center;justify-content:center;}
.project{grid-column:span 1;grid-row:span 1;gap:10px;justify-content:flex-start;}
.project.wide{grid-column:span 2;}
.avatar{width:40px;height:40px;border-radius:50%;border:1px solid var(--accent);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;color:var(--accent);flex-shrink:0;}
.project h3{font-size:13px;font-weight:700;letter-spacing:0.04em;}
.project p.desc{font-size:12px;line-height:1.5;color:var(--muted);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.project .arrow{position:absolute;top:18px;right:20px;}
.social{align-items:flex-start;}
.social .name{font-size:15px;font-weight:700;letter-spacing:0.06em;}
.accent-tile{background:var(--accent-bg);color:var(--accent-fg);border-color:var(--accent-bg);}
.accent-tile .label{color:inherit;opacity:.75;}
.accent-tile .arrow{color:inherit;}
.email{grid-column:span 2;}
.email .addr{font-size:clamp(14px,2.2vw,20px);font-weight:700;letter-spacing:0.04em;word-break:break-all;}
.terminal{grid-column:span 2;font-size:12px;color:var(--muted);}
.marquee-wrap{overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent);mask-image:linear-gradient(90deg,transparent,#000 10%,#000 90%,transparent);letter-spacing:0.08em;}
.marquee-track{display:inline-block;white-space:nowrap;animation:scrollLeft 20s linear infinite;}
@keyframes scrollLeft{from{transform:translateX(0);}to{transform:translateX(-50%);}}
.prompt{color:var(--fg);}
.prompt b{color:var(--accent);}
.cursor{display:inline-block;width:8px;height:14px;background:var(--accent);vertical-align:-2px;animation:blink 1s steps(1) infinite;}
@keyframes blink{50%{opacity:0;}}
/* Robot (scaled to fit the tile) */
.robot{display:flex;flex-direction:column;align-items:center;transform:scale(.62);transform-origin:center;}
.antenna-wire{width:2px;height:20px;background:var(--fg);}
.antenna-seg-1{width:2px;height:12px;background:var(--fg);transform:rotate(28deg) translateX(3px);}
.antenna-seg-2{width:2px;height:12px;background:var(--fg);transform:rotate(-28deg) translateX(-3px);margin-top:-2px;}
.antenna-tip{width:10px;height:10px;border-radius:50%;background:var(--fg);margin-top:2px;}
.head{width:140px;height:118px;margin-top:14px;border:2px solid var(--fg);border-radius:30px;background:var(--card-bg);display:flex;align-items:center;justify-content:center;gap:20px;}
.eye-ball{width:34px;height:34px;border-radius:50%;background:var(--card-bg);border:2px solid var(--fg);position:relative;flex-shrink:0;}
.pupil{position:absolute;top:50%;left:50%;width:13px;height:13px;border-radius:50%;background:var(--fg);margin-top:-6.5px;margin-left:-6.5px;transition:transform .06s linear;}
.neck-gap{height:16px;}
.body-row{display:flex;align-items:flex-start;gap:10px;}
.arm{width:16px;height:118px;border-radius:10px;background:var(--limb);margin-top:10px;}
.torso{width:150px;height:150px;border:2px solid var(--fg);border-radius:26px;background:var(--card-bg);}
.leg-gap{height:10px;}
.legs-row{display:flex;gap:26px;}
.leg{width:20px;height:78px;border-radius:10px;background:var(--limb);}
@media (max-width: 880px){
.bento{grid-template-columns:repeat(2,1fr);}
.hero{grid-column:span 2;grid-row:span 1;}
.robot-tile{grid-column:span 1;grid-row:span 2;}
.project.wide{grid-column:span 2;}
}
@media (max-width: 520px){
.page{padding:24px 16px 40px;}
.bento{grid-auto-rows:minmax(150px,auto);gap:12px;}
.robot-tile{grid-column:span 2;grid-row:span 1;min-height:260px;}
.project,.project.wide,.social,.email,.terminal{grid-column:span 2;}
.social{grid-column:span 1;}
}
@media (prefers-reduced-motion: reduce){
.marquee-track,.cursor{animation:none;}
a.tile,.arrow{transition:none;}
}
</style>
</head>
<body>
<main class="page">
<div class="bento">
<section class="tile hero">
<p class="label">PORTFOLIO</p>
<div>
<h1>AYUSHYA<span>.DEV</span></h1>
</div>
<p class="tagline">Building apps, tools, and small corners of the web.</p>
</section>
<div class="tile robot-tile" aria-hidden="true">
<div class="robot">
<div class="antenna-wire"></div>
<div class="antenna-seg-1"></div>
<div class="antenna-seg-2"></div>
<div class="antenna-tip"></div>
<div class="head">
<div class="eye-ball" id="eyeLeft"><div class="pupil" id="pupilLeft"></div></div>
<div class="eye-ball" id="eyeRight"><div class="pupil" id="pupilRight"></div></div>
</div>
<div class="neck-gap"></div>
<div class="body-row">
<div class="arm"></div>
<div class="torso"></div>
<div class="arm"></div>
</div>
<div class="leg-gap"></div>
<div class="legs-row">
<div class="leg"></div>
<div class="leg"></div>
</div>
</div>
</div>
<a class="tile social accent-tile" href="https://github.com/ayushyamitabh/" target="_blank" rel="noopener noreferrer">
<span class="label">CODE</span>
<span class="name">GITHUB</span>
<span class="arrow">&#8599;</span>
</a>
<a class="tile social" href="https://linkedin.com/in/ayushyamitabh" target="_blank" rel="noopener noreferrer">
<span class="label">NETWORK</span>
<span class="name">LINKEDIN</span>
<span class="arrow">&#8599;</span>
</a>
<a class="tile project wide" href="https://noo.ayushya.dev" target="_blank" rel="noopener noreferrer">
<div class="avatar">N</div>
<h3>NOO</h3>
<p class="desc">A fast, native Nextcloud client built with Flutter and Material You &mdash; files, photos, activity, shares, and trash in one themed app.</p>
<span class="arrow">&#8599;</span>
</a>
<a class="tile project" href="https://watchparty-archive.web.app/" target="_blank" rel="noopener noreferrer">
<div class="avatar">WP</div>
<h3>CHROME WATCH PARTY</h3>
<p class="desc">Syncs streamed video across devices, with chat, GIFs, and free group calls.</p>
<span class="arrow">&#8599;</span>
</a>
<a class="tile project" href="https://vaxandme-archive.web.app/" target="_blank" rel="noopener noreferrer">
<div class="avatar">V&amp;M</div>
<h3>VAX &amp; ME</h3>
<p class="desc">Explains expected COVID-19 vaccine side effects, built from FDA data.</p>
<span class="arrow">&#8599;</span>
</a>
<div class="tile terminal" aria-hidden="true">
<p class="label">STATUS</p>
<div class="marquee-wrap"><span class="marquee-track" id="marquee"></span></div>
<p class="prompt"><b>&gt;</b> hello, world <span class="cursor"></span></p>
</div>
<a class="tile email accent-tile" href="mailto:hello@ayushya.dev">
<span class="label">SAY HELLO</span>
<span class="addr">HELLO@AYUSHYA.DEV</span>
<span class="arrow">&#8599;</span>
</a>
</div>
</main>
<script>
(function () {
var binary = (function (len) {
var out = '';
for (var i = 0; i < len; i++) {
out += Math.random() < 0.5 ? '0' : '1';
if (i % 4 === 3) out += ' ';
}
return out;
})(80);
document.getElementById('marquee').textContent = binary + ' ' + binary;
var pairs = [
[document.getElementById('eyeLeft'), document.getElementById('pupilLeft')],
[document.getElementById('eyeRight'), document.getElementById('pupilRight')]
];
var MAX_OFFSET = 8;
var rafPending = false;
function updatePupils(clientX, clientY) {
pairs.forEach(function (pair) {
var rect = pair[0].getBoundingClientRect();
var cx = rect.left + rect.width / 2;
var cy = rect.top + rect.height / 2;
var angle = Math.atan2(clientY - cy, clientX - cx);
pair[1].style.transform = 'translate(' + (Math.cos(angle) * MAX_OFFSET) + 'px, ' + (Math.sin(angle) * MAX_OFFSET) + 'px)';
});
}
window.addEventListener('mousemove', function (e) {
if (rafPending) return;
rafPending = true;
var x = e.clientX, y = e.clientY;
requestAnimationFrame(function () { rafPending = false; updatePupils(x, y); });
});
})();
</script>
</body>
</html>