Files
.profile/public/css/style.css
T
SowinskiBraedenandClaude Opus 5 8595290318 redesign the site as a technical minimalist TUI
Replace the glassy hero treatment with a terminal and TUI vocabulary
while keeping the layout minimal:

- Switch the type stack to JetBrains Mono and flatten every surface:
  hairline borders, square corners, no blur or glow, and a faint
  graph-paper grid in place of the radial gradients.
- Rebuild the home hero as a terminal window whose output is typed in
  on load; the old mouse-parallax glow script becomes that typing
  sequence, and it no-ops under prefers-reduced-motion.
- Give the projects, about, and entry panels title bars, and render
  cards with a metadata strip, status dot, ISO date, and prompt-style
  links.
- Hide the inline nav behind the hamburger on narrow screens; the old
  rule was outranked by the #menu id selector and never applied.
- Add an SVG favicon, which also clears the only 404 on the site.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-17 23:41:38 -07:00

748 lines
13 KiB
CSS
Executable File

@import url("https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&display=swap");
:root {
--theme: #0c0d10;
--surface: #111318;
--surface-alt: #15171d;
--bar: #16181e;
--primary: #c9cdd6;
--bright: #eef1f6;
--secondary: #eb5234;
--accent: #ff005a;
--ok: #7fb069;
--muted: #767d8a;
--border: #262a33;
--border-strong: #3a404c;
--grid: rgba(255, 255, 255, 0.022);
--selection: rgba(235, 82, 52, 0.28);
--mono:
"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo,
Consolas, "Liberation Mono", monospace;
}
body.light {
--theme: #e7e7e2;
--surface: #f2f2ee;
--surface-alt: #ebebe5;
--bar: #ddddd6;
--primary: #24262b;
--bright: #0e0f12;
--secondary: #c8401f;
--accent: #c20046;
--ok: #4b7a3a;
--muted: #6a6e76;
--border: #cbcbc2;
--border-strong: #a9a9a0;
--grid: rgba(0, 0, 0, 0.03);
--selection: rgba(200, 64, 31, 0.22);
}
* {
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.25s linear,
color 0.25s linear;
}
/* Faint graph-paper grid, fixed so it reads as a backdrop, not content. */
body::before {
content: "";
position: fixed;
inset: 0;
z-index: 0;
pointer-events: none;
background-image:
linear-gradient(var(--grid) 1px, transparent 1px),
linear-gradient(90deg, var(--grid) 1px, transparent 1px);
background-size: 28px 28px;
}
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.01em;
color: var(--bright);
}
a {
color: var(--primary);
text-decoration: none;
transition:
color 0.12s linear,
background-color 0.12s linear,
border-color 0.12s linear;
}
a:hover {
cursor: pointer;
color: var(--secondary);
}
ul {
margin: 0;
padding: 0;
}
code,
kbd,
samp,
pre {
font-family: var(--mono);
}
/* ---------------------------------------------------------------- header */
.header {
position: relative;
z-index: 1000;
border-bottom: 1px solid var(--border);
background: var(--bar);
}
.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: 46px;
}
.logo {
display: flex;
align-items: center;
gap: 10px;
}
.logo a {
display: inline-flex;
align-items: center;
gap: 8px;
font-size: 14px;
font-weight: 700;
color: var(--bright);
letter-spacing: 0.01em;
}
.logo a::before {
content: "~/";
color: var(--secondary);
font-weight: 400;
}
.logo a img {
display: block;
pointer-events: none;
border-radius: 2px !important;
width: 22px;
height: 22px;
border: 1px solid var(--border-strong);
filter: grayscale(0.25);
}
.logo a:hover {
color: var(--secondary);
}
#menu {
display: flex;
align-items: center;
list-style: none;
gap: 4px;
white-space: nowrap;
overflow-x: auto;
}
#menu a {
display: block;
font-size: 13px;
text-transform: lowercase;
padding: 3px 9px;
border: 1px solid transparent;
color: var(--muted);
}
#menu a::before {
content: "[";
color: var(--border-strong);
margin-right: 2px;
}
#menu a::after {
content: "]";
color: var(--border-strong);
margin-left: 2px;
}
#menu a:hover {
color: var(--secondary);
}
#menu a:hover::before,
#menu a:hover::after {
color: var(--secondary);
}
body[data-page="home"] #home-link a,
body[data-page="about"] #about-link a,
body[data-page="projects"] #projects-link a {
color: var(--bright);
background: var(--surface-alt);
border-color: var(--border);
}
body[data-page="home"] #home-link a::before,
body[data-page="about"] #about-link a::before,
body[data-page="projects"] #projects-link a::before,
body[data-page="home"] #home-link a::after,
body[data-page="about"] #about-link a::after,
body[data-page="projects"] #projects-link a::after {
color: var(--secondary);
}
.logo-switches {
display: inline-flex;
align-items: center;
}
button#theme-toggle {
background: transparent;
border: 1px solid var(--border);
color: var(--muted);
padding: 2px 5px;
height: 24px;
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition:
color 0.12s linear,
border-color 0.12s linear;
}
button#theme-toggle svg {
height: 13px;
width: 13px;
}
button#theme-toggle:hover {
color: var(--secondary);
border-color: var(--secondary);
}
body.light #moon {
display: none;
}
body:not(.light) #sun {
display: none;
}
.menu.cta {
display: none;
margin: 0;
text-transform: lowercase;
padding: 2px 8px;
font-size: 13px;
cursor: pointer;
border: 1px solid var(--border);
color: var(--muted);
}
.menu.cta::before {
content: "≡ ";
color: var(--secondary);
}
.menu.cta:hover {
color: var(--secondary);
border-color: var(--secondary);
}
/* --------------------------------------------------------------- overlay */
.overlay {
position: fixed;
inset: 0;
z-index: 2147483647;
isolation: isolate;
background: var(--theme);
overflow: hidden;
opacity: 0;
visibility: hidden;
pointer-events: none;
transition:
opacity 0.15s linear,
visibility 0.15s linear;
}
.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: 6px;
}
.overlay a {
color: var(--primary);
text-transform: lowercase;
padding: 10px 18px;
font-size: 1.3rem;
display: block;
text-align: left;
width: min(320px, 80%);
border: 1px solid var(--border);
background: var(--surface);
}
.overlay a::before {
content: "> ";
color: var(--secondary);
}
.overlay a:hover,
.overlay a:focus {
color: var(--bright);
border-color: var(--secondary);
background: var(--surface-alt);
}
.overlay .close {
position: absolute;
z-index: 3;
top: 14px;
right: 18px;
font-size: 26px;
line-height: 1;
font-family: var(--mono);
color: var(--muted);
cursor: pointer;
border: 1px solid var(--border);
background: transparent;
padding: 0 10px;
}
.overlay .close:hover {
color: var(--secondary);
border-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: 28px;
}
/* ------------------------------------------------------- terminal window */
.main {
width: min(1120px, calc(100% - 32px));
margin: 34px auto 0;
padding-bottom: 28px;
}
.term {
border: 1px solid var(--border);
background: var(--surface);
}
body[data-page="home"] .main {
display: flex;
min-height: calc(100vh - 110px);
}
body[data-page="home"] .term {
flex: 1;
display: flex;
flex-direction: column;
}
body[data-page="home"] .term__body {
flex: 1;
align-content: start;
}
.term__bar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 5px 10px;
background: var(--bar);
border-bottom: 1px solid var(--border);
font-size: 12px;
color: var(--muted);
}
.term__title {
color: var(--muted);
}
.term__title b {
color: var(--primary);
font-weight: 500;
}
.term__dots {
letter-spacing: 2px;
color: var(--border-strong);
}
.term__body {
display: grid;
grid-template-columns: auto 1fr;
gap: 26px;
padding: 22px 22px 18px;
}
.term__avatar {
width: 148px;
height: 148px;
object-fit: cover;
border: 1px solid var(--border-strong);
border-radius: 0;
filter: grayscale(0.3) contrast(1.03);
}
.term__avatar-wrap {
display: flex;
flex-direction: column;
gap: 8px;
align-items: flex-start;
}
.term__avatar-caption {
font-size: 11px;
color: var(--muted);
}
.term__stream {
min-width: 0;
}
.line {
margin: 0;
}
.line + .cmd {
margin-top: 16px;
}
.cmd {
color: var(--muted);
font-size: 13px;
}
.cmd::before {
content: "$ ";
color: var(--secondary);
font-weight: 700;
}
.name {
font-size: clamp(1.5rem, 3.2vw, 2.1rem);
font-weight: 700;
margin: 2px 0 0;
line-height: 1.2;
color: var(--bright);
}
.des {
margin: 2px 0 0;
font-size: 0.94rem;
}
.hero-description-secondary {
color: var(--muted);
}
.hero-badges {
display: flex;
gap: 8px;
flex-wrap: wrap;
margin-top: 6px;
}
.badge {
border: 1px solid var(--border);
background: var(--surface-alt);
color: var(--primary);
padding: 2px 8px;
font-size: 12px;
}
.badge::before {
content: "+ ";
color: var(--ok);
}
.hero-actions {
display: flex;
gap: 10px;
flex-wrap: wrap;
margin-top: 6px;
}
.button {
display: inline-flex;
align-items: center;
border: 1px solid var(--border-strong);
background: var(--surface-alt);
color: var(--primary);
padding: 5px 12px;
font-size: 13px;
font-weight: 500;
}
.button::before {
content: ">\00a0";
color: var(--secondary);
}
.button:hover {
color: var(--bright);
border-color: var(--secondary);
background: var(--surface);
}
.button-primary {
border-color: var(--secondary);
color: var(--bright);
}
.button-primary:hover {
background: var(--secondary);
color: #0c0d10;
}
.button-primary:hover::before {
color: #0c0d10;
}
.prompt-end {
margin: 14px 0 0;
color: var(--secondary);
font-weight: 700;
}
.caret {
display: inline-block;
width: 0.6em;
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: 14px;
}
.social-icons a svg {
height: 15px;
width: 15px;
display: block;
}
.social-icons a {
color: var(--muted);
display: inline-flex;
}
.icon:hover {
color: var(--secondary);
}
/* --------------------------------------------------------- status footer */
.footer {
display: flex;
justify-content: space-between;
align-items: center;
gap: 16px;
padding: 0;
background: var(--bar);
border: 1px solid var(--border);
font-size: 12px;
}
.footer p {
margin: 0;
padding: 6px 12px;
color: var(--muted);
}
.footer p::before {
content: "";
display: inline-block;
width: 6px;
height: 6px;
background: var(--ok);
margin-right: 8px;
vertical-align: 1px;
}
.footer .social-icons {
padding: 6px 12px;
border-left: 1px solid var(--border);
}
.loading-state {
color: var(--muted);
}
.loading-state::before {
content: "… ";
}
/* ---------------------------------------------------------- responsive */
@media only screen and (max-width: 860px) {
#menu,
.term__avatar-wrap {
display: none;
}
.menu.cta {
display: block;
}
.nav {
min-height: 42px;
}
.term__body {
grid-template-columns: 1fr;
gap: 0;
padding: 18px 16px 14px;
}
.main {
margin-top: 22px;
width: min(1120px, calc(100% - 20px));
}
.page-shell {
width: min(1120px, calc(100% - 20px));
}
.footer {
display: block;
}
.footer .social-icons {
border-left: 0;
border-top: 1px solid var(--border);
}
}
@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;
}