Reusable, pixel-accurate device chrome that any skill can compose into a multi-device or multi-screen layout. Each frame is a self-contained HTML snippet that renders a device shell and embeds its inner screen via an `<iframe src="?screen=...">` query parameter.
The mobile-app skill has a one-screen iPhone frame baked into its seed template. That covers ~80% of mobile prototypes. These shared frames cover the remaining 20%:
- Multi-screen flows β three iPhones side by side showing onboarding 1 / 2 / 3.
- Multi-device sets β desktop + tablet + phone of the same product.
- Future skills β `watch-app`, `tablet-app`, `tv-app` can reuse these without re-inventing the chrome.
``` assets/frames/ βββ README.md β you're reading this βββ iphone-15-pro.html β 390Γ844 + Dynamic Island βββ android-pixel.html β 412Γ900 + punch-hole camera βββ ipad-pro.html β 1024Γ1366 + USB-C edge βββ macbook.html β 1440Γ900 inside laptop chrome βββ browser-chrome.html β Safari/Chrome window with traffic lights ```
Each frame accepts a `?screen=` query parameter and renders that path inside its inner viewport:
```html
<iframe src="../../assets/frames/iphone-15-pro.html?screen=screens/home.html" width="390" height="844" loading="lazy" ></iframe> \`\`\`In an OD-managed project, the recommended pattern is:
``` my-project/ βββ index.html β gallery view: composes 3+ frames in a row βββ screens/ β βββ home.html β inner content rendered inside iphone-15-pro.html β βββ search.html β βββ detail.html βββ (no copy of frames β point at the shared assets folder) ```
Each frame reads its inner screen's tokens via `postMessage` if you want the bezel to tint with the active palette. The default state is "phone in hand" β neutral metallic β which works against any background.
When extending this library:
- No external assets. Inline all SVG. No font imports. No image URLs.
- One frame per file. Don't bundle iPhone + Android in one HTML.
- `?screen=` query is the only contract. Don't introduce other query params; the harness has to be predictable for skills to use.
- The frame is decorative chrome only. All content lives in the inner
screen file. The frame must work with
?screen=about:blank(showing just the device shell). - Match real device dimensions. iPhone 15 Pro is 390Γ844 logical pixels. iPad Pro 11" is 834Γ1194. Don't ship a "looks like" frame β the seed has to match.