Browse docsPhone Duo

EffectsNew

Glass Phone Duo

A folding glass phone with flat screen content, an outer display, and a smooth titanium frame.

pnpm dlx shadcn@4.14.1 add @glassyui/glass-phone-duo

Preview

ClosedOpen

Demos ready. Update 0.

Installation

First add the exact @glassyui mapping to components.json as shown in Getting Started. Then run the pinned item command:

Install Glass Phone Duo

pnpm dlx shadcn@4.14.1 add @glassyui/glass-phone-duo
What this installs3 files, 1 package

Direct registry declarations

These values belong to @glassyui/glass-phone-duo itself in registry.json.

Package dependencies

  • clsx

Registry dependencies

None declared.

File targets

  • components/glassyui/glass-phone-duo.tsx
  • components/glassyui/lib/phone-duo-renderer.ts
  • components/glassyui/styles/phone-duo.css

Complete installed closure

This follows every namespaced registry dependency recursively and de-duplicates the packages and target files installed with this item.

Package dependencies

  • clsx

Installed files

  • components/glassyui/glass-phone-duo.tsx
  • components/glassyui/lib/phone-duo-renderer.ts
  • components/glassyui/styles/phone-duo.css

Usage

Usage

import { GlassPhoneDuo } from "@/components/glassyui/glass-phone-duo";

export function Showcase() {
  return (
    <GlassPhoneDuo
      className="w-full max-w-2xl"
      screenSrc="/app-landscape.png"
      screenAlt="The app on the unfolded display"
      coverSrc="/app-portrait.png"
      coverAlt="The app on the cover display"
    />
  );
}

Examples

Open and close

const [open, setOpen] = useState(true);

return (
  <>
    <GlassPhoneDuo
      open={open}
      finish="star-white"
      screenSrc="/app-landscape.png"
      coverSrc="/app-portrait.png"
    />
    <button type="button" onClick={() => setOpen(!open)}>
      {open ? 'Close phone' : 'Open phone'}
    </button>
  </>
);
Pose the hinge

<GlassPhoneDuo
  angle={120}
  view="back"
  finish="night-sky"
  screenSrc="/app-landscape.png"
  coverSrc="/app-portrait.png"
/>

API

GlassPhoneDuo

Forward-ref figure containing the WebGL 2 device.

screenSrc

One landscape screenshot for the entire inner OLED. Required; use a 2670:1878 aspect ratio.

coverSrc

Portrait screenshot for the outer display. Required; use a 1398:2034 aspect ratio.

screenAlt / coverAlt

Accessible descriptions of the screenshots. Only the displayed side is announced.

open

Animates the hinge open or closed. Defaults to true.

angle

Manual hinge angle from 0 (closed) to 180 (flat). Overrides open and skips animation for scrubbing.

finish

night-sky or star-white. Defaults to night-sky.

view

front or back. Turning over exposes the horizontal rear cameras. Defaults to front.

glare

A faint reflection across the displays. Defaults to true.

Notes

Screen captures

The screenshot stays on a flat plane while the glass lifts, blurs, and dims above it, just like the website intro. The outer display uses its own capture. Use same-origin or CORS-enabled images. The mockup requires WebGL 2.

Geometry

The body follows the iPhone Duo specifications: 164.6 × 117.8 × 5.2 mm open and 84.1 × 117.8 × 11.3 mm closed. Display proportions follow the specified pixel ratios. Corner radii, camera housing, buttons, and reflections are approximated from Apple’s official product renders.

Accessibility

System and site reduced motion put the hinge and view directly at their destination. Reduced transparency removes reflections. The two displays share one accessible description.

Accessibility

Keep the Radix-backed semantics intact and preserve visible labels, focus states, and keyboard operation when copying the source.

Performance

Use provider quality preferences for dense app screens. Reserve strong refraction for hero or showcase surfaces.