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.
11-axis radar viz for an NFR vector vs the project's capacity envelope. Pairs with
The <nfr-radar> component is the visual companion to <nfr-compass>. Where the compass owns the decision (which ilities are critical, where the rationales live, what the budget is), the radar owns the read — one glance and you can see how the team's quality vector compares to the capacity envelope. Reach for it on status dashboards, ADR appendices, the home page of an internal product wiki, anywhere a stakeholder wants to know "how's the shape of our quality bet?" without opening the picker.
Light DOM, theme-token driven, no external dependency. The component listens for nfr-compass:change events from a bound compass and rewrites a fresh inline <svg> on each update.
Pick priorities in the compass — the radar polygon updates live. Hover a vector dot to see the ility's name, level, and cost weight in a native tooltip.
<iron-triangle id="shape">…</iron-triangle><nfr-compass id="picker" data-bind-to="shape">…</nfr-compass> <figure data-layout="stack" data-layout-gap="s"> <figcaption>Quality envelope vs vector</figcaption> <nfr-radar data-bind-to="picker"></nfr-radar></figure>
The radar has two layers and a thin grid:
radius × min(1, capacityPoints / sum(costWeights)). Tells you how much of the radius the budget would fill if costs were spread uniformly.radius × level ratio: critical = 1.0, important = 0.6, acceptable = 0.3, not-relevant = 0. The dots colorize by level.When capacityPoints is Infinity (no triangle bound, no fallback), the envelope hides — the radar becomes informational.
You don't need the compass. Set radar.value directly from anywhere — a saved vector loaded from disk, a server-rendered snapshot, an ADR appendix.
const radar = document.querySelector('nfr-radar');radar.value = { vector: { performance: 'critical', security: 'critical', accessibility: 'important' }, costWeights: { performance: 5, security: 5, accessibility: 3 }, capacityPoints: 12,};
You can also customize the ility list — the radar's axis count follows it.
radar.ilities = ['accessibility', 'performance', 'seo', 'i18n', 'maintainability'];radar.value = { vector: { performance: 'critical', accessibility: 'critical' }, costWeights: {}, capacityPoints: 8 };
| Attribute | Type | Default | Description |
|---|---|---|---|
data-bind-to |
string | — | ID of a sibling <nfr-compass> whose nfr-compass:change drives the radar. |
data-radius |
number | 90 |
Base radius in SVG units. Clamped to [30, 400]. |
data-show-envelope |
boolean | present | Show the capacity envelope polygon. Set data-show-envelope="false" to hide. |
| Property | Type | Description |
|---|---|---|
value |
{ vector, costWeights, capacityPoints } |
Read or write the radar's data snapshot. Setter triggers a re-render and a nfr-radar:change event. |
ilities |
string[] |
Defaults to the same 11 the compass ships. Re-assigning rewrites the radar's axes. |
| Event | Detail | When |
|---|---|---|
nfr-radar:change |
{ value, source } |
Fires after every re-render — bound compass change or property write. source is 'iron-compass' or 'property'. |
Every color comes from a VB theme token. Override per-instance with the --nfr-radar-* hooks below or globally via theme tokens.
| Token | Default | Purpose |
|---|---|---|
--nfr-radar-max |
24rem |
Max inline size of the SVG container. |
--nfr-radar-envelope-fill |
14% mix of --color-success |
Capacity envelope fill. |
--nfr-radar-envelope-stroke |
60% mix of --color-success |
Capacity envelope stroke. |
--nfr-radar-vector-fill |
28% mix of --color-interactive |
Vector polygon fill. |
--nfr-radar-vector-stroke |
--color-interactive |
Vector polygon stroke. |
<iron-triangle> — supplies capacityPoints to the compass, which the radar reads via the bound compass.<nfr-compass> — owns the prioritization decision; the radar mirrors its value.<requirement-card> — renders one ility's row outside the compass; pair on a status dashboard alongside the radar for both the headline and the detail.