Skip to content

@vibe-labs/design-components-sliders

Slider, range, and track component tokens, styles, and TypeScript types for the Vibe Design System.

Installation

css
@import "@vibe-labs/design-components-sliders";
ts
import { SliderSizes, SliderThumbShapes, SliderTrackColors } from "@vibe-labs/design-components-sliders/types";
import type { SliderStyleProps, SliderThumbStyleProps } from "@vibe-labs/design-components-sliders/types";

Contents

Tokens (sliders.css)

Component-specific tokens defined in @layer vibe.tokens. Focus ring tokens (--ring-*) are owned by @vibe-labs/design-elevation. Disabled opacity inherits from @vibe-labs/design-forms.

Track

TokenDefaultDescription
--slider-track-height-sm2pxTrack thickness (sm)
--slider-track-height-md4pxTrack thickness (md)
--slider-track-height-lg6pxTrack thickness (lg)
--slider-track-radius--radius-fullTrack border radius
--slider-track-bg--surface-overlayUnfilled track background
--slider-track-fill--color-accentFill color
--slider-track-fill-hover--color-accent-hoverFill color on hover
--slider-track-border-width0Optional track border
--slider-track-border-color--border-subtleTrack border color

Thumb — Circle (default)

TokenDefaultDescription
--slider-thumb-size-sm0.75remThumb diameter (sm)
--slider-thumb-size-md1remThumb diameter (md)
--slider-thumb-size-lg1.25remThumb diameter (lg)
--slider-thumb-bg--color-neutral-0Thumb background
--slider-thumb-border-width2pxThumb border
--slider-thumb-border-color--color-accentThumb border color
--slider-thumb-shadow--shadow-smRest shadow
--slider-thumb-shadow-active--shadow-mdActive/dragging shadow
--slider-thumb-scale-hover1.15Hover scale factor
--slider-thumb-scale-active1.25Active scale factor
--slider-thumb-transition--duration-fastTransition speed

Thumb — Bar Variant

TokenDefaultDescription
--slider-bar-width-sm2pxBar width (sm)
--slider-bar-width-md3pxBar width (md)
--slider-bar-width-lg4pxBar width (lg)
--slider-bar-height-sm0.875remBar height (sm)
--slider-bar-height-md1.125remBar height (md)
--slider-bar-height-lg1.375remBar height (lg)
--slider-bar-radius--radius-fullBar end caps

Marks

TokenDefaultDescription
--slider-mark-size4pxMark dot diameter
--slider-mark-color--surface-overlayInactive mark color
--slider-mark-color-active--color-accentActive mark color
--slider-mark-label-font-size--text-xsLabel font size
--slider-mark-label-color--text-mutedLabel text color
--slider-mark-label-gap--space-2Gap between track and label

Tooltip

TokenDefaultDescription
--slider-tooltip-bg--surface-elevatedBackground
--slider-tooltip-color--text-primaryText color
--slider-tooltip-font-size--text-xsFont size
--slider-tooltip-font-weight--font-semiboldFont weight
--slider-tooltip-px--space-2Horizontal padding
--slider-tooltip-py--space-1Vertical padding
--slider-tooltip-radius--radius-mdBorder radius
--slider-tooltip-shadow--shadow-mdShadow
--slider-tooltip-offset--space-2Distance from thumb

Generated Styles (sliders.g.css)

Container

  • slider — relative flex container with touch-action: none, cursor: pointer
  • Sizes: sm · md · lg (default: md) — controls track height + thumb size
  • Orientation: horizontal (default) · vertical
  • Disabled: reduced opacity, pointer-events: none
  • Flags: range (dual-thumb), tooltip mode (none | hover | always)

Track

  • slider-track — full-width rounded container
  • slider-track-fill — left-anchored fill, width via --slider-fill custom property
  • Range mode: fill positioned via --slider-fill-start and --slider-fill-end
  • Color variants: accent · success · warning · danger

Thumb

  • slider-thumb — absolute positioned, circle by default, grab cursor
  • Shapes: circle (default) · bar · pill · none
  • States: hover (scale up), active (scale + shadow), focus-visible (ring)
  • Vertical: axis-swapped positioning

Marks

  • slider-marks — absolute container, pointer-events: none
  • slider-mark — small dot at step position, active state for marks below value
  • slider-mark-label — positioned text below (or beside for vertical)

Tooltip

  • slider-tooltip — positioned above thumb, hidden by default
  • Modes: none (default) · hover (show on hover/drag) · always (permanently visible)

Native Input

  • slider-input — sr-only (visually hidden, keyboard accessible)

TypeScript Types (types/)

ts
SliderSizes;        // ["sm", "md", "lg"]
SliderThumbShapes;  // ["circle", "bar", "pill", "none"]
SliderTrackColors;  // ["accent", "success", "warning", "danger"]
SliderTooltipModes; // ["none", "hover", "always"]
SliderOrientations; // ["horizontal", "vertical"]

