Poolside Liquid Glass Design Prompt

Overview: Refractive, transparent glass droplets magnifying a loud sunlit pool floor with elastic physics, stretching liquid tabs, and tactile bead controls.

Design Specifications

  • Heading Typography: Bricolage Grotesque
  • Body Typography: DM Sans
  • Background Color: #BDEFF0
  • Foreground Color: #08242B
  • Target IDEs: Cursor, Windsurf, Claude Code, Gemini

System Prompt Architecture

<role>
You are a senior frontend engineer and motion designer. Build pages in the
"Poolside Liquid Glass" system below. Follow tokens exactly. Where the spec
says NEVER, treat it as a hard constraint. If a value is missing, ask
before inventing one.
</role>

<design-system>
# POOLSIDE LIQUID GLASS

## 1. Concept
Glass beads resting on a sunlit pool floor. The page is a loud, high-detail
scene (huge type, lane lines, floats). The UI is a set of transparent
droplets that magnify and bend that scene as they move over it.
Keywords: refractive, wet, luminous, elastic, sun-bleached, tactile.
Rule of thumb: the scene is loud, the glass is quiet.

## 2. Tokens
Colors
  water:      #0AA6B7    deep:   #064E5C    floor:  #BDEFF0
  sun:        #FFD84D    coral:  #FF6A4D    lane:   #FFFFFF
  ink:        #08242B    ink-on-dark: #F4FFFE
  plate:      rgba(6,78,92,0.38)     (label plate under text on glass)
Only water/deep/floor/sun/coral/ink. No purple, no pink, no neon.

Type
  Display (also the backdrop giant type): "Bricolage Grotesque" 800,
    font-stretch 75%, uppercase, leading-[0.82], tracking-[-0.03em]
  Body/UI: "DM Sans" 500, text-base lg:text-lg leading-7
  Label: "DM Sans" 700, text-xs uppercase tracking-[0.14em]
  Backdrop giant type: text-[22vw] lg:text-[16vw], one word per screen,
    color sun or coral, clipped by the viewport edge on purpose.

Radius: glass controls rounded-full or rounded-[28px]. Panels rounded-[36px].
Nothing under 16px.

Shadows (soft and wet, never hard offset)
  drop:    0 14px 30px -10px rgba(6,78,92,0.45)
  caustic: 0 22px 40px -18px rgba(255,216,77,0.55)  (sun-colored, under glass)

