VectorStack design system

@vector-stack-usa/ui

Five products. One identity. Zero drift.

The shared visual language behind Nexus360, AI, Storefront, Repricer and Rentals. Tokens, primitives, compositions — built once, adopted everywhere.

$ npm install @vector-stack-usa/ui@^0.107.1
GitHub CHANGELOG
130
Components shipped
v0.107.1
Latest release
11
CSS exports
22
Live tokens
WCAG AA
Contrast policy

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)
TypographyGeist (display + body) · Geist Mono (code) · loaded via next/font, exposed as --vs-font-display/body/mono

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.

Forms

Button

5 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
critical
critical + icon
critical disabled
positive
positive + icon
positive disabled
ButtonLink primary
ButtonLink secondary
ButtonLink ghost
Button — API
PropTypeDefaultDescription
variant'primary' | 'secondary' | 'ghost' | 'critical' | 'positive''primary'Visual style. `critical` for destructive, `positive` for confirms.
size'sm' | 'xs' | 'icon''sm'`sm` matches Input height (h-6). `xs` for inline table actions. `icon` is a 24px square.
asChildbooleanfalseSlot pattern — render as the single child, e.g. wrap a Next `<Link>` without losing styling.
tooltipReactNodeHover tooltip via `<Tooltip>`. Skipped when disabled. Distinct from native `title`.
disabledbooleanfalseStandard HTML disabled. Strips hover/focus styles.
See alsoforms
Forms

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
Input — API
PropTypeDefaultDescription
labelReactNodeVisible label above (stacked) or beside (inline) the input.
helperReactNodeHelper text below. Replaced by `error` when set.
errorReactNodeError message — switches the input to critical styling.
leadingIconReactNodeIcon rendered inside the input on the left.
trailingIconReactNodeIcon rendered inside the input on the right.
prefixReactNodeStatic text before the value (e.g. "$").
suffixReactNodeStatic text after the value (e.g. ".com").
layout'stacked' | 'inline''stacked'`inline` puts the label left-of-field for compose-style rows.
labelWidthnumber | string'auto'When `layout="inline"`, locks the label column width so rows align.
reserveHelperSpacebooleanReserve fixed height for helper/error so layout does not jitter on toggle. Default: from `<Form>`.
Forms

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.
See alsoradiotoggle
Forms

Radio

Group via shared `name`. Pick exactly one.

default
error
Pick one.
Pick one.
Forms

Toggle

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

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

Select

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

default
error
Required.
helper
The repricer worker scopes its run to this marketplace.
disabled
Select — API
PropTypeDefaultDescription
labelReactNodeLabel above (stacked) or beside (inline) the control.
helperReactNodeHelper text below.
errorReactNodeError message — replaces helper and tints the border.
layout'stacked' | 'inline''stacked'Inline puts the label left-of-field. Same semantics as Input.
labelWidthnumber | string'auto'When `layout="inline"`, fixes the label column width.
reserveHelperSpacebooleanReserve fixed height for helper/error. Default: from `<Form>`.
Forms

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.
See alsoinputforms
Forms

Form layout primitives

NEW · v0.51

Form / FormSection / FormRow / FormGrid / FormActions / FilterBar. Impose consistent rhythm + alignment without changing how individual fields render. Inside <Form>, every field reserves a fixed-height helper line so layout doesn't jump on validation toggle.

FormGrid columns='auto' — natural-width flow (the tasks-page row)

Title (text input) absorbs the leftover space; Due date (DatePicker, ~14rem) and Assign to (Select, max-option width) sit at their natural sizes. Powered by data-vs-flex="grow" on text-style field wrappers.

settings page — FormSection + FormGrid + FormActions

Profile

Used on receipts, invoices, and the customer portal.

 
 
 
 

Notifications

Where order updates and alerts are sent.

 
 
filter bar over a table
FiltersPanel — primary always visible, secondary collapsed behind 'More filters'
 
 
 
 
modal-style — Form + FormRow + sticky FormActions
 
 
Invalid ZIP
 
 
 
 
Layout

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
asChild — clickable card via Slot pattern
Start meeting