interface SliderStyleProps {
  size?: SliderSize;
  orientation?: SliderOrientation;
  disabled?: boolean;
  tooltip?: SliderTooltipMode;
  range?: boolean;
}
interface SliderTrackStyleProps {}
interface SliderTrackFillStyleProps {
  color?: SliderTrackColor;
}
interface SliderThumbStyleProps {
  shape?: SliderThumbShape;
  active?: boolean;
}
interface SliderMarkStyleProps {
  active?: boolean;
}
interface SliderMarkLabelStyleProps {}
interface SliderTooltipStyleProps {
  visible?: boolean;
}

Dist Structure

FileDescription
index.cssBarrel — imports all files below
sliders.cssToken definitions
sliders.g.cssGenerated slider styles
index.js / index.d.tsTypeScript types + runtime constants

Dependencies

Requires @vibe-labs/design (colors, surfaces, spacing, typography, transitions, elevation) and @vibe-labs/design-forms (disabled opacity).

Build

bash
npm run build

Usage Guide

Import

css
@import "@vibe-labs/design-components-sliders";
ts
import { SliderSizes, SliderThumbShapes } from "@vibe-labs/design-components-sliders/types";
import type { SliderStyleProps } from "@vibe-labs/design-components-sliders/types";

Variants

Attribute / FlagValuesNotes
data-sizesm md lgDefault: md
data-orientationhorizontal verticalDefault: horizontal
data-disabledboolean flagPointer-events: none
data-rangeboolean flagDual-thumb range slider
data-tooltipnone hover alwaysTooltip visibility mode
data-color (fill)accent success warning dangerOn slider-track-fill
data-shape (thumb)circle bar pill noneOn slider-thumb

Fill width is driven by --slider-fill (single) or --slider-fill-start + --slider-fill-end (range).

Examples

Basic slider

html
<div class="slider" style="--slider-fill: 40%">
  <div class="slider-track">
    <div class="slider-track-fill"></div>
  </div>
  <div class="slider-thumb"></div>
  <input type="range" class="slider-input" min="0" max="100" value="40" />
</div>

Sized slider

html
<div class="slider" data-size="lg" style="--slider-fill: 70%">
  <div class="slider-track">
    <div class="slider-track-fill"></div>
  </div>
  <div class="slider-thumb"></div>
  <input type="range" class="slider-input" min="0" max="100" value="70" />
</div>

Color variant fill

html
<div class="slider" data-size="md" style="--slider-fill: 80%">
  <div class="slider-track">
    <div class="slider-track-fill" data-color="success"></div>
  </div>
  <div class="slider-thumb"></div>
  <input type="range" class="slider-input" min="0" max="100" value="80" />
</div>

Bar thumb shape

html
<div class="slider" style="--slider-fill: 50%">
  <div class="slider-track">
    <div class="slider-track-fill"></div>
  </div>
  <div class="slider-thumb" data-shape="bar"></div>
  <input type="range" class="slider-input" min="0" max="100" value="50" />
</div>

Slider with always-visible tooltip

html
<div class="slider" data-tooltip="always" style="--slider-fill: 55%">
  <div class="slider-track">
    <div class="slider-track-fill"></div>
  </div>
  <div class="slider-thumb">
    <div class="slider-tooltip">55</div>
  </div>
  <input type="range" class="slider-input" min="0" max="100" value="55" />
</div>

Slider with marks

html
<div class="slider" style="--slider-fill: 50%">
  <div class="slider-track">
    <div class="slider-track-fill"></div>
  </div>
  <div class="slider-marks">
    <div class="slider-mark" style="left: 0%"><span class="slider-mark-label">0</span></div>
    <div class="slider-mark" data-active style="left: 25%"><span class="slider-mark-label">25</span></div>
    <div class="slider-mark" data-active style="left: 50%"><span class="slider-mark-label">50</span></div>
    <div class="slider-mark" style="left: 75%"><span class="slider-mark-label">75</span></div>
    <div class="slider-mark" style="left: 100%"><span class="slider-mark-label">100</span></div>
  </div>
  <div class="slider-thumb"></div>
  <input type="range" class="slider-input" min="0" max="100" value="50" step="25" />
</div>

With Vue

vue
<template>
  <div
    class="slider"
    :data-size="size"
    :data-disabled="disabled || undefined"
    :style="{ '--slider-fill': fillPercent + '%' }"
  >
    <div class="slider-track">
      <div class="slider-track-fill" :data-color="color"></div>
    </div>
    <div class="slider-thumb" :data-shape="thumbShape"></div>
    <input
      type="range"
      class="slider-input"
      :min="min"
      :max="max"
      :value="modelValue"
      @input="onInput"
    />
  </div>
</template>

Vibe