VectorStack design system

@vector-stack-usa/ui

Live preview of every component shipped today, plus the canonical size scale and the queue of components still missing. Edit any source file under src/components and Next.js HMR reflects in milliseconds — no build, no bump, no rebuild.

v0.31.0

Size scale

Canonical dimensions for v0.6.0+. Bump touches every consumer.

ComponentDimensions
Standard size24px (h-6) · text-[11px] · rounded-[4px] — Button, Input, Select, StatusChip default
Buttonh-6 · text-[11px] · px-2.5 · gap-1 · rounded-[4px] · font-semibold
Inputh-6 · text-[11px] · px-2 — matches Button. No size variants.
Selecth-6 · text-[11px] · pl-2 pr-7 — matches Input. No size variants.
StatusChip sm (default)h-6 · text-[11px] · rounded-[4px]
StatusChip xsh-5 · text-[10px] · rounded-[3px] — only component with a compact variant
Spinnerh-3 w-3 (12px) · border-[1.5px] · animate-spin
Progress trackh-[9px] · rounded-[3px] · 1px solid border, recess inset shadow, outer halo glow in tone color (only when filled)

Palette

Live tokens from colors.css. Click any swatch to edit it with HSL sliders — changes apply instantly to every component on this page and persist in localStorage. Use 'Reset to default' to revert. Toggle dark mode to edit the dark-theme value of the same token independently.

Button

3 variants × 4 states. ButtonLink ships the same look on an <a>.

primary
primary + icon
primary disabled
secondary
secondary + icon
secondary disabled
ghost
ghost + icon
ghost disabled
ButtonLink primary
Open page
ButtonLink secondary
Cancel
ButtonLink ghost
Dismiss

Input

3 sizes (sm / md default / lg) × states. Always renders inside a flex-col wrapper with optional label + helper/error.

default (md)
md + helper
We never send marketing.
md + error
Must be a valid email.
md disabled
no label
password

Checkbox

Custom box matching primary. States: default / checked / disabled / error.

states
error
You must agree to continue.
helper
Includes the top 3 changes from your dashboard.

Radio

Group via shared `name`. Pick exactly one.

default
error
Pick one.
Pick one.

Toggle

32×16 pill switch. Use for binary on/off (auto-reprice, dry-run, sandbox).

states
helper
Worker re-runs every 60s when on.

Select

Native <select> wrapped to match Input. Single 24px size.

default
error
Required.
helper
The repricer worker scopes its run to this marketplace.
disabled

Field

Generic label + helper/error wrapper. Use it around anything that isn't already an Input/Select (e.g. a Checkbox group, a custom date control).

checkbox group
You'll get a copy on every channel you check.
radio group
Pick one before submitting.

Card

4 variants — default / muted / compact / compactMuted. Just a div with border + shadow.

default
Default card
p-5 · white bg · border + soft shadow
muted
Muted card
Same dims, page-bg fill — for sub-panels
compact
Compact card
p-4 instead of p-5
compactMuted
Compact muted
p-4 + page-bg fill

StatusChip

6 tones × 2 sizes (sm default, xs compact) × with/without dot. Use for inline status labels and table cells.

sm (default)
neutralpositivecriticalcautioninfobrand
sm + dot
neutralpositivecriticalcautioninfobrand
xs
neutralpositivecriticalcautioninfobrand
xs + dot
neutralpositivecriticalcautioninfobrand

TagWithInfo

Hover any chip below to reveal popup. Harvested from repricer table tags.

tooltip · hover meinteractive · hover meplacement: bottomplacement: right

Tabs

Controlled or uncontrolled. Used to break long pages without losing the visual identity.

Overview panel — the active tab is overview.

Avatar

Image OR initials (auto from name, color hashed). 4 sizes — xs / sm / md / lg.

initials
hash → hue
img + override
With image

Spinner

Indeterminate "still working" indicator. Single size (12px). For determinate % use Progress.

primary
Saving…
inside Button
dark surface
Indexing dataset…

Progress

Determinate (0–100%) and indeterminate variants. Use determinate when you have a measurable %, indeterminate when you don't (slides infinitely).

Re-processing dataset35%
drives the bar above
positive (done)
Backfill complete100%
caution (slow)
Catalog sync (slow)62%
critical (errors)
Migration (errors detected)47%
indeterminate
Crunching numbers…Loading…
no label
custom valueLabel
Reprocessor180 / 308

Skeleton

3 shapes — line / block / circle. Shimmer animation respects prefers-reduced-motion.

line widths
circles

EmptyState

Replaces literal 'No items yet' copy across surfaces.

