# Design Language for xanadu.science

## Aesthetics and Tone

Xanadu.science channels the mythic grandeur of Coleridge's "Kubla Khan" — a place of measureless scientific wonder, where empirical rigor dissolves into the visionary. The aesthetic is **neomorphic dark science**: soft-shadow depth modeling applied to a near-black canvas, creating surfaces that appear carved from obsidian rather than flat on glass. Every element breathes with physicality — buttons feel pressable, panels feel lifted, text feels embossed into the void.

The mood is **bold-confident** without arrogance: the atmosphere of a scientist who has discovered something extraordinary and knows it. Not boastful — inevitable. The site communicates mastery through restraint and scale. Oversized typographic moments anchor the scroll, while atmospheric candlelight-warm accents flicker against cold deep backgrounds.

Inspiration draws from: deep-sea research vessel interiors, CERN's underground chambers photographed at night, 17th-century alchemist manuscripts, the visual language of particle collision visualizations, and the warm glow of antique scientific instruments in museum displays. Science as ritual. Discovery as ceremony.

The duotone palette enforces chromatic discipline — only two hue families exist in the entire visual system, creating an almost sacred restraint that makes every color choice feel deliberate and meaningful.

## Layout Motifs and Structure

The layout is a single continuous **immersive scroll narrative** — no pages, no modals, no separate sections breaking the spell. The viewport is treated as a cinematic frame moving through space, not a container holding content.

**Vertical rhythm architecture:**
- Each scroll chapter occupies 100-150vh, demanding full presence before advancing
- Content is positioned asymmetrically: first chapter anchors text bottom-left, second shifts to upper-right, creating diagonal eye movement across the scroll
- Organic blob shapes bleed beyond viewport edges — suggesting an infinite, living environment beyond the frame
- Neomorphic floating panels appear mid-scroll as if materialized from the background, with inset shadows on one side and raised shadows on the opposite

**Spatial relationships:**
- Generous negative space (never empty — always atmospheric): 80px minimum margins, 160px chapter padding
- Text and blobs operate on separate z-layers: blobs occupy z-index 0-5 in background, text sits at z-index 20, floating panels at z-index 10-15
- Horizontal rule separators replaced by subtle neomorphic dividers — thin ridges in the surface
- No grid columns in the traditional sense; instead, content follows organic positioning anchored to blob boundaries

**Scroll choreography:** Content doesn't just appear on scroll — it enters from the precise direction its blob is flowing toward, as if carried on thermal currents of the atmosphere.

## Typography and Palette

### Typefaces

**Display: Bebas Neue** (Google Fonts)
- Primary headline weight, all-caps, letter-spacing 0.08em to 0.15em
- Used at extreme scales: 12vw for hero, 8vw for chapter headers
- The condensed geometry of Bebas against organic blob forms creates productive tension

**Secondary: DM Serif Display** (Google Fonts)
- Italic variant for subheadings and atmospheric pull-quotes
- Creates a classical-scientific contrast against the brutalist Bebas

**Body: DM Sans** (Google Fonts)
- Regular 400 for body copy, Medium 500 for labels
- Clean, modern legibility against dark backgrounds
- Letter-spacing 0.02em for air

**Accent: Bebas Neue** used sparingly at small scale (14-16px) for data labels and navigation — creates a unified typographic system

### Color Palette (Duotone System)

The two hue families are **deep amber-cognac** and **near-black indigo**. All colors derive from these two ancestral hues.

**Indigo Family (Background/Structure):**
- `#0A0A14` — void black-indigo, primary background
- `#0F0F20` — lifted surface (neomorphic elevated panels)
- `#07070F` — pressed inset (neomorphic recessed elements)
- `#1A1A35` — soft ambient layer, blob fill undertone
- `#2A2A50` — subtle border, ridge highlight

**Amber-Cognac Family (Light/Accent):**
- `#C8860A` — primary amber, primary text and key accents
- `#E8A020` — highlight amber, hover states, glow sources
- `#8B5A06` — shadow amber, dark amber for depth gradients
- `#F5C842` — electric gold, used sparingly for maximum impact moments

**Neomorphic Shadow Pair:**
- Light shadow: `rgba(42, 42, 80, 0.6)` — the "raised" shadow direction
- Dark shadow: `rgba(4, 4, 10, 0.9)` — the "pressed" shadow direction

**Text:**
- `#D4A843` — primary body text (warm amber on dark field)
- `#F0E8C8` — near-white for maximum contrast moments

## Imagery and Motifs

### Organic Blob Architecture

Blobs are the primary visual element — not decorative, but structural. They define space, guide eye movement, and serve as atmospheric mood carriers. All blobs are:

