@import url('tokens.css'); /* ============================================================ HOMEPAGE INTRO ============================================================ */ .homepage-intro { max-width: var(--prose-w); margin: 3rem 0; margin-top: 1rem; font-family: var(--font-serif); font-size: var(--text-body); line-height: var(--lh-body); } .homepage-intro p { margin-bottom: 1.1rem; } .homepage-intro p:first-child { font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.1em; font-family: var(--font-sans); color: var(--meta); margin-bottom: 0.5rem; } .homepage-intro p:nth-child(2) { font-size: 1.3rem; font-weight: 700; letter-spacing: -0.01em; color: var(--fg); margin-bottom: 1.5rem; } /* ============================================================ RESET & BASE ============================================================ */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } body { background: var(--bg); color: var(--fg); font-family: var(--font-sans); font-size: var(--text-body); line-height: var(--lh-body); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; } /* Full-bleed header — border and nav span 100vw */ header { width: 100%; } /* Centered content column */ main, footer, header { max-width: var(--outer-w); margin: 0 auto; padding-left: var(--pad); padding-right: var(--pad); } footer { padding-bottom: 3rem; } /* Prose constraint — applied to article/page body text only */ .prose { max-width: var(--prose-w); } /* ============================================================ MASTHEAD ============================================================ */ .masthead { border-top: 2px solid var(--fg); padding-top: 1.5rem; padding-bottom: 0; padding-left: var(--pad); padding-right: var(--pad); } .masthead-title { display: block; font-family: var(--font-serif); font-size: var(--text-display); font-weight: 700; line-height: var(--lh-display); letter-spacing: -0.03em; text-decoration: none; color: var(--fg); margin-bottom: 1.25rem; } .masthead-title:hover { color: var(--accent); background: none; } .masthead-subtitle { font-family: var(--font-sans); font-size: var(--text-xs); letter-spacing: 0.12em; color: var(--meta); text-transform: lowercase; margin-bottom: 1rem; } /* ============================================================ NAV STRIP — full outer width, equal cells ============================================================ */ .masthead nav ul { list-style: none; display: flex; } .masthead nav li { flex: 1; } .masthead nav a { display: block; text-align: center; padding: 0.55rem 0; font-size: var(--text-xs); font-weight: 700; text-transform: uppercase; letter-spacing: 0.16em; text-decoration: none; color: var(--meta); border: 1px solid var(--border-soft); transition: color 0.1s, background 0.1s; } .masthead nav a:hover { color: var(--bg); background: var(--fg); } /* ============================================================ MAIN CONTENT AREA ============================================================ */ main { padding-top: 2rem; } /* ============================================================ KOI HR ============================================================ */ hr { border: none; height: 2.5rem; position: relative; display: flex; align-items: center; justify-content: center; background-image: url('koi-hr.svg'); background-repeat: no-repeat; background-position: center; background-size: auto 100%; margin: 3rem 0; } hr::before, hr::after { content: ''; position: absolute; top: 50%; transform: translateY(-50%); width: calc(50% - 2rem); height: 1px; background: var(--border-soft); } hr::before { left: 0; } hr::after { right: 0; } /* ============================================================ FOOTER ============================================================ */ footer { font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.14em; color: var(--meta); display: flex; flex-direction: column; gap: 0.4rem; } footer a { color: var(--meta); text-decoration: none; transition: color 0.1s; } footer a:hover { color: var(--fg); background: none; } /* ============================================================ TYPOGRAPHY ============================================================ */ h1, h2, h3, h4 { font-family: var(--font-serif); font-weight: 700; letter-spacing: -0.02em; line-height: 1.1; } /* Page-level h1 (blog list, garden, guides) */ h1 { font-size: var(--text-h1); margin-bottom: 0.5rem; } /* Article display title — larger, tighter */ .article-title { font-family: var(--font-serif); font-size: clamp(2.4rem, 5vw, 3.6rem); font-weight: 700; line-height: 1.05; letter-spacing: -0.03em; margin: 0.4rem 0 0; } h2 { font-size: var(--text-h2); border-left: 1px solid var(--accent); padding-left: 0.75rem; margin-top: 2.5rem; margin-bottom: 0.4rem; } h3 { font-size: 1.05rem; margin-top: 2rem; margin-bottom: 0.3rem; } p { margin-bottom: 1.2rem; } /* Accent ONLY on links and h2 bar — nowhere else */ a { color: var(--accent); text-decoration: underline; text-underline-offset: 3px; transition: background 0.1s, color 0.1s; } a:hover { background: var(--accent); color: var(--bg); text-decoration: none; } /* ============================================================ SECTION LABEL — uppercase eyebrow text ============================================================ */ .label { display: block; font-size: var(--text-xs); font-weight: 700; text-transform: uppercase; letter-spacing: 0.16em; color: var(--meta); border-bottom: 1px solid var(--fg); padding-bottom: 0.5rem; margin-bottom: 0; } /* ============================================================ INFO STRIP — homepage identity block ============================================================ */ /* ============================================================ POST LIST — numbered, full outer width ============================================================ */ .post-list { list-style: none; counter-reset: posts; } .post-list-item { counter-increment: posts; display: grid; grid-template-columns: 2.5rem 1fr 7rem; align-items: baseline; gap: 0 1rem; padding: 0.75rem 0; border-bottom: 1px solid var(--border-soft); } .post-list-item:first-child { border-top: 1px solid var(--border-soft); } .post-list-item::before { content: counter(posts, decimal-leading-zero); font-family: var(--font-mono); font-size: var(--text-xs); color: var(--meta); letter-spacing: 0.04em; grid-column: 1; } .post-list-item a { font-size: var(--text-sm); justify-self: start; } .post-list-item time { font-size: var(--text-xs); font-family: var(--font-mono); color: var(--meta); text-align: right; white-space: nowrap; letter-spacing: 0.04em; } /* Year separator — full-width label, resets counter display */ .post-list-year { display: block; font-family: var(--font-sans); font-size: var(--text-xs); font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em; color: var(--meta); padding: 1.5rem 0 0.4rem; counter-increment: none; } .all-posts-link { display: inline-block; margin-top: 1.5rem; font-size: var(--text-xs); font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em; } /* ============================================================ ARTICLE — post page ============================================================ */ .article-dateline { font-family: var(--font-mono); font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.14em; color: var(--meta); margin-bottom: 0.35rem; } .article-standfirst { font-family: var(--font-serif); font-size: 1.15rem; line-height: 1.55; color: var(--fg-soft); padding: 1.25rem 0; border-top: 1px solid var(--border-soft); border-bottom: 1px solid var(--fg); margin-top: 1rem; max-width: var(--prose-w); } .article-body { font-family: var(--font-serif); font-size: var(--text-body); line-height: var(--lh-body); max-width: var(--prose-w); margin-top: 2.5rem; } .article-body p { margin-bottom: 1.3rem; } .reply-link { max-width: var(--prose-w); margin-top: 4rem; padding-top: 1.5rem; border-top: 1px solid var(--border-soft); font-size: var(--text-xs); font-family: var(--font-sans); text-transform: uppercase; letter-spacing: 0.12em; } /* ============================================================ GENERIC PAGE (about, uses, etc.) ============================================================ */ .page-body { font-family: var(--font-serif); font-size: var(--text-body); line-height: var(--lh-body); max-width: var(--prose-w); margin-top: 2rem; } .page-body p { margin-bottom: 1.3rem; } /* ============================================================ BLOG ARCHIVE ============================================================ */ .blog-meta { font-size: var(--text-sm); color: var(--meta); margin: 0.75rem 0 2rem; } .blog-meta code { font-size: var(--text-xs); background: var(--code-bg); padding: 0.1rem 0.35rem; font-family: var(--font-mono); } /* Year separators in post list */ .post-list-year { font-family: var(--font-serif); font-size: var(--text-xs); font-weight: 700; text-transform: uppercase; letter-spacing: 0.14em; color: var(--meta); padding: 1.25rem 0 0.5rem; list-style: none; grid-column: 1 / -1; } /* Restore list styling inside content areas */ .article-body ul, .article-body ol, .page-body ul, .page-body ol { padding-left: 1.5rem; margin-bottom: 1.2rem; } .article-body li, .page-body li { margin-bottom: 0.3rem; } .article-body ul ul, .article-body ol ol, .page-body ul ul, .page-body ol ol { margin-bottom: 0; } /* ============================================================ GARDEN ============================================================ */ .garden-index { list-style: none; } .garden-index li { display: flex; flex-direction: column; gap: 0.15rem; padding: 0.8rem 0; border-bottom: 1px solid var(--border-soft); } .garden-index li:first-child { border-top: 1px solid var(--border-soft); } .garden-index a { font-size: var(--text-sm); } .garden-desc { font-size: var(--text-xs); color: var(--meta); } /* ============================================================ APP CARDS ============================================================ */ .app-card { display: flex; gap: 1.25rem; align-items: flex-start; padding: 1.25rem 0; border-bottom: 1px solid var(--border-soft); } .app-card:first-of-type { border-top: 1px solid var(--border-soft); } .app-icon { width: 52px; height: 52px; border-radius: 12px; flex-shrink: 0; filter: none !important; margin: 0; display: block; } .app-card a:has(.app-icon):hover { background: none; } .app-info { display: flex; flex-direction: column; gap: 0.2rem; } .app-title { font-family: var(--font-sans); font-weight: 700; font-size: var(--text-sm); } .app-subtitle { font-size: var(--text-xs); color: var(--meta); } .app-links { font-size: var(--text-xs); margin-top: 0.3rem; } /* ============================================================ CODE & PRE ============================================================ */ pre { padding: 1.25rem; border-left: 1px solid var(--border-soft); background: var(--code-bg); overflow-x: auto; font-size: var(--text-sm); margin: 1.75rem 0; line-height: 1.6; } code { font-family: var(--font-mono); background: var(--code-bg); padding: 0.15rem 0.4rem; font-size: 0.875em; } pre code { background: none; padding: 0; font-size: inherit; } /* ============================================================ BLOCKQUOTE — intentional Org-mode delimiters ============================================================ */ blockquote { font-style: italic; margin: 1.75rem 0; padding: 0.75rem 1rem; border-left: 1px solid var(--border-soft); background: var(--code-bg); } blockquote p:last-child { margin-bottom: 0; } blockquote p { margin: 0; } blockquote::before { content: "#+begin_quote"; display: block; color: var(--meta); font-style: normal; font-size: var(--text-xs); font-family: var(--font-mono); letter-spacing: 0.04em; margin-bottom: 0.5rem; } blockquote::after { content: "#+end_quote"; display: block; color: var(--meta); font-style: normal; font-size: var(--text-xs); font-family: var(--font-mono); letter-spacing: 0.04em; margin-top: 0.5rem; } /* ============================================================ TABLES ============================================================ */ table { display: block; width: 100%; max-width: 100%; overflow-x: auto; border: none; border-collapse: collapse; margin: 2rem 0; } table td, table th { white-space: nowrap; padding: 0.5rem 1rem; } th, td { border-bottom: 1px solid var(--border-soft); padding: 0.65rem 0.75rem; text-align: left; font-size: var(--text-sm); } th { border-bottom: 1px solid var(--fg); font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.1em; font-weight: 700; } tr:last-child td { border-bottom: none; } /* ============================================================ IMAGES ============================================================ */ img { max-width: 100%; height: auto; filter: grayscale(1); transition: filter 0.25s; display: block; margin: 2rem 0; } img:hover { filter: grayscale(0); } /* ============================================================ FOOTNOTES ============================================================ */ .footdef { display: flex; align-items: flex-start; gap: 1rem; margin-bottom: 0.5rem; } .footpara { margin: 0; flex: 1; font-size: var(--text-sm); } .footnum { font-weight: 700; min-width: 1.5rem; text-align: right; text-decoration: none; font-size: var(--text-xs); color: var(--meta); font-family: var(--font-mono); } /* ============================================================ SKIP LINK ============================================================ */ .skip-link { position: absolute; top: -100px; left: 50%; transform: translateX(-50%); background: var(--fg); color: var(--bg); padding: 0.75rem 1.5rem; z-index: 999; font-weight: 700; font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.12em; text-decoration: none; transition: top 0.2s; } .skip-link:focus { top: 0; outline: none; } #main-content:focus { outline: none; } /* ============================================================ RESPONSIVE ============================================================ */ @media (max-width: 700px) { .masthead-title { font-size: clamp(3rem, 14vw, 5rem); } .masthead nav ul { flex-wrap: wrap; } .masthead nav li { flex: none; width: 50%; } .masthead nav a { border-bottom: 1px solid var(--border-soft); } .post-list-item { grid-template-columns: 2.25rem 1fr; } .post-list-item time { display: none; } .article-title { font-size: clamp(2rem, 9vw, 2.8rem); } } @media (max-width: 480px) { .masthead nav li { width: 100%; } }