KQ-633 · REBALANCE/BARS

Rebalance Bars

Paired bars per asset — Now, solid, and Target, hatched behind a hairline — so the gap between them is the drift. Pressing the action glides every Now bar to its target on a cascade, glide rather than recoil because a portfolio reaching its model is a weight settling and a sale should never celebrate; a warn-hatched drift lane rides the Now track from where the weight stands to where it belongs and closes to nothing as the bar lands. Each pair is a role="meter" whose aria-valuetext states the whole trade in a sentence, and the action is a real button that disables itself once nothing is left to trade.

KQ-633 · REBALANCE/BARS
Fieldline Ops · model mixDrift 9 points · $5,580 to move

Drift 9 points · 4 trades pending

Install

One command — the source lands in your repo. Or copy it from the Code tab.

$ pnpm dlx shadcn@latest add @kinetiq/rebalance-bars

Props

assets
RebalanceAsset[]
default
Each asset's id, label, current weight and target weight in whole percentage points.
total
number
default
The portfolio's value; each trade's cash amount is its weight change against this.
applied / defaultApplied
boolean
default false
Controlled or initial state of the rebalance; true draws every Now bar at its target.
onAppliedChange
(applied: boolean) => void
default
Fires from the button press, never from inside a state updater.
format
(value: number) => string
default Intl.NumberFormat("en-US", { style: "currency", currency: "USD", maximumFractionDigits: 0 })
Formats each trade's cash amount and the total left to move.
actionLabel
string
default "Rebalance"
Copy on the action button, which appends the number of trades.
label
React.ReactNode
default
Visible heading; omit it and pass aria-label to name the list.