- SVG-rendered with `border-radius` constructed via CSS `clip-path` using `path()` with cubic Bezier curves — never simple `border-radius` shortcuts
- Semi-transparent fills: `rgba(200, 134, 10, 0.08)` for amber blobs, `rgba(26, 26, 53, 0.6)` for indigo blobs
- Equipped with a CSS `filter: blur(60px)` outer aura, and a sharper inner core at `blur(0px)` — creating dual-layer blob depth
- Slowly rotating (60-120s CSS keyframe animation, very subtle 3-5° rotation arc)
- Three size classes: Mega (60-80vw), Macro (30-50vw), Micro (10-20vw)

### Candle-Atmospheric Motifs

The candle motif manifests not as literal candles but as **light behavior**: warm pooling glows, flickering vignette pulses, radial gradients suggesting a single-point heat source. Specific implementations:

- **Glow halos** around key text elements: CSS `text-shadow` with layered amber values at 0px blur, 4px blur, 20px blur, 60px blur — simulating candlelight bloom
- **Flame flicker** on scroll-triggered moments: CSS keyframe animation that oscillates `opacity` between 0.7-1.0 and `filter: brightness()` between 0.9-1.1 at irregular intervals (using `animation-timing-function: steps()` for authentic flicker)
- **Vignette burn**: radial-gradient overlay from transparent center to `rgba(0,0,0,0.4)` at edges, as if the viewport itself is the burning zone of a dark room
- **Warm breath**: subtle `box-shadow` on neomorphic panels includes a distant amber glow: `0 0 80px rgba(200, 134, 10, 0.06)`

### Neomorphic Surface Language

- All interactive panels use the dual-shadow neomorphic formula: `box-shadow: -6px -6px 12px rgba(42, 42, 80, 0.5), 6px 6px 12px rgba(4, 4, 10, 0.9)`
- Pressed/active states invert the shadows for tactile feedback
- Borders are never used — depth is communicated entirely through shadow
- Surface texture: subtle `background-image: url("data:image/svg+xml...")` noise pattern at 3% opacity for grain

### Decorative Elements

- Thin amber line etchings suggesting scientific notation (atomic orbital paths, DNA double-helix fragments, Fibonacci spirals) rendered as SVG `stroke` paths at low opacity (0.15-0.25)
- Particle field: 30-50 tiny `<div>` dots (2-3px) in amber scattered across the background layer, animated with slow drift — suggesting a cloud chamber visualization
- Chapter transition: a horizontal amber line that draws itself across the viewport (SVG stroke-dashoffset animation) before the next section bounces into place

## Prompts for Implementation

### Core Architecture

Build as a single `index.html` with all CSS in a `<style>` block and all JS in a `<script>` block at the bottom. No frameworks. No build tools. Pure craft.

```
Structure:
<body>
  <div class="void-canvas">          <!-- Fixed background layer -->
    <div class="particle-field">     <!-- Ambient particles -->
    <div class="blob-layer">         <!-- All organic blobs -->
  </div>
  <main class="scroll-narrative">
    <section class="chapter" id="ch-*">  <!-- Each scroll chapter -->
  </main>
</body>
```

### Neomorphic Surface CSS

Every floating panel must use this exact formula, adapted for depth context:

```css
.neo-panel {
  background: #0F0F20;
  box-shadow:
    -8px -8px 16px rgba(42, 42, 80, 0.5),
     8px  8px 16px rgba(4, 4, 10, 0.95),
     0 0 80px rgba(200, 134, 10, 0.05);
  border-radius: 20px;
}
.neo-panel.pressed {
  box-shadow:
     8px  8px 16px rgba(42, 42, 80, 0.5),
    -8px -8px 16px rgba(4, 4, 10, 0.95),
    inset 0 0 40px rgba(4, 4, 10, 0.3);
}
```

### Bounce-Enter Animation System

All content enters viewport with a bounce that communicates physical mass — heavier elements bounce less, lighter elements bounce more:

```css
@keyframes bounce-enter {
  0%   { transform: translateY(60px); opacity: 0; }
  60%  { transform: translateY(-12px); opacity: 0.9; }
  80%  { transform: translateY(6px); opacity: 1; }
  95%  { transform: translateY(-3px); }
  100% { transform: translateY(0); opacity: 1; }
}

@keyframes bounce-enter-heavy {
  0%   { transform: translateY(40px); opacity: 0; }
  65%  { transform: translateY(-6px); opacity: 0.95; }
  85%  { transform: translateY(3px); opacity: 1; }
  100% { transform: translateY(0); opacity: 1; }
}

/* Headlines use heavy variant; body panels use standard */
.chapter-headline { animation: bounce-enter-heavy 0.9s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; }
.neo-panel        { animation: bounce-enter 0.7s cubic-bezier(0.34, 1.56, 0.64, 1) forwards; }
```

