VB Project Planning

<quality-target>

Polygon-as-UI quality prioritization surface. Click any axis to set its level + rationale; the radar visualizes the chosen vector against the project's capacity envelope. Pairs with iron-triangle via data-bind-to.

Overview

The <quality-target> component is the planning surface's quality decision. The polygon IS the picker — each of the 11 ility axes is a clickable hit-target that opens a per-ility <dialog> with a level radio group (Critical / Important / Acceptable / Not relevant) plus a required rationale when Critical. The same SVG visualizes the chosen vector against the project's capacity envelope, so picking and reading happen on the same surface.

Pair it with <iron-triangle> via data-bind-to and the envelope reads from project shape. "Quality" is the word the surface uses; the older "NFR" jargon and its separate compass + radar pair collapse into this one component, two roles.

Per-axis editors

Click an axis (or focus it and press Enter / Space) to open its dialog. Each editor has a radio group for the four priority levels, a <form-field>-wrapped rationale textarea (required when Critical, ≥10 chars by default), and Cancel + Save buttons; the dialog uses method="dialog" so submit closes it. The marker color follows the level: red Critical, amber Important, green Acceptable, muted Not relevant. The polygon is the closed shape across all picked axes; unpicked ilities don't pull the shape toward the centroid.

Capacity envelope

When paired with <iron-triangle> via data-bind-to, the soft green polygon shows the budget envelope: radius × min(1, capacityPoints / sum(costWeights)) on each axis. Going outside the envelope is allowed but reveals an inline overrun rationale field below the polygon — the form's checkValidity() returns false until that field is filled. The component fires quality-target:over-budget and quality-target:under-budget as the selection crosses the capacity line.

Default ility list and cost weights

The 11 default ilities (cost dropped — that's <iron-triangle>'s job): performance, accessibility, security, reliability, maintainability, observability, compatibility, scalability, portability, internationalization, privacy. Default cost-when-Critical weights sum to 40 — against a realistic budget of 10–15 that forces real trade-offs. Override with data-cost-weights='{"performance": 8, "scalability": 8}' or set the ilities property to a custom array.

Attributes

AttributeValuesDefaultDescription
namestringqualityForm-association field name
data-bind-tostringID of a sibling <iron-triangle> to read capacityPoints from
data-capacity-pointsnumberLiteral capacity fallback when no triangle is bound
data-cost-weightsstringJSON object overriding default per-ility cost weights
data-radiusnumber100Base radius in SVG units
data-show-envelopebooleanShow the capacity envelope polygon (default true; set to "false" to hide)
data-min-rationalenumber10Min characters for a Critical row's rationale
data-max-rationalenumber200Max characters for the rationale textarea
data-min-overrun-rationalenumber10Min characters for overrunRationale
data-max-overrun-rationalenumber400Max characters for overrunRationale
disabledbooleanAll inputs disabled
lockedbooleanRead-only mode for shipped vectors

Properties & events

MemberTypeDescription
vectorR/W Record<ility, level>Current picks.
rationalesR/W Record<ility, string>Per-Critical rationales.
costWeightsREffective merged weights.
capacityPointsR/WResolved capacity (triangle > attribute > property > Infinity).
criticalSumRLive sum of Critical weights.
overBudgetR booleancriticalSum > capacityPoints.
overrunRationaleR/W stringRequired when over-budget.
ilitiesR/W string[]Override the default 11.
openEditor(ility)methodImperatively open one axis's dialog.
checkValidity()methodValidate vector + over-budget rationale; sets :state(missing-rationale).
quality-target:changeeventAny pick or rationale change.
quality-target:over-budgeteventSelection just crossed into over-budget.
quality-target:under-budgeteventSelection just returned within budget.

Accessibility

Each axis is a real focusable hit-target activatable by Enter / Space, and its dialog is a native <dialog> with proper focus management and an escape-to-close path. Priority levels are conveyed by the radio-group label text, not by marker color alone, so the red/amber/green/muted coding is reinforcement rather than the sole signal. The over-budget state surfaces as a required, labelled rationale field (and a :state(missing-rationale) hook) instead of a color-only warning.

Related

  • <iron-triangle> — supplies capacityPoints; the target reads it via data-bind-to.
  • <capacity-plan> — reads criticalSum from the target and reconciles it against capacity plus slotted feature costs.
  • <requirement-card> — renders a single ility's row outside the target for status dashboards and ADR appendices.