title only
No runs yet
full
No accounts connected
Connect an Amazon SP-API seller account to start auto-repricing.

Tooltip

Lightweight hover/focus tooltip for icon buttons + table cells. For tag-shaped triggers use TagWithInfo.

placements
Top tooltipBottom tooltipLeft tooltipRight tooltipWide tooltip — wraps to multi-line when content + max-width forces it.

Pagination

Compact page-number variant with prev/next steppers, ellipsis, and an optional inline page-size selector.

Table primitives

<Table> + <TableHead/Body/Row/Cell/HeaderCell> — same look every consumer was already hand-rolling.

SKUTitleStatusPrice
ZX-000005936Under Armour Blitzing cappositive$22.99
ZX-000007112Nike Pro shortscaution$34.50
ZX-000009401Adidas Originals trefoil teecritical$48.00

CountUp

Animates a number from 0 (or `from`) to `value` over `duration` ms with easeOutCubic. Re-animates when value changes.

Listings
0
MRR
$0
Conversion
0.0%
Errors
0

InfoCard

Bigger sibling of AppTile — full feature/integration card with icon-box, title, description, optional badge. 7 tones (same as AppTile).

PageState

Bigger empty/error/loading/success layouts for full-page contexts. Use as the entire main when there's nothing else to render.

No listings yet

Connect an Amazon SP-API token and we'll prefill your first 100 listings automatically.

  • SP-API tokens with seller-scope are required.
  • The repricer will run a dry-run on import.
  • Skip the connection if you only want to manage listings manually.

Couldn't load

Network error · code 502

Generating report…

This usually takes 10–20s.

All set

Your store is connected and syncing.

DiffViewer

Line-by-line text diff. Tone-tinted bg for added (positive) and removed (critical) lines. Unified or split layout.

config.yamlconfig.yaml (proposed)+3·1
11 workers:22   - amazon-listings33   - amazon-orders4+  - amazon-feed45   - keepa56 repricer:6  default_strategy: buy_box7+  default_strategy: lowest_offer78   undercut_pct: 0.59+  cooldown_seconds: 60
beforeafter+3·2
1{ "tone": "primary",2  "size": "md",3  "variant": "solid" }   
1{ "tone": "primary",  2  "size": "sm",3  "variant": "ghost",4  "halo": true }

Alert

Full-width inline banner. Different from Toast — sits in the document flow, persists, and can carry actions. 5 tones with default icons; supports a dismiss button.

InlineEdit

Click a value to edit it inline. Enter or check button to commit, Esc or × to cancel.

Rule name:
Empty (placeholder visible):
Disabled:
Renders as monospace:

TagInput

Input that turns Enter / comma into a tag chip. Backspace on empty input removes the last tag. Paste comma-separated text to bulk-add.

brand list
Brands
adidasnikepuma
3 brands. Try pasting "asics, reebok, vans".
max + unique
Top categories (max 4)
apparelelectronics
Up to 4 unique tags.
error
Required keywords
At least one keyword required.
disabled
Locked
readonlytag

Splitter

Two resizable panes separated by a draggable divider. Hover the divider to see the resize cursor.

Sidebar
Detail

Drag the divider on the left to resize. Min 15%, max 85%.

SegmentedControl

Pill-style single-select toggle group. Use for view-mode switchers (Day / Week / Month), filter scopes — anywhere there are 2–5 mutually-exclusive options.

text-only
with icons
full-width

Rating

Star rating. Click to set, hover to preview, supports half-stars via step={0.5}. Read-only mode for displaying averages.

interactive · whole stars
Rate this product
3
interactive · half stars
Precise rating
3.5
readOnly · average
Average
4.7
larger
5

Tree

Hierarchical list with expandable folder nodes. Use for category navigation, file explorers, taxonomy.

CalendarHeatmap

GitHub-style activity grid. 7 rows (days of week, Sun→Sat) × N columns (weeks). Cell intensity bucketed by max value in the data.

MonWedFri
LessMore

NumberInput

Numeric field with −/+ steppers + format/parse hooks for currency, percent, etc.

basic
currency formatted
Type freely; on blur it reformats to $X.XX.
bounded + helper
1–16. Arrows step too.
error
Must be ≤ 100.

InputGroup

Wrap an Input/NumberInput with text or button addons on either side. Useful for $ prefix, .com suffix, http:// prefix, /h suffix, etc.

$ prefix + USD suffix
Price
$
USD
URL pattern
Subdomain
https://
.nexus360.us
search + button addon
Find SKU
error
Username
@
Already taken.

MetaList

