/* wayBetter site: shared design system (Night Ink, same tokens as the desktop shell). */ :root { --ground: #07080c; --ground-2: #05060a; --chrome: #0d1017; --field: #11141c; --raised: #151924; --line: #1c2130; --line-strong: #2a3044; --text: #eef0f7; --text-2: #c3c7d4; --muted: #8e95ab; --faint: #626981; --accent: #1d9bf0; --b1: #4f6bff; --b2: #22d3ee; --b3: #a855f7; --ok: #3ddc97; --bad: #f0506e; --mark: linear-gradient(128deg, #7cc8ff 0%, #1d9bf0 42%, #7856ff 100%); --brush: linear-gradient(90deg, #4f6bff, #22d3ee 55%, #a855f7); --sans: 'Geist', system-ui, -apple-system, 'Segoe UI', sans-serif; --mono: 'Geist Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; --serif: 'Instrument Serif', 'Iowan Old Style', Georgia, serif; --ease: cubic-bezier(0.16, 1, 0.3, 1); --ease-io: cubic-bezier(0.65, 0, 0.35, 1); --gutter: 28px; } * { box-sizing: border-box; } html { color-scheme: dark; scroll-behavior: smooth; scroll-padding-top: 84px; } body { margin: 0; background: var(--ground); color: var(--text); font: 400 16px/1.55 var(--sans); -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; overflow-x: clip; } a { color: inherit; } img, svg, video { display: block; max-width: 100%; } code, kbd, pre { font-family: var(--mono); } ::selection { background: rgba(79, 107, 255, 0.45); color: #fff; } :focus-visible { outline: 2px solid var(--b2); outline-offset: 3px; border-radius: 6px; } /* Off screen until focused: moved up, not sideways, so neither writing direction gets a scrollbar from it. */ .skip { position: absolute; inset-inline-start: 16px; top: 12px; z-index: 60; padding: 8px 14px; background: var(--field); border-radius: 8px; color: var(--text); transform: translateY(-300%); } .skip:focus { transform: none; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; } .wrap { width: 100%; max-width: 1200px; margin: 0 auto; padding: 0 var(--gutter); } .wrap-narrow { max-width: 900px; } em { font-family: var(--serif); font-style: italic; font-weight: 400; letter-spacing: -0.005em; } .grad { background: var(--mark); -webkit-background-clip: text; background-clip: text; color: transparent; padding-right: 0.06em; } .brush-text { background: var(--brush); -webkit-background-clip: text; background-clip: text; color: transparent; padding-right: 0.06em; } /* The wB mark: a brush-painted w whose last stroke dries into bristles that lean into a heavy B, in the brush gradient (public/brand/wb-mark*.svg). Always an , so it stays crisp at every size. */ .wb { display: block; width: auto; height: 1em; flex: 0 0 auto; } /* (FOSS) tag */ .foss { display: inline-flex; align-items: center; font: 600 0.78em/1 var(--mono); letter-spacing: 0.02em; color: var(--ok); } /* Header */ .top { position: sticky; top: 0; z-index: 40; background: color-mix(in srgb, var(--ground) 78%, transparent); backdrop-filter: blur(14px) saturate(1.3); -webkit-backdrop-filter: blur(14px) saturate(1.3); border-bottom: 1px solid color-mix(in srgb, var(--line) 70%, transparent); } .top-progress { position: absolute; inset-inline-start: 0; inset-inline-end: 0; bottom: -1px; height: 2px; background: var(--brush); transform-origin: 0 50%; transform: scaleX(var(--p, 0)); opacity: 0.9; pointer-events: none; } .top-row { display: flex; align-items: center; justify-content: space-between; height: 64px; gap: 16px; } .mark { display: inline-flex; align-items: center; gap: 10px; text-decoration: none; flex: 0 0 auto; } .mark .wb { height: 24px; transition: filter 0.25s var(--ease), transform 0.35s var(--ease); } .mark:hover .wb { filter: brightness(1.15) saturate(1.1); transform: rotate(-3deg) scale(1.04); } .mark-name { font-weight: 650; font-size: 16px; letter-spacing: -0.02em; white-space: nowrap; } .mark-sub { color: var(--muted); font-weight: 500; } .mark-app { width: 30px; height: 30px; border-radius: 8px; } .top-nav { display: flex; align-items: center; gap: 22px; font-size: 14px; color: var(--muted); } .top-nav a { text-decoration: none; transition: color 0.2s var(--ease); white-space: nowrap; } .top-nav a:hover { color: var(--text); } .top-nav .top-cta { color: var(--text); padding: 7px 14px; border: 1px solid var(--line-strong); border-radius: 999px; background: var(--field); font-weight: 550; transition: border-color 0.2s var(--ease), background 0.2s var(--ease); } .top-nav .top-cta:hover { border-color: rgba(120, 86, 255, 0.55); background: var(--raised); } .src-link { display: inline-flex; align-items: center; gap: 7px; } .src-logo { width: 16px; height: 16px; flex: 0 0 auto; } /* Buttons */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 9px; height: 48px; padding: 0 20px; border-radius: 12px; border: 0; font: 600 15px/1 var(--sans); text-decoration: none; letter-spacing: -0.01em; cursor: pointer; white-space: nowrap; transition: transform 0.2s var(--ease), background 0.2s var(--ease), border-color 0.2s var(--ease), box-shadow 0.2s var(--ease); } .btn svg.arrow { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; transition: transform 0.2s var(--ease); } .btn:hover svg.arrow { transform: translateX(3px); } .btn .icon { width: 16px; height: 16px; flex: 0 0 auto; } .btn-solid { color: #06121f; background: linear-gradient(180deg, #f4f6fb, #d9deea); box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset, 0 10px 30px -12px rgba(124, 200, 255, 0.55); } .btn-solid:hover { transform: translateY(-1px); box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5) inset, 0 16px 36px -12px rgba(120, 86, 255, 0.6); } .btn-brush { color: #05070d; background: var(--brush); box-shadow: 0 12px 34px -12px rgba(79, 107, 255, 0.7); } .btn-brush:hover { transform: translateY(-1px); box-shadow: 0 18px 40px -12px rgba(34, 211, 238, 0.6); } .btn-ghost { color: var(--text); border: 1px solid var(--line-strong); background: color-mix(in srgb, var(--field) 70%, transparent); } .btn-ghost:hover { border-color: #3a4260; background: var(--raised); } .btn-sm { height: 38px; padding: 0 15px; font-size: 14px; border-radius: 10px; } .btn-lg { height: 56px; padding: 0 26px; font-size: 16px; border-radius: 14px; } .ctas { display: flex; flex-wrap: wrap; gap: 12px; } /* Type */ h1, h2, h3 { text-wrap: balance; } .kicker { display: inline-flex; align-items: center; gap: 10px; margin: 0 0 22px; font: 500 12px/1.3 var(--mono); letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); } .kicker-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--b2); box-shadow: 0 0 0 4px rgba(34, 211, 238, 0.14); flex: 0 0 auto; } .chapter { display: flex; align-items: center; gap: 14px; margin: 0 0 22px; font: 500 12px/1 var(--mono); letter-spacing: 0.08em; text-transform: uppercase; color: var(--faint); } .chapter b { font-weight: 500; color: var(--text-2); } .chapter::after { content: ''; flex: 0 1 120px; height: 1px; background: linear-gradient(90deg, var(--line-strong), transparent); } h2.display { margin: 0; font-size: clamp(38px, 6vw, 84px); line-height: 0.98; letter-spacing: -0.045em; font-weight: 700; } h2.display em { font-size: 1.06em; letter-spacing: -0.02em; } h2.title { margin: 0; font-size: clamp(32px, 4.4vw, 56px); line-height: 1.02; letter-spacing: -0.038em; font-weight: 680; } h2.title em, h2.display em { color: var(--text-2); } h2 em.grad, h2.display em.grad { color: transparent; } .lead { margin: 22px 0 0; max-width: 38em; font-size: clamp(16.5px, 1.5vw, 19px); line-height: 1.6; color: var(--text-2); text-wrap: pretty; } .sec-head { max-width: 780px; margin-bottom: 56px; } .sec-head.center { margin-inline-start: auto; margin-inline-end: auto; text-align: center; } .sec-head.center .chapter { justify-content: center; } .sec-head.center .chapter::before { content: ''; flex: 0 1 120px; height: 1px; background: linear-gradient(270deg, var(--line-strong), transparent); } .sec-head.center .lead { margin-inline-start: auto; margin-inline-end: auto; } .section { position: relative; padding: 128px 0; border-top: 1px solid color-mix(in srgb, var(--line) 60%, transparent); } .section-tight { padding: 96px 0; } kbd { display: inline-block; min-width: 1.6em; padding: 2px 6px; border: 1px solid var(--line-strong); border-bottom-width: 2px; border-radius: 6px; background: var(--field); font: 500 0.82em/1.3 var(--mono); color: var(--text); text-align: center; } /* Glow backdrops */ .glow { position: absolute; pointer-events: none; border-radius: 50%; filter: blur(40px); opacity: 0.55; } /* Pills / tags */ .tag { display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 10px; border-radius: 999px; border: 1px solid var(--line-strong); background: var(--field); font: 500 11.5px/1 var(--mono); letter-spacing: 0.02em; color: var(--text-2); white-space: nowrap; } .tag-ok { color: var(--ok); border-color: rgba(61, 220, 151, 0.35); background: rgba(61, 220, 151, 0.07); } .tag-soft { color: var(--muted); } /* Code blocks */ .code { position: relative; min-width: 0; border: 1px solid var(--line-strong); border-radius: 16px; background: linear-gradient(180deg, #0b0d14, #080a0f); box-shadow: 0 30px 60px -30px rgba(0, 0, 0, 0.8); overflow: hidden; } .code-bar { display: flex; align-items: center; gap: 10px; height: 40px; padding-block: 0; padding-inline: 14px 8px; border-bottom: 1px solid var(--line); font: 500 12px/1 var(--mono); color: var(--muted); } .code-bar .dots { display: flex; gap: 6px; } .code-bar .dots i { width: 9px; height: 9px; border-radius: 50%; background: #262c3e; } .code-bar .file { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .code pre { margin: 0; padding: 18px 20px 20px; overflow-x: auto; font: 400 13px/1.7 var(--mono); color: #cdd3e3; tab-size: 2; } .code pre::-webkit-scrollbar { height: 8px; } .code pre::-webkit-scrollbar-thumb { background: #232839; border-radius: 8px; } .tk-c { color: #5d6581; font-style: italic; } .tk-k { color: #c792ea; } .tk-s { color: #7fdbca; } .tk-n { color: #f78c6c; } .tk-p { color: #82aaff; } .tk-f { color: #ffcb6b; } .tk-t { color: #eef0f7; } .copy-btn { flex: 0 0 auto; height: 28px; padding: 0 11px; border: 1px solid var(--line-strong); border-radius: 8px; background: var(--raised); color: var(--text); font: 600 12px/1 var(--sans); cursor: pointer; transition: border-color 0.2s var(--ease), background 0.2s var(--ease); } .copy-btn:hover { border-color: #3a4260; } .copy-btn.is-done { color: var(--ok); border-color: rgba(61, 220, 151, 0.45); } /* Terminal: the big npm i waybetter */ .term { position: relative; border-radius: 22px; padding: 1px; background: linear-gradient(140deg, rgba(79, 107, 255, 0.8), rgba(34, 211, 238, 0.4) 45%, rgba(168, 85, 247, 0.75)); box-shadow: 0 50px 120px -40px rgba(79, 107, 255, 0.55), 0 30px 60px -30px rgba(0, 0, 0, 0.9); } .term-in { border-radius: 21px; background: linear-gradient(180deg, #0c0f17, #07080c); overflow: hidden; } .term .code-bar { height: 44px; } .term-line { display: flex; align-items: center; gap: 16px; padding: clamp(22px, 4vw, 44px) clamp(18px, 4vw, 44px); } .term-cmd { flex: 1; min-width: 0; margin: 0; font: 500 clamp(22px, 5.2vw, 64px)/1.1 var(--mono); letter-spacing: -0.03em; color: var(--text); white-space: nowrap; overflow: hidden; } .term-cmd .ps { color: var(--faint); margin-inline-end: 0.45em; user-select: none; } .term-cmd .pkg { background: var(--brush); -webkit-background-clip: text; background-clip: text; color: transparent; } .caret { display: inline-block; width: 0.5em; height: 1em; margin-inline-start: 0.12em; vertical-align: -0.12em; background: var(--b2); animation: blink 1.1s steps(1) infinite; } @keyframes blink { 50% { opacity: 0; } } .term .copy-btn { height: 40px; padding: 0 16px; font-size: 14px; border-radius: 10px; } .term-foot { display: flex; flex-wrap: wrap; gap: 8px 18px; padding: 14px clamp(18px, 4vw, 44px) 18px; border-top: 1px solid var(--line); font: 500 12.5px/1.4 var(--mono); color: var(--muted); } .term-foot span::before { content: '✓'; color: var(--ok); margin-inline-end: 7px; } /* Theme preview (a small X-like feed painted from real theme palettes) */ .tp { --page: #05060a; --bg: #07080c; --surface: #0d1017; --elevated: #151924; --border: #1c2130; --text: #eef0f7; --muted: #8e95ab; --accent: #5b8cff; --inverse: #eef0f7; --on-inverse: #07080c; --radius: 12px; --btn: 10px; --avatar: 30%; --font: var(--sans); --tweet: var(--font); --canvas: var(--page); position: relative; border-radius: 18px; border: 1px solid var(--line-strong); background: var(--canvas); padding: clamp(14px, 3vw, 28px); overflow: hidden; transition: background 0.5s var(--ease); color: var(--text); font-family: var(--font); } .tp * { transition: background-color 0.45s var(--ease), color 0.45s var(--ease), border-color 0.45s var(--ease), border-radius 0.45s var(--ease); } .tp-col { max-width: 460px; margin: 0 auto; background: var(--bg); border: 1px solid var(--border); border-radius: min(var(--radius), 18px); overflow: hidden; box-shadow: 0 24px 60px -30px rgba(0, 0, 0, 0.7); } .tp-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-bottom: 1px solid var(--border); font-weight: 700; font-size: 15px; } .tp-tabs { display: flex; font-size: 13px; color: var(--muted); border-bottom: 1px solid var(--border); } .tp-tabs span { flex: 1; text-align: center; padding: 10px 0; } .tp-tabs span.on { color: var(--text); font-weight: 700; box-shadow: inset 0 -3px 0 var(--accent); } .tp-post { display: grid; grid-template-columns: 38px minmax(0, 1fr); gap: 10px; padding: 12px 16px; border-bottom: 1px solid var(--border); } .tp-post:last-child { border-bottom: 0; } .tp-av { width: 38px; height: 38px; border-radius: var(--avatar); background: linear-gradient(135deg, var(--accent), var(--elevated)); } .tp-meta { font-size: 13px; color: var(--muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .tp-meta b { color: var(--text); font-weight: 700; margin-inline-end: 4px; } .tp-text { margin: 3px 0 8px; font: 400 14px/1.45 var(--tweet); color: var(--text); } .tp-text a { color: var(--accent); text-decoration: none; } .tp-card { border: 1px solid var(--border); border-radius: min(var(--radius), 16px); background: var(--surface); height: 64px; margin-bottom: 8px; } .tp-acts { display: flex; gap: 22px; font-size: 12px; color: var(--muted); } .tp-acts .liked { color: #f91880; } .tp-btn { display: inline-flex; align-items: center; height: 30px; padding: 0 14px; border-radius: var(--btn); background: var(--inverse); color: var(--on-inverse); font-size: 13px; font-weight: 700; } .tp-name { position: absolute; inset-inline-start: clamp(14px, 3vw, 28px); bottom: clamp(12px, 2.4vw, 22px); display: inline-flex; align-items: center; gap: 8px; height: 30px; padding: 0 12px; border-radius: 999px; background: rgba(7, 8, 12, 0.78); border: 1px solid rgba(255, 255, 255, 0.12); backdrop-filter: blur(8px); font: 500 12.5px/1 var(--mono); color: #eef0f7; } .tp-name i { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); } .tp-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; } .tp-chip { display: inline-flex; align-items: center; gap: 8px; height: 32px; padding-block: 0; padding-inline: 6px 12px; border-radius: 999px; border: 1px solid var(--line-strong); background: var(--field); color: var(--text-2); font: 500 12.5px/1 var(--sans); cursor: pointer; transition: border-color 0.2s var(--ease), background 0.2s var(--ease), color 0.2s var(--ease); } .tp-chip:hover { border-color: #3a4260; color: var(--text); } .tp-chip[aria-pressed='true'] { color: var(--text); border-color: transparent; background: linear-gradient(var(--raised), var(--raised)) padding-box, var(--brush) border-box; } .sw { display: inline-flex; width: 20px; height: 20px; border-radius: 50%; overflow: hidden; border: 1px solid rgba(255, 255, 255, 0.14); flex: 0 0 auto; } .sw i { flex: 1; } /* Next apps */ .next-grid { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 14px; } .next-tile { --brand: #fff; position: relative; display: flex; flex-direction: column; gap: 14px; min-height: 250px; padding: 22px; border-radius: 20px; border: 1px solid var(--line); background: linear-gradient(180deg, var(--chrome), var(--ground)); overflow: hidden; isolation: isolate; transition: transform 0.35s var(--ease), border-color 0.35s var(--ease); } .next-tile::before { content: ''; position: absolute; inset: auto -30% -55% -30%; height: 80%; background: radial-gradient(closest-side, color-mix(in srgb, var(--brand) 38%, transparent), transparent); opacity: 0.35; z-index: -1; transition: opacity 0.35s var(--ease), transform 0.35s var(--ease); } .next-tile:hover { transform: translateY(-4px); border-color: color-mix(in srgb, var(--brand) 45%, var(--line)); } .next-tile:hover::before { opacity: 0.8; transform: translateY(-8%); } .next-logo { width: 44px; height: 44px; color: var(--brand); filter: drop-shadow(0 8px 20px color-mix(in srgb, var(--brand) 40%, transparent)); } .next-tile h3 { margin: auto 0 0; font-size: 19px; letter-spacing: -0.02em; font-weight: 650; line-height: 1.2; } .next-tile h3 span { display: block; font: 500 12px/1.4 var(--mono); color: var(--muted); letter-spacing: 0; margin-bottom: 4px; } .next-tile p { margin: 0; font-size: 13.5px; color: var(--muted); line-height: 1.5; } .next-tile .tag { position: absolute; top: 18px; inset-inline-end: 18px; } .next-you { border-style: dashed; border-color: #33394f; background: transparent; justify-content: flex-start; } .next-you .plus { display: grid; place-items: center; width: 44px; height: 44px; border-radius: 12px; border: 1px dashed #3a4260; font: 300 28px/1 var(--sans); color: var(--text); } .next-you h3 { color: var(--text); } .next-you code { font-size: 12.5px; color: var(--b2); } .next-cta { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 24px; margin-top: 28px; padding: 26px 28px; border-radius: 22px; border: 1px solid transparent; background: radial-gradient(60% 120% at 0% 0%, rgba(79, 107, 255, 0.18), transparent 70%) padding-box, linear-gradient(180deg, #10131c, #0a0c12) padding-box, var(--brush) border-box; } .next-cta h3 { margin: 0; font-size: clamp(24px, 3vw, 34px); letter-spacing: -0.03em; font-weight: 700; line-height: 1.1; } .next-cta p { margin: 8px 0 0; color: var(--text-2); max-width: 40em; } .next-cta .ctas { justify-content: flex-end; } .inline-cmd { display: inline-flex; align-items: center; gap: 10px; height: 48px; padding-block: 0; padding-inline: 16px 6px; border: 1px solid var(--line-strong); border-radius: 12px; background: var(--ground); font: 500 15px/1 var(--mono); color: var(--text); white-space: nowrap; } .inline-cmd .ps { color: var(--faint); } .tm-note { margin: 18px 0 0; font-size: 12.5px; color: var(--faint); max-width: 60em; } /* FOSS manifesto */ .foss-sec { overflow: hidden; } .foss-giant { margin: 0 0 12px; font: 800 clamp(84px, 21vw, 300px)/0.85 var(--sans); letter-spacing: -0.07em; color: transparent; -webkit-text-stroke: 1.5px rgba(238, 240, 247, 0.22); white-space: nowrap; user-select: none; } .foss-giant span { background: var(--brush); -webkit-background-clip: text; background-clip: text; -webkit-text-stroke: 0; } .manifesto { list-style: none; margin: 40px 0 0; padding: 0; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border-top: 1px solid var(--line); } .manifesto li { padding-block: 28px 8px; padding-inline: 0 24px; } .manifesto li + li { padding-inline-start: 24px; border-inline-start: 1px solid var(--line); } .manifesto .n { font: 400 40px/1 var(--serif); font-style: italic; color: var(--faint); } .manifesto h3 { margin: 18px 0 8px; font-size: 22px; letter-spacing: -0.025em; font-weight: 680; } .manifesto p { margin: 0; color: var(--muted); font-size: 15px; } .foss-links { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 44px; } /* Stat ribbon */ .stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border: 1px solid var(--line); border-radius: 20px; background: color-mix(in srgb, var(--chrome) 70%, transparent); overflow: hidden; } .stat { padding: 22px 24px; } .stat + .stat { border-inline-start: 1px solid var(--line); } .stat b { display: block; font: 700 clamp(34px, 4vw, 52px)/1 var(--sans); letter-spacing: -0.05em; font-variant-numeric: tabular-nums; } .stat span { display: block; margin-top: 8px; font-size: 13.5px; color: var(--muted); } /* Footer */ .foot { border-top: 1px solid var(--line); padding: 36px 0 48px; font-size: 14px; color: var(--muted); } .foot-row { display: flex; align-items: center; justify-content: space-between; gap: 20px; flex-wrap: wrap; } .mark-sm .wb { height: 20px; } .mark-sm .mark-name { font-size: 15px; color: var(--text); } .foot-legal { margin: 0; flex: 1 1 22rem; } .foot-legal a, .foot-nav a { text-decoration: none; color: var(--text-2); } .foot-legal a:hover, .foot-nav a:hover { color: var(--text); } .foot-nav { display: flex; flex-wrap: wrap; gap: 8px 20px; } /* Reveal on scroll (only when JS is running; content stays visible without it) */ .js [data-reveal] { opacity: 0; translate: 0 22px; filter: blur(6px); transition: opacity 0.9s var(--ease), translate 0.9s var(--ease), filter 0.9s var(--ease); transition-delay: calc(var(--d, 0) * 80ms); } .js [data-reveal].is-in { opacity: 1; translate: 0 0; filter: none; } /* Responsive */ @media (max-width: 1080px) { .next-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } .manifesto { grid-template-columns: repeat(2, minmax(0, 1fr)); } .manifesto li:nth-child(3) { padding-inline-start: 0; border-inline-start: 0; } .manifesto li:nth-child(n + 3) { border-top: 1px solid var(--line); margin-top: 20px; } } @media (max-width: 860px) { .top-nav a:not(.top-cta):not(.keep) { display: none; } .next-cta { grid-template-columns: minmax(0, 1fr); } .next-cta .ctas { justify-content: flex-start; } .stats { grid-template-columns: repeat(2, minmax(0, 1fr)); } .stat:nth-child(3) { border-inline-start: 0; } .stat:nth-child(n + 3) { border-top: 1px solid var(--line); } } /* Header links that stay on small screens (.keep) give way in two steps on phones (.keep-md, .keep-sm). */ @media (max-width: 520px) { .top-nav a.keep-md, .top-cta .cta-more { display: none; } } @media (max-width: 374px) { .top-nav a.keep-sm { display: none; } .top-row { gap: 10px; } } @media (max-width: 640px) { :root { --gutter: 16px; } .section { padding: 84px 0; } .section-tight { padding: 64px 0; } .sec-head { margin-bottom: 38px; } .top-nav { gap: 14px; } .top-nav .top-cta { font-size: 13px; padding: 6px 12px; } .next-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } .next-tile { min-height: 200px; padding: 16px; gap: 10px; } .next-tile .tag { top: 14px; inset-inline-end: 14px; } .next-logo { width: 36px; height: 36px; } .next-tile h3 { font-size: 16px; } .next-tile p { font-size: 12.5px; } .next-you { grid-column: 1 / -1; min-height: 0; } .next-cta { padding: 20px; } .inline-cmd { font-size: 14px; } .manifesto { grid-template-columns: minmax(0, 1fr); } .manifesto li, .manifesto li + li { padding: 22px 0 4px; border-inline-start: 0; } .manifesto li + li { border-top: 1px solid var(--line); margin-top: 12px; } .stat { padding: 18px; } .term-line { flex-wrap: wrap; } /* A longer "Copy" goes under the command instead of cutting it; the window dots give their room to the file name. */ .term-cmd { flex: 1 0 auto; max-width: 100%; } .code-bar .dots { display: none; } .foot-row { flex-direction: column; align-items: flex-start; } .code pre { font-size: 12px; padding: 14px 14px 16px; } .btn { height: 46px; padding: 0 18px; } .btn-lg { height: 52px; } } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { animation: none !important; transition: none !important; } .js [data-reveal] { opacity: 1; translate: none; filter: none; } .caret { opacity: 1; } } /* Fixes after review */ .inline-cmd .copy-btn { display: inline-flex; align-items: center; height: 32px; } .next-tile h3 { margin-top: 26px; } .next-tile .next-logo { flex: 0 0 auto; } .tp { height: 400px; } @media (max-width: 640px) { .tp { height: 372px; } .next-tile h3 { margin-top: 14px; } } /* ---- Languages (LANGUAGES in site.config.ts; apps/web/locales, store-pages.ts) ---------------- */ /* The language menu, in the header and the footer: plain links, one per language, in its own name. */ .top-nav { margin-inline-start: auto; } .lang { position: relative; flex: 0 0 auto; } .lang > summary { list-style: none; display: inline-flex; align-items: center; gap: 6px; height: 34px; padding: 0 11px 0 9px; border: 1px solid var(--line-strong); border-radius: 999px; background: color-mix(in srgb, var(--field) 70%, transparent); color: var(--text-2); font: 550 12.5px/1 var(--sans); cursor: pointer; user-select: none; transition: border-color 0.2s var(--ease), background 0.2s var(--ease), color 0.2s var(--ease); } .lang > summary::-webkit-details-marker { display: none; } .lang > summary:hover, .lang[open] > summary { color: var(--text); border-color: rgba(120, 86, 255, 0.55); background: var(--raised); } .lang-ico { width: 16px; height: 16px; flex: 0 0 auto; fill: none; stroke: currentColor; stroke-width: 1.4; stroke-linecap: round; stroke-linejoin: round; } .lang-pop { position: absolute; inset-inline-end: 0; top: calc(100% + 10px); z-index: 50; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 2px; width: min(330px, calc(100vw - 2 * var(--gutter))); padding: 8px; border: 1px solid var(--line-strong); border-radius: 16px; background: var(--chrome); box-shadow: 0 28px 70px -24px rgba(0, 0, 0, 0.85), 0 0 0 1px rgba(255, 255, 255, 0.02) inset; } .lang-pop a { display: block; padding: 9px 11px; border-radius: 9px; color: var(--text-2); font: 500 14px/1.35 var(--sans); text-decoration: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .lang-pop a:hover { background: var(--raised); color: var(--text); } .lang-pop a[aria-current] { color: var(--text); background: color-mix(in srgb, var(--b1) 20%, transparent); } .lang-foot > summary { height: 36px; font-size: 13.5px; } .lang-foot .lang-pop { top: auto; bottom: calc(100% + 10px); inset-inline-end: auto; inset-inline-start: 0; } @media (max-width: 640px) { .lang > summary { height: 32px; padding: 0 9px 0 8px; } .lang-top .lang-pop { position: fixed; top: 58px; inset-inline: var(--gutter); width: auto; } } /* On a phone the header keeps the globe alone, and the family link gives way to it. */ @media (max-width: 520px) { .lang-top .lang-now { display: none; } .lang-top > summary { width: 32px; padding: 0; justify-content: center; } .top-row:has(.lang) .top-nav a.keep-sm { display: none; } /* Longer words than "Store" (Cửa hàng, Mağaza) still leave room for the globe. */ .top-row:has(.lang) { gap: 10px; } .top-row:has(.lang) .top-nav { gap: 10px; } } /* Narrow phones: the way back to the family is in the footer too, and the call to action tightens. */ @media (max-width: 400px) { .top-row:has(.lang) .top-nav a.nav-family { display: none; } .top-row:has(.lang) .top-nav .top-cta { padding: 6px 9px; font-size: 12.5px; } } /* The smallest phones: a long word (Dutch, Russian, Portuguese) breaks rather than widening the page. */ @media (max-width: 359px) { h1, h2, h3, p, li, b, dd, dt, button, .btn { overflow-wrap: anywhere; min-width: 0; } .inline-cmd { white-space: normal; flex-wrap: wrap; max-width: 100%; } .btn { white-space: normal; } .top-row:has(.lang) .top-nav .top-cta { padding: 6px 7px; } /* A longer call to action (Veröffentlichen, Опубликовать) takes the room of the mark's second word. */ html:not(:lang(en)) .top-row:has(.top-cta) .mark-sub { display: none; } } /* * Scripts the site's faces (Geist, Geist Mono, Instrument Serif) do not draw fall back to the * system's own font for that script, named here so the choice is deliberate on every platform. * No web font is downloaded for them. Latin words in those pages keep the site's faces. */ :lang(ja) { --sans: 'Geist', 'Hiragino Sans', 'Hiragino Kaku Gothic ProN', 'Yu Gothic UI', 'Yu Gothic', Meiryo, 'Noto Sans JP', 'Noto Sans CJK JP', system-ui, sans-serif; --mono: 'Geist Mono', 'Hiragino Sans', 'Yu Gothic UI', 'Yu Gothic', Meiryo, 'Noto Sans JP', 'Noto Sans CJK JP', ui-monospace, Consolas, monospace; } :lang(ko) { --sans: 'Geist', 'Apple SD Gothic Neo', 'Malgun Gothic', 'Noto Sans KR', 'Noto Sans CJK KR', system-ui, sans-serif; --mono: 'Geist Mono', 'Apple SD Gothic Neo', 'Malgun Gothic', 'Noto Sans KR', 'Noto Sans CJK KR', ui-monospace, Consolas, monospace; } :lang(zh-Hant) { --sans: 'Geist', 'PingFang TC', 'Microsoft JhengHei UI', 'Microsoft JhengHei', 'Noto Sans TC', 'Noto Sans CJK TC', system-ui, sans-serif; --mono: 'Geist Mono', 'PingFang TC', 'Microsoft JhengHei UI', 'Microsoft JhengHei', 'Noto Sans TC', 'Noto Sans CJK TC', ui-monospace, Consolas, monospace; } :lang(th) { --sans: 'Geist', 'Leelawadee UI', Thonburi, 'Noto Sans Thai', 'Noto Sans Thai UI', Tahoma, system-ui, sans-serif; --mono: 'Geist Mono', 'Leelawadee UI', Thonburi, 'Noto Sans Thai', Tahoma, ui-monospace, Consolas, monospace; } :lang(hi) { --sans: 'Geist', 'Nirmala UI', 'Kohinoor Devanagari', 'Noto Sans Devanagari', Mangal, system-ui, sans-serif; --mono: 'Geist Mono', 'Nirmala UI', 'Kohinoor Devanagari', 'Noto Sans Devanagari', Mangal, ui-monospace, Consolas, monospace; } :lang(ar) { --sans: 'Geist', 'Segoe UI', 'SF Arabic', 'Geeza Pro', 'Noto Sans Arabic', 'Noto Naskh Arabic', Tahoma, system-ui, sans-serif; --mono: 'Geist Mono', 'Segoe UI', 'SF Arabic', 'Geeza Pro', 'Noto Sans Arabic', Tahoma, ui-monospace, Consolas, monospace; } :is(:lang(ja), :lang(ko), :lang(zh), :lang(th), :lang(hi), :lang(ar)) { --serif: 'Instrument Serif', var(--sans); } .lang-pop a { font-family: var(--sans); } /* * Those scripts have no capitals and no italics, and tracking pulls them apart (Arabic letters join, * Thai and Devanagari marks sit on their letters): no letter-spacing, no uppercase, and emphasis is * carried by colour instead of a slanted serif. An item's own English words (lang="en") keep the * Latin rules. */ :is(:lang(ja), :lang(ko), :lang(zh), :lang(th), :lang(hi), :lang(ar)) { letter-spacing: 0 !important; text-transform: none !important; } em:is(:lang(ja), :lang(ko), :lang(zh), :lang(th), :lang(hi), :lang(ar)) { font-family: inherit; font-style: normal; font-size: 1em !important; } /* Tall scripts need more room between lines than Latin headings set this tight. */ html:is(:lang(ja), :lang(ko), :lang(zh)) :is(h1, h2, h3) { line-height: 1.24; } html:is(:lang(th), :lang(hi), :lang(ar)) :is(h1, h2, h3) { line-height: 1.4; } html:is(:lang(th), :lang(hi), :lang(ar)) body { line-height: 1.75; } html:is(:lang(th), :lang(hi), :lang(ar)) :is(.lead, .lede, .st-lede, .hero-sub, .gal-lede) { line-height: 1.8; } /* Korean breaks between words, Japanese between phrases where the browser can tell. */ html:lang(ko) { word-break: keep-all; overflow-wrap: anywhere; } html:lang(ja) { line-break: strict; word-break: auto-phrase; } /* Long words (German, Dutch, Turkish, Indonesian) wrap instead of pushing a card wider. */ h1, h2, h3, .btn, .gal-card { overflow-wrap: anywhere; } /* * Right to left (Arabic). The layout follows the direction: spacing and positions are logical * properties throughout. What is not language stays as it is: the brand marks, code, commands, * file names, handles and keys (everything marked translate="no") read left to right. */ [dir='rtl'] :is(code, kbd, pre, .code, .term, .inline-cmd, .mark, .file, .hs-stage, [translate='no']) { direction: ltr; unicode-bidi: isolate; } [dir='rtl'] pre { text-align: left; } /* An item's own English words, inside a right-to-left page: read left to right, sit on the page's side. */ [dir='rtl'] :is(p, h1, h2, h3, li, figcaption)[lang='en'][dir='ltr'] { text-align: right; } [dir='rtl'] :is(.top-progress, .mu-bar span) { transform-origin: 100% 50%; } [dir='rtl'] .vs-old::after { transform-origin: 100% 50%; } [dir='rtl'] svg.arrow { transform: scaleX(-1); } [dir='rtl'] .btn:hover svg.arrow { transform: scaleX(-1) translateX(3px); } /* "Back to the family" points the way back: right, where a right-to-left page begins. */ [dir='rtl'] .nav-family::before { content: '\2192\00a0'; }