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>