Canvas
--background
Vine · dark-first primitives
A dark-first component set on shadcn/ui, Next.js and Tailwind — chunky 48px pills, weight-led hierarchy, and one asymmetric curve for every interaction.
pill radius 9999px press grow 1.04×
Live board
The controls, working
Primary pill
Surface pill
Search pill
Range
24hLive updates
Refresh every 30 seconds.
vine-ds is not a recolor of a stock preset — geometry, motion, and the type ramp all differ. These four rules are baked into the tokens, so every component inherits them without being told.
32 / 48 / 56px, with 48px as the default. Dense surfaces dip to 32.
2px solid, offset outward on pills and inward on fields. Never a glow, never the accent.
Warm neutrals and near-black ink — deliberately not an inversion of the dark theme.
A near-black ground carries the interface; the accent appears only where it means action, selection, or focus. Four palettes share one lightness ramp, so a card, a divider and a muted label land at the same contrast in all four. Status families stay fixed — a scheme may re-tune only the one status colour its brand would be confused with. The accent itself is one value in both modes, so its label answers to the fill rather than to the mode: black above L 0.58, white below. The label is the accent’s second, non-color signal, and it stays put when the mode flips.
--background
--foreground
--brand
--primary
--destructive
--success
--warning
--info
--surface-solid
--tinted
One lightness ramp, four hues. Pick one to preview it across the whole page.
The whole identity lives in --brand. Nothing else references the hue directly, so a scheme is just a new set of values for that one family — which is exactly what data-palette on <html> swaps.
Figtree carries every interface role with its full weight range, so hierarchy comes from weight contrast rather than size contrast. JetBrains Mono handles values, numbers, and keys — always tabular.
Interface family
Aa Gg
Open geometric bowls and a tall x-height stay legible at 12px, while the full 900 weight keeps landmarks heavy from across the room.
Numeric family
67,421.30
Value
2.41T
Change
+2.41%
Updated
14:32
Fixed-width figures align values vertically. Signs, precision, and units carry meaning before colour ever enters.
Type scale
Size / line-height · weight
One corner token for every job. Controls are fully rounded, so an icon button comes out as a perfect circle; fields keep a deliberate 4px corner so a row of inputs still reads as a form. Borders stay hairline until something is focused.
--corner-2xs
Focus rings, tight chips
--corner-xs
Every text field
--corner-sm
Small surfaces
--corner-md
Cards and popovers
--corner-lg
Large surfaces
--corner-pill
Every button, chip and search field
Hairline
--border-hairline · 1px
Every resting edge
Thin
--border-thin · 2px
Selected and emphasised
Focus
--border-focus · 2px
The hard focus ring
Thick
--border-thick · 4px
Rules that carry meaning
Five surfaces run from the canvas to the popover. Each sits a fixed lightness step from its neighbour, in every palette, and a hairline finishes the edge, so a card never melts into the page. Only things that leave the page — menus, dialogs, drag previews — carry a shadow, and there are exactly two.
--canvas
Behind everything
--background
The page
--elevated
Bands and wells
--card
Content on a surface
--popover
Floating panels
--shadow-overlay
Menus, popovers, dialogs
--shadow-drop
Lifted cards and drag previews
--scrim
Behind a dialog, drawer or sheet. The same in every palette and both modes.
A 4px base keeps every gap a multiple of the grid, and a finite spacing scale controls vertical rhythm. On top of it, controls hold their own line: 48px is the default and the pill keeps the whole rhythm chunky.
Column grid
Twelve columns with 24px gutters on wide screens, eight at intermediate widths, and four on narrow screens. The 4px base means a gutter can never land off-grid.
Spacing scale
8px separates peers, 16px groups a module, 24px forms broad gutters, and 48px — the control height — marks a task boundary.
Live controls, not static inventory. Each card is a production-shaped specimen on vine-ds components — hover the pills and the 4% grow is right there.
Actions · variants and sizes
ButtonForms · the pill and the field
Input · SelectChoice · toggles and ranges
Switch · SliderMeasures · continuous values
Progress · SpinnerIdentity · presence and shortcuts
Avatar · Badge · KbdWayfinding · links and tabs
Link · TabsAlerts · inline feedback
AlertToggle groups · one-of-many
ToggleGroupLayers · focused decisions
Dialog · AlertDialogMenus · actions in one tap
Dropdown MenuPopovers · anchored context
PopoverSheets · full-height context
SheetTooltips · names on hover
TooltipCommand · type to find
CommandDrawer · bottom sheet
DrawerHover card · preview in place
HoverCardTables · dense rhythm
TablePagination · numbered walk
PaginationSelection · one or many
Checkbox · RadioVerification · fixed length
Input OTPAccordions · one panel open
AccordionSkeleton · honest loading
SkeletonBreadcrumb · the trail back
BreadcrumbCollapsible · one reveal
CollapsibleOne easing curve drives everything interactive, applied asymmetrically. Rest-to-hover runs at 50ms so controls jump to meet the cursor; hover-to-rest takes 150ms so they are slow to let go. Focus is a hard ring — never a glow, never the accent.
The signature gesture
The one gesture the whole system is recognised by. It snaps flat on click, and disappears entirely under prefers-reduced-motion.
One curve
The curve bursts out of the gate and settles gradually — eager to respond, slow to let go. Linear feel is reserved for nothing interactive.
Focus
Button · ring offset outward
Field · ring offset inward
Start with the shared rules, then spend your judgment where the product is distinct. The system removes repeated decisions — not design thinking.
Choose variant and size; the pill geometry is already settled. One clear commitment carries the decision.
One clear action
Every colour, corner, and state points at a semantic token — never a local value. The theme stays one edit away.
Theme-ready surface
Put primitives on the page. The pill radius, the 4% grow, and the asymmetric curve arrive for free.
Working interface
Keyboard flow, contrast, overflow, both themes, and reduced motion — checked together, before shipping.
Production confidence
The end of the guide · the start of the work
Use vine-ds to establish rhythm, weight, and the 4% grow. Then shape the final experience around the people and decisions it serves.