/* Astrologue — medieval-sky design system. Fusion: layout and craft adapted from the Proposed design; palette, imagery, and voice re-themed to an almanac-of-the-heavens register and grounded in the real Astrologue branding (deep navy #003078 from the logo, gold-leaf sigil, parchment). No external requests: fonts are self-hosted under assets/fonts/ (SIL Open Font License). */ /* --------------------------------------------------------------------------- Fonts — self-hosted, subset to latin, woff2 (total ≈ 236 KB) --------------------------------------------------------------------------- */ @font-face { font-family: "Cinzel"; font-style: normal; font-weight: 600; font-display: swap; src: url("../fonts/cinzel-600.woff2") format("woff2"); } @font-face { font-family: "Cinzel"; font-style: normal; font-weight: 700; font-display: swap; src: url("../fonts/cinzel-700.woff2") format("woff2"); } @font-face { font-family: "EB Garamond"; font-style: normal; font-weight: 400; font-display: swap; src: url("../fonts/ebgaramond-400.woff2") format("woff2"); } @font-face { font-family: "EB Garamond"; font-style: normal; font-weight: 600; font-display: swap; src: url("../fonts/ebgaramond-600.woff2") format("woff2"); } @font-face { font-family: "EB Garamond"; font-style: italic; font-weight: 400; font-display: swap; src: url("../fonts/ebgaramond-italic-400.woff2") format("woff2"); } /* --------------------------------------------------------------------------- Tokens — parchment star-chart by day, night sky by dark --------------------------------------------------------------------------- */ :root { color-scheme: light; --bg: #f2ebda; /* parchment */ --surface: #f9f4e6; --ink: #1f2533; --ink-soft: #5c6172; --line: #d9cdaa; --navy: #003078; /* the logo's blue */ --lapis: #2c4a9e; --steel: #a8c0f0; /* light-steel, dark-scheme accent */ --lapis-field: #22357a; --gold: #a8801f; /* gold-leaf from the sigil */ --gold-ink: #7a5d12; --gold-soft: #cdb377; --btn-bg: #003078; --btn-fg: #f4efe2; --shadow: 0 30px 60px -35px rgb(15 20 40 / 0.45); --glow: radial-gradient(90rem 40rem at 50% -12rem, rgb(255 251 240 / 0.55), transparent 70%); --vignette: radial-gradient(140% 120% at 50% 50%, transparent 62%, rgb(30 38 70 / 0.07)); --stars: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cg fill='%23a8801f' opacity='.16'%3E%3Cpath d='M30 31l1.4 3.6 3.6 1.4-3.6 1.4-1.4 3.6-1.4-3.6-3.6-1.4 3.6-1.4z'/%3E%3Cpath d='M128 18.5l1 2.5 2.5 1-2.5 1-1 2.5-1-2.5-2.5-1 2.5-1z'/%3E%3Cpath d='M76 116l1.1 2.9 2.9 1.1-2.9 1.1-1.1 2.9-1.1-2.9-2.9-1.1 2.9-1.1z'/%3E%3Cpath d='M170 83.2l.8 2.2 2.2.8-2.2.8-.8 2.2-.8-2.2-2.2-.8 2.2-.8z'/%3E%3Cpath d='M44 165.3l.7 1.8 1.8.7-1.8.7-.7 1.8-.7-1.8-1.8-.7 1.8-.7z'/%3E%3Cpath d='M150 154l1.1 2.9 2.9 1.1-2.9 1.1-1.1 2.9-1.1-2.9-2.9-1.1 2.9-1.1z'/%3E%3Ccircle cx='100' cy='70' r='1.2'/%3E%3Ccircle cx='182' cy='142' r='1'/%3E%3Ccircle cx='14' cy='104' r='1'/%3E%3C/g%3E%3C/svg%3E"); --noise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='240' height='240' filter='url(%23n)' opacity='0.05'/%3E%3C/svg%3E"); --divider: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='16' viewBox='0 0 240 16'%3E%3Cg fill='none' stroke='%23a8801f' stroke-width='1'%3E%3Cpath d='M0 8h92'/%3E%3Cpath d='M148 8h92'/%3E%3C/g%3E%3Cg fill='%23a8801f'%3E%3Cpath d='M120 1l7 7-7 7-7-7z'/%3E%3Ccircle cx='103' cy='8' r='1.8'/%3E%3Ccircle cx='96' cy='8' r='1.8'/%3E%3Ccircle cx='137' cy='8' r='1.8'/%3E%3Ccircle cx='144' cy='8' r='1.8'/%3E%3C/g%3E%3C/svg%3E"); } @media (prefers-color-scheme: dark) { :root { color-scheme: dark; --bg: #0a0a12; /* near-black night */ --surface: #151a2c; --ink: #e9e5d8; --ink-soft: #a9b1cd; --line: #2e3554; --navy: #6f8fd8; --lapis: #a8c0f0; --steel: #a8c0f0; --lapis-field: #16224e; --gold: #d3ac52; --gold-ink: #d3ac52; --gold-soft: #8a7440; --btn-bg: #d3ac52; --btn-fg: #211a0e; --shadow: 0 30px 60px -35px rgb(0 0 0 / 0.7); --glow: radial-gradient(90rem 40rem at 50% -12rem, rgb(110 140 235 / 0.08), transparent 70%); --vignette: radial-gradient(140% 120% at 50% 50%, transparent 58%, rgb(2 4 12 / 0.5)); --stars: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cg fill='%23d3ac52' opacity='.35'%3E%3Cpath d='M30 31l1.4 3.6 3.6 1.4-3.6 1.4-1.4 3.6-1.4-3.6-3.6-1.4 3.6-1.4z'/%3E%3Cpath d='M128 18.5l1 2.5 2.5 1-2.5 1-1 2.5-1-2.5-2.5-1 2.5-1z'/%3E%3Cpath d='M76 116l1.1 2.9 2.9 1.1-2.9 1.1-1.1 2.9-1.1-2.9-2.9-1.1 2.9-1.1z'/%3E%3Cpath d='M170 83.2l.8 2.2 2.2.8-2.2.8-.8 2.2-.8-2.2-2.2-.8 2.2-.8z'/%3E%3Cpath d='M44 165.3l.7 1.8 1.8.7-1.8.7-.7 1.8-.7-1.8-1.8-.7 1.8-.7z'/%3E%3Cpath d='M150 154l1.1 2.9 2.9 1.1-2.9 1.1-1.1 2.9-1.1-2.9-2.9-1.1 2.9-1.1z'/%3E%3Ccircle cx='100' cy='70' r='1.2'/%3E%3Ccircle cx='182' cy='142' r='1'/%3E%3Ccircle cx='14' cy='104' r='1'/%3E%3C/g%3E%3C/svg%3E"); } } /* --------------------------------------------------------------------------- Base --------------------------------------------------------------------------- */ *, *::before, *::after { box-sizing: border-box; } * { margin: 0; } html { scroll-behavior: smooth; scroll-padding-top: 5.5rem; } body { font-family: "EB Garamond", Georgia, "Times New Roman", serif; font-size: 1.125rem; line-height: 1.65; color: var(--ink); background-color: var(--bg); background-image: var(--noise); border-top: 3px solid var(--gold); -webkit-font-smoothing: antialiased; } body::after { content: ""; position: fixed; inset: 0; pointer-events: none; background-image: var(--glow), var(--vignette); } img { display: block; max-width: 100%; height: auto; } h1, h2, h3 { font-family: "Cinzel", Georgia, serif; font-weight: 600; line-height: 1.15; text-wrap: balance; } a { color: var(--lapis); text-decoration-thickness: 1px; text-underline-offset: 3px; } a:hover { color: var(--gold-ink); } :focus-visible { outline: 2px solid var(--gold); outline-offset: 3px; } ::selection { background: var(--gold); color: #211a0e; } .container { width: min(72rem, 100% - 3rem); margin-inline: auto; } .container--prose { width: min(50rem, 100% - 3rem); } .skip-link { position: fixed; top: 0.75rem; left: 0.75rem; z-index: 100; padding: 0.6rem 1rem; font-family: "Cinzel", serif; font-size: 0.8rem; letter-spacing: 0.08em; color: #211a0e; background: var(--gold); text-decoration: none; transform: translateY(-300%); } .skip-link:focus { transform: translateY(0); } /* --------------------------------------------------------------------------- Masthead — the real logo, light variant by day, dark variant by night --------------------------------------------------------------------------- */ .masthead { position: sticky; top: 0; z-index: 20; background: color-mix(in srgb, var(--bg) 88%, transparent); backdrop-filter: blur(8px); border-bottom: 1px solid var(--line); } .masthead__inner { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.75rem 2rem; padding-block: 0.75rem; } .brand { display: inline-flex; align-items: center; text-decoration: none; color: inherit; } .brand__logo { height: 2.5rem; width: auto; } .brand__logo--dark { display: none; } @media (prefers-color-scheme: dark) { .brand__logo--light { display: none; } .brand__logo--dark { display: inline-block; } } .site-nav__list { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem 1.6rem; padding: 0; list-style: none; } .site-nav__list a:not(.nav-cta) { font-variant: small-caps; font-size: 1.08rem; letter-spacing: 0.06em; color: var(--ink); text-decoration: none; background-image: linear-gradient(var(--gold), var(--gold)); background-repeat: no-repeat; background-position: 0 100%; background-size: 0% 1px; transition: background-size 0.25s ease, color 0.25s ease; } .site-nav__list a:not(.nav-cta):hover { color: var(--gold-ink); background-size: 100% 1px; } .nav-cta { font-family: "Cinzel", serif; font-size: 0.82rem; letter-spacing: 0.08em; color: var(--btn-fg); background: var(--btn-bg); border: 1px solid var(--gold); padding: 0.45rem 1rem; text-decoration: none; transition: background-color 0.25s ease, color 0.25s ease; } .nav-cta:hover { background: var(--gold); color: #211a0e; } /* --------------------------------------------------------------------------- Bands, kickers, section heads --------------------------------------------------------------------------- */ .band { padding-block: clamp(3rem, 8vw, 5.5rem); } .band--sky { --ink: #ece7d8; --ink-soft: #b9c2df; --gold: #d3ac52; --gold-ink: #d3ac52; --gold-soft: #c9b06a; --surface: var(--lapis-field); color: var(--ink); background-color: var(--lapis-field); background-image: var(--stars), radial-gradient(80rem 34rem at 50% -10rem, rgb(127 160 232 / 0.16), transparent 70%); border-block: 1px solid color-mix(in srgb, var(--gold) 40%, transparent); } .kicker { display: flex; align-items: center; gap: 1.25rem; margin-bottom: 1.1rem; } .kicker::before, .kicker::after { content: ""; flex: 1; height: 1px; background: linear-gradient(90deg, transparent, var(--gold-soft)); } .kicker::after { background: linear-gradient(90deg, var(--gold-soft), transparent); } .kicker span { font-family: "Cinzel", serif; font-size: 0.78rem; font-weight: 600; letter-spacing: 0.28em; text-transform: uppercase; color: var(--gold-ink); white-space: nowrap; } .section-head { max-width: 44rem; margin-inline: auto; margin-bottom: clamp(2rem, 5vw, 3.25rem); text-align: center; } .section-head h2 { font-size: clamp(1.7rem, 1rem + 2.4vw, 2.6rem); } .section-head__intro { margin-top: 1rem; color: var(--ink-soft); text-wrap: pretty; } /* --------------------------------------------------------------------------- Hero — pitch beside the Milky Way folio --------------------------------------------------------------------------- */ .hero { padding-block: clamp(3.5rem, 9vw, 6.5rem) clamp(3rem, 8vw, 5.5rem); } .hero__grid { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.8fr); gap: clamp(2.5rem, 6vw, 5rem); align-items: center; } .hero__title { font-size: clamp(2.3rem, 1.2rem + 4vw, 4rem); margin-bottom: 1.5rem; } .hero__accent { display: block; font-family: "EB Garamond", serif; font-style: italic; font-weight: 500; font-size: 0.72em; color: var(--lapis); } .lede { font-size: 1.22rem; max-width: 56ch; color: var(--ink); text-wrap: pretty; } .dropcap::first-letter { font-family: "Cinzel", serif; float: left; font-size: 3.1em; line-height: 0.78; padding: 0.08em 0.12em 0 0; color: var(--gold-ink); } .hero__actions { display: flex; flex-wrap: wrap; gap: 1rem; margin-top: 2.2rem; } .btn { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.8rem 1.6rem; font-family: "Cinzel", serif; font-size: 0.92rem; font-weight: 600; letter-spacing: 0.08em; text-decoration: none; border: 1px solid var(--gold); transition: background-color 0.25s ease, color 0.25s ease, border-color 0.25s ease; } .btn--primary { background: var(--btn-bg); color: var(--btn-fg); } .btn--primary:hover { background: var(--gold); color: #211a0e; } .btn--ghost { background: transparent; color: var(--ink); border-color: color-mix(in srgb, var(--ink) 45%, transparent); } .btn--ghost:hover { color: var(--gold-ink); border-color: var(--gold); } .hero__note { margin-top: 1.1rem; font-size: 0.92rem; font-style: italic; color: var(--ink-soft); } /* Folio — a plate from the night atlas, framed in gold */ .folio { position: relative; padding: 0.75rem; background-color: var(--lapis-field); background-image: var(--stars); border: 1px solid var(--gold-soft); box-shadow: var(--shadow); } .folio img { width: 100%; border: 1px solid color-mix(in srgb, var(--gold) 40%, transparent); } .folio figcaption { padding-top: 0.7rem; font-size: 0.85rem; font-style: italic; text-align: center; color: rgb(236 231 216 / 0.75); } .corner { position: absolute; width: 22px; height: 22px; border: 0 solid var(--gold); } .corner--tl { top: -2px; left: -2px; border-top-width: 2px; border-left-width: 2px; } .corner--tr { top: -2px; right: -2px; border-top-width: 2px; border-right-width: 2px; } .corner--bl { bottom: -2px; left: -2px; border-bottom-width: 2px; border-left-width: 2px; } .corner--br { bottom: -2px; right: -2px; border-bottom-width: 2px; border-right-width: 2px; } .divider { width: min(240px, 60vw); height: 16px; margin: 0 auto; border: 0; background: var(--divider) center / contain no-repeat; } /* --------------------------------------------------------------------------- Pillars — the three real cards from the original site --------------------------------------------------------------------------- */ .grid-pillars { display: grid; grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); gap: 1.75rem; } .pillar { display: flex; flex-direction: column; padding: 0 0 1.9rem; background: var(--surface); border: 1px solid var(--line); box-shadow: inset 0 2px 0 var(--gold-soft); transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease; } .pillar:hover { transform: translateY(-3px); border-color: var(--gold-soft); box-shadow: inset 0 2px 0 var(--gold); } .pillar__media { margin: 1.4rem 1.4rem 0; aspect-ratio: 16 / 9; overflow: hidden; border: 1px solid var(--gold-soft); } .pillar__media img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.4s ease; } .pillar:hover .pillar__media img { transform: scale(1.03); } .pillar__body { padding: 1.1rem 1.5rem 0; } .pillar__num { font-family: "Cinzel", serif; font-weight: 700; font-size: 1rem; letter-spacing: 0.1em; color: var(--gold-ink); } .pillar h3 { margin: 0.5rem 0 0.6rem; font-size: 1.12rem; } .pillar p:last-child { font-size: 1rem; color: var(--ink-soft); text-wrap: pretty; } .pillar__sigil { display: flex; justify-content: center; padding-top: 1.9rem; } /* The sigil — ring and eight-point star, the site's celestial mark */ .sigil__ring { stroke: var(--gold); } .sigil__star { fill: var(--gold); } .sigil__core { fill: var(--lapis); } /* --------------------------------------------------------------------------- News — honest empty state until there is news --------------------------------------------------------------------------- */ .news-empty { max-width: 34rem; margin-inline: auto; padding: clamp(2rem, 5vw, 3rem) clamp(1.5rem, 5vw, 2.75rem); text-align: center; background: var(--surface); border: 1px solid var(--gold-soft); } .news-empty .sigil { margin-inline: auto; } .news-empty h3 { margin-top: 1rem; font-size: 1.2rem; } .news-empty p { margin-top: 0.6rem; font-size: 1rem; color: var(--ink-soft); text-wrap: pretty; } .news-empty code { font-size: 0.9em; color: var(--ink); background: color-mix(in srgb, var(--gold) 18%, transparent); padding: 0.05em 0.4em; } /* --------------------------------------------------------------------------- Download — honest until a release exists; table ready for the day --------------------------------------------------------------------------- */ .cta-band { position: relative; max-width: 46rem; margin-inline: auto; padding: clamp(2.25rem, 6vw, 3.5rem) clamp(1.5rem, 6vw, 3.5rem); text-align: center; background: var(--surface); border: 1px solid var(--gold-soft); } .cta-band::before, .cta-band::after { content: ""; position: absolute; width: 26px; height: 26px; border: 0 solid var(--gold); } .cta-band::before { top: 8px; left: 8px; border-top-width: 2px; border-left-width: 2px; } .cta-band::after { bottom: 8px; right: 8px; border-bottom-width: 2px; border-right-width: 2px; } .cta-band .kicker { margin-inline: auto; max-width: 30rem; } .cta-band h2 { font-size: clamp(1.6rem, 1rem + 2vw, 2.3rem); } .cta-band__lede { margin-top: 0.8rem; color: var(--ink-soft); } .cta-band .hero__actions { justify-content: center; } .cta-band .hero__note { margin-top: 1.3rem; } .release-table { width: 100%; margin-top: 2rem; border-collapse: collapse; font-size: 0.95rem; text-align: left; } .release-table caption { margin-bottom: 0.6rem; font-size: 0.85rem; font-style: italic; color: var(--ink-soft); } .release-table th, .release-table td { padding: 0.55rem 0.7rem; border-bottom: 1px solid var(--line); vertical-align: top; } .release-table th { font-family: "Cinzel", serif; font-size: 0.72rem; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold-ink); } .release-table td code { font-size: 0.82em; word-break: break-all; } #download.band { padding-top: clamp(1.5rem, 5vw, 3rem); } /* --------------------------------------------------------------------------- Footer — the night sky, the four freedoms, the licence --------------------------------------------------------------------------- */ .site-footer { background-color: color-mix(in srgb, var(--lapis-field) 55%, #0a0a12); background-image: var(--stars); color: #ece7d8; padding: clamp(2.75rem, 7vw, 4rem) 0 2.25rem; } .footer-grid { display: grid; grid-template-columns: 2fr 1.3fr 1fr; gap: 2.5rem 1.5rem; } .foot-brand { max-width: 26rem; } .foot-brand .brand__logo { height: 2.2rem; margin-bottom: 1rem; } .foot-brand p { font-size: 0.98rem; font-style: italic; color: rgb(236 231 216 / 0.78); } .foot-title { font-family: "Cinzel", serif; font-size: 0.8rem; font-weight: 600; letter-spacing: 0.16em; text-transform: uppercase; color: #cdb377; margin-bottom: 0.9rem; } .freedoms { padding: 0; list-style: none; counter-reset: freedom; } .freedoms li { position: relative; counter-increment: freedom; padding-left: 2.2rem; margin-top: 0.55rem; font-size: 0.95rem; color: rgb(236 231 216 / 0.85); } .freedoms li::before { content: counter(freedom, decimal-leading-zero); position: absolute; left: 0; top: 0.1em; font-family: "Cinzel", serif; font-size: 0.72rem; letter-spacing: 0.1em; color: #d3ac52; } .foot-list { padding: 0; list-style: none; } .foot-list li + li { margin-top: 0.45rem; } .foot-list a { color: rgb(236 231 216 / 0.88); font-size: 0.98rem; text-decoration: none; } .foot-list a:hover { color: #d3ac52; text-decoration: underline; text-underline-offset: 3px; } .colophon { margin-top: 2.5rem; padding-top: 1.4rem; border-top: 1px solid rgb(236 231 216 / 0.22); font-size: 0.88rem; font-style: italic; text-align: center; color: rgb(236 231 216 / 0.62); } /* --------------------------------------------------------------------------- Developer pages — breadcrumb, page hero, stack map, project cards --------------------------------------------------------------------------- */ /* Where you are: Home / Developer — established here for the detail pages too */ .breadcrumb { padding-block: 0.9rem 0; } .breadcrumb ol { display: flex; flex-wrap: wrap; gap: 0.35rem 0.75rem; padding: 0; margin: 0; list-style: none; font-size: 0.88rem; } .breadcrumb li { display: flex; align-items: center; gap: 0.75rem; } .breadcrumb li + li::before { content: "/"; color: var(--gold-ink); } .breadcrumb a { font-variant: small-caps; letter-spacing: 0.05em; color: var(--ink-soft); text-decoration: none; } .breadcrumb a:hover { color: var(--gold-ink); } .breadcrumb [aria-current] { font-variant: small-caps; letter-spacing: 0.05em; color: var(--ink); } /* The masthead marks the section you stand in */ .site-nav__list a[aria-current="page"] { color: var(--gold-ink); background-size: 100% 1px; } /* Page hero — the developer section's title page (no folio; the sky band below carries the imagery) */ .page-hero { padding-block: clamp(2.5rem, 6vw, 4.5rem) clamp(2rem, 5vw, 3.25rem); } .page-hero .hero__copy { max-width: 54rem; margin-inline: auto; text-align: center; } .page-hero .hero__actions { justify-content: center; } .page-hero .lede { margin-inline: auto; } /* Stack map — Spry's README diagram, redrawn as nested plates on the night sky */ .stack-map { max-width: 44rem; margin-inline: auto; } .stack-layer { padding: 0.85rem 1.1rem 1rem; background: rgb(7 9 20 / 0.45); border: 1px solid color-mix(in srgb, var(--gold) 45%, transparent); } .stack-layer--child { margin-top: 0.75rem; } .stack-layer__name { font-family: "Cinzel", serif; font-size: 0.92rem; font-weight: 600; letter-spacing: 0.06em; color: var(--gold-ink); } .stack-layer__name a { color: inherit; text-decoration: none; border-bottom: 1px solid color-mix(in srgb, var(--gold) 55%, transparent); } .stack-layer__name a:hover { color: var(--gold); border-bottom-color: var(--gold); } .stack-layer__role { margin-top: 0.15rem; font-size: 0.92rem; font-style: italic; color: var(--ink-soft); } .stack-branches { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .stack-map figcaption { margin-top: 1.1rem; font-size: 0.88rem; font-style: italic; text-align: center; color: var(--ink-soft); text-wrap: pretty; } /* The firmament — where the non-web pieces sit around the stack */ .firmament-title { margin-top: clamp(2.25rem, 6vw, 3.25rem); font-size: 1.05rem; letter-spacing: 0.14em; text-transform: uppercase; text-align: center; color: var(--gold-ink); } .firmament { display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); gap: 1rem 1.5rem; max-width: 56rem; margin: 1.4rem auto 0; } .firmament__item { padding-left: 0.9rem; border-left: 2px solid var(--gold-soft); } .firmament__name { font-family: "Cinzel", serif; font-size: 0.9rem; font-weight: 600; letter-spacing: 0.05em; } .firmament__item p + p { margin-top: 0.15rem; font-size: 0.92rem; font-style: italic; color: var(--ink-soft); text-wrap: pretty; } /* Group heads — the catalogue's chapters */ .group-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.4rem 1rem; margin: clamp(2.75rem, 7vw, 4rem) 0 1.4rem; padding-bottom: 0.7rem; border-bottom: 1px solid var(--line); } .section-head + .group-head { margin-top: 0; } .group-head__num { font-family: "Cinzel", serif; font-weight: 700; font-size: 1rem; letter-spacing: 0.1em; color: var(--gold-ink); } .group-head h3 { font-size: 1.18rem; } .group-head__note { margin-left: auto; font-size: 0.92rem; font-style: italic; color: var(--ink-soft); } /* Project cards — one library per plate */ .grid-projects { display: grid; grid-template-columns: repeat(auto-fill, minmax(19rem, 1fr)); gap: 1.4rem; } .project-card { display: flex; flex-direction: column; padding: 1.25rem 1.35rem 1.1rem; background: var(--surface); border: 1px solid var(--line); box-shadow: inset 0 2px 0 var(--gold-soft); transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease; } .project-card:hover { transform: translateY(-3px); border-color: var(--gold-soft); box-shadow: inset 0 2px 0 var(--gold); } .project-card__top { display: flex; align-items: baseline; justify-content: space-between; gap: 0.75rem; } .project-card__top h3 { font-size: 1.06rem; } .project-card__top a { color: inherit; text-decoration: none; } .project-card__top a:hover { color: var(--gold-ink); text-decoration: underline; text-underline-offset: 3px; } .project-card__tag { flex: none; padding: 0.14rem 0.5rem; font-family: "Cinzel", serif; font-size: 0.62rem; font-weight: 600; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold-ink); border: 1px solid var(--gold-soft); } .project-card__summary { margin-top: 0.75rem; flex-grow: 1; font-size: 0.99rem; color: var(--ink-soft); text-wrap: pretty; } .project-card__meta { display: flex; align-items: baseline; justify-content: space-between; gap: 0.75rem; margin-top: 1.15rem; padding-top: 0.8rem; border-top: 1px solid var(--line); } .project-card__meta > span { font-size: 0.84rem; font-style: italic; color: var(--ink-soft); } .project-card__more { font-family: "Cinzel", serif; font-size: 0.72rem; font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; color: var(--gold-ink); text-decoration: none; white-space: nowrap; } .project-card__more:hover { color: var(--gold-ink); text-decoration: underline; text-underline-offset: 3px; } @media (max-width: 38rem) { .stack-branches { grid-template-columns: 1fr; } .group-head__note { margin-left: 0; } } /* --------------------------------------------------------------------------- Responsive, motion, print --------------------------------------------------------------------------- */ @media (max-width: 60rem) { .hero__grid { grid-template-columns: 1fr; } .folio { max-width: 26rem; margin-inline: auto; } .footer-grid { grid-template-columns: 1fr 1fr; } .foot-brand { grid-column: 1 / -1; } } @media (max-width: 38rem) { .footer-grid { grid-template-columns: 1fr; } .kicker span { letter-spacing: 0.18em; } .release-table { display: block; overflow-x: auto; } } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { transition-duration: 0.01ms !important; animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; } } @media print { body { background: none; color: #000; } body::after, .masthead .site-nav, .hero__actions, .btn { display: none; } .folio { box-shadow: none; } }