Ballmac UI home

Laptop Frame

A notched aluminium laptop drawn in CSS that scales with its container. Renders children, an image or a video as the screen, and can open its lid when it scrolls into view.

Right-to-left: Hardware buttons and bezels sit on fixed physical edges of the device, so the frame keeps its shape; the screen content you place inside follows the page direction.

AcmeFileViewTue 9:41

Overview

Last 30 days · all regions

Search⌘K

Revenue

$48,290

+12.4%

Active users

9,214

+5.1%

p95 latency

182 ms

−8 ms

RevenueUSD
api-gatewayiad12m agoReady
web-dashboardfra114m agoReady
billing-workersfo11h agoReady

Installation

$ pnpm dlx shadcn@latest add @ballmac/laptop-frame

Usage

import { LaptopFrame } from "@/components/ballmac/laptop-frame"

The full example is in the Code tab above.

Examples

Midnight, opens on scroll

route.tsauth.tsmeter.ts

app

api

route.ts

lib

auth.ts

meter.ts

1export default async function handler(req) {
2 const session = await auth(req)
3 if (!session) return unauthorized()
4
5 const usage = await meter.read(session.org)
6 return Response.json({ usage, plan: session.plan })
7}
✓ Compiled in 212 ms · 0 type errors

API reference

PropTypeDefault
children

Screen content. Ignored when `src` or `videoSrc` is set.

React.ReactNode—
variant

Finish of the aluminium. "auto" is silver in light mode and midnight in dark mode.

"auto" | "silver" | "midnight""auto"
src

Image shown on the screen, cropped to fill it.

string—
alt

Alternative text for `src`.

string—
videoSrc

Video shown on the screen: muted, looping, and paused under reduced motion.

string—
poster

Poster image for `videoSrc`.

string—
screenWidth

Width in CSS pixels that the screen content is laid out at; it is then scaled to fit the screen, like a real display resolution. Omit to lay content out at the frame's actual size.

number—
openAnimation

Opens the lid: "in-view" plays once when the laptop scrolls into view, "scroll" ties the hinge to scroll position. Reduced motion always shows the laptop open.

"none" | "in-view" | "scroll""none"
screenClassName

Class names for the screen element (the area inside the bezel).

string—

Also accepts the standard attributes of its root element.

Use with AI

Wrap a product screen in <LaptopFrame>: children become the display. Pass screenWidth (e.g. 1280) to lay the content out at a desktop resolution and scale it down to fit; openAnimation="in-view" or "scroll" swings the lid open. With the shadcn MCP server set up (guide), ask your agent:

Add the Ballmac UI Laptop Frame (@ballmac/laptop-frame) to this project with the shadcn MCP, then use it where it fits.

Use it for

  • Landing-page heroes that show a desktop or web app in context
  • Feature sections with a live React screen instead of a static screenshot
  • Scroll-driven product reveals (openAnimation="scroll")

Not for

  • Showing a website with its URL and browser chrome (use browser-frame)
  • Mobile app screens (use phone-frame)

Registry JSON: https://ui.ballmac.com/r/laptop-frame.json

Credits

Free to use in personal and commercial projects.