:root { --bg: #030815; --ink: #e4eeff; --mute: #7b8fb8; --dim: #3d5180; --cyan: #7fd6ff; --blue: #3d8bff; --line: rgba(110, 160, 255, .13); --card: linear-gradient(160deg, rgba(30, 60, 140, .22), rgba(10, 22, 55, .35)); --mono: 'JetBrains Mono', ui-monospace, monospace; --sans: 'Space Grotesk', system-ui, sans-serif; } * { box-sizing: border-box; margin: 0 } html { background: var(--bg); color: var(--ink); font: 15px/1.5 var(--sans); -webkit-font-smoothing: antialiased } body { min-height: 100vh; background: radial-gradient(ellipse 80% 50% at 50% -10%, rgba(40, 100, 255, .18), transparent 70%), radial-gradient(rgba(120, 170, 255, .07) 1px, transparent 1.5px) 0 0 / 22px 22px; } a { color: inherit; text-decoration: none } button, input, select { font: inherit; color: inherit } .wrap { width: min(1240px, 100% - 40px); margin-inline: auto } .top { display: flex; align-items: center; justify-content: space-between; padding: 22px 0 } .brand { display: flex; align-items: center; gap: 10px; font-weight: 600; letter-spacing: .14em } .orb { width: 14px; height: 14px; border-radius: 50%; background: radial-gradient(circle at 35% 35%, #c9efff, var(--blue) 55%, #0b2a7a); box-shadow: 0 0 14px var(--blue) } nav { display: flex; gap: 22px; color: var(--mute); font-size: 14px } nav a:hover { color: var(--cyan) } .hero { text-align: center; padding-top: 18px } h1 { font-weight: 500; font-size: clamp(28px, 4.4vw, 48px); letter-spacing: -.02em; background: linear-gradient(90deg, #cfe9ff, #7fb6ff 60%, #5d8cff); -webkit-background-clip: text; background-clip: text; color: transparent } .sub { color: var(--mute); margin-top: 6px } .sub b { color: var(--ink); font-weight: 500; font-family: var(--mono); font-size: .92em } .map { position: relative; margin: 34px 0 0; --fy: linear-gradient(transparent, #000 6%, #000 88%, transparent); --fx: linear-gradient(90deg, transparent, #000 3%, #000 97%, transparent); -webkit-mask: var(--fy), var(--fx); -webkit-mask-composite: source-in; mask: var(--fy), var(--fx); mask-composite: intersect; } #map { display: block; width: 100%; aspect-ratio: 360 / 142; cursor: crosshair; touch-action: pan-y } #sun { position: absolute; width: 10px; height: 10px; margin: -5px 0 0 -5px; border-radius: 50%; background: #fff; box-shadow: 0 0 10px 3px #bfe8ff, 0 0 40px 12px rgba(80, 170, 255, .55); pointer-events: none } #sun span { position: absolute; left: 18px; top: 50%; transform: translateY(-50%); font: 500 10px var(--mono); letter-spacing: .12em; text-transform: uppercase; color: #bfe3ff; white-space: nowrap; text-shadow: 0 0 8px #030815 } #sun.r span { left: auto; right: 18px } #sun::after { content: ''; position: absolute; inset: -5px; border-radius: 50%; border: 1px solid rgba(180, 225, 255, .8); animation: ping 2.6s ease-out infinite } @keyframes ping { to { inset: -26px; opacity: 0 } } #tip { position: absolute; transform: translate(14px, -50%); padding: 7px 10px; border-radius: 8px; background: rgba(6, 16, 42, .88); border: 1px solid var(--line); backdrop-filter: blur(8px); font: 12px/1.45 var(--mono); color: var(--mute); white-space: nowrap; pointer-events: none } #tip.l { transform: translate(calc(-100% - 14px), -50%) } #tip b { display: block; color: var(--ink); font-weight: 500 } .now { margin-top: -6px; cursor: copy } .big { font: 300 clamp(30px, 8.4vw, 104px)/1 var(--mono); letter-spacing: -.03em; font-variant-numeric: tabular-nums; color: #e3f3ff; text-shadow: 0 0 22px rgba(80, 160, 255, .55), 0 0 60px rgba(40, 110, 255, .35) } .big i, .uv i, .mv i, dd i { font-style: normal; opacity: .38 } .big i { opacity: 1; color: #2f63d6; text-shadow: none; margin: 0 -.12em } .big-u { margin-top: 12px; font: 500 14px var(--mono); color: var(--cyan); letter-spacing: .2em; text-transform: uppercase } .big-u span { color: var(--dim); letter-spacing: .1em; margin-left: 8px } .units { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 14px; margin-top: 54px } .unit, .card { position: relative; border: 1px solid var(--line); border-radius: 16px; background: var(--card); backdrop-filter: blur(6px) } .unit { display: flex; flex-direction: column; gap: 10px; padding: 18px 18px 16px; text-align: left; cursor: copy; transition: border-color .2s, transform .2s } .unit:hover { border-color: rgba(127, 214, 255, .45); transform: translateY(-2px) } .ul { display: flex; justify-content: space-between; color: var(--mute); font-size: 13px; letter-spacing: .06em; text-transform: uppercase } .ul em { font: 500 12px var(--mono); color: var(--cyan); text-transform: none } .ul b { font-weight: 400; color: var(--dim); margin-right: 10px } .uv { font: 400 clamp(18px, 1.9vw, 26px)/1.1 var(--mono); font-variant-numeric: tabular-nums; letter-spacing: -.02em; white-space: nowrap } .un { font: 12px var(--mono); color: var(--dim) } .bar { display: block; height: 3px; border-radius: 3px; background: rgba(90, 140, 255, .14); overflow: hidden } .bar i { display: block; height: 100%; transform-origin: left; transform: scaleX(0); background: linear-gradient(90deg, #2f6bff, var(--cyan)); box-shadow: 0 0 10px var(--cyan) } .grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; margin: 14px 0 0 } .card { padding: 18px 20px 20px } .wide { grid-column: span 3 } h2 { font: 500 12px var(--sans); letter-spacing: .14em; text-transform: uppercase; color: var(--mute); margin-bottom: 10px } .v { font: 400 18px/1.35 var(--mono); font-variant-numeric: tabular-nums } .m { margin-top: 8px; font-size: 13px; color: var(--mute) } .pips { display: flex; gap: 5px } .pips i { flex: 1; height: 3px; border-radius: 3px; background: rgba(90, 140, 255, .14) } .pips .on { background: #2f6bff } .pips .cur { background: var(--cyan); box-shadow: 0 0 10px var(--cyan) } #miles { list-style: none; padding: 0; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px 26px } #miles li { display: flex; flex-direction: column; gap: 2px; padding: 10px 0 10px 14px; border-left: 2px solid rgba(110, 160, 255, .25) } #miles li:first-child { border-color: var(--cyan) } .mv { font: 15px var(--mono); font-variant-numeric: tabular-nums } .mv em, dd em { font-style: normal; color: var(--cyan) } .mv s { text-decoration: none; color: var(--dim) } .mt { font-size: 13px; color: var(--mute) } .mc { font: 12px var(--mono); color: var(--dim) } .cv { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 30px } .cv label { display: flex; justify-content: space-between; font-size: 13px; color: var(--mute); margin-bottom: 8px } .tz { display: flex; align-items: center; gap: 6px; cursor: pointer } .tz input { accent-color: var(--blue) } .row { display: flex; gap: 8px } .row input, .row select, .row button { height: 40px; padding: 0 12px; border-radius: 10px; border: 1px solid var(--line); background: rgba(4, 12, 32, .7); font: 14px var(--mono); outline: none; color-scheme: dark } .row input { flex: 1; min-width: 0 } .row input:focus, .row select:focus { border-color: rgba(127, 214, 255, .5) } .row button { cursor: pointer; color: var(--cyan) } .row button:hover { border-color: rgba(127, 214, 255, .5) } dl { display: grid; grid-template-columns: auto 1fr; gap: 4px 16px; margin-top: 14px; font: 14px var(--mono); font-variant-numeric: tabular-nums } dt { color: var(--cyan); text-align: right } dd { overflow-wrap: anywhere } .err { color: #ff9db0 } footer { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 34px 0 44px; color: var(--dim); font-size: 13px } .npm { flex-shrink: 0; white-space: nowrap; padding: 8px 14px; border-radius: 10px; border: 1px solid var(--line); background: rgba(4, 12, 32, .6); font: 13px var(--mono); color: var(--cyan); cursor: copy } #toast { position: fixed; left: 50%; bottom: 26px; transform: translateX(-50%); padding: 9px 16px; border-radius: 10px; background: rgba(10, 30, 80, .92); border: 1px solid rgba(127, 214, 255, .35); font: 13px var(--mono); box-shadow: 0 10px 40px rgba(0, 0, 0, .5) } @media (max-width: 960px) { .units { grid-template-columns: repeat(6, minmax(0, 1fr)) } .unit { grid-column: span 2 } .unit:nth-child(n+4) { grid-column: span 3 } .grid { grid-template-columns: repeat(2, minmax(0, 1fr)) } .wide { grid-column: span 2 } #miles { grid-template-columns: repeat(2, minmax(0, 1fr)) } } @media (max-width: 620px) { .units { grid-template-columns: repeat(2, minmax(0, 1fr)); margin-top: 36px } .unit, .unit:nth-child(n+4) { grid-column: auto } .unit:last-child { grid-column: span 2 } .grid, .cv, #miles { grid-template-columns: minmax(0, 1fr) } .wide { grid-column: auto } .v { font-size: 16px } .map { margin: 22px -20px 0 } footer { flex-direction: column; align-items: flex-start } } @media (prefers-reduced-motion: reduce) { #sun::after { animation: none } .unit { transition: none } }