All components
02

Composer bar

Only the input box floating on the stage: prompt types, attachment chips drop in, send pulses

Prompt for your agentpaste into Claude Code or Codex
Add the "Composer bar" video component (ChatGPT, light) from everestchris.com to this project.

1. Download https://ai-component-library-dun.vercel.app/projects/composer-bar.zip?v=7f8ca6c846ad and unzip it into components/composer-bar/. Read the README.md and CLAUDE.md in it.
2. Render it: cd components/composer-bar && npx hyperframes@0.8.162 render . --variables '{"variant":"0","theme":"light"}' -o composer-bar.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"},{"value":"1","label":"Claude"},{"value":"2","label":"Grok"}]},
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/grok/skin.css" />
13 <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
14 <script src="assets/skins/chatgpt/icons.js"></script>
15 <script src="assets/skins/claude/icons.js"></script>
16 <script src="assets/skins/grok/icons.js"></script>
17 <script src="assets/kit/motion/motion.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 body.is-dark { background: #0e0e0f; }
22 #root { width: 100%; height: 100%; position: relative; overflow: hidden; font-family: "Inter", sans-serif; }
23
24 /* DESIGN.md stage: flat, no texture */
25 #stage { position: absolute; inset: 0; background: #f5f5f4; }
26 #stage.is-dark { background: #0e0e0f; }
27 /* the composer is docked by its bottom edge (it grows upward, like a real composer);
28 padding-bottom is set at build so the empty and the full state sit evenly about the centre */
29 #center { position: absolute; inset: 0; display: flex; align-items: flex-end; justify-content: center; }
30 /* real product CSS px, presented at video scale (zoom per variant, from CONFIG) */
31 #zoom { position: relative; }
32 #obj { position: relative; }
33
34 /* ---------- shared pieces ---------- */
35 .box { position: relative; }
36 /* the attachment row: a slot that opens upward; the files sit on its bottom edge */
37 .att-wrap { height: 0; flex: none; position: relative; overflow: visible; }
38 .att-row { position: absolute; left: 0; bottom: 0; display: flex; align-items: flex-start; flex-wrap: nowrap; }
39 .att { position: relative; flex: none; }
40 .typed { display: inline-block; white-space: pre; position: relative; }
41 .typed .caret {
42 display: inline-block; width: 1.5px; height: 1.12em; margin-left: 1px; vertical-align: -0.18em;
43 background: var(--caret); border-radius: 1px; opacity: 0;
44 }
45 .send-wrap { position: relative; display: inline-flex; flex: none; }
46 /* send pulse: one filled halo in the button's own colour */
47 .send-wrap > .pulse { position: absolute; inset: 0; border-radius: 50%; pointer-events: none; opacity: 0; background: var(--pulse); }
48 .send-wrap > :last-child { position: relative; z-index: 1; }
Open full file
Download project1 MB