Spaces:
Running
Running
| /* ========================================================================== | |
| AI PLAYGROUND — BASE | |
| Reset, typography, and the editorial layout primitives every page composes | |
| from: hairline rules, a numbered section head, wide margins, a grid. | |
| ========================================================================== */ | |
| *, | |
| *::before, | |
| *::after { box-sizing: border-box; } | |
| * { margin: 0; padding: 0; } | |
| html { | |
| -webkit-text-size-adjust: 100%; | |
| scroll-behavior: smooth; | |
| scroll-padding-top: 6rem; | |
| } | |
| body { | |
| background: var(--paper); | |
| color: var(--ink); | |
| font-family: var(--font-sans); | |
| font-size: var(--t-16); | |
| line-height: var(--lh-body); | |
| font-weight: var(--fw-regular); | |
| letter-spacing: var(--tr-none); | |
| -webkit-font-smoothing: antialiased; | |
| -moz-osx-font-smoothing: grayscale; | |
| font-synthesis-weight: none; | |
| text-rendering: optimizeLegibility; | |
| overflow-x: hidden; | |
| transition: background-color var(--dur-3) var(--ease), | |
| color var(--dur-3) var(--ease); | |
| } | |
| ::selection { | |
| background: var(--selection-bg); | |
| color: var(--selection-fg); | |
| } | |
| img, svg, video, canvas, audio, iframe, embed, object { | |
| display: block; | |
| max-width: 100%; | |
| } | |
| img, video { height: auto; } | |
| input, button, textarea, select { | |
| font: inherit; | |
| color: inherit; | |
| letter-spacing: inherit; | |
| } | |
| button { background: none; border: none; cursor: pointer; } | |
| a { color: inherit; text-decoration: none; } | |
| ul, ol { list-style: none; } | |
| table { border-collapse: collapse; width: 100%; } | |
| hr { | |
| border: none; | |
| border-top: var(--rule) solid var(--line); | |
| } | |
| /* --- Focus --------------------------------------------------------------- | |
| Visible, high contrast, and never removed. Uses :focus-visible so pointer | |
| users are not shown rings on click. | |
| ------------------------------------------------------------------------ */ | |
| :focus { outline: none; } | |
| :focus-visible { | |
| outline: var(--rule-thick) solid var(--focus); | |
| outline-offset: 3px; | |
| border-radius: var(--r-1); | |
| } | |
| .skip-link { | |
| position: absolute; | |
| top: -100%; | |
| left: var(--sp-4); | |
| z-index: var(--z-toast); | |
| padding: var(--sp-3) var(--sp-5); | |
| background: var(--ink); | |
| color: var(--ink-inverse); | |
| font-size: var(--t-14); | |
| font-weight: var(--fw-medium); | |
| } | |
| .skip-link:focus { top: var(--sp-4); } | |
| /* Screen-reader-only, but focusable when it needs to be */ | |
| .sr-only { | |
| position: absolute; | |
| width: 1px; height: 1px; | |
| padding: 0; margin: -1px; | |
| overflow: hidden; | |
| clip: rect(0 0 0 0); | |
| clip-path: inset(50%); | |
| white-space: nowrap; | |
| border: 0; | |
| } | |
| .sr-only-focusable:focus, | |
| .sr-only-focusable:focus-within { | |
| position: static; | |
| width: auto; height: auto; | |
| overflow: visible; | |
| clip: auto; clip-path: none; | |
| white-space: normal; | |
| } | |
| /* ========================================================================== | |
| TYPOGRAPHY | |
| ========================================================================== */ | |
| .display-1, | |
| .display-2, | |
| .display-3, | |
| .display-4 { | |
| font-family: var(--font-display); | |
| font-weight: var(--fw-regular); | |
| line-height: var(--lh-display); | |
| letter-spacing: var(--tr-display); | |
| text-wrap: balance; | |
| } | |
| .display-1 { font-size: var(--t-display-1); } | |
| .display-2 { font-size: var(--t-display-2); } | |
| .display-3 { font-size: var(--t-display-3); line-height: var(--lh-tight); } | |
| .display-4 { | |
| font-size: var(--t-display-4); | |
| line-height: var(--lh-tight); | |
| letter-spacing: var(--tr-tight); | |
| } | |
| .display-1 em, | |
| .display-2 em, | |
| .display-3 em, | |
| .display-4 em { | |
| font-style: italic; | |
| color: var(--accent-ink); | |
| } | |
| /* Sans headings, for UI and dense areas where the serif would be too loud */ | |
| .h1, .h2, .h3, .h4, .h5 { | |
| font-family: var(--font-sans); | |
| font-weight: var(--fw-semi); | |
| line-height: var(--lh-tight); | |
| letter-spacing: var(--tr-tight); | |
| text-wrap: balance; | |
| } | |
| .h1 { font-size: var(--t-42); } | |
| .h2 { font-size: var(--t-32); } | |
| .h3 { font-size: var(--t-24); letter-spacing: var(--tr-mid); } | |
| .h4 { font-size: var(--t-18); letter-spacing: var(--tr-mid); } | |
| .h5 { font-size: var(--t-16); letter-spacing: var(--tr-none); } | |
| /* Lede — the paragraph directly under a display headline */ | |
| .lede { | |
| font-size: clamp(var(--t-18), 1.6vw, var(--t-24)); | |
| line-height: var(--lh-prose); | |
| letter-spacing: var(--tr-mid); | |
| color: var(--ink-secondary); | |
| max-width: var(--measure); | |
| text-wrap: pretty; | |
| } | |
| .prose { | |
| max-width: var(--measure); | |
| line-height: var(--lh-prose); | |
| color: var(--ink-secondary); | |
| text-wrap: pretty; | |
| } | |
| .prose > * + * { margin-top: var(--sp-4); } | |
| .prose strong { color: var(--ink); font-weight: var(--fw-semi); } | |
| .prose a { | |
| color: var(--accent-ink); | |
| text-decoration: underline; | |
| text-underline-offset: 0.2em; | |
| text-decoration-thickness: 1px; | |
| } | |
| .prose a:hover { text-decoration-thickness: 2px; } | |
| .text-serif { | |
| font-family: var(--font-display); | |
| font-size: var(--t-21); | |
| line-height: var(--lh-serif); | |
| letter-spacing: var(--tr-none); | |
| } | |
| /* --- Labels and metadata ------------------------------------------------- | |
| Mono, uppercase, wide tracking. Used for section numbers, field labels, | |
| category tags and any small technical annotation. | |
| ------------------------------------------------------------------------ */ | |
| .label { | |
| font-family: var(--font-mono); | |
| font-size: var(--t-11); | |
| font-weight: var(--fw-medium); | |
| letter-spacing: var(--tr-caps); | |
| text-transform: uppercase; | |
| color: var(--ink-muted); | |
| line-height: 1; | |
| } | |
| .label--ink { color: var(--ink); } | |
| .label--accent { color: var(--accent-ink); } | |
| .eyebrow { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: var(--sp-3); | |
| font-family: var(--font-mono); | |
| font-size: var(--t-11); | |
| font-weight: var(--fw-medium); | |
| letter-spacing: var(--tr-caps); | |
| text-transform: uppercase; | |
| color: var(--ink-muted); | |
| line-height: 1; | |
| } | |
| .eyebrow::before { | |
| content: ""; | |
| width: 1.75rem; | |
| height: var(--rule); | |
| background: var(--accent); | |
| flex: none; | |
| } | |
| .eyebrow--bare::before { display: none; } | |
| .mono { | |
| font-family: var(--font-mono); | |
| font-size: var(--t-12); | |
| letter-spacing: var(--tr-none); | |
| font-variant-numeric: tabular-nums; | |
| } | |
| .muted { color: var(--ink-muted); } | |
| .faint { color: var(--ink-faint); } | |
| /* ========================================================================== | |
| LAYOUT PRIMITIVES | |
| ========================================================================== */ | |
| .shell { | |
| width: 100%; | |
| max-width: var(--max-w); | |
| margin-inline: auto; | |
| padding-inline: var(--gutter); | |
| } | |
| .shell--narrow { max-width: 64rem; } | |
| .rule { | |
| border: none; | |
| border-top: var(--rule) solid var(--line); | |
| width: 100%; | |
| } | |
| .rule--ink { border-top-color: var(--line-ink); } | |
| .rule--accent { border-top-color: var(--accent); } | |
| .rule--thick { border-top-width: var(--rule-thick); } | |
| .section { | |
| padding-block: var(--section-y); | |
| position: relative; | |
| } | |
| .section--tight { padding-block: clamp(2.5rem, 5vw, 5rem); } | |
| .section--warm { background: var(--paper-warm); } | |
| .section--sunk { background: var(--paper-sunk); } | |
| .section--inverse { | |
| background: var(--paper-inverse); | |
| color: var(--paper); | |
| } | |
| .section--inverse .lede, | |
| .section--inverse .prose { color: rgba(255, 255, 255, 0.72); } | |
| [data-theme="dark"] .section--inverse .lede, | |
| [data-theme="dark"] .section--inverse .prose { color: rgba(0, 0, 0, 0.7); } | |
| /* --- Section head -------------------------------------------------------- | |
| The signature move of the reference layout: a hairline rule, then a small | |
| section number in a narrow left column, the title beside it, and the | |
| supporting copy set apart in a third column. | |
| ------------------------------------------------------------------------ */ | |
| .section-head { | |
| display: grid; | |
| grid-template-columns: 5rem minmax(0, 1fr); | |
| gap: var(--sp-5) var(--sp-6); | |
| padding-top: var(--sp-5); | |
| border-top: var(--rule) solid var(--line-ink); | |
| margin-bottom: var(--sp-9); | |
| } | |
| .section-head__num { | |
| font-family: var(--font-mono); | |
| font-size: var(--t-12); | |
| font-weight: var(--fw-medium); | |
| letter-spacing: var(--tr-label); | |
| color: var(--ink); | |
| line-height: 1.4; | |
| } | |
| .section-head__body { | |
| display: grid; | |
| grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr); | |
| gap: var(--sp-5) var(--sp-8); | |
| align-items: start; | |
| } | |
| .section-head__title { | |
| font-family: var(--font-display); | |
| font-size: var(--t-display-3); | |
| font-weight: var(--fw-regular); | |
| line-height: var(--lh-tight); | |
| letter-spacing: var(--tr-tight); | |
| text-wrap: balance; | |
| } | |
| .section-head__title em { font-style: italic; color: var(--accent-ink); } | |
| .section-head__kicker { | |
| font-family: var(--font-mono); | |
| font-size: var(--t-11); | |
| letter-spacing: var(--tr-caps); | |
| text-transform: uppercase; | |
| color: var(--ink-muted); | |
| margin-bottom: var(--sp-3); | |
| display: block; | |
| } | |
| .section-head__note { | |
| font-size: var(--t-16); | |
| line-height: var(--lh-prose); | |
| color: var(--ink-secondary); | |
| max-width: var(--measure); | |
| text-wrap: pretty; | |
| padding-top: var(--sp-2); | |
| } | |
| @media (max-width: 900px) { | |
| .section-head { | |
| grid-template-columns: 1fr; | |
| gap: var(--sp-4); | |
| margin-bottom: var(--sp-7); | |
| } | |
| .section-head__body { grid-template-columns: 1fr; gap: var(--sp-4); } | |
| } | |
| /* --- Grids --------------------------------------------------------------- */ | |
| .grid { display: grid; gap: var(--sp-6); } | |
| .grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } | |
| .grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } | |
| .grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } | |
| .grid--auto { | |
| grid-template-columns: repeat(auto-fill, minmax(min(19rem, 100%), 1fr)); | |
| } | |
| @media (max-width: 1100px) { | |
| .grid--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } | |
| .grid--3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } | |
| } | |
| @media (max-width: 720px) { | |
| .grid--2, .grid--3, .grid--4 { grid-template-columns: 1fr; } | |
| } | |
| .stack { display: flex; flex-direction: column; } | |
| .stack-1 > * + * { margin-top: var(--sp-1); } | |
| .stack-2 > * + * { margin-top: var(--sp-2); } | |
| .stack-3 > * + * { margin-top: var(--sp-3); } | |
| .stack-4 > * + * { margin-top: var(--sp-4); } | |
| .stack-5 > * + * { margin-top: var(--sp-5); } | |
| .stack-6 > * + * { margin-top: var(--sp-6); } | |
| .stack-8 > * + * { margin-top: var(--sp-8); } | |
| .row { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--sp-3); | |
| flex-wrap: wrap; | |
| } | |
| .row--between { justify-content: space-between; } | |
| .row--end { justify-content: flex-end; } | |
| .row--top { align-items: flex-start; } | |
| .row--baseline { align-items: baseline; } | |
| .row--tight { gap: var(--sp-2); } | |
| .row--wide { gap: var(--sp-5); } | |
| .spacer { flex: 1 1 auto; } | |
| /* ========================================================================== | |
| MOTION | |
| Entrances are opt-in via .reveal and driven by IntersectionObserver, so | |
| nothing depends on animation to become readable. | |
| ========================================================================== */ | |
| .reveal { | |
| opacity: 0; | |
| transform: translateY(1.25rem); | |
| transition: opacity var(--dur-4) var(--ease), | |
| transform var(--dur-4) var(--ease); | |
| transition-delay: var(--reveal-delay, 0ms); | |
| } | |
| .reveal.is-visible { | |
| opacity: 1; | |
| transform: none; | |
| } | |
| @keyframes fade-in { from { opacity: 0; } to { opacity: 1; } } | |
| @keyframes rise { | |
| from { opacity: 0; transform: translateY(0.75rem); } | |
| to { opacity: 1; transform: none; } | |
| } | |
| @keyframes pulse-soft { | |
| 0%, 100% { opacity: 1; } | |
| 50% { opacity: 0.45; } | |
| } | |
| @keyframes sweep { | |
| from { transform: translateX(-100%); } | |
| to { transform: translateX(300%); } | |
| } | |
| @keyframes spin { to { transform: rotate(360deg); } } | |
| /* --- Reduced motion ------------------------------------------------------ | |
| Everything decorative stops. Content that was hidden pending an entrance | |
| animation is forced visible so nothing is lost. | |
| ------------------------------------------------------------------------ */ | |
| @media (prefers-reduced-motion: reduce) { | |
| *, | |
| *::before, | |
| *::after { | |
| animation-duration: 0.001ms ; | |
| animation-iteration-count: 1 ; | |
| transition-duration: 0.001ms ; | |
| scroll-behavior: auto ; | |
| } | |
| html { scroll-behavior: auto; } | |
| .reveal { opacity: 1; transform: none; } | |
| } | |
| /* The same, but user-triggered from the interface rather than the OS */ | |
| [data-motion="off"] *, | |
| [data-motion="off"] *::before, | |
| [data-motion="off"] *::after { | |
| animation-duration: 0.001ms ; | |
| animation-iteration-count: 1 ; | |
| transition-duration: 0.001ms ; | |
| } | |
| [data-motion="off"] .reveal { opacity: 1; transform: none; } | |
| /* ========================================================================== | |
| ========================================================================== */ | |
| @media print { | |
| .site-nav, .site-footer, .drawer, .journey, .toast-stack { display: none; } | |
| body { background: #fff; color: #000; } | |
| .section { padding-block: 1.5rem; } | |
| } | |