/* ipxreader.app. The palette is the iPodderX logo's: the radio's navy body, the sky of its screen, the blue of its tuning scale, and the orange needle, which is the needle alone. The typeface is the reader's own, Inter, the same file (web/InterVariable.woff2). */ @font-face{font-family:Inter;src:url(/fonts/inter.woff2) format("woff2");font-weight:100 900;font-display:swap} :root{ --navy:#0c2238; /* the radio */ --ink:#16304a; /* body text, a step off the navy */ --muted:#46607a; --sky:#dff0fb; /* its screen */ --page:#f1f8fd; --scale:#2f6aa0; /* the tuning scale, and links */ --tick:#8fc2ea; /* the scale on the dark dial */ --needle:#ff5500; --rule:#c6d9ea; } *{box-sizing:border-box} html{-webkit-text-size-adjust:100%;scroll-behavior:smooth} body{margin:0;background:var(--page);color:var(--ink);font:400 1.0625rem/1.6 Inter,system-ui,sans-serif} a{color:var(--scale);text-underline-offset:.18em} a:focus-visible,.btn:focus-visible{outline:3px solid var(--scale);outline-offset:3px;border-radius:6px} main,.bar,footer{max-width:72rem;margin:0 auto;padding-inline:1.5rem} .bar{display:flex;align-items:center;justify-content:space-between;padding-block:1.25rem} .home{display:flex;align-items:center;gap:.6rem;color:var(--navy);text-decoration:none;font-weight:800;font-size:1.25rem} .home img{border-radius:9px;display:block} .bar nav{display:flex;gap:1.5rem} .bar nav a{color:var(--navy);text-decoration:none;font-weight:600} .bar nav a:hover{text-decoration:underline} .bar nav{align-items:center} .src img{display:block} .hero{padding-block:3rem 2.5rem;max-width:46rem} h1{margin:0;color:var(--navy);font-weight:900;font-size:clamp(6.5rem,24vw,15rem);line-height:.82;letter-spacing:-.065em} .intro{margin:1.75rem 0 0;max-width:38rem;color:var(--muted);font-size:1.125rem} .acts{display:flex;flex-wrap:wrap;gap:.75rem;margin:2rem 0 0} .btn{display:inline-block;padding:.8rem 1.35rem;border:2px solid var(--navy);border-radius:999px;color:var(--navy);text-decoration:none;font-weight:700} .btn:hover{background:var(--sky)} .btn.primary{background:var(--navy);color:#fff} .btn.primary:hover{background:#1a3a5c} /* The dial: a frequency row, minor and major ticks, stations on two staggered rows as a printed dial has them, and the needle, which points down at the scale and lights the station it stops on rather than crossing its name. --at is where it stops: the tuned station's middle. */ .dial{margin:1rem 0 0} .scale{background:var(--navy);border-radius:1.25rem;overflow:hidden} .track{position:relative;--at:45.8%} .freq{position:relative;list-style:none;margin:0;padding:1.1rem 4% 0;display:flex;justify-content:space-between;color:var(--tick);font-weight:600;font-size:.95rem;font-variant-numeric:tabular-nums} .freq li{width:0;display:flex;justify-content:center} /* each number centred on its tick */ .freq::after{content:"";position:absolute;left:4%;right:4%;top:2.6rem;height:1.6rem; background: repeating-linear-gradient(90deg,var(--tick) 0 2px,transparent 2px 20%) 0 0/100% 100%, repeating-linear-gradient(90deg,rgba(143,194,234,.55) 0 1px,transparent 1px 2%) 0 100%/100% 45%; background-repeat:no-repeat} .stations{list-style:none;margin:2.6rem 0 0;padding:0 1% 1.6rem;display:grid;grid-template-columns:repeat(12,minmax(0,1fr));align-items:start; color:#cfe3f4;font-weight:550;font-size:.84rem;line-height:1.2;letter-spacing:-.01em;text-align:center} .stations li{padding-inline:.15rem} .stations li:nth-child(even){margin-top:1.7rem} .needle{position:absolute;top:2.35rem;height:2.7rem;left:var(--at);width:3px;margin-left:-1.5px;background:var(--needle);border-radius:2px; box-shadow:0 0 0 1px rgba(12,34,56,.6);animation:tune 2.4s cubic-bezier(.3,.7,.3,1) .4s both} .stations .tuned{text-decoration:underline 2px transparent;text-underline-offset:.3em;animation:lit .5s ease-out 2.6s both} @keyframes tune{0%{left:3%}68%{left:calc(var(--at) + 7%)}86%{left:calc(var(--at) - 1.4%)}100%{left:var(--at)}} @keyframes lit{from{color:#cfe3f4}to{color:#fff;font-weight:800;text-decoration-color:var(--needle)}} @media (prefers-reduced-motion:reduce){.needle,.stations .tuned{animation-duration:0s;animation-delay:0s}} h2{margin:0 0 1.5rem;color:var(--navy);font-weight:800;font-size:clamp(1.75rem,4vw,2.4rem);line-height:1.1;letter-spacing:-.02em} .does,.then{padding-block:4rem 0} /* Each feature on one row: what it does on the left, beside the part of the app that shows it, framed in the dial's navy at no more than its own size. */ .feature{display:grid;grid-template-columns:minmax(0,22rem) minmax(0,1fr);gap:clamp(1.5rem,5vw,4rem);align-items:center;padding-block:2.5rem} .feature h3{margin:0 0 .5rem;color:var(--navy);font-weight:750;font-size:1.35rem;line-height:1.25} .feature p{margin:0;max-width:34rem} .frame{margin:0;justify-self:start;max-width:100%;padding:clamp(.6rem,1.6vw,1.1rem);background:var(--navy);border-radius:1.1rem} .frame img{display:block;max-width:100%;height:auto;border-radius:.55rem} /* DeadAir: the track is the episode's full length; talk keeps its width, each silence lights in the needle's orange and shrinks to a pause, and the end comes in from the right. */ .frame.deadair{justify-self:stretch;width:100%} .wave{display:flex;align-items:center;height:4.5rem;border-radius:.55rem;background:rgba(143,194,234,.08)} .talk{height:100%;background:url(/wave.svg) 0 50%/auto 100% repeat-x} .talk:first-child{border-radius:.55rem 0 0 .55rem} .t1{flex:0 0 14%}.t2{flex:0 0 19%}.t3{flex:0 0 9%}.t4{flex:0 0 16%}.t5{flex:0 0 12%}.t6{flex:0 0 10%} .hush{flex:0 0 4%;align-self:stretch;background:linear-gradient(var(--tick),var(--tick)) 50%/100% 2px no-repeat;border-radius:.3rem;animation:hush 7s ease-in-out infinite} @keyframes hush{ 0%,14%{flex-basis:4%;background-color:transparent} 24%,30%{flex-basis:4%;background-color:rgba(255,85,0,.35)} 48%,86%{flex-basis:.8%;background-color:rgba(255,85,0,.35)} 100%{flex-basis:4%;background-color:transparent}} @media (prefers-reduced-motion:reduce){.hush{animation:none;flex-basis:.8%;background-color:rgba(255,85,0,.35)}} .also{margin:2rem 0 0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2.25rem 3.5rem} .also dt{color:var(--navy);font-weight:750;font-size:1.2rem;line-height:1.25} .also dd{margin:.45rem 0 0;max-width:34rem} /* Docs: one column of prose at a reading width; code and tables scroll inside themselves at phone width rather than the page scrolling sideways. */ .doc{max-width:50rem} .doc .title{font-size:clamp(3.5rem,12vw,6rem);line-height:.9;letter-spacing:-.05em;margin:2rem 0 0} .lede{margin:1.5rem 0 0;color:var(--muted);font-size:1.125rem} .toc{margin:2rem 0 0;padding:1rem 1.25rem;background:var(--sky);border-radius:.9rem} .toc ol{margin:0;padding-left:1.25rem} .toc li{padding-block:.15rem} .doc section{padding-block:3.5rem 0} .doc h2{scroll-margin-top:1rem} .doc h3{margin:2.25rem 0 .5rem;color:var(--navy);font-weight:750;font-size:1.25rem;line-height:1.25} .doc p{margin:.75rem 0} .doc code{font:500 .9em/1.5 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace} .doc :not(pre)>code{padding:.08em .3em;background:var(--sky);border-radius:.3em;overflow-wrap:anywhere} .doc pre{margin:1rem 0;padding:1rem 1.15rem;background:var(--navy);color:#e6f1fa;border-radius:.8rem;overflow-x:auto} .doc pre code{font-size:.85rem} .scroll{margin:1rem 0;overflow-x:auto} .doc table{width:100%;border-collapse:collapse;font-size:.95rem} .doc th,.doc td{padding:.55rem .75rem .55rem 0;border-bottom:1px solid var(--rule);text-align:left;vertical-align:top} .doc th{color:var(--navy);font-weight:700} .doc td:first-child code{white-space:nowrap} .bar nav a[aria-current]{text-decoration:underline;text-decoration-color:var(--needle);text-decoration-thickness:2px} footer{margin-top:5rem;padding-block:1.75rem 3rem;border-top:1px solid var(--rule);color:var(--muted);font-size:.95rem} footer p{margin:0} @media (max-width:640px){ main,.bar,footer{padding-inline:1rem} .bar nav{gap:1rem} .hero{padding-block:1.5rem 2rem} .feature{grid-template-columns:minmax(0,1fr);gap:1.25rem;padding-block:1.75rem} /* A wide crop at this width is too small to read: its left part, larger. */ .frame img.cut{width:100%;aspect-ratio:4/3;object-fit:cover;object-position:0 0} .frame img.cut.player{aspect-ratio:2.4/1} .frame img.cut.half{aspect-ratio:2.6/1} /* the directory's left column */ .also{grid-template-columns:minmax(0,1fr);gap:1.75rem} .dial{margin-inline:-1rem} .scale{border-radius:0} /* Six stations, the tuned one third, rather than twelve too narrow to read. */ .track{--at:41.7%} .stations{grid-template-columns:repeat(6,minmax(0,1fr));padding-inline:2%} .stations li:nth-child(-n+3),.stations li:nth-child(n+10){display:none} .stations li:nth-child(even){margin-top:0} .stations li:nth-child(odd){margin-top:1.7rem} }