All components
03

Model picker

Model/effort dropdown opens, cursor picks, it locks in

Prompt for your agentpaste into Claude Code or Codex
Add the "Model picker" video component (Claude (Opus / Sonnet / Haiku 5.5), light) from everestchris.com to this project.

1. Download https://ai-component-library-dun.vercel.app/projects/model-picker.zip?v=0bbee242a5ee and unzip it into components/model-picker/. Read the README.md and CLAUDE.md in it.
2. Render it: cd components/model-picker && npx hyperframes@0.8.162 render . --variables '{"variant":"1","theme":"light"}' -o model-picker.mp4
3. Give me the path of the MP4. The text, names and timings live in the CONFIG block at the top of the script in index.html; change nothing there unless I ask.

Code

One file. The project download adds the fonts, skins and motion kit it runs on.

index.htmlhtmlDownload
1<!doctype html>
2<html lang="en" data-composition-variables='[
3 {"id":"variant","type":"enum","label":"Variant","default":"0","options":[{"value":"0","label":"ChatGPT (GPT-6 Astra / Sol / Luna)"},{"value":"1","label":"Claude (Opus / Sonnet / Haiku 5.5)"},{"value":"2","label":"Codex effort (low to xhigh)"}]},
4 {"id":"theme","type":"enum","label":"Theme","default":"light","options":[{"value":"light","label":"Light"},{"value":"dark","label":"Dark"}]}
5]'>
6 <head>
7 <meta charset="UTF-8" />
8 <meta name="viewport" content="width=1920, height=1080" />
9 <link rel="stylesheet" href="assets/fonts/fonts.css" />
10 <link rel="stylesheet" href="assets/skins/chatgpt/skin.css" />
11 <link rel="stylesheet" href="assets/skins/claude/skin.css" />
12 <link rel="stylesheet" href="assets/skins/codex/skin.css" />
13 <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
14 <script src="assets/kit/motion/motion.js"></script>
15 <script src="assets/skins/chatgpt/icons.js"></script>
16 <script src="assets/skins/claude/icons.js"></script>
17 <script src="assets/skins/codex/icons.js"></script>
18 <style>
19 * { margin: 0; padding: 0; box-sizing: border-box; }
20 html, body { margin: 0; width: 1920px; height: 1080px; overflow: hidden; background: #f5f5f4; }
21 #root { width: 100%; height: 100%; position: relative; overflow: hidden; }
22 /* The frame is the product's own canvas (windowless, like the official zoomed renders). */
23 #stage { position: absolute; inset: 0; background: var(--canvas, #f5f5f4); overflow: hidden; }
24 /* #cam carries the one slow push-in (frame px); #zoomer presents real-app CSS px at CONFIG zoom. */
25 #cam { position: absolute; inset: 0; }
26 #zoomer { position: absolute; left: 0; top: 0; }
27 .scene { position: absolute; inset: 0; display: none; }
28 .scene.is-on { display: block; }
29 .home { position: absolute; left: 0; right: 0; display: flex; flex-direction: column; align-items: center; }
30
31 /* ---------- pointer: an element whose own (0,0) is the hotspot ---------- */
32 .ptr { position: absolute; left: 0; top: 0; width: 0; height: 0; z-index: 100; pointer-events: none; }
33 .ptr > span { position: absolute; display: block; }
34 .ptr > span svg { width: 100%; height: 100%; display: block; overflow: visible; filter: drop-shadow(0 1px 1.5px rgba(0, 0, 0, 0.28)); }
35 .ptr .p-hand { display: none; }
36 .ptr.is-hand .p-hand { display: block; }
37 .ptr.is-hand .p-arrow { display: none; }
38 /* macOS arrow (ChatGPT / Codex): 22x30 box, hotspot (3, 2.4) */
39 .ptr.is-mac .p-arrow { left: -3px; top: -2.4px; width: 22px; height: 30px; }
40 /* Anthropic renders: white arrow 27x40 (tip 2.13, 2.14) and white hand 40x49 (fingertip 17.8, 1.18) */
41 .ptr.is-claude { color: #ffffff; }
42 .ptr.is-claude .p-arrow { left: -2.13px; top: -2.14px; width: 27px; height: 40px; }
43 .ptr.is-claude .p-hand { left: -17.8px; top: -1.18px; width: 40px; height: 49px; }
44
45 /* menus are direct children of the scene, placed from measurements at build time */
46 .menu-abs { position: absolute; z-index: 40; }
47 .hl { position: absolute; pointer-events: none; opacity: 0; }
48
Open full file
Download project1 MB