Welcome to Vanilla Breeze
This bell pulls live notifications from /go/notify/messages — the same contract documented at /docs/concepts/service-contracts/. Static articles like this one are the no-JS / no-backend fallback.
This bell pulls live notifications from /go/notify/messages — the same contract documented at /docs/concepts/service-contracts/. Static articles like this one are the no-JS / no-backend fallback.
Compact ledger that ties iron-triangle capacity, quality-target spend, and slotted work-item costs into a stacked-bar plan view.
The <capacity-plan> stitches the planning chain together visibly. It reads three numbers — capacity from a paired <iron-triangle>, quality spend from a paired <quality-target>, and feature spend from slotted elements with data-capacity-cost — and renders a four-row ledger with proportional bars: capacity vs quality vs features vs slack.
It's the answer to "where did my capacity go?" Without it, the chain is implicit; with it, the math is the first thing the team sees on the requirements page.
Edit the iron-triangle inputs to grow capacity. Pick quality priorities to spend it. The ledger rebalances live; the slack row turns red when overdrawn.
<iron-triangle id="shape"></iron-triangle><quality-target id="quality" data-bind-to="shape"></quality-target> <capacity-plan data-bind-triangle="shape" data-bind-quality="quality"> <work-item data-capacity-cost="3">Bulk import</work-item> <work-item data-capacity-cost="2">API webhooks</work-item></capacity-plan>
Plain subtraction:
slack = capacityPoints − qualityCriticalSum − featureCostSum
When capacityPoints is unbounded (no triangle bound and no data-capacity-points on the target), slack is reported as ∞ and the bar visualization scales against actual spend.
The component sums any descendant element with data-capacity-cost="N". Authors typically slot <work-item> children:
<capacity-plan data-bind-triangle="shape" data-bind-quality="quality"> <work-item data-capacity-cost="3">Bulk import</work-item> <work-item data-capacity-cost="2">API webhooks</work-item></capacity-plan>
For server-rendered planning surfaces or programmatic flows, set featureSum directly:
const plan = document.querySelector('capacity-plan');plan.featureSum = sumWorkItemsFromBackend(features);
Property override wins over slot inference. Mutation observation: changes to slotted children's data-capacity-cost trigger a re-render automatically.
| Attribute | Type | Description |
|---|---|---|
data-bind-triangle | string | ID of a sibling <iron-triangle> to read capacity from. |
data-bind-quality | string | ID of a sibling <quality-target> to read critical sum from. |
| Member | Description |
|---|---|
capacityPoints (R) | Live capacity from the bound triangle (or Infinity if absent). |
qualitySum (R) | Live critical sum from the bound quality target (or 0). |
featureSum (R/W) | Sum of data-capacity-cost across descendants, or an explicit number set by the host. |
slack (R) | Computed: capacity − quality − features. |
capacity-plan:overdrawn (event) | Edge-triggered when slack crosses zero. |
| Token | Default | Purpose |
|---|---|---|
--capacity-plan-max | 32rem | Max inline-size of the ledger container. |
| Bar colors | VB theme tokens (--color-text, --color-interactive, --color-success, --color-error) | Auto-adapt across light/dark and brand themes. |