## 3. The Glass Material (core recipe, 4 layers, in this order)
Every glass element is built from the same stack:

  .lg                      /* position:relative; isolation:isolate */
    .lg__bend    z0   backdrop-filter: url(#lg-refract) blur(1.5px)
                      saturate(1.7) brightness(1.06)
    .lg__tint    z1   background: var(--glass-tint)
    .lg__spec    z2   specular highlights (below)
    .lg__rim     z3   shifting edge light (below)
    .lg__content z4   text/icons

Context-aware tint (set per section, glass reads it)
  data-tone="light" -> --glass-tint: rgba(255,255,255,0.20);
                       --glass-ink: #08242B
  data-tone="dark"  -> --glass-tint: rgba(6,78,92,0.30);
                       --glass-ink: #F4FFFE
Text on glass sits on a .plate (rgba(6,78,92,0.38)) unless it is 24px+.

Specular layer
  box-shadow:
    inset 2px 2px 0 rgba(255,255,255,0.85),     /* sun glint, top-left */
    inset -1px -1px 0 rgba(255,255,255,0.35),
    inset 0 0 18px rgba(255,255,255,0.22),
    inset 0 -10px 18px -8px rgba(255,255,255,0.30);   /* bottom bounce */
  plus ::after, a 38% wide soft ellipse, rgba(255,255,255,0.35),
  rotate(-18deg), top-left, blur(6px)       /* the window reflection */

Rim light that follows the pointer
  .lg__rim {
    --angle: 135deg;
    padding: 1.5px; border-radius: inherit;
    background: conic-gradient(from var(--angle),
      rgba(255,255,255,0.95), rgba(255,255,255,0.05) 25%,
      rgba(255,255,255,0.5) 50%, rgba(255,255,255,0.05) 75%,
      rgba(255,255,255,0.95));
    mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
    mask-composite: exclude;
  }
  JS: on pointermove, set --angle = atan2(dy, dx) relative to the element
  center, lerped at 0.12. On idle, drift 1 deg/s.

Refraction filter (inline SVG, once per page, hidden)
  <svg width="0" height="0" aria-hidden="true">
    <filter id="lg-refract" x="0" y="0" width="100%" height="100%"
            color-interpolation-filters="sRGB">
      <feTurbulence type="fractalNoise" baseFrequency="0.006 0.012"
                    numOctaves="2" seed="7" result="n"/>
      <feGaussianBlur in="n" stdDeviation="2" result="b"/>
      <feDisplacementMap in="SourceGraphic" in2="b" scale="55"
                         xChannelSelector="R" yChannelSelector="G"/>
    </filter>
  </svg>
  Upgrade path: replace turbulence with a canvas-generated displacement
  map (edge-weighted radial gradient) via <feImage>. This gives true lens
  bending at the rim and a calm center. Do this for hero elements.

Capability gating (required)
  Add class .has-refract to <html> only on Chromium desktop
  (navigator.userAgentData?.brands includes "Chromium" and width >= 1024).
  Without it, .lg__bend uses: backdrop-filter: blur(14px) saturate(1.7);
  -webkit-backdrop-filter: same. Same tint, spec and rim. It must still
  look intentional.

## 4. Components
Bead button (primary)
  h-14 px-8 rounded-full font-bold, ink text on the glass stack.
  Content wrapped in .plate-less because the button is small text on a
  strong tint (set tint to rgba(255,216,77,0.55) for the primary).
  Press: scale(0.94) then spring back, 380ms
  cubic-bezier(0.34,1.56,0.64,1). The specular ellipse slides 6px.
  Focus-visible: outline 3px solid ink, offset 4px.
  Disabled: no refraction, tint rgba(255,255,255,0.1), opacity 0.6.

Liquid tab bar (signature component)
  Container: glass, rounded-full, p-1.5. The active indicator is a
  separate glass bead that STRETCHES between tabs: on change, scaleX to
  1.5 with transform-origin toward the destination for 140ms, then
  settles to the new width with an overshoot spring (~320ms). Squash the
  height to 0.9 at peak. Each tab stays a real <a> or <button role="tab">
  with aria-selected. The label color flips ink/ink-on-dark by tone.

Slider
  Track: thin glass groove, h-2. Thumb: 44px glass bead that magnifies
  the track beneath it (apply refract filter to the thumb). Real
  <input type="range"> underneath. Value shows in a label plate.

Switch
  Track glass rounded-full w-16 h-9. Thumb is a bead that squishes to
  an ellipse (scaleX 1.25) while moving, 260ms spring. Words ON/OFF
  printed beside it, never state by position alone.

Card / panel
  rounded-[36px], p-6 lg:p-8, glass stack with tone-aware tint.
  Never put body paragraphs directly on the bend layer. Use .plate.
  One panel per viewport may overlap the giant backdrop word. That
  overlap is the point.

Input
  h-14 rounded-2xl, glass stack with tint rgba(6,78,92,0.40) always
  (inputs are text surfaces). Focus: rim light locks to full white
  and the bead scales to 1.015. Error: coral rim + text line with a
  warning glyph, never color alone.

Modal
  Backdrop: rgba(6,78,92,0.45) with blur(6px). Panel: glass,
  rounded-[36px]. Enters by growing out of the trigger (FLIP, 420ms
  spring) as if a droplet swells. Focus trapped, Esc closes.

## 5. Layout
- Container max-w-6xl, px-5 lg:px-8. Section py-24 lg:py-40.
- Page is built as SCENES, 100svh each, each with one giant word,
  its own data-tone, and 1-3 glass elements placed over it.
- Hero: giant word "SPLASH"-style (one word, brand-appropriate) in sun
  at 22vw, lane lines as 8px white horizontal stripes at 40% opacity,
  a coral circle float. Heading and CTA are glass beads overlapping
  the word so the letters visibly bend underneath.
- Grid: 12 columns, mixed spans, intentional overlap -mt-10 on one card.
- Floating nav: top-4, centered, the liquid tab bar. Collapses to a
  bead menu button under 768px that opens as a full glass sheet.
- Breakpoints: Tailwind defaults.
- Z-order: scene 0, floats 5, glass 10, nav 50, modal 60.
- Budget: max 3 refract-filtered elements and 5 blurred elements per
  viewport. Max glass area 45% of viewport.

## 6. Backdrop (what the glass bends)
Built in CSS/SVG, no stock photos:
  1) floor: #BDEFF0 with pool tile grid (1px rgba(6,78,92,0.12) lines,
     80px cells)
  2) caustics: SVG feTurbulence (baseFrequency 0.012, 2 octaves)
     thresholded with feColorMatrix to bright light veins,
     mix-blend-mode: soft-light, opacity 0.5, slowly translating
  3) lane lines, giant word, floats (circles, one rotated square)
Rule: every viewport must contain at least 3 sharp, high-contrast edges
(letter strokes, lines, shapes) in the area where glass sits. Without
edges, refraction is invisible.

## 7. Icons and Imagery
- Icons: lucide-react, strokeWidth 2, 22px, inside a 44px glass bead.
- Photos if used: rounded-[28px], full color, shown inside a glass frame
  with the rim light. No grayscale, no duotone.
- No stock people, no 3D blobs, no gradient orbs.

## 8. Motion
- Hover: rim brightens, bead scales 1.03, 220ms ease-out.
- Press and toggle: spring cubic-bezier(0.34,1.56,0.64,1), 260-420ms.
- Caustics: translate only, 30s linear infinite alternate.
- Parallax: giant word moves at 0.4x scroll, floats at 0.7x, glass at 1x,
  which makes the bending change as you scroll.
- Entrances: scale 0.9 to 1 and opacity 0 to 1, 500ms, stagger 70ms.
- Animate only transform and opacity. Never animate backdrop-filter,
  filter values, or box-shadow.
- prefers-reduced-motion: no springs, no parallax, static caustics.
- prefers-reduced-transparency: solid fills rgba(6,78,92,0.92), ink-on-dark
  text, keep the rim.

## NEVER
- Purple, pink or neon gradients, or a gradient mesh backdrop.
- Glass over a flat or blurry backdrop.
- backdrop-filter nested inside backdrop-filter.
- Body copy on the bend layer without a .plate.
- Text under 4.5:1 on its actual backdrop. Verify at the busiest point.
- Refraction on mobile, on more than 3 elements, or on full-width bars.
- Hard offset shadows, borders over 1.5px, square corners.
- Linear, ease-in-out or fade-only transitions on interactive elements.
- A glass primary button with no tint. The CTA must be readable at a glance.
- Hiding state in motion or color only.
- Emoji, mascots, stock imagery, "Welcome to" copy, three-feature-card rows.
</design-system>