Skip to main content
The Framer example is a split-panel component browser. The left column lists component items; the right column renders a live preview of whichever item is currently selected. Selecting a new item instantly swaps the preview — no modal, no navigation — making the palette feel like an interactive component picker rather than a traditional command menu. The selection highlight uses Framer’s blue accent color (var(--blue9)) and turns the item text white, maintaining high contrast without any additional state.

Notable implementation details

Controlled value drives the live preview panel. The component lifts value into state and passes it to Command via the value / onValueChange props. The right-hand preview pane switches on this same state value to render the matching component — {value === 'Button' && <Button />} and so on. Keyboard navigation (arrow keys) updates value automatically, so the preview tracks focus without any extra event handlers.
Two-column layout inside Command.List. Instead of relying on the default block flow, the [cmdk-framer-items] wrapper uses display: flex to place a 40% left column (the item list) and a 60% right column (the preview) side by side, separated by a 1 px <hr>. This layout is entirely in CSS — Command.List is not aware of the split and continues to manage filtering and keyboard navigation normally.
Subtitle hidden on small screens. The [cmdk-framer-item-subtitle] element is set to display: none at widths below 640 px via a media query, keeping the item height compact on mobile without changing any JSX. The icon wrapper and primary label remain visible.
You can replace the static preview components with anything — a real component from your design system, a code snippet, or a rich-text description. Because the preview is driven by a plain React state string, swapping in async-loaded content is straightforward: fetch on onValueChange and render a loading skeleton in the right panel while the request is in flight.