Begin an instant video call. Anchor semantics preserved — middle-click, copy-link, etc. all work.

Card — API
PropTypeDefaultDescription
variant'default' | 'muted' | 'compact' | 'compactMuted''default'Visual surface preset. `compact*` reduce the inset padding. `*muted` swaps to panel-muted background.
classNamestringExtends the variant classes.
Display

StatusChip

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

sm (default)
neutralpositivecriticalcautioninfobrandprimary
sm + dot
neutralpositivecriticalcautioninfobrandprimary
xs
neutralpositivecriticalcautioninfobrandprimary
xs + dot
neutralpositivecriticalcautioninfobrandprimary
Display

TagWithInfo

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

tooltip · hover meinteractive · hover meplacement: bottomplacement: right
Navigation

Tabs

UPDATED · v0.78

Controlled, uncontrolled, or anchor-based for SSR. Use to break long pages without losing the visual identity. Mix-and-match `href` per item — items with `href` render as <a>, items without keep <button>.

controlled (button mode)

Overview panel — the active tab is overview.

anchor mode (href per item — SSR-friendly)

Anchor mode: each tab is a real <a href>. Middle-click or Cmd-click opens in a new tab. Active tab survives reload because the URL carries it. The active state still updates onClick (optimistic) — overview is the local mirror.

Display

Avatar

Image OR initials (auto from name, color hashed). 4 sizes — xs / sm / md / lg. Pass `colorSeed` to keep the color stable when the display name changes (e.g. seed by email or user-id).

initials
hash → hue
colorSeed (stable across rename)
→ same color, regardless of name
img + override
With image
Display

UserMenu

NEW · v0.85

The canonical 'logged-in user pill + dropdown' combo. Encapsulates avatar + identity text + chevron triggering a menu (account / settings / sign out). Two variants: `full` (bordered pill, default) for TopNav `end` slot or Sidebar footer; `compact` (icon-only avatar) for collapsed sidebars and dense surfaces.

full variant — TopNav end slot (default placement bottom-end)
Theme
compact variant — icon-only avatar
…just the avatar
sidebar footer placement (top-start, fullWidth)
sidebar footer

placement="top-start" opens the menu upward (chevron flips to point up). fullWidthstretches the trigger to fill the sidebar's footer width.

without badge / description
Feedback

Spinner

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

primary
Saving…
inside Button
dark surface
Indexing dataset…
Feedback

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
Feedback

Skeleton

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

line widths
circles
Feedback

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.
Feedback

Tooltip

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

placements
Navigation

Pagination

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

Data viz

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
Display

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
See alsostat-card
Display

InfoCard

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

Feedback

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.

Display

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 }
See alsocode-block
Feedback

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.

Forms

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:
See alsoinput
Forms

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
See alsomulti-select
Layout

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%.

Forms

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
See alsotabsradio
Forms

ColorSwatchPicker

NEW · v0.76BETA

Radio group rendered as colored swatches. Use for tag-color pickers, account-color pickers, anywhere the user picks one of a curated palette. Real <input type=radio> under the hood — keyboard nav and form submission work natively.

default (md)
Account color
Pick a color to mark this account in lists.
Selected: emerald
sm — compact for filters
Tag color
error state
Pick a color
Selection required to continue.
disabled
Locked color
chipClass — Tailwind classes
Built-in Tailwind palette
Forms

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
Navigation

Tree

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

Data viz

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
Forms

NumberInput

Numeric field with −/+ steppers + format/parse hooks for currency, percent, etc. Default width is 'auto' (sizes to content with a sensible minimum); pass width='full' to align edges with sibling fields inside FormGrid.

quantity (auto, default)
price (auto, default)
Type freely; on blur it reformats to $X.XX.
percent (auto, default)
error
Must be ≤ 100.
width='full' inside FormGrid (aligns w/ siblings)
See alsoinputslider
Forms

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.
Display

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
Forms

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
Overlay

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.
See alsocombobox
Forms

Slider

UPDATED · v0.49

Numeric range input. Single value or range, optional drag tooltip, labeled marks, tone-colored fill, painted track segments.