Use IntersectionObserver to trigger `.is-visible` class: elements only animate when entering viewport, never on page load.

```javascript
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('is-visible');
      observer.unobserve(entry.target); // animate once only
    }
  });
}, { threshold: 0.15 });
document.querySelectorAll('[data-bounce]').forEach(el => observer.observe(el));
```

### Bebas Neue Typographic Scale

```css
@import url('https://fonts.googleapis.com/css2?family=Bebas+Neue&family=DM+Serif+Display:ital@1&family=DM+Sans:wght@400;500&display=swap');

:root {
  --font-display: 'Bebas Neue', sans-serif;
  --font-serif: 'DM Serif Display', serif;
  --font-body: 'DM Sans', sans-serif;

  --scale-hero: clamp(72px, 12vw, 180px);
  --scale-chapter: clamp(48px, 8vw, 120px);
  --scale-label: clamp(12px, 1.5vw, 16px);
}

.hero-text {
  font-family: var(--font-display);
  font-size: var(--scale-hero);
  letter-spacing: 0.12em;
  color: #C8860A;
  text-shadow:
    0 0 4px rgba(200, 134, 10, 0.8),
    0 0 20px rgba(200, 134, 10, 0.4),
    0 0 60px rgba(200, 134, 10, 0.15);
  line-height: 0.9;
}
```

### Candle Flicker Implementation

```css
@keyframes candle-flicker {
  0%, 100% { opacity: 1; filter: brightness(1); }
  7%        { opacity: 0.92; filter: brightness(0.94); }
  13%       { opacity: 0.98; filter: brightness(1.02); }
  27%       { opacity: 0.88; filter: brightness(0.92); }
  43%       { opacity: 1; filter: brightness(1.04); }
  61%       { opacity: 0.94; filter: brightness(0.97); }
  78%       { opacity: 0.97; filter: brightness(1.01); }
  89%       { opacity: 0.91; filter: brightness(0.95); }
}

.flicker-glow {
  animation: candle-flicker 4s steps(1) infinite;
}
/* Apply to the amber text-shadow source, not the text itself */
.chapter-headline::after {
  content: '';
  position: absolute;
  /* Glow layer behind text */
  animation: candle-flicker 3.7s steps(1) infinite;
}
```

### Blob Layer CSS

```css
.blob {
  position: absolute;
  border-radius: 40% 60% 55% 45% / 45% 40% 60% 55%;
  filter: blur(50px);
  animation: blob-drift linear infinite;
  will-change: transform;
}

@keyframes blob-drift {
  0%   { transform: translate(0, 0) rotate(0deg) scale(1); }
  33%  { transform: translate(2%, 1.5%) rotate(2deg) scale(1.02); }
  66%  { transform: translate(-1.5%, 2%) rotate(-1.5deg) scale(0.98); }
  100% { transform: translate(0, 0) rotate(0deg) scale(1); }
}

.blob-mega-amber {
  width: 70vw; height: 60vw;
  background: radial-gradient(ellipse, rgba(200, 134, 10, 0.12) 0%, rgba(200, 134, 10, 0.02) 60%, transparent 80%);
  animation-duration: 90s;
}

.blob-macro-indigo {
  width: 45vw; height: 40vw;
  background: radial-gradient(ellipse, rgba(26, 26, 53, 0.7) 0%, rgba(26, 26, 53, 0.2) 50%, transparent 70%);
  animation-duration: 70s;
}
```

### Scroll Chapter Narrative Structure

**Chapter 1 — The Void Opens (Hero)**
- Full-screen. Background: pure `#0A0A14`.
- Mega amber blob drifts in top-left quadrant.
- Hero text: "XANADU" in Bebas at 12vw, bottom-left position.
- Subtitle in DM Serif Display italic: *"where science becomes myth"* — small, amber, below the headline.
- Vertical amber line (2px wide) running full height on far right, animated draw-in on load.

**Chapter 2 — The Discovery (About/Mission)**
- 130vh height. Neomorphic panel floats center-right, containing body text.
- Panel enters with `bounce-enter` on scroll.
- Micro blobs orbit around panel (absolute positioned, slower drift speed).
- Etched SVG orbital path decoration behind panel.

**Chapter 3 — The Method (Process/Approach)**
- Three neomorphic cards in asymmetric arrangement (not grid — staggered vertically with overlap).
- Each card bounces in with 150ms stagger delay.
- Cards have amber `::before` pseudo-element pulse glow on hover.
- Chapter headline in Bebas at 8vw draws from left (translateX animation).

**Chapter 4 — The Phenomenon (Featured Work/Showcase)**
- Dark showcase zone. Electric gold `#F5C842` appears here for the first time (maximum impact).
- Large chapter heading lights up with full candle-flicker glow effect.
- Content block uses the most dramatic blob composition — macro indigo blob + mega amber blob in near-collision arrangement.

