The first pass applied terminal decoration to everything, which read as costume rather than design. Strip it back to a few deliberate cues and let an animated backdrop carry the character instead: - Drop the prefix glyphs from links, tags, nav items, badges and headings, and restore plain section names in place of snake_case. - Keep one prompt in the hero, the ~/ on the wordmark, ISO dates and status dots; everything else is ordinary type. - Restore depth: acrylic surfaces over soft radial light, 6px radii, and an accent glow on the primary action and status dots. - Draw a dithered ASCII field behind the page. A fixed per-cell dither value decides which cells are lit so coverage stays even, while slow interfering waves move brightness through it. It idles when the tab is hidden and stays still under prefers-reduced-motion. - Remove the nested panel boxes on the projects page and size the entry page to its article column. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
679 lines
12 KiB
CSS
Executable File
679 lines
12 KiB
CSS
Executable File
@import url("https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&display=swap");
|
|
|
|
:root {
|
|
--theme: #0b0c0f;
|
|
--surface: rgba(21, 23, 28, 0.58);
|
|
--surface-raised: rgba(28, 31, 37, 0.62);
|
|
--bar: rgba(255, 255, 255, 0.035);
|
|
--primary: #cbcfd8;
|
|
--bright: #f1f3f7;
|
|
--secondary: #eb5234;
|
|
--accent: #ff005a;
|
|
--ok: #7fb069;
|
|
--muted: #7b8290;
|
|
--border: rgba(255, 255, 255, 0.09);
|
|
--border-strong: rgba(255, 255, 255, 0.18);
|
|
--glow: rgba(235, 82, 52, 0.16);
|
|
--shadow: 0 18px 50px rgba(0, 0, 0, 0.34);
|
|
--selection: rgba(235, 82, 52, 0.3);
|
|
--ascii-base: #8e97a8;
|
|
--ascii-accent: #eb5234;
|
|
--radius: 6px;
|
|
--mono:
|
|
"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo,
|
|
Consolas, "Liberation Mono", monospace;
|
|
}
|
|
|
|
body.light {
|
|
--theme: #e9e9e4;
|
|
--surface: rgba(255, 255, 255, 0.56);
|
|
--surface-raised: rgba(255, 255, 255, 0.72);
|
|
--bar: rgba(0, 0, 0, 0.035);
|
|
--primary: #2a2d33;
|
|
--bright: #101216;
|
|
--secondary: #c8401f;
|
|
--accent: #c20046;
|
|
--ok: #4b7a3a;
|
|
--muted: #6b6f78;
|
|
--border: rgba(0, 0, 0, 0.1);
|
|
--border-strong: rgba(0, 0, 0, 0.2);
|
|
--glow: rgba(200, 64, 31, 0.14);
|
|
--shadow: 0 18px 44px rgba(0, 0, 0, 0.1);
|
|
--selection: rgba(200, 64, 31, 0.22);
|
|
--ascii-base: #6f7682;
|
|
--ascii-accent: #c8401f;
|
|
}
|
|
|
|
* {
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
html {
|
|
scroll-behavior: smooth;
|
|
}
|
|
|
|
::selection {
|
|
background: var(--selection);
|
|
color: var(--bright);
|
|
}
|
|
|
|
body {
|
|
margin: 0;
|
|
font-family: var(--mono);
|
|
font-size: 15px;
|
|
line-height: 1.65;
|
|
font-variant-ligatures: none;
|
|
color: var(--primary);
|
|
background-color: var(--theme);
|
|
word-break: break-word;
|
|
min-height: 100vh;
|
|
position: relative;
|
|
overflow-x: hidden;
|
|
transition:
|
|
background-color 0.3s ease,
|
|
color 0.3s ease;
|
|
}
|
|
|
|
/* Soft light behind the ASCII field, so the page has depth without gloss. */
|
|
body::before {
|
|
content: "";
|
|
position: fixed;
|
|
inset: 0;
|
|
z-index: 0;
|
|
pointer-events: none;
|
|
background:
|
|
radial-gradient(circle at 18% 12%, var(--glow), transparent 42%),
|
|
radial-gradient(circle at 82% 8%, rgba(255, 0, 90, 0.07), transparent 38%),
|
|
radial-gradient(
|
|
circle at 50% 95%,
|
|
rgba(255, 255, 255, 0.035),
|
|
transparent 46%
|
|
);
|
|
filter: blur(28px);
|
|
}
|
|
|
|
#ascii-bg {
|
|
position: fixed;
|
|
inset: 0;
|
|
z-index: 0;
|
|
pointer-events: none;
|
|
opacity: 0.22;
|
|
}
|
|
|
|
body.light #ascii-bg {
|
|
opacity: 0.17;
|
|
}
|
|
|
|
body.js-stop-transition * {
|
|
transition: none !important;
|
|
}
|
|
|
|
header,
|
|
main,
|
|
.page-shell {
|
|
position: relative;
|
|
z-index: 1;
|
|
}
|
|
|
|
a,
|
|
h1,
|
|
h2,
|
|
h3,
|
|
h4,
|
|
p,
|
|
li,
|
|
dd,
|
|
dt {
|
|
color: var(--primary);
|
|
}
|
|
|
|
h1,
|
|
h2,
|
|
h3,
|
|
h4 {
|
|
font-weight: 700;
|
|
letter-spacing: -0.015em;
|
|
color: var(--bright);
|
|
}
|
|
|
|
a {
|
|
color: var(--primary);
|
|
text-decoration: none;
|
|
transition:
|
|
color 0.18s ease,
|
|
background-color 0.18s ease,
|
|
border-color 0.18s ease,
|
|
box-shadow 0.18s ease;
|
|
}
|
|
|
|
a:hover {
|
|
cursor: pointer;
|
|
color: var(--secondary);
|
|
}
|
|
|
|
ul {
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
|
|
code,
|
|
kbd,
|
|
samp,
|
|
pre {
|
|
font-family: var(--mono);
|
|
}
|
|
|
|
/* ---------------------------------------------------------------- header */
|
|
|
|
.header {
|
|
position: sticky;
|
|
top: 0;
|
|
z-index: 1000;
|
|
border-bottom: 1px solid var(--border);
|
|
background: var(--surface);
|
|
backdrop-filter: blur(16px) saturate(130%);
|
|
-webkit-backdrop-filter: blur(16px) saturate(130%);
|
|
}
|
|
|
|
.nav {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 12px;
|
|
width: min(1120px, calc(100% - 32px));
|
|
margin: 0 auto;
|
|
min-height: 52px;
|
|
}
|
|
|
|
.logo {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
}
|
|
|
|
.logo a {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 9px;
|
|
font-size: 14px;
|
|
font-weight: 700;
|
|
color: var(--bright);
|
|
}
|
|
|
|
.logo a::before {
|
|
content: "~/";
|
|
color: var(--secondary);
|
|
font-weight: 400;
|
|
}
|
|
|
|
.logo a img {
|
|
display: block;
|
|
pointer-events: none;
|
|
border-radius: 3px !important;
|
|
width: 22px;
|
|
height: 22px;
|
|
border: 1px solid var(--border);
|
|
}
|
|
|
|
.logo a:hover {
|
|
color: var(--secondary);
|
|
}
|
|
|
|
#menu {
|
|
display: flex;
|
|
align-items: center;
|
|
list-style: none;
|
|
gap: 22px;
|
|
white-space: nowrap;
|
|
overflow-x: auto;
|
|
}
|
|
|
|
#menu a {
|
|
display: block;
|
|
font-size: 13.5px;
|
|
color: var(--muted);
|
|
padding: 2px 0;
|
|
border-bottom: 1px solid transparent;
|
|
}
|
|
|
|
#menu a:hover {
|
|
color: var(--primary);
|
|
}
|
|
|
|
body[data-page="home"] #home-link a,
|
|
body[data-page="about"] #about-link a,
|
|
body[data-page="projects"] #projects-link a {
|
|
color: var(--bright);
|
|
border-bottom-color: var(--secondary);
|
|
}
|
|
|
|
.logo-switches {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
}
|
|
|
|
button#theme-toggle {
|
|
background: transparent;
|
|
border: 0;
|
|
color: var(--muted);
|
|
padding: 2px;
|
|
display: inline-flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
cursor: pointer;
|
|
transition: color 0.18s ease;
|
|
}
|
|
|
|
button#theme-toggle svg {
|
|
height: 14px;
|
|
width: 14px;
|
|
}
|
|
|
|
button#theme-toggle:hover {
|
|
color: var(--secondary);
|
|
}
|
|
|
|
body.light #moon {
|
|
display: none;
|
|
}
|
|
|
|
body:not(.light) #sun {
|
|
display: none;
|
|
}
|
|
|
|
.menu.cta {
|
|
display: none;
|
|
margin: 0;
|
|
padding: 4px 10px;
|
|
font-size: 13px;
|
|
cursor: pointer;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius);
|
|
color: var(--muted);
|
|
background: var(--bar);
|
|
}
|
|
|
|
.menu.cta:hover {
|
|
color: var(--secondary);
|
|
border-color: var(--border-strong);
|
|
}
|
|
|
|
/* --------------------------------------------------------------- overlay */
|
|
|
|
.overlay {
|
|
position: fixed;
|
|
inset: 0;
|
|
z-index: 2147483647;
|
|
isolation: isolate;
|
|
background: rgba(11, 12, 15, 0.82);
|
|
backdrop-filter: blur(18px) saturate(130%);
|
|
-webkit-backdrop-filter: blur(18px) saturate(130%);
|
|
overflow: hidden;
|
|
opacity: 0;
|
|
visibility: hidden;
|
|
pointer-events: none;
|
|
transition:
|
|
opacity 0.2s ease,
|
|
visibility 0.2s ease;
|
|
}
|
|
|
|
body.light .overlay {
|
|
background: rgba(233, 233, 228, 0.86);
|
|
}
|
|
|
|
.overlay--active {
|
|
opacity: 1;
|
|
visibility: visible;
|
|
pointer-events: auto;
|
|
}
|
|
|
|
.overlay__content {
|
|
position: relative;
|
|
z-index: 2;
|
|
display: flex;
|
|
min-height: 100%;
|
|
width: 100%;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 4px;
|
|
}
|
|
|
|
.overlay a {
|
|
color: var(--primary);
|
|
padding: 12px 20px;
|
|
font-size: 1.4rem;
|
|
display: block;
|
|
text-align: center;
|
|
width: min(300px, 80%);
|
|
}
|
|
|
|
.overlay a:hover,
|
|
.overlay a:focus {
|
|
color: var(--secondary);
|
|
}
|
|
|
|
.overlay .close {
|
|
position: absolute;
|
|
z-index: 3;
|
|
top: 14px;
|
|
right: 18px;
|
|
font-size: 28px;
|
|
line-height: 1;
|
|
font-family: var(--mono);
|
|
color: var(--muted);
|
|
cursor: pointer;
|
|
border: 0;
|
|
background: transparent;
|
|
padding: 0 8px;
|
|
}
|
|
|
|
.overlay .close:hover {
|
|
color: var(--secondary);
|
|
}
|
|
|
|
body.menu-open {
|
|
overflow: hidden;
|
|
}
|
|
|
|
body.menu-open main,
|
|
body.menu-open .page-shell,
|
|
body.menu-open .container,
|
|
body.menu-open .projects-page,
|
|
body.menu-open .entry-page,
|
|
body.menu-open .footer {
|
|
pointer-events: none;
|
|
}
|
|
|
|
body.menu-open .header,
|
|
body.menu-open .overlay,
|
|
body.menu-open .overlay * {
|
|
pointer-events: auto;
|
|
}
|
|
|
|
/* ------------------------------------------------------------ page shell */
|
|
|
|
.page-shell {
|
|
width: min(1120px, calc(100% - 32px));
|
|
margin: 0 auto;
|
|
padding-bottom: 36px;
|
|
}
|
|
|
|
/* ------------------------------------------------------- terminal window */
|
|
|
|
.main {
|
|
width: min(1120px, calc(100% - 32px));
|
|
margin: 0 auto;
|
|
padding: 0 0 36px;
|
|
display: flex;
|
|
align-items: center;
|
|
min-height: calc(100vh - 52px);
|
|
}
|
|
|
|
.term {
|
|
width: 100%;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius);
|
|
background: var(--surface);
|
|
backdrop-filter: blur(18px) saturate(140%);
|
|
-webkit-backdrop-filter: blur(18px) saturate(140%);
|
|
box-shadow: var(--shadow);
|
|
overflow: hidden;
|
|
}
|
|
|
|
.term__bar {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 7px;
|
|
padding: 9px 14px;
|
|
background: var(--bar);
|
|
border-bottom: 1px solid var(--border);
|
|
font-size: 12px;
|
|
color: var(--muted);
|
|
}
|
|
|
|
.term__dot {
|
|
width: 7px;
|
|
height: 7px;
|
|
border-radius: 50%;
|
|
background: var(--border-strong);
|
|
flex: none;
|
|
}
|
|
|
|
.term__dot:first-child {
|
|
background: rgba(235, 82, 52, 0.75);
|
|
}
|
|
|
|
.term__title {
|
|
margin-left: 8px;
|
|
}
|
|
|
|
.term__body {
|
|
display: grid;
|
|
grid-template-columns: auto 1fr;
|
|
gap: 34px;
|
|
padding: 34px 32px;
|
|
align-items: center;
|
|
}
|
|
|
|
.term__avatar {
|
|
width: 160px;
|
|
height: 160px;
|
|
object-fit: cover;
|
|
border-radius: var(--radius);
|
|
border: 1px solid var(--border-strong);
|
|
box-shadow:
|
|
var(--shadow),
|
|
0 0 0 6px rgba(235, 82, 52, 0.05);
|
|
}
|
|
|
|
.term__stream {
|
|
min-width: 0;
|
|
}
|
|
|
|
.cmd {
|
|
margin: 0 0 18px;
|
|
color: var(--muted);
|
|
font-size: 13px;
|
|
}
|
|
|
|
.cmd::before {
|
|
content: "$ ";
|
|
color: var(--secondary);
|
|
}
|
|
|
|
.name {
|
|
font-size: clamp(1.7rem, 3.6vw, 2.4rem);
|
|
font-weight: 700;
|
|
margin: 0;
|
|
line-height: 1.15;
|
|
color: var(--bright);
|
|
}
|
|
|
|
.des {
|
|
margin: 10px 0 0;
|
|
font-size: 0.95rem;
|
|
}
|
|
|
|
.hero-description-secondary {
|
|
color: var(--muted);
|
|
margin-top: 2px;
|
|
}
|
|
|
|
.hero-badges {
|
|
display: flex;
|
|
gap: 8px;
|
|
flex-wrap: wrap;
|
|
margin-top: 20px;
|
|
}
|
|
|
|
.badge {
|
|
border: 1px solid var(--border);
|
|
background: var(--bar);
|
|
color: var(--muted);
|
|
border-radius: var(--radius);
|
|
padding: 3px 10px;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.hero-actions {
|
|
display: flex;
|
|
gap: 10px;
|
|
flex-wrap: wrap;
|
|
margin-top: 22px;
|
|
}
|
|
|
|
.button {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius);
|
|
background: var(--bar);
|
|
color: var(--primary);
|
|
padding: 7px 16px;
|
|
font-size: 13px;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.button:hover {
|
|
color: var(--bright);
|
|
border-color: var(--border-strong);
|
|
}
|
|
|
|
.button-primary {
|
|
border-color: rgba(235, 82, 52, 0.5);
|
|
color: var(--bright);
|
|
background: rgba(235, 82, 52, 0.14);
|
|
box-shadow: 0 6px 22px rgba(235, 82, 52, 0.14);
|
|
}
|
|
|
|
.button-primary:hover {
|
|
border-color: var(--secondary);
|
|
background: rgba(235, 82, 52, 0.22);
|
|
box-shadow: 0 8px 28px rgba(235, 82, 52, 0.22);
|
|
}
|
|
|
|
.caret {
|
|
display: inline-block;
|
|
width: 0.55em;
|
|
height: 1em;
|
|
vertical-align: -0.15em;
|
|
background: var(--secondary);
|
|
animation: caret-blink 1.1s steps(1, end) infinite;
|
|
}
|
|
|
|
@keyframes caret-blink {
|
|
0%,
|
|
49% {
|
|
opacity: 1;
|
|
}
|
|
50%,
|
|
100% {
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
.social-icons {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 16px;
|
|
margin-top: 24px;
|
|
}
|
|
|
|
.social-icons a svg {
|
|
height: 16px;
|
|
width: 16px;
|
|
display: block;
|
|
}
|
|
|
|
.social-icons a {
|
|
color: var(--muted);
|
|
display: inline-flex;
|
|
}
|
|
|
|
.icon:hover {
|
|
color: var(--secondary);
|
|
}
|
|
|
|
/* ---------------------------------------------------------------- footer */
|
|
|
|
.footer {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
gap: 16px;
|
|
padding: 14px 18px;
|
|
background: var(--surface);
|
|
backdrop-filter: blur(16px) saturate(130%);
|
|
-webkit-backdrop-filter: blur(16px) saturate(130%);
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius);
|
|
font-size: 13px;
|
|
}
|
|
|
|
.footer p {
|
|
margin: 0;
|
|
color: var(--muted);
|
|
}
|
|
|
|
.footer .social-icons {
|
|
margin-top: 0;
|
|
}
|
|
|
|
.loading-state {
|
|
color: var(--muted);
|
|
}
|
|
|
|
/* ------------------------------------------------------------ responsive */
|
|
|
|
@media only screen and (max-width: 860px) {
|
|
#menu,
|
|
.term__avatar-wrap {
|
|
display: none;
|
|
}
|
|
|
|
.menu.cta {
|
|
display: block;
|
|
}
|
|
|
|
.main {
|
|
min-height: auto;
|
|
margin-top: 28px;
|
|
width: min(1120px, calc(100% - 20px));
|
|
}
|
|
|
|
.term__body {
|
|
grid-template-columns: 1fr;
|
|
gap: 0;
|
|
padding: 26px 20px;
|
|
}
|
|
|
|
.page-shell {
|
|
width: min(1120px, calc(100% - 20px));
|
|
}
|
|
|
|
.footer {
|
|
display: block;
|
|
}
|
|
|
|
.footer .social-icons {
|
|
margin-top: 12px;
|
|
}
|
|
}
|
|
|
|
@media (prefers-reduced-motion: reduce) {
|
|
.caret {
|
|
animation: none;
|
|
}
|
|
|
|
* {
|
|
transition: none !important;
|
|
}
|
|
}
|
|
|
|
/* Typing sequence: outputs keep their space while hidden, so nothing shifts. */
|
|
.is-typing-hidden {
|
|
visibility: hidden;
|
|
}
|