continuous + tooltip on drag
60%
Drag the thumb — bubble shows the live value.
labeled marks
marks={…} replaces uniform ticks.
range — per-end tones
$80 – $320
rangeTones={[…]} tints each thumb + gradient fill from min to max.
tone — caution
tone='caution' tints the fill + thumb.
painted segments
Track zones replace the fill — value position carries meaning.
disabled
50
See alsonumber-input
Forms

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.
See alsoinput
Display

CopyButton

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

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

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"
}
Display

MarkdownRenderer

NEW · v0.54

react-markdown + remark-gfm with every element styled to DS tokens. Headings, links, code, blockquotes, lists, tables, task list checkboxes use --vs-* colors and the package size scale. Safe-by-default (no raw HTML).

md (default size)

Repricer rule digest

This rule kicks in when buy-box price drops more than 5% in a 24h window. Affects ~14% of listings (mostly in home & kitchen).

Triggers

  • Price delta > 5%
  • Stock > 0
  • Marketplace ∈ {Amazon US, Walmart}

Status

asinrulelast run
B07F9...Match buy-box✅ 2 min ago
B08K3...Floor + 2%⚠️ skipped
B07Y2...Match buy-box❌ failed

Tasks

  • Audit ASINs flagged before 2026-04-01
  • Sample 10 listings against the buy-box winner snapshot
  • Re-run failed listings after the 14:00 sweep
  • Email summary to ops@nexus360.us

When you change a rule's floor, the next sweep re-validates every listing in scope. ~3 min for 1k items.

See the runbook and docs/repricer-rules.md for the full schema.

tsx
import { useEffect } from 'react';
import { runRepricer } from '@/lib/repricer';

useEffect(() => {
  runRepricer({ marketplace: 'amazon', mode: 'live' });
}, []);
sm (compact, chat-style)

Hey — I just saw the order #A2842 arrived broken.

Could you:

  1. Mark it returned in /admin/orders
  2. Auto-credit the buyer
  3. Notify the warehouse

Refs: policy, SLA matrix.

size + linksTarget + useCodeBlock=false

Documentation

Visit the GitHub repo for the source.

npm install @vector-stack-usa/ui
See alsocode-block
Overlay

Popover

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

Display

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.
Navigation

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
Navigation

Timeline

UPDATED · v0.47

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 — hover any dot for the summary, click for the full panel
  1. 12:42
    Build
    8m 14s
  2. 12:50
    Test
    312 passed · 30 failed
  3. 12:51
    Lint
    No issues
  4. 12:52
    Stage
    Deploying…
  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
See alsostepper
Data viz

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
Display

StatCard

KPI / metric tile. Label · big number · optional delta with trend arrow · hint line · optional Sparkline. Bottom carries a 2px gradient accent in the tone so a row reads as one data strip. Tints value, icon, and bg in the tone. Pass `href` or `onClick` to make it clickable (hover halo + focus ring).

default — full row of tones
Active rules
14
+2
vs last week
Listings
3,412
+8.4%
prefilled
Errors
6
+3
last 24h
Last run
3 min
0
ago
auto-infer trend from numeric delta
MRR
$840
+12
month over month
Conversion
2.7%
-0.3
vs avg
Stable
120ms
0
p95 latency
sizes (sm · md · lg)
Active rules
14
+2
vs last week
Active rules
14
+2
vs last week
Active rules
14
+2
vs last week
with chart slot (Sparkline)
Revenue (7d)
$12.4k
+8.2
vs prev week
Errors (24h)
47
+12
trending up
Latency p95
124ms
-3
getting faster
clickable (href + onClick — hover halo + focus ring)
with icon (tints to tone)
Customers
1,284
+3.2
Revenue
$48.2k
+12.4
Alerts
7
+2
Pending
18
-3
neutral (no tone) — flat trend
Total
2,401
all time
Latency p50
48ms
0
stable
DB size
324 GB
growing slowly
Display

RunnerConsole

NEW · v0.63

Player-style control panel for long-running jobs (training, inference, batch). Status badge + title/subtitle + progress + hardware metric strip (CPU/RAM/GPUs, extensible) + transport controls (start · pause · resume · stop) + live polling indicator. Designed to drive UIs that talk to a backend job and refresh every N ms.

