Shader Preset Picker

Runtime gallery of shader presets — click to select. Powered by the same preset registry as <ThreeScene>.

Installation

import { ShaderPresetPicker } from "@gradeui/ui"

Picker + live preview

Filter by tag

Every preset declares semantic tags ("space", "retro", "motion", "hero", etc.) — filter to a subset for specialised pickers.

Props

PropTypeDefaultDescription
valuestring-Currently selected preset id (controlled).
onChange(id: string) => void-Called when the user clicks a preset card.
filterTagsstring[]-Only show presets that match at least one tag.
live"never" | "hover" | "always""hover"Thumbnail render mode — see Shader Preset Preview.
postPresetstring-Shared post-FX preset applied to every thumbnail.
palettePartial<Palette>-Shared palette applied to every thumbnail.
columns2 | 3 | 43Grid columns at md+ breakpoint.

TODO (phase 2)

A static docs-site catalogue page — the shadcn-blocks model, listing every preset with copy-paste code — is planned separately from this runtime picker.

Sidecar

The Markdown sidecar Studio (and the Grade MCP server, when it ships) reads to understand this component — frontmatter, when- to-use guidance, and canonical examples. Authored once at packages/ui/components/ui/shader-preset-picker.md and shipped inside the published @gradeui/ui tarball.

---
name: ShaderPresetPicker
import: "@gradeui/ui"
props:
  - value?: string — currently selected preset id (controlled)
  - onChange?: (id: string) => void — called when the user clicks a preset card
  - filterTags?: string[] — only show presets matching at least one tag ("space" | "retro" | "motion" | "hero" | "background" …)
  - live?: "never" | "hover" | "always" (default "hover") — thumbnail render mode
  - postPreset?: string — shared post-FX preset applied to every thumbnail
  - palette?: Partial<Palette> — shared palette applied to every thumbnail
  - columns?: 2 | 3 | 4 (default 3) — grid columns at md+ breakpoint
when_to_use: Runtime gallery of shader presets — click to select. Use with ThreeScene as a controlled input so the user can pick a background shader. For a single preview card, use ShaderPresetPreview directly.
composes_with: [ShaderPresetPreview (internal), ThreeScene (the typical downstream consumer)]
aliases: [shader picker, preset picker, shader gallery, preset gallery]
notes: Powered by the same preset registry that drives `<ThreeScene preset="…" />` — adding a preset to the registry makes it appear here automatically. At time of writing only "space" is registered, so the picker renders a single card until more presets ship.
---

```jsx
const [preset, setPreset] = useState("space");

<ShaderPresetPicker value={preset} onChange={setPreset} />
<ThreeScene preset={preset} postPreset="vhs" aspect="wide" />

// Filter to a subset
<ShaderPresetPicker filterTags={["hero"]} columns={3} />
```