Definition-list-style label:value pairs for 'Order details', 'Account info', etc. Two layouts.

row layout
SKU
ZX-000005936
ASIN
B07ABC1234
Brand
Under Armour
Marketplace
United States
Status
Live
Repricer last ran 3 min ago
Stock
47
stacked layout
Order ID
ord_3rABC123XYZ
Customer
Alice Anderson
alice@example.com
Total
$124.50
Placed
2 minutes ago

FileUpload

Drag-and-drop dropzone + click-to-select. Lists picked files with per-file remove buttons.

multi · CSV/JSON
Import inventory
Drop files here, or browse
.csv,.json · up to 5.0 MB
Selected: 0 files
single · image
Brand logo
Drop a PNG/JPG, or browse
image/* · up to 2.0 MB

CommandPalette

Cmd+K-style modal with fuzzy search across a flat command list. Esc + click-outside dismiss; ↑/↓/Enter to navigate.

Open the palette to search across actions and shortcuts.

Slider

Numeric range input. Primary fill on the left of the thumb. Optional tickmarks + value display.

continuous
60%
Live value drives the label.
stepped + ticks
60s
Tickmarks at every step.
disabled
50

PinInput

Single-character cells for OTPs / verification codes. Auto-advances on type, Backspace moves back, paste distributes across cells.

6 digits
Verification code
Auto-advances on type. Try pasting '123456'.
masked (PIN)
Set PIN
Cells render • instead of the digit.
error
Verification code
Code expired — request a new one.

CopyButton

Single-action copy with success flash. Use inline next to API tokens, share URLs, ASINs, etc.

API URL:https://api.nexus360.us/v1

CodeBlock

Pre/code container with mono font + recess shadow + inline copy button. Optional language label, title, line numbers, max height.

Installbash
npm install @vector-stack-usa/ui
import '@vector-stack-usa/ui/colors.css';
Usagetsx
1import { Button, ToastProvider, useToast } from '@vector-stack-usa/ui';2 3export default function App() {4  const toast = useToast();5  return (6    <ToastProvider>7      <Button onClick={() => toast.push({ tone: 'positive', title: 'Saved' })}>Save</Button>8    </ToastProvider>9  );10}
json
{
  "name": "@vector-stack-usa/ui",
  "version": "0.25.1"
}

Popover

Click-triggered floating panel. Heavier than Tooltip — supports interactive content like forms and action buttons. Click outside or Esc to dismiss.

Kbd

Typographic visual for keyboard shortcuts.

Press K to open the command palette.
Use to navigate, Enter to select, Esc to dismiss.
Save the form with S; cancel with Esc.

Stepper

Multi-step progress indicator. Use for wizards, onboarding, multi-step forms. Horizontal default; pass orientation='vertical' for sidebar wizards.

horizontal · current=1
  1. Account
    Email + password
  2. 2
    Plan
    Pick a tier
  3. 3
    Payment
    Card details
  4. 4
    Done
with error · current=2
  1. Connect Amazon
  2. Sync inventory
  3. Run pricing rules
    API token expired
  4. 4
    Activate
vertical · current=2
  1. Catalog ingested
    2,400 items
  2. Embeddings computed
    Qwen3-32B · 2m 14s
  3. 3
    Reviewing duplicates
    38 in queue
  4. 4
    Publish

Timeline

Event list with dots + connector. Vertical (default) for audit logs / activity feeds. Horizontal for status flows / deploy history / order tracking.

vertical · order events (audit-style)
  1. Order placed
    2m ago
    Customer checked out · 3 items · $124.50
  2. Payment captured
    2m ago
    Stripe · pi_3R…ABCD
  3. Picked up by carrier
    1h ago
    UPS · tracking 1Z999
  4. Delayed at hub
    6h ago
    Weather event in MEM
  5. In transit
    Yesterday
  6. Delivery exception
    14:32
    Address unreachable; rescheduling
horizontal · deploy pipeline
  1. 12:42
    Build
    8m 14s
  2. 12:50
    Test
    342 passed
  3. 12:51
    Lint
    No issues
  4. 12:52
    Stage
    Deployed
  5. 12:54
    Smoke
    Slow homepage
  6. Prod
    Pending approval
horizontal · shipment status
  1. Apr 22
    Ordered
  2. Apr 23
    Picked
  3. Apr 24
    In transit
  4.  
    Out for delivery
  5.  
    Delivered

Charts (Sparkline · BarChart · LineChart · DonutChart)

SVG-only, no external deps. All inherit tokens + tones from the design system. Hover charts to see values.

Sparkline — inline trends
Revenue$12.4k
Conversion2.5%
Latency95ms
BarChart — orders by marketplace
1,820
640
320
180
120
Amazon
eBay
Walmart
TikTok
Shopify
DonutChart — share by channel
3,080
orders
Amazon1,820
eBay640
Walmart320
TikTok180
Shopify120
LineChart — repricer activity (last 14 days)
Apr 13Apr 20Apr 26

StatCard

KPI / metric tile. Label · big number · optional delta with trend arrow · hint line. Bottom of the card carries a 1px gradient accent in the tone (full→0 alpha L→R) so a row reads as one data strip.

Active rules
14
+2
vs last week
Listings
3,412
+8.4%
prefilled
Errors
6
+3
last 24h
Last run
3 min
ago
Revenue
$12.4k
this month
Conversion
2.7%
-0.3%
vs avg
MRR
$840
+12%
month over month

Drawer

Slide-in panel from the side. Use for long-form edits or 'details about a row' without leaving the page. Backdrop + Esc + click-outside dismiss.

Body scroll locks while open. ↻ try Esc to close.

Accordion

Collapsible sections list. Single-open by default; pass `multiple` to allow several open at once.

single-open
You are on the Pro plan ($49/mo). Unlimited listings, 5 marketplaces, priority support.
multiple
Unlimited listings, all marketplaces, priority support, AI catalog builder.
First 14 days, no questions asked.

ExpandPanel + ExpandableRow + ExpandedRow

Inline detail panel revealed under a table row. Pattern from adm.nexus360.us/admin/inventory. Click any row below to open its panel. Tones paint a 3px coloured edge + soft halo (same hue family as AppTile / Progress).

SKUTitleStatusStock
ZX-000005936Under Armour Blitzing cappositive47
Detail

Under Armour Blitzing cap

Last sale
2 days ago
Avg price
$22.99
Buy box
Won

5 tones available on ExpandPanel: neutral · primary · positive · caution · critical. Each tones the 3px left edge + outer halo. Click ZX-000005936 / ZX-000007112 / ZX-000009401 above to see the three coloured variants.

Combobox

Searchable select with keyboard nav (↑/↓/Enter/Esc). Group keys cluster items under headings.

basic
Selected: ATVPDKIKX0DER
error
Pick a region.
disabled

MultiSelect

Searchable dropdown with multi-selection. Selected items render as primary-tinted pills inside the trigger; click × to remove or backspace on empty search to pop the last one.

basic
2 selected · ATVPDKIKX0DER, A1F83G8C2ARO7P
error
Pick at least one tag.
disabled

Toast

Wrap your app in <ToastProvider>; call useToast().push(…) anywhere. Auto-dismiss in 4s by default.

DatePicker

Single mode and range mode. Range: pick start, hover to preview, then pick end. Click an earlier date during step 2 to restart.

single
Pick any date.
range (the request)
Pick the start date.
range w/ bounds
Earlier dates are disabled.

AppTile + AppGrid

Launcher tile from the hub.vectorstack.us dashboard. Each tile has a colored icon-box (alpha-tinted from one hue) and a label; AppGrid wraps the responsive 2/3/6 column grid.

7 tones available: primary · blue · rose · teal · amber · emerald · violet. Tone gives you bg (alpha 0.10), border (alpha 0.25) and icon (full) from the same accent var, so each app carries its own identity color while every tile uses the same shape and motion.

AuthShell

Split layout for auth pages — left form, right hero. Pass <HeroRibbon> for the canonical signature visual.

Sign in

Enter your email and password to continue.

Don't have an account? Create one

AppShell + TopNav + Sidebar + Footer + PageHeader

The full layout primitive. Compose: <AppShell topNav={...} sidebar={...} footer={...}>{children}</AppShell>. Sidebar is fixed 240px on desktop, drawer on mobile (controlled by `open`). Showcase mounts the whole thing inside a sized iframe-style box so it doesn't take over the page.

Repricer

Console

Real-time view of repricing activity across your accounts.

Active rules
14
Listings
3.4k
Last run
3 min

Five components composing one app skeleton: AppShell (structural grid), TopNav + TopNavItem (sticky header), Sidebar + SidebarSection + SidebarItem (240px desktop, drawer mobile via open prop), Footer (links + copy), and PageHeader (eyebrow + title + actions inside the main region).

HeroRibbon

SVG-animated ribbon — the public-landing hero on nexus360.us. Variants: full (animated) and quiet (static). The wrapper MUST be `position: relative` + `overflow: hidden`.

Pending components

Anything still missing from the catalog.

All planned components are shipped. Open a pull request when a new need shows up.