No.210 · AI & Chat· New
Dial Composer
An agent composer where one dial sets everything. Choose what it's turning — mode, model, effort or context — and turn it; the knob's face becomes the current choice (the mode's icon, the maker's logo, the effort bars, how full the context is) while a readout beside it keeps all four in view.
The prompt
Written for the variant you picked above: Dark
Build a composer for a coding agent where a single dial sets how it runs. One 44rem card (18px radius, 1px border): a borderless prompt at the top (15px/24px, three lines), and beneath it a deck in three columns — the dial, a readout, and a round send button. The dial (216px): a 240° track centred on twelve o'clock, 2.5px, with a coloured fill from the start to the current position. Around it, one small dot per option with its label just outside (or the maker's logo for models); the selected dot is larger and coloured. In the middle a matte 116px knob — a soft top-lit radial shade, a hairline edge, a soft shadow, no ridges or chrome — with a single 3×13px pointer in the current colour. The knob's face shows whatever is selected, cross-fading on each change: the mode's line icon and name in the mode's colour; the maker's logo and model name (Claude's logo in orange, OpenAI's in blue, Grok's white on a black disc); effort as five rising bars and the level name in the level's colour (Low grey, Medium green, High amber, Extra High violet, Max red); or for context, the percentage of the window in use and the scope's name. The dial turns one ring at a time. The readout is a list of four rows — MODE, MODEL, EFFORT, CONTEXT in small mono caps, each with its current value, icon and colour — and the selected row (a soft fill and a 2px bar in that ring's colour) is the one the dial is turning. Context is a breadth rather than a file picker: Message only, Mentioned files, exporter/ folder, Whole repo; the files it covers are listed in faint mono under the rows. Turning: drag around the dial (the pointer follows your finger and the value snaps to the nearest detent, with a small press of the knob at each one), click a dot or its label, scroll over it, or use the keyboard — ← and → turn, Home and End jump to the ends, ↑ and ↓ move to another ring. On release the pointer springs to its detent. Enter in the prompt sends; a line appears at the top of the card with the mode, model, effort and scope it ran with. Selected variant — Dark (dark): Palette for this theme (Dark): --dlcm-agent #d4d4d4; --dlcm-ask #8fd18a; --dlcm-card #171717; --dlcm-claude #e08560; --dlcm-debug #f08c7b; --dlcm-e0 #8e8e8e; --dlcm-e1 #6cc08b; --dlcm-e2 #e6c26b; --dlcm-e3 #b48cf2; --dlcm-e4 #f0645a; --dlcm-faint #5a5a5a; --dlcm-focus #8ab4f8; --dlcm-full #f08c7b; --dlcm-go #ededed; --dlcm-go-ink #111111; --dlcm-hover rgb(255 255 255 / 0.05); --dlcm-ink #ececec; --dlcm-knob-edge #343434; --dlcm-knob-hi #2e2e2e; --dlcm-knob-lo #191919; --dlcm-knob-shadow 0 10px 24px -10px rgb(0 0 0 / 0.85); --dlcm-line #2a2a2a; --dlcm-line-soft rgb(255 255 255 / 0.06); --dlcm-multitask #7cc5ee; --dlcm-muted #8c8c8c; --dlcm-off #333333; --dlcm-openai #5b9bff; --dlcm-plan #e6c26b; --dlcm-warn #e6c26b; --dlcm-xai #ececec. Treat these as the root colour tokens, one value per role, and name them to suit your code. Select it with the theme option set to "dark". Keep every dimension, spacing value, state and motion from the brief unchanged, and keep text at 4.5:1 contrast or better on these surfaces. This selection takes precedence over references to other themes or options in the general brief. Implement this selected appearance; do not add a variant picker or alternative appearances unless requested. Implementation requirements: Use React and TypeScript. Keep the component self-contained, with uniquely scoped CSS and no animation libraries. Include required imports, styles and font setup in the result. Interaction: Pick a row (Mode, Model, Effort, Context) and turn the dial: drag around it, click a dot or label, scroll over it, or use ← and → (Home/End for the ends). ↑ and ↓ on the dial switch rows. Enter sends the prompt. Motion: The pointer follows the drag and springs to its detent on release (340ms); the knob dips slightly at each detent; the face cross-fades and scales in on every change; the fill and dots recolour over 250ms. Reduced motion makes every change instant. Accessibility: The dial is a focusable slider with a dial role description, a label naming the ring it's turning, and a spoken value with each option's description; instructions are attached with aria-describedby. The rows are a labelled radio group. Every change is announced in a polite status region; logos and icons are decorative. Responsive behavior: Below 560px of its own width the dial sits centred above the readout, which becomes a 2×2 grid with the send button beside it; the prompt uses 16px text on phones. Touch: Drag the dial with a finger or tap a dot or label to jump straight to it; rows are tap targets. Preserve keyboard access, visible focus and reduced-motion behavior. Keep fictional demo data and simulated service calls in a separate usage example; expose callbacks for real actions and recover from rejected requests. Keep usage-example links inside the demo: use local buttons or prevent navigation. Demonstration links must not navigate to Vitrine routes or open other pages; preserve real URL support in the reusable component itself. Verify the result at narrow and wide viewport sizes, with keyboard input and reduced motion enabled.
Notes
- Interaction
- Pick a row (Mode, Model, Effort, Context) and turn the dial: drag around it, click a dot or label, scroll over it, or use ← and → (Home/End for the ends). ↑ and ↓ on the dial switch rows. Enter sends the prompt.
- Motion
- The pointer follows the drag and springs to its detent on release (340ms); the knob dips slightly at each detent; the face cross-fades and scales in on every change; the fill and dots recolour over 250ms. Reduced motion makes every change instant.
- Accessibility
- The dial is a focusable slider with a dial role description, a label naming the ring it's turning, and a spoken value with each option's description; instructions are attached with aria-describedby. The rows are a labelled radio group. Every change is announced in a polite status region; logos and icons are decorative.
- Responsive
- Below 560px of its own width the dial sits centred above the readout, which becomes a 2×2 grid with the send button beside it; the prompt uses 16px text on phones.
- On touch
- Drag the dial with a finger or tap a dot or label to jump straight to it; rows are tap targets.