**Chapter 5 — The Contact (Closing)**
- Returns to pure void aesthetic.
- Single neomorphic contact form or CTA, minimal — no pricing, no stats, no bullets.
- Amber particle field density increases toward footer (JS-driven).
- Final text: large Bebas "REACH INTO THE UNKNOWN" with maximum amber text-shadow glow.

### Particle Field Implementation

```javascript
function createParticleField(container, count = 40) {
  for (let i = 0; i < count; i++) {
    const p = document.createElement('div');
    p.className = 'particle';
    p.style.cssText = `
      left: ${Math.random() * 100}%;
      top: ${Math.random() * 100}%;
      animation-duration: ${20 + Math.random() * 40}s;
      animation-delay: ${-Math.random() * 30}s;
      opacity: ${0.2 + Math.random() * 0.5};
      width: ${1 + Math.random() * 2}px;
      height: ${1 + Math.random() * 2}px;
    `;
    container.appendChild(p);
  }
}
```

```css
.particle {
  position: absolute;
  background: #C8860A;
  border-radius: 50%;
  animation: particle-drift ease-in-out infinite alternate;
  box-shadow: 0 0 4px rgba(200, 134, 10, 0.6);
}
@keyframes particle-drift {
  from { transform: translate(0, 0); }
  to   { transform: translate(
    calc((var(--rx, 1) - 0.5) * 60px),
    calc((var(--ry, 1) - 0.5) * 60px)
  ); }
}
```

### AVOID in Implementation

- No hero image or background photograph — the blobs ARE the imagery
- No pricing tables, feature comparison grids, or stat counters
- No modal dialogs or off-canvas drawers
- No parallax scroll effects that fight the bounce-enter timing (one scroll direction metaphor only)
- No white or light backgrounds at any scroll depth
- No more than 3 CTA buttons total across the entire scroll narrative
- No carousel/slider components

## Uniqueness Notes

**3+ Differentiators from Other Designs:**

1. **Neomorphic Dark Science Fusion** — Most neomorphic designs use light gray backgrounds (#e0e0e0 palette). This design inverts the paradigm: neomorphic surfaces on near-void black-indigo, with amber glow as the shadow contrast source instead of white. The result is a neomorphism that feels like deep space instruments rather than mobile UI components. No other design in the corpus uses this inversion.

2. **Candle-Flicker as Physics Metaphor** — The flicker animation is not decorative but narrative: it communicates the fragility of discovery, the flickering of a candle in a dark laboratory. The irregular `steps()` timing function (not `ease` or `linear`) creates authentic flame behavior. Combined with the layered text-shadow system, headlines literally glow like heated metal. This is distinct from generic "glow" effects used in neon-electric designs.

3. **Bebas Neue at Extreme Scale Against Organic Blobs** — The collision between the mechanically condensed geometry of Bebas Neue (designed for compressed industrial display) and the biomorphic, irregular blob forms creates a tension that IS the design. Scientific precision versus organic chaos — the content theme externalized in pure form relationships.

4. **Bounce-Enter as Gravitational Metaphor** — Rather than generic fade-up scroll animations, the bounce-enter system implies that content has *mass* and responds to gravitational forces as it enters the visible field. Heavier panels have smaller bounces (less elastic); lighter text elements have more exaggerated bounces. This creates a convincing physics-world that reinforces the scientific domain.

5. **Duotone Absolute Discipline** — The strict two-hue family constraint (amber-cognac and indigo-void) means the color system is entirely self-consistent. No accent colors escape these families. When the electric gold `#F5C842` appears in Chapter 4, it lands as a genuine revelation — the only moment of maximum saturation in an otherwise amber-subdued palette. This delayed payoff is a deliberate narrative device.

**Chosen Seed:** aesthetic: neomorphism, layout: immersive-scroll, typography: bebas-bold, palette: duotone, patterns: bounce-enter, imagery: organic-blobs, motifs: candle-atmospheric, tone: bold-confident

**Avoided Overused Patterns (from frequency analysis):**
- `photography` (87% — avoided entirely, blobs replace all photography)
- `minimal` (44% — avoided; this design is rich and atmospheric, not minimal)
- Oversized-display typography (5% — approached differently via mechanical condensed display vs. oversized slab)
- Standard bounce animations (implemented with mass-physics metaphor, not generic bounce)
<!-- DESIGN STAMP
  timestamp: 2026-05-12T01:39:10
  seed: seed:
  aesthetic: Xanadu.science channels the mythic grandeur of Coleridge's "Kubla Khan" — a plac...
  content_hash: d4fe54b11c31
-->