interactive — start it, then pause / resume / stop
Idle
Llama-3 fine-tune
meta-llama/Llama-3-8B · epoch 12 of 30
Elapsed00:00:00
0.0% complete
6%
GPU 1
RTX 4090 · 38°C
5%
GPU 2
RTX 4090 · 36°C
8%
CPU
32 cores
22%
RAM
7.0 / 32 GB
idle (before a run)
Idle
Llama-3 fine-tune
meta-llama/Llama-3-8B · 30 epochs
0.0% complete
4%
GPU 1
RTX 4090 · 38°C
3%
GPU 2
RTX 4090 · 36°C
8%
CPU
32 cores · idle
22%
RAM
7 / 32 GB
paused
Paused
Llama-3 fine-tune
meta-llama/Llama-3-8B · epoch 12 of 30
Elapsed02:14:30
ETA~45 min
42.0% complete
18%
GPU 1
RTX 4090 · 49°C
22%
GPU 2
RTX 4090 · 51°C
14%
CPU
32 cores
64%
RAM
20.5 / 32 GB
error
Error
Embedding pipeline
OOM at chunk 12,402 of 50,000 — see logs
Elapsed00:08:14
24.8% complete
99%
GPU 1
RTX 4090 · 89°C
6%
GPU 2
RTX 4090 · idle
85%
CPU
spilling
96%
RAM
OOM
completed
Completed
Daily catalog refresh
124,503 items · 0 errors
Elapsed00:42:18
100.0% complete
3%
GPU 1
RTX 4090 · 34°C
3%
GPU 2
RTX 4090 · 33°C
6%
CPU
32 cores
18%
RAM
5.6 / 32 GB
Forms

CreatableField

NEW · v0.64

Wraps a select-like control (Combobox / Select / MultiSelect / Input) with a tiny + icon in the top-right of the label row. Clicking it opens a modal with one input + Create / Cancel — no inline expanders, no bottom-of-the-card 'Add new' link. Use it for catalog-driven dropdowns where the user occasionally needs to add a new option without leaving the page.

single — Combobox
single — short list
grid — five fields side by side
Overlay

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.
See alsomodalpopover
Data viz

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.
Data viz

ExpandPanel + ExpandableRow + ExpandedRow

UPDATED · v0.52

Inline detail panel under a table row. v0.56 redesign: flush chrome by default (no card-in-card), ExpandedRow recess (panel-muted bg), tone-colored left rail, optional ExpandPanel.Section slots for grouping. Plus everything from v0.52 — slide animation, auto colSpan, Enter/Space, compound API, useExpandable hook.

SKUTitleStatusStock
ZX-000005936Under Armour Blitzing cappositive47
Under Armour Blitzing cap
Performance
Last sale
2 days ago
Avg price
$22.99
Buy box
Won
Inventory
Warehouse: Miami-A · Z2-R3-L1
Vendor: Acme Sports
Reorder point: 25 units
Avg cost: $11.20

v0.56: chrome="flush" default (no border, no rounded, transparent — just a 4px tone rail). <ExpandedRow bg="panel-muted"> default — the detail recesses ~5% L below the parent Card so it reads as a sub-level, no chrome battle. <ExpandPanel.Section title> slots for grouping (replaces the old "card per sub-section" pattern). Pass chrome="card" on ExpandPanel for the v0.55 visual.

Forms

Combobox

UPDATED · v0.77

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

basic
Selected: ATVPDKIKX0DER
error
Pick a region.
disabled
async — server-driven autocomplete
Type to fetch (250ms simulated latency). Items live in consumer state.
leading + description slots (sync)
leading + description slots render inside each row.
Forms

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
Feedback

Toast

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

See alsoalert
Forms

DatePicker

Single mode and range mode. Range: pick start, hover to preview, then pick end. Click an earlier date during step 2 to restart. Default width is 'auto' (sizes to content); pass width='full' to align edges with sibling Input/Select inside FormGrid.

single (auto, default)
Pick any date.
range (auto, default)
Pick the start date.
range w/ bounds
Earlier dates are disabled.
width='full' inside FormGrid (aligns w/ siblings)
Layout

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.

