Files
eepp/bin/unit_tests/assets/html/body_height_miscalculation.css
2026-05-23 00:25:27 -03:00

3197 lines
73 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

:root {
--bg: #0c1520;
--bg-surface: #141f2e;
--bg-surface-2: #1a2637;
--text: #bfc8d2;
--text-muted: #566a7c;
--text-bright: #e4e9ee;
--accent: #d4a853;
--accent-hover: #e4bc6a;
--tag-color: #7eb8a8;
--eng-color: #3d7b8a;
--danger: #e07a5f;
--border: rgba(255, 255, 255, 0.07);
--border-strong: rgba(255, 255, 255, 0.12);
--max-width: 54rem;
--read-width: 54rem;
--font-text: text, "Roboto", -apple-system, BlinkMacSystemFont, sans-serif;
--font-mono: code, "JetBrains Mono", ui-monospace, SFMono-Regular, monospace;
--font-serif: serif, "Fraunces", "Iowan Old Style", Georgia, serif;
}
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
font-size: 17.5px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
scroll-behavior: smooth;
}
@media (max-width: 560px) {
html {
font-size: 16px;
}
}
body {
font-family: var(--font-text);
font-weight: 300;
line-height: 1.65;
color: var(--text);
background: var(--bg);
min-height: 100vh;
display: flex;
flex-direction: column;
overflow-x: clip;
}
::selection {
background: rgba(212, 168, 83, 0.25);
color: var(--text-bright);
}
a {
color: var(--accent);
text-decoration: none;
transition: color 0.15s;
}
a:hover {
color: var(--accent-hover);
}
img {
max-width: 100%;
height: auto;
}
/* ============ Nav ============ */
.site-nav {
padding: 1.25rem 0;
border-bottom: 1px solid var(--border);
}
.site-nav .wrap {
max-width: var(--max-width);
margin: 0 auto;
padding: 0 1.5rem;
display: flex;
justify-content: space-between;
align-items: center;
}
.site-nav .brand {
font-family: var(--font-mono);
font-size: 0.9rem;
color: var(--text-bright);
letter-spacing: -0.02em;
}
.site-nav .links {
display: flex;
gap: 1.5rem;
font-family: var(--font-mono);
font-size: 0.8rem;
}
.site-nav .links a {
color: var(--text-muted);
}
.site-nav .links a:hover,
.site-nav .links a[aria-current="page"] {
color: var(--text-bright);
}
/* ============ Shell ============ */
main.shell {
flex: 1;
max-width: var(--max-width);
margin: 0 auto;
width: 100%;
padding: 3rem 1.5rem 5rem;
animation: fadeIn 0.3s ease;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(0.4rem);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* ============ Footer ============ */
footer.site-footer {
margin-top: auto;
border-top: 1px solid var(--border);
padding: 2rem 0;
}
footer.site-footer .wrap {
max-width: var(--max-width);
margin: 0 auto;
padding: 0 1.5rem;
display: flex;
justify-content: space-between;
align-items: center;
gap: 1rem;
flex-wrap: wrap;
font-family: var(--font-mono);
font-size: 0.72rem;
color: var(--text-muted);
}
footer.site-footer a {
color: var(--text-muted);
}
footer.site-footer a:hover {
color: var(--accent);
}
/* ============ Masthead (home / about) ============ */
.masthead {
display: grid;
grid-template-columns: minmax(0, 1fr) 12.5rem;
gap: 3rem;
align-items: start;
padding-bottom: 2.5rem;
margin-bottom: 2.5rem;
border-bottom: 1px solid var(--border-strong);
}
.masthead:has(.portrait-wrap.has-outline) {
grid-template-columns: minmax(0, 1fr) 21rem;
}
.mh-eyebrow {
font-family: var(--font-mono);
font-size: 0.68rem;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--text-muted);
margin-bottom: 1.5rem;
display: flex;
align-items: center;
gap: 0.75rem;
}
.mh-eyebrow .dot {
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--accent);
box-shadow: 0 0 6px var(--accent);
}
.mh-eyebrow .sep {
flex: 1;
height: 1px;
background: var(--border);
}
.masthead h1 {
font-family: var(--font-serif);
font-weight: 300;
font-variation-settings: "opsz" 144;
font-size: clamp(2.3rem, 5vw, 4rem);
line-height: 1;
letter-spacing: -0.03em;
color: var(--text-bright);
text-wrap: balance;
margin-bottom: 1rem;
}
.masthead h1 em {
font-style: italic;
font-variation-settings: "opsz" 144;
color: var(--accent);
}
.masthead h1 .accent {
font-style: normal;
color: var(--accent);
}
.masthead .dek {
font-family: var(--font-text);
font-weight: 300;
font-style: normal;
font-size: 1.1rem;
line-height: 1.55;
color: var(--text);
max-width: 38rem;
margin-bottom: 1.5rem;
}
.mh-stats {
display: flex;
gap: 2rem;
flex-wrap: wrap;
font-family: var(--font-mono);
font-size: 0.7rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.1em;
padding-top: 1rem;
border-top: 1px solid var(--border);
}
.mh-stats div b {
display: block;
font-family: var(--font-serif);
font-style: normal;
font-weight: 400;
font-size: 1.5rem;
color: var(--text-bright);
margin-bottom: 0.15rem;
letter-spacing: -0.02em;
text-transform: none;
}
.masthead-right {
position: relative;
}
.portrait-wrap {
position: relative;
aspect-ratio: 1;
border-radius: 0.35rem;
overflow: hidden;
display: block;
}
.portrait-wrap.has-outline {
border: 1px solid var(--border);
}
.portrait-art {
position: absolute;
inset: 0;
}
.portrait-art img {
width: 100%;
height: 100%;
display: block;
}
.portrait-art img[src$=".jpeg"],
.portrait-art img[src$=".jpg"],
.portrait-art img[src$=".png"] {
object-fit: cover;
filter: grayscale(0.15) contrast(1.02);
}
.portrait-art img[src$=".svg"] {
object-fit: contain;
padding: 8%;
opacity: 0.92;
}
/* White line-art overlay on photo portrait (about page) — body only, face masked out */
.portrait-outline {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
pointer-events: none;
opacity: 0;
filter: drop-shadow(0 0 4px rgba(255, 255, 255, 0.45));
animation:
portrait-outline-in 1.4s ease-out 0.3s forwards,
portrait-outline-breathe 6s ease-in-out 1.7s infinite;
-webkit-mask-image: linear-gradient(
to bottom,
transparent 0%,
transparent 38%,
rgba(0, 0, 0, 0.4) 46%,
black 54%,
black 100%
);
mask-image: linear-gradient(
to bottom,
transparent 0%,
transparent 38%,
rgba(0, 0, 0, 0.4) 46%,
black 54%,
black 100%
);
}
@keyframes portrait-outline-in {
0% {
opacity: 0;
transform: scale(0.985);
}
100% {
opacity: 0.85;
transform: scale(1);
}
}
@keyframes portrait-outline-breathe {
0%, 100% {
opacity: 0.78;
}
50% {
opacity: 0.95;
}
}
.portrait-wrap.has-outline .portrait-art img {
filter: grayscale(0.15) contrast(1) brightness(0.95);
}
/* Floating dots overlay on portrait */
.portrait-dot {
position: absolute;
width: 3px;
height: 3px;
background: var(--text-bright);
border-radius: 50%;
box-shadow: 0 0 6px var(--text-bright);
animation: portrait-float var(--dur, 5s) ease-in-out var(--del, 0s) infinite
alternate;
pointer-events: none;
}
@keyframes portrait-float {
0% {
left: var(--x1);
top: var(--y1);
opacity: 0;
}
15% {
opacity: 0.7;
}
85% {
opacity: 0.7;
}
100% {
left: var(--x2);
top: var(--y2);
opacity: 0;
}
}
.portrait-caption {
font-family: var(--font-mono);
font-size: 0.62rem;
color: var(--text-muted);
letter-spacing: 0.1em;
text-transform: uppercase;
margin-top: 0.75rem;
display: flex;
justify-content: space-between;
}
.portrait-caption .loc {
color: var(--accent);
}
/* ============ Section bar ============ */
.section-bar {
display: grid;
grid-template-columns: auto 1fr auto auto;
align-items: baseline;
gap: 1rem;
padding-bottom: 0.75rem;
border-bottom: 1px solid var(--border-strong);
margin-bottom: 1.75rem;
font-family: var(--font-mono);
}
.section-bar .sb-num {
font-size: 0.68rem;
color: var(--accent);
letter-spacing: 0.1em;
text-transform: uppercase;
padding: 0.2rem 0.55rem;
border: 1px solid rgba(212, 168, 83, 0.3);
border-radius: 0.15rem;
background: rgba(212, 168, 83, 0.04);
}
.section-bar .sb-label {
font-family: var(--font-serif);
font-weight: 400;
font-size: 1.4rem;
color: var(--text-bright);
letter-spacing: -0.015em;
}
.section-bar .sb-label em {
font-style: italic;
color: var(--accent);
}
.section-bar .sb-count {
font-size: 0.7rem;
color: var(--text-muted);
letter-spacing: 0.06em;
}
.section-bar .sb-filter {
display: flex;
gap: 0.35rem;
flex-wrap: wrap;
}
.section-bar .sb-filter button {
background: transparent;
border: 1px solid var(--border);
color: var(--text-muted);
font-family: inherit;
font-size: 0.62rem;
letter-spacing: 0.06em;
text-transform: uppercase;
padding: 0.28rem 0.55rem;
border-radius: 0.15rem;
cursor: pointer;
transition: color 0.15s, border-color 0.15s, background 0.15s;
}
.section-bar .sb-filter button:hover {
color: var(--text-bright);
border-color: var(--border-strong);
}
.section-bar .sb-filter button.on {
color: var(--accent);
border-color: rgba(212, 168, 83, 0.4);
background: rgba(212, 168, 83, 0.08);
}
/* ============ Featured block (home) ============ */
.featured {
display: grid;
grid-template-columns: minmax(0, 1fr) 12.5rem;
gap: 3rem;
padding: 0.5rem 0 2.5rem;
border-bottom: 1px solid var(--border);
margin-bottom: 2.5rem;
align-items: center;
}
.feat-main .f-eyebrow {
font-family: var(--font-mono);
font-size: 0.65rem;
color: var(--accent);
letter-spacing: 0.14em;
text-transform: uppercase;
margin-bottom: 0.9rem;
display: flex;
align-items: center;
gap: 0.6rem;
}
.feat-main .f-eyebrow .pulse {
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--accent);
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.35;
}
}
.feat-main h2 {
font-family: var(--font-serif);
font-weight: 400;
font-variation-settings: "opsz" 96;
font-size: clamp(1.6rem, 3vw, 2.3rem);
line-height: 1.1;
letter-spacing: -0.02em;
color: var(--text-bright);
text-wrap: balance;
margin-bottom: 1rem;
}
.feat-main h2 a {
color: inherit;
}
.feat-main h2 a:hover {
color: var(--accent);
}
.feat-main .dek {
font-family: var(--font-text);
font-weight: 300;
font-size: 1.05rem;
line-height: 1.6;
color: var(--text);
max-width: 40rem;
margin-bottom: 1.25rem;
text-wrap: pretty;
}
.feat-main .meta {
display: flex;
gap: 1.25rem;
flex-wrap: wrap;
font-family: var(--font-mono);
font-size: 0.68rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.1em;
}
.feat-main .meta .tag {
color: var(--tag-color);
}
.feat-main .meta .tag::before {
content: "#";
opacity: 0.6;
}
.feat-art {
aspect-ratio: 1;
border: 1px solid var(--border);
border-radius: 0.35rem;
overflow: hidden;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.feat-art > div {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
}
.feat-art svg {
width: 100%;
height: 100%;
transform: scale(0.49);
transform-origin: center center;
display: block;
}
.feat-art.has-cover img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.feat-art:not(.has-cover) .art-spin,
.feat-art:not(.has-cover) .art-orbit {
animation: none !important;
}
.feat-art .art-draw {
animation: art-build-slow 18s ease-in-out calc(var(--d, 0s) * 4) infinite;
}
.feat-art .art-dot,
.feat-art .art-pulse-dot {
animation: art-build-dot-slow 18s ease-in-out calc(var(--d, 0s) * 4) infinite;
}
@keyframes art-build-slow {
0% {
stroke-dashoffset: 1;
opacity: 0;
}
8% {
opacity: 1;
}
55% {
stroke-dashoffset: 0;
opacity: 1;
}
85% {
stroke-dashoffset: 0;
opacity: 1;
}
100% {
stroke-dashoffset: 0;
opacity: 0;
}
}
@keyframes art-build-dot-slow {
0%, 100% {
opacity: 0;
}
15%, 85% {
opacity: var(--op, 0.6);
}
}
.feat-art::after {
content: "";
position: absolute;
inset: 0;
background: radial-gradient(
ellipse at center,
transparent 60%,
rgba(12, 21, 32, 0.3) 100%
);
pointer-events: none;
}
/* ============ Post list (home) ============ */
.post-list {
list-style: none;
}
.post-list > li {
display: grid;
grid-template-columns: 5rem minmax(0, 1fr) 4.5rem;
gap: 1.5rem;
padding: 1.5rem 0;
border-bottom: 1px solid var(--border);
align-items: start;
transition: background 0.2s ease;
}
.post-list > li:first-child {
padding-top: 0.5rem;
}
.post-list > li:hover {
background: linear-gradient(
to right,
rgba(212, 168, 83, 0.02),
transparent 80%
);
}
.post-list .p-art {
width: 4.75rem;
height: 4.75rem;
border: 1px solid var(--border);
border-radius: 0.25rem;
background: transparent;
overflow: hidden;
}
.post-list .p-art svg {
width: 100%;
height: 100%;
display: block;
}
.post-list .p-body {
min-width: 0;
}
.post-list .p-date {
font-family: var(--font-mono);
font-size: 0.64rem;
color: var(--text-muted);
letter-spacing: 0.1em;
text-transform: uppercase;
margin-bottom: 0.35rem;
display: flex;
gap: 0.75rem;
align-items: center;
}
.post-list .p-date .n {
color: var(--accent);
opacity: 0.7;
font-size: 0.6rem;
}
.post-list .p-title {
font-family: var(--font-serif);
font-weight: 400;
font-variation-settings: "opsz" 48;
font-size: 1.35rem;
line-height: 1.2;
color: var(--text-bright);
text-wrap: balance;
margin-bottom: 0.35rem;
letter-spacing: -0.01em;
}
.post-list .p-title a {
color: inherit;
}
.post-list > li:hover .p-title a {
color: var(--accent);
}
.post-list .p-desc {
font-family: var(--font-text);
font-weight: 300;
font-style: normal;
font-size: 0.98rem;
line-height: 1.55;
color: var(--text);
margin: 0 0 0.5rem;
max-width: 48rem;
text-wrap: pretty;
}
.post-list .p-tags {
display: flex;
flex-wrap: wrap;
gap: 0.6rem;
font-family: var(--font-mono);
font-size: 0.64rem;
}
.post-list .p-tags a {
color: var(--tag-color);
letter-spacing: 0.04em;
}
.post-list .p-tags a::before {
content: "#";
opacity: 0.5;
}
.post-list .p-read {
font-family: var(--font-mono);
font-size: 0.62rem;
color: var(--text-muted);
letter-spacing: 0.06em;
text-align: right;
padding-top: 0.35rem;
}
.post-list .p-read b {
display: block;
font-family: var(--font-serif);
font-style: normal;
font-weight: 400;
font-size: 1.1rem;
color: var(--text-bright);
letter-spacing: -0.02em;
margin-bottom: 0.1rem;
}
.post-list .p-read .mini {
display: block;
margin-top: 0.25rem;
font-size: 0.6rem;
color: var(--text-muted);
}
/* Series row */
.post-list > li.is-series {
align-items: stretch;
}
.series-wrap {
grid-column: 2 / span 2;
padding: 1.1rem 1.2rem;
border: 1px solid rgba(212, 168, 83, 0.2);
background: rgba(212, 168, 83, 0.03);
border-radius: 0.3rem;
}
.series-head {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0;
gap: 1rem;
}
.series-wrap.is-expanded .series-head {
margin-bottom: 0.4rem;
}
.series-head .s-name {
font-family: var(--font-serif);
font-weight: 500;
font-size: 1.2rem;
color: var(--text-bright);
letter-spacing: -0.01em;
}
.series-head .s-badge {
font-family: var(--font-mono);
font-size: 0.62rem;
color: var(--accent);
letter-spacing: 0.08em;
text-transform: uppercase;
padding: 0.2rem 0.55rem;
border: 1px solid rgba(212, 168, 83, 0.35);
border-radius: 0.15rem;
white-space: nowrap;
}
.series-desc {
font-family: var(--font-text);
font-style: normal;
font-size: 0.95rem;
line-height: 1.55;
color: var(--text-muted);
margin-bottom: 0.9rem;
display: none;
}
.series-parts {
list-style: none;
display: none;
flex-direction: column;
gap: 0.1rem;
}
.series-wrap.is-expanded .series-desc {
display: block;
}
.series-wrap.is-expanded .series-parts {
display: flex;
}
.series-parts li {
border-top: 1px solid var(--border);
}
.series-parts li:first-child {
border-top: none;
}
.series-parts a {
display: grid;
grid-template-columns: 4.5rem 1fr auto;
gap: 1rem;
align-items: baseline;
padding: 0.55rem 0;
color: var(--text);
}
.series-parts a:hover {
color: var(--accent);
}
.series-parts .sp-num {
font-family: var(--font-mono);
font-size: 0.62rem;
color: var(--text-muted);
letter-spacing: 0.08em;
text-transform: uppercase;
}
.series-parts .sp-title {
font-family: var(--font-text);
font-weight: 400;
font-size: 0.95rem;
color: var(--text-bright);
text-wrap: balance;
}
.series-parts a:hover .sp-title {
color: var(--accent);
}
.series-parts .sp-date {
font-family: var(--font-mono);
font-size: 0.62rem;
color: var(--text-muted);
letter-spacing: 0.06em;
}
.series-toggle {
display: flex;
align-items: center;
background: none;
border: 1px solid rgba(212, 168, 83, 0.35);
border-radius: 0.15rem;
padding: 0.25rem 0.4rem;
color: var(--accent);
cursor: pointer;
transition: background 0.15s, transform 0.2s;
margin-left: auto;
}
.series-toggle:hover {
background: rgba(212, 168, 83, 0.1);
}
.series-toggle svg {
display: block;
transition: transform 0.2s;
}
.series-wrap.is-expanded .series-toggle svg {
transform: rotate(180deg);
}
/* ============ Bottom grid: tags + archive ============ */
.bottom-grid {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 3rem;
align-items: start;
margin-top: 3rem;
padding-top: 2.5rem;
border-top: 1px solid var(--border-strong);
}
.bg-left, .bg-right {
min-width: 0;
}
.card {
margin-bottom: 2.5rem;
}
.card-title {
font-family: var(--font-mono);
font-size: 0.65rem;
color: var(--text-muted);
letter-spacing: 0.15em;
text-transform: uppercase;
margin-bottom: 1rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--border);
display: flex;
justify-content: space-between;
align-items: baseline;
}
.card-title .c {
color: var(--accent);
}
.tagcloud {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
}
.tagcloud a {
display: inline-flex;
align-items: baseline;
gap: 0.35rem;
font-family: var(--font-mono);
font-size: 0.74rem;
color: var(--tag-color);
padding: 0.25rem 0.55rem;
border: 1px solid rgba(126, 184, 168, 0.2);
border-radius: 0.15rem;
transition: color 0.15s, border-color 0.15s, background 0.15s;
}
.tagcloud a::before {
content: "#";
opacity: 0.5;
}
.tagcloud a .ct {
font-size: 0.62rem;
color: var(--text-muted);
}
.tagcloud a:hover {
color: var(--accent);
border-color: rgba(212, 168, 83, 0.35);
background: rgba(212, 168, 83, 0.05);
}
.archive-list {
list-style: none;
font-family: var(--font-mono);
font-size: 0.78rem;
}
.archive-list li {
display: flex;
justify-content: space-between;
padding: 0.4rem 0;
border-bottom: 1px solid var(--border);
color: var(--text-muted);
}
.archive-list li:last-child {
border-bottom: none;
}
.archive-list li b {
color: var(--text-bright);
font-weight: 400;
}
.archive-list li a {
color: var(--text-muted);
}
.archive-list li a:hover {
color: var(--accent);
}
/* ============ Newsletter ============ */
.newsletter {
margin-top: 3.5rem;
padding: 2.25rem 2rem;
border: 1px solid var(--border);
border-radius: 0.35rem;
background: rgba(255, 255, 255, 0.015);
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
gap: 2.5rem;
align-items: center;
}
.newsletter .nl-title {
font-family: var(--font-serif);
font-weight: 400;
font-size: 1.75rem;
color: var(--text-bright);
line-height: 1.15;
margin-bottom: 0.5rem;
letter-spacing: -0.01em;
}
.newsletter .nl-title em {
font-style: italic;
color: var(--accent);
}
.newsletter .nl-desc {
font-family: var(--font-text);
font-style: normal;
font-size: 1rem;
color: var(--text-muted);
line-height: 1.6;
}
.nl-form-wrap {
min-width: 0;
}
.nl-form {
display: flex;
flex-direction: row;
gap: 0.5rem;
min-width: 0;
}
.nl-form input[type="email"] {
flex: 1 1 auto;
min-width: 0;
background: var(--bg);
border: 1px solid var(--border);
border-radius: 0.2rem;
padding: 0.6rem 0.8rem;
color: var(--text);
font-family: var(--font-mono);
font-size: 0.82rem;
outline: none;
transition: border-color 0.15s, box-shadow 0.15s;
}
.nl-form input[type="email"]:focus {
border-color: var(--accent);
box-shadow: 0 0 0 2px rgba(212, 168, 83, 0.2);
}
.nl-form input[type="email"]::placeholder {
color: var(--text-muted);
}
.nl-form button {
flex: 0 0 auto;
background: var(--accent);
color: var(--bg);
border: none;
border-radius: 0.2rem;
padding: 0.6rem 1.1rem;
font-family: var(--font-mono);
font-size: 0.74rem;
letter-spacing: 0.08em;
text-transform: uppercase;
font-weight: 500;
cursor: pointer;
transition: background 0.15s;
white-space: nowrap;
}
.nl-form button:hover {
background: var(--accent-hover);
}
.nl-form button:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.nl-count {
font-family: var(--font-mono);
font-size: 0.64rem;
color: var(--text-muted);
letter-spacing: 0.08em;
text-transform: uppercase;
margin-top: 0.7rem;
padding-top: 0.7rem;
border-top: 1px dashed var(--border);
display: flex;
justify-content: space-between;
}
.nl-count b {
color: var(--accent);
font-weight: 400;
}
.nl-spinner {
display: none;
animation: spin 0.8s linear infinite;
}
.newsletter.is-loading .nl-btn-text {
display: none;
}
.newsletter.is-loading .nl-spinner {
display: inline-block;
}
.newsletter.is-success .nl-form {
display: none;
}
.nl-success, .nl-error {
display: none;
font-size: 0.88rem;
margin-top: 0.75rem;
}
.newsletter.is-success .nl-success {
display: block;
color: var(--tag-color);
}
.newsletter.is-error .nl-error {
display: block;
color: var(--danger);
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
/* ============ Post page ============ */
.progress-top {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 2px;
background: transparent;
z-index: 50;
pointer-events: none;
}
.progress-top .bar {
height: 100%;
width: 0;
background: var(--accent);
transition: width 0.08s linear;
box-shadow: 0 0 8px rgba(212, 168, 83, 0.4);
}
main.post-shell {
max-width: var(--max-width);
margin: 0 auto;
width: 100%;
padding: 2.5rem 1.5rem 4rem;
}
.mm-art {
width: 8rem;
height: 8rem;
opacity: 0.9;
flex-shrink: 0;
}
.mm-art svg {
width: 100%;
height: 100%;
display: block;
}
/* Header KV box (post meta) */
.header-box {
border: 1px solid var(--border);
border-radius: 0.25rem;
padding: 0.9rem 1.1rem;
background: rgba(255, 255, 255, 0.015);
margin-bottom: 2.5rem;
font-family: var(--font-mono);
font-size: 0.72rem;
}
.header-box .hb-row {
display: grid;
grid-template-columns: 6.5rem minmax(0, 1fr);
gap: 1rem;
padding: 0.2rem 0;
}
.header-box .hb-k {
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 0.64rem;
padding-top: 0.15rem;
}
.header-box .hb-v {
color: var(--text-bright);
text-wrap: pretty;
overflow-wrap: anywhere;
min-width: 0;
}
.header-box .hb-v .tag {
color: var(--tag-color);
margin-right: 0.6rem;
}
.header-box .hb-v .tag::before {
content: "#";
opacity: 0.5;
}
.header-box .hb-v a {
color: var(--text-bright);
border-bottom: 1px dashed var(--border-strong);
}
.header-box .hb-v a:hover {
color: var(--accent);
border-bottom-color: var(--accent);
}
.header-box .hb-v .muted {
color: var(--text-muted);
}
/* Hero */
.post-hero {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 2.5rem;
align-items: start;
margin-bottom: 3rem;
}
.post-hero .hero-text {
min-width: 0;
}
.post-hero .eyebrow {
font-family: var(--font-mono);
font-size: 0.68rem;
text-transform: uppercase;
letter-spacing: 0.15em;
color: var(--text-muted);
margin-bottom: 1.25rem;
display: flex;
align-items: center;
gap: 0.75rem;
}
.post-hero .eyebrow::after {
content: "";
flex: 1;
height: 1px;
background: var(--border);
}
.post-hero .eyebrow b {
color: var(--accent);
font-weight: 400;
}
.post-hero h1 {
font-family: var(--font-serif);
font-weight: 300;
font-variation-settings: "opsz" 144;
font-size: clamp(1.9rem, 4.3vw, 3.15rem);
line-height: 1.15;
letter-spacing: -0.02em;
color: var(--text-bright);
text-wrap: balance;
overflow-wrap: break-word;
margin-bottom: 1.75rem;
}
.post-hero .dek {
font-family: var(--font-serif);
font-weight: 300;
font-style: italic;
font-size: 1.2rem;
line-height: 1.5;
color: var(--text);
text-wrap: balance;
margin-bottom: 1.5rem;
}
.post-hero .byline {
font-family: var(--font-mono);
font-size: 0.7rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.12em;
display: flex;
gap: 1.5rem;
flex-wrap: wrap;
padding-top: 1rem;
border-top: 1px solid var(--border);
}
.post-hero .byline b {
color: var(--text-bright);
font-weight: 400;
}
.post-hero .byline a {
color: var(--text-bright);
}
.post-hero .byline a:hover {
color: var(--accent);
}
/* Series strip */
.series-strip {
display: flex;
align-items: center;
gap: 0.5rem;
margin-bottom: 2rem;
padding: 0.75rem 0.9rem;
background: rgba(212, 168, 83, 0.04);
border: 1px solid rgba(212, 168, 83, 0.2);
border-radius: 0.25rem;
font-family: var(--font-mono);
font-size: 0.7rem;
}
.series-strip .label {
color: var(--accent);
text-transform: uppercase;
letter-spacing: 0.08em;
margin-right: 0.5rem;
}
.series-strip .parts {
display: flex;
gap: 0.25rem;
flex: 1;
min-width: 0;
}
.series-strip .parts a, .series-strip .parts .cur {
flex: 1;
min-width: 0;
text-align: center;
padding: 0.35rem 0.5rem;
border-radius: 0.15rem;
color: var(--text-muted);
background: rgba(255, 255, 255, 0.02);
transition: color 0.15s, background 0.15s;
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
}
.series-strip .parts a:hover {
color: var(--text-bright);
background: rgba(255, 255, 255, 0.04);
}
.series-strip .parts .cur {
color: var(--text-bright);
background: rgba(212, 168, 83, 0.15);
}
.series-strip .progress-pct {
color: var(--text-muted);
white-space: nowrap;
}
.series-strip .progress-pct b {
color: var(--accent);
font-weight: 400;
}
/* Post content (serif editorial body) */
.post-content {
font-family: var(--font-serif);
font-weight: 400;
font-size: 1.15rem;
line-height: 1.6;
color: #d4dce4;
}
.post-content p {
margin-bottom: 1.35em;
text-wrap: pretty;
}
.post-content > p:first-of-type .first-word {
color: var(--accent);
}
.post-content h2 {
font-family: var(--font-serif);
font-weight: 400;
font-variation-settings: "opsz" 72;
font-size: 1.6rem;
color: var(--text-bright);
line-height: 1.15;
letter-spacing: -0.015em;
text-wrap: balance;
margin: 3.5rem 0 1.25rem;
padding-top: 1.25rem;
border-top: 1px solid var(--border-strong);
scroll-margin-top: 1.5rem;
}
.post-content h3 {
font-family: var(--font-serif);
font-weight: 500;
font-style: italic;
font-size: 1.25rem;
color: var(--text-bright);
margin: 2.25rem 0 0.5rem;
line-height: 1.2;
}
.post-content h3::before {
content: "—";
color: var(--accent);
margin-right: 0.5rem;
opacity: 0.7;
}
.post-content em {
font-style: italic;
color: var(--text);
}
.post-content strong {
font-weight: 500;
color: var(--text-bright);
}
.post-content a {
color: var(--accent);
border-bottom: 1px solid rgba(212, 168, 83, 0.3);
transition: border-bottom-color 0.15s, color 0.15s;
}
.post-content a:hover {
color: var(--accent-hover);
border-bottom-color: var(--accent-hover);
}
.post-content ul, .post-content ol {
margin: 1.5rem 0 1.5rem 1.5rem;
padding-left: 0.75rem;
}
.post-content li {
margin-bottom: 0.5rem;
}
.post-content code {
font-family: var(--font-mono);
background: rgba(255, 255, 255, 0.04);
border: 1px solid var(--border);
padding: 0.08em 0.35em;
border-radius: 0.2rem;
font-size: 0.82em;
color: var(--text-bright);
}
.post-content pre {
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: 0.3rem;
margin: 1.75rem 0;
overflow: hidden;
font-family: var(--font-mono);
}
.post-content pre code {
display: block;
background: none;
border: none;
padding: 1rem 1.25rem;
font-size: 0.83rem;
line-height: 1.65;
color: var(--text);
overflow-x: auto;
border-radius: 0;
}
.post-content blockquote {
font-family: var(--font-serif);
font-weight: 300;
font-variation-settings: "opsz" 144;
font-size: 1.45rem;
line-height: 1.3;
color: var(--text-bright);
margin: 2.5rem 0;
padding: 1.25rem 0 1.25rem 1.5rem;
border-top: 1px solid var(--border-strong);
border-bottom: 1px solid var(--border-strong);
border-left: 2px solid var(--accent);
text-wrap: balance;
font-style: italic;
}
.post-content img {
max-width: 100%;
border-radius: 0.375rem;
margin: 2rem 0;
}
.post-content table {
width: 100%;
border-collapse: collapse;
margin: 2rem 0;
font-family: var(--font-text);
font-size: 0.9rem;
}
.post-content th, .post-content td {
padding: 0.6rem 1rem;
text-align: left;
border-bottom: 1px solid var(--border);
}
.post-content th {
font-family: var(--font-mono);
font-size: 0.72rem;
font-weight: 400;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.06em;
}
.post-content .mermaid {
margin: 2rem 0;
text-align: center;
font-family: var(--font-text);
}
.post-content .mermaid svg {
max-width: 100%;
}
/* Margin notes rail (right) */
.margin-notes {
position: sticky;
top: 1.5rem;
align-self: start;
font-family: var(--font-text);
font-size: 0.8rem;
line-height: 1.5;
color: var(--text-muted);
display: flex;
flex-direction: column;
gap: 0.2rem;
}
.mnote {
padding: 0.6rem 0 0.7rem 0.9rem;
border-left: 1px solid var(--border-strong);
}
.mnote .mref {
font-family: var(--font-mono);
font-size: 0.62rem;
color: var(--accent);
letter-spacing: 0.1em;
text-transform: uppercase;
display: block;
margin-bottom: 0.3rem;
}
/* Post footer / nav */
.post-footer {
margin-top: 4rem;
padding-top: 2rem;
border-top: 1px solid var(--border);
}
.footer-title {
font-family: var(--font-mono);
font-size: 0.68rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.1em;
margin-bottom: 1rem;
}
.post-nav {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
margin-bottom: 3rem;
}
.post-nav .cell {
padding: 1rem 1.1rem;
border: 1px solid var(--border);
border-radius: 0.3rem;
background: rgba(255, 255, 255, 0.015);
transition: border-color 0.15s, background 0.15s;
}
.post-nav .cell:hover {
border-color: rgba(212, 168, 83, 0.3);
background: rgba(212, 168, 83, 0.03);
}
.post-nav .cell .dir {
font-family: var(--font-mono);
font-size: 0.62rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.1em;
margin-bottom: 0.4rem;
}
.post-nav .cell .ttl {
font-family: var(--font-serif);
font-size: 1.02rem;
line-height: 1.35;
color: var(--text-bright);
font-weight: 400;
text-wrap: balance;
}
.post-nav .cell.right {
text-align: right;
}
.related {
margin-bottom: 3rem;
}
.related-list {
list-style: none;
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.75rem;
}
.related-list li a {
display: block;
padding: 0.9rem 1rem;
border: 1px solid var(--border);
border-radius: 0.3rem;
color: var(--text);
transition: border-color 0.15s, color 0.15s;
}
.related-list li a:hover {
border-color: rgba(212, 168, 83, 0.3);
color: var(--accent);
}
.related-list li .rl-date {
font-family: var(--font-mono);
font-size: 0.62rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.08em;
margin-bottom: 0.35rem;
display: block;
}
.related-list li .rl-title {
font-family: var(--font-serif);
font-size: 0.98rem;
line-height: 1.3;
color: var(--text-bright);
}
.related-list li a:hover .rl-title {
color: var(--accent);
}
.comments {
margin-top: 3rem;
padding-top: 2rem;
border-top: 1px solid var(--border);
}
.comments h2 {
font-family: var(--font-mono);
font-size: 0.68rem;
font-weight: 400;
color: var(--text-muted);
letter-spacing: 0.1em;
text-transform: uppercase;
margin-bottom: 1.5rem;
}
/* ============ About page ============ */
.bio {
font-family: var(--font-text);
font-weight: 300;
font-size: 1.05rem;
line-height: 1.7;
color: var(--text);
max-width: 42rem;
text-wrap: pretty;
}
.bio p + p {
margin-top: 0.9rem;
}
.bio em {
color: var(--text-bright);
font-style: italic;
}
.now-card {
display: grid;
grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr);
gap: 2.5rem;
align-items: start;
padding: 1.75rem;
border: 1px solid var(--border);
border-radius: 0.4rem;
background: linear-gradient(
to bottom right,
rgba(212, 168, 83, 0.03),
transparent 60%
);
}
.now-head {
display: flex;
align-items: baseline;
gap: 0.75rem;
margin-bottom: 0.9rem;
}
.now-badge {
font-family: var(--font-mono);
font-size: 0.6rem;
color: var(--accent);
letter-spacing: 0.14em;
text-transform: uppercase;
padding: 0.2rem 0.5rem;
border: 1px solid rgba(212, 168, 83, 0.35);
border-radius: 0.15rem;
display: inline-flex;
align-items: center;
gap: 0.4rem;
}
.now-badge .pulse {
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--accent);
animation: pulse 2s ease-in-out infinite;
}
.now-role {
font-family: var(--font-serif);
font-weight: 400;
font-size: 1.6rem;
letter-spacing: -0.015em;
color: var(--text-bright);
line-height: 1.15;
}
.now-role em {
font-style: italic;
color: var(--accent);
}
.now-since {
font-family: var(--font-mono);
font-size: 0.68rem;
color: var(--text-muted);
letter-spacing: 0.08em;
text-transform: uppercase;
margin-bottom: 1rem;
}
.now-desc {
font-family: var(--font-text);
font-weight: 300;
font-size: 1rem;
line-height: 1.65;
color: var(--text);
text-wrap: pretty;
margin-bottom: 1rem;
}
.now-tech {
display: flex;
flex-wrap: wrap;
gap: 0.35rem;
}
.now-tech .tp {
font-family: var(--font-mono);
font-size: 0.64rem;
color: var(--text);
background: rgba(255, 255, 255, 0.03);
border: 1px solid var(--border);
padding: 0.18rem 0.5rem;
border-radius: 0.15rem;
}
.now-facts {
display: grid;
gap: 0.65rem;
font-family: var(--font-mono);
font-size: 0.75rem;
}
.now-facts .row {
display: grid;
grid-template-columns: 5.5rem 1fr;
gap: 1rem;
padding: 0.4rem 0;
border-bottom: 1px dashed var(--border);
}
.now-facts .row:last-child {
border-bottom: none;
}
.now-facts .k {
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 0.64rem;
padding-top: 0.15rem;
}
.now-facts .v {
color: var(--text-bright);
text-wrap: balance;
}
.now-facts .v .accent {
color: var(--accent);
}
.now-facts .v a {
color: var(--text-bright);
border-bottom: 1px dashed var(--border-strong);
}
.now-facts .v a:hover {
color: var(--accent);
border-bottom-color: var(--accent);
}
/* Timeline */
.timeline-wrap {
display: grid;
grid-template-columns: 7rem minmax(0, 1fr);
gap: 2.5rem;
align-items: start;
}
.tl-axis {
position: sticky;
top: 2rem;
font-family: var(--font-mono);
font-size: 0.68rem;
color: var(--text-muted);
}
.tl-axis .tl-label {
font-size: 0.6rem;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--text-muted);
margin-bottom: 1rem;
}
.tl-axis .tl-bigyr {
font-family: var(--font-serif);
font-size: 2rem;
font-weight: 400;
color: var(--text-bright);
letter-spacing: -0.02em;
line-height: 1;
}
.tl-axis .tl-bigyr span {
color: var(--text-muted);
font-size: 1rem;
margin-left: 0.25rem;
}
.tl-axis .tl-bigyr-sub {
font-size: 0.62rem;
color: var(--text-muted);
letter-spacing: 0.08em;
text-transform: uppercase;
margin-top: 0.2rem;
}
.tl-axis .tl-key {
display: grid;
gap: 0.45rem;
font-size: 0.65rem;
margin-top: 1.2rem;
padding-top: 1rem;
border-top: 1px solid var(--border);
}
.tl-axis .tl-key .row {
display: flex;
align-items: center;
gap: 0.55rem;
color: var(--text-muted);
}
.tl-axis .tl-key .sw {
width: 8px;
height: 8px;
border-radius: 2px;
flex-shrink: 0;
}
.tl-axis .tl-key .sw.lead {
background: var(--accent);
}
.tl-axis .tl-key .sw.found {
background: var(--tag-color);
}
.tl-axis .tl-key .sw.eng {
background: var(--eng-color);
}
.tl-axis .tl-key .sw.other {
background: var(--text-muted);
}
.tl-track {
position: relative;
padding-left: 1.5rem;
min-width: 0;
}
.tl-track::before {
content: "";
position: absolute;
left: 0;
top: 0.5rem;
bottom: 0.5rem;
width: 1px;
background: linear-gradient(
to bottom,
transparent,
var(--border-strong) 3%,
var(--border-strong) 97%,
transparent
);
}
.tl-track::after {
content: "";
position: absolute;
left: -2px;
top: 0;
width: 5px;
height: var(--pct, 16%);
background: linear-gradient(to bottom, var(--accent), transparent);
opacity: 0.6;
border-radius: 2px;
transition: height 0.4s cubic-bezier(0.22, 1, 0.36, 1);
}
.tl-item {
position: relative;
padding: 0 0 2.5rem 0;
transition: opacity 0.2s;
}
.tl-item.hidden {
display: none;
}
.tl-dot {
position: absolute;
left: -1.75rem;
top: 0.55rem;
width: 0.65rem;
height: 0.65rem;
border-radius: 50%;
background: var(--bg);
border: 2px solid var(--text-muted);
transition: all 0.2s;
}
.tl-item[data-kind="lead"] .tl-dot {
border-color: var(--accent);
}
.tl-item[data-kind="found"] .tl-dot {
border-color: var(--tag-color);
}
.tl-item[data-kind="eng"] .tl-dot {
border-color: var(--eng-color);
}
.tl-item.expanded .tl-dot {
box-shadow: 0 0 0 4px rgba(212, 168, 83, 0.12);
transform: scale(1.15);
}
.tl-item[data-kind="lead"].expanded .tl-dot {
background: var(--accent);
box-shadow: 0 0 0 4px rgba(212, 168, 83, 0.12);
}
.tl-item[data-kind="found"].expanded .tl-dot {
background: var(--tag-color);
box-shadow: 0 0 0 4px rgba(126, 184, 168, 0.12);
}
.tl-item[data-kind="eng"].expanded .tl-dot {
background: var(--eng-color);
box-shadow: 0 0 0 4px rgba(61, 123, 138, 0.12);
}
.tl-header {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 1rem;
align-items: baseline;
cursor: pointer;
padding: 0.2rem 0;
user-select: none;
}
.tl-header:hover .tl-company {
color: var(--accent);
}
.tl-when {
font-family: var(--font-mono);
font-size: 0.64rem;
color: var(--text-muted);
letter-spacing: 0.1em;
text-transform: uppercase;
margin-bottom: 0.2rem;
}
.tl-when .dur {
color: var(--accent);
opacity: 0.8;
margin-left: 0.4rem;
}
.tl-company {
font-family: var(--font-serif);
font-weight: 400;
font-size: 1.4rem;
letter-spacing: -0.015em;
color: var(--text-bright);
line-height: 1.2;
transition: color 0.15s;
}
.tl-role {
font-family: var(--font-serif);
font-style: italic;
font-weight: 300;
font-size: 1rem;
color: var(--text);
margin-top: 0.2rem;
}
.tl-toggle {
font-family: var(--font-mono);
font-size: 0.6rem;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--text-muted);
padding: 0.2rem 0.5rem;
border: 1px solid var(--border);
border-radius: 0.15rem;
transition: all 0.15s;
white-space: nowrap;
}
.tl-header:hover .tl-toggle {
color: var(--accent);
border-color: rgba(212, 168, 83, 0.3);
}
.tl-item.expanded .tl-toggle {
color: var(--accent);
border-color: rgba(212, 168, 83, 0.4);
background: rgba(212, 168, 83, 0.05);
}
.tl-item.expanded .tl-toggle::after {
content: " ";
}
.tl-item:not(.expanded) .tl-toggle::after {
content: " +";
}
.tl-detail {
overflow: hidden;
max-height: 0;
opacity: 0;
transition: max-height 0.35s cubic-bezier(0.22, 1, 0.36, 1), opacity 0.25s;
}
.tl-item.expanded .tl-detail {
max-height: 60rem;
opacity: 1;
margin-top: 0.9rem;
}
.tl-detail-inner {
padding: 1rem 1.1rem;
border: 1px solid var(--border);
border-radius: 0.3rem;
background: rgba(255, 255, 255, 0.015);
}
.tl-detail p {
font-family: var(--font-text);
font-weight: 300;
font-size: 0.98rem;
line-height: 1.65;
color: var(--text);
text-wrap: pretty;
margin-bottom: 0.7rem;
}
.tl-detail p:last-child {
margin-bottom: 0;
}
.tl-detail em {
color: var(--text-bright);
font-style: italic;
}
.tl-highlights {
list-style: none;
display: grid;
gap: 0.5rem;
margin-top: 0.9rem;
padding-top: 0.9rem;
border-top: 1px dashed var(--border);
}
.tl-highlights li {
font-family: var(--font-mono);
font-size: 0.72rem;
color: var(--text);
padding-left: 1rem;
position: relative;
line-height: 1.5;
}
.tl-highlights li::before {
content: "▸";
position: absolute;
left: 0;
color: var(--accent);
opacity: 0.7;
}
.tl-highlights li b {
color: var(--accent);
font-weight: 400;
}
.tl-sub-role {
font-family: var(--font-mono);
font-size: 0.68rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.08em;
margin: 0.9rem 0 0.4rem;
padding-top: 0.6rem;
border-top: 1px dashed var(--border);
display: flex;
gap: 0.7rem;
align-items: baseline;
flex-wrap: wrap;
}
.tl-sub-role:first-of-type {
border-top: none;
padding-top: 0;
margin-top: 0;
}
.tl-sub-role .sr-title {
color: var(--text-bright);
letter-spacing: -0.005em;
font-size: 0.9rem;
text-transform: none;
font-family: var(--font-serif);
font-style: italic;
font-weight: 400;
}
.tl-sub-role .sr-when {
color: var(--accent);
font-size: 0.6rem;
}
/* Contact CTA (shared by About + redirect) */
.contact-cta {
margin-top: 3.5rem;
padding: 2.25rem 2rem;
border: 1px solid var(--border);
border-radius: 0.35rem;
background: rgba(255, 255, 255, 0.015);
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
gap: 2.5rem;
align-items: center;
}
.contact-cta .cc-title {
font-family: var(--font-serif);
font-weight: 400;
font-size: 1.75rem;
color: var(--text-bright);
line-height: 1.15;
margin-bottom: 0.5rem;
letter-spacing: -0.01em;
}
.contact-cta .cc-title em {
font-style: italic;
color: var(--accent);
}
.contact-cta .cc-sub {
font-family: var(--font-text);
font-style: normal;
font-size: 1rem;
color: var(--text-muted);
line-height: 1.6;
}
.cc-links {
display: grid;
gap: 0.5rem;
}
.cc-link {
display: grid;
grid-template-columns: 5.5rem 1fr auto;
gap: 1rem;
align-items: center;
padding: 0.75rem 0.9rem;
border: 1px solid var(--border);
border-radius: 0.25rem;
background: rgba(255, 255, 255, 0.015);
font-family: var(--font-mono);
font-size: 0.78rem;
color: var(--text);
transition: all 0.15s;
}
.cc-link:hover {
border-color: var(--accent);
background: rgba(212, 168, 83, 0.04);
color: var(--text);
}
.cc-link .ck {
color: var(--text-muted);
text-transform: uppercase;
font-size: 0.62rem;
letter-spacing: 0.1em;
}
.cc-link .cv {
color: var(--text-bright);
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cc-link .arr {
color: var(--accent);
opacity: 0.7;
font-family: var(--font-mono);
transition: transform 0.15s;
}
.cc-link:hover .arr {
transform: translate(2px, -2px);
}
/* ============ Tag pages ============ */
.tag-page {
margin-bottom: 2rem;
}
.tag-page h1 {
font-family: var(--font-serif);
font-weight: 400;
font-size: 2.15rem;
color: var(--text-bright);
letter-spacing: -0.02em;
margin-bottom: 0.5rem;
}
.tag-page .tag-label {
font-family: var(--font-mono);
font-size: 0.72rem;
color: var(--text-muted);
letter-spacing: 0.1em;
text-transform: uppercase;
margin-bottom: 1rem;
}
.back-to-tags {
font-family: var(--font-mono);
font-size: 0.8rem;
color: var(--text-muted);
}
.tag-list {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
/* ============ Projects page (kept from old) ============ */
.project-list {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.project {
position: relative;
padding: 1.75rem 0;
border-bottom: 1px solid var(--border);
display: grid;
grid-template-columns: minmax(0, 1fr) 14rem;
grid-template-areas:
"header shot"
"blurb shot"
"meta shot";
column-gap: 3rem;
row-gap: 0.75rem;
align-items: start;
}
.project-art {
display: none;
}
.project-header {
grid-area: header;
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 1.5rem;
}
.project-name {
font-family: var(--font-serif);
font-size: 1.5rem;
font-weight: 400;
letter-spacing: -0.015em;
color: var(--text-bright);
}
.project-links {
display: flex;
gap: 1rem;
}
.project-link {
font-family: var(--font-mono);
font-size: 0.75rem;
color: var(--accent);
}
.project-blurb {
grid-area: blurb;
font-family: var(--font-text);
color: var(--text);
font-size: 1.02rem;
line-height: 1.65;
}
.project-meta {
grid-area: meta;
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.project-tech {
font-family: var(--font-mono);
font-size: 0.7rem;
color: var(--tag-color);
padding: 0.2rem 0.5rem;
border: 1px solid rgba(126, 184, 168, 0.2);
border-radius: 0.2rem;
}
.project-screenshot {
grid-area: shot;
align-self: center;
width: 100%;
aspect-ratio: 1;
border: 1px solid var(--border);
border-radius: 0.35rem;
display: flex;
align-items: center;
justify-content: center;
color: var(--text-muted);
font-family: var(--font-mono);
font-size: 0.75rem;
opacity: 0.4;
background: var(--bg-surface);
overflow: hidden;
}
.project-screenshot.has-image {
border: 1px solid var(--border);
opacity: 1;
background: #0d1117;
}
.project-screenshot.has-image img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
/* ============ Not found ============ */
.not-found {
text-align: center;
padding: 4rem 0;
}
.not-found h1 {
font-family: var(--font-serif);
font-size: 4.5rem;
font-weight: 300;
color: var(--accent);
margin-bottom: 1rem;
letter-spacing: -0.05em;
}
.not-found p {
color: var(--text-muted);
font-size: 1.1rem;
}
/* ============ Generative art keyframes ============ */
@keyframes art-spin {
to {
transform: rotate(360deg);
}
}
@keyframes art-draw-in {
to {
stroke-dashoffset: 0;
}
}
@keyframes art-dot-in {
to {
opacity: var(--op, 0.6);
}
}
@keyframes art-pulse-scale {
0%, 100% {
transform: scale(1);
}
50% {
transform: scale(2);
}
}
.art-spin {
transform-origin: 50% 50%;
animation: art-spin var(--dur) linear infinite;
animation-direction: var(--dir);
}
.art-draw {
stroke-dasharray: 1;
stroke-dashoffset: 1;
animation: art-draw-in 0.8s ease-out var(--d, 0s) forwards;
}
.art-dot {
opacity: 0;
animation: art-dot-in 0.4s ease-out var(--d, 0s) forwards;
}
.art-pulse-dot {
opacity: 0;
transform-box: fill-box;
transform-origin: center;
animation:
art-dot-in 0.4s ease-out var(--d, 0s) forwards,
art-pulse-scale var(--pd, 3s) ease-in-out calc(var(--d, 0s) + 0.5s)
infinite;
}
.art-orbit {
transform-origin: 50px 50px;
animation: art-spin var(--dur, 4s) linear infinite;
animation-direction: var(--dir, normal);
}
/* ============ Responsive ============ */
@media (max-width: 1200px) {
.margin-notes {
display: none;
}
}
@media (max-width: 900px) {
.masthead {
grid-template-columns: 1fr;
gap: 1.75rem;
}
.masthead:has(.portrait-wrap.has-outline) {
grid-template-columns: 1fr;
}
.masthead-right {
max-width: 12rem;
}
.featured {
grid-template-columns: 1fr;
gap: 1.75rem;
}
.feat-art {
max-width: 12.5rem;
}
.project {
grid-template-columns: 1fr;
grid-template-areas:
"header"
"shot"
"blurb"
"meta";
column-gap: 0;
row-gap: 1rem;
}
.project-screenshot {
max-width: 14rem;
align-self: start;
}
.bottom-grid {
grid-template-columns: 1fr;
gap: 0;
}
.now-card {
grid-template-columns: 1fr;
gap: 1.5rem;
}
.timeline-wrap {
grid-template-columns: 1fr;
gap: 1.5rem;
}
.tl-axis {
position: static;
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 1rem;
padding-bottom: 1rem;
border-bottom: 1px solid var(--border);
}
.tl-axis .tl-key {
display: flex;
gap: 1rem;
margin-top: 0;
padding-top: 0;
border-top: none;
}
.contact-cta {
grid-template-columns: 1fr;
gap: 1.25rem;
padding: 1.5rem;
}
.newsletter {
grid-template-columns: 1fr;
gap: 1.25rem;
padding: 1.5rem;
}
.post-list > li {
grid-template-columns: 4rem 1fr;
gap: 1rem;
}
.post-list .p-art {
width: 4rem;
height: 4rem;
}
.post-list .p-read {
grid-column: 2;
text-align: left;
padding-top: 0.25rem;
}
.series-wrap {
grid-column: 1 / -1;
}
}
@media (max-width: 820px) {
main.post-shell {
padding: 2rem 1.25rem 3rem;
}
.post-hero {
grid-template-columns: 1fr;
gap: 1.25rem;
}
.post-hero .mm-art {
width: 5rem;
height: 5rem;
order: -1;
}
.progress-top {
display: block;
}
.post-content {
font-size: 1.05rem;
}
.post-hero h1 {
font-size: 2rem;
}
.post-hero .dek {
font-size: 1.05rem;
}
.post-content h2 {
font-size: 1.4rem;
}
.post-content h3 {
font-size: 1.15rem;
}
.post-content pre {
font-size: 0.78rem;
}
.post-content img,
.post-content video,
.post-content iframe {
max-width: 100%;
height: auto;
}
.header-box {
font-size: 0.78rem;
}
.header-box .hb-row {
flex-wrap: wrap;
gap: 0.35rem 0.65rem;
}
.byline {
flex-wrap: wrap;
gap: 0.5rem 1rem;
}
.series-strip {
flex-direction: column;
align-items: stretch;
gap: 0.6rem;
}
.series-strip .label {
margin-right: 0;
text-align: center;
}
.series-strip .parts {
flex-wrap: wrap;
gap: 0.35rem;
justify-content: center;
}
.series-strip .parts a, .series-strip .parts .cur {
flex: 0 0 auto;
min-width: 2.5rem;
padding: 0.4rem 0.6rem;
white-space: nowrap;
overflow: visible;
text-overflow: clip;
}
.series-strip .sp-sep,
.series-strip .sp-preview {
display: none;
}
.related-list {
grid-template-columns: 1fr;
}
.post-nav {
grid-template-columns: 1fr;
gap: 0.5rem;
}
.post-nav .cell.right {
text-align: left;
}
}
@media (max-width: 560px) {
main.shell {
padding: 1.5rem 1rem 2.5rem;
}
.site-nav {
padding: 0.85rem 0;
}
.site-nav .wrap {
padding: 0 1rem;
gap: 0.75rem;
}
.site-nav .brand {
font-size: 0.82rem;
}
.site-nav .links {
gap: 1rem;
font-size: 0.72rem;
}
.section-bar {
grid-template-columns: 1fr;
row-gap: 0.5rem;
margin-bottom: 1.25rem;
text-align: center;
}
.section-bar .sb-label {
font-size: 1.15rem;
}
.section-bar .sb-filter {
gap: 0.3rem;
justify-content: center;
}
.section-bar .sb-filter button {
font-size: 0.6rem;
padding: 0.22rem 0.45rem;
}
.masthead {
padding-bottom: 1.5rem;
margin-bottom: 1.75rem;
gap: 1.25rem;
text-align: center;
}
.masthead h1 {
font-size: 2rem;
margin-bottom: 0.75rem;
}
.masthead .dek {
font-size: 1rem;
margin-bottom: 1rem;
margin-left: auto;
margin-right: auto;
}
.mh-stats {
gap: 0.85rem 1.5rem;
padding-top: 0.75rem;
justify-content: center;
}
.mh-stats div b {
font-size: 1.2rem;
}
.masthead-right {
display: none;
}
.featured {
padding: 0.25rem 0 1.75rem;
margin-bottom: 1.75rem;
gap: 1rem;
text-align: center;
}
.feat-art {
display: none;
}
.feat-main .f-eyebrow {
margin-bottom: 0.65rem;
font-size: 0.6rem;
justify-content: center;
}
.feat-main h2 {
font-size: clamp(1.4rem, 6vw, 1.8rem);
margin-bottom: 0.75rem;
}
.feat-main .dek {
font-size: 0.95rem;
margin-bottom: 0.9rem;
margin-left: auto;
margin-right: auto;
}
.feat-main .meta {
gap: 0.65rem 1rem;
font-size: 0.62rem;
justify-content: center;
}
.post-list > li {
grid-template-columns: 3rem minmax(0, 1fr);
gap: 0.85rem;
padding: 1.1rem 0;
}
.post-list .p-art {
width: 3rem;
height: 3rem;
}
.post-list .p-date {
gap: 0.55rem;
font-size: 0.6rem;
margin-bottom: 0.3rem;
}
.post-list .p-title {
font-size: 1.15rem;
margin-bottom: 0.3rem;
}
.post-list .p-desc {
font-size: 0.92rem;
margin-bottom: 0.45rem;
}
.post-list .p-tags {
gap: 0.45rem;
font-size: 0.6rem;
}
.post-list .p-read {
grid-column: 2;
display: flex;
align-items: baseline;
gap: 0.5rem;
padding-top: 0.4rem;
font-size: 0.6rem;
}
.post-list .p-read b {
display: inline;
font-size: 0.82rem;
margin-bottom: 0;
}
.post-list .p-read .mini {
display: inline;
margin-top: 0;
font-size: 0.6rem;
}
.series-wrap {
padding: 0.9rem 0.9rem;
}
.series-head {
flex-wrap: wrap;
gap: 0.35rem 0.75rem;
}
.series-head .s-name {
font-size: 1.05rem;
}
.series-desc {
font-size: 0.88rem;
margin-bottom: 0.7rem;
}
.series-wrap.is-expanded .series-head {
margin-bottom: 0.5rem;
}
.series-parts a {
grid-template-columns: 3.25rem minmax(0, 1fr);
gap: 0.6rem;
padding: 0.5rem 0;
}
.series-parts .sp-title {
font-size: 0.9rem;
grid-column: 2;
}
.series-parts .sp-date {
grid-column: 2;
font-size: 0.58rem;
}
.bottom-grid {
margin-top: 2rem;
padding-top: 1.75rem;
}
.card {
margin-bottom: 1.75rem;
}
.card-title {
font-size: 0.6rem;
margin-bottom: 0.75rem;
}
.tagcloud a {
font-size: 0.7rem;
padding: 0.22rem 0.5rem;
}
.archive-list {
font-size: 0.72rem;
}
.newsletter {
margin-top: 2.25rem;
padding: 1.25rem;
gap: 1rem;
border-radius: 0.25rem;
text-align: center;
}
.newsletter .nl-title {
font-size: 1.35rem;
}
.newsletter .nl-desc {
font-size: 0.92rem;
}
.nl-form {
flex-direction: column;
gap: 0.5rem;
}
.nl-form button {
width: 100%;
padding: 0.7rem 1rem;
}
.nl-count {
gap: 0.5rem;
flex-wrap: wrap;
justify-content: center;
}
.post-hero h1 {
font-size: 1.7rem;
}
.post-hero .dek {
font-size: 0.98rem;
}
.post-content {
font-size: 1rem;
}
.post-content h2 {
font-size: 1.25rem;
margin: 2.5rem 0 1rem;
}
.post-content h3 {
font-size: 1.1rem;
}
.post-content pre {
padding: 0.75rem;
font-size: 0.74rem;
border-radius: 0.25rem;
}
.post-content blockquote {
padding-left: 1rem;
}
.project-name {
font-size: 1.25rem;
}
.project-blurb {
font-size: 0.95rem;
}
.project-screenshot {
max-width: 11rem;
}
.project-header {
flex-wrap: wrap;
gap: 0.5rem 1rem;
}
.now-role {
font-size: 1.1rem;
}
.now-card {
padding: 1.25rem;
}
.now-tech {
gap: 0.35rem;
}
.tl-header {
grid-template-columns: 1fr;
}
.tl-toggle {
justify-self: start;
margin-top: 0.3rem;
}
.tl-company {
font-size: 1.15rem;
}
.tl-when {
font-size: 0.7rem;
flex-wrap: wrap;
}
.cc-link {
padding: 0.85rem 1rem;
gap: 0.4rem;
flex-wrap: wrap;
}
.cc-link .cv {
font-size: 0.85rem;
}
.site-nav .wrap {
flex-direction: column;
gap: 0.75rem;
}
.site-nav .links {
gap: 1rem;
flex-wrap: wrap;
justify-content: center;
}
main.shell {
padding: 2rem 1rem 3rem;
}
main.post-shell {
padding: 1.75rem 1rem 3rem;
}
.header-box {
padding: 0.85rem 1rem;
}
.post-nav .cell {
padding: 1rem;
}
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
html {
scroll-behavior: auto;
}
}
/* Visually hidden (a11y) */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
/* ============ Skip link (a11y / SEO) ============ */
.skip-link {
position: absolute;
left: -9999px;
top: 0;
background: var(--accent);
color: var(--bg);
padding: 0.5rem 1rem;
font-family: var(--font-mono);
font-size: 0.75rem;
z-index: 999;
}
.skip-link:focus {
left: 1rem;
top: 1rem;
}
@font-face {
font-family: 'text';
font-style: italic;
font-weight: 100 900;
src: url('fonts/text-italic-100_900-cyrillic-ext.woff2') format('woff2');
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
font-family: 'text';
font-style: italic;
font-weight: 100 900;
src: url('fonts/text-italic-100_900-cyrillic.woff2') format('woff2');
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
font-family: 'text';
font-style: italic;
font-weight: 100 900;
src: url('fonts/text-italic-100_900-greek-ext.woff2') format('woff2');
unicode-range: U+1F00-1FFF;
}
@font-face {
font-family: 'text';
font-style: italic;
font-weight: 100 900;
src: url('fonts/text-italic-100_900-greek.woff2') format('woff2');
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
font-family: 'text';
font-style: italic;
font-weight: 100 900;
src: url('fonts/text-italic-100_900-math.woff2') format('woff2');
unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;
}
@font-face {
font-family: 'text';
font-style: italic;
font-weight: 100 900;
src: url('fonts/text-italic-100_900-symbols.woff2') format('woff2');
unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;
}
@font-face {
font-family: 'text';
font-style: italic;
font-weight: 100 900;
src: url('fonts/text-italic-100_900-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
font-family: 'text';
font-style: italic;
font-weight: 100 900;
src: url('fonts/text-italic-100_900-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'text';
font-style: italic;
font-weight: 100 900;
src: url('fonts/text-italic-100_900-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'text';
font-style: normal;
font-weight: 100 900;
src: url('fonts/text-normal-100_900-cyrillic-ext.woff2') format('woff2');
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
font-family: 'text';
font-style: normal;
font-weight: 100 900;
src: url('fonts/text-normal-100_900-cyrillic.woff2') format('woff2');
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
font-family: 'text';
font-style: normal;
font-weight: 100 900;
src: url('fonts/text-normal-100_900-greek-ext.woff2') format('woff2');
unicode-range: U+1F00-1FFF;
}
@font-face {
font-family: 'text';
font-style: normal;
font-weight: 100 900;
src: url('fonts/text-normal-100_900-greek.woff2') format('woff2');
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
font-family: 'text';
font-style: normal;
font-weight: 100 900;
src: url('fonts/text-normal-100_900-math.woff2') format('woff2');
unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;
}
@font-face {
font-family: 'text';
font-style: normal;
font-weight: 100 900;
src: url('fonts/text-normal-100_900-symbols.woff2') format('woff2');
unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;
}
@font-face {
font-family: 'text';
font-style: normal;
font-weight: 100 900;
src: url('fonts/text-normal-100_900-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
font-family: 'text';
font-style: normal;
font-weight: 100 900;
src: url('fonts/text-normal-100_900-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'text';
font-style: normal;
font-weight: 100 900;
src: url('fonts/text-normal-100_900-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 400;
src: url('fonts/code-normal-400-cyrillic-ext.woff2') format('woff2');
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 400;
src: url('fonts/code-normal-400-cyrillic.woff2') format('woff2');
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 400;
src: url('fonts/code-normal-400-greek.woff2') format('woff2');
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 400;
src: url('fonts/code-normal-400-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 400;
src: url('fonts/code-normal-400-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 400;
src: url('fonts/code-normal-400-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 500;
src: url('fonts/code-normal-500-cyrillic-ext.woff2') format('woff2');
unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 500;
src: url('fonts/code-normal-500-cyrillic.woff2') format('woff2');
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 500;
src: url('fonts/code-normal-500-greek.woff2') format('woff2');
unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 500;
src: url('fonts/code-normal-500-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 500;
src: url('fonts/code-normal-500-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'code';
font-style: normal;
font-weight: 500;
src: url('fonts/code-normal-500-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'serif';
font-style: italic;
font-weight: 300;
src: url('fonts/serif-italic-300-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
font-family: 'serif';
font-style: italic;
font-weight: 300;
src: url('fonts/serif-italic-300-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'serif';
font-style: italic;
font-weight: 300;
src: url('fonts/serif-italic-300-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'serif';
font-style: italic;
font-weight: 400;
src: url('fonts/serif-italic-400-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
font-family: 'serif';
font-style: italic;
font-weight: 400;
src: url('fonts/serif-italic-400-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'serif';
font-style: italic;
font-weight: 400;
src: url('fonts/serif-italic-400-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'serif';
font-style: normal;
font-weight: 300;
src: url('fonts/serif-normal-300-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
font-family: 'serif';
font-style: normal;
font-weight: 300;
src: url('fonts/serif-normal-300-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'serif';
font-style: normal;
font-weight: 300;
src: url('fonts/serif-normal-300-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'serif';
font-style: normal;
font-weight: 400;
src: url('fonts/serif-normal-400-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
font-family: 'serif';
font-style: normal;
font-weight: 400;
src: url('fonts/serif-normal-400-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'serif';
font-style: normal;
font-weight: 400;
src: url('fonts/serif-normal-400-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: 'serif';
font-style: normal;
font-weight: 500;
src: url('fonts/serif-normal-500-vietnamese.woff2') format('woff2');
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
font-family: 'serif';
font-style: normal;
font-weight: 500;
src: url('fonts/serif-normal-500-latin-ext.woff2') format('woff2');
unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
font-family: 'serif';
font-style: normal;
font-weight: 500;
src: url('fonts/serif-normal-500-latin.woff2') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}