crucıble

Vice

A self-contained synthwave theme preset — card, buttons, stat, and tag in hot-magenta → cyan neon on deep indigo, with a sunset gradient, a scanlined sun rising over a perspective grid, and a chrome-italic display heading. A keyboard-operable radiogroup of vibe chips re-tokens the whole panel live; every glow pins to a bold static frame under reduced motion.

motionfree

Installation

CLI

npx shadcn@latest add @crucible/vice

Manual — install dependencies, then copy the source

npm install motion

Props

PropTypeDefaultDescription
variantstringControlled active preset id (matches a preset's id).
defaultVariantstring"miami" (first preset)Initial preset id when uncontrolled.
onVariantChange(id: string) => voidFires with the next preset id whenever the switcher changes.
presetsVicePreset[]the three built-in vibesOverride the built-in preset set (chips + palettes).
colorsPartial<VicePalette>Token overrides merged over the active preset — makes any palette reachable.
speednumber1Glow-pulse and grid-scroll speed multiplier.
intensitynumber1Neon glow strength multiplier.
pausedbooleanfalseFreeze all animation at the resting neon frame.
taglinestring"TRACK 07"Small mono label above the heading.
headingstring"AFTERGLOW"Chrome-italic display heading.
descriptionstring"Neon on deep indigo. Pick a vibe."Body line under the heading.
statValuestring"128"Stat figure.
statLabelstring"BPM"Stat unit / label.
tagstring"SIDE A"Small pill tag.
primaryLabelstring"Play"Filled button label.
secondaryLabelstring"Queue"Outline button label.
labelstring"Synthwave theme preset"Accessible label for the panel region.
switcherLabelstring"Theme vibe"Accessible label for the switcher group.
Also accepts all props of Omit<React.ComponentPropsWithoutRef<"section">, "onChange">they pass through to the underlying element.

Honors prefers-reduced-motion with a designed static fallback, and passes className through.