@import "tailwindcss"; @theme { --color-ink: #cbd5e1; --color-ink-bright: #e2e8f0; --color-ink-dim: #94a3b8; --color-paper: #0f172a; --color-paper-raised: #1e293b; --color-paper-dim: #141c27; --color-accent: #3b82f6; --color-accent-light: #8b5cf6; --color-muted: #7a8a9e; --color-border: #334155; --color-border-light: #3f4f63; --font-serif: "Iowan Old Style", "Palatino Linotype", "URW Palladio L", P052, serif; --font-mono: "SF Mono", "Fira Code", "Fira Mono", "Roboto Mono", monospace; } /* Default: dark navy with blue-purple accents (ATAuth style) */ /* Uses the @theme defaults above */ /* Theme: Parchment — warm aged paper */ [data-theme="parchment"] { --color-ink: #3d3329; --color-ink-bright: #1a1410; --color-ink-dim: #6b5d4f; --color-paper: #d9ccb4; --color-paper-raised: #cfc1a7; --color-paper-dim: #d3c5ab; --color-accent: #7a3b10; --color-accent-light: #904d22; --color-muted: #5e4f3d; --color-border: #bfb196; --color-border-light: #c9bca3; } /* Theme: Moss — earthy green tones */ [data-theme="moss"] { --color-ink: #2d3a2e; --color-ink-bright: #1a241b; --color-ink-dim: #4d5e4f; --color-paper: #dde6d5; --color-paper-raised: #d0dbc7; --color-paper-dim: #d5dfcc; --color-accent: #3d6b35; --color-accent-light: #4a8040; --color-muted: #4d5e4f; --color-border: #b8c9ad; --color-border-light: #c4d3b9; } /* Theme: Slate — cool minimal gray */ [data-theme="slate"] { --color-ink: #37404a; --color-ink-bright: #1a2029; --color-ink-dim: #5a6674; --color-paper: #eef0f3; --color-paper-raised: #e2e5ea; --color-paper-dim: #e8eaee; --color-accent: #4a6fa5; --color-accent-light: #5b82b8; --color-muted: #5a6674; --color-border: #d0d5dc; --color-border-light: #dae0e6; } /* Theme: Rose — warm blush tones */ [data-theme="rose"] { --color-ink: #3d2d33; --color-ink-bright: #1f1418; --color-ink-dim: #6b5058; --color-paper: #f0e2e4; --color-paper-raised: #e6d5d8; --color-paper-dim: #ebdadd; --color-accent: #a04258; --color-accent-light: #b85570; --color-muted: #6b5058; --color-border: #d4bfc4; --color-border-light: #dec9ce; } /* Theme: E-Ink — color e-ink display */ [data-theme="eink"] { --color-ink: #2d2b28; --color-ink-bright: #1a1918; --color-ink-dim: #5c5955; --color-paper: #e5e1dc; --color-paper-raised: #dbd7d1; --color-paper-dim: #dfdbd5; --color-accent: #4a7a6e; --color-accent-light: #5c8e82; --color-muted: #605c57; --color-border: #c9c4bd; --color-border-light: #d3cec7; } /* Text selection — theme-matched highlight */ ::selection { background: color-mix(in srgb, var(--color-accent) 25%, transparent); color: var(--color-ink-bright); } html { scroll-behavior: smooth; -webkit-font-smoothing: antialiased; } /* Default body gradient — subtle blue/purple ambient glow */ body { background-image: radial-gradient(ellipse at 20% 50%, rgba(59, 130, 246, 0.15) 0%, transparent 50%), radial-gradient(ellipse at 80% 20%, rgba(139, 92, 246, 0.12) 0%, transparent 50%), radial-gradient(ellipse at 50% 80%, rgba(14, 165, 233, 0.1) 0%, transparent 50%); } [data-theme="parchment"] body { background-image: radial-gradient(ellipse at 25% 15%, rgba(240, 225, 180, 0.7) 0%, transparent 30%), radial-gradient(ellipse at 70% 5%, rgba(235, 218, 170, 0.5) 0%, transparent 25%), radial-gradient(ellipse at 60% 50%, rgba(200, 165, 100, 0.35) 0%, transparent 35%), radial-gradient(ellipse at 10% 70%, rgba(120, 105, 80, 0.3) 0%, transparent 30%), radial-gradient(ellipse at 85% 80%, rgba(130, 112, 85, 0.25) 0%, transparent 28%), radial-gradient(ellipse at 45% 90%, rgba(115, 100, 75, 0.2) 0%, transparent 35%), radial-gradient(circle at 15% 50%, rgba(90, 75, 55, 0.2) 0%, transparent 20%), radial-gradient(circle at 80% 35%, rgba(95, 80, 58, 0.15) 0%, transparent 18%), radial-gradient(ellipse at 50% 50%, transparent 30%, rgba(100, 85, 60, 0.4) 100%); } [data-theme="moss"] body { background-image: radial-gradient(ellipse at 25% 15%, rgba(200, 220, 180, 0.5) 0%, transparent 30%), radial-gradient(ellipse at 70% 5%, rgba(190, 210, 170, 0.4) 0%, transparent 25%), radial-gradient(ellipse at 60% 50%, rgba(150, 180, 120, 0.25) 0%, transparent 35%), radial-gradient(ellipse at 10% 70%, rgba(80, 100, 60, 0.25) 0%, transparent 30%), radial-gradient(ellipse at 85% 80%, rgba(90, 110, 70, 0.2) 0%, transparent 28%), radial-gradient(ellipse at 50% 50%, transparent 30%, rgba(70, 90, 50, 0.3) 100%); } [data-theme="slate"] body { background-image: radial-gradient(ellipse at 25% 15%, rgba(220, 225, 235, 0.6) 0%, transparent 30%), radial-gradient(ellipse at 70% 5%, rgba(210, 218, 230, 0.4) 0%, transparent 25%), radial-gradient(ellipse at 60% 50%, rgba(180, 195, 215, 0.2) 0%, transparent 35%), radial-gradient(ellipse at 50% 50%, transparent 40%, rgba(160, 170, 190, 0.2) 100%); } [data-theme="rose"] body { background-image: radial-gradient(ellipse at 25% 15%, rgba(245, 210, 215, 0.6) 0%, transparent 30%), radial-gradient(ellipse at 70% 5%, rgba(240, 200, 210, 0.4) 0%, transparent 25%), radial-gradient(ellipse at 60% 50%, rgba(210, 160, 175, 0.25) 0%, transparent 35%), radial-gradient(ellipse at 10% 70%, rgba(140, 100, 110, 0.2) 0%, transparent 30%), radial-gradient(ellipse at 85% 80%, rgba(150, 110, 120, 0.18) 0%, transparent 28%), radial-gradient(ellipse at 50% 50%, transparent 30%, rgba(120, 85, 95, 0.3) 100%); } [data-theme="eink"] body { background-image: radial-gradient(ellipse at 30% 20%, rgba(200, 195, 185, 0.3) 0%, transparent 40%), radial-gradient(ellipse at 70% 70%, rgba(190, 185, 175, 0.2) 0%, transparent 35%); } /* ── E-Ink animation overrides ── Mimics color e-ink display behavior: - Full page refresh flash on load - Discrete stepped rendering (no smooth fades) - No glows, shadows, or smooth transitions - No backdrop blur (e-ink can't blur) */ @keyframes einkRefresh { 0% { opacity: 1; } 50% { opacity: 1; } 100% { opacity: 0; } } @keyframes einkExit { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes einkFadeIn { from { opacity: 0; } to { opacity: 1; } } /* Flash overlay on page load */ [data-theme="eink"] body::after { content: ""; position: fixed; inset: 0; background: var(--color-ink-bright); z-index: 9999; animation: einkRefresh 0.5s steps(2) both; pointer-events: none; } /* Flash overlay on navigation (exit) */ [data-theme="eink"] body.eink-navigating::after { animation: einkExit 0.25s steps(2) both; } /* Kill all smooth transitions */ [data-theme="eink"] *, [data-theme="eink"] *::before, [data-theme="eink"] *::after { transition-duration: 0s !important; } /* Stepped fade-in (no slide, no ease) */ [data-theme="eink"] .fade-in { animation: einkFadeIn 0.3s steps(4) 0.25s both; } [data-theme="eink"] .fade-in-delay { animation: einkFadeIn 0.3s steps(4) 0.35s both; } /* Stepped stagger (delays follow the page flash) */ [data-theme="eink"] .stagger-in > *:nth-child(1) { animation: einkFadeIn 0.2s steps(3) 0.3s both; } [data-theme="eink"] .stagger-in > *:nth-child(2) { animation: einkFadeIn 0.2s steps(3) 0.35s both; } [data-theme="eink"] .stagger-in > *:nth-child(3) { animation: einkFadeIn 0.2s steps(3) 0.4s both; } [data-theme="eink"] .stagger-in > *:nth-child(4) { animation: einkFadeIn 0.2s steps(3) 0.45s both; } [data-theme="eink"] .stagger-in > *:nth-child(5) { animation: einkFadeIn 0.2s steps(3) 0.5s both; } [data-theme="eink"] .stagger-in > *:nth-child(n+6) { animation: einkFadeIn 0.2s steps(3) 0.55s both; } /* Remove glows and shadows */ [data-theme="eink"] .card-glow { transition: none; } [data-theme="eink"] .card-glow:hover { box-shadow: none; border-color: var(--color-accent); } [data-theme="eink"] .avatar-glow { box-shadow: 0 0 0 2px var(--color-paper); } /* About modal: instant, no blur, no slide */ [data-theme="eink"] .about-overlay { transition: none; } [data-theme="eink"] .about-backdrop { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(0, 0, 0, 0.6); } [data-theme="eink"] .about-panel { transition: none; transform: none; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); } [data-theme="eink"] .about-overlay.is-open .about-panel { transform: none; } /* Login button: no hover glow or lift */ [data-theme="eink"] .login-btn:hover { transform: none; box-shadow: none; } [data-theme="eink"] .login-card { box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } /* Fade-in animation */ @keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn 0.4s ease-out both; } .fade-in-delay { animation: fadeIn 0.4s ease-out 0.1s both; } /* Staggered fade-in for post lists */ .stagger-in > *:nth-child(1) { animation: fadeIn 0.4s ease-out 0.05s both; } .stagger-in > *:nth-child(2) { animation: fadeIn 0.4s ease-out 0.1s both; } .stagger-in > *:nth-child(3) { animation: fadeIn 0.4s ease-out 0.15s both; } .stagger-in > *:nth-child(4) { animation: fadeIn 0.4s ease-out 0.2s both; } .stagger-in > *:nth-child(5) { animation: fadeIn 0.4s ease-out 0.25s both; } .stagger-in > *:nth-child(n+6) { animation: fadeIn 0.4s ease-out 0.3s both; } /* Gradient text utility */ .text-gradient { background: linear-gradient(135deg, var(--color-accent), var(--color-accent-light)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } /* Card hover glow */ .card-glow { transition: border-color 0.3s, box-shadow 0.3s, background-color 0.3s; } .card-glow:hover { box-shadow: 0 0 20px color-mix(in srgb, var(--color-accent) 12%, transparent), 0 0 40px color-mix(in srgb, var(--color-accent-light) 6%, transparent); } /* Avatar glow ring */ .avatar-glow { box-shadow: 0 0 0 2px var(--color-paper), 0 0 12px color-mix(in srgb, var(--color-accent) 30%, transparent); } /* Gradient border line (header/footer) */ .border-gradient { border-image: linear-gradient(90deg, var(--color-border), color-mix(in srgb, var(--color-accent) 40%, var(--color-border)), color-mix(in srgb, var(--color-accent-light) 30%, var(--color-border)), var(--color-border)) 1; } /* Markdown content styles */ .prose h1 { font-family: var(--font-serif); font-size: 2.25rem; font-weight: 700; line-height: 1.2; margin-bottom: 1.5rem; color: var(--color-ink-bright); } .prose h2 { font-family: var(--font-serif); font-size: 1.5rem; font-weight: 600; line-height: 1.3; margin-top: 2.5rem; margin-bottom: 1rem; color: var(--color-ink-bright); } .prose h3 { font-family: var(--font-serif); font-size: 1.25rem; font-weight: 600; margin-top: 2rem; margin-bottom: 0.75rem; color: var(--color-ink-bright); } .prose p { font-family: var(--font-serif); font-size: 1.0625rem; line-height: 1.8; margin-bottom: 1.25rem; color: var(--color-ink); } @media (min-width: 640px) { .prose p { font-size: 1.125rem; } } .prose a { color: var(--color-accent); text-decoration: underline; text-decoration-color: color-mix(in srgb, var(--color-accent) 30%, transparent); text-underline-offset: 3px; transition: text-decoration-color 0.2s; } .prose a:hover { text-decoration-color: var(--color-accent); } .prose blockquote { border-left: 2px solid var(--color-accent); padding-left: 1.25rem; margin: 1.5rem 0; font-style: italic; color: var(--color-ink-dim); } .prose ul, .prose ol { font-family: var(--font-serif); font-size: 1.0625rem; line-height: 1.8; margin-bottom: 1.25rem; padding-left: 1.5rem; color: var(--color-ink); } @media (min-width: 640px) { .prose ul, .prose ol { font-size: 1.125rem; } } .prose li { margin-bottom: 0.25rem; } .prose pre { background: var(--color-paper-dim); color: var(--color-ink); padding: 1.25rem; border-radius: 0.5rem; border: 1px solid var(--color-border); overflow-x: auto; -webkit-overflow-scrolling: touch; font-family: var(--font-mono); font-size: 0.875rem; line-height: 1.6; margin: 1.5rem 0; } .prose code { font-family: var(--font-mono); font-size: 0.875em; background: var(--color-paper-raised); padding: 0.15rem 0.4rem; border-radius: 0.25rem; color: var(--color-accent); } .prose pre code { background: none; padding: 0; color: inherit; } .prose strong { font-weight: 700; color: var(--color-ink-bright); } .prose em { font-style: italic; } .prose hr { border: none; margin: 2.5rem 0; text-align: center; line-height: 0; } .prose hr::after { content: "· · ·"; font-family: var(--font-serif); font-size: 1.25rem; letter-spacing: 0.15em; color: var(--color-muted); } .prose img { max-width: 100%; border-radius: 0.5rem; margin: 1.5rem 0; } /* About modal */ .about-overlay { position: fixed; inset: 0; z-index: 50; display: flex; align-items: center; justify-content: center; opacity: 0; pointer-events: none; transition: opacity 0.2s ease; } .about-overlay.is-open { opacity: 1; pointer-events: auto; } .about-backdrop { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); } .about-panel { position: relative; background: var(--color-paper); border: 1px solid var(--color-border); border-radius: 0.75rem; padding: 2rem; max-width: 480px; width: calc(100% - 2rem); max-height: calc(100vh - 4rem); overflow-y: auto; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15); transform: translateY(8px); transition: transform 0.2s ease; } .about-overlay.is-open .about-panel { transform: translateY(0); } /* About modal prose (rendered markdown) */ .prose-about p { margin-bottom: 1rem; } .prose-about p:last-child { margin-bottom: 0; } .prose-about a { color: var(--color-accent); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: color-mix(in srgb, var(--color-accent) 30%, transparent); transition: text-decoration-color 0.2s; } .prose-about a:hover { text-decoration-color: var(--color-accent); } /* Accessibility */ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } :focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; } .skip-link { position: absolute; left: -9999px; z-index: 100; padding: 0.5rem 1rem; background: var(--color-accent); color: var(--color-paper); font-family: var(--font-mono); font-size: 0.875rem; border-radius: 0 0 0.5rem 0; text-decoration: none; } .skip-link:focus { left: 0; top: 0; }