echo / code /docs /style.css
amonshano's picture
Add Echo-Memory codebase used for this run (CC BY 4.0, JD Echo Team) (part 2)
eafbe80 verified
Raw
History Blame Contribute Delete
34.5 kB
:root {
--bg: #fffcfd;
--bg-soft: #fff5f8;
--surface: #ffffff;
--surface-2: #fbf0f4;
--text: #191218;
--text-soft: #655b63;
--border: #ead9df;
--brand: #bf5276;
--brand-2: #d97498;
--accent: #84354e;
--ring: rgba(191, 82, 118, 0.28);
--shadow: 0 14px 36px rgba(93, 45, 61, 0.08);
--shadow-lg: 0 22px 48px rgba(93, 45, 61, 0.12);
--nav-h: 72px;
--figure-max: 880px;
--ease-out: cubic-bezier(0.22, 1, 0.36, 1);
}
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
scroll-snap-type: y proximity;
scroll-padding-top: var(--nav-h);
}
body {
margin: 0;
font-family: "IBM Plex Sans", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
color: var(--text);
background-color: #fff9fb;
min-height: 100vh;
}
a {
color: inherit;
}
img {
max-width: 100%;
display: block;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}
.page-shell {
position: relative;
width: 100%;
overflow-x: hidden;
isolation: isolate;
}
#main-content {
width: 100%;
position: relative;
z-index: 1;
}
/* Ambient background — layered gradients + slow motion */
.ambient-bg {
position: fixed;
inset: 0;
z-index: -3;
pointer-events: none;
overflow: hidden;
background: linear-gradient(
165deg,
#fffcfd 0%,
#fff6f9 38%,
#fff0f5 68%,
#fffbfc 100%
);
}
.ambient-orb {
position: absolute;
border-radius: 50%;
filter: blur(72px);
opacity: 0.55;
will-change: transform;
}
.ambient-orb--rose {
width: min(58vw, 520px);
height: min(58vw, 520px);
top: -12%;
left: -8%;
background: radial-gradient(
circle,
rgba(191, 82, 118, 0.42) 0%,
rgba(191, 82, 118, 0.12) 45%,
transparent 70%
);
animation: orbDriftRose 22s ease-in-out infinite;
}
.ambient-orb--blush {
width: min(50vw, 460px);
height: min(50vw, 460px);
top: 8%;
right: -10%;
background: radial-gradient(
circle,
rgba(217, 116, 152, 0.38) 0%,
rgba(255, 182, 198, 0.14) 50%,
transparent 72%
);
animation: orbDriftBlush 26s ease-in-out infinite;
}
.ambient-orb--pearl {
width: min(64vw, 580px);
height: min(64vw, 580px);
bottom: -18%;
left: 22%;
background: radial-gradient(
circle,
rgba(255, 220, 230, 0.5) 0%,
rgba(191, 82, 118, 0.1) 40%,
transparent 68%
);
animation: orbDriftPearl 30s ease-in-out infinite;
}
.ambient-shimmer {
position: absolute;
inset: -20%;
background: conic-gradient(
from 200deg at 50% 45%,
transparent 0deg,
rgba(191, 82, 118, 0.06) 55deg,
transparent 110deg,
rgba(217, 116, 152, 0.05) 200deg,
transparent 280deg,
rgba(255, 200, 215, 0.04) 330deg,
transparent 360deg
);
animation: shimmerRotate 48s linear infinite;
opacity: 0.9;
}
.page-shell::before {
content: "";
position: fixed;
inset: 0;
pointer-events: none;
opacity: 0.2;
background-image: radial-gradient(circle, rgba(191, 82, 118, 0.11) 1px, transparent 1px);
background-size: 26px 26px;
z-index: -2;
animation: gridPulse 8s ease-in-out infinite;
}
.page-shell::after {
content: "";
position: fixed;
inset: 0;
pointer-events: none;
z-index: -1;
background:
radial-gradient(ellipse 120% 80% at 50% 0%, rgba(255, 255, 255, 0.55), transparent 55%),
radial-gradient(ellipse 90% 60% at 50% 100%, rgba(191, 82, 118, 0.06), transparent 50%);
}
@keyframes orbDriftRose {
0%,
100% {
transform: translate(0, 0) scale(1);
}
33% {
transform: translate(4%, 6%) scale(1.06);
}
66% {
transform: translate(2%, 3%) scale(0.96);
}
}
@keyframes orbDriftBlush {
0%,
100% {
transform: translate(0, 0) scale(1);
}
40% {
transform: translate(-5%, 4%) scale(1.08);
}
70% {
transform: translate(-2%, 7%) scale(0.94);
}
}
@keyframes orbDriftPearl {
0%,
100% {
transform: translate(0, 0) scale(1);
}
50% {
transform: translate(6%, -4%) scale(1.05);
}
}
@keyframes shimmerRotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@keyframes gridPulse {
0%,
100% {
opacity: 0.18;
}
50% {
opacity: 0.24;
}
}
.container {
width: min(1120px, calc(100% - 2rem));
margin: 0 auto;
}
/* Scroll progress */
.scroll-progress {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 3px;
z-index: 70;
pointer-events: none;
background: color-mix(in srgb, var(--border) 40%, transparent);
}
.scroll-progress__bar {
display: block;
height: 100%;
width: 0%;
background: linear-gradient(90deg, var(--accent), var(--brand), var(--brand-2));
border-radius: 0 2px 2px 0;
transition: width 0.08s linear;
box-shadow: 0 0 12px color-mix(in srgb, var(--brand) 45%, transparent);
}
/* Section scroll snap & progress dots */
.slide-dots {
position: fixed;
right: 14px;
top: 50%;
z-index: 55;
transform: translateY(-50%);
display: flex;
flex-direction: column;
gap: 0.45rem;
}
.slide-dots button {
position: relative;
width: 9px;
height: 9px;
padding: 0;
border: none;
border-radius: 50%;
background: color-mix(in srgb, var(--brand) 28%, var(--border));
cursor: pointer;
transition: transform 0.25s var(--ease-out), background 0.25s ease, box-shadow 0.25s ease;
}
.slide-dots button::after {
content: attr(data-label);
position: absolute;
right: calc(100% + 10px);
top: 50%;
transform: translateY(-50%) translateX(6px);
padding: 0.28rem 0.55rem;
border-radius: 0.4rem;
background: var(--text);
color: #fff;
font-size: 0.68rem;
font-weight: 600;
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: opacity 0.2s ease, transform 0.2s var(--ease-out);
}
.slide-dots button:hover::after,
.slide-dots button:focus-visible::after {
opacity: 1;
transform: translateY(-50%) translateX(0);
}
.slide-dots button:hover {
transform: scale(1.2);
background: color-mix(in srgb, var(--brand) 55%, var(--border));
}
.slide-dots button.is-active {
transform: scale(1.35);
background: var(--brand);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--brand) 25%, transparent);
}
/* Back to top */
.back-top {
position: fixed;
right: 1.1rem;
bottom: 1.25rem;
z-index: 56;
width: 2.6rem;
height: 2.6rem;
border: 1px solid color-mix(in srgb, var(--brand) 35%, var(--border));
border-radius: 50%;
background: color-mix(in srgb, var(--surface) 88%, transparent);
backdrop-filter: blur(10px);
color: var(--accent);
cursor: pointer;
box-shadow: var(--shadow);
display: grid;
place-items: center;
transition: transform 0.25s var(--ease-out), opacity 0.25s ease, border-color 0.2s ease;
opacity: 0;
pointer-events: none;
}
.back-top.is-visible {
opacity: 1;
pointer-events: auto;
}
.back-top:hover {
transform: translateY(-3px);
border-color: var(--brand);
}
/* Reveal on scroll */
.reveal {
opacity: 0;
transform: translateY(28px);
transition: opacity 0.65s var(--ease-out), transform 0.65s var(--ease-out);
}
.reveal.is-visible {
opacity: 1;
transform: translateY(0);
}
.reveal .card,
.reveal .section-figure,
.reveal .qual-viewer {
transition-delay: 0.05s;
}
/* Nav */
.top-nav {
position: sticky;
top: 0;
z-index: 60;
border-bottom: 1px solid color-mix(in srgb, var(--border) 65%, transparent);
background: color-mix(in srgb, var(--surface) 72%, transparent);
backdrop-filter: blur(16px) saturate(1.15);
-webkit-backdrop-filter: blur(16px) saturate(1.15);
transition: box-shadow 0.3s ease, background 0.3s ease;
}
.top-nav.is-scrolled {
box-shadow: 0 8px 24px rgba(93, 45, 61, 0.06);
background: color-mix(in srgb, var(--surface) 92%, transparent);
}
.top-nav__inner {
min-height: var(--nav-h);
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 0.65rem;
}
.brand {
display: inline-flex;
align-items: center;
gap: 0.55rem;
text-decoration: none;
font-family: "Space Grotesk", sans-serif;
font-weight: 700;
font-size: 1.04rem;
flex-shrink: 0;
}
.brand:hover {
text-decoration: none;
}
.brand-name {
color: var(--text);
}
.brand-team {
padding: 0.2rem 0.55rem;
border-radius: 999px;
font-size: 0.68rem;
font-weight: 600;
color: var(--accent);
background: color-mix(in srgb, var(--brand) 12%, var(--surface));
border: 1px solid color-mix(in srgb, var(--brand) 35%, var(--border));
}
.nav-links {
display: flex;
align-items: center;
justify-content: center;
gap: 0.3rem;
flex-wrap: nowrap;
min-width: 0;
}
.nav-link {
text-decoration: none;
color: var(--text-soft);
font-size: 0.8rem;
font-weight: 500;
padding: 0.35rem 0.38rem;
white-space: nowrap;
border-radius: 0.45rem;
transition: color 0.2s ease, background 0.2s ease;
}
.nav-link:hover,
.nav-link.is-active {
color: var(--accent);
background: color-mix(in srgb, var(--brand) 10%, transparent);
text-decoration: none;
}
.nav-actions {
display: inline-flex;
align-items: center;
gap: 0.55rem;
flex-shrink: 0;
}
.action-btn {
border: 1px solid var(--border);
background: var(--surface-2);
color: var(--text);
border-radius: 0.6rem;
min-height: 2.2rem;
padding: 0.35rem 0.7rem;
font-size: 0.82rem;
font-weight: 600;
text-decoration: none;
cursor: pointer;
transition: transform 0.2s ease, border-color 0.2s ease, background 0.2s ease;
}
.action-btn:hover {
transform: translateY(-1px);
border-color: color-mix(in srgb, var(--brand) 58%, var(--border));
text-decoration: none;
}
.nav-toggle {
display: none;
flex-direction: column;
gap: 5px;
padding: 8px;
border: 1px solid var(--border);
border-radius: 0.5rem;
background: var(--surface);
cursor: pointer;
}
.nav-toggle span {
display: block;
width: 20px;
height: 2px;
background: var(--text);
border-radius: 2px;
}
.nav-mobile {
display: none;
flex-direction: column;
gap: 0.25rem;
padding: 0 0 1rem;
border-top: 1px solid var(--border);
background: color-mix(in srgb, var(--surface) 95%, transparent);
}
.top-nav.is-open .nav-mobile {
display: flex;
}
.nav-mobile .nav-link {
padding: 0.55rem 0.65rem;
}
/* Sections (starVLA-style: normal flow, container max-width) */
.section {
position: relative;
padding: 4.5rem 0;
scroll-margin-top: var(--nav-h);
scroll-snap-align: start;
}
#main-content > .section + .section::before {
content: "";
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
width: min(1120px, calc(100% - 2rem));
height: 1px;
background: linear-gradient(
90deg,
transparent 0%,
color-mix(in srgb, var(--brand) 18%, var(--border)) 18%,
color-mix(in srgb, var(--brand) 18%, var(--border)) 82%,
transparent 100%
);
opacity: 0.85;
}
#main-content > .section:nth-of-type(even) {
background: linear-gradient(
180deg,
color-mix(in srgb, var(--surface) 55%, transparent) 0%,
color-mix(in srgb, var(--surface-2) 28%, transparent) 100%
);
backdrop-filter: blur(2px);
}
.section--center .container {
text-align: center;
}
.section--center .section-lead {
margin-inline: auto;
}
.section--center .feature-grid {
text-align: left;
}
.section--center .bullet-list {
display: inline-block;
text-align: left;
}
.section--center .qual-viewer,
.section--center .section-figure {
margin-inline: auto;
}
.section--compact {
padding-top: 3.5rem;
padding-bottom: 3.5rem;
}
.section-kicker {
margin: 0 0 0.5rem;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--brand);
}
.section-title {
margin: 0;
font-family: "Space Grotesk", sans-serif;
font-size: clamp(1.6rem, 4vw, 2.35rem);
line-height: 1.1;
letter-spacing: -0.02em;
}
.section-lead {
margin-top: 0.8rem;
color: var(--text-soft);
line-height: 1.7;
max-width: 70ch;
}
/* Hero */
.hero {
display: grid;
grid-template-columns: 1.08fr 0.92fr;
gap: 2.2rem;
align-items: center;
}
.hero--single {
grid-template-columns: 1fr;
}
.hero-badge {
display: inline-flex;
align-items: center;
padding: 0.35rem 0.72rem;
border-radius: 999px;
border: 1px solid color-mix(in srgb, var(--brand) 58%, transparent);
background: color-mix(in srgb, var(--brand) 10%, var(--surface));
font-size: 0.74rem;
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
color: color-mix(in srgb, var(--brand) 85%, var(--text));
}
.hero-title {
margin-top: 1.15rem;
margin-bottom: 0.95rem;
font-family: "Space Grotesk", sans-serif;
font-size: clamp(2rem, 5vw, 3.3rem);
line-height: 1.06;
letter-spacing: -0.02em;
}
.hero-highlight {
background: linear-gradient(120deg, var(--accent), var(--brand), var(--brand-2));
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
}
.hero-subtitle {
margin: 0;
color: var(--text-soft);
font-size: 1.07rem;
line-height: 1.7;
max-width: 52ch;
}
.hero-cta-group {
margin-top: 1.45rem;
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}
.cta {
text-decoration: none;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.45rem;
border-radius: 0.8rem;
border: 1px solid transparent;
min-height: 2.8rem;
padding: 0.55rem 1rem;
font-weight: 700;
font-size: 0.94rem;
transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.cta:hover {
transform: translateY(-1px);
text-decoration: none;
}
.cta--primary {
background: linear-gradient(128deg, var(--brand), var(--brand-2));
color: #fff;
box-shadow: 0 16px 30px color-mix(in srgb, var(--brand) 34%, transparent);
}
.cta--primary:hover {
box-shadow: 0 20px 36px color-mix(in srgb, var(--brand) 42%, transparent);
}
.cta--secondary {
background: var(--surface);
border-color: var(--border);
color: var(--accent);
}
.metrics-grid {
margin-top: 1.6rem;
display: grid;
gap: 0.85rem;
grid-template-columns: repeat(3, minmax(0, 1fr));
max-width: 640px;
}
.metrics-grid--duo {
grid-template-columns: repeat(2, minmax(0, 1fr));
max-width: 420px;
}
.hero-note {
margin: 1.25rem 0 0;
max-width: 52ch;
font-size: 0.92rem;
line-height: 1.65;
color: var(--text-soft);
}
.section-lead a {
color: var(--accent);
font-weight: 600;
text-decoration: underline;
text-underline-offset: 2px;
}
.section-lead a:hover {
color: var(--brand);
}
.metric-card {
display: block;
padding: 0.9rem 1rem;
border: 1px solid var(--border);
border-radius: 0.95rem;
background: var(--surface);
box-shadow: var(--shadow);
text-decoration: none;
transition: transform 0.2s ease, border-color 0.2s ease;
}
.metric-card:hover {
transform: translateY(-2px);
border-color: color-mix(in srgb, var(--brand) 45%, var(--border));
text-decoration: none;
}
.metric-label {
display: block;
color: var(--text-soft);
font-size: 0.8rem;
letter-spacing: 0.02em;
}
.metric-value {
margin-top: 0.25rem;
display: block;
font-family: "Space Grotesk", "IBM Plex Sans", sans-serif;
font-size: 1.45rem;
font-weight: 700;
color: var(--text);
}
.authors-fold {
margin-top: 1.5rem;
max-width: 52ch;
font-size: 0.875rem;
color: var(--text-soft);
}
.authors-fold summary {
cursor: pointer;
font-weight: 600;
color: var(--accent);
list-style: none;
}
.authors-fold summary::-webkit-details-marker {
display: none;
}
.authors {
margin: 0.75rem 0 0.35rem;
}
.affiliations {
margin: 0;
font-size: 0.82rem;
}
/* Cards & figures */
.feature-grid {
margin-top: 1.35rem;
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 0.95rem;
}
.feature-grid--three {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.card {
border: 1px solid var(--border);
background: var(--surface);
border-radius: 1rem;
padding: 1.2rem;
box-shadow: var(--shadow);
transition: transform 0.28s var(--ease-out), border-color 0.28s ease, box-shadow 0.28s ease;
}
.card--accent {
position: relative;
overflow: hidden;
}
.card--accent::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: var(--card-accent, var(--brand));
opacity: 0.85;
transition: height 0.25s ease;
}
.card--accent[data-accent="context"] {
--card-accent: #c45a7a;
}
.card--accent[data-accent="compression"] {
--card-accent: #a84d8f;
}
.card--accent[data-accent="spatial"] {
--card-accent: #84354e;
}
.card--accent[data-accent="ssm"] {
--card-accent: #d97498;
}
.card--accent:hover {
transform: translateY(-4px);
border-color: color-mix(in srgb, var(--card-accent) 45%, var(--border));
box-shadow: 0 18px 40px color-mix(in srgb, var(--card-accent) 14%, transparent);
}
.card--accent:hover::before {
height: 4px;
}
.card-icon {
width: 2.1rem;
height: 2.1rem;
border-radius: 0.55rem;
display: grid;
place-items: center;
background: color-mix(in srgb, var(--card-accent, var(--brand)) 12%, var(--surface));
color: var(--card-accent, var(--brand));
}
.card-icon svg {
width: 1.15rem;
height: 1.15rem;
}
.card h3 {
margin: 0.75rem 0 0.55rem;
font-family: "Space Grotesk", sans-serif;
font-size: 1.1rem;
}
.card p {
margin: 0;
color: var(--text-soft);
line-height: 1.65;
font-size: 0.92rem;
}
.bullet-list {
margin: 1rem 0 1.25rem;
padding-left: 1.25rem;
color: var(--text-soft);
line-height: 1.65;
}
.bullet-list li {
margin-bottom: 0.4rem;
}
.section-figure {
margin: 1.5rem auto 0;
text-align: center;
max-width: var(--figure-max);
}
[data-zoomable] {
cursor: zoom-in;
}
.section-figure img {
width: 100%;
margin: 0 auto;
border: 1px solid var(--border);
border-radius: 1rem;
background: var(--surface);
box-shadow: var(--shadow);
transition: transform 0.35s var(--ease-out), box-shadow 0.35s ease;
}
[data-zoomable]:hover img {
transform: scale(1.012);
box-shadow: var(--shadow-lg);
}
.section-figure figcaption {
margin-top: 0.65rem;
font-size: 0.84rem;
color: var(--text-soft);
}
.zoom-hint {
display: inline-block;
margin-left: 0.35rem;
font-size: 0.75rem;
color: color-mix(in srgb, var(--brand) 70%, var(--text-soft));
opacity: 0;
transition: opacity 0.2s ease;
}
[data-zoomable]:hover .zoom-hint {
opacity: 1;
}
/* Qual viewer */
.qual-viewer {
margin-top: 1.25rem;
max-width: var(--figure-max);
margin-inline: auto;
}
.qual-stage {
margin: 0 0 0.85rem;
padding: 0.85rem;
border: 1px solid var(--border);
border-radius: 1rem;
background: var(--surface);
box-shadow: var(--shadow);
}
.qual-stage__media {
position: relative;
overflow: hidden;
border-radius: 0.65rem;
aspect-ratio: 16 / 9;
background: color-mix(in srgb, var(--surface-2) 60%, var(--surface));
}
.qual-stage img {
width: 100%;
height: 100%;
object-fit: contain;
border-radius: 0.65rem;
transition: opacity 0.35s ease, transform 0.35s var(--ease-out);
}
.qual-stage img.is-fading {
opacity: 0;
transform: scale(0.985);
}
.qual-stage figcaption {
margin-top: 0.55rem;
font-size: 0.84rem;
color: var(--text-soft);
text-align: center;
}
.qual-chips {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 0.5rem;
}
.qual-chip {
border: 1px solid var(--border);
border-radius: 999px;
padding: 0.45rem 0.85rem;
background: var(--surface);
font-size: 0.82rem;
font-weight: 600;
color: var(--text-soft);
cursor: pointer;
transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}
.qual-chip.is-active,
.qual-chip:hover {
color: #fff;
background: var(--brand);
border-color: var(--brand);
}
.qual-chip {
transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease, transform 0.2s var(--ease-out);
}
.qual-chip:active {
transform: scale(0.97);
}
.demo-grid {
margin: 1.3rem auto 0;
max-width: 980px;
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 0.75rem;
}
.demo-grid__label {
grid-column: 1 / -1;
margin: 0.35rem 0 -0.25rem;
font-family: "Space Grotesk", sans-serif;
font-size: 0.95rem;
color: var(--text);
text-align: left;
}
.demo-grid figure {
margin: 0;
padding: 0.55rem;
border: 1px solid var(--border);
border-radius: 0.9rem;
background: var(--surface);
box-shadow: var(--shadow);
}
.demo-grid img {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
border-radius: 0.55rem;
background: var(--surface-2);
}
.demo-grid figcaption {
margin-top: 0.45rem;
text-align: center;
color: var(--text-soft);
font-size: 0.76rem;
font-weight: 700;
}
/* Lightbox */
.lightbox {
position: fixed;
inset: 0;
z-index: 100;
display: grid;
place-items: center;
padding: 1.5rem;
background: rgba(25, 18, 24, 0.72);
backdrop-filter: blur(8px);
animation: lightboxIn 0.25s ease;
}
.lightbox[hidden] {
display: none;
}
.lightbox__close {
position: absolute;
top: 1rem;
right: 1rem;
width: 2.5rem;
height: 2.5rem;
border: none;
border-radius: 50%;
background: rgba(255, 255, 255, 0.12);
color: #fff;
font-size: 1.5rem;
line-height: 1;
cursor: pointer;
transition: background 0.2s ease;
}
.lightbox__close:hover {
background: rgba(255, 255, 255, 0.22);
}
.lightbox__inner {
margin: 0;
max-width: min(1100px, 96vw);
max-height: 90vh;
}
.lightbox__inner img {
max-width: 100%;
max-height: calc(90vh - 3rem);
margin: 0 auto;
border-radius: 0.75rem;
box-shadow: 0 24px 64px rgba(0, 0, 0, 0.35);
}
.lightbox__inner figcaption {
margin-top: 0.75rem;
text-align: center;
color: rgba(255, 255, 255, 0.82);
font-size: 0.9rem;
}
@keyframes lightboxIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
/* News & roadmap */
.updates-grid {
margin-top: 1.5rem;
display: grid;
grid-template-columns: 1fr 1fr minmax(220px, 0.85fr);
gap: 1.25rem;
align-items: start;
}
.community-panel .wechat-qr {
margin: 0.75rem 0 0;
}
.community-panel {
overflow: visible;
}
.wechat-qr {
margin: 0.75rem auto 0;
padding: 0;
text-align: center;
overflow: visible;
}
/* Portrait WeChat screenshot: set display width only; height follows intrinsic ratio (1166×1640). */
.wechat-qr__photo {
display: block;
width: 220px;
max-width: 100%;
height: auto;
margin: 0 auto;
border-radius: 0.75rem;
border: 1px solid var(--border);
box-shadow: var(--shadow);
}
.developer-page .wechat-qr {
margin: 1rem auto 0;
overflow: visible;
}
.developer-page .wechat-qr__photo {
width: 260px;
}
.wechat-qr figcaption {
margin-top: 0.55rem;
font-size: 0.82rem;
color: var(--text-soft);
}
.lang-toggle {
border: 1px solid var(--border);
background: var(--surface);
color: var(--accent);
border-radius: 999px;
padding: 0.35rem 0.75rem;
font-size: 0.78rem;
font-weight: 600;
cursor: pointer;
font-family: inherit;
transition: background 0.2s ease, border-color 0.2s ease;
}
.lang-toggle:hover {
background: var(--surface-2);
border-color: var(--brand-2);
}
.action-btn--ghost {
background: transparent;
border: 1px solid var(--border);
color: var(--accent);
}
.action-btn--ghost:hover {
background: var(--surface-2);
}
.page-shell--doc {
min-height: 100vh;
}
.top-nav--doc {
position: sticky;
top: 0;
z-index: 20;
background: rgba(255, 252, 253, 0.92);
backdrop-filter: blur(10px);
border-bottom: 1px solid var(--border);
}
.dev-main {
padding: 2rem 1rem 3rem;
max-width: 52rem;
min-width: 0;
box-sizing: border-box;
}
.top-nav__inner--doc {
min-width: 0;
}
.action-btn--compact {
white-space: nowrap;
max-width: min(100%, 14rem);
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640px) {
.top-nav__inner--doc {
gap: 0.45rem;
}
.action-btn--compact {
max-width: 9.5rem;
font-size: 0.74rem;
padding: 0.35rem 0.5rem;
}
.lang-toggle {
font-size: 0.72rem;
padding: 0.3rem 0.55rem;
}
}
.dev-section {
margin-top: 1rem;
padding: 1.15rem 1.25rem;
overflow: visible;
min-width: 0;
}
.dev-skills-title {
margin: 1rem 0 0.5rem;
font-weight: 600;
font-size: 0.92rem;
color: var(--accent);
}
.dev-section--accent {
border-color: color-mix(in srgb, var(--brand) 35%, var(--border));
background: color-mix(in srgb, var(--brand) 4%, var(--surface));
}
.dev-table-wrap {
overflow-x: auto;
max-width: 100%;
-webkit-overflow-scrolling: touch;
margin-top: 0.5rem;
}
.dev-table {
width: 100%;
min-width: 28rem;
border-collapse: collapse;
font-size: 0.84rem;
}
.dev-table th,
.dev-table td {
border: 1px solid var(--border);
padding: 0.45rem 0.55rem;
text-align: left;
vertical-align: top;
word-break: break-word;
}
.dev-table th {
background: var(--surface-2);
color: var(--accent);
font-weight: 600;
}
.dev-table code {
font-size: 0.82em;
word-break: break-all;
}
.dev-section .code-block {
max-width: 100%;
box-sizing: border-box;
}
.code-block--prompt {
font-size: 0.78rem;
line-height: 1.55;
white-space: pre-wrap;
overflow-wrap: anywhere;
word-break: break-word;
}
.dev-title {
font-family: "Space Grotesk", sans-serif;
font-size: clamp(1.75rem, 4vw, 2.35rem);
margin: 0 0 0.75rem;
color: var(--accent);
}
.dev-section h2 {
margin: 0 0 0.65rem;
font-family: "Space Grotesk", sans-serif;
font-size: 1.05rem;
color: var(--accent);
}
.dev-section p,
.dev-section li {
color: var(--text-soft);
line-height: 1.6;
}
.dev-repo-link {
margin-top: 1.5rem;
font-size: 0.9rem;
color: var(--text-soft);
}
.updates-panel {
border: 1px solid var(--border);
border-radius: 1rem;
background: var(--surface);
box-shadow: var(--shadow);
padding: 1.2rem 1.25rem;
}
.updates-heading {
margin: 0 0 0.85rem;
font-family: "Space Grotesk", sans-serif;
font-size: 1.05rem;
color: var(--accent);
}
.news-feed {
list-style: none;
margin: 0;
padding: 0;
display: grid;
gap: 0.9rem;
}
.news-item {
display: grid;
grid-template-columns: 5.5rem 1fr;
gap: 0.75rem;
padding-left: 0.65rem;
border-left: 2px solid color-mix(in srgb, var(--brand) 35%, var(--border));
}
.news-item time {
font-size: 0.76rem;
font-weight: 600;
letter-spacing: 0.02em;
color: var(--brand);
white-space: nowrap;
}
.news-item p {
margin: 0;
font-size: 0.9rem;
line-height: 1.6;
color: var(--text-soft);
}
.news-item a {
color: var(--accent);
font-weight: 600;
text-decoration: underline;
text-underline-offset: 2px;
}
.news-item code {
font-family: "JetBrains Mono", monospace;
font-size: 0.78rem;
padding: 0.1rem 0.35rem;
border-radius: 0.35rem;
background: color-mix(in srgb, var(--brand) 8%, var(--surface-2));
}
.todo-groups {
display: grid;
gap: 0.85rem;
}
.todo-group h4 {
margin: 0 0 0.45rem;
font-size: 0.82rem;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--text-soft);
}
.todo-list {
list-style: none;
margin: 0;
padding: 0;
display: grid;
gap: 0.4rem;
}
.todo-list li {
display: flex;
align-items: flex-start;
gap: 0.55rem;
font-size: 0.88rem;
line-height: 1.55;
color: var(--text-soft);
}
.todo-check {
flex-shrink: 0;
width: 0.95rem;
height: 0.95rem;
margin-top: 0.2rem;
border: 1.5px solid color-mix(in srgb, var(--brand) 55%, var(--border));
border-radius: 0.22rem;
background: color-mix(in srgb, var(--brand) 6%, var(--surface));
}
.todo-list li.is-done {
color: color-mix(in srgb, var(--text) 72%, var(--text-soft));
}
.todo-check.is-done {
border-color: var(--brand);
background: var(--brand);
position: relative;
}
.todo-check.is-done::after {
content: "";
position: absolute;
left: 0.18rem;
top: 0.12rem;
width: 0.35rem;
height: 0.55rem;
border: solid #fff;
border-width: 0 1.5px 1.5px 0;
transform: rotate(45deg);
}
/* BibTeX */
.pub-meta {
display: grid;
gap: 0.55rem;
margin: 1.25rem 0 1.75rem;
padding: 1rem 1.1rem;
border: 1px solid var(--border);
border-radius: 1rem;
background: color-mix(in srgb, var(--surface) 82%, transparent);
box-shadow: var(--shadow);
max-width: 36rem;
}
.pub-meta__row {
display: grid;
grid-template-columns: 7.5rem 1fr;
gap: 0.75rem;
align-items: baseline;
font-size: 0.9rem;
}
.pub-meta dt {
margin: 0;
font-weight: 600;
color: var(--text-soft);
}
.pub-meta dd {
margin: 0;
color: var(--text);
}
.pub-meta a {
color: var(--accent);
font-weight: 600;
text-decoration: underline;
text-underline-offset: 2px;
}
.bibtex-heading {
margin: 1.5rem 0 0.65rem;
font-family: "Space Grotesk", sans-serif;
font-size: 1rem;
font-weight: 600;
color: var(--text);
}
.cite-switcher {
margin-top: 1.25rem;
max-width: 52rem;
}
.cite-chips {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-bottom: 1rem;
}
.cite-chip {
border: 1px solid var(--border);
border-radius: 999px;
padding: 0.45rem 0.9rem;
background: var(--surface);
font-size: 0.82rem;
font-weight: 600;
color: var(--text-soft);
cursor: pointer;
transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}
.cite-chip.is-active,
.cite-chip:hover {
color: #fff;
background: var(--brand);
border-color: var(--brand);
}
.cite-panel {
animation: citeFadeIn 0.25s ease;
}
@keyframes citeFadeIn {
from {
opacity: 0;
transform: translateY(6px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.bibtex-wrap {
position: relative;
margin-top: 1rem;
width: 100%;
max-width: 52rem;
margin-inline: auto;
text-align: left;
}
.copy-btn {
position: absolute;
top: 0.75rem;
right: 0.75rem;
z-index: 1;
border: 1px solid var(--border);
background: var(--surface);
border-radius: 0.45rem;
padding: 0.25rem 0.55rem;
font-size: 0.75rem;
font-weight: 600;
color: var(--accent);
cursor: pointer;
transition: background 0.2s ease, color 0.2s ease;
}
.copy-btn:hover {
border-color: color-mix(in srgb, var(--brand) 50%, var(--border));
}
.copy-btn.is-copied {
color: #fff;
background: var(--brand);
border-color: var(--brand);
}
.bibtex {
margin: 0;
padding: 1rem 1.1rem;
border: 1px solid var(--border);
border-radius: 1rem;
background: var(--surface);
box-shadow: var(--shadow);
font-family: "JetBrains Mono", monospace;
font-size: 0.78rem;
line-height: 1.5;
overflow-x: auto;
}
.bibtex code {
font-family: inherit;
}
/* Footer */
.footer {
position: relative;
padding: 2rem 0 2.5rem;
background: color-mix(in srgb, var(--surface) 75%, transparent);
}
.footer::before {
content: "";
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
width: min(1120px, calc(100% - 2rem));
height: 1px;
background: linear-gradient(
90deg,
transparent 0%,
color-mix(in srgb, var(--brand) 18%, var(--border)) 18%,
color-mix(in srgb, var(--brand) 18%, var(--border)) 82%,
transparent 100%
);
opacity: 0.85;
}
.footer-row {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.footer-copy {
margin: 0;
color: var(--text-soft);
font-size: 0.88rem;
}
.footer-links {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.footer-links a {
color: var(--accent);
font-size: 0.88rem;
font-weight: 600;
text-decoration: none;
}
.footer-links a:hover {
text-decoration: underline;
}
/* Responsive */
@media (max-width: 1180px) {
.nav-links .nav-link {
padding: 0.3rem 0.32rem;
font-size: 0.76rem;
}
.action-btn--ghost {
display: none;
}
}
@media (max-width: 1080px) {
.nav-links {
display: none;
}
.nav-toggle {
display: flex;
}
.slide-dots {
display: none;
}
}
@media (max-width: 1024px) {
.feature-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.feature-grid--three {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.demo-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.updates-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 760px) {
.top-nav__inner {
padding: 0.65rem 0;
min-height: auto;
}
.lang-toggle {
font-size: 0.72rem;
padding: 0.3rem 0.55rem;
}
.metrics-grid,
.metrics-grid--duo,
.feature-grid,
.feature-grid--three,
.demo-grid {
grid-template-columns: 1fr;
}
.section {
padding: 3.4rem 0;
}
.hero-cta-group .cta {
width: 100%;
}
.footer-row {
flex-direction: column;
align-items: flex-start;
}
.news-item {
grid-template-columns: 1fr;
gap: 0.25rem;
}
}
.table-wrap {
overflow-x: auto;
margin: 1.25rem 0 1.5rem;
border: 1px solid var(--border);
border-radius: 0.75rem;
background: var(--surface);
}
.ckpt-table {
width: 100%;
border-collapse: collapse;
font-size: 0.88rem;
}
.ckpt-table th,
.ckpt-table td {
padding: 0.65rem 0.85rem;
text-align: left;
border-bottom: 1px solid var(--border);
vertical-align: top;
}
.ckpt-table th {
font-size: 0.75rem;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--muted);
background: color-mix(in srgb, var(--surface) 88%, var(--accent) 12%);
}
.ckpt-table tbody tr:last-child td {
border-bottom: none;
}
.ckpt-table code {
font-family: var(--font-mono, "JetBrains Mono", monospace);
font-size: 0.78rem;
word-break: break-all;
}
.code-block-wrap {
margin: 1rem 0;
}
.code-block-label {
margin: 0 0 0.35rem;
font-size: 0.78rem;
font-weight: 600;
letter-spacing: 0.03em;
text-transform: uppercase;
color: var(--muted);
}
.code-block {
margin: 0;
padding: 0.9rem 1rem;
border-radius: 0.65rem;
border: 1px solid var(--border);
background: color-mix(in srgb, var(--surface) 92%, #000 8%);
overflow-x: auto;
font-family: var(--font-mono, "JetBrains Mono", monospace);
font-size: 0.82rem;
line-height: 1.5;
}
.section-note {
margin-top: 1rem;
font-size: 0.92rem;
color: var(--muted);
max-width: 42rem;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
scroll-snap-type: none;
}
.ambient-orb,
.ambient-shimmer,
.page-shell::before {
animation: none;
}
.reveal {
opacity: 1;
transform: none;
transition: none;
}
.ambient-orb {
opacity: 0.35;
}
.cta:hover,
.metric-card:hover,
.action-btn:hover,
.card--accent:hover,
[data-zoomable]:hover img,
.back-top:hover {
transform: none;
}
}