@font-face { font-family: "Cormorant Garamond"; font-weight: 300; font-style: italic; src: url("/fonts/CormorantGaramond-LightItalic.woff2") format("woff2"); font-display: block; } @font-face { font-family: "Cormorant Garamond"; font-weight: 300; font-style: normal; src: url("/fonts/CormorantGaramond-Light.woff2") format("woff2"); font-display: block; } @font-face { font-family: "Cormorant Garamond"; font-weight: 400; font-style: normal; src: url("/fonts/CormorantGaramond-Regular.woff2") format("woff2"); font-display: block; } @font-face { font-family: "Cormorant Garamond"; font-weight: 400; font-style: italic; src: url("/fonts/CormorantGaramond-RegularItalic.woff2") format("woff2"); font-display: block; } @font-face { font-family: "IBM Plex Mono"; font-weight: 300; font-style: normal; src: url("/fonts/IBMPlexMono-Light.woff2") format("woff2"); font-display: optional; } @font-face { font-family: "IBM Plex Mono"; font-weight: 300; font-style: italic; src: url("/fonts/IBMPlexMono-LightItalic.woff2") format("woff2"); font-display: optional; } @font-face { font-family: "IBM Plex Mono"; font-weight: 400; font-style: normal; src: url("/fonts/IBMPlexMono-Regular.woff2") format("woff2"); font-display: optional; } @font-face { font-family: "Inter Variable"; font-weight: 100 900; font-style: normal; src: url("/fonts/InterVariable.woff2") format("woff2-variations"); font-display: optional; } @font-face { font-family: "Inter"; font-weight: 400; font-style: normal; src: url("/fonts/Inter-Regular.woff2") format("woff2"); font-display: optional; } @font-face { font-family: "PeachScript"; font-weight: 400; font-style: normal; src: url("/fonts/PeachScript-Regular.otf") format("opentype"); font-display: block; } :root { --bg: #0C0A06; --s1: #131109; --s2: #1A1710; --t0: #F0E8D8; --t1: rgba(240, 232, 216, 0.50); --t2: rgba(240, 232, 216, 0.20); --t3: rgba(240, 232, 216, 0.07); --t4: rgba(240, 232, 216, 0.04); --ac: #E8956D; --surface-card: rgba(240, 232, 216, 0.02); --shell-accent-a: color-mix(in srgb, var(--peach-accent) 8%, transparent); --shell-accent-b: color-mix(in srgb, var(--peach-accent) 6%, transparent); --breach: rgba(220, 80, 60, 0.7); --health: rgba(100, 210, 100, 0.75); --copy-shadow: 0 2px 8px rgba(0,0,0,0.55), 0 14px 48px rgba(0,0,0,0.7), 0 0 0 1px rgba(240,232,216,0.04); --font-display: "Cormorant Garamond", "Times New Roman", serif; --font-mono: "IBM Plex Mono", "SFMono-Regular", Menlo, monospace; --font-ui: "Inter Variable", "Inter", system-ui, sans-serif; /* Body-text scale; multiplied into key font-size declarations so users can request small / default / large without breaking dense layouts. XL was deliberately excluded — clips Vault and Health. */ --spring: cubic-bezier(0.16, 1, 0.3, 1); --retreat: cubic-bezier(0.4, 0, 1, 1); --settle: cubic-bezier(0.34, 1.56, 0.64, 1); --peach-bg: var(--bg); --peach-s1: var(--s1); --peach-s2: var(--s2); --peach-t0: var(--t0); --peach-t1: var(--t1); --peach-t2: var(--t2); --peach-t3: var(--t3); --peach-t4: var(--t4); --peach-text: var(--peach-t4); --peach-text-dim: var(--peach-t1); --peach-bg-card: var(--surface-card); --peach-border: var(--peach-t3); --peach-mono: var(--font-mono); --peach-accent: var(--ac); --peach-glow: #F49C702A; /* accent bloom behind buttons/illustrations — set by applyAccent() */ --peach-border-accent: #F49C7024; /* accent-tinted border for active states — set by applyAccent() */ --peach-breach: var(--breach); --peach-health-ok: var(--health); --peach-health-bad: var(--breach); /* Yellow for transient network misses — the dial didn't reach the peer but the alarm will retry. Distinct from breach/red so alarm fatigue doesn't train the user to ignore a real indicator. */ --peach-health-warn: #d8a13a; --peach-sync-ok: #5ebd5e; --peach-curve-arrival: var(--spring); --peach-curve-departure: var(--retreat); --peach-curve-settle: var(--settle); --peach-dur-80: 80ms; --peach-dur-150: 150ms; --peach-dur-600: 600ms; --peach-copy-clear: 1.4s; --peach-ghost-opacity: 0.03; --stack-protect-fg: #FFEEDD; --stack-protect-bg: linear-gradient(155deg, #B85A3A 0%, #6E2818 100%); --stack-vault-fg: #E5EEFA; --stack-vault-bg: linear-gradient(155deg, #2A3A4D 0%, #0F1620 100%); --stack-sync-fg: #E6F2DE; --stack-sync-bg: linear-gradient(155deg, #3A4E3A 0%, #15241A 100%); --stack-appear-fg: #F4E9D2; --stack-appear-bg: linear-gradient(155deg, #5A4A2C 0%, #281D10 100%); --stack-shortcut-fg: #E4E0D6; --stack-shortcut-bg: linear-gradient(155deg, #3A3A45 0%, #1A1A22 100%); --stack-pro-fg: #FFF1DD; --stack-pro-bg: linear-gradient(155deg, #C2884A 0%, #6E3E1A 100%); --stack-feedback-fg: #EEE4F2; --stack-feedback-bg: linear-gradient(155deg, #4A3A4E 0%, #1D1424 100%); --stack-card-radius: 16px; --stack-spring: cubic-bezier(0.18, 0.9, 0.22, 1.02); /* Tell the browser engine which color schemes the UI knows how to render — this gets us correct form-control colors and scrollbar tinting when the user follows the system theme. */ color-scheme: dark light; } .light { /* Warm parchment restoration — pixel-sampled from reference screenshots. Outer bg is hsl(50,16%,93%), card surfaces shift to hsl(35,36-49%,91-92%). The two hue families are intentional — do not normalize them to one hue. */ --bg: #EFEEE9; --s1: #F0E9DF; --s2: #F5EDE2; --t0: #1A1208; --t1: #3D2E18; --t2: #A8A099; --t3: #DDD5CB; --t4: rgba(26, 18, 8, 0.06); --surface-card: #F0E9DF; --shell-accent-a: color-mix(in srgb, var(--peach-accent) 6%, transparent); --shell-accent-b: color-mix(in srgb, var(--peach-accent) 3%, transparent); --copy-shadow: 0 2px 8px rgba(80, 56, 32, 0.10), 0 14px 48px rgba(80, 56, 32, 0.10), 0 0 0 1px rgba(26, 18, 8, 0.05); --peach-ghost-opacity: 0.06; /* Light-only semantic tokens from restoration brief */ --peach-bg-card: #F0E9DF; --peach-text-dim: #9E9890; } /* ─── Text size scaling ──────────────────────────────────────────────── Implemented via `zoom` on html so every existing px-based font-size in popup.css scales proportionally without rewriting individual rules. Capped at 1.08 — large enough to noticeably help, small enough that the dense Vault and Health views don't clip the fixed-size popup surface. The CSS custom property is also exposed so desktop / mobile builds can use a calc() multiplier on layouts that don't fit `zoom` semantics. */ [data-text-size="medium"] { --peach-text-scale: 1; } [data-text-size="large"] { --peach-text-scale: 1.08; } html { background: var(--bg); } html[data-text-size="large"] { zoom: 1.08; } /* ─── Reduced motion ─────────────────────────────────────────────────── User-explicit setting OR OS-level prefers-reduced-motion both collapse transitions and ambient animations to instant. The user-explicit form takes precedence and works even when the OS hasn't been configured. */ [data-motion="reduce"] *, [data-motion="reduce"] *::before, [data-motion="reduce"] *::after { animation-duration: 0.001ms !important; animation-delay: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; transition-delay: 0.001ms !important; scroll-behavior: auto !important; }