Layout

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
Layout

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).

Forms

ActionIcon

NEW · v0.57

Compact icon-only button for toolbars + table row actions. No background in idle (just a colored icon), soft tinted bg on hover, focus ring. Set `action` to pick a built-in (save/delete/refresh/etc) — wires the icon, tone, aria-label automatically. Or pass `icon` + `tone` for custom.

all built-in actions (default tones)
sizes (xs · sm · md)
loading + disabled
custom icon + tone
asChild — anchor semantics
render as <a> — middle-click + open-in-new-tab work natively
toolbar pattern
Forms

ActionTile

NEW · v0.60

Icon-only sibling of `ActionIcon` styled like the icon-box from `InfoCard`: tinted bg + border in the action's tone, hover halo with `-translate-y-px` lift, focus ring. Use it when a bare `ActionIcon` feels too small or you want an action that reads as a tile. Acts as a `<button>` (or `<a>` when `href` is set).

all built-in actions (default tones)
sizes (sm · md · lg)
loading + disabled
custom icon + tone
toolbar pattern
as link (href + external)
Foundations

PropsPlayground + PropsTable

Pair a live preview with a panel of controls (PropsPlayground) for exploring an API; or document the props formally (PropsTable). Both ship in the DS so the same patterns work in any consumer's docs.

PropsPlayground — live mutation
Props
PropsTable — static docs
Button
PropTypeDefaultDescription
variant'primary' | 'secondary' | 'outline' | 'subtle' | 'ghost' | 'link' | 'critical' | 'positive' | 'caution' | 'info''primary'Visual treatment.
size'xs' | 'sm' | 'icon''sm'Size preset. icon = h-6 w-6 square.
asChildbooleanfalseRender as the single child element (Radix Slot pattern). Use to wrap Next Link.
disabledbooleanNative HTML disabled.
onClick(e: MouseEvent) => voidClick handler.
See alsobutton
Layout

HeroRibbon

SVG-animated ribbon — the signature visual on `nexus360.us`. Three variants: `default` (animated, masked left), `full` (animated, edge-to-edge), `quiet` (static — same paint, no animation). Wrapper MUST be `position: relative` + `overflow: hidden`. Honors `prefers-reduced-motion` automatically.

variant: default

Default masking — soft-fades the left edge, ribbon pools on the right. Use when you have copy or a form on the left and want the ribbon as backdrop.

variant: full (edge-to-edge)

No left mask — fills the entire wrapper. Use for full-bleed marketing hero where you don't need to leave room for foreground copy.

variant: quiet (static)

Same paint, no animation. Use for screenshots, dashboards, or contexts where the wave would compete with foreground motion.

landing-hero pattern (overlay copy + CTA)
Nexus360 SaaS

Run a marketplace, ship orders, repurchase smart.

One platform replacing the ten tools your SMB has been gluing together since 2019.

Foreground copy needs position: relative + a z-index above 0 (the ribbon sits at z-index: 0).

split layout (auth-shell pattern)
Sign in

Welcome back to Nexus360

Pick up where you left off.

For full plumbing (responsive collapse, footer, branding), use the <AuthShell> component which already wires this up.

on a light background (anti-pattern)

The ribbon was painted for dark wrappers — its highlights are warm whites that vanish on light backgrounds and the multiply blends muddy out. If you need a light hero, swap the ribbon for a static gradient instead.

reduced motion

All wave/strand/shimmer animations short-circuit when the OS reports prefers-reduced-motion: reduce. The ribbon still renders — only the motion is suppressed (matches the visual of variant="quiet"). No prop required.

See alsoauth-shell
@vector-stack-usa/ui · built and maintained by VectorStack USA · powering Nexus360, AI, Storefront, Repricer, Rentals

Pending components

Anything still missing from the catalog.

ComponentWhy it's needed
Button size="xs"|"icon" rollout auditrepricer: still has a few inline `<button>` elements (rules-section pencil/trash, runs-section show-more, period filter chips) that pre-date the size variants; sweep them once the variants land. Not DS work — consumer adoption.

Order is suggestion-grade — pick whichever is most used in the surfaces you adopt next.