Segmented Controls
quantumblack-design-system-registry/segmented-controlsFreeComponent
Single-select segmented control with secondary-filled and ghost variants across four sizes.
Install it
npx shadcn@latest add http://designsystem.quantumblack.com/r/segmented-controls.jsonSource
1'use client';23import * as ToggleGroupPrimitive from '@radix-ui/react-toggle-group';4import { cva } from 'class-variance-authority';5import * as React from 'react';67import { cn } from '@/lib/utils';89type SegmentedControlsType = 'secondary-filled' | 'ghost';1011type SegmentedControlsSize = 'reg' | 'sm' | 'xsm' | 'xxs';1213/**14 * State overlay gradients for the secondary-filled variant.15 * Tailwind needs the full class name at build time, so these are defined as16 * complete strings rather than built via interpolation (matches button/tag-toggle).17 */18const hoverOverlay =19 'hover:[background-image:linear-gradient(var(--color-stateslayer-overlay-hover),var(--color-stateslayer-overlay-hover))]';2021const pressedOverlay =22 'active:[background-image:linear-gradient(var(--color-stateslayer-overlay-pressed),var(--color-stateslayer-overlay-pressed))]';2324const disabledOverlay =25 'disabled:[background-image:linear-gradient(var(--color-stateslayer-overlay-disabled),var(--color-stateslayer-overlay-disabled))]';2627// Track (Root) container styling — size only controls the inter-item gap.28const segmentedControlsVariants = cva(29 [30 'inline-flex items-center w-fit p-1',31 'bg-fill-secondary-inverse border border-stroke-divider shadow-elevation-0',32 ],33 {34 variants: {35 size: {36 reg: 'gap-1',37 sm: 'gap-0.5',38 xsm: 'gap-0.5',39 xxs: 'gap-0.5',40 },41 },42 defaultVariants: {43 size: 'reg',44 },45 },46);4748// Individual segment styling. The selected (data-state=on) treatment lives in the49// base layer so it overrides both type backgrounds via attribute specificity.50const segmentedControlsItemVariants = cva(51 [52 'relative inline-flex items-center justify-center min-w-8 whitespace-nowrap',53 'cursor-pointer outline-none transition-all',54 'focus-visible:ring-1 focus-visible:ring-stroke-status-focus',55 'disabled:cursor-not-allowed disabled:text-fg-disabled',56 'data-[state=on]:bg-fill-active data-[state=on]:text-fg-primary-inverse',57 // A disabled segment always reads as disabled, even when selected: the58 // compound variant outranks the unconditional data-[state=on] styles above.59 'disabled:data-[state=on]:text-fg-disabled',60 ],61 {62 variants: {63 type: {64 'secondary-filled': [65 'bg-fill-muted text-fg-primary',66 hoverOverlay,67 pressedOverlay,68 disabledOverlay,69 'disabled:data-[state=on]:bg-fill-muted',70 ],71 ghost: [72// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from Quantumblack Design System Registry
All 47 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | Quantumblack Design System Registry | Components | Free | 1 dep | |
| Alertalert | Quantumblack Design System Registry | Components | Free | no deps | |
| Aspect Ratioaspect-ratio | Quantumblack Design System Registry | Components | Free | 1 dep | |
| Avataravatar | Quantumblack Design System Registry | Components | Free | 1 dep | |
| Badgebadge | Quantumblack Design System Registry | Components | Free | 1 dep | |
| Buttonbutton | Quantumblack Design System Registry | Components | Free | 1 dep | |
| Button Groupbutton-group | Quantumblack Design System Registry | Components | Free | 1 dep | |
| Calendarcalendar | Quantumblack Design System Registry | Components | Free